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
@@ -1,182 +1,182 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
|
3
|
-
class ActiveRecord::Relation
|
4
|
-
class WhereClauseTest < ActiveRecord::TestCase
|
5
|
-
test "+ combines two where clauses" do
|
6
|
-
first_clause = WhereClause.new([table["id"].eq(bind_param)], [["id", 1]])
|
7
|
-
second_clause = WhereClause.new([table["name"].eq(bind_param)], [["name", "Sean"]])
|
8
|
-
combined = WhereClause.new(
|
9
|
-
[table["id"].eq(bind_param), table["name"].eq(bind_param)],
|
10
|
-
[["id", 1], ["name", "Sean"]],
|
11
|
-
)
|
12
|
-
|
13
|
-
assert_equal combined, first_clause + second_clause
|
14
|
-
end
|
15
|
-
|
16
|
-
test "+ is associative, but not commutative" do
|
17
|
-
a = WhereClause.new(["a"], ["bind a"])
|
18
|
-
b = WhereClause.new(["b"], ["bind b"])
|
19
|
-
c = WhereClause.new(["c"], ["bind c"])
|
20
|
-
|
21
|
-
assert_equal a + (b + c), (a + b) + c
|
22
|
-
assert_not_equal a + b, b + a
|
23
|
-
end
|
24
|
-
|
25
|
-
test "an empty where clause is the identity value for +" do
|
26
|
-
clause = WhereClause.new([table["id"].eq(bind_param)], [["id", 1]])
|
27
|
-
|
28
|
-
assert_equal clause, clause + WhereClause.empty
|
29
|
-
end
|
30
|
-
|
31
|
-
test "merge combines two where clauses" do
|
32
|
-
a = WhereClause.new([table["id"].eq(1)], [])
|
33
|
-
b = WhereClause.new([table["name"].eq("Sean")], [])
|
34
|
-
expected = WhereClause.new([table["id"].eq(1), table["name"].eq("Sean")], [])
|
35
|
-
|
36
|
-
assert_equal expected, a.merge(b)
|
37
|
-
end
|
38
|
-
|
39
|
-
test "merge keeps the right side, when two equality clauses reference the same column" do
|
40
|
-
a = WhereClause.new([table["id"].eq(1), table["name"].eq("Sean")], [])
|
41
|
-
b = WhereClause.new([table["name"].eq("Jim")], [])
|
42
|
-
expected = WhereClause.new([table["id"].eq(1), table["name"].eq("Jim")], [])
|
43
|
-
|
44
|
-
assert_equal expected, a.merge(b)
|
45
|
-
end
|
46
|
-
|
47
|
-
test "merge removes bind parameters matching overlapping equality clauses" do
|
48
|
-
a = WhereClause.new(
|
49
|
-
[table["id"].eq(bind_param), table["name"].eq(bind_param)],
|
50
|
-
[attribute("id", 1), attribute("name", "Sean")],
|
51
|
-
)
|
52
|
-
b = WhereClause.new(
|
53
|
-
[table["name"].eq(bind_param)],
|
54
|
-
[attribute("name", "Jim")]
|
55
|
-
)
|
56
|
-
expected = WhereClause.new(
|
57
|
-
[table["id"].eq(bind_param), table["name"].eq(bind_param)],
|
58
|
-
[attribute("id", 1), attribute("name", "Jim")],
|
59
|
-
)
|
60
|
-
|
61
|
-
assert_equal expected, a.merge(b)
|
62
|
-
end
|
63
|
-
|
64
|
-
test "merge allows for columns with the same name from different tables" do
|
65
|
-
skip "This is not possible as of 4.2, and the binds do not yet contain sufficient information for this to happen"
|
66
|
-
# We might be able to change the implementation to remove conflicts by index, rather than column name
|
67
|
-
end
|
68
|
-
|
69
|
-
test "a clause knows if it is empty" do
|
70
|
-
assert WhereClause.empty.empty?
|
71
|
-
assert_not WhereClause.new(["anything"], []).empty?
|
72
|
-
end
|
73
|
-
|
74
|
-
test "invert cannot handle nil" do
|
75
|
-
where_clause = WhereClause.new([nil], [])
|
76
|
-
|
77
|
-
assert_raises ArgumentError do
|
78
|
-
where_clause.invert
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
test "invert replaces each part of the predicate with its inverse" do
|
83
|
-
random_object = Object.new
|
84
|
-
original = WhereClause.new([
|
85
|
-
table["id"].in([1, 2, 3]),
|
86
|
-
table["id"].eq(1),
|
87
|
-
"sql literal",
|
88
|
-
random_object
|
89
|
-
], [])
|
90
|
-
expected = WhereClause.new([
|
91
|
-
table["id"].not_in([1, 2, 3]),
|
92
|
-
table["id"].not_eq(1),
|
93
|
-
Arel::Nodes::Not.new(Arel::Nodes::SqlLiteral.new("sql literal")),
|
94
|
-
Arel::Nodes::Not.new(random_object)
|
95
|
-
], [])
|
96
|
-
|
97
|
-
assert_equal expected, original.invert
|
98
|
-
end
|
99
|
-
|
100
|
-
test "accept removes binary predicates referencing a given column" do
|
101
|
-
where_clause = WhereClause.new([
|
102
|
-
table["id"].in([1, 2, 3]),
|
103
|
-
table["name"].eq(bind_param),
|
104
|
-
table["age"].gteq(bind_param),
|
105
|
-
], [
|
106
|
-
attribute("name", "Sean"),
|
107
|
-
attribute("age", 30),
|
108
|
-
])
|
109
|
-
expected = WhereClause.new([table["age"].gteq(bind_param)], [attribute("age", 30)])
|
110
|
-
|
111
|
-
assert_equal expected, where_clause.except("id", "name")
|
112
|
-
end
|
113
|
-
|
114
|
-
test "ast groups its predicates with AND" do
|
115
|
-
predicates = [
|
116
|
-
table["id"].in([1, 2, 3]),
|
117
|
-
table["name"].eq(bind_param),
|
118
|
-
]
|
119
|
-
where_clause = WhereClause.new(predicates, [])
|
120
|
-
expected = Arel::Nodes::And.new(predicates)
|
121
|
-
|
122
|
-
assert_equal expected, where_clause.ast
|
123
|
-
end
|
124
|
-
|
125
|
-
test "ast wraps any SQL literals in parenthesis" do
|
126
|
-
random_object = Object.new
|
127
|
-
where_clause = WhereClause.new([
|
128
|
-
table["id"].in([1, 2, 3]),
|
129
|
-
"foo = bar",
|
130
|
-
random_object,
|
131
|
-
], [])
|
132
|
-
expected = Arel::Nodes::And.new([
|
133
|
-
table["id"].in([1, 2, 3]),
|
134
|
-
Arel::Nodes::Grouping.new(Arel.sql("foo = bar")),
|
135
|
-
Arel::Nodes::Grouping.new(random_object),
|
136
|
-
])
|
137
|
-
|
138
|
-
assert_equal expected, where_clause.ast
|
139
|
-
end
|
140
|
-
|
141
|
-
test "ast removes any empty strings" do
|
142
|
-
where_clause = WhereClause.new([table["id"].in([1, 2, 3])], [])
|
143
|
-
where_clause_with_empty = WhereClause.new([table["id"].in([1, 2, 3]), ''], [])
|
144
|
-
|
145
|
-
assert_equal where_clause.ast, where_clause_with_empty.ast
|
146
|
-
end
|
147
|
-
|
148
|
-
test "or joins the two clauses using OR" do
|
149
|
-
where_clause = WhereClause.new([table["id"].eq(bind_param)], [attribute("id", 1)])
|
150
|
-
other_clause = WhereClause.new([table["name"].eq(bind_param)], [attribute("name", "Sean")])
|
151
|
-
expected_ast =
|
152
|
-
Arel::Nodes::Grouping.new(
|
153
|
-
Arel::Nodes::Or.new(table["id"].eq(bind_param), table["name"].eq(bind_param))
|
154
|
-
)
|
155
|
-
expected_binds = where_clause.binds + other_clause.binds
|
156
|
-
|
157
|
-
assert_equal expected_ast.to_sql, where_clause.or(other_clause).ast.to_sql
|
158
|
-
assert_equal expected_binds, where_clause.or(other_clause).binds
|
159
|
-
end
|
160
|
-
|
161
|
-
test "or returns an empty where clause when either side is empty" do
|
162
|
-
where_clause = WhereClause.new([table["id"].eq(bind_param)], [attribute("id", 1)])
|
163
|
-
|
164
|
-
assert_equal WhereClause.empty, where_clause.or(WhereClause.empty)
|
165
|
-
assert_equal WhereClause.empty, WhereClause.empty.or(where_clause)
|
166
|
-
end
|
167
|
-
|
168
|
-
private
|
169
|
-
|
170
|
-
def table
|
171
|
-
Arel::Table.new("table")
|
172
|
-
end
|
173
|
-
|
174
|
-
def bind_param
|
175
|
-
Arel::Nodes::BindParam.new
|
176
|
-
end
|
177
|
-
|
178
|
-
def attribute(name, value)
|
179
|
-
ActiveRecord::Attribute.with_cast_value(name, value, ActiveRecord::Type::Value.new)
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
class ActiveRecord::Relation
|
4
|
+
class WhereClauseTest < ActiveRecord::TestCase
|
5
|
+
test "+ combines two where clauses" do
|
6
|
+
first_clause = WhereClause.new([table["id"].eq(bind_param)], [["id", 1]])
|
7
|
+
second_clause = WhereClause.new([table["name"].eq(bind_param)], [["name", "Sean"]])
|
8
|
+
combined = WhereClause.new(
|
9
|
+
[table["id"].eq(bind_param), table["name"].eq(bind_param)],
|
10
|
+
[["id", 1], ["name", "Sean"]],
|
11
|
+
)
|
12
|
+
|
13
|
+
assert_equal combined, first_clause + second_clause
|
14
|
+
end
|
15
|
+
|
16
|
+
test "+ is associative, but not commutative" do
|
17
|
+
a = WhereClause.new(["a"], ["bind a"])
|
18
|
+
b = WhereClause.new(["b"], ["bind b"])
|
19
|
+
c = WhereClause.new(["c"], ["bind c"])
|
20
|
+
|
21
|
+
assert_equal a + (b + c), (a + b) + c
|
22
|
+
assert_not_equal a + b, b + a
|
23
|
+
end
|
24
|
+
|
25
|
+
test "an empty where clause is the identity value for +" do
|
26
|
+
clause = WhereClause.new([table["id"].eq(bind_param)], [["id", 1]])
|
27
|
+
|
28
|
+
assert_equal clause, clause + WhereClause.empty
|
29
|
+
end
|
30
|
+
|
31
|
+
test "merge combines two where clauses" do
|
32
|
+
a = WhereClause.new([table["id"].eq(1)], [])
|
33
|
+
b = WhereClause.new([table["name"].eq("Sean")], [])
|
34
|
+
expected = WhereClause.new([table["id"].eq(1), table["name"].eq("Sean")], [])
|
35
|
+
|
36
|
+
assert_equal expected, a.merge(b)
|
37
|
+
end
|
38
|
+
|
39
|
+
test "merge keeps the right side, when two equality clauses reference the same column" do
|
40
|
+
a = WhereClause.new([table["id"].eq(1), table["name"].eq("Sean")], [])
|
41
|
+
b = WhereClause.new([table["name"].eq("Jim")], [])
|
42
|
+
expected = WhereClause.new([table["id"].eq(1), table["name"].eq("Jim")], [])
|
43
|
+
|
44
|
+
assert_equal expected, a.merge(b)
|
45
|
+
end
|
46
|
+
|
47
|
+
test "merge removes bind parameters matching overlapping equality clauses" do
|
48
|
+
a = WhereClause.new(
|
49
|
+
[table["id"].eq(bind_param), table["name"].eq(bind_param)],
|
50
|
+
[attribute("id", 1), attribute("name", "Sean")],
|
51
|
+
)
|
52
|
+
b = WhereClause.new(
|
53
|
+
[table["name"].eq(bind_param)],
|
54
|
+
[attribute("name", "Jim")]
|
55
|
+
)
|
56
|
+
expected = WhereClause.new(
|
57
|
+
[table["id"].eq(bind_param), table["name"].eq(bind_param)],
|
58
|
+
[attribute("id", 1), attribute("name", "Jim")],
|
59
|
+
)
|
60
|
+
|
61
|
+
assert_equal expected, a.merge(b)
|
62
|
+
end
|
63
|
+
|
64
|
+
test "merge allows for columns with the same name from different tables" do
|
65
|
+
skip "This is not possible as of 4.2, and the binds do not yet contain sufficient information for this to happen"
|
66
|
+
# We might be able to change the implementation to remove conflicts by index, rather than column name
|
67
|
+
end
|
68
|
+
|
69
|
+
test "a clause knows if it is empty" do
|
70
|
+
assert WhereClause.empty.empty?
|
71
|
+
assert_not WhereClause.new(["anything"], []).empty?
|
72
|
+
end
|
73
|
+
|
74
|
+
test "invert cannot handle nil" do
|
75
|
+
where_clause = WhereClause.new([nil], [])
|
76
|
+
|
77
|
+
assert_raises ArgumentError do
|
78
|
+
where_clause.invert
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
test "invert replaces each part of the predicate with its inverse" do
|
83
|
+
random_object = Object.new
|
84
|
+
original = WhereClause.new([
|
85
|
+
table["id"].in([1, 2, 3]),
|
86
|
+
table["id"].eq(1),
|
87
|
+
"sql literal",
|
88
|
+
random_object
|
89
|
+
], [])
|
90
|
+
expected = WhereClause.new([
|
91
|
+
table["id"].not_in([1, 2, 3]),
|
92
|
+
table["id"].not_eq(1),
|
93
|
+
Arel::Nodes::Not.new(Arel::Nodes::SqlLiteral.new("sql literal")),
|
94
|
+
Arel::Nodes::Not.new(random_object)
|
95
|
+
], [])
|
96
|
+
|
97
|
+
assert_equal expected, original.invert
|
98
|
+
end
|
99
|
+
|
100
|
+
test "accept removes binary predicates referencing a given column" do
|
101
|
+
where_clause = WhereClause.new([
|
102
|
+
table["id"].in([1, 2, 3]),
|
103
|
+
table["name"].eq(bind_param),
|
104
|
+
table["age"].gteq(bind_param),
|
105
|
+
], [
|
106
|
+
attribute("name", "Sean"),
|
107
|
+
attribute("age", 30),
|
108
|
+
])
|
109
|
+
expected = WhereClause.new([table["age"].gteq(bind_param)], [attribute("age", 30)])
|
110
|
+
|
111
|
+
assert_equal expected, where_clause.except("id", "name")
|
112
|
+
end
|
113
|
+
|
114
|
+
test "ast groups its predicates with AND" do
|
115
|
+
predicates = [
|
116
|
+
table["id"].in([1, 2, 3]),
|
117
|
+
table["name"].eq(bind_param),
|
118
|
+
]
|
119
|
+
where_clause = WhereClause.new(predicates, [])
|
120
|
+
expected = Arel::Nodes::And.new(predicates)
|
121
|
+
|
122
|
+
assert_equal expected, where_clause.ast
|
123
|
+
end
|
124
|
+
|
125
|
+
test "ast wraps any SQL literals in parenthesis" do
|
126
|
+
random_object = Object.new
|
127
|
+
where_clause = WhereClause.new([
|
128
|
+
table["id"].in([1, 2, 3]),
|
129
|
+
"foo = bar",
|
130
|
+
random_object,
|
131
|
+
], [])
|
132
|
+
expected = Arel::Nodes::And.new([
|
133
|
+
table["id"].in([1, 2, 3]),
|
134
|
+
Arel::Nodes::Grouping.new(Arel.sql("foo = bar")),
|
135
|
+
Arel::Nodes::Grouping.new(random_object),
|
136
|
+
])
|
137
|
+
|
138
|
+
assert_equal expected, where_clause.ast
|
139
|
+
end
|
140
|
+
|
141
|
+
test "ast removes any empty strings" do
|
142
|
+
where_clause = WhereClause.new([table["id"].in([1, 2, 3])], [])
|
143
|
+
where_clause_with_empty = WhereClause.new([table["id"].in([1, 2, 3]), ''], [])
|
144
|
+
|
145
|
+
assert_equal where_clause.ast, where_clause_with_empty.ast
|
146
|
+
end
|
147
|
+
|
148
|
+
test "or joins the two clauses using OR" do
|
149
|
+
where_clause = WhereClause.new([table["id"].eq(bind_param)], [attribute("id", 1)])
|
150
|
+
other_clause = WhereClause.new([table["name"].eq(bind_param)], [attribute("name", "Sean")])
|
151
|
+
expected_ast =
|
152
|
+
Arel::Nodes::Grouping.new(
|
153
|
+
Arel::Nodes::Or.new(table["id"].eq(bind_param), table["name"].eq(bind_param))
|
154
|
+
)
|
155
|
+
expected_binds = where_clause.binds + other_clause.binds
|
156
|
+
|
157
|
+
assert_equal expected_ast.to_sql, where_clause.or(other_clause).ast.to_sql
|
158
|
+
assert_equal expected_binds, where_clause.or(other_clause).binds
|
159
|
+
end
|
160
|
+
|
161
|
+
test "or returns an empty where clause when either side is empty" do
|
162
|
+
where_clause = WhereClause.new([table["id"].eq(bind_param)], [attribute("id", 1)])
|
163
|
+
|
164
|
+
assert_equal WhereClause.empty, where_clause.or(WhereClause.empty)
|
165
|
+
assert_equal WhereClause.empty, WhereClause.empty.or(where_clause)
|
166
|
+
end
|
167
|
+
|
168
|
+
private
|
169
|
+
|
170
|
+
def table
|
171
|
+
Arel::Table.new("table")
|
172
|
+
end
|
173
|
+
|
174
|
+
def bind_param
|
175
|
+
Arel::Nodes::BindParam.new
|
176
|
+
end
|
177
|
+
|
178
|
+
def attribute(name, value)
|
179
|
+
ActiveRecord::Attribute.with_cast_value(name, value, ActiveRecord::Type::Value.new)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
@@ -1,322 +1,322 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require "models/author"
|
3
|
-
require "models/binary"
|
4
|
-
require "models/cake_designer"
|
5
|
-
require "models/car"
|
6
|
-
require "models/chef"
|
7
|
-
require "models/comment"
|
8
|
-
require "models/edge"
|
9
|
-
require "models/essay"
|
10
|
-
require "models/post"
|
11
|
-
require "models/price_estimate"
|
12
|
-
require "models/topic"
|
13
|
-
require "models/treasure"
|
14
|
-
require "models/vertex"
|
15
|
-
|
16
|
-
module ActiveRecord
|
17
|
-
class WhereTest < ActiveRecord::TestCase
|
18
|
-
fixtures :posts, :edges, :authors, :binaries, :essays, :cars, :treasures, :price_estimates
|
19
|
-
|
20
|
-
def test_where_copies_bind_params
|
21
|
-
author = authors(:david)
|
22
|
-
posts = author.posts.where('posts.id != 1')
|
23
|
-
joined = Post.where(id: posts)
|
24
|
-
|
25
|
-
assert_operator joined.length, :>, 0
|
26
|
-
|
27
|
-
joined.each { |post|
|
28
|
-
assert_equal author, post.author
|
29
|
-
assert_not_equal 1, post.id
|
30
|
-
}
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_where_copies_bind_params_in_the_right_order
|
34
|
-
author = authors(:david)
|
35
|
-
posts = author.posts.where.not(id: 1)
|
36
|
-
joined = Post.where(id: posts, title: posts.first.title)
|
37
|
-
|
38
|
-
assert_equal joined, [posts.first]
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_where_copies_arel_bind_params
|
42
|
-
chef = Chef.create!
|
43
|
-
CakeDesigner.create!(chef: chef)
|
44
|
-
|
45
|
-
cake_designers = CakeDesigner.joins(:chef).where(chefs: { id: chef.id })
|
46
|
-
chefs = Chef.where(employable: cake_designers)
|
47
|
-
|
48
|
-
assert_equal [chef], chefs.to_a
|
49
|
-
end
|
50
|
-
|
51
|
-
def test_rewhere_on_root
|
52
|
-
assert_equal posts(:welcome), Post.rewhere(title: 'Welcome to the weblog').first
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_belongs_to_shallow_where
|
56
|
-
author = Author.new
|
57
|
-
author.id = 1
|
58
|
-
|
59
|
-
assert_equal Post.where(author_id: 1).to_sql, Post.where(author: author).to_sql
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_belongs_to_nil_where
|
63
|
-
assert_equal Post.where(author_id: nil).to_sql, Post.where(author: nil).to_sql
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_belongs_to_array_value_where
|
67
|
-
assert_equal Post.where(author_id: [1,2]).to_sql, Post.where(author: [1,2]).to_sql
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_belongs_to_nested_relation_where
|
71
|
-
expected = Post.where(author_id: Author.where(id: [1,2])).to_sql
|
72
|
-
actual = Post.where(author: Author.where(id: [1,2])).to_sql
|
73
|
-
|
74
|
-
assert_equal expected, actual
|
75
|
-
end
|
76
|
-
|
77
|
-
def test_belongs_to_nested_where
|
78
|
-
parent = Comment.new
|
79
|
-
parent.id = 1
|
80
|
-
|
81
|
-
expected = Post.where(comments: { parent_id: 1 }).joins(:comments)
|
82
|
-
actual = Post.where(comments: { parent: parent }).joins(:comments)
|
83
|
-
|
84
|
-
assert_equal expected.to_sql, actual.to_sql
|
85
|
-
end
|
86
|
-
|
87
|
-
def test_belongs_to_nested_where_with_relation
|
88
|
-
author = authors(:david)
|
89
|
-
|
90
|
-
expected = Author.where(id: author ).joins(:posts)
|
91
|
-
actual = Author.where(posts: { author_id: Author.where(id: author.id) }).joins(:posts)
|
92
|
-
|
93
|
-
assert_equal expected.to_a, actual.to_a
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_polymorphic_shallow_where
|
97
|
-
treasure = Treasure.new
|
98
|
-
treasure.id = 1
|
99
|
-
|
100
|
-
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
|
101
|
-
actual = PriceEstimate.where(estimate_of: treasure)
|
102
|
-
|
103
|
-
assert_equal expected.to_sql, actual.to_sql
|
104
|
-
end
|
105
|
-
|
106
|
-
def test_polymorphic_nested_array_where
|
107
|
-
treasure = Treasure.new
|
108
|
-
treasure.id = 1
|
109
|
-
hidden = HiddenTreasure.new
|
110
|
-
hidden.id = 2
|
111
|
-
|
112
|
-
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: [treasure, hidden])
|
113
|
-
actual = PriceEstimate.where(estimate_of: [treasure, hidden])
|
114
|
-
|
115
|
-
assert_equal expected.to_sql, actual.to_sql
|
116
|
-
end
|
117
|
-
|
118
|
-
def test_polymorphic_array_where_multiple_types
|
119
|
-
treasure_1 = treasures(:diamond)
|
120
|
-
treasure_2 = treasures(:sapphire)
|
121
|
-
car = cars(:honda)
|
122
|
-
|
123
|
-
expected = [price_estimates(:diamond), price_estimates(:sapphire_1), price_estimates(:sapphire_2), price_estimates(:honda)].sort
|
124
|
-
actual = PriceEstimate.where(estimate_of: [treasure_1, treasure_2, car]).to_a.sort
|
125
|
-
|
126
|
-
assert_equal expected, actual
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_polymorphic_nested_relation_where
|
130
|
-
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: Treasure.where(id: [1,2]))
|
131
|
-
actual = PriceEstimate.where(estimate_of: Treasure.where(id: [1,2]))
|
132
|
-
|
133
|
-
assert_equal expected.to_sql, actual.to_sql
|
134
|
-
end
|
135
|
-
|
136
|
-
def test_polymorphic_sti_shallow_where
|
137
|
-
treasure = HiddenTreasure.new
|
138
|
-
treasure.id = 1
|
139
|
-
|
140
|
-
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
|
141
|
-
actual = PriceEstimate.where(estimate_of: treasure)
|
142
|
-
|
143
|
-
assert_equal expected.to_sql, actual.to_sql
|
144
|
-
end
|
145
|
-
|
146
|
-
def test_polymorphic_nested_where
|
147
|
-
thing = Post.new
|
148
|
-
thing.id = 1
|
149
|
-
|
150
|
-
expected = Treasure.where(price_estimates: { thing_type: 'Post', thing_id: 1 }).joins(:price_estimates)
|
151
|
-
actual = Treasure.where(price_estimates: { thing: thing }).joins(:price_estimates)
|
152
|
-
|
153
|
-
assert_equal expected.to_sql, actual.to_sql
|
154
|
-
end
|
155
|
-
|
156
|
-
def test_polymorphic_sti_nested_where
|
157
|
-
treasure = HiddenTreasure.new
|
158
|
-
treasure.id = 1
|
159
|
-
|
160
|
-
expected = Treasure.where(price_estimates: { estimate_of_type: 'Treasure', estimate_of_id: 1 }).joins(:price_estimates)
|
161
|
-
actual = Treasure.where(price_estimates: { estimate_of: treasure }).joins(:price_estimates)
|
162
|
-
|
163
|
-
assert_equal expected.to_sql, actual.to_sql
|
164
|
-
end
|
165
|
-
|
166
|
-
def test_decorated_polymorphic_where
|
167
|
-
treasure_decorator = Struct.new(:model) do
|
168
|
-
def self.method_missing(method, *args, &block)
|
169
|
-
Treasure.send(method, *args, &block)
|
170
|
-
end
|
171
|
-
|
172
|
-
def is_a?(klass)
|
173
|
-
model.is_a?(klass)
|
174
|
-
end
|
175
|
-
|
176
|
-
def method_missing(method, *args, &block)
|
177
|
-
model.send(method, *args, &block)
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
treasure = Treasure.new
|
182
|
-
treasure.id = 1
|
183
|
-
decorated_treasure = treasure_decorator.new(treasure)
|
184
|
-
|
185
|
-
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
|
186
|
-
actual = PriceEstimate.where(estimate_of: decorated_treasure)
|
187
|
-
|
188
|
-
assert_equal expected.to_sql, actual.to_sql
|
189
|
-
end
|
190
|
-
|
191
|
-
def test_aliased_attribute
|
192
|
-
expected = Topic.where(heading: 'The First Topic')
|
193
|
-
actual = Topic.where(title: 'The First Topic')
|
194
|
-
|
195
|
-
assert_equal expected.to_sql, actual.to_sql
|
196
|
-
end
|
197
|
-
|
198
|
-
def test_where_error
|
199
|
-
assert_raises(ActiveRecord::StatementInvalid) do
|
200
|
-
Post.where(:id => { 'posts.author_id' => 10 }).first
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
def test_where_with_table_name
|
205
|
-
post = Post.first
|
206
|
-
assert_equal post, Post.where(:posts => { 'id' => post.id }).first
|
207
|
-
end
|
208
|
-
|
209
|
-
def test_where_with_table_name_and_empty_hash
|
210
|
-
assert_equal 0, Post.where(:posts => {}).count
|
211
|
-
end
|
212
|
-
|
213
|
-
def test_where_with_table_name_and_empty_array
|
214
|
-
assert_equal 0, Post.where(:id => []).count
|
215
|
-
end
|
216
|
-
|
217
|
-
def test_where_with_empty_hash_and_no_foreign_key
|
218
|
-
assert_equal 0, Edge.where(:sink => {}).count
|
219
|
-
end
|
220
|
-
|
221
|
-
def test_where_with_blank_conditions
|
222
|
-
[[], {}, nil, ""].each do |blank|
|
223
|
-
assert_equal 4, Edge.where(blank).order("sink_id").to_a.size
|
224
|
-
end
|
225
|
-
end
|
226
|
-
|
227
|
-
def test_where_with_integer_for_string_column
|
228
|
-
count = Post.where(:title => 0).count
|
229
|
-
assert_equal 0, count
|
230
|
-
end
|
231
|
-
|
232
|
-
def test_where_with_float_for_string_column
|
233
|
-
count = Post.where(:title => 0.0).count
|
234
|
-
assert_equal 0, count
|
235
|
-
end
|
236
|
-
|
237
|
-
def test_where_with_boolean_for_string_column
|
238
|
-
count = Post.where(:title => false).count
|
239
|
-
assert_equal 0, count
|
240
|
-
end
|
241
|
-
|
242
|
-
def test_where_with_decimal_for_string_column
|
243
|
-
count = Post.where(:title => BigDecimal.new(0)).count
|
244
|
-
assert_equal 0, count
|
245
|
-
end
|
246
|
-
|
247
|
-
def test_where_with_duration_for_string_column
|
248
|
-
count = Post.where(:title => 0.seconds).count
|
249
|
-
assert_equal 0, count
|
250
|
-
end
|
251
|
-
|
252
|
-
def test_where_with_integer_for_binary_column
|
253
|
-
count = Binary.where(:data => 0).count
|
254
|
-
assert_equal 0, count
|
255
|
-
end
|
256
|
-
|
257
|
-
def test_where_on_association_with_custom_primary_key
|
258
|
-
author = authors(:david)
|
259
|
-
essay = Essay.where(writer: author).first
|
260
|
-
|
261
|
-
assert_equal essays(:david_modest_proposal), essay
|
262
|
-
end
|
263
|
-
|
264
|
-
def test_where_on_association_with_custom_primary_key_with_relation
|
265
|
-
author = authors(:david)
|
266
|
-
essay = Essay.where(writer: Author.where(id: author.id)).first
|
267
|
-
|
268
|
-
assert_equal essays(:david_modest_proposal), essay
|
269
|
-
end
|
270
|
-
|
271
|
-
def test_where_on_association_with_relation_performs_subselect_not_two_queries
|
272
|
-
author = authors(:david)
|
273
|
-
|
274
|
-
assert_queries(1) do
|
275
|
-
Essay.where(writer: Author.where(id: author.id)).to_a
|
276
|
-
end
|
277
|
-
end
|
278
|
-
|
279
|
-
def test_where_on_association_with_custom_primary_key_with_array_of_base
|
280
|
-
author = authors(:david)
|
281
|
-
essay = Essay.where(writer: [author]).first
|
282
|
-
|
283
|
-
assert_equal essays(:david_modest_proposal), essay
|
284
|
-
end
|
285
|
-
|
286
|
-
def test_where_on_association_with_custom_primary_key_with_array_of_ids
|
287
|
-
essay = Essay.where(writer: ["David"]).first
|
288
|
-
|
289
|
-
assert_equal essays(:david_modest_proposal), essay
|
290
|
-
end
|
291
|
-
|
292
|
-
def test_where_with_strong_parameters
|
293
|
-
protected_params = Class.new do
|
294
|
-
attr_reader :permitted
|
295
|
-
alias :permitted? :permitted
|
296
|
-
|
297
|
-
def initialize(parameters)
|
298
|
-
@parameters = parameters
|
299
|
-
@permitted = false
|
300
|
-
end
|
301
|
-
|
302
|
-
def to_h
|
303
|
-
@parameters
|
304
|
-
end
|
305
|
-
|
306
|
-
def permit!
|
307
|
-
@permitted = true
|
308
|
-
self
|
309
|
-
end
|
310
|
-
end
|
311
|
-
|
312
|
-
author = authors(:david)
|
313
|
-
params = protected_params.new(name: author.name)
|
314
|
-
assert_raises(ActiveModel::ForbiddenAttributesError) { Author.where(params) }
|
315
|
-
assert_equal author, Author.where(params.permit!).first
|
316
|
-
end
|
317
|
-
|
318
|
-
def test_where_with_unsupported_arguments
|
319
|
-
assert_raises(ArgumentError) { Author.where(42) }
|
320
|
-
end
|
321
|
-
end
|
322
|
-
end
|
1
|
+
require "cases/helper"
|
2
|
+
require "models/author"
|
3
|
+
require "models/binary"
|
4
|
+
require "models/cake_designer"
|
5
|
+
require "models/car"
|
6
|
+
require "models/chef"
|
7
|
+
require "models/comment"
|
8
|
+
require "models/edge"
|
9
|
+
require "models/essay"
|
10
|
+
require "models/post"
|
11
|
+
require "models/price_estimate"
|
12
|
+
require "models/topic"
|
13
|
+
require "models/treasure"
|
14
|
+
require "models/vertex"
|
15
|
+
|
16
|
+
module ActiveRecord
|
17
|
+
class WhereTest < ActiveRecord::TestCase
|
18
|
+
fixtures :posts, :edges, :authors, :binaries, :essays, :cars, :treasures, :price_estimates
|
19
|
+
|
20
|
+
def test_where_copies_bind_params
|
21
|
+
author = authors(:david)
|
22
|
+
posts = author.posts.where('posts.id != 1')
|
23
|
+
joined = Post.where(id: posts)
|
24
|
+
|
25
|
+
assert_operator joined.length, :>, 0
|
26
|
+
|
27
|
+
joined.each { |post|
|
28
|
+
assert_equal author, post.author
|
29
|
+
assert_not_equal 1, post.id
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_where_copies_bind_params_in_the_right_order
|
34
|
+
author = authors(:david)
|
35
|
+
posts = author.posts.where.not(id: 1)
|
36
|
+
joined = Post.where(id: posts, title: posts.first.title)
|
37
|
+
|
38
|
+
assert_equal joined, [posts.first]
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_where_copies_arel_bind_params
|
42
|
+
chef = Chef.create!
|
43
|
+
CakeDesigner.create!(chef: chef)
|
44
|
+
|
45
|
+
cake_designers = CakeDesigner.joins(:chef).where(chefs: { id: chef.id })
|
46
|
+
chefs = Chef.where(employable: cake_designers)
|
47
|
+
|
48
|
+
assert_equal [chef], chefs.to_a
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_rewhere_on_root
|
52
|
+
assert_equal posts(:welcome), Post.rewhere(title: 'Welcome to the weblog').first
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_belongs_to_shallow_where
|
56
|
+
author = Author.new
|
57
|
+
author.id = 1
|
58
|
+
|
59
|
+
assert_equal Post.where(author_id: 1).to_sql, Post.where(author: author).to_sql
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_belongs_to_nil_where
|
63
|
+
assert_equal Post.where(author_id: nil).to_sql, Post.where(author: nil).to_sql
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_belongs_to_array_value_where
|
67
|
+
assert_equal Post.where(author_id: [1,2]).to_sql, Post.where(author: [1,2]).to_sql
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_belongs_to_nested_relation_where
|
71
|
+
expected = Post.where(author_id: Author.where(id: [1,2])).to_sql
|
72
|
+
actual = Post.where(author: Author.where(id: [1,2])).to_sql
|
73
|
+
|
74
|
+
assert_equal expected, actual
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_belongs_to_nested_where
|
78
|
+
parent = Comment.new
|
79
|
+
parent.id = 1
|
80
|
+
|
81
|
+
expected = Post.where(comments: { parent_id: 1 }).joins(:comments)
|
82
|
+
actual = Post.where(comments: { parent: parent }).joins(:comments)
|
83
|
+
|
84
|
+
assert_equal expected.to_sql, actual.to_sql
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_belongs_to_nested_where_with_relation
|
88
|
+
author = authors(:david)
|
89
|
+
|
90
|
+
expected = Author.where(id: author ).joins(:posts)
|
91
|
+
actual = Author.where(posts: { author_id: Author.where(id: author.id) }).joins(:posts)
|
92
|
+
|
93
|
+
assert_equal expected.to_a, actual.to_a
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_polymorphic_shallow_where
|
97
|
+
treasure = Treasure.new
|
98
|
+
treasure.id = 1
|
99
|
+
|
100
|
+
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
|
101
|
+
actual = PriceEstimate.where(estimate_of: treasure)
|
102
|
+
|
103
|
+
assert_equal expected.to_sql, actual.to_sql
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_polymorphic_nested_array_where
|
107
|
+
treasure = Treasure.new
|
108
|
+
treasure.id = 1
|
109
|
+
hidden = HiddenTreasure.new
|
110
|
+
hidden.id = 2
|
111
|
+
|
112
|
+
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: [treasure, hidden])
|
113
|
+
actual = PriceEstimate.where(estimate_of: [treasure, hidden])
|
114
|
+
|
115
|
+
assert_equal expected.to_sql, actual.to_sql
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_polymorphic_array_where_multiple_types
|
119
|
+
treasure_1 = treasures(:diamond)
|
120
|
+
treasure_2 = treasures(:sapphire)
|
121
|
+
car = cars(:honda)
|
122
|
+
|
123
|
+
expected = [price_estimates(:diamond), price_estimates(:sapphire_1), price_estimates(:sapphire_2), price_estimates(:honda)].sort
|
124
|
+
actual = PriceEstimate.where(estimate_of: [treasure_1, treasure_2, car]).to_a.sort
|
125
|
+
|
126
|
+
assert_equal expected, actual
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_polymorphic_nested_relation_where
|
130
|
+
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: Treasure.where(id: [1,2]))
|
131
|
+
actual = PriceEstimate.where(estimate_of: Treasure.where(id: [1,2]))
|
132
|
+
|
133
|
+
assert_equal expected.to_sql, actual.to_sql
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_polymorphic_sti_shallow_where
|
137
|
+
treasure = HiddenTreasure.new
|
138
|
+
treasure.id = 1
|
139
|
+
|
140
|
+
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
|
141
|
+
actual = PriceEstimate.where(estimate_of: treasure)
|
142
|
+
|
143
|
+
assert_equal expected.to_sql, actual.to_sql
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_polymorphic_nested_where
|
147
|
+
thing = Post.new
|
148
|
+
thing.id = 1
|
149
|
+
|
150
|
+
expected = Treasure.where(price_estimates: { thing_type: 'Post', thing_id: 1 }).joins(:price_estimates)
|
151
|
+
actual = Treasure.where(price_estimates: { thing: thing }).joins(:price_estimates)
|
152
|
+
|
153
|
+
assert_equal expected.to_sql, actual.to_sql
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_polymorphic_sti_nested_where
|
157
|
+
treasure = HiddenTreasure.new
|
158
|
+
treasure.id = 1
|
159
|
+
|
160
|
+
expected = Treasure.where(price_estimates: { estimate_of_type: 'Treasure', estimate_of_id: 1 }).joins(:price_estimates)
|
161
|
+
actual = Treasure.where(price_estimates: { estimate_of: treasure }).joins(:price_estimates)
|
162
|
+
|
163
|
+
assert_equal expected.to_sql, actual.to_sql
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_decorated_polymorphic_where
|
167
|
+
treasure_decorator = Struct.new(:model) do
|
168
|
+
def self.method_missing(method, *args, &block)
|
169
|
+
Treasure.send(method, *args, &block)
|
170
|
+
end
|
171
|
+
|
172
|
+
def is_a?(klass)
|
173
|
+
model.is_a?(klass)
|
174
|
+
end
|
175
|
+
|
176
|
+
def method_missing(method, *args, &block)
|
177
|
+
model.send(method, *args, &block)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
treasure = Treasure.new
|
182
|
+
treasure.id = 1
|
183
|
+
decorated_treasure = treasure_decorator.new(treasure)
|
184
|
+
|
185
|
+
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
|
186
|
+
actual = PriceEstimate.where(estimate_of: decorated_treasure)
|
187
|
+
|
188
|
+
assert_equal expected.to_sql, actual.to_sql
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_aliased_attribute
|
192
|
+
expected = Topic.where(heading: 'The First Topic')
|
193
|
+
actual = Topic.where(title: 'The First Topic')
|
194
|
+
|
195
|
+
assert_equal expected.to_sql, actual.to_sql
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_where_error
|
199
|
+
assert_raises(ActiveRecord::StatementInvalid) do
|
200
|
+
Post.where(:id => { 'posts.author_id' => 10 }).first
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_where_with_table_name
|
205
|
+
post = Post.first
|
206
|
+
assert_equal post, Post.where(:posts => { 'id' => post.id }).first
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_where_with_table_name_and_empty_hash
|
210
|
+
assert_equal 0, Post.where(:posts => {}).count
|
211
|
+
end
|
212
|
+
|
213
|
+
def test_where_with_table_name_and_empty_array
|
214
|
+
assert_equal 0, Post.where(:id => []).count
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_where_with_empty_hash_and_no_foreign_key
|
218
|
+
assert_equal 0, Edge.where(:sink => {}).count
|
219
|
+
end
|
220
|
+
|
221
|
+
def test_where_with_blank_conditions
|
222
|
+
[[], {}, nil, ""].each do |blank|
|
223
|
+
assert_equal 4, Edge.where(blank).order("sink_id").to_a.size
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_where_with_integer_for_string_column
|
228
|
+
count = Post.where(:title => 0).count
|
229
|
+
assert_equal 0, count
|
230
|
+
end
|
231
|
+
|
232
|
+
def test_where_with_float_for_string_column
|
233
|
+
count = Post.where(:title => 0.0).count
|
234
|
+
assert_equal 0, count
|
235
|
+
end
|
236
|
+
|
237
|
+
def test_where_with_boolean_for_string_column
|
238
|
+
count = Post.where(:title => false).count
|
239
|
+
assert_equal 0, count
|
240
|
+
end
|
241
|
+
|
242
|
+
def test_where_with_decimal_for_string_column
|
243
|
+
count = Post.where(:title => BigDecimal.new(0)).count
|
244
|
+
assert_equal 0, count
|
245
|
+
end
|
246
|
+
|
247
|
+
def test_where_with_duration_for_string_column
|
248
|
+
count = Post.where(:title => 0.seconds).count
|
249
|
+
assert_equal 0, count
|
250
|
+
end
|
251
|
+
|
252
|
+
def test_where_with_integer_for_binary_column
|
253
|
+
count = Binary.where(:data => 0).count
|
254
|
+
assert_equal 0, count
|
255
|
+
end
|
256
|
+
|
257
|
+
def test_where_on_association_with_custom_primary_key
|
258
|
+
author = authors(:david)
|
259
|
+
essay = Essay.where(writer: author).first
|
260
|
+
|
261
|
+
assert_equal essays(:david_modest_proposal), essay
|
262
|
+
end
|
263
|
+
|
264
|
+
def test_where_on_association_with_custom_primary_key_with_relation
|
265
|
+
author = authors(:david)
|
266
|
+
essay = Essay.where(writer: Author.where(id: author.id)).first
|
267
|
+
|
268
|
+
assert_equal essays(:david_modest_proposal), essay
|
269
|
+
end
|
270
|
+
|
271
|
+
def test_where_on_association_with_relation_performs_subselect_not_two_queries
|
272
|
+
author = authors(:david)
|
273
|
+
|
274
|
+
assert_queries(1) do
|
275
|
+
Essay.where(writer: Author.where(id: author.id)).to_a
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
def test_where_on_association_with_custom_primary_key_with_array_of_base
|
280
|
+
author = authors(:david)
|
281
|
+
essay = Essay.where(writer: [author]).first
|
282
|
+
|
283
|
+
assert_equal essays(:david_modest_proposal), essay
|
284
|
+
end
|
285
|
+
|
286
|
+
def test_where_on_association_with_custom_primary_key_with_array_of_ids
|
287
|
+
essay = Essay.where(writer: ["David"]).first
|
288
|
+
|
289
|
+
assert_equal essays(:david_modest_proposal), essay
|
290
|
+
end
|
291
|
+
|
292
|
+
def test_where_with_strong_parameters
|
293
|
+
protected_params = Class.new do
|
294
|
+
attr_reader :permitted
|
295
|
+
alias :permitted? :permitted
|
296
|
+
|
297
|
+
def initialize(parameters)
|
298
|
+
@parameters = parameters
|
299
|
+
@permitted = false
|
300
|
+
end
|
301
|
+
|
302
|
+
def to_h
|
303
|
+
@parameters
|
304
|
+
end
|
305
|
+
|
306
|
+
def permit!
|
307
|
+
@permitted = true
|
308
|
+
self
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
author = authors(:david)
|
313
|
+
params = protected_params.new(name: author.name)
|
314
|
+
assert_raises(ActiveModel::ForbiddenAttributesError) { Author.where(params) }
|
315
|
+
assert_equal author, Author.where(params.permit!).first
|
316
|
+
end
|
317
|
+
|
318
|
+
def test_where_with_unsupported_arguments
|
319
|
+
assert_raises(ArgumentError) { Author.where(42) }
|
320
|
+
end
|
321
|
+
end
|
322
|
+
end
|