ibm_db 4.0.0-x86-mingw32 → 5.0.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 +5 -5
- data/MANIFEST +14 -14
- data/README +208 -208
- data/ext/Makefile +269 -0
- data/ext/Makefile.nt32 +181 -181
- data/ext/Makefile.nt32.191 +212 -212
- data/ext/extconf.rb +322 -291
- data/ext/gil_release_version +3 -0
- data/ext/ibm_db.c +11879 -11887
- data/ext/mkmf.log +110 -0
- data/ext/ruby_ibm_db.h +241 -241
- data/ext/ruby_ibm_db_cli.c +866 -866
- data/ext/ruby_ibm_db_cli.h +500 -500
- data/ext/unicode_support_version +3 -0
- data/init.rb +41 -41
- data/lib/IBM_DB.rb +27 -27
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3533 -3452
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -5
- data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
- data/lib/mswin32/ibm_db.rb +90 -90
- data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +49 -49
- data/test/assets/example.log +1 -1
- data/test/assets/test.txt +1 -1
- data/test/cases/adapter_test.rb +351 -351
- data/test/cases/adapters/mysql2/active_schema_test.rb +193 -193
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -50
- data/test/cases/adapters/mysql2/boolean_test.rb +100 -100
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -63
- data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -54
- data/test/cases/adapters/mysql2/connection_test.rb +210 -210
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -45
- data/test/cases/adapters/mysql2/enum_test.rb +26 -26
- data/test/cases/adapters/mysql2/explain_test.rb +21 -21
- data/test/cases/adapters/mysql2/json_test.rb +195 -195
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -83
- data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -152
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -59
- data/test/cases/adapters/mysql2/schema_test.rb +126 -126
- data/test/cases/adapters/mysql2/sp_test.rb +36 -36
- data/test/cases/adapters/mysql2/sql_types_test.rb +14 -14
- data/test/cases/adapters/mysql2/table_options_test.rb +42 -42
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -66
- data/test/cases/adapters/postgresql/active_schema_test.rb +98 -98
- data/test/cases/adapters/postgresql/array_test.rb +339 -339
- data/test/cases/adapters/postgresql/bit_string_test.rb +82 -82
- data/test/cases/adapters/postgresql/bytea_test.rb +134 -134
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -26
- data/test/cases/adapters/postgresql/change_schema_test.rb +38 -38
- data/test/cases/adapters/postgresql/cidr_test.rb +25 -25
- data/test/cases/adapters/postgresql/citext_test.rb +78 -78
- data/test/cases/adapters/postgresql/collation_test.rb +53 -53
- data/test/cases/adapters/postgresql/composite_test.rb +132 -132
- data/test/cases/adapters/postgresql/connection_test.rb +257 -257
- data/test/cases/adapters/postgresql/datatype_test.rb +92 -92
- data/test/cases/adapters/postgresql/domain_test.rb +47 -47
- data/test/cases/adapters/postgresql/enum_test.rb +91 -91
- data/test/cases/adapters/postgresql/explain_test.rb +20 -20
- data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -63
- data/test/cases/adapters/postgresql/full_text_test.rb +44 -44
- data/test/cases/adapters/postgresql/geometric_test.rb +378 -378
- data/test/cases/adapters/postgresql/hstore_test.rb +382 -382
- data/test/cases/adapters/postgresql/infinity_test.rb +69 -69
- data/test/cases/adapters/postgresql/integer_test.rb +25 -25
- data/test/cases/adapters/postgresql/json_test.rb +237 -237
- data/test/cases/adapters/postgresql/ltree_test.rb +53 -53
- data/test/cases/adapters/postgresql/money_test.rb +96 -96
- data/test/cases/adapters/postgresql/network_test.rb +94 -94
- data/test/cases/adapters/postgresql/numbers_test.rb +49 -49
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -405
- data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -22
- data/test/cases/adapters/postgresql/quoting_test.rb +44 -44
- data/test/cases/adapters/postgresql/range_test.rb +343 -343
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -111
- data/test/cases/adapters/postgresql/rename_table_test.rb +34 -34
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -119
- data/test/cases/adapters/postgresql/schema_test.rb +597 -597
- data/test/cases/adapters/postgresql/serial_test.rb +154 -154
- data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -41
- data/test/cases/adapters/postgresql/timestamp_test.rb +90 -90
- data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -33
- data/test/cases/adapters/postgresql/utils_test.rb +62 -62
- data/test/cases/adapters/postgresql/uuid_test.rb +294 -294
- data/test/cases/adapters/postgresql/xml_test.rb +54 -54
- data/test/cases/adapters/sqlite3/collation_test.rb +53 -53
- data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -98
- data/test/cases/adapters/sqlite3/explain_test.rb +21 -21
- data/test/cases/adapters/sqlite3/quoting_test.rb +101 -101
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -441
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -24
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -20
- data/test/cases/aggregations_test.rb +168 -168
- data/test/cases/ar_schema_test.rb +146 -146
- data/test/cases/associations/association_scope_test.rb +16 -16
- data/test/cases/associations/belongs_to_associations_test.rb +1141 -1141
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -41
- data/test/cases/associations/callbacks_test.rb +190 -190
- data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
- data/test/cases/associations/eager_load_nested_include_test.rb +126 -126
- data/test/cases/associations/eager_singularization_test.rb +148 -148
- data/test/cases/associations/eager_test.rb +1514 -1514
- data/test/cases/associations/extension_test.rb +87 -87
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -1004
- data/test/cases/associations/has_many_associations_test.rb +2501 -2501
- data/test/cases/associations/has_many_through_associations_test.rb +1271 -1271
- data/test/cases/associations/has_one_associations_test.rb +707 -707
- data/test/cases/associations/has_one_through_associations_test.rb +383 -383
- data/test/cases/associations/inner_join_association_test.rb +139 -139
- data/test/cases/associations/inverse_associations_test.rb +733 -733
- data/test/cases/associations/join_model_test.rb +777 -777
- data/test/cases/associations/left_outer_join_association_test.rb +88 -88
- data/test/cases/associations/nested_through_associations_test.rb +579 -579
- data/test/cases/associations/required_test.rb +102 -102
- data/test/cases/associations_test.rb +385 -385
- data/test/cases/attribute_decorators_test.rb +126 -125
- data/test/cases/attribute_methods/read_test.rb +60 -60
- data/test/cases/attribute_methods_test.rb +1009 -1009
- data/test/cases/attribute_set_test.rb +270 -270
- data/test/cases/attribute_test.rb +246 -246
- data/test/cases/attributes_test.rb +253 -253
- data/test/cases/autosave_association_test.rb +1708 -1708
- data/test/cases/base_test.rb +1713 -1713
- data/test/cases/batches_test.rb +489 -489
- data/test/cases/binary_test.rb +44 -44
- data/test/cases/bind_parameter_test.rb +110 -110
- data/test/cases/cache_key_test.rb +26 -25
- data/test/cases/calculations_test.rb +798 -798
- data/test/cases/callbacks_test.rb +636 -636
- data/test/cases/clone_test.rb +40 -40
- data/test/cases/coders/json_test.rb +15 -15
- data/test/cases/coders/yaml_column_test.rb +63 -63
- data/test/cases/collection_cache_key_test.rb +115 -115
- data/test/cases/column_alias_test.rb +17 -17
- data/test/cases/column_definition_test.rb +92 -92
- data/test/cases/comment_test.rb +145 -143
- data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -56
- data/test/cases/connection_adapters/connection_handler_test.rb +160 -160
- data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -255
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -69
- data/test/cases/connection_adapters/quoting_test.rb +13 -13
- data/test/cases/connection_adapters/schema_cache_test.rb +61 -61
- data/test/cases/connection_adapters/type_lookup_test.rb +118 -118
- data/test/cases/connection_management_test.rb +112 -112
- data/test/cases/connection_pool_test.rb +521 -521
- data/test/cases/connection_specification/resolver_test.rb +131 -131
- data/test/cases/core_test.rb +112 -112
- data/test/cases/counter_cache_test.rb +214 -214
- data/test/cases/custom_locking_test.rb +17 -17
- data/test/cases/database_statements_test.rb +34 -34
- data/test/cases/date_test.rb +44 -44
- data/test/cases/date_time_precision_test.rb +107 -106
- data/test/cases/date_time_test.rb +61 -61
- data/test/cases/defaults_test.rb +219 -218
- data/test/cases/dirty_test.rb +763 -763
- data/test/cases/disconnected_test.rb +30 -30
- data/test/cases/dup_test.rb +157 -157
- data/test/cases/enum_test.rb +444 -444
- data/test/cases/errors_test.rb +16 -16
- data/test/cases/explain_subscriber_test.rb +64 -64
- data/test/cases/explain_test.rb +87 -87
- data/test/cases/finder_respond_to_test.rb +60 -60
- data/test/cases/finder_test.rb +1294 -1294
- data/test/cases/fixture_set/file_test.rb +156 -156
- data/test/cases/fixtures_test.rb +988 -988
- data/test/cases/forbidden_attributes_protection_test.rb +165 -165
- data/test/cases/habtm_destroy_order_test.rb +61 -61
- data/test/cases/helper.rb +204 -204
- data/test/cases/hot_compatibility_test.rb +142 -142
- data/test/cases/i18n_test.rb +45 -45
- data/test/cases/inheritance_test.rb +606 -606
- data/test/cases/integration_test.rb +155 -155
- data/test/cases/invalid_connection_test.rb +24 -24
- data/test/cases/invertible_migration_test.rb +387 -387
- data/test/cases/json_serialization_test.rb +311 -311
- data/test/cases/locking_test.rb +493 -493
- data/test/cases/log_subscriber_test.rb +225 -225
- data/test/cases/migration/change_schema_test.rb +458 -458
- data/test/cases/migration/change_table_test.rb +256 -256
- data/test/cases/migration/column_attributes_test.rb +176 -176
- data/test/cases/migration/column_positioning_test.rb +56 -56
- data/test/cases/migration/columns_test.rb +310 -310
- data/test/cases/migration/command_recorder_test.rb +350 -350
- data/test/cases/migration/compatibility_test.rb +118 -118
- data/test/cases/migration/create_join_table_test.rb +157 -157
- data/test/cases/migration/foreign_key_test.rb +362 -360
- data/test/cases/migration/helper.rb +39 -39
- data/test/cases/migration/index_test.rb +218 -218
- data/test/cases/migration/logger_test.rb +36 -36
- data/test/cases/migration/pending_migrations_test.rb +52 -52
- data/test/cases/migration/references_foreign_key_test.rb +221 -216
- data/test/cases/migration/references_index_test.rb +101 -101
- data/test/cases/migration/references_statements_test.rb +136 -136
- data/test/cases/migration/rename_table_test.rb +93 -93
- data/test/cases/migration_test.rb +1157 -1157
- data/test/cases/migrator_test.rb +471 -470
- data/test/cases/mixin_test.rb +68 -68
- data/test/cases/modules_test.rb +172 -172
- data/test/cases/multiparameter_attributes_test.rb +372 -372
- data/test/cases/multiple_db_test.rb +122 -122
- data/test/cases/nested_attributes_test.rb +1098 -1098
- data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
- data/test/cases/persistence_test.rb +1001 -1001
- data/test/cases/pooled_connections_test.rb +81 -81
- data/test/cases/primary_keys_test.rb +376 -376
- data/test/cases/query_cache_test.rb +446 -446
- data/test/cases/quoting_test.rb +202 -202
- data/test/cases/readonly_test.rb +119 -119
- data/test/cases/reaper_test.rb +85 -85
- data/test/cases/reflection_test.rb +509 -509
- data/test/cases/relation/delegation_test.rb +63 -63
- data/test/cases/relation/merging_test.rb +157 -157
- data/test/cases/relation/mutation_test.rb +183 -183
- data/test/cases/relation/or_test.rb +92 -92
- data/test/cases/relation/predicate_builder_test.rb +16 -16
- data/test/cases/relation/record_fetch_warning_test.rb +40 -40
- data/test/cases/relation/where_chain_test.rb +105 -105
- data/test/cases/relation/where_clause_test.rb +182 -182
- data/test/cases/relation/where_test.rb +322 -322
- data/test/cases/relation_test.rb +328 -328
- data/test/cases/relations_test.rb +2026 -2026
- data/test/cases/reload_models_test.rb +22 -22
- data/test/cases/result_test.rb +90 -90
- data/test/cases/sanitize_test.rb +176 -176
- data/test/cases/schema_dumper_test.rb +457 -457
- data/test/cases/schema_loading_test.rb +52 -52
- data/test/cases/scoping/default_scoping_test.rb +528 -528
- data/test/cases/scoping/named_scoping_test.rb +561 -561
- data/test/cases/scoping/relation_scoping_test.rb +400 -400
- data/test/cases/secure_token_test.rb +32 -32
- data/test/cases/serialization_test.rb +104 -104
- data/test/cases/serialized_attribute_test.rb +364 -364
- data/test/cases/statement_cache_test.rb +136 -136
- data/test/cases/store_test.rb +195 -195
- data/test/cases/suppressor_test.rb +63 -63
- data/test/cases/tasks/database_tasks_test.rb +462 -462
- data/test/cases/tasks/mysql_rake_test.rb +345 -345
- data/test/cases/tasks/postgresql_rake_test.rb +304 -304
- data/test/cases/tasks/sqlite_rake_test.rb +220 -220
- data/test/cases/test_case.rb +131 -131
- data/test/cases/test_fixtures_test.rb +36 -36
- data/test/cases/time_precision_test.rb +103 -102
- data/test/cases/timestamp_test.rb +501 -501
- data/test/cases/touch_later_test.rb +121 -121
- data/test/cases/transaction_callbacks_test.rb +518 -518
- data/test/cases/transaction_isolation_test.rb +106 -106
- data/test/cases/transactions_test.rb +835 -834
- data/test/cases/type/adapter_specific_registry_test.rb +133 -133
- data/test/cases/type/date_time_test.rb +14 -14
- data/test/cases/type/integer_test.rb +27 -27
- data/test/cases/type/string_test.rb +22 -22
- data/test/cases/type/type_map_test.rb +177 -177
- data/test/cases/type_test.rb +39 -39
- data/test/cases/types_test.rb +24 -24
- data/test/cases/unconnected_test.rb +33 -33
- data/test/cases/validations/absence_validation_test.rb +73 -73
- data/test/cases/validations/association_validation_test.rb +97 -97
- data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
- data/test/cases/validations/i18n_validation_test.rb +86 -86
- data/test/cases/validations/length_validation_test.rb +79 -79
- data/test/cases/validations/presence_validation_test.rb +103 -103
- data/test/cases/validations/uniqueness_validation_test.rb +548 -548
- data/test/cases/validations_repair_helper.rb +19 -19
- data/test/cases/validations_test.rb +194 -194
- data/test/cases/view_test.rb +216 -216
- data/test/cases/yaml_serialization_test.rb +121 -121
- data/test/config.example.yml +97 -97
- data/test/config.rb +5 -5
- data/test/connections/native_ibm_db/connection.rb +44 -0
- data/test/fixtures/accounts.yml +29 -29
- data/test/fixtures/admin/accounts.yml +2 -2
- data/test/fixtures/admin/users.yml +10 -10
- data/test/fixtures/author_addresses.yml +17 -17
- data/test/fixtures/author_favorites.yml +3 -3
- data/test/fixtures/authors.yml +23 -23
- data/test/fixtures/bad_posts.yml +9 -9
- data/test/fixtures/binaries.yml +133 -133
- data/test/fixtures/books.yml +31 -31
- data/test/fixtures/bulbs.yml +5 -5
- data/test/fixtures/cars.yml +9 -9
- data/test/fixtures/categories.yml +19 -19
- data/test/fixtures/categories/special_categories.yml +9 -9
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
- data/test/fixtures/categories_ordered.yml +7 -7
- data/test/fixtures/categories_posts.yml +31 -31
- data/test/fixtures/categorizations.yml +23 -23
- data/test/fixtures/clubs.yml +8 -8
- data/test/fixtures/collections.yml +3 -3
- data/test/fixtures/colleges.yml +3 -3
- data/test/fixtures/comments.yml +65 -65
- data/test/fixtures/companies.yml +67 -67
- data/test/fixtures/computers.yml +10 -10
- data/test/fixtures/content.yml +3 -3
- data/test/fixtures/content_positions.yml +3 -3
- data/test/fixtures/courses.yml +8 -8
- data/test/fixtures/customers.yml +25 -25
- data/test/fixtures/dashboards.yml +6 -6
- data/test/fixtures/dead_parrots.yml +5 -5
- data/test/fixtures/developers.yml +22 -22
- data/test/fixtures/developers_projects.yml +16 -16
- data/test/fixtures/dog_lovers.yml +7 -7
- data/test/fixtures/dogs.yml +4 -4
- data/test/fixtures/doubloons.yml +3 -3
- data/test/fixtures/edges.yml +5 -5
- data/test/fixtures/entrants.yml +14 -14
- data/test/fixtures/essays.yml +6 -6
- data/test/fixtures/faces.yml +11 -11
- data/test/fixtures/fk_test_has_fk.yml +3 -3
- data/test/fixtures/fk_test_has_pk.yml +1 -1
- data/test/fixtures/friendships.yml +4 -4
- data/test/fixtures/funny_jokes.yml +10 -10
- data/test/fixtures/interests.yml +33 -33
- data/test/fixtures/items.yml +3 -3
- data/test/fixtures/jobs.yml +7 -7
- data/test/fixtures/legacy_things.yml +3 -3
- data/test/fixtures/live_parrots.yml +4 -4
- data/test/fixtures/mateys.yml +4 -4
- data/test/fixtures/member_details.yml +8 -8
- data/test/fixtures/member_types.yml +6 -6
- data/test/fixtures/members.yml +11 -11
- data/test/fixtures/memberships.yml +34 -34
- data/test/fixtures/men.yml +5 -5
- data/test/fixtures/minimalistics.yml +2 -2
- data/test/fixtures/minivans.yml +5 -5
- data/test/fixtures/mixed_case_monkeys.yml +6 -6
- data/test/fixtures/mixins.yml +29 -29
- data/test/fixtures/movies.yml +7 -7
- data/test/fixtures/naked/yml/accounts.yml +1 -1
- data/test/fixtures/naked/yml/companies.yml +1 -1
- data/test/fixtures/naked/yml/courses.yml +1 -1
- data/test/fixtures/naked/yml/parrots.yml +2 -2
- data/test/fixtures/naked/yml/trees.yml +3 -3
- data/test/fixtures/nodes.yml +29 -29
- data/test/fixtures/organizations.yml +5 -5
- data/test/fixtures/other_comments.yml +6 -6
- data/test/fixtures/other_dogs.yml +2 -2
- data/test/fixtures/other_posts.yml +7 -7
- data/test/fixtures/other_topics.yml +42 -42
- data/test/fixtures/owners.yml +9 -9
- data/test/fixtures/parrots.yml +27 -27
- data/test/fixtures/parrots_pirates.yml +7 -7
- data/test/fixtures/people.yml +24 -24
- data/test/fixtures/peoples_treasures.yml +3 -3
- data/test/fixtures/pets.yml +19 -19
- data/test/fixtures/pirates.yml +12 -15
- data/test/fixtures/posts.yml +80 -80
- data/test/fixtures/price_estimates.yml +16 -16
- data/test/fixtures/products.yml +4 -4
- data/test/fixtures/projects.yml +7 -7
- data/test/fixtures/ratings.yml +14 -14
- data/test/fixtures/readers.yml +11 -11
- data/test/fixtures/references.yml +17 -17
- data/test/fixtures/reserved_words/distinct.yml +5 -5
- data/test/fixtures/reserved_words/distinct_select.yml +11 -11
- data/test/fixtures/reserved_words/group.yml +14 -14
- data/test/fixtures/reserved_words/select.yml +8 -8
- data/test/fixtures/reserved_words/values.yml +7 -7
- data/test/fixtures/ships.yml +6 -6
- data/test/fixtures/speedometers.yml +8 -8
- data/test/fixtures/sponsors.yml +12 -12
- data/test/fixtures/string_key_objects.yml +7 -7
- data/test/fixtures/subscribers.yml +10 -10
- data/test/fixtures/subscriptions.yml +12 -12
- data/test/fixtures/taggings.yml +78 -78
- data/test/fixtures/tags.yml +11 -11
- data/test/fixtures/tasks.yml +7 -7
- data/test/fixtures/teapots.yml +3 -3
- data/test/fixtures/to_be_linked/accounts.yml +2 -2
- data/test/fixtures/to_be_linked/users.yml +10 -10
- data/test/fixtures/topics.yml +49 -49
- data/test/fixtures/toys.yml +14 -14
- data/test/fixtures/traffic_lights.yml +9 -9
- data/test/fixtures/treasures.yml +10 -10
- data/test/fixtures/trees.yml +3 -3
- data/test/fixtures/uuid_children.yml +3 -3
- data/test/fixtures/uuid_parents.yml +2 -2
- data/test/fixtures/variants.yml +4 -4
- data/test/fixtures/vegetables.yml +19 -19
- data/test/fixtures/vertices.yml +3 -3
- data/test/fixtures/warehouse_things.yml +2 -2
- data/test/fixtures/zines.yml +5 -5
- data/test/migrations/10_urban/9_add_expressions.rb +11 -11
- data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
- data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
- data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
- data/test/migrations/missing/1_people_have_last_names.rb +9 -9
- data/test/migrations/missing/3_we_need_reminders.rb +12 -12
- data/test/migrations/missing/4_innocent_jointable.rb +12 -12
- data/test/migrations/rename/1_we_need_things.rb +11 -11
- data/test/migrations/rename/2_rename_things.rb +9 -9
- data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
- data/test/migrations/to_copy2/1_create_articles.rb +7 -7
- data/test/migrations/to_copy2/2_create_comments.rb +7 -7
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
- data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
- data/test/migrations/valid/2_we_need_reminders.rb +12 -12
- data/test/migrations/valid/3_innocent_jointable.rb +12 -12
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
- data/test/models/admin.rb +5 -5
- data/test/models/admin/account.rb +3 -3
- data/test/models/admin/user.rb +40 -40
- data/test/models/aircraft.rb +5 -5
- data/test/models/arunit2_model.rb +3 -3
- data/test/models/author.rb +209 -209
- data/test/models/auto_id.rb +4 -4
- data/test/models/autoloadable/extra_firm.rb +2 -2
- data/test/models/binary.rb +2 -2
- data/test/models/bird.rb +12 -12
- data/test/models/book.rb +23 -23
- data/test/models/boolean.rb +2 -2
- data/test/models/bulb.rb +52 -52
- data/test/models/cake_designer.rb +3 -3
- data/test/models/car.rb +29 -29
- data/test/models/carrier.rb +2 -2
- data/test/models/cat.rb +10 -10
- data/test/models/categorization.rb +19 -19
- data/test/models/category.rb +35 -35
- data/test/models/chef.rb +8 -8
- data/test/models/citation.rb +3 -3
- data/test/models/club.rb +25 -25
- data/test/models/college.rb +10 -10
- data/test/models/column.rb +3 -3
- data/test/models/column_name.rb +3 -3
- data/test/models/comment.rb +76 -76
- data/test/models/company.rb +230 -230
- data/test/models/company_in_module.rb +98 -98
- data/test/models/computer.rb +3 -3
- data/test/models/contact.rb +41 -41
- data/test/models/content.rb +40 -40
- data/test/models/contract.rb +20 -20
- data/test/models/country.rb +7 -7
- data/test/models/course.rb +6 -6
- data/test/models/customer.rb +83 -83
- data/test/models/customer_carrier.rb +14 -14
- data/test/models/dashboard.rb +3 -3
- data/test/models/default.rb +2 -2
- data/test/models/department.rb +4 -4
- data/test/models/developer.rb +274 -274
- data/test/models/dog.rb +5 -5
- data/test/models/dog_lover.rb +5 -5
- data/test/models/doubloon.rb +12 -12
- data/test/models/drink_designer.rb +3 -3
- data/test/models/edge.rb +5 -5
- data/test/models/electron.rb +5 -5
- data/test/models/engine.rb +4 -4
- data/test/models/entrant.rb +3 -3
- data/test/models/essay.rb +5 -5
- data/test/models/event.rb +3 -3
- data/test/models/eye.rb +37 -37
- data/test/models/face.rb +9 -9
- data/test/models/friendship.rb +6 -6
- data/test/models/guid.rb +2 -2
- data/test/models/guitar.rb +4 -4
- data/test/models/hotel.rb +11 -11
- data/test/models/image.rb +3 -3
- data/test/models/interest.rb +5 -5
- data/test/models/invoice.rb +4 -4
- data/test/models/item.rb +7 -7
- data/test/models/job.rb +7 -7
- data/test/models/joke.rb +7 -7
- data/test/models/keyboard.rb +3 -3
- data/test/models/legacy_thing.rb +3 -3
- data/test/models/lesson.rb +11 -11
- data/test/models/line_item.rb +3 -3
- data/test/models/liquid.rb +4 -4
- data/test/models/man.rb +11 -11
- data/test/models/matey.rb +4 -4
- data/test/models/member.rb +42 -42
- data/test/models/member_detail.rb +8 -8
- data/test/models/member_type.rb +3 -3
- data/test/models/membership.rb +35 -35
- data/test/models/mentor.rb +2 -2
- data/test/models/minimalistic.rb +2 -2
- data/test/models/minivan.rb +9 -9
- data/test/models/mixed_case_monkey.rb +3 -3
- data/test/models/mocktail_designer.rb +2 -2
- data/test/models/molecule.rb +6 -6
- data/test/models/movie.rb +5 -5
- data/test/models/node.rb +5 -5
- data/test/models/non_primary_key.rb +2 -2
- data/test/models/notification.rb +3 -3
- data/test/models/order.rb +4 -4
- data/test/models/organization.rb +14 -14
- data/test/models/other_dog.rb +5 -5
- data/test/models/owner.rb +37 -37
- data/test/models/parrot.rb +28 -28
- data/test/models/person.rb +142 -142
- data/test/models/personal_legacy_thing.rb +4 -4
- data/test/models/pet.rb +18 -18
- data/test/models/pet_treasure.rb +6 -6
- data/test/models/pirate.rb +92 -92
- data/test/models/possession.rb +3 -3
- data/test/models/post.rb +273 -273
- data/test/models/price_estimate.rb +4 -4
- data/test/models/professor.rb +5 -5
- data/test/models/project.rb +40 -40
- data/test/models/publisher.rb +2 -2
- data/test/models/publisher/article.rb +4 -4
- data/test/models/publisher/magazine.rb +3 -3
- data/test/models/rating.rb +4 -4
- data/test/models/reader.rb +23 -23
- data/test/models/recipe.rb +3 -3
- data/test/models/record.rb +2 -2
- data/test/models/reference.rb +22 -22
- data/test/models/reply.rb +61 -61
- data/test/models/ship.rb +39 -39
- data/test/models/ship_part.rb +8 -8
- data/test/models/shop.rb +17 -17
- data/test/models/shop_account.rb +6 -6
- data/test/models/speedometer.rb +6 -6
- data/test/models/sponsor.rb +7 -7
- data/test/models/string_key_object.rb +3 -3
- data/test/models/student.rb +4 -4
- data/test/models/subject.rb +16 -16
- data/test/models/subscriber.rb +8 -8
- data/test/models/subscription.rb +4 -4
- data/test/models/tag.rb +13 -13
- data/test/models/tagging.rb +13 -13
- data/test/models/task.rb +5 -5
- data/test/models/topic.rb +118 -118
- data/test/models/toy.rb +6 -6
- data/test/models/traffic_light.rb +4 -4
- data/test/models/treasure.rb +14 -14
- data/test/models/treaty.rb +7 -7
- data/test/models/tree.rb +3 -3
- data/test/models/tuning_peg.rb +4 -4
- data/test/models/tyre.rb +11 -11
- data/test/models/user.rb +14 -14
- data/test/models/uuid_child.rb +3 -3
- data/test/models/uuid_item.rb +6 -6
- data/test/models/uuid_parent.rb +3 -3
- data/test/models/vegetables.rb +24 -24
- data/test/models/vehicle.rb +6 -6
- data/test/models/vertex.rb +9 -9
- data/test/models/warehouse_thing.rb +5 -5
- data/test/models/wheel.rb +3 -3
- data/test/models/without_table.rb +3 -3
- data/test/models/zine.rb +3 -3
- data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
- data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
- data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
- data/test/schema/mysql2_specific_schema.rb +68 -68
- data/test/schema/oracle_specific_schema.rb +40 -40
- data/test/schema/postgresql_specific_schema.rb +114 -114
- data/test/schema/schema.rb +1057 -1057
- data/test/schema/schema.rb.original +1057 -1057
- data/test/schema/sqlite_specific_schema.rb +18 -18
- data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
- data/test/support/config.rb +43 -43
- data/test/support/connection.rb +23 -23
- data/test/support/connection_helper.rb +14 -14
- data/test/support/ddl_helper.rb +8 -8
- data/test/support/schema_dumping_helper.rb +20 -20
- data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -22
- data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -182
- metadata +24 -13
- data/test/fixtures/author_addresses.original +0 -11
- data/test/fixtures/authors.original +0 -17
data/test/cases/relation_test.rb
CHANGED
@@ -1,328 +1,328 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/post'
|
3
|
-
require 'models/comment'
|
4
|
-
require 'models/author'
|
5
|
-
require 'models/rating'
|
6
|
-
|
7
|
-
module ActiveRecord
|
8
|
-
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
|
28
|
-
|
29
|
-
def test_construction
|
30
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
31
|
-
assert_equal FakeKlass, relation.klass
|
32
|
-
assert_equal :b, relation.table
|
33
|
-
assert !relation.loaded, 'relation is not loaded'
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_responds_to_model_and_returns_klass
|
37
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
38
|
-
assert_equal FakeKlass, relation.model
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_initialize_single_values
|
42
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
43
|
-
(Relation::SINGLE_VALUE_METHODS - [:create_with]).each do |method|
|
44
|
-
assert_nil relation.send("#{method}_value"), method.to_s
|
45
|
-
end
|
46
|
-
value = relation.create_with_value
|
47
|
-
assert_equal({}, value)
|
48
|
-
assert_predicate value, :frozen?
|
49
|
-
end
|
50
|
-
|
51
|
-
def test_multi_value_initialize
|
52
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
53
|
-
Relation::MULTI_VALUE_METHODS.each do |method|
|
54
|
-
values = relation.send("#{method}_values")
|
55
|
-
assert_equal [], values, method.to_s
|
56
|
-
assert_predicate values, :frozen?, method.to_s
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_extensions
|
61
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
62
|
-
assert_equal [], relation.extensions
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_empty_where_values_hash
|
66
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
67
|
-
assert_equal({}, relation.where_values_hash)
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_has_values
|
71
|
-
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
72
|
-
relation.where! relation.table[:id].eq(10)
|
73
|
-
assert_equal({:id => 10}, relation.where_values_hash)
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_values_wrong_table
|
77
|
-
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
78
|
-
relation.where! Comment.arel_table[:id].eq(10)
|
79
|
-
assert_equal({}, relation.where_values_hash)
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_tree_is_not_traversed
|
83
|
-
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
84
|
-
left = relation.table[:id].eq(10)
|
85
|
-
right = relation.table[:id].eq(10)
|
86
|
-
combine = left.and right
|
87
|
-
relation.where! combine
|
88
|
-
assert_equal({}, relation.where_values_hash)
|
89
|
-
end
|
90
|
-
|
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
|
-
def test_scope_for_create
|
97
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
98
|
-
assert_equal({}, relation.scope_for_create)
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_create_with_value
|
102
|
-
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
103
|
-
hash = { :hello => 'world' }
|
104
|
-
relation.create_with_value = hash
|
105
|
-
assert_equal hash, relation.scope_for_create
|
106
|
-
end
|
107
|
-
|
108
|
-
def test_create_with_value_with_wheres
|
109
|
-
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
110
|
-
relation.where! relation.table[:id].eq(10)
|
111
|
-
relation.create_with_value = {:hello => 'world'}
|
112
|
-
assert_equal({:hello => 'world', :id => 10}, relation.scope_for_create)
|
113
|
-
end
|
114
|
-
|
115
|
-
# FIXME: is this really wanted or expected behavior?
|
116
|
-
def test_scope_for_create_is_cached
|
117
|
-
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
118
|
-
assert_equal({}, relation.scope_for_create)
|
119
|
-
|
120
|
-
relation.where! relation.table[:id].eq(10)
|
121
|
-
assert_equal({}, relation.scope_for_create)
|
122
|
-
|
123
|
-
relation.create_with_value = {:hello => 'world'}
|
124
|
-
assert_equal({}, relation.scope_for_create)
|
125
|
-
end
|
126
|
-
|
127
|
-
def test_bad_constants_raise_errors
|
128
|
-
assert_raises(NameError) do
|
129
|
-
ActiveRecord::Relation::HelloWorld
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
def test_empty_eager_loading?
|
134
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
135
|
-
assert !relation.eager_loading?
|
136
|
-
end
|
137
|
-
|
138
|
-
def test_eager_load_values
|
139
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
140
|
-
relation.eager_load! :b
|
141
|
-
assert relation.eager_loading?
|
142
|
-
end
|
143
|
-
|
144
|
-
def test_references_values
|
145
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
146
|
-
assert_equal [], relation.references_values
|
147
|
-
relation = relation.references(:foo).references(:omg, :lol)
|
148
|
-
assert_equal ['foo', 'omg', 'lol'], relation.references_values
|
149
|
-
end
|
150
|
-
|
151
|
-
def test_references_values_dont_duplicate
|
152
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
153
|
-
relation = relation.references(:foo).references(:foo)
|
154
|
-
assert_equal ['foo'], relation.references_values
|
155
|
-
end
|
156
|
-
|
157
|
-
test 'merging a hash into a relation' do
|
158
|
-
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
159
|
-
relation = relation.merge where: {name: :lol}, readonly: true
|
160
|
-
|
161
|
-
assert_equal({"name"=>:lol}, relation.where_clause.to_h)
|
162
|
-
assert_equal true, relation.readonly_value
|
163
|
-
end
|
164
|
-
|
165
|
-
test 'merging an empty hash into a relation' do
|
166
|
-
assert_equal Relation::WhereClause.empty, Relation.new(FakeKlass, :b, nil).merge({}).where_clause
|
167
|
-
end
|
168
|
-
|
169
|
-
test 'merging a hash with unknown keys raises' do
|
170
|
-
assert_raises(ArgumentError) { Relation::HashMerger.new(nil, omg: 'lol') }
|
171
|
-
end
|
172
|
-
|
173
|
-
test 'merging nil or false raises' do
|
174
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
175
|
-
|
176
|
-
e = assert_raises(ArgumentError) do
|
177
|
-
relation = relation.merge nil
|
178
|
-
end
|
179
|
-
|
180
|
-
assert_equal 'invalid argument: nil.', e.message
|
181
|
-
|
182
|
-
e = assert_raises(ArgumentError) do
|
183
|
-
relation = relation.merge false
|
184
|
-
end
|
185
|
-
|
186
|
-
assert_equal 'invalid argument: false.', e.message
|
187
|
-
end
|
188
|
-
|
189
|
-
test '#values returns a dup of the values' do
|
190
|
-
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder).where!(name: :foo)
|
191
|
-
values = relation.values
|
192
|
-
|
193
|
-
values[:where] = nil
|
194
|
-
assert_not_nil relation.where_clause
|
195
|
-
end
|
196
|
-
|
197
|
-
test 'relations can be created with a values hash' do
|
198
|
-
relation = Relation.new(FakeKlass, :b, nil, select: [:foo])
|
199
|
-
assert_equal [:foo], relation.select_values
|
200
|
-
end
|
201
|
-
|
202
|
-
test 'merging a hash interpolates conditions' do
|
203
|
-
klass = Class.new(FakeKlass) do
|
204
|
-
def self.sanitize_sql(args)
|
205
|
-
raise unless args == ['foo = ?', 'bar']
|
206
|
-
'foo = bar'
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
relation = Relation.new(klass, :b, nil)
|
211
|
-
relation.merge!(where: ['foo = ?', 'bar'])
|
212
|
-
assert_equal Relation::WhereClause.new(['foo = bar'], []), relation.where_clause
|
213
|
-
end
|
214
|
-
|
215
|
-
def test_merging_readonly_false
|
216
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
217
|
-
readonly_false_relation = relation.readonly(false)
|
218
|
-
# test merging in both directions
|
219
|
-
assert_equal false, relation.merge(readonly_false_relation).readonly_value
|
220
|
-
assert_equal false, readonly_false_relation.merge(relation).readonly_value
|
221
|
-
end
|
222
|
-
|
223
|
-
def test_relation_merging_with_merged_joins_as_symbols
|
224
|
-
special_comments_with_ratings = SpecialComment.joins(:ratings)
|
225
|
-
posts_with_special_comments_with_ratings = Post.group("posts.id").joins(:special_comments).merge(special_comments_with_ratings)
|
226
|
-
assert_equal({ 2=>1, 4=>3, 5=>1 }, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count)
|
227
|
-
end
|
228
|
-
|
229
|
-
def test_relation_merging_with_joins_as_join_dependency_pick_proper_parent
|
230
|
-
post = Post.create!(title: "haha", body: "huhu")
|
231
|
-
comment = post.comments.create!(body: "hu")
|
232
|
-
3.times { comment.ratings.create! }
|
233
|
-
|
234
|
-
relation = Post.joins(:comments).merge Comment.joins(:ratings)
|
235
|
-
|
236
|
-
assert_equal 3, relation.where(id: post.id).pluck(:id).size
|
237
|
-
end
|
238
|
-
|
239
|
-
def test_merge_raises_with_invalid_argument
|
240
|
-
assert_raises ArgumentError do
|
241
|
-
relation = Relation.new(FakeKlass, :b, nil)
|
242
|
-
relation.merge(true)
|
243
|
-
end
|
244
|
-
end
|
245
|
-
|
246
|
-
def test_respond_to_for_non_selected_element
|
247
|
-
post = Post.select(:title).first
|
248
|
-
assert_equal false, post.respond_to?(:body), "post should not respond_to?(:body) since invoking it raises exception"
|
249
|
-
|
250
|
-
silence_warnings { post = Post.select("'title' as post_title").first }
|
251
|
-
assert_equal false, post.respond_to?(:title), "post should not respond_to?(:body) since invoking it raises exception"
|
252
|
-
end
|
253
|
-
|
254
|
-
def test_select_quotes_when_using_from_clause
|
255
|
-
skip_if_sqlite3_version_includes_quoting_bug
|
256
|
-
quoted_join = ActiveRecord::Base.connection.quote_table_name("join")
|
257
|
-
selected = Post.select(:join).from(Post.select("id as #{quoted_join}")).map(&:join)
|
258
|
-
assert_equal Post.pluck(:id), selected
|
259
|
-
end
|
260
|
-
|
261
|
-
def test_selecting_aliased_attribute_quotes_column_name_when_from_is_used
|
262
|
-
skip_if_sqlite3_version_includes_quoting_bug
|
263
|
-
klass = Class.new(ActiveRecord::Base) do
|
264
|
-
self.table_name = :test_with_keyword_column_name
|
265
|
-
alias_attribute :description, :desc
|
266
|
-
end
|
267
|
-
klass.create!(description: "foo")
|
268
|
-
|
269
|
-
assert_equal ["foo"], klass.select(:description).from(klass.all).map(&:desc)
|
270
|
-
end
|
271
|
-
|
272
|
-
def test_relation_merging_with_merged_joins_as_strings
|
273
|
-
join_string = "LEFT OUTER JOIN #{Rating.quoted_table_name} ON #{SpecialComment.quoted_table_name}.id = #{Rating.quoted_table_name}.comment_id"
|
274
|
-
special_comments_with_ratings = SpecialComment.joins join_string
|
275
|
-
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)
|
277
|
-
end
|
278
|
-
|
279
|
-
class EnsureRoundTripTypeCasting < ActiveRecord::Type::Value
|
280
|
-
def type
|
281
|
-
:string
|
282
|
-
end
|
283
|
-
|
284
|
-
def deserialize(value)
|
285
|
-
raise value unless value == "type cast for database"
|
286
|
-
"type cast from database"
|
287
|
-
end
|
288
|
-
|
289
|
-
def serialize(value)
|
290
|
-
raise value unless value == "value from user"
|
291
|
-
"type cast for database"
|
292
|
-
end
|
293
|
-
end
|
294
|
-
|
295
|
-
class UpdateAllTestModel < ActiveRecord::Base
|
296
|
-
self.table_name = 'posts'
|
297
|
-
|
298
|
-
attribute :body, EnsureRoundTripTypeCasting.new
|
299
|
-
end
|
300
|
-
|
301
|
-
def test_update_all_goes_through_normal_type_casting
|
302
|
-
UpdateAllTestModel.update_all(body: "value from user", type: nil) # No STI
|
303
|
-
|
304
|
-
assert_equal "type cast from database", UpdateAllTestModel.first.body
|
305
|
-
end
|
306
|
-
|
307
|
-
private
|
308
|
-
|
309
|
-
def skip_if_sqlite3_version_includes_quoting_bug
|
310
|
-
if sqlite3_version_includes_quoting_bug?
|
311
|
-
skip <<-ERROR.squish
|
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
|
316
|
-
end
|
317
|
-
end
|
318
|
-
|
319
|
-
def sqlite3_version_includes_quoting_bug?
|
320
|
-
if current_adapter?(:SQLite3Adapter)
|
321
|
-
selected_quoted_column_names = ActiveRecord::Base.connection.exec_query(
|
322
|
-
'SELECT "join" FROM (SELECT id AS "join" FROM posts) subquery'
|
323
|
-
).columns
|
324
|
-
["join"] != selected_quoted_column_names
|
325
|
-
end
|
326
|
-
end
|
327
|
-
end
|
328
|
-
end
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/post'
|
3
|
+
require 'models/comment'
|
4
|
+
require 'models/author'
|
5
|
+
require 'models/rating'
|
6
|
+
|
7
|
+
module ActiveRecord
|
8
|
+
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
|
28
|
+
|
29
|
+
def test_construction
|
30
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
31
|
+
assert_equal FakeKlass, relation.klass
|
32
|
+
assert_equal :b, relation.table
|
33
|
+
assert !relation.loaded, 'relation is not loaded'
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_responds_to_model_and_returns_klass
|
37
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
38
|
+
assert_equal FakeKlass, relation.model
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_initialize_single_values
|
42
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
43
|
+
(Relation::SINGLE_VALUE_METHODS - [:create_with]).each do |method|
|
44
|
+
assert_nil relation.send("#{method}_value"), method.to_s
|
45
|
+
end
|
46
|
+
value = relation.create_with_value
|
47
|
+
assert_equal({}, value)
|
48
|
+
assert_predicate value, :frozen?
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_multi_value_initialize
|
52
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
53
|
+
Relation::MULTI_VALUE_METHODS.each do |method|
|
54
|
+
values = relation.send("#{method}_values")
|
55
|
+
assert_equal [], values, method.to_s
|
56
|
+
assert_predicate values, :frozen?, method.to_s
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_extensions
|
61
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
62
|
+
assert_equal [], relation.extensions
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_empty_where_values_hash
|
66
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
67
|
+
assert_equal({}, relation.where_values_hash)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_has_values
|
71
|
+
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
72
|
+
relation.where! relation.table[:id].eq(10)
|
73
|
+
assert_equal({:id => 10}, relation.where_values_hash)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_values_wrong_table
|
77
|
+
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
78
|
+
relation.where! Comment.arel_table[:id].eq(10)
|
79
|
+
assert_equal({}, relation.where_values_hash)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_tree_is_not_traversed
|
83
|
+
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
84
|
+
left = relation.table[:id].eq(10)
|
85
|
+
right = relation.table[:id].eq(10)
|
86
|
+
combine = left.and right
|
87
|
+
relation.where! combine
|
88
|
+
assert_equal({}, relation.where_values_hash)
|
89
|
+
end
|
90
|
+
|
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
|
+
def test_scope_for_create
|
97
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
98
|
+
assert_equal({}, relation.scope_for_create)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_create_with_value
|
102
|
+
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
103
|
+
hash = { :hello => 'world' }
|
104
|
+
relation.create_with_value = hash
|
105
|
+
assert_equal hash, relation.scope_for_create
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_create_with_value_with_wheres
|
109
|
+
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
110
|
+
relation.where! relation.table[:id].eq(10)
|
111
|
+
relation.create_with_value = {:hello => 'world'}
|
112
|
+
assert_equal({:hello => 'world', :id => 10}, relation.scope_for_create)
|
113
|
+
end
|
114
|
+
|
115
|
+
# FIXME: is this really wanted or expected behavior?
|
116
|
+
def test_scope_for_create_is_cached
|
117
|
+
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
118
|
+
assert_equal({}, relation.scope_for_create)
|
119
|
+
|
120
|
+
relation.where! relation.table[:id].eq(10)
|
121
|
+
assert_equal({}, relation.scope_for_create)
|
122
|
+
|
123
|
+
relation.create_with_value = {:hello => 'world'}
|
124
|
+
assert_equal({}, relation.scope_for_create)
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_bad_constants_raise_errors
|
128
|
+
assert_raises(NameError) do
|
129
|
+
ActiveRecord::Relation::HelloWorld
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_empty_eager_loading?
|
134
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
135
|
+
assert !relation.eager_loading?
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_eager_load_values
|
139
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
140
|
+
relation.eager_load! :b
|
141
|
+
assert relation.eager_loading?
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_references_values
|
145
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
146
|
+
assert_equal [], relation.references_values
|
147
|
+
relation = relation.references(:foo).references(:omg, :lol)
|
148
|
+
assert_equal ['foo', 'omg', 'lol'], relation.references_values
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_references_values_dont_duplicate
|
152
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
153
|
+
relation = relation.references(:foo).references(:foo)
|
154
|
+
assert_equal ['foo'], relation.references_values
|
155
|
+
end
|
156
|
+
|
157
|
+
test 'merging a hash into a relation' do
|
158
|
+
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
|
159
|
+
relation = relation.merge where: {name: :lol}, readonly: true
|
160
|
+
|
161
|
+
assert_equal({"name"=>:lol}, relation.where_clause.to_h)
|
162
|
+
assert_equal true, relation.readonly_value
|
163
|
+
end
|
164
|
+
|
165
|
+
test 'merging an empty hash into a relation' do
|
166
|
+
assert_equal Relation::WhereClause.empty, Relation.new(FakeKlass, :b, nil).merge({}).where_clause
|
167
|
+
end
|
168
|
+
|
169
|
+
test 'merging a hash with unknown keys raises' do
|
170
|
+
assert_raises(ArgumentError) { Relation::HashMerger.new(nil, omg: 'lol') }
|
171
|
+
end
|
172
|
+
|
173
|
+
test 'merging nil or false raises' do
|
174
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
175
|
+
|
176
|
+
e = assert_raises(ArgumentError) do
|
177
|
+
relation = relation.merge nil
|
178
|
+
end
|
179
|
+
|
180
|
+
assert_equal 'invalid argument: nil.', e.message
|
181
|
+
|
182
|
+
e = assert_raises(ArgumentError) do
|
183
|
+
relation = relation.merge false
|
184
|
+
end
|
185
|
+
|
186
|
+
assert_equal 'invalid argument: false.', e.message
|
187
|
+
end
|
188
|
+
|
189
|
+
test '#values returns a dup of the values' do
|
190
|
+
relation = Relation.new(Post, Post.arel_table, Post.predicate_builder).where!(name: :foo)
|
191
|
+
values = relation.values
|
192
|
+
|
193
|
+
values[:where] = nil
|
194
|
+
assert_not_nil relation.where_clause
|
195
|
+
end
|
196
|
+
|
197
|
+
test 'relations can be created with a values hash' do
|
198
|
+
relation = Relation.new(FakeKlass, :b, nil, select: [:foo])
|
199
|
+
assert_equal [:foo], relation.select_values
|
200
|
+
end
|
201
|
+
|
202
|
+
test 'merging a hash interpolates conditions' do
|
203
|
+
klass = Class.new(FakeKlass) do
|
204
|
+
def self.sanitize_sql(args)
|
205
|
+
raise unless args == ['foo = ?', 'bar']
|
206
|
+
'foo = bar'
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
relation = Relation.new(klass, :b, nil)
|
211
|
+
relation.merge!(where: ['foo = ?', 'bar'])
|
212
|
+
assert_equal Relation::WhereClause.new(['foo = bar'], []), relation.where_clause
|
213
|
+
end
|
214
|
+
|
215
|
+
def test_merging_readonly_false
|
216
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
217
|
+
readonly_false_relation = relation.readonly(false)
|
218
|
+
# test merging in both directions
|
219
|
+
assert_equal false, relation.merge(readonly_false_relation).readonly_value
|
220
|
+
assert_equal false, readonly_false_relation.merge(relation).readonly_value
|
221
|
+
end
|
222
|
+
|
223
|
+
def test_relation_merging_with_merged_joins_as_symbols
|
224
|
+
special_comments_with_ratings = SpecialComment.joins(:ratings)
|
225
|
+
posts_with_special_comments_with_ratings = Post.group("posts.id").joins(:special_comments).merge(special_comments_with_ratings)
|
226
|
+
assert_equal({ 2=>1, 4=>3, 5=>1 }, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count)
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_relation_merging_with_joins_as_join_dependency_pick_proper_parent
|
230
|
+
post = Post.create!(title: "haha", body: "huhu")
|
231
|
+
comment = post.comments.create!(body: "hu")
|
232
|
+
3.times { comment.ratings.create! }
|
233
|
+
|
234
|
+
relation = Post.joins(:comments).merge Comment.joins(:ratings)
|
235
|
+
|
236
|
+
assert_equal 3, relation.where(id: post.id).pluck(:id).size
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_merge_raises_with_invalid_argument
|
240
|
+
assert_raises ArgumentError do
|
241
|
+
relation = Relation.new(FakeKlass, :b, nil)
|
242
|
+
relation.merge(true)
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
def test_respond_to_for_non_selected_element
|
247
|
+
post = Post.select(:title).first
|
248
|
+
assert_equal false, post.respond_to?(:body), "post should not respond_to?(:body) since invoking it raises exception"
|
249
|
+
|
250
|
+
silence_warnings { post = Post.select("'title' as post_title").first }
|
251
|
+
assert_equal false, post.respond_to?(:title), "post should not respond_to?(:body) since invoking it raises exception"
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_select_quotes_when_using_from_clause
|
255
|
+
skip_if_sqlite3_version_includes_quoting_bug
|
256
|
+
quoted_join = ActiveRecord::Base.connection.quote_table_name("join")
|
257
|
+
selected = Post.select(:join).from(Post.select("id as #{quoted_join}")).map(&:join)
|
258
|
+
assert_equal Post.pluck(:id), selected
|
259
|
+
end
|
260
|
+
|
261
|
+
def test_selecting_aliased_attribute_quotes_column_name_when_from_is_used
|
262
|
+
skip_if_sqlite3_version_includes_quoting_bug
|
263
|
+
klass = Class.new(ActiveRecord::Base) do
|
264
|
+
self.table_name = :test_with_keyword_column_name
|
265
|
+
alias_attribute :description, :desc
|
266
|
+
end
|
267
|
+
klass.create!(description: "foo")
|
268
|
+
|
269
|
+
assert_equal ["foo"], klass.select(:description).from(klass.all).map(&:desc)
|
270
|
+
end
|
271
|
+
|
272
|
+
def test_relation_merging_with_merged_joins_as_strings
|
273
|
+
join_string = "LEFT OUTER JOIN #{Rating.quoted_table_name} ON #{SpecialComment.quoted_table_name}.id = #{Rating.quoted_table_name}.comment_id"
|
274
|
+
special_comments_with_ratings = SpecialComment.joins join_string
|
275
|
+
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)
|
277
|
+
end
|
278
|
+
|
279
|
+
class EnsureRoundTripTypeCasting < ActiveRecord::Type::Value
|
280
|
+
def type
|
281
|
+
:string
|
282
|
+
end
|
283
|
+
|
284
|
+
def deserialize(value)
|
285
|
+
raise value unless value == "type cast for database"
|
286
|
+
"type cast from database"
|
287
|
+
end
|
288
|
+
|
289
|
+
def serialize(value)
|
290
|
+
raise value unless value == "value from user"
|
291
|
+
"type cast for database"
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
class UpdateAllTestModel < ActiveRecord::Base
|
296
|
+
self.table_name = 'posts'
|
297
|
+
|
298
|
+
attribute :body, EnsureRoundTripTypeCasting.new
|
299
|
+
end
|
300
|
+
|
301
|
+
def test_update_all_goes_through_normal_type_casting
|
302
|
+
UpdateAllTestModel.update_all(body: "value from user", type: nil) # No STI
|
303
|
+
|
304
|
+
assert_equal "type cast from database", UpdateAllTestModel.first.body
|
305
|
+
end
|
306
|
+
|
307
|
+
private
|
308
|
+
|
309
|
+
def skip_if_sqlite3_version_includes_quoting_bug
|
310
|
+
if sqlite3_version_includes_quoting_bug?
|
311
|
+
skip <<-ERROR.squish
|
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
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
def sqlite3_version_includes_quoting_bug?
|
320
|
+
if current_adapter?(:SQLite3Adapter)
|
321
|
+
selected_quoted_column_names = ActiveRecord::Base.connection.exec_query(
|
322
|
+
'SELECT "join" FROM (SELECT id AS "join" FROM posts) subquery'
|
323
|
+
).columns
|
324
|
+
["join"] != selected_quoted_column_names
|
325
|
+
end
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|