ibm_db 5.2.0-x86-mingw32 → 5.3.2-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES +9 -0
- data/LICENSE +55 -18
- data/ext/Makefile +15 -13
- data/ext/ibm_db.c +62 -57
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +26 -24
- data/ext/ruby_ibm_db_cli.c +1 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
- data/lib/ibm_db.so +1 -0
- data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
- data/test/activejob/destroy_association_async_test.rb +305 -0
- data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
- data/test/activejob/helper.rb +15 -0
- data/test/assets/schema_dump_5_1.yml +345 -0
- data/test/cases/adapter_prevent_writes_test.rb +334 -0
- data/test/cases/adapter_test.rb +432 -218
- data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
- data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
- data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
- data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
- data/test/cases/adapters/mysql2/connection_test.rb +48 -50
- data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
- data/test/cases/adapters/mysql2/enum_test.rb +32 -11
- data/test/cases/adapters/mysql2/explain_test.rb +13 -11
- data/test/cases/adapters/mysql2/json_test.rb +17 -188
- data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
- data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
- data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
- data/test/cases/adapters/mysql2/schema_test.rb +24 -22
- data/test/cases/adapters/mysql2/set_test.rb +32 -0
- data/test/cases/adapters/mysql2/sp_test.rb +10 -8
- data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
- data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
- data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
- data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
- data/test/cases/adapters/postgresql/array_test.rb +118 -63
- data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
- data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
- data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
- data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
- data/test/cases/adapters/postgresql/citext_test.rb +58 -58
- data/test/cases/adapters/postgresql/collation_test.rb +17 -15
- data/test/cases/adapters/postgresql/composite_test.rb +25 -23
- data/test/cases/adapters/postgresql/connection_test.rb +73 -85
- data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
- data/test/cases/adapters/postgresql/date_test.rb +42 -0
- data/test/cases/adapters/postgresql/domain_test.rb +9 -7
- data/test/cases/adapters/postgresql/enum_test.rb +12 -10
- data/test/cases/adapters/postgresql/explain_test.rb +10 -8
- data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
- data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
- data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
- data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
- data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
- data/test/cases/adapters/postgresql/integer_test.rb +2 -0
- data/test/cases/adapters/postgresql/interval_test.rb +99 -0
- data/test/cases/adapters/postgresql/json_test.rb +16 -201
- data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
- data/test/cases/adapters/postgresql/money_test.rb +47 -16
- data/test/cases/adapters/postgresql/network_test.rb +36 -28
- data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
- data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
- data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
- data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
- data/test/cases/adapters/postgresql/range_test.rb +406 -292
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
- data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
- data/test/cases/adapters/postgresql/schema_test.rb +207 -91
- data/test/cases/adapters/postgresql/serial_test.rb +9 -7
- data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
- data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
- data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
- data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
- data/test/cases/adapters/postgresql/utils_test.rb +11 -9
- data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
- data/test/cases/adapters/postgresql/xml_test.rb +10 -14
- data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
- data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
- data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
- data/test/cases/adapters/sqlite3/json_test.rb +29 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
- data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
- data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
- data/test/cases/aggregations_test.rb +14 -12
- data/test/cases/annotate_test.rb +46 -0
- data/test/cases/ar_schema_test.rb +153 -86
- data/test/cases/arel/attributes/attribute_test.rb +1145 -0
- data/test/cases/arel/attributes/math_test.rb +83 -0
- data/test/cases/arel/attributes_test.rb +27 -0
- data/test/cases/arel/collectors/bind_test.rb +40 -0
- data/test/cases/arel/collectors/composite_test.rb +47 -0
- data/test/cases/arel/collectors/sql_string_test.rb +41 -0
- data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
- data/test/cases/arel/crud_test.rb +65 -0
- data/test/cases/arel/delete_manager_test.rb +53 -0
- data/test/cases/arel/factory_methods_test.rb +46 -0
- data/test/cases/arel/helper.rb +45 -0
- data/test/cases/arel/insert_manager_test.rb +241 -0
- data/test/cases/arel/nodes/and_test.rb +30 -0
- data/test/cases/arel/nodes/as_test.rb +36 -0
- data/test/cases/arel/nodes/ascending_test.rb +46 -0
- data/test/cases/arel/nodes/bin_test.rb +35 -0
- data/test/cases/arel/nodes/binary_test.rb +29 -0
- data/test/cases/arel/nodes/bind_param_test.rb +22 -0
- data/test/cases/arel/nodes/case_test.rb +96 -0
- data/test/cases/arel/nodes/casted_test.rb +18 -0
- data/test/cases/arel/nodes/comment_test.rb +22 -0
- data/test/cases/arel/nodes/count_test.rb +35 -0
- data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
- data/test/cases/arel/nodes/descending_test.rb +46 -0
- data/test/cases/arel/nodes/distinct_test.rb +21 -0
- data/test/cases/arel/nodes/equality_test.rb +62 -0
- data/test/cases/arel/nodes/extract_test.rb +43 -0
- data/test/cases/arel/nodes/false_test.rb +21 -0
- data/test/cases/arel/nodes/grouping_test.rb +26 -0
- data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
- data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
- data/test/cases/arel/nodes/named_function_test.rb +48 -0
- data/test/cases/arel/nodes/node_test.rb +22 -0
- data/test/cases/arel/nodes/not_test.rb +31 -0
- data/test/cases/arel/nodes/or_test.rb +36 -0
- data/test/cases/arel/nodes/over_test.rb +69 -0
- data/test/cases/arel/nodes/select_core_test.rb +79 -0
- data/test/cases/arel/nodes/select_statement_test.rb +51 -0
- data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
- data/test/cases/arel/nodes/sum_test.rb +35 -0
- data/test/cases/arel/nodes/table_alias_test.rb +29 -0
- data/test/cases/arel/nodes/true_test.rb +21 -0
- data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
- data/test/cases/arel/nodes/update_statement_test.rb +60 -0
- data/test/cases/arel/nodes/window_test.rb +81 -0
- data/test/cases/arel/nodes_test.rb +34 -0
- data/test/cases/arel/select_manager_test.rb +1238 -0
- data/test/cases/arel/support/fake_record.rb +135 -0
- data/test/cases/arel/table_test.rb +216 -0
- data/test/cases/arel/update_manager_test.rb +126 -0
- data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
- data/test/cases/arel/visitors/dot_test.rb +90 -0
- data/test/cases/arel/visitors/mysql_test.rb +157 -0
- data/test/cases/arel/visitors/postgres_test.rb +366 -0
- data/test/cases/arel/visitors/sqlite_test.rb +75 -0
- data/test/cases/arel/visitors/to_sql_test.rb +750 -0
- data/test/cases/associations/belongs_to_associations_test.rb +510 -158
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
- data/test/cases/associations/callbacks_test.rb +56 -38
- data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
- data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
- data/test/cases/associations/eager_singularization_test.rb +21 -21
- data/test/cases/associations/eager_test.rb +559 -415
- data/test/cases/associations/extension_test.rb +18 -12
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
- data/test/cases/associations/has_many_associations_test.rb +1038 -465
- data/test/cases/associations/has_many_through_associations_test.rb +558 -249
- data/test/cases/associations/has_one_associations_test.rb +294 -129
- data/test/cases/associations/has_one_through_associations_test.rb +121 -75
- data/test/cases/associations/inner_join_association_test.rb +114 -38
- data/test/cases/associations/inverse_associations_test.rb +606 -398
- data/test/cases/associations/join_model_test.rb +158 -148
- data/test/cases/associations/left_outer_join_association_test.rb +59 -24
- data/test/cases/associations/nested_through_associations_test.rb +166 -109
- data/test/cases/associations/required_test.rb +35 -10
- data/test/cases/associations_test.rb +241 -110
- data/test/cases/attribute_methods/read_test.rb +11 -11
- data/test/cases/attribute_methods_test.rb +413 -298
- data/test/cases/attributes_test.rb +145 -27
- data/test/cases/autosave_association_test.rb +681 -436
- data/test/cases/base_prevent_writes_test.rb +229 -0
- data/test/cases/base_test.rb +599 -542
- data/test/cases/batches_test.rb +288 -82
- data/test/cases/binary_test.rb +26 -31
- data/test/cases/bind_parameter_test.rb +194 -21
- data/test/cases/boolean_test.rb +52 -0
- data/test/cases/cache_key_test.rb +110 -5
- data/test/cases/calculations_test.rb +740 -177
- data/test/cases/callbacks_test.rb +74 -207
- data/test/cases/clone_test.rb +15 -10
- data/test/cases/coders/json_test.rb +2 -0
- data/test/cases/coders/yaml_column_test.rb +16 -13
- data/test/cases/collection_cache_key_test.rb +177 -20
- data/test/cases/column_alias_test.rb +9 -7
- data/test/cases/column_definition_test.rb +10 -68
- data/test/cases/comment_test.rb +166 -107
- data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
- data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
- data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
- data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
- data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
- data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
- data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
- data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
- data/test/cases/connection_management_test.rb +13 -11
- data/test/cases/connection_pool_test.rb +316 -83
- data/test/cases/core_test.rb +82 -58
- data/test/cases/counter_cache_test.rb +204 -50
- data/test/cases/custom_locking_test.rb +5 -3
- data/test/cases/database_configurations/hash_config_test.rb +74 -0
- data/test/cases/database_configurations/resolver_test.rb +150 -0
- data/test/cases/database_configurations_test.rb +145 -0
- data/test/cases/database_selector_test.rb +296 -0
- data/test/cases/database_statements_test.rb +18 -16
- data/test/cases/date_test.rb +8 -16
- data/test/cases/date_time_precision_test.rb +100 -78
- data/test/cases/date_time_test.rb +23 -8
- data/test/cases/defaults_test.rb +106 -71
- data/test/cases/delegated_type_test.rb +57 -0
- data/test/cases/dirty_test.rb +419 -223
- data/test/cases/disconnected_test.rb +6 -6
- data/test/cases/dup_test.rb +54 -27
- data/test/cases/enum_test.rb +461 -82
- data/test/cases/errors_test.rb +7 -7
- data/test/cases/explain_subscriber_test.rb +17 -15
- data/test/cases/explain_test.rb +11 -19
- data/test/cases/filter_attributes_test.rb +153 -0
- data/test/cases/finder_respond_to_test.rb +14 -14
- data/test/cases/finder_test.rb +669 -287
- data/test/cases/fixture_set/file_test.rb +34 -38
- data/test/cases/fixtures_test.rb +833 -176
- data/test/cases/forbidden_attributes_protection_test.rb +32 -67
- data/test/cases/habtm_destroy_order_test.rb +25 -25
- data/test/cases/helper.rb +78 -49
- data/test/cases/hot_compatibility_test.rb +33 -32
- data/test/cases/i18n_test.rb +18 -17
- data/test/cases/inheritance_test.rb +180 -115
- data/test/cases/insert_all_test.rb +489 -0
- data/test/cases/instrumentation_test.rb +101 -0
- data/test/cases/integration_test.rb +119 -31
- data/test/cases/invalid_connection_test.rb +18 -16
- data/test/cases/invertible_migration_test.rb +183 -43
- data/test/cases/json_attribute_test.rb +35 -0
- data/test/cases/json_serialization_test.rb +57 -58
- data/test/cases/json_shared_test_cases.rb +290 -0
- data/test/cases/locking_test.rb +413 -119
- data/test/cases/log_subscriber_test.rb +68 -26
- data/test/cases/marshal_serialization_test.rb +39 -0
- data/test/cases/migration/change_schema_test.rb +118 -72
- data/test/cases/migration/change_table_test.rb +138 -30
- data/test/cases/migration/check_constraint_test.rb +162 -0
- data/test/cases/migration/column_attributes_test.rb +45 -35
- data/test/cases/migration/column_positioning_test.rb +18 -6
- data/test/cases/migration/columns_test.rb +93 -77
- data/test/cases/migration/command_recorder_test.rb +121 -34
- data/test/cases/migration/compatibility_test.rb +578 -23
- data/test/cases/migration/create_join_table_test.rb +35 -25
- data/test/cases/migration/foreign_key_test.rb +503 -284
- data/test/cases/migration/helper.rb +4 -3
- data/test/cases/migration/index_test.rb +119 -70
- data/test/cases/migration/logger_test.rb +9 -6
- data/test/cases/migration/pending_migrations_test.rb +88 -34
- data/test/cases/migration/references_foreign_key_test.rb +164 -150
- data/test/cases/migration/references_index_test.rb +38 -19
- data/test/cases/migration/references_statements_test.rb +15 -14
- data/test/cases/migration/rename_table_test.rb +53 -30
- data/test/cases/migration_test.rb +637 -269
- data/test/cases/migrator_test.rb +191 -135
- data/test/cases/mixin_test.rb +7 -11
- data/test/cases/modules_test.rb +36 -34
- data/test/cases/multi_db_migrator_test.rb +223 -0
- data/test/cases/multiparameter_attributes_test.rb +60 -33
- data/test/cases/multiple_db_test.rb +16 -22
- data/test/cases/nested_attributes_test.rb +341 -320
- data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
- data/test/cases/null_relation_test.rb +84 -0
- data/test/cases/numeric_data_test.rb +93 -0
- data/test/cases/persistence_test.rb +361 -269
- data/test/cases/pooled_connections_test.rb +18 -26
- data/test/cases/prepared_statement_status_test.rb +48 -0
- data/test/cases/primary_keys_test.rb +210 -104
- data/test/cases/query_cache_test.rb +610 -141
- data/test/cases/quoting_test.rb +132 -31
- data/test/cases/readonly_test.rb +49 -48
- data/test/cases/reaper_test.rb +146 -32
- data/test/cases/reflection_test.rb +167 -156
- data/test/cases/relation/delegation_test.rb +49 -36
- data/test/cases/relation/delete_all_test.rb +117 -0
- data/test/cases/relation/merging_test.rb +319 -42
- data/test/cases/relation/mutation_test.rb +55 -93
- data/test/cases/relation/or_test.rb +129 -29
- data/test/cases/relation/predicate_builder_test.rb +21 -6
- data/test/cases/relation/record_fetch_warning_test.rb +5 -3
- data/test/cases/relation/select_test.rb +67 -0
- data/test/cases/relation/update_all_test.rb +317 -0
- data/test/cases/relation/where_chain_test.rb +68 -32
- data/test/cases/relation/where_clause_test.rb +136 -61
- data/test/cases/relation/where_test.rb +155 -48
- data/test/cases/relation_test.rb +266 -112
- data/test/cases/relations_test.rb +969 -744
- data/test/cases/reload_models_test.rb +13 -9
- data/test/cases/reserved_word_test.rb +141 -0
- data/test/cases/result_test.rb +68 -17
- data/test/cases/sanitize_test.rb +87 -71
- data/test/cases/schema_dumper_test.rb +221 -128
- data/test/cases/schema_loading_test.rb +3 -2
- data/test/cases/scoping/default_scoping_test.rb +185 -144
- data/test/cases/scoping/named_scoping_test.rb +177 -89
- data/test/cases/scoping/relation_scoping_test.rb +197 -75
- data/test/cases/secure_token_test.rb +18 -3
- data/test/cases/serialization_test.rb +30 -28
- data/test/cases/serialized_attribute_test.rb +133 -42
- data/test/cases/signed_id_test.rb +168 -0
- data/test/cases/statement_cache_test.rb +41 -24
- data/test/cases/statement_invalid_test.rb +42 -0
- data/test/cases/store_test.rb +180 -55
- data/test/cases/strict_loading_test.rb +473 -0
- data/test/cases/suppressor_test.rb +26 -12
- data/test/cases/tasks/database_tasks_test.rb +1258 -194
- data/test/cases/tasks/mysql_rake_test.rb +370 -298
- data/test/cases/tasks/postgresql_rake_test.rb +481 -251
- data/test/cases/tasks/sqlite_rake_test.rb +225 -178
- data/test/cases/test_case.rb +51 -40
- data/test/cases/test_databases_test.rb +79 -0
- data/test/cases/test_fixtures_test.rb +79 -19
- data/test/cases/time_precision_test.rb +98 -76
- data/test/cases/timestamp_test.rb +102 -99
- data/test/cases/touch_later_test.rb +12 -10
- data/test/cases/transaction_callbacks_test.rb +344 -90
- data/test/cases/transaction_isolation_test.rb +12 -12
- data/test/cases/transactions_test.rb +612 -162
- data/test/cases/type/adapter_specific_registry_test.rb +14 -2
- data/test/cases/type/date_time_test.rb +4 -2
- data/test/cases/type/integer_test.rb +4 -2
- data/test/cases/type/string_test.rb +10 -8
- data/test/cases/type/time_test.rb +28 -0
- data/test/cases/type/type_map_test.rb +29 -28
- data/test/cases/type/unsigned_integer_test.rb +19 -0
- data/test/cases/type_test.rb +2 -0
- data/test/cases/types_test.rb +3 -1
- data/test/cases/unconnected_test.rb +14 -1
- data/test/cases/unsafe_raw_sql_test.rb +274 -0
- data/test/cases/validations/absence_validation_test.rb +19 -17
- data/test/cases/validations/association_validation_test.rb +30 -28
- data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
- data/test/cases/validations/i18n_validation_test.rb +22 -21
- data/test/cases/validations/length_validation_test.rb +34 -33
- data/test/cases/validations/numericality_validation_test.rb +181 -0
- data/test/cases/validations/presence_validation_test.rb +21 -19
- data/test/cases/validations/uniqueness_validation_test.rb +156 -86
- data/test/cases/validations_repair_helper.rb +2 -0
- data/test/cases/validations_test.rb +61 -26
- data/test/cases/view_test.rb +122 -116
- data/test/cases/yaml_serialization_test.rb +79 -34
- data/test/config.example.yml +19 -19
- data/test/config.rb +3 -1
- data/test/config.yml +16 -6
- data/test/fixtures/all/namespaced/accounts.yml +2 -0
- data/test/fixtures/author_addresses.yml +1 -8
- data/test/fixtures/authors.yml +1 -7
- data/test/fixtures/binaries.yml +4 -0
- data/test/fixtures/books.yml +9 -2
- data/test/fixtures/categories_posts.yml +3 -0
- data/test/fixtures/citations.yml +5 -0
- data/test/fixtures/comments.yml +7 -0
- data/test/fixtures/companies.yml +5 -0
- data/test/fixtures/computers.yml +2 -0
- data/test/fixtures/customers.yml +10 -1
- data/test/fixtures/developers.yml +1 -1
- data/test/fixtures/essays.yml +10 -0
- data/test/fixtures/faces.yml +3 -3
- data/test/fixtures/humans.yml +5 -0
- data/test/fixtures/interests.yml +7 -7
- data/test/fixtures/memberships.yml +7 -0
- data/test/fixtures/minimalistics.yml +3 -0
- data/test/fixtures/mixed_case_monkeys.yml +2 -2
- data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
- data/test/fixtures/naked/yml/parrots.yml +1 -0
- data/test/fixtures/other_books.yml +26 -0
- data/test/fixtures/other_posts.yml +1 -0
- data/test/fixtures/parrots.yml +7 -1
- data/test/fixtures/pirates.yml +3 -0
- data/test/fixtures/posts.yml +11 -3
- data/test/fixtures/readers.yml +6 -0
- data/test/fixtures/reserved_words/values.yml +2 -2
- data/test/fixtures/sponsors.yml +3 -0
- data/test/fixtures/strict_zines.yml +2 -0
- data/test/fixtures/subscribers.yml +1 -1
- data/test/fixtures/tasks.yml +1 -1
- data/test/fixtures/warehouse-things.yml +3 -0
- data/test/migrations/10_urban/9_add_expressions.rb +2 -0
- data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
- data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
- data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
- data/test/migrations/missing/1_people_have_last_names.rb +2 -0
- data/test/migrations/missing/3_we_need_reminders.rb +2 -0
- data/test/migrations/missing/4_innocent_jointable.rb +3 -1
- data/test/migrations/rename/1_we_need_things.rb +2 -0
- data/test/migrations/rename/2_rename_things.rb +2 -0
- data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy2/1_create_articles.rb +2 -0
- data/test/migrations/to_copy2/2_create_comments.rb +3 -1
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
- data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
- data/test/models/account.rb +46 -0
- data/test/models/admin/account.rb +3 -1
- data/test/models/admin/randomly_named_c1.rb +2 -0
- data/test/models/admin/user.rb +16 -8
- data/test/models/admin.rb +4 -2
- data/test/models/aircraft.rb +3 -1
- data/test/models/arunit2_model.rb +2 -0
- data/test/models/author.rb +153 -102
- data/test/models/auto_id.rb +2 -0
- data/test/models/autoloadable/extra_firm.rb +2 -0
- data/test/models/binary.rb +3 -1
- data/test/models/binary_field.rb +6 -0
- data/test/models/bird.rb +13 -1
- data/test/models/book.rb +14 -4
- data/test/models/book_destroy_async.rb +24 -0
- data/test/models/boolean.rb +5 -0
- data/test/models/bulb.rb +13 -4
- data/test/models/cake_designer.rb +2 -0
- data/test/models/car.rb +17 -10
- data/test/models/carrier.rb +2 -0
- data/test/models/cart.rb +5 -0
- data/test/models/cat.rb +2 -0
- data/test/models/categorization.rb +8 -6
- data/test/models/category.rb +28 -16
- data/test/models/chef.rb +2 -0
- data/test/models/citation.rb +5 -1
- data/test/models/club.rb +13 -10
- data/test/models/college.rb +4 -2
- data/test/models/column.rb +2 -0
- data/test/models/column_name.rb +2 -0
- data/test/models/comment.rb +32 -10
- data/test/models/company.rb +102 -106
- data/test/models/company_in_module.rb +27 -26
- data/test/models/computer.rb +3 -1
- data/test/models/contact.rb +15 -13
- data/test/models/content.rb +5 -3
- data/test/models/contract.rb +21 -3
- data/test/models/country.rb +2 -4
- data/test/models/course.rb +3 -1
- data/test/models/customer.rb +10 -8
- data/test/models/customer_carrier.rb +2 -0
- data/test/models/dashboard.rb +2 -0
- data/test/models/default.rb +2 -0
- data/test/models/department.rb +2 -0
- data/test/models/destroy_async_parent.rb +15 -0
- data/test/models/destroy_async_parent_soft_delete.rb +20 -0
- data/test/models/developer.rb +152 -85
- data/test/models/dl_keyed_belongs_to.rb +13 -0
- data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
- data/test/models/dl_keyed_has_many.rb +5 -0
- data/test/models/dl_keyed_has_many_through.rb +5 -0
- data/test/models/dl_keyed_has_one.rb +5 -0
- data/test/models/dl_keyed_join.rb +10 -0
- data/test/models/dog.rb +2 -0
- data/test/models/dog_lover.rb +2 -0
- data/test/models/doubloon.rb +3 -1
- data/test/models/drink_designer.rb +17 -0
- data/test/models/edge.rb +4 -2
- data/test/models/electron.rb +2 -0
- data/test/models/engine.rb +3 -2
- data/test/models/entrant.rb +2 -0
- data/test/models/entry.rb +5 -0
- data/test/models/essay.rb +6 -3
- data/test/models/essay_destroy_async.rb +12 -0
- data/test/models/event.rb +3 -1
- data/test/models/eye.rb +5 -3
- data/test/models/face.rb +14 -6
- data/test/models/family.rb +6 -0
- data/test/models/family_tree.rb +6 -0
- data/test/models/friendship.rb +5 -3
- data/test/models/frog.rb +8 -0
- data/test/models/guid.rb +3 -1
- data/test/models/guitar.rb +2 -0
- data/test/models/hotel.rb +5 -3
- data/test/models/human.rb +39 -0
- data/test/models/image.rb +3 -1
- data/test/models/interest.rb +14 -3
- data/test/models/invoice.rb +4 -2
- data/test/models/item.rb +3 -1
- data/test/models/job.rb +5 -3
- data/test/models/joke.rb +4 -2
- data/test/models/keyboard.rb +3 -1
- data/test/models/legacy_thing.rb +2 -0
- data/test/models/lesson.rb +2 -0
- data/test/models/line_item.rb +3 -1
- data/test/models/liquid.rb +2 -0
- data/test/models/matey.rb +3 -1
- data/test/models/measurement.rb +4 -0
- data/test/models/member.rb +23 -20
- data/test/models/member_detail.rb +3 -0
- data/test/models/member_type.rb +2 -0
- data/test/models/membership.rb +4 -1
- data/test/models/mentor.rb +3 -1
- data/test/models/message.rb +5 -0
- data/test/models/minimalistic.rb +2 -0
- data/test/models/minivan.rb +3 -2
- data/test/models/mixed_case_monkey.rb +3 -1
- data/test/models/molecule.rb +2 -0
- data/test/models/mouse.rb +6 -0
- data/test/models/movie.rb +2 -0
- data/test/models/node.rb +4 -2
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +2 -0
- data/test/models/numeric_data.rb +12 -0
- data/test/models/order.rb +4 -2
- data/test/models/organization.rb +9 -7
- data/test/models/other_dog.rb +3 -1
- data/test/models/owner.rb +6 -4
- data/test/models/parrot.rb +12 -4
- data/test/models/person.rb +59 -54
- data/test/models/personal_legacy_thing.rb +3 -1
- data/test/models/pet.rb +4 -2
- data/test/models/pet_treasure.rb +2 -0
- data/test/models/pirate.rb +67 -43
- data/test/models/possession.rb +3 -1
- data/test/models/post.rb +184 -86
- data/test/models/price_estimate.rb +11 -1
- data/test/models/professor.rb +3 -1
- data/test/models/project.rb +14 -12
- data/test/models/publisher/article.rb +2 -0
- data/test/models/publisher/magazine.rb +2 -0
- data/test/models/publisher.rb +2 -0
- data/test/models/randomly_named_c1.rb +2 -0
- data/test/models/rating.rb +5 -1
- data/test/models/reader.rb +7 -5
- data/test/models/recipe.rb +2 -0
- data/test/models/record.rb +2 -0
- data/test/models/reference.rb +6 -3
- data/test/models/reply.rb +39 -21
- data/test/models/room.rb +6 -0
- data/test/models/section.rb +6 -0
- data/test/models/seminar.rb +6 -0
- data/test/models/session.rb +6 -0
- data/test/models/ship.rb +12 -9
- data/test/models/ship_part.rb +5 -3
- data/test/models/shop.rb +4 -2
- data/test/models/shop_account.rb +2 -0
- data/test/models/speedometer.rb +2 -0
- data/test/models/sponsor.rb +8 -5
- data/test/models/squeak.rb +6 -0
- data/test/models/strict_zine.rb +7 -0
- data/test/models/string_key_object.rb +2 -0
- data/test/models/student.rb +2 -0
- data/test/models/subscriber.rb +4 -2
- data/test/models/subscription.rb +5 -1
- data/test/models/tag.rb +6 -3
- data/test/models/tagging.rb +13 -6
- data/test/models/task.rb +2 -0
- data/test/models/topic.rb +54 -19
- data/test/models/toy.rb +4 -0
- data/test/models/traffic_light.rb +2 -0
- data/test/models/treasure.rb +5 -3
- data/test/models/treaty.rb +2 -4
- data/test/models/tree.rb +2 -0
- data/test/models/tuning_peg.rb +2 -0
- data/test/models/tyre.rb +2 -0
- data/test/models/user.rb +12 -4
- data/test/models/uuid_child.rb +2 -0
- data/test/models/uuid_item.rb +2 -0
- data/test/models/uuid_parent.rb +2 -0
- data/test/models/vegetables.rb +12 -3
- data/test/models/vertex.rb +6 -4
- data/test/models/warehouse_thing.rb +2 -0
- data/test/models/wheel.rb +3 -1
- data/test/models/without_table.rb +3 -1
- data/test/models/zine.rb +3 -1
- data/test/schema/mysql2_specific_schema.rb +49 -35
- data/test/schema/oracle_specific_schema.rb +13 -15
- data/test/schema/postgresql_specific_schema.rb +51 -40
- data/test/schema/schema.rb +334 -154
- data/test/schema/sqlite_specific_schema.rb +9 -16
- data/test/support/config.rb +26 -26
- data/test/support/connection.rb +14 -8
- data/test/support/connection_helper.rb +3 -1
- data/test/support/ddl_helper.rb +2 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
- data/test/support/schema_dumping_helper.rb +2 -0
- data/test/support/stubs/strong_parameters.rb +40 -0
- data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
- data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
- metadata +190 -14
data/test/cases/batches_test.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
require "models/comment"
|
5
|
+
require "models/post"
|
6
|
+
require "models/subscriber"
|
4
7
|
|
5
8
|
class EachTest < ActiveRecord::TestCase
|
6
9
|
fixtures :posts, :subscribers
|
@@ -8,12 +11,12 @@ class EachTest < ActiveRecord::TestCase
|
|
8
11
|
def setup
|
9
12
|
@posts = Post.order("id asc")
|
10
13
|
@total = Post.count
|
11
|
-
Post.count(
|
14
|
+
Post.count("id") # preheat arel's table cache
|
12
15
|
end
|
13
16
|
|
14
17
|
def test_each_should_execute_one_query_per_batch
|
15
18
|
assert_queries(@total + 1) do
|
16
|
-
Post.find_each(:
|
19
|
+
Post.find_each(batch_size: 1) do |post|
|
17
20
|
assert_kind_of Post, post
|
18
21
|
end
|
19
22
|
end
|
@@ -21,31 +24,29 @@ class EachTest < ActiveRecord::TestCase
|
|
21
24
|
|
22
25
|
def test_each_should_not_return_query_chain_and_execute_only_one_query
|
23
26
|
assert_queries(1) do
|
24
|
-
result = Post.find_each(:
|
27
|
+
result = Post.find_each(batch_size: 100000) { }
|
25
28
|
assert_nil result
|
26
29
|
end
|
27
30
|
end
|
28
31
|
|
29
32
|
def test_each_should_return_an_enumerator_if_no_block_is_present
|
30
33
|
assert_queries(1) do
|
31
|
-
Post.find_each(:
|
34
|
+
Post.find_each(batch_size: 100000).with_index do |post, index|
|
32
35
|
assert_kind_of Post, post
|
33
36
|
assert_kind_of Integer, index
|
34
37
|
end
|
35
38
|
end
|
36
39
|
end
|
37
40
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
assert_equal 11, Post.find_each(batch_size: 10_000).size
|
43
|
-
end
|
41
|
+
def test_each_should_return_a_sized_enumerator
|
42
|
+
assert_equal 11, Post.find_each(batch_size: 1).size
|
43
|
+
assert_equal 5, Post.find_each(batch_size: 2, start: 7).size
|
44
|
+
assert_equal 11, Post.find_each(batch_size: 10_000).size
|
44
45
|
end
|
45
46
|
|
46
47
|
def test_each_enumerator_should_execute_one_query_per_batch
|
47
48
|
assert_queries(@total + 1) do
|
48
|
-
Post.find_each(:
|
49
|
+
Post.find_each(batch_size: 1).with_index do |post, index|
|
49
50
|
assert_kind_of Post, post
|
50
51
|
assert_kind_of Integer, index
|
51
52
|
end
|
@@ -62,16 +63,32 @@ class EachTest < ActiveRecord::TestCase
|
|
62
63
|
|
63
64
|
def test_each_should_execute_if_id_is_in_select
|
64
65
|
assert_queries(6) do
|
65
|
-
Post.select("id, title, type").find_each(:
|
66
|
+
Post.select("id, title, type").find_each(batch_size: 2) do |post|
|
66
67
|
assert_kind_of Post, post
|
67
68
|
end
|
68
69
|
end
|
69
70
|
end
|
70
71
|
|
71
|
-
|
72
|
-
|
73
|
-
|
72
|
+
test "find_each should honor limit if passed a block" do
|
73
|
+
limit = @total - 1
|
74
|
+
total = 0
|
75
|
+
|
76
|
+
Post.limit(limit).find_each do |post|
|
77
|
+
total += 1
|
74
78
|
end
|
79
|
+
|
80
|
+
assert_equal limit, total
|
81
|
+
end
|
82
|
+
|
83
|
+
test "find_each should honor limit if no block is passed" do
|
84
|
+
limit = @total - 1
|
85
|
+
total = 0
|
86
|
+
|
87
|
+
Post.limit(limit).find_each.each do |post|
|
88
|
+
total += 1
|
89
|
+
end
|
90
|
+
|
91
|
+
assert_equal limit, total
|
75
92
|
end
|
76
93
|
|
77
94
|
def test_warn_if_order_scope_is_set
|
@@ -84,7 +101,7 @@ class EachTest < ActiveRecord::TestCase
|
|
84
101
|
previous_logger = ActiveRecord::Base.logger
|
85
102
|
ActiveRecord::Base.logger = nil
|
86
103
|
assert_nothing_raised do
|
87
|
-
Post.
|
104
|
+
Post.order("comments_count DESC").find_each { |post| post }
|
88
105
|
end
|
89
106
|
ensure
|
90
107
|
ActiveRecord::Base.logger = previous_logger
|
@@ -92,7 +109,7 @@ class EachTest < ActiveRecord::TestCase
|
|
92
109
|
|
93
110
|
def test_find_in_batches_should_return_batches
|
94
111
|
assert_queries(@total + 1) do
|
95
|
-
Post.find_in_batches(:
|
112
|
+
Post.find_in_batches(batch_size: 1) do |batch|
|
96
113
|
assert_kind_of Array, batch
|
97
114
|
assert_kind_of Post, batch.first
|
98
115
|
end
|
@@ -119,30 +136,48 @@ class EachTest < ActiveRecord::TestCase
|
|
119
136
|
|
120
137
|
def test_find_in_batches_shouldnt_execute_query_unless_needed
|
121
138
|
assert_queries(2) do
|
122
|
-
Post.find_in_batches(:
|
139
|
+
Post.find_in_batches(batch_size: @total) { |batch| assert_kind_of Array, batch }
|
123
140
|
end
|
124
141
|
|
125
142
|
assert_queries(1) do
|
126
|
-
Post.find_in_batches(:
|
143
|
+
Post.find_in_batches(batch_size: @total + 1) { |batch| assert_kind_of Array, batch }
|
127
144
|
end
|
128
145
|
end
|
129
146
|
|
130
147
|
def test_find_in_batches_should_quote_batch_order
|
131
148
|
c = Post.connection
|
132
|
-
assert_sql(/ORDER BY #{c.quote_table_name(
|
133
|
-
Post.find_in_batches(:
|
149
|
+
assert_sql(/ORDER BY #{Regexp.escape(c.quote_table_name("posts.id"))}/i) do
|
150
|
+
Post.find_in_batches(batch_size: 1) do |batch|
|
134
151
|
assert_kind_of Array, batch
|
135
152
|
assert_kind_of Post, batch.first
|
136
153
|
end
|
137
154
|
end
|
138
155
|
end
|
139
156
|
|
157
|
+
def test_find_in_batches_should_quote_batch_order_with_desc_order
|
158
|
+
c = Post.connection
|
159
|
+
assert_sql(/ORDER BY #{Regexp.escape(c.quote_table_name("posts.id"))} DESC/) do
|
160
|
+
Post.find_in_batches(batch_size: 1, order: :desc) do |batch|
|
161
|
+
assert_kind_of Array, batch
|
162
|
+
assert_kind_of Post, batch.first
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_each_should_raise_if_order_is_invalid
|
168
|
+
assert_raise(ArgumentError) do
|
169
|
+
Post.select(:title).find_each(batch_size: 1, order: :invalid) { |post|
|
170
|
+
flunk "should not call this block"
|
171
|
+
}
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
140
175
|
def test_find_in_batches_should_not_use_records_after_yielding_them_in_case_original_array_is_modified
|
141
|
-
not_a_post = "not a post"
|
176
|
+
not_a_post = +"not a post"
|
142
177
|
def not_a_post.id; end
|
143
|
-
not_a_post.stub(:id, ->{ raise StandardError.new("not_a_post had #id called on it") }) do
|
178
|
+
not_a_post.stub(:id, -> { raise StandardError.new("not_a_post had #id called on it") }) do
|
144
179
|
assert_nothing_raised do
|
145
|
-
Post.find_in_batches(:
|
180
|
+
Post.find_in_batches(batch_size: 1) do |batch|
|
146
181
|
assert_kind_of Array, batch
|
147
182
|
assert_kind_of Post, batch.first
|
148
183
|
|
@@ -166,57 +201,51 @@ class EachTest < ActiveRecord::TestCase
|
|
166
201
|
|
167
202
|
def test_find_in_batches_should_error_on_ignore_the_order
|
168
203
|
assert_raise(ArgumentError) do
|
169
|
-
PostWithDefaultScope.find_in_batches(error_on_ignore: true){}
|
204
|
+
PostWithDefaultScope.find_in_batches(error_on_ignore: true) { }
|
170
205
|
end
|
171
206
|
end
|
172
207
|
|
173
|
-
def
|
174
|
-
# Set the config option which will be
|
175
|
-
prev = ActiveRecord::Base.
|
176
|
-
ActiveRecord::Base.
|
208
|
+
def test_find_in_batches_should_not_error_if_config_overridden
|
209
|
+
# Set the config option which will be overridden
|
210
|
+
prev = ActiveRecord::Base.error_on_ignored_order
|
211
|
+
ActiveRecord::Base.error_on_ignored_order = true
|
177
212
|
assert_nothing_raised do
|
178
|
-
PostWithDefaultScope.find_in_batches(error_on_ignore: false){}
|
213
|
+
PostWithDefaultScope.find_in_batches(error_on_ignore: false) { }
|
179
214
|
end
|
180
215
|
ensure
|
181
216
|
# Set back to default
|
182
|
-
ActiveRecord::Base.
|
217
|
+
ActiveRecord::Base.error_on_ignored_order = prev
|
183
218
|
end
|
184
219
|
|
185
220
|
def test_find_in_batches_should_error_on_config_specified_to_error
|
186
221
|
# Set the config option
|
187
|
-
prev = ActiveRecord::Base.
|
188
|
-
ActiveRecord::Base.
|
222
|
+
prev = ActiveRecord::Base.error_on_ignored_order
|
223
|
+
ActiveRecord::Base.error_on_ignored_order = true
|
189
224
|
assert_raise(ArgumentError) do
|
190
|
-
PostWithDefaultScope.find_in_batches(){}
|
225
|
+
PostWithDefaultScope.find_in_batches() { }
|
191
226
|
end
|
192
227
|
ensure
|
193
228
|
# Set back to default
|
194
|
-
ActiveRecord::Base.
|
229
|
+
ActiveRecord::Base.error_on_ignored_order = prev
|
195
230
|
end
|
196
231
|
|
197
232
|
def test_find_in_batches_should_not_error_by_default
|
198
233
|
assert_nothing_raised do
|
199
|
-
PostWithDefaultScope.find_in_batches(){}
|
234
|
+
PostWithDefaultScope.find_in_batches() { }
|
200
235
|
end
|
201
236
|
end
|
202
237
|
|
203
238
|
def test_find_in_batches_should_not_ignore_the_default_scope_if_it_is_other_then_order
|
204
|
-
|
239
|
+
default_scope = SpecialPostWithDefaultScope.all
|
205
240
|
posts = []
|
206
241
|
SpecialPostWithDefaultScope.find_in_batches do |batch|
|
207
242
|
posts.concat(batch)
|
208
243
|
end
|
209
|
-
assert_equal
|
210
|
-
end
|
211
|
-
|
212
|
-
def test_find_in_batches_should_not_modify_passed_options
|
213
|
-
assert_nothing_raised do
|
214
|
-
Post.find_in_batches({ batch_size: 42, start: 1 }.freeze){}
|
215
|
-
end
|
244
|
+
assert_equal default_scope.pluck(:id).sort, posts.map(&:id).sort
|
216
245
|
end
|
217
246
|
|
218
247
|
def test_find_in_batches_should_use_any_column_as_primary_key
|
219
|
-
nick_order_subscribers = Subscriber.order(
|
248
|
+
nick_order_subscribers = Subscriber.order("nick asc")
|
220
249
|
start_nick = nick_order_subscribers.second.nick
|
221
250
|
|
222
251
|
subscribers = []
|
@@ -239,7 +268,7 @@ class EachTest < ActiveRecord::TestCase
|
|
239
268
|
def test_find_in_batches_should_return_an_enumerator
|
240
269
|
enum = nil
|
241
270
|
assert_no_queries do
|
242
|
-
enum = Post.find_in_batches(:
|
271
|
+
enum = Post.find_in_batches(batch_size: 1)
|
243
272
|
end
|
244
273
|
assert_queries(4) do
|
245
274
|
enum.first(4) do |batch|
|
@@ -249,6 +278,28 @@ class EachTest < ActiveRecord::TestCase
|
|
249
278
|
end
|
250
279
|
end
|
251
280
|
|
281
|
+
test "find_in_batches should honor limit if passed a block" do
|
282
|
+
limit = @total - 1
|
283
|
+
total = 0
|
284
|
+
|
285
|
+
Post.limit(limit).find_in_batches do |batch|
|
286
|
+
total += batch.size
|
287
|
+
end
|
288
|
+
|
289
|
+
assert_equal limit, total
|
290
|
+
end
|
291
|
+
|
292
|
+
test "find_in_batches should honor limit if no block is passed" do
|
293
|
+
limit = @total - 1
|
294
|
+
total = 0
|
295
|
+
|
296
|
+
Post.limit(limit).find_in_batches.each do |batch|
|
297
|
+
total += batch.size
|
298
|
+
end
|
299
|
+
|
300
|
+
assert_equal limit, total
|
301
|
+
end
|
302
|
+
|
252
303
|
def test_in_batches_should_not_execute_any_query
|
253
304
|
assert_no_queries do
|
254
305
|
assert_kind_of ActiveRecord::Batches::BatchEnumerator, Post.in_batches(of: 2)
|
@@ -274,7 +325,7 @@ class EachTest < ActiveRecord::TestCase
|
|
274
325
|
def test_in_batches_each_record_should_yield_record_if_block_is_given
|
275
326
|
assert_queries(6) do
|
276
327
|
Post.in_batches(of: 2).each_record do |post|
|
277
|
-
|
328
|
+
assert_predicate post.title, :present?
|
278
329
|
assert_kind_of Post, post
|
279
330
|
end
|
280
331
|
end
|
@@ -283,14 +334,14 @@ class EachTest < ActiveRecord::TestCase
|
|
283
334
|
def test_in_batches_each_record_should_return_enumerator_if_no_block_given
|
284
335
|
assert_queries(6) do
|
285
336
|
Post.in_batches(of: 2).each_record.with_index do |post, i|
|
286
|
-
|
337
|
+
assert_predicate post.title, :present?
|
287
338
|
assert_kind_of Post, post
|
288
339
|
end
|
289
340
|
end
|
290
341
|
end
|
291
342
|
|
292
343
|
def test_in_batches_each_record_should_be_ordered_by_id
|
293
|
-
ids = Post.order(
|
344
|
+
ids = Post.order("id ASC").pluck(:id)
|
294
345
|
assert_queries(6) do
|
295
346
|
Post.in_batches(of: 2).each_record.with_index do |post, i|
|
296
347
|
assert_equal ids[i], post.id
|
@@ -305,33 +356,49 @@ class EachTest < ActiveRecord::TestCase
|
|
305
356
|
assert_equal Post.all.pluck(:title), ["updated-title"] * Post.count
|
306
357
|
end
|
307
358
|
|
359
|
+
def test_in_batches_update_all_returns_rows_affected
|
360
|
+
assert_equal 11, Post.in_batches(of: 2).update_all(title: "updated-title")
|
361
|
+
end
|
362
|
+
|
363
|
+
def test_in_batches_update_all_returns_zero_when_no_batches
|
364
|
+
assert_equal 0, Post.where("1=0").in_batches(of: 2).update_all(title: "updated-title")
|
365
|
+
end
|
366
|
+
|
308
367
|
def test_in_batches_delete_all_should_not_delete_records_in_other_batches
|
309
|
-
not_deleted_count = Post.where(
|
310
|
-
Post.where(
|
311
|
-
assert_equal 0, Post.where(
|
368
|
+
not_deleted_count = Post.where("id <= 2").count
|
369
|
+
Post.where("id > 2").in_batches(of: 2).delete_all
|
370
|
+
assert_equal 0, Post.where("id > 2").count
|
312
371
|
assert_equal not_deleted_count, Post.count
|
313
372
|
end
|
314
373
|
|
374
|
+
def test_in_batches_delete_all_returns_rows_affected
|
375
|
+
assert_equal 11, Post.in_batches(of: 2).delete_all
|
376
|
+
end
|
377
|
+
|
378
|
+
def test_in_batches_delete_all_returns_zero_when_no_batches
|
379
|
+
assert_equal 0, Post.where("1=0").in_batches(of: 2).delete_all
|
380
|
+
end
|
381
|
+
|
315
382
|
def test_in_batches_should_not_be_loaded
|
316
383
|
Post.in_batches(of: 1) do |relation|
|
317
|
-
|
384
|
+
assert_not_predicate relation, :loaded?
|
318
385
|
end
|
319
386
|
|
320
387
|
Post.in_batches(of: 1, load: false) do |relation|
|
321
|
-
|
388
|
+
assert_not_predicate relation, :loaded?
|
322
389
|
end
|
323
390
|
end
|
324
391
|
|
325
392
|
def test_in_batches_should_be_loaded
|
326
393
|
Post.in_batches(of: 1, load: true) do |relation|
|
327
|
-
|
394
|
+
assert_predicate relation, :loaded?
|
328
395
|
end
|
329
396
|
end
|
330
397
|
|
331
398
|
def test_in_batches_if_not_loaded_executes_more_queries
|
332
399
|
assert_queries(@total + 1) do
|
333
400
|
Post.in_batches(of: 1, load: false) do |relation|
|
334
|
-
|
401
|
+
assert_not_predicate relation, :loaded?
|
335
402
|
end
|
336
403
|
end
|
337
404
|
end
|
@@ -345,7 +412,7 @@ class EachTest < ActiveRecord::TestCase
|
|
345
412
|
end
|
346
413
|
|
347
414
|
def test_in_batches_should_start_from_the_start_option
|
348
|
-
post = Post.order(
|
415
|
+
post = Post.order("id ASC").where("id >= ?", 2).first
|
349
416
|
assert_queries(2) do
|
350
417
|
relation = Post.in_batches(of: 1, start: 2).first
|
351
418
|
assert_equal post, relation.first
|
@@ -353,7 +420,7 @@ class EachTest < ActiveRecord::TestCase
|
|
353
420
|
end
|
354
421
|
|
355
422
|
def test_in_batches_should_end_at_the_finish_option
|
356
|
-
post = Post.order(
|
423
|
+
post = Post.order("id DESC").where("id <= ?", 5).first
|
357
424
|
assert_queries(7) do
|
358
425
|
relation = Post.in_batches(of: 1, finish: 5, load: true).reverse_each.first
|
359
426
|
assert_equal post, relation.last
|
@@ -372,7 +439,7 @@ class EachTest < ActiveRecord::TestCase
|
|
372
439
|
|
373
440
|
def test_in_batches_should_quote_batch_order
|
374
441
|
c = Post.connection
|
375
|
-
assert_sql(/ORDER BY #{c.quote_table_name('posts')}
|
442
|
+
assert_sql(/ORDER BY #{c.quote_table_name('posts')}\.#{c.quote_column_name('id')}/) do
|
376
443
|
Post.in_batches(of: 1) do |relation|
|
377
444
|
assert_kind_of ActiveRecord::Relation, relation
|
378
445
|
assert_kind_of Post, relation.first
|
@@ -380,8 +447,18 @@ class EachTest < ActiveRecord::TestCase
|
|
380
447
|
end
|
381
448
|
end
|
382
449
|
|
450
|
+
def test_in_batches_should_quote_batch_order_with_desc_order
|
451
|
+
c = Post.connection
|
452
|
+
assert_sql(/ORDER BY #{Regexp.escape(c.quote_table_name("posts.id"))} DESC/) do
|
453
|
+
Post.in_batches(of: 1, order: :desc) do |relation|
|
454
|
+
assert_kind_of ActiveRecord::Relation, relation
|
455
|
+
assert_kind_of Post, relation.first
|
456
|
+
end
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
383
460
|
def test_in_batches_should_not_use_records_after_yielding_them_in_case_original_array_is_modified
|
384
|
-
not_a_post = "not a post"
|
461
|
+
not_a_post = +"not a post"
|
385
462
|
def not_a_post.id
|
386
463
|
raise StandardError.new("not_a_post had #id called on it")
|
387
464
|
end
|
@@ -391,28 +468,22 @@ class EachTest < ActiveRecord::TestCase
|
|
391
468
|
assert_kind_of ActiveRecord::Relation, relation
|
392
469
|
assert_kind_of Post, relation.first
|
393
470
|
|
394
|
-
|
471
|
+
[not_a_post] * relation.count
|
395
472
|
end
|
396
473
|
end
|
397
474
|
end
|
398
475
|
|
399
476
|
def test_in_batches_should_not_ignore_default_scope_without_order_statements
|
400
|
-
|
477
|
+
default_scope = SpecialPostWithDefaultScope.all
|
401
478
|
posts = []
|
402
479
|
SpecialPostWithDefaultScope.in_batches do |relation|
|
403
480
|
posts.concat(relation)
|
404
481
|
end
|
405
|
-
assert_equal
|
406
|
-
end
|
407
|
-
|
408
|
-
def test_in_batches_should_not_modify_passed_options
|
409
|
-
assert_nothing_raised do
|
410
|
-
Post.in_batches({ of: 42, start: 1 }.freeze){}
|
411
|
-
end
|
482
|
+
assert_equal default_scope.pluck(:id).sort, posts.map(&:id).sort
|
412
483
|
end
|
413
484
|
|
414
485
|
def test_in_batches_should_use_any_column_as_primary_key
|
415
|
-
nick_order_subscribers = Subscriber.order(
|
486
|
+
nick_order_subscribers = Subscriber.order("nick asc")
|
416
487
|
start_nick = nick_order_subscribers.second.nick
|
417
488
|
|
418
489
|
subscribers = []
|
@@ -469,21 +540,156 @@ class EachTest < ActiveRecord::TestCase
|
|
469
540
|
def test_in_batches_relations_update_all_should_not_affect_matching_records_in_other_batches
|
470
541
|
Post.update_all(author_id: 0)
|
471
542
|
person = Post.last
|
472
|
-
person.
|
543
|
+
person.update(author_id: 1)
|
473
544
|
|
474
545
|
Post.in_batches(of: 2) do |batch|
|
475
|
-
batch.where(
|
546
|
+
batch.where("author_id >= 1").update_all("author_id = author_id + 1")
|
476
547
|
end
|
477
548
|
assert_equal 2, person.reload.author_id # incremented only once
|
478
549
|
end
|
479
550
|
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
551
|
+
def test_find_in_batches_should_return_a_sized_enumerator
|
552
|
+
assert_equal 11, Post.find_in_batches(batch_size: 1).size
|
553
|
+
assert_equal 6, Post.find_in_batches(batch_size: 2).size
|
554
|
+
assert_equal 4, Post.find_in_batches(batch_size: 2, start: 4).size
|
555
|
+
assert_equal 4, Post.find_in_batches(batch_size: 3).size
|
556
|
+
assert_equal 1, Post.find_in_batches(batch_size: 10_000).size
|
557
|
+
end
|
558
|
+
|
559
|
+
[true, false].each do |load|
|
560
|
+
test "in_batches should return limit records when limit is less than batch size and load is #{load}" do
|
561
|
+
limit = 3
|
562
|
+
batch_size = 5
|
563
|
+
total = 0
|
564
|
+
|
565
|
+
Post.limit(limit).in_batches(of: batch_size, load: load) do |batch|
|
566
|
+
total += batch.count
|
567
|
+
end
|
568
|
+
|
569
|
+
assert_equal limit, total
|
570
|
+
end
|
571
|
+
|
572
|
+
test "in_batches should return limit records when limit is greater than batch size and load is #{load}" do
|
573
|
+
limit = 5
|
574
|
+
batch_size = 3
|
575
|
+
total = 0
|
576
|
+
|
577
|
+
Post.limit(limit).in_batches(of: batch_size, load: load) do |batch|
|
578
|
+
total += batch.count
|
579
|
+
end
|
580
|
+
|
581
|
+
assert_equal limit, total
|
582
|
+
end
|
583
|
+
|
584
|
+
test "in_batches should return limit records when limit is a multiple of the batch size and load is #{load}" do
|
585
|
+
limit = 6
|
586
|
+
batch_size = 3
|
587
|
+
total = 0
|
588
|
+
|
589
|
+
Post.limit(limit).in_batches(of: batch_size, load: load) do |batch|
|
590
|
+
total += batch.count
|
591
|
+
end
|
592
|
+
|
593
|
+
assert_equal limit, total
|
594
|
+
end
|
595
|
+
|
596
|
+
test "in_batches should return no records if the limit is 0 and load is #{load}" do
|
597
|
+
limit = 0
|
598
|
+
batch_size = 1
|
599
|
+
total = 0
|
600
|
+
|
601
|
+
Post.limit(limit).in_batches(of: batch_size, load: load) do |batch|
|
602
|
+
total += batch.count
|
603
|
+
end
|
604
|
+
|
605
|
+
assert_equal limit, total
|
606
|
+
end
|
607
|
+
|
608
|
+
test "in_batches should return all if the limit is greater than the number of records when load is #{load}" do
|
609
|
+
limit = @total + 1
|
610
|
+
batch_size = 1
|
611
|
+
total = 0
|
612
|
+
|
613
|
+
Post.limit(limit).in_batches(of: batch_size, load: load) do |batch|
|
614
|
+
total += batch.count
|
615
|
+
end
|
616
|
+
|
617
|
+
assert_equal @total, total
|
618
|
+
end
|
619
|
+
end
|
620
|
+
|
621
|
+
test ".find_each respects table alias" do
|
622
|
+
assert_queries(1) do
|
623
|
+
table_alias = Post.arel_table.alias("omg_posts")
|
624
|
+
table_metadata = ActiveRecord::TableMetadata.new(Post, table_alias)
|
625
|
+
predicate_builder = ActiveRecord::PredicateBuilder.new(table_metadata)
|
626
|
+
|
627
|
+
posts = ActiveRecord::Relation.create(
|
628
|
+
Post,
|
629
|
+
table: table_alias,
|
630
|
+
predicate_builder: predicate_builder
|
631
|
+
)
|
632
|
+
posts.find_each { }
|
633
|
+
end
|
634
|
+
end
|
635
|
+
|
636
|
+
test ".find_each bypasses the query cache for its own queries" do
|
637
|
+
Post.cache do
|
638
|
+
assert_queries(2) do
|
639
|
+
Post.find_each { }
|
640
|
+
Post.find_each { }
|
641
|
+
end
|
642
|
+
end
|
643
|
+
end
|
644
|
+
|
645
|
+
test ".find_each does not disable the query cache inside the given block" do
|
646
|
+
Post.cache do
|
647
|
+
Post.find_each(start: 1, finish: 1) do |post|
|
648
|
+
assert_queries(1) do
|
649
|
+
post.comments.count
|
650
|
+
post.comments.count
|
651
|
+
end
|
652
|
+
end
|
653
|
+
end
|
654
|
+
end
|
655
|
+
|
656
|
+
test ".find_in_batches bypasses the query cache for its own queries" do
|
657
|
+
Post.cache do
|
658
|
+
assert_queries(2) do
|
659
|
+
Post.find_in_batches { }
|
660
|
+
Post.find_in_batches { }
|
661
|
+
end
|
662
|
+
end
|
663
|
+
end
|
664
|
+
|
665
|
+
test ".find_in_batches does not disable the query cache inside the given block" do
|
666
|
+
Post.cache do
|
667
|
+
Post.find_in_batches(start: 1, finish: 1) do |batch|
|
668
|
+
assert_queries(1) do
|
669
|
+
batch.first.comments.count
|
670
|
+
batch.first.comments.count
|
671
|
+
end
|
672
|
+
end
|
673
|
+
end
|
674
|
+
end
|
675
|
+
|
676
|
+
test ".in_batches bypasses the query cache for its own queries" do
|
677
|
+
Post.cache do
|
678
|
+
assert_queries(2) do
|
679
|
+
Post.in_batches { }
|
680
|
+
Post.in_batches { }
|
681
|
+
end
|
682
|
+
end
|
683
|
+
end
|
684
|
+
|
685
|
+
test ".in_batches does not disable the query cache inside the given block" do
|
686
|
+
Post.cache do
|
687
|
+
Post.in_batches(start: 1, finish: 1) do |relation|
|
688
|
+
assert_queries(1) do
|
689
|
+
relation.count
|
690
|
+
relation.count
|
691
|
+
end
|
692
|
+
end
|
487
693
|
end
|
488
694
|
end
|
489
695
|
end
|
data/test/cases/binary_test.rb
CHANGED
@@ -1,44 +1,39 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# Without using prepared statements, it makes no sense to test
|
4
|
-
# BLOB data with DB2, because the length of a statement
|
5
|
-
# is limited to 32KB.
|
6
|
-
unless current_adapter?(:DB2Adapter)
|
7
|
-
require 'models/binary'
|
1
|
+
# frozen_string_literal: true
|
8
2
|
|
9
|
-
|
10
|
-
|
3
|
+
require "cases/helper"
|
4
|
+
require "models/binary"
|
11
5
|
|
12
|
-
|
13
|
-
|
14
|
-
str.force_encoding('ASCII-8BIT')
|
6
|
+
class BinaryTest < ActiveRecord::TestCase
|
7
|
+
FIXTURES = %w(flowers.jpg example.log test.txt)
|
15
8
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
assert_equal str, binary.data
|
9
|
+
def test_mixed_encoding
|
10
|
+
str = +"\x80"
|
11
|
+
str.force_encoding("ASCII-8BIT")
|
20
12
|
|
21
|
-
|
13
|
+
binary = Binary.new name: "いただきます!", data: str
|
14
|
+
binary.save!
|
15
|
+
binary.reload
|
16
|
+
assert_equal str, binary.data
|
22
17
|
|
23
|
-
|
24
|
-
|
18
|
+
name = binary.name
|
19
|
+
assert_equal "いただきます!", name
|
20
|
+
end
|
25
21
|
|
26
|
-
|
27
|
-
|
22
|
+
def test_load_save
|
23
|
+
Binary.delete_all
|
28
24
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
25
|
+
FIXTURES.each do |filename|
|
26
|
+
data = File.read(ASSETS_ROOT + "/#{filename}")
|
27
|
+
data.force_encoding("ASCII-8BIT")
|
28
|
+
data.freeze
|
33
29
|
|
34
|
-
|
35
|
-
|
30
|
+
bin = Binary.new(data: data)
|
31
|
+
assert_equal data, bin.data, "Newly assigned data differs from original"
|
36
32
|
|
37
|
-
|
38
|
-
|
33
|
+
bin.save!
|
34
|
+
assert_equal data, bin.data, "Data differs from original after save"
|
39
35
|
|
40
|
-
|
41
|
-
end
|
36
|
+
assert_equal data, bin.reload.data, "Reloaded data differs from original"
|
42
37
|
end
|
43
38
|
end
|
44
39
|
end
|