ibm_db 5.1.0-x86-mingw32 → 5.3.2-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES +9 -0
- data/LICENSE +55 -18
- data/ext/Makefile +14 -14
- data/ext/extconf.rb +4 -4
- data/ext/ibm_db.c +62 -57
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +11 -11
- data/ext/ruby_ibm_db_cli.c +1 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
- data/lib/ibm_db.so +1 -0
- data/lib/mswin32/ibm_db.rb +7 -3
- data/lib/mswin32/rb2x/i386/ruby25/ibm_db.so +0 -0
- data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
- data/test/activejob/destroy_association_async_test.rb +305 -0
- data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
- data/test/activejob/helper.rb +15 -0
- data/test/assets/schema_dump_5_1.yml +345 -0
- data/test/cases/adapter_prevent_writes_test.rb +334 -0
- data/test/cases/adapter_test.rb +432 -218
- data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
- data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
- data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
- data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
- data/test/cases/adapters/mysql2/connection_test.rb +48 -50
- data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
- data/test/cases/adapters/mysql2/enum_test.rb +32 -11
- data/test/cases/adapters/mysql2/explain_test.rb +13 -11
- data/test/cases/adapters/mysql2/json_test.rb +17 -188
- data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
- data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
- data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
- data/test/cases/adapters/mysql2/schema_test.rb +24 -22
- data/test/cases/adapters/mysql2/set_test.rb +32 -0
- data/test/cases/adapters/mysql2/sp_test.rb +10 -8
- data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
- data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
- data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
- data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
- data/test/cases/adapters/postgresql/array_test.rb +118 -63
- data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
- data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
- data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
- data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
- data/test/cases/adapters/postgresql/citext_test.rb +58 -58
- data/test/cases/adapters/postgresql/collation_test.rb +17 -15
- data/test/cases/adapters/postgresql/composite_test.rb +25 -23
- data/test/cases/adapters/postgresql/connection_test.rb +73 -85
- data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
- data/test/cases/adapters/postgresql/date_test.rb +42 -0
- data/test/cases/adapters/postgresql/domain_test.rb +9 -7
- data/test/cases/adapters/postgresql/enum_test.rb +12 -10
- data/test/cases/adapters/postgresql/explain_test.rb +10 -8
- data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
- data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
- data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
- data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
- data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
- data/test/cases/adapters/postgresql/integer_test.rb +2 -0
- data/test/cases/adapters/postgresql/interval_test.rb +99 -0
- data/test/cases/adapters/postgresql/json_test.rb +16 -201
- data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
- data/test/cases/adapters/postgresql/money_test.rb +47 -16
- data/test/cases/adapters/postgresql/network_test.rb +36 -28
- data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
- data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
- data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
- data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
- data/test/cases/adapters/postgresql/range_test.rb +406 -292
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
- data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
- data/test/cases/adapters/postgresql/schema_test.rb +207 -91
- data/test/cases/adapters/postgresql/serial_test.rb +9 -7
- data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
- data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
- data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
- data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
- data/test/cases/adapters/postgresql/utils_test.rb +11 -9
- data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
- data/test/cases/adapters/postgresql/xml_test.rb +10 -14
- data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
- data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
- data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
- data/test/cases/adapters/sqlite3/json_test.rb +29 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
- data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
- data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
- data/test/cases/aggregations_test.rb +14 -12
- data/test/cases/annotate_test.rb +46 -0
- data/test/cases/ar_schema_test.rb +153 -86
- data/test/cases/arel/attributes/attribute_test.rb +1145 -0
- data/test/cases/arel/attributes/math_test.rb +83 -0
- data/test/cases/arel/attributes_test.rb +27 -0
- data/test/cases/arel/collectors/bind_test.rb +40 -0
- data/test/cases/arel/collectors/composite_test.rb +47 -0
- data/test/cases/arel/collectors/sql_string_test.rb +41 -0
- data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
- data/test/cases/arel/crud_test.rb +65 -0
- data/test/cases/arel/delete_manager_test.rb +53 -0
- data/test/cases/arel/factory_methods_test.rb +46 -0
- data/test/cases/arel/helper.rb +45 -0
- data/test/cases/arel/insert_manager_test.rb +241 -0
- data/test/cases/arel/nodes/and_test.rb +30 -0
- data/test/cases/arel/nodes/as_test.rb +36 -0
- data/test/cases/arel/nodes/ascending_test.rb +46 -0
- data/test/cases/arel/nodes/bin_test.rb +35 -0
- data/test/cases/arel/nodes/binary_test.rb +29 -0
- data/test/cases/arel/nodes/bind_param_test.rb +22 -0
- data/test/cases/arel/nodes/case_test.rb +96 -0
- data/test/cases/arel/nodes/casted_test.rb +18 -0
- data/test/cases/arel/nodes/comment_test.rb +22 -0
- data/test/cases/arel/nodes/count_test.rb +35 -0
- data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
- data/test/cases/arel/nodes/descending_test.rb +46 -0
- data/test/cases/arel/nodes/distinct_test.rb +21 -0
- data/test/cases/arel/nodes/equality_test.rb +62 -0
- data/test/cases/arel/nodes/extract_test.rb +43 -0
- data/test/cases/arel/nodes/false_test.rb +21 -0
- data/test/cases/arel/nodes/grouping_test.rb +26 -0
- data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
- data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
- data/test/cases/arel/nodes/named_function_test.rb +48 -0
- data/test/cases/arel/nodes/node_test.rb +22 -0
- data/test/cases/arel/nodes/not_test.rb +31 -0
- data/test/cases/arel/nodes/or_test.rb +36 -0
- data/test/cases/arel/nodes/over_test.rb +69 -0
- data/test/cases/arel/nodes/select_core_test.rb +79 -0
- data/test/cases/arel/nodes/select_statement_test.rb +51 -0
- data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
- data/test/cases/arel/nodes/sum_test.rb +35 -0
- data/test/cases/arel/nodes/table_alias_test.rb +29 -0
- data/test/cases/arel/nodes/true_test.rb +21 -0
- data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
- data/test/cases/arel/nodes/update_statement_test.rb +60 -0
- data/test/cases/arel/nodes/window_test.rb +81 -0
- data/test/cases/arel/nodes_test.rb +34 -0
- data/test/cases/arel/select_manager_test.rb +1238 -0
- data/test/cases/arel/support/fake_record.rb +135 -0
- data/test/cases/arel/table_test.rb +216 -0
- data/test/cases/arel/update_manager_test.rb +126 -0
- data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
- data/test/cases/arel/visitors/dot_test.rb +90 -0
- data/test/cases/arel/visitors/mysql_test.rb +157 -0
- data/test/cases/arel/visitors/postgres_test.rb +366 -0
- data/test/cases/arel/visitors/sqlite_test.rb +75 -0
- data/test/cases/arel/visitors/to_sql_test.rb +750 -0
- data/test/cases/associations/belongs_to_associations_test.rb +510 -158
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
- data/test/cases/associations/callbacks_test.rb +56 -38
- data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
- data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
- data/test/cases/associations/eager_singularization_test.rb +21 -21
- data/test/cases/associations/eager_test.rb +559 -415
- data/test/cases/associations/extension_test.rb +18 -12
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
- data/test/cases/associations/has_many_associations_test.rb +1038 -465
- data/test/cases/associations/has_many_through_associations_test.rb +558 -249
- data/test/cases/associations/has_one_associations_test.rb +294 -129
- data/test/cases/associations/has_one_through_associations_test.rb +121 -75
- data/test/cases/associations/inner_join_association_test.rb +114 -38
- data/test/cases/associations/inverse_associations_test.rb +606 -398
- data/test/cases/associations/join_model_test.rb +158 -148
- data/test/cases/associations/left_outer_join_association_test.rb +59 -24
- data/test/cases/associations/nested_through_associations_test.rb +166 -109
- data/test/cases/associations/required_test.rb +35 -10
- data/test/cases/associations_test.rb +241 -110
- data/test/cases/attribute_methods/read_test.rb +11 -11
- data/test/cases/attribute_methods_test.rb +413 -298
- data/test/cases/attributes_test.rb +145 -27
- data/test/cases/autosave_association_test.rb +681 -436
- data/test/cases/base_prevent_writes_test.rb +229 -0
- data/test/cases/base_test.rb +599 -542
- data/test/cases/batches_test.rb +288 -82
- data/test/cases/binary_test.rb +26 -31
- data/test/cases/bind_parameter_test.rb +194 -21
- data/test/cases/boolean_test.rb +52 -0
- data/test/cases/cache_key_test.rb +110 -5
- data/test/cases/calculations_test.rb +740 -177
- data/test/cases/callbacks_test.rb +74 -207
- data/test/cases/clone_test.rb +15 -10
- data/test/cases/coders/json_test.rb +2 -0
- data/test/cases/coders/yaml_column_test.rb +16 -13
- data/test/cases/collection_cache_key_test.rb +177 -20
- data/test/cases/column_alias_test.rb +9 -7
- data/test/cases/column_definition_test.rb +10 -68
- data/test/cases/comment_test.rb +166 -107
- data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
- data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
- data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
- data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
- data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
- data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
- data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
- data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
- data/test/cases/connection_management_test.rb +13 -11
- data/test/cases/connection_pool_test.rb +316 -83
- data/test/cases/core_test.rb +82 -58
- data/test/cases/counter_cache_test.rb +204 -50
- data/test/cases/custom_locking_test.rb +5 -3
- data/test/cases/database_configurations/hash_config_test.rb +74 -0
- data/test/cases/database_configurations/resolver_test.rb +150 -0
- data/test/cases/database_configurations_test.rb +145 -0
- data/test/cases/database_selector_test.rb +296 -0
- data/test/cases/database_statements_test.rb +18 -16
- data/test/cases/date_test.rb +8 -16
- data/test/cases/date_time_precision_test.rb +100 -78
- data/test/cases/date_time_test.rb +23 -8
- data/test/cases/defaults_test.rb +106 -71
- data/test/cases/delegated_type_test.rb +57 -0
- data/test/cases/dirty_test.rb +419 -223
- data/test/cases/disconnected_test.rb +6 -6
- data/test/cases/dup_test.rb +54 -27
- data/test/cases/enum_test.rb +461 -82
- data/test/cases/errors_test.rb +7 -7
- data/test/cases/explain_subscriber_test.rb +17 -15
- data/test/cases/explain_test.rb +11 -19
- data/test/cases/filter_attributes_test.rb +153 -0
- data/test/cases/finder_respond_to_test.rb +14 -14
- data/test/cases/finder_test.rb +669 -287
- data/test/cases/fixture_set/file_test.rb +34 -38
- data/test/cases/fixtures_test.rb +833 -176
- data/test/cases/forbidden_attributes_protection_test.rb +32 -67
- data/test/cases/habtm_destroy_order_test.rb +25 -25
- data/test/cases/helper.rb +78 -49
- data/test/cases/hot_compatibility_test.rb +33 -32
- data/test/cases/i18n_test.rb +18 -17
- data/test/cases/inheritance_test.rb +180 -115
- data/test/cases/insert_all_test.rb +489 -0
- data/test/cases/instrumentation_test.rb +101 -0
- data/test/cases/integration_test.rb +119 -31
- data/test/cases/invalid_connection_test.rb +18 -16
- data/test/cases/invertible_migration_test.rb +183 -43
- data/test/cases/json_attribute_test.rb +35 -0
- data/test/cases/json_serialization_test.rb +57 -58
- data/test/cases/json_shared_test_cases.rb +290 -0
- data/test/cases/locking_test.rb +413 -119
- data/test/cases/log_subscriber_test.rb +68 -26
- data/test/cases/marshal_serialization_test.rb +39 -0
- data/test/cases/migration/change_schema_test.rb +118 -72
- data/test/cases/migration/change_table_test.rb +138 -30
- data/test/cases/migration/check_constraint_test.rb +162 -0
- data/test/cases/migration/column_attributes_test.rb +45 -35
- data/test/cases/migration/column_positioning_test.rb +18 -6
- data/test/cases/migration/columns_test.rb +93 -77
- data/test/cases/migration/command_recorder_test.rb +121 -34
- data/test/cases/migration/compatibility_test.rb +578 -23
- data/test/cases/migration/create_join_table_test.rb +35 -25
- data/test/cases/migration/foreign_key_test.rb +503 -284
- data/test/cases/migration/helper.rb +4 -3
- data/test/cases/migration/index_test.rb +119 -70
- data/test/cases/migration/logger_test.rb +9 -6
- data/test/cases/migration/pending_migrations_test.rb +88 -34
- data/test/cases/migration/references_foreign_key_test.rb +164 -150
- data/test/cases/migration/references_index_test.rb +38 -19
- data/test/cases/migration/references_statements_test.rb +15 -14
- data/test/cases/migration/rename_table_test.rb +53 -30
- data/test/cases/migration_test.rb +637 -269
- data/test/cases/migrator_test.rb +191 -135
- data/test/cases/mixin_test.rb +7 -11
- data/test/cases/modules_test.rb +36 -34
- data/test/cases/multi_db_migrator_test.rb +223 -0
- data/test/cases/multiparameter_attributes_test.rb +60 -33
- data/test/cases/multiple_db_test.rb +16 -22
- data/test/cases/nested_attributes_test.rb +341 -320
- data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
- data/test/cases/null_relation_test.rb +84 -0
- data/test/cases/numeric_data_test.rb +93 -0
- data/test/cases/persistence_test.rb +361 -269
- data/test/cases/pooled_connections_test.rb +18 -26
- data/test/cases/prepared_statement_status_test.rb +48 -0
- data/test/cases/primary_keys_test.rb +210 -104
- data/test/cases/query_cache_test.rb +610 -141
- data/test/cases/quoting_test.rb +132 -31
- data/test/cases/readonly_test.rb +49 -48
- data/test/cases/reaper_test.rb +146 -32
- data/test/cases/reflection_test.rb +167 -156
- data/test/cases/relation/delegation_test.rb +49 -36
- data/test/cases/relation/delete_all_test.rb +117 -0
- data/test/cases/relation/merging_test.rb +319 -42
- data/test/cases/relation/mutation_test.rb +55 -93
- data/test/cases/relation/or_test.rb +129 -29
- data/test/cases/relation/predicate_builder_test.rb +21 -6
- data/test/cases/relation/record_fetch_warning_test.rb +5 -3
- data/test/cases/relation/select_test.rb +67 -0
- data/test/cases/relation/update_all_test.rb +317 -0
- data/test/cases/relation/where_chain_test.rb +68 -32
- data/test/cases/relation/where_clause_test.rb +136 -61
- data/test/cases/relation/where_test.rb +155 -48
- data/test/cases/relation_test.rb +266 -112
- data/test/cases/relations_test.rb +969 -744
- data/test/cases/reload_models_test.rb +13 -9
- data/test/cases/reserved_word_test.rb +141 -0
- data/test/cases/result_test.rb +68 -17
- data/test/cases/sanitize_test.rb +87 -71
- data/test/cases/schema_dumper_test.rb +221 -128
- data/test/cases/schema_loading_test.rb +3 -2
- data/test/cases/scoping/default_scoping_test.rb +185 -144
- data/test/cases/scoping/named_scoping_test.rb +177 -89
- data/test/cases/scoping/relation_scoping_test.rb +197 -75
- data/test/cases/secure_token_test.rb +18 -3
- data/test/cases/serialization_test.rb +30 -28
- data/test/cases/serialized_attribute_test.rb +133 -42
- data/test/cases/signed_id_test.rb +168 -0
- data/test/cases/statement_cache_test.rb +41 -24
- data/test/cases/statement_invalid_test.rb +42 -0
- data/test/cases/store_test.rb +180 -55
- data/test/cases/strict_loading_test.rb +473 -0
- data/test/cases/suppressor_test.rb +26 -12
- data/test/cases/tasks/database_tasks_test.rb +1258 -194
- data/test/cases/tasks/mysql_rake_test.rb +370 -298
- data/test/cases/tasks/postgresql_rake_test.rb +481 -251
- data/test/cases/tasks/sqlite_rake_test.rb +225 -178
- data/test/cases/test_case.rb +51 -40
- data/test/cases/test_databases_test.rb +79 -0
- data/test/cases/test_fixtures_test.rb +79 -19
- data/test/cases/time_precision_test.rb +98 -76
- data/test/cases/timestamp_test.rb +102 -99
- data/test/cases/touch_later_test.rb +12 -10
- data/test/cases/transaction_callbacks_test.rb +344 -90
- data/test/cases/transaction_isolation_test.rb +12 -12
- data/test/cases/transactions_test.rb +612 -162
- data/test/cases/type/adapter_specific_registry_test.rb +14 -2
- data/test/cases/type/date_time_test.rb +4 -2
- data/test/cases/type/integer_test.rb +4 -2
- data/test/cases/type/string_test.rb +10 -8
- data/test/cases/type/time_test.rb +28 -0
- data/test/cases/type/type_map_test.rb +29 -28
- data/test/cases/type/unsigned_integer_test.rb +19 -0
- data/test/cases/type_test.rb +2 -0
- data/test/cases/types_test.rb +3 -1
- data/test/cases/unconnected_test.rb +14 -1
- data/test/cases/unsafe_raw_sql_test.rb +274 -0
- data/test/cases/validations/absence_validation_test.rb +19 -17
- data/test/cases/validations/association_validation_test.rb +30 -28
- data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
- data/test/cases/validations/i18n_validation_test.rb +22 -21
- data/test/cases/validations/length_validation_test.rb +34 -33
- data/test/cases/validations/numericality_validation_test.rb +181 -0
- data/test/cases/validations/presence_validation_test.rb +21 -19
- data/test/cases/validations/uniqueness_validation_test.rb +156 -86
- data/test/cases/validations_repair_helper.rb +2 -0
- data/test/cases/validations_test.rb +61 -26
- data/test/cases/view_test.rb +122 -116
- data/test/cases/yaml_serialization_test.rb +79 -34
- data/test/config.example.yml +19 -19
- data/test/config.rb +3 -1
- data/test/config.yml +16 -6
- data/test/fixtures/all/namespaced/accounts.yml +2 -0
- data/test/fixtures/author_addresses.yml +1 -8
- data/test/fixtures/authors.yml +1 -7
- data/test/fixtures/binaries.yml +4 -0
- data/test/fixtures/books.yml +9 -2
- data/test/fixtures/categories_posts.yml +3 -0
- data/test/fixtures/citations.yml +5 -0
- data/test/fixtures/comments.yml +7 -0
- data/test/fixtures/companies.yml +5 -0
- data/test/fixtures/computers.yml +2 -0
- data/test/fixtures/customers.yml +10 -1
- data/test/fixtures/developers.yml +1 -1
- data/test/fixtures/essays.yml +10 -0
- data/test/fixtures/faces.yml +3 -3
- data/test/fixtures/humans.yml +5 -0
- data/test/fixtures/interests.yml +7 -7
- data/test/fixtures/memberships.yml +7 -0
- data/test/fixtures/minimalistics.yml +3 -0
- data/test/fixtures/mixed_case_monkeys.yml +2 -2
- data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
- data/test/fixtures/naked/yml/parrots.yml +1 -0
- data/test/fixtures/other_books.yml +26 -0
- data/test/fixtures/other_posts.yml +1 -0
- data/test/fixtures/parrots.yml +7 -1
- data/test/fixtures/pirates.yml +3 -0
- data/test/fixtures/posts.yml +11 -3
- data/test/fixtures/readers.yml +6 -0
- data/test/fixtures/reserved_words/values.yml +2 -2
- data/test/fixtures/sponsors.yml +3 -0
- data/test/fixtures/strict_zines.yml +2 -0
- data/test/fixtures/subscribers.yml +1 -1
- data/test/fixtures/tasks.yml +1 -1
- data/test/fixtures/warehouse-things.yml +3 -0
- data/test/migrations/10_urban/9_add_expressions.rb +2 -0
- data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
- data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
- data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
- data/test/migrations/missing/1_people_have_last_names.rb +2 -0
- data/test/migrations/missing/3_we_need_reminders.rb +2 -0
- data/test/migrations/missing/4_innocent_jointable.rb +3 -1
- data/test/migrations/rename/1_we_need_things.rb +2 -0
- data/test/migrations/rename/2_rename_things.rb +2 -0
- data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy2/1_create_articles.rb +2 -0
- data/test/migrations/to_copy2/2_create_comments.rb +3 -1
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
- data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
- data/test/models/account.rb +46 -0
- data/test/models/admin/account.rb +3 -1
- data/test/models/admin/randomly_named_c1.rb +2 -0
- data/test/models/admin/user.rb +16 -8
- data/test/models/admin.rb +4 -2
- data/test/models/aircraft.rb +3 -1
- data/test/models/arunit2_model.rb +2 -0
- data/test/models/author.rb +153 -102
- data/test/models/auto_id.rb +2 -0
- data/test/models/autoloadable/extra_firm.rb +2 -0
- data/test/models/binary.rb +3 -1
- data/test/models/binary_field.rb +6 -0
- data/test/models/bird.rb +13 -1
- data/test/models/book.rb +14 -4
- data/test/models/book_destroy_async.rb +24 -0
- data/test/models/boolean.rb +5 -0
- data/test/models/bulb.rb +13 -4
- data/test/models/cake_designer.rb +2 -0
- data/test/models/car.rb +17 -10
- data/test/models/carrier.rb +2 -0
- data/test/models/cart.rb +5 -0
- data/test/models/cat.rb +2 -0
- data/test/models/categorization.rb +8 -6
- data/test/models/category.rb +28 -16
- data/test/models/chef.rb +2 -0
- data/test/models/citation.rb +5 -1
- data/test/models/club.rb +13 -10
- data/test/models/college.rb +4 -2
- data/test/models/column.rb +2 -0
- data/test/models/column_name.rb +2 -0
- data/test/models/comment.rb +32 -10
- data/test/models/company.rb +102 -106
- data/test/models/company_in_module.rb +27 -26
- data/test/models/computer.rb +3 -1
- data/test/models/contact.rb +15 -13
- data/test/models/content.rb +5 -3
- data/test/models/contract.rb +21 -3
- data/test/models/country.rb +2 -4
- data/test/models/course.rb +3 -1
- data/test/models/customer.rb +10 -8
- data/test/models/customer_carrier.rb +2 -0
- data/test/models/dashboard.rb +2 -0
- data/test/models/default.rb +2 -0
- data/test/models/department.rb +2 -0
- data/test/models/destroy_async_parent.rb +15 -0
- data/test/models/destroy_async_parent_soft_delete.rb +20 -0
- data/test/models/developer.rb +152 -85
- data/test/models/dl_keyed_belongs_to.rb +13 -0
- data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
- data/test/models/dl_keyed_has_many.rb +5 -0
- data/test/models/dl_keyed_has_many_through.rb +5 -0
- data/test/models/dl_keyed_has_one.rb +5 -0
- data/test/models/dl_keyed_join.rb +10 -0
- data/test/models/dog.rb +2 -0
- data/test/models/dog_lover.rb +2 -0
- data/test/models/doubloon.rb +3 -1
- data/test/models/drink_designer.rb +17 -0
- data/test/models/edge.rb +4 -2
- data/test/models/electron.rb +2 -0
- data/test/models/engine.rb +3 -2
- data/test/models/entrant.rb +2 -0
- data/test/models/entry.rb +5 -0
- data/test/models/essay.rb +6 -3
- data/test/models/essay_destroy_async.rb +12 -0
- data/test/models/event.rb +3 -1
- data/test/models/eye.rb +5 -3
- data/test/models/face.rb +14 -6
- data/test/models/family.rb +6 -0
- data/test/models/family_tree.rb +6 -0
- data/test/models/friendship.rb +5 -3
- data/test/models/frog.rb +8 -0
- data/test/models/guid.rb +3 -1
- data/test/models/guitar.rb +2 -0
- data/test/models/hotel.rb +5 -3
- data/test/models/human.rb +39 -0
- data/test/models/image.rb +3 -1
- data/test/models/interest.rb +14 -3
- data/test/models/invoice.rb +4 -2
- data/test/models/item.rb +3 -1
- data/test/models/job.rb +5 -3
- data/test/models/joke.rb +4 -2
- data/test/models/keyboard.rb +3 -1
- data/test/models/legacy_thing.rb +2 -0
- data/test/models/lesson.rb +2 -0
- data/test/models/line_item.rb +3 -1
- data/test/models/liquid.rb +2 -0
- data/test/models/matey.rb +3 -1
- data/test/models/measurement.rb +4 -0
- data/test/models/member.rb +23 -20
- data/test/models/member_detail.rb +3 -0
- data/test/models/member_type.rb +2 -0
- data/test/models/membership.rb +4 -1
- data/test/models/mentor.rb +3 -1
- data/test/models/message.rb +5 -0
- data/test/models/minimalistic.rb +2 -0
- data/test/models/minivan.rb +3 -2
- data/test/models/mixed_case_monkey.rb +3 -1
- data/test/models/molecule.rb +2 -0
- data/test/models/mouse.rb +6 -0
- data/test/models/movie.rb +2 -0
- data/test/models/node.rb +4 -2
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +2 -0
- data/test/models/numeric_data.rb +12 -0
- data/test/models/order.rb +4 -2
- data/test/models/organization.rb +9 -7
- data/test/models/other_dog.rb +3 -1
- data/test/models/owner.rb +6 -4
- data/test/models/parrot.rb +12 -4
- data/test/models/person.rb +59 -54
- data/test/models/personal_legacy_thing.rb +3 -1
- data/test/models/pet.rb +4 -2
- data/test/models/pet_treasure.rb +2 -0
- data/test/models/pirate.rb +67 -43
- data/test/models/possession.rb +3 -1
- data/test/models/post.rb +184 -86
- data/test/models/price_estimate.rb +11 -1
- data/test/models/professor.rb +3 -1
- data/test/models/project.rb +14 -12
- data/test/models/publisher/article.rb +2 -0
- data/test/models/publisher/magazine.rb +2 -0
- data/test/models/publisher.rb +2 -0
- data/test/models/randomly_named_c1.rb +2 -0
- data/test/models/rating.rb +5 -1
- data/test/models/reader.rb +7 -5
- data/test/models/recipe.rb +2 -0
- data/test/models/record.rb +2 -0
- data/test/models/reference.rb +6 -3
- data/test/models/reply.rb +39 -21
- data/test/models/room.rb +6 -0
- data/test/models/section.rb +6 -0
- data/test/models/seminar.rb +6 -0
- data/test/models/session.rb +6 -0
- data/test/models/ship.rb +12 -9
- data/test/models/ship_part.rb +5 -3
- data/test/models/shop.rb +4 -2
- data/test/models/shop_account.rb +2 -0
- data/test/models/speedometer.rb +2 -0
- data/test/models/sponsor.rb +8 -5
- data/test/models/squeak.rb +6 -0
- data/test/models/strict_zine.rb +7 -0
- data/test/models/string_key_object.rb +2 -0
- data/test/models/student.rb +2 -0
- data/test/models/subscriber.rb +4 -2
- data/test/models/subscription.rb +5 -1
- data/test/models/tag.rb +6 -3
- data/test/models/tagging.rb +13 -6
- data/test/models/task.rb +2 -0
- data/test/models/topic.rb +54 -19
- data/test/models/toy.rb +4 -0
- data/test/models/traffic_light.rb +2 -0
- data/test/models/treasure.rb +5 -3
- data/test/models/treaty.rb +2 -4
- data/test/models/tree.rb +2 -0
- data/test/models/tuning_peg.rb +2 -0
- data/test/models/tyre.rb +2 -0
- data/test/models/user.rb +12 -4
- data/test/models/uuid_child.rb +2 -0
- data/test/models/uuid_item.rb +2 -0
- data/test/models/uuid_parent.rb +2 -0
- data/test/models/vegetables.rb +12 -3
- data/test/models/vertex.rb +6 -4
- data/test/models/warehouse_thing.rb +2 -0
- data/test/models/wheel.rb +3 -1
- data/test/models/without_table.rb +3 -1
- data/test/models/zine.rb +3 -1
- data/test/schema/mysql2_specific_schema.rb +49 -35
- data/test/schema/oracle_specific_schema.rb +13 -15
- data/test/schema/postgresql_specific_schema.rb +51 -40
- data/test/schema/schema.rb +334 -154
- data/test/schema/sqlite_specific_schema.rb +9 -16
- data/test/support/config.rb +26 -26
- data/test/support/connection.rb +14 -8
- data/test/support/connection_helper.rb +3 -1
- data/test/support/ddl_helper.rb +2 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
- data/test/support/schema_dumping_helper.rb +2 -0
- data/test/support/stubs/strong_parameters.rb +40 -0
- data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
- data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
- metadata +196 -11
data/test/cases/relation_test.rb
CHANGED
@@ -1,47 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
4
|
+
require "models/post"
|
5
|
+
require "models/comment"
|
6
|
+
require "models/author"
|
7
|
+
require "models/rating"
|
8
|
+
require "models/categorization"
|
6
9
|
|
7
10
|
module ActiveRecord
|
8
11
|
class RelationTest < ActiveRecord::TestCase
|
9
|
-
fixtures :posts, :comments, :authors
|
10
|
-
|
11
|
-
class FakeKlass < Struct.new(:table_name, :name)
|
12
|
-
extend ActiveRecord::Delegation::DelegateCache
|
13
|
-
|
14
|
-
inherited self
|
15
|
-
|
16
|
-
def self.connection
|
17
|
-
Post.connection
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.table_name
|
21
|
-
'fake_table'
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.sanitize_sql_for_order(sql)
|
25
|
-
sql
|
26
|
-
end
|
27
|
-
end
|
12
|
+
fixtures :posts, :comments, :authors, :author_addresses, :ratings, :categorizations
|
28
13
|
|
29
14
|
def test_construction
|
30
|
-
relation = Relation.new(FakeKlass, :b
|
15
|
+
relation = Relation.new(FakeKlass, table: :b)
|
31
16
|
assert_equal FakeKlass, relation.klass
|
32
17
|
assert_equal :b, relation.table
|
33
|
-
|
18
|
+
assert_not relation.loaded, "relation is not loaded"
|
34
19
|
end
|
35
20
|
|
36
21
|
def test_responds_to_model_and_returns_klass
|
37
|
-
relation = Relation.new(FakeKlass
|
22
|
+
relation = Relation.new(FakeKlass)
|
38
23
|
assert_equal FakeKlass, relation.model
|
39
24
|
end
|
40
25
|
|
41
26
|
def test_initialize_single_values
|
42
|
-
relation = Relation.new(FakeKlass
|
27
|
+
relation = Relation.new(FakeKlass)
|
43
28
|
(Relation::SINGLE_VALUE_METHODS - [:create_with]).each do |method|
|
44
|
-
assert_nil relation.
|
29
|
+
assert_nil relation.public_send("#{method}_value"), method.to_s
|
45
30
|
end
|
46
31
|
value = relation.create_with_value
|
47
32
|
assert_equal({}, value)
|
@@ -49,79 +34,89 @@ module ActiveRecord
|
|
49
34
|
end
|
50
35
|
|
51
36
|
def test_multi_value_initialize
|
52
|
-
relation = Relation.new(FakeKlass
|
37
|
+
relation = Relation.new(FakeKlass)
|
53
38
|
Relation::MULTI_VALUE_METHODS.each do |method|
|
54
|
-
values = relation.
|
39
|
+
values = relation.public_send("#{method}_values")
|
55
40
|
assert_equal [], values, method.to_s
|
56
41
|
assert_predicate values, :frozen?, method.to_s
|
57
42
|
end
|
58
43
|
end
|
59
44
|
|
60
45
|
def test_extensions
|
61
|
-
relation = Relation.new(FakeKlass
|
46
|
+
relation = Relation.new(FakeKlass)
|
62
47
|
assert_equal [], relation.extensions
|
63
48
|
end
|
64
49
|
|
65
50
|
def test_empty_where_values_hash
|
66
|
-
relation = Relation.new(FakeKlass
|
51
|
+
relation = Relation.new(FakeKlass)
|
52
|
+
assert_equal({}, relation.where_values_hash)
|
53
|
+
|
54
|
+
relation.where!(relation.table[:id].not_eq(10))
|
55
|
+
assert_equal({}, relation.where_values_hash)
|
56
|
+
|
57
|
+
relation.where!(relation.table[:id].is_distinct_from(10))
|
67
58
|
assert_equal({}, relation.where_values_hash)
|
68
59
|
end
|
69
60
|
|
61
|
+
def test_where_values_hash_with_in_clause
|
62
|
+
relation = Relation.new(Post)
|
63
|
+
relation.where!(title: ["foo", "bar", "hello"])
|
64
|
+
|
65
|
+
assert_equal({ "title" => ["foo", "bar", "hello"] }, relation.where_values_hash)
|
66
|
+
end
|
67
|
+
|
70
68
|
def test_has_values
|
71
|
-
relation = Relation.new(Post
|
72
|
-
relation.where!
|
73
|
-
assert_equal({
|
69
|
+
relation = Relation.new(Post)
|
70
|
+
relation.where!(id: 10)
|
71
|
+
assert_equal({ "id" => 10 }, relation.where_values_hash)
|
74
72
|
end
|
75
73
|
|
76
74
|
def test_values_wrong_table
|
77
|
-
relation = Relation.new(Post
|
75
|
+
relation = Relation.new(Post)
|
78
76
|
relation.where! Comment.arel_table[:id].eq(10)
|
79
77
|
assert_equal({}, relation.where_values_hash)
|
80
78
|
end
|
81
79
|
|
82
80
|
def test_tree_is_not_traversed
|
83
|
-
relation = Relation.new(Post
|
81
|
+
relation = Relation.new(Post)
|
84
82
|
left = relation.table[:id].eq(10)
|
85
83
|
right = relation.table[:id].eq(10)
|
86
|
-
combine = left.
|
84
|
+
combine = left.or(right)
|
87
85
|
relation.where! combine
|
88
86
|
assert_equal({}, relation.where_values_hash)
|
89
87
|
end
|
90
88
|
|
91
|
-
def test_table_name_delegates_to_klass
|
92
|
-
relation = Relation.new(FakeKlass.new('posts'), :b, Post.predicate_builder)
|
93
|
-
assert_equal 'posts', relation.table_name
|
94
|
-
end
|
95
|
-
|
96
89
|
def test_scope_for_create
|
97
|
-
relation = Relation.new(FakeKlass
|
90
|
+
relation = Relation.new(FakeKlass)
|
98
91
|
assert_equal({}, relation.scope_for_create)
|
99
92
|
end
|
100
93
|
|
101
94
|
def test_create_with_value
|
102
|
-
relation = Relation.new(Post
|
103
|
-
|
104
|
-
relation.
|
105
|
-
assert_equal hash, relation.scope_for_create
|
95
|
+
relation = Relation.new(Post)
|
96
|
+
relation.create_with_value = { hello: "world" }
|
97
|
+
assert_equal({ "hello" => "world" }, relation.scope_for_create)
|
106
98
|
end
|
107
99
|
|
108
100
|
def test_create_with_value_with_wheres
|
109
|
-
relation = Relation.new(Post
|
110
|
-
|
111
|
-
|
112
|
-
|
101
|
+
relation = Relation.new(Post)
|
102
|
+
assert_equal({}, relation.scope_for_create)
|
103
|
+
|
104
|
+
relation.where!(id: 10)
|
105
|
+
assert_equal({ "id" => 10 }, relation.scope_for_create)
|
106
|
+
|
107
|
+
relation.create_with_value = { hello: "world" }
|
108
|
+
assert_equal({ "hello" => "world", "id" => 10 }, relation.scope_for_create)
|
113
109
|
end
|
114
110
|
|
115
|
-
|
116
|
-
|
117
|
-
relation
|
118
|
-
assert_equal({}, relation.scope_for_create)
|
111
|
+
def test_empty_scope
|
112
|
+
relation = Relation.new(Post)
|
113
|
+
assert_predicate relation, :empty_scope?
|
119
114
|
|
120
|
-
relation.
|
121
|
-
|
115
|
+
relation.merge!(relation)
|
116
|
+
assert_predicate relation, :empty_scope?
|
122
117
|
|
123
|
-
|
124
|
-
|
118
|
+
assert_not_predicate NullPost.all, :empty_scope?
|
119
|
+
assert_not_predicate FirstPost.all, :empty_scope?
|
125
120
|
end
|
126
121
|
|
127
122
|
def test_bad_constants_raise_errors
|
@@ -131,89 +126,89 @@ module ActiveRecord
|
|
131
126
|
end
|
132
127
|
|
133
128
|
def test_empty_eager_loading?
|
134
|
-
relation = Relation.new(FakeKlass
|
135
|
-
|
129
|
+
relation = Relation.new(FakeKlass)
|
130
|
+
assert_not_predicate relation, :eager_loading?
|
136
131
|
end
|
137
132
|
|
138
133
|
def test_eager_load_values
|
139
|
-
relation = Relation.new(FakeKlass
|
134
|
+
relation = Relation.new(FakeKlass)
|
140
135
|
relation.eager_load! :b
|
141
|
-
|
136
|
+
assert_predicate relation, :eager_loading?
|
142
137
|
end
|
143
138
|
|
144
139
|
def test_references_values
|
145
|
-
relation = Relation.new(FakeKlass
|
140
|
+
relation = Relation.new(FakeKlass)
|
146
141
|
assert_equal [], relation.references_values
|
147
142
|
relation = relation.references(:foo).references(:omg, :lol)
|
148
|
-
assert_equal [
|
143
|
+
assert_equal [:foo, :omg, :lol], relation.references_values
|
149
144
|
end
|
150
145
|
|
151
146
|
def test_references_values_dont_duplicate
|
152
|
-
relation = Relation.new(FakeKlass
|
147
|
+
relation = Relation.new(FakeKlass)
|
153
148
|
relation = relation.references(:foo).references(:foo)
|
154
|
-
assert_equal [
|
149
|
+
assert_equal [:foo], relation.references_values
|
155
150
|
end
|
156
151
|
|
157
|
-
test
|
158
|
-
relation = Relation.new(Post
|
159
|
-
relation = relation.merge where: {name: :lol}, readonly: true
|
152
|
+
test "merging a hash into a relation" do
|
153
|
+
relation = Relation.new(Post)
|
154
|
+
relation = relation.merge where: { name: :lol }, readonly: true
|
160
155
|
|
161
|
-
assert_equal({"name"
|
156
|
+
assert_equal({ "name" => :lol }, relation.where_clause.to_h)
|
162
157
|
assert_equal true, relation.readonly_value
|
163
158
|
end
|
164
159
|
|
165
|
-
test
|
166
|
-
assert_equal Relation::WhereClause.empty, Relation.new(FakeKlass
|
160
|
+
test "merging an empty hash into a relation" do
|
161
|
+
assert_equal Relation::WhereClause.empty, Relation.new(FakeKlass).merge({}).where_clause
|
167
162
|
end
|
168
163
|
|
169
|
-
test
|
170
|
-
assert_raises(ArgumentError) { Relation::HashMerger.new(nil, omg:
|
164
|
+
test "merging a hash with unknown keys raises" do
|
165
|
+
assert_raises(ArgumentError) { Relation::HashMerger.new(nil, omg: "lol") }
|
171
166
|
end
|
172
167
|
|
173
|
-
test
|
174
|
-
relation = Relation.new(FakeKlass
|
168
|
+
test "merging nil or false raises" do
|
169
|
+
relation = Relation.new(FakeKlass)
|
175
170
|
|
176
171
|
e = assert_raises(ArgumentError) do
|
177
172
|
relation = relation.merge nil
|
178
173
|
end
|
179
174
|
|
180
|
-
assert_equal
|
175
|
+
assert_equal "invalid argument: nil.", e.message
|
181
176
|
|
182
177
|
e = assert_raises(ArgumentError) do
|
183
178
|
relation = relation.merge false
|
184
179
|
end
|
185
180
|
|
186
|
-
assert_equal
|
181
|
+
assert_equal "invalid argument: false.", e.message
|
187
182
|
end
|
188
183
|
|
189
|
-
test
|
190
|
-
relation = Relation.new(Post
|
184
|
+
test "#values returns a dup of the values" do
|
185
|
+
relation = Relation.new(Post).where!(name: :foo)
|
191
186
|
values = relation.values
|
192
187
|
|
193
188
|
values[:where] = nil
|
194
189
|
assert_not_nil relation.where_clause
|
195
190
|
end
|
196
191
|
|
197
|
-
test
|
198
|
-
relation = Relation.new(FakeKlass, :
|
192
|
+
test "relations can be created with a values hash" do
|
193
|
+
relation = Relation.new(FakeKlass, values: { select: [:foo] })
|
199
194
|
assert_equal [:foo], relation.select_values
|
200
195
|
end
|
201
196
|
|
202
|
-
test
|
197
|
+
test "merging a hash interpolates conditions" do
|
203
198
|
klass = Class.new(FakeKlass) do
|
204
199
|
def self.sanitize_sql(args)
|
205
|
-
raise unless args == [
|
206
|
-
|
200
|
+
raise unless args == ["foo = ?", "bar"]
|
201
|
+
"foo = bar"
|
207
202
|
end
|
208
203
|
end
|
209
204
|
|
210
|
-
relation = Relation.new(klass
|
211
|
-
relation.merge!(where: [
|
212
|
-
assert_equal Relation::WhereClause.new([
|
205
|
+
relation = Relation.new(klass)
|
206
|
+
relation.merge!(where: ["foo = ?", "bar"])
|
207
|
+
assert_equal Relation::WhereClause.new(["foo = bar"]), relation.where_clause
|
213
208
|
end
|
214
209
|
|
215
210
|
def test_merging_readonly_false
|
216
|
-
relation = Relation.new(FakeKlass
|
211
|
+
relation = Relation.new(FakeKlass)
|
217
212
|
readonly_false_relation = relation.readonly(false)
|
218
213
|
# test merging in both directions
|
219
214
|
assert_equal false, relation.merge(readonly_false_relation).readonly_value
|
@@ -223,7 +218,50 @@ module ActiveRecord
|
|
223
218
|
def test_relation_merging_with_merged_joins_as_symbols
|
224
219
|
special_comments_with_ratings = SpecialComment.joins(:ratings)
|
225
220
|
posts_with_special_comments_with_ratings = Post.group("posts.id").joins(:special_comments).merge(special_comments_with_ratings)
|
226
|
-
assert_equal({
|
221
|
+
assert_equal({ 4 => 2 }, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count)
|
222
|
+
end
|
223
|
+
|
224
|
+
def test_relation_merging_with_merged_symbol_joins_keeps_inner_joins
|
225
|
+
queries = capture_sql { Author.joins(:posts).merge(Post.joins(:comments)).to_a }
|
226
|
+
|
227
|
+
nb_inner_join = queries.sum { |sql| sql.scan(/INNER\s+JOIN/i).size }
|
228
|
+
assert_equal 2, nb_inner_join, "Wrong amount of INNER JOIN in query"
|
229
|
+
assert queries.none? { |sql| /LEFT\s+(OUTER)?\s+JOIN/i.match?(sql) }, "Shouldn't have any LEFT JOIN in query"
|
230
|
+
end
|
231
|
+
|
232
|
+
def test_relation_merging_with_merged_symbol_joins_has_correct_size_and_count
|
233
|
+
# Has one entry per comment
|
234
|
+
merged_authors_with_commented_posts_relation = Author.joins(:posts).merge(Post.joins(:comments))
|
235
|
+
|
236
|
+
post_ids_with_author = Post.joins(:author).pluck(:id)
|
237
|
+
manual_comments_on_post_that_have_author = Comment.where(post_id: post_ids_with_author).pluck(:id)
|
238
|
+
|
239
|
+
assert_equal manual_comments_on_post_that_have_author.size, merged_authors_with_commented_posts_relation.count
|
240
|
+
assert_equal manual_comments_on_post_that_have_author.size, merged_authors_with_commented_posts_relation.to_a.size
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_relation_merging_with_merged_symbol_joins_is_aliased
|
244
|
+
categorizations_with_authors = Categorization.joins(:author)
|
245
|
+
queries = capture_sql { Post.joins(:author, :categorizations).merge(Author.select(:id)).merge(categorizations_with_authors).to_a }
|
246
|
+
|
247
|
+
nb_inner_join = queries.sum { |sql| sql.scan(/INNER\s+JOIN/i).size }
|
248
|
+
assert_equal 3, nb_inner_join, "Wrong amount of INNER JOIN in query"
|
249
|
+
|
250
|
+
# using `\W` as the column separator
|
251
|
+
assert queries.any? { |sql| %r[INNER\s+JOIN\s+#{Regexp.escape(Author.quoted_table_name)}\s+authors_categorizations]i.match?(sql) }, "Should be aliasing the child INNER JOINs in query"
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_relation_with_merged_joins_aliased_works
|
255
|
+
categorizations_with_authors = Categorization.joins(:author)
|
256
|
+
posts_with_joins_and_merges = Post.joins(:author, :categorizations)
|
257
|
+
.merge(Author.select(:id)).merge(categorizations_with_authors)
|
258
|
+
|
259
|
+
author_with_posts = Author.joins(:posts).ids
|
260
|
+
categorizations_with_author = Categorization.joins(:author).ids
|
261
|
+
posts_with_author_and_categorizations = Post.joins(:categorizations).where(author_id: author_with_posts, categorizations: { id: categorizations_with_author }).ids
|
262
|
+
|
263
|
+
assert_equal posts_with_author_and_categorizations.size, posts_with_joins_and_merges.count
|
264
|
+
assert_equal posts_with_author_and_categorizations.size, posts_with_joins_and_merges.to_a.size
|
227
265
|
end
|
228
266
|
|
229
267
|
def test_relation_merging_with_joins_as_join_dependency_pick_proper_parent
|
@@ -238,17 +276,17 @@ module ActiveRecord
|
|
238
276
|
|
239
277
|
def test_merge_raises_with_invalid_argument
|
240
278
|
assert_raises ArgumentError do
|
241
|
-
relation = Relation.new(FakeKlass
|
279
|
+
relation = Relation.new(FakeKlass)
|
242
280
|
relation.merge(true)
|
243
281
|
end
|
244
282
|
end
|
245
283
|
|
246
284
|
def test_respond_to_for_non_selected_element
|
247
285
|
post = Post.select(:title).first
|
248
|
-
|
286
|
+
assert_not_respond_to post, :body, "post should not respond_to?(:body) since invoking it raises exception"
|
249
287
|
|
250
288
|
silence_warnings { post = Post.select("'title' as post_title").first }
|
251
|
-
|
289
|
+
assert_not_respond_to post, :title, "post should not respond_to?(:body) since invoking it raises exception"
|
252
290
|
end
|
253
291
|
|
254
292
|
def test_select_quotes_when_using_from_clause
|
@@ -267,13 +305,85 @@ module ActiveRecord
|
|
267
305
|
klass.create!(description: "foo")
|
268
306
|
|
269
307
|
assert_equal ["foo"], klass.select(:description).from(klass.all).map(&:desc)
|
308
|
+
assert_equal ["foo"], klass.reselect(:description).from(klass.all).map(&:desc)
|
270
309
|
end
|
271
310
|
|
272
311
|
def test_relation_merging_with_merged_joins_as_strings
|
273
312
|
join_string = "LEFT OUTER JOIN #{Rating.quoted_table_name} ON #{SpecialComment.quoted_table_name}.id = #{Rating.quoted_table_name}.comment_id"
|
274
313
|
special_comments_with_ratings = SpecialComment.joins join_string
|
275
314
|
posts_with_special_comments_with_ratings = Post.group("posts.id").joins(:special_comments).merge(special_comments_with_ratings)
|
276
|
-
assert_equal({ 2=>1, 4=>3, 5=>1 }, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count)
|
315
|
+
assert_equal({ 2 => 1, 4 => 3, 5 => 1 }, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count)
|
316
|
+
end
|
317
|
+
|
318
|
+
def test_relation_merging_keeps_joining_order
|
319
|
+
authors = Author.where(id: 1)
|
320
|
+
posts = Post.joins(:author).merge(authors)
|
321
|
+
comments = Comment.joins(:post).merge(posts)
|
322
|
+
ratings = Rating.joins(:comment).merge(comments)
|
323
|
+
|
324
|
+
assert_equal 3, ratings.count
|
325
|
+
end
|
326
|
+
|
327
|
+
def test_relation_with_annotation_includes_comment_in_to_sql
|
328
|
+
post_with_annotation = Post.where(id: 1).annotate("foo")
|
329
|
+
assert_match %r{= 1 /\* foo \*/}, post_with_annotation.to_sql
|
330
|
+
end
|
331
|
+
|
332
|
+
def test_relation_with_annotation_includes_comment_in_sql
|
333
|
+
post_with_annotation = Post.where(id: 1).annotate("foo")
|
334
|
+
assert_sql(%r{/\* foo \*/}) do
|
335
|
+
assert post_with_annotation.first, "record should be found"
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
def test_relation_with_annotation_chains_sql_comments
|
340
|
+
post_with_annotation = Post.where(id: 1).annotate("foo").annotate("bar")
|
341
|
+
assert_sql(%r{/\* foo \*/ /\* bar \*/}) do
|
342
|
+
assert post_with_annotation.first, "record should be found"
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
def test_relation_with_annotation_filters_sql_comment_delimiters
|
347
|
+
post_with_annotation = Post.where(id: 1).annotate("**//foo//**")
|
348
|
+
assert_match %r{= 1 /\* foo \*/}, post_with_annotation.to_sql
|
349
|
+
end
|
350
|
+
|
351
|
+
def test_relation_with_annotation_includes_comment_in_count_query
|
352
|
+
post_with_annotation = Post.annotate("foo")
|
353
|
+
all_count = Post.all.to_a.count
|
354
|
+
assert_sql(%r{/\* foo \*/}) do
|
355
|
+
assert_equal all_count, post_with_annotation.count
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
def test_relation_without_annotation_does_not_include_an_empty_comment
|
360
|
+
log = capture_sql do
|
361
|
+
Post.where(id: 1).first
|
362
|
+
end
|
363
|
+
|
364
|
+
assert_not_predicate log, :empty?
|
365
|
+
assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
|
366
|
+
end
|
367
|
+
|
368
|
+
def test_relation_with_optimizer_hints_filters_sql_comment_delimiters
|
369
|
+
post_with_hint = Post.where(id: 1).optimizer_hints("**//BADHINT//**")
|
370
|
+
assert_match %r{BADHINT}, post_with_hint.to_sql
|
371
|
+
assert_no_match %r{\*/BADHINT}, post_with_hint.to_sql
|
372
|
+
assert_no_match %r{\*//BADHINT}, post_with_hint.to_sql
|
373
|
+
assert_no_match %r{BADHINT/\*}, post_with_hint.to_sql
|
374
|
+
assert_no_match %r{BADHINT//\*}, post_with_hint.to_sql
|
375
|
+
post_with_hint = Post.where(id: 1).optimizer_hints("/*+ BADHINT */")
|
376
|
+
assert_match %r{/\*\+ BADHINT \*/}, post_with_hint.to_sql
|
377
|
+
end
|
378
|
+
|
379
|
+
def test_does_not_duplicate_optimizer_hints_on_merge
|
380
|
+
puts "test_does_not_duplicate_optimizer_hints_on_merge"
|
381
|
+
escaped_table = Post.connection.quote_table_name("posts")
|
382
|
+
expected = "SELECT /*+ OMGHINT */ #{escaped_table}.* FROM #{escaped_table}"
|
383
|
+
query = Post.optimizer_hints("OMGHINT").merge(Post.optimizer_hints("OMGHINT")).to_sql
|
384
|
+
puts "Expected = #{expected}"
|
385
|
+
puts "Query = #{query}"
|
386
|
+
assert_equal expected, query
|
277
387
|
end
|
278
388
|
|
279
389
|
class EnsureRoundTripTypeCasting < ActiveRecord::Type::Value
|
@@ -281,19 +391,24 @@ module ActiveRecord
|
|
281
391
|
:string
|
282
392
|
end
|
283
393
|
|
394
|
+
def cast(value)
|
395
|
+
raise value unless value == "value from user"
|
396
|
+
"cast value"
|
397
|
+
end
|
398
|
+
|
284
399
|
def deserialize(value)
|
285
400
|
raise value unless value == "type cast for database"
|
286
401
|
"type cast from database"
|
287
402
|
end
|
288
403
|
|
289
404
|
def serialize(value)
|
290
|
-
raise value unless value == "value
|
405
|
+
raise value unless value == "cast value"
|
291
406
|
"type cast for database"
|
292
407
|
end
|
293
408
|
end
|
294
409
|
|
295
410
|
class UpdateAllTestModel < ActiveRecord::Base
|
296
|
-
self.table_name =
|
411
|
+
self.table_name = "posts"
|
297
412
|
|
298
413
|
attribute :body, EnsureRoundTripTypeCasting.new
|
299
414
|
end
|
@@ -304,25 +419,64 @@ module ActiveRecord
|
|
304
419
|
assert_equal "type cast from database", UpdateAllTestModel.first.body
|
305
420
|
end
|
306
421
|
|
307
|
-
|
422
|
+
def test_skip_preloading_after_arel_has_been_generated
|
423
|
+
assert_nothing_raised do
|
424
|
+
relation = Comment.all
|
425
|
+
relation.arel
|
426
|
+
relation.skip_preloading!
|
427
|
+
end
|
428
|
+
end
|
429
|
+
|
430
|
+
def test_marshal_load_legacy_relation
|
431
|
+
path = File.expand_path(
|
432
|
+
"support/marshal_compatibility_fixtures/legacy_relation.dump",
|
433
|
+
TEST_ROOT
|
434
|
+
)
|
435
|
+
assert_equal 11, Marshal.load(File.read(path)).size
|
436
|
+
end
|
437
|
+
|
438
|
+
test "no queries on empty IN" do
|
439
|
+
assert_queries(0) do
|
440
|
+
Post.where(id: []).load
|
441
|
+
end
|
442
|
+
end
|
308
443
|
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
You are using an outdated version of SQLite3 which has a bug in
|
313
|
-
quoted column names. Please update SQLite3 and rebuild the sqlite3
|
314
|
-
ruby gem
|
315
|
-
ERROR
|
444
|
+
test "can unscope empty IN" do
|
445
|
+
assert_queries(1) do
|
446
|
+
Post.where(id: []).unscope(where: :id).load
|
316
447
|
end
|
317
448
|
end
|
318
449
|
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
'SELECT "join" FROM (SELECT id AS "join" FROM posts) subquery'
|
323
|
-
).columns
|
324
|
-
["join"] != selected_quoted_column_names
|
450
|
+
test "no queries on empty relation exists?" do
|
451
|
+
assert_queries(0) do
|
452
|
+
Post.where(id: []).exists?(123)
|
325
453
|
end
|
326
454
|
end
|
455
|
+
|
456
|
+
test "no queries on empty condition exists?" do
|
457
|
+
assert_queries(0) do
|
458
|
+
Post.all.exists?(id: [])
|
459
|
+
end
|
460
|
+
end
|
461
|
+
|
462
|
+
private
|
463
|
+
def skip_if_sqlite3_version_includes_quoting_bug
|
464
|
+
if sqlite3_version_includes_quoting_bug?
|
465
|
+
skip <<-ERROR.squish
|
466
|
+
You are using an outdated version of SQLite3 which has a bug in
|
467
|
+
quoted column names. Please update SQLite3 and rebuild the sqlite3
|
468
|
+
ruby gem
|
469
|
+
ERROR
|
470
|
+
end
|
471
|
+
end
|
472
|
+
|
473
|
+
def sqlite3_version_includes_quoting_bug?
|
474
|
+
if current_adapter?(:SQLite3Adapter)
|
475
|
+
selected_quoted_column_names = ActiveRecord::Base.connection.exec_query(
|
476
|
+
'SELECT "join" FROM (SELECT id AS "join" FROM posts) subquery'
|
477
|
+
).columns
|
478
|
+
["join"] != selected_quoted_column_names
|
479
|
+
end
|
480
|
+
end
|
327
481
|
end
|
328
482
|
end
|