ibm_db 5.6.1 → 5.7.0
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/ext/Makefile +13 -9
- data/ext/extconf.rb +176 -110
- data/ext/ibm_db.c +60 -0
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +6 -6
- data/ext/ruby_ibm_db_cli.c +14 -10
- data/ext/ruby_ibm_db_cli.h +4 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/lib/IBM_DB.rb +2 -2
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1254 -277
- data/test/active_record/connection_adapters/fake_legacy_adapter.rb +17 -0
- data/test/active_record/connection_adapters/fake_misleading_legacy_adapter.rb +8 -0
- data/test/activejob/destroy_association_async_job_test.rb +62 -0
- data/test/activejob/destroy_association_async_test.rb +147 -11
- data/test/activejob/job_runtime_test.rb +41 -0
- data/test/activejob/unloadable_base_job.rb +3 -0
- data/test/cases/active_record_schema_test.rb +196 -0
- data/test/cases/active_record_test.rb +21 -0
- data/test/cases/adapter_prevent_writes_test.rb +26 -202
- data/test/cases/adapter_test.rb +592 -82
- data/test/cases/adapters/abstract_mysql_adapter/active_schema_test.rb +210 -0
- data/test/cases/adapters/abstract_mysql_adapter/adapter_prevent_writes_test.rb +111 -0
- data/test/cases/adapters/abstract_mysql_adapter/auto_increment_test.rb +48 -0
- data/test/cases/adapters/abstract_mysql_adapter/bind_parameter_test.rb +91 -0
- data/test/cases/adapters/abstract_mysql_adapter/case_sensitivity_test.rb +65 -0
- data/test/cases/adapters/abstract_mysql_adapter/charset_collation_test.rb +85 -0
- data/test/cases/adapters/abstract_mysql_adapter/connection_test.rb +267 -0
- data/test/cases/adapters/abstract_mysql_adapter/count_deleted_rows_with_lock_test.rb +29 -0
- data/test/cases/adapters/abstract_mysql_adapter/json_test.rb +24 -0
- data/test/cases/adapters/abstract_mysql_adapter/mysql_boolean_test.rb +102 -0
- data/test/cases/adapters/abstract_mysql_adapter/mysql_enum_test.rb +47 -0
- data/test/cases/adapters/abstract_mysql_adapter/mysql_explain_test.rb +71 -0
- data/test/cases/adapters/abstract_mysql_adapter/nested_deadlock_test.rb +191 -0
- data/test/cases/adapters/abstract_mysql_adapter/optimizer_hints_test.rb +69 -0
- data/test/cases/adapters/abstract_mysql_adapter/quoting_test.rb +49 -0
- data/test/cases/adapters/abstract_mysql_adapter/schema_migrations_test.rb +68 -0
- data/test/cases/adapters/abstract_mysql_adapter/schema_test.rb +130 -0
- data/test/cases/adapters/abstract_mysql_adapter/set_test.rb +32 -0
- data/test/cases/adapters/abstract_mysql_adapter/sp_test.rb +39 -0
- data/test/cases/adapters/abstract_mysql_adapter/sql_types_test.rb +16 -0
- data/test/cases/adapters/abstract_mysql_adapter/table_options_test.rb +125 -0
- data/test/cases/adapters/abstract_mysql_adapter/transaction_test.rb +204 -0
- data/test/cases/adapters/abstract_mysql_adapter/unsigned_type_test.rb +77 -0
- data/test/cases/adapters/abstract_mysql_adapter/virtual_column_test.rb +69 -0
- data/test/cases/adapters/abstract_mysql_adapter/warnings_test.rb +109 -0
- data/test/cases/adapters/mysql2/check_constraint_quoting_test.rb +35 -0
- data/test/cases/adapters/mysql2/dbconsole_test.rb +87 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +136 -10
- data/test/cases/adapters/mysql2/mysql2_rake_test.rb +433 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +8 -4
- data/test/cases/adapters/postgresql/array_test.rb +6 -6
- data/test/cases/adapters/postgresql/bind_parameter_test.rb +52 -0
- data/test/cases/adapters/postgresql/bit_string_test.rb +2 -2
- data/test/cases/adapters/postgresql/bytea_test.rb +3 -3
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +1 -1
- data/test/cases/adapters/postgresql/change_schema_test.rb +32 -1
- data/test/cases/adapters/postgresql/cidr_test.rb +17 -0
- data/test/cases/adapters/postgresql/citext_test.rb +7 -1
- data/test/cases/adapters/postgresql/collation_test.rb +1 -1
- data/test/cases/adapters/postgresql/composite_test.rb +1 -1
- data/test/cases/adapters/postgresql/connection_test.rb +43 -36
- data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +3 -2
- data/test/cases/adapters/postgresql/datatype_test.rb +9 -4
- data/test/cases/adapters/postgresql/date_test.rb +2 -2
- data/test/cases/adapters/postgresql/dbconsole_test.rb +109 -0
- data/test/cases/adapters/postgresql/deferred_constraints_test.rb +55 -0
- data/test/cases/adapters/postgresql/domain_test.rb +1 -1
- data/test/cases/adapters/postgresql/enum_test.rb +208 -8
- data/test/cases/adapters/postgresql/explain_test.rb +25 -6
- data/test/cases/adapters/postgresql/extension_migration_test.rb +51 -9
- data/test/cases/adapters/postgresql/foreign_table_test.rb +3 -3
- data/test/cases/adapters/postgresql/full_text_test.rb +1 -1
- data/test/cases/adapters/postgresql/geometric_test.rb +13 -6
- data/test/cases/adapters/postgresql/hstore_test.rb +22 -32
- data/test/cases/adapters/postgresql/infinity_test.rb +13 -2
- data/test/cases/adapters/postgresql/integer_test.rb +1 -1
- data/test/cases/adapters/postgresql/interval_test.rb +9 -17
- data/test/cases/adapters/postgresql/invertible_migration_test.rb +139 -0
- data/test/cases/adapters/postgresql/json_test.rb +5 -0
- data/test/cases/adapters/postgresql/ltree_test.rb +1 -1
- data/test/cases/adapters/postgresql/money_test.rb +17 -9
- data/test/cases/adapters/postgresql/network_test.rb +13 -1
- data/test/cases/adapters/postgresql/numbers_test.rb +18 -2
- data/test/cases/adapters/postgresql/optimizer_hints_test.rb +9 -9
- data/test/cases/adapters/postgresql/partitions_test.rb +5 -2
- data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +7 -110
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +403 -20
- data/test/cases/adapters/postgresql/postgresql_rake_test.rb +637 -0
- data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +1 -1
- data/test/cases/adapters/postgresql/quoting_test.rb +60 -1
- data/test/cases/adapters/postgresql/range_test.rb +185 -21
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +29 -5
- data/test/cases/adapters/postgresql/rename_table_test.rb +35 -8
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +2 -2
- data/test/cases/adapters/postgresql/schema_test.rb +270 -20
- data/test/cases/adapters/postgresql/serial_test.rb +5 -5
- data/test/cases/adapters/postgresql/statement_pool_test.rb +6 -2
- data/test/cases/adapters/postgresql/timestamp_test.rb +122 -5
- data/test/cases/adapters/postgresql/transaction_nested_test.rb +130 -6
- data/test/cases/adapters/postgresql/transaction_test.rb +37 -11
- data/test/cases/adapters/postgresql/type_lookup_test.rb +1 -1
- data/test/cases/adapters/postgresql/uuid_test.rb +77 -9
- data/test/cases/adapters/postgresql/virtual_column_test.rb +114 -0
- data/test/cases/adapters/postgresql/xml_test.rb +1 -1
- data/test/cases/adapters/sqlite3/bind_parameter_test.rb +52 -0
- data/test/cases/adapters/sqlite3/collation_test.rb +1 -1
- data/test/cases/adapters/sqlite3/copy_table_test.rb +28 -7
- data/test/cases/adapters/sqlite3/dbconsole_test.rb +81 -0
- data/test/cases/adapters/sqlite3/explain_test.rb +3 -3
- data/test/cases/adapters/sqlite3/quoting_test.rb +34 -3
- data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +9 -102
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +727 -72
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +6 -3
- data/test/cases/adapters/sqlite3/sqlite_rake_test.rb +264 -0
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +1 -1
- data/test/cases/adapters/sqlite3/transaction_test.rb +6 -3
- data/test/cases/adapters/sqlite3/virtual_column_test.rb +138 -0
- data/test/cases/adapters/sqlite3/virtual_table_test.rb +51 -0
- data/test/cases/adapters/trilogy/dbconsole_test.rb +76 -0
- data/test/cases/adapters/trilogy/trilogy_adapter_test.rb +473 -0
- data/test/cases/adapters/trilogy/trilogy_rake_test.rb +433 -0
- data/test/cases/aggregations_test.rb +16 -0
- data/test/cases/annotate_test.rb +14 -12
- data/test/cases/arel/attributes/attribute_test.rb +86 -47
- data/test/cases/arel/collectors/bind_test.rb +1 -1
- data/test/cases/arel/collectors/composite_test.rb +11 -1
- data/test/cases/arel/collectors/sql_string_test.rb +1 -1
- data/test/cases/arel/collectors/substitute_bind_collector_test.rb +1 -1
- data/test/cases/arel/delete_manager_test.rb +0 -6
- data/test/cases/arel/factory_methods_test.rb +45 -0
- data/test/cases/arel/insert_manager_test.rb +1 -7
- data/test/cases/arel/nodes/as_test.rb +12 -0
- data/test/cases/arel/nodes/ascending_test.rb +1 -1
- data/test/cases/arel/nodes/bin_test.rb +1 -1
- data/test/cases/arel/nodes/bound_sql_literal_test.rb +31 -0
- data/test/cases/arel/nodes/cte_test.rb +46 -0
- data/test/cases/arel/nodes/descending_test.rb +1 -1
- data/test/cases/arel/nodes/equality_test.rb +3 -3
- data/test/cases/arel/nodes/filter_test.rb +37 -0
- data/test/cases/arel/nodes/fragments_test.rb +38 -0
- data/test/cases/arel/nodes/homogeneous_in_test.rb +52 -0
- data/test/cases/arel/nodes/infix_operation_test.rb +1 -1
- data/test/cases/arel/nodes/node_test.rb +1 -1
- data/test/cases/arel/nodes/or_test.rb +2 -2
- data/test/cases/arel/nodes/sql_literal_test.rb +18 -1
- data/test/cases/arel/nodes/table_alias_test.rb +12 -0
- data/test/cases/arel/nodes/unary_operation_test.rb +1 -1
- data/test/cases/arel/nodes/update_statement_test.rb +4 -0
- data/test/cases/arel/nodes_test.rb +3 -2
- data/test/cases/arel/select_manager_test.rb +12 -12
- data/test/cases/arel/support/fake_record.rb +22 -17
- data/test/cases/arel/table_test.rb +15 -25
- data/test/cases/arel/update_manager_test.rb +51 -6
- data/test/cases/arel/visitors/dispatch_contamination_test.rb +1 -1
- data/test/cases/arel/visitors/dot_test.rb +177 -2
- data/test/cases/arel/visitors/mysql_test.rb +49 -1
- data/test/cases/arel/visitors/postgres_test.rb +1 -31
- data/test/cases/arel/visitors/sqlite_test.rb +1 -1
- data/test/cases/arel/visitors/to_sql_test.rb +330 -20
- data/test/cases/assertions/query_assertions_test.rb +136 -0
- data/test/cases/associations/belongs_to_associations_test.rb +502 -41
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +1 -1
- data/test/cases/associations/cascaded_eager_loading_test.rb +26 -15
- data/test/cases/associations/eager_load_nested_include_test.rb +1 -1
- data/test/cases/associations/eager_singularization_test.rb +1 -1
- data/test/cases/associations/eager_test.rb +255 -93
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +25 -53
- data/test/cases/associations/has_many_associations_test.rb +282 -72
- data/test/cases/associations/has_many_through_associations_test.rb +172 -45
- data/test/cases/associations/has_many_through_disable_joins_associations_test.rb +197 -0
- data/test/cases/associations/has_one_associations_test.rb +160 -29
- data/test/cases/associations/has_one_through_associations_test.rb +64 -15
- data/test/cases/associations/has_one_through_disable_joins_associations_test.rb +82 -0
- data/test/cases/associations/inner_join_association_test.rb +36 -6
- data/test/cases/associations/inverse_associations_test.rb +177 -40
- data/test/cases/associations/join_model_test.rb +17 -12
- data/test/cases/associations/left_outer_join_association_test.rb +14 -3
- data/test/cases/associations/nested_error_test.rb +116 -0
- data/test/cases/associations/nested_through_associations_test.rb +54 -19
- data/test/cases/associations/required_test.rb +1 -1
- data/test/cases/associations_test.rb +1278 -21
- data/test/cases/asynchronous_queries_test.rb +310 -0
- data/test/cases/attribute_methods/read_test.rb +6 -0
- data/test/cases/attribute_methods/time_zone_converter_test.rb +21 -0
- data/test/cases/attribute_methods_test.rb +565 -46
- data/test/cases/attributes_test.rb +42 -1
- data/test/cases/autosave_association_test.rb +645 -92
- data/test/cases/base_prevent_writes_test.rb +28 -159
- data/test/cases/base_test.rb +434 -209
- data/test/cases/batches_test.rb +441 -57
- data/test/cases/binary_test.rb +31 -0
- data/test/cases/bind_parameter_test.rb +107 -16
- data/test/cases/cache_key_test.rb +7 -7
- data/test/cases/calculations_test.rb +541 -110
- data/test/cases/callbacks_test.rb +0 -1
- data/test/cases/clone_test.rb +5 -4
- data/test/cases/coders/yaml_column_test.rb +97 -2
- data/test/cases/collection_cache_key_test.rb +24 -16
- data/test/cases/column_alias_test.rb +2 -8
- data/test/cases/column_definition_test.rb +12 -3
- data/test/cases/comment_test.rb +23 -26
- data/test/cases/connection_adapters/adapter_leasing_test.rb +9 -9
- data/test/cases/connection_adapters/connection_handler_test.rb +145 -99
- data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +79 -55
- data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +17 -20
- data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +146 -55
- data/test/cases/connection_adapters/connection_swapping_nested_test.rb +136 -23
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +96 -27
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -5
- data/test/cases/connection_adapters/registration_test.rb +98 -0
- data/test/cases/connection_adapters/schema_cache_test.rb +288 -135
- data/test/cases/connection_adapters/standalone_connection_test.rb +38 -0
- data/test/cases/connection_adapters/statement_pool_test.rb +29 -0
- data/test/cases/connection_adapters/type_lookup_test.rb +12 -24
- data/test/cases/connection_handling_test.rb +210 -0
- data/test/cases/connection_management_test.rb +44 -7
- data/test/cases/connection_pool_test.rb +466 -99
- data/test/cases/core_test.rb +167 -9
- data/test/cases/counter_cache_test.rb +129 -2
- data/test/cases/custom_locking_test.rb +3 -3
- data/test/cases/database_configurations/hash_config_test.rb +149 -13
- data/test/cases/database_configurations/resolver_test.rb +14 -10
- data/test/cases/database_configurations/url_config_test.rb +53 -0
- data/test/cases/database_configurations_test.rb +86 -43
- data/test/cases/database_selector_test.rb +30 -8
- data/test/cases/database_statements_test.rb +10 -14
- data/test/cases/date_time_precision_test.rb +141 -11
- data/test/cases/date_time_test.rb +19 -1
- data/test/cases/defaults_test.rb +107 -41
- data/test/cases/delegated_type_test.rb +69 -9
- data/test/cases/dirty_test.rb +82 -25
- data/test/cases/disconnected_test.rb +10 -9
- data/test/cases/dup_test.rb +26 -6
- data/test/cases/encryption/cipher/aes256_gcm_test.rb +50 -0
- data/test/cases/encryption/cipher_test.rb +65 -0
- data/test/cases/encryption/concurrency_test.rb +27 -0
- data/test/cases/encryption/config_test.rb +21 -0
- data/test/cases/encryption/configurable_test.rb +93 -0
- data/test/cases/encryption/contexts_test.rb +105 -0
- data/test/cases/encryption/derived_secret_key_provider_test.rb +31 -0
- data/test/cases/encryption/deterministic_key_provider_test.rb +11 -0
- data/test/cases/encryption/encryptable_record_api_test.rb +175 -0
- data/test/cases/encryption/encryptable_record_message_pack_serialized_test.rb +42 -0
- data/test/cases/encryption/encryptable_record_test.rb +470 -0
- data/test/cases/encryption/encrypted_fixtures_test.rb +22 -0
- data/test/cases/encryption/encrypting_only_encryptor_test.rb +20 -0
- data/test/cases/encryption/encryption_schemes_test.rb +240 -0
- data/test/cases/encryption/encryptor_test.rb +113 -0
- data/test/cases/encryption/envelope_encryption_key_provider_test.rb +49 -0
- data/test/cases/encryption/extended_deterministic_queries_test.rb +81 -0
- data/test/cases/encryption/helper.rb +152 -0
- data/test/cases/encryption/key_generator_test.rb +55 -0
- data/test/cases/encryption/key_provider_test.rb +57 -0
- data/test/cases/encryption/key_test.rb +17 -0
- data/test/cases/encryption/message_pack_message_serializer_test.rb +70 -0
- data/test/cases/encryption/message_serializer_test.rb +82 -0
- data/test/cases/encryption/message_test.rb +43 -0
- data/test/cases/encryption/null_encryptor_test.rb +21 -0
- data/test/cases/encryption/properties_test.rb +69 -0
- data/test/cases/encryption/read_only_null_encryptor_test.rb +19 -0
- data/test/cases/encryption/scheme_test.rb +58 -0
- data/test/cases/encryption/unencrypted_attributes_test.rb +27 -0
- data/test/cases/encryption/uniqueness_validations_test.rb +65 -0
- data/test/cases/enum_test.rb +374 -72
- data/test/cases/errors_test.rb +7 -4
- data/test/cases/excluding_test.rb +116 -0
- data/test/cases/explain_subscriber_test.rb +6 -1
- data/test/cases/explain_test.rb +119 -10
- data/test/cases/filter_attributes_test.rb +7 -14
- data/test/cases/finder_respond_to_test.rb +3 -3
- data/test/cases/finder_test.rb +357 -72
- data/test/cases/fixture_set/file_test.rb +9 -0
- data/test/cases/fixtures_test.rb +426 -190
- data/test/cases/helper.rb +66 -192
- data/test/cases/hot_compatibility_test.rb +10 -10
- data/test/cases/inheritance_test.rb +51 -61
- data/test/cases/inherited_test.rb +40 -0
- data/test/cases/insert_all_test.rb +419 -9
- data/test/cases/instrumentation_test.rb +202 -30
- data/test/cases/integration_test.rb +25 -7
- data/test/cases/invalid_connection_test.rb +5 -5
- data/test/cases/invertible_migration_test.rb +108 -24
- data/test/cases/json_attribute_test.rb +1 -0
- data/test/cases/json_serialization_test.rb +5 -5
- data/test/cases/json_shared_test_cases.rb +5 -9
- data/test/cases/locking_test.rb +67 -31
- data/test/cases/log_subscriber_test.rb +17 -15
- data/test/cases/marshal_serialization_test.rb +78 -5
- data/test/cases/message_pack_test.rb +91 -0
- data/test/cases/migration/change_schema_test.rb +77 -46
- data/test/cases/migration/change_table_test.rb +129 -114
- data/test/cases/migration/check_constraint_test.rb +192 -10
- data/test/cases/migration/column_attributes_test.rb +4 -9
- data/test/cases/migration/column_positioning_test.rb +2 -2
- data/test/cases/migration/columns_test.rb +118 -4
- data/test/cases/migration/command_recorder_test.rb +181 -14
- data/test/cases/migration/compatibility_test.rb +883 -196
- data/test/cases/migration/create_join_table_test.rb +8 -1
- data/test/cases/migration/exclusion_constraint_test.rb +192 -0
- data/test/cases/migration/foreign_key_test.rb +356 -14
- data/test/cases/migration/helper.rb +4 -1
- data/test/cases/migration/index_test.rb +67 -2
- data/test/cases/migration/invalid_options_test.rb +129 -0
- data/test/cases/migration/logger_test.rb +7 -4
- data/test/cases/migration/pending_migrations_test.rb +103 -60
- data/test/cases/migration/references_foreign_key_test.rb +73 -4
- data/test/cases/migration/references_index_test.rb +25 -27
- data/test/cases/migration/references_statements_test.rb +27 -3
- data/test/cases/migration/rename_table_test.rb +39 -54
- data/test/cases/migration/schema_definitions_test.rb +109 -0
- data/test/cases/migration/unique_constraint_test.rb +248 -0
- data/test/cases/migration_test.rb +677 -220
- data/test/cases/migrator_test.rb +102 -75
- data/test/cases/multi_db_migrator_test.rb +55 -34
- data/test/cases/multiparameter_attributes_test.rb +26 -29
- data/test/cases/multiple_db_test.rb +42 -19
- data/test/cases/nested_attributes_test.rb +124 -6
- data/test/cases/nested_attributes_with_callbacks_test.rb +2 -2
- data/test/cases/normalized_attribute_test.rb +117 -0
- data/test/cases/null_relation_test.rb +35 -2
- data/test/cases/persistence/reload_association_cache_test.rb +20 -0
- data/test/cases/persistence_test.rb +629 -22
- data/test/cases/pooled_connections_test.rb +57 -56
- data/test/cases/prepared_statement_status_test.rb +8 -3
- data/test/cases/primary_class_test.rb +134 -0
- data/test/cases/primary_keys_test.rb +171 -55
- data/test/cases/query_cache_test.rb +558 -263
- data/test/cases/query_logs_test.rb +293 -0
- data/test/cases/quoting_test.rb +39 -72
- data/test/cases/readonly_test.rb +50 -12
- data/test/cases/reaper_test.rb +22 -6
- data/test/cases/reflection_test.rb +207 -9
- data/test/cases/relation/and_test.rb +43 -0
- data/test/cases/relation/delegation_test.rb +32 -5
- data/test/cases/relation/delete_all_test.rb +27 -6
- data/test/cases/relation/field_ordered_values_test.rb +128 -0
- data/test/cases/relation/load_async_test.rb +650 -0
- data/test/cases/relation/merging_test.rb +80 -109
- data/test/cases/relation/mutation_test.rb +12 -7
- data/test/cases/relation/or_test.rb +11 -8
- data/test/cases/relation/order_test.rb +90 -0
- data/test/cases/relation/predicate_builder_test.rb +21 -6
- data/test/cases/relation/select_test.rb +162 -3
- data/test/cases/relation/structural_compatibility_test.rb +38 -0
- data/test/cases/relation/update_all_test.rb +81 -27
- data/test/cases/relation/where_chain_test.rb +190 -3
- data/test/cases/relation/where_clause_test.rb +43 -1
- data/test/cases/relation/where_test.rb +95 -7
- data/test/cases/relation/with_test.rb +165 -0
- data/test/cases/relation_test.rb +42 -37
- data/test/cases/relations_test.rb +436 -138
- data/test/cases/reload_models_test.rb +18 -14
- data/test/cases/reserved_word_test.rb +2 -1
- data/test/cases/result_test.rb +14 -22
- data/test/cases/sanitize_test.rb +89 -27
- data/test/cases/schema_dumper_test.rb +535 -62
- data/test/cases/scoping/default_scoping_test.rb +219 -35
- data/test/cases/scoping/named_scoping_test.rb +25 -46
- data/test/cases/scoping/relation_scoping_test.rb +112 -4
- data/test/cases/secure_password_test.rb +108 -0
- data/test/cases/secure_token_test.rb +72 -0
- data/test/cases/serialization_test.rb +1 -1
- data/test/cases/serialized_attribute_test.rb +305 -60
- data/test/cases/shard_keys_test.rb +125 -0
- data/test/cases/shard_selector_test.rb +45 -0
- data/test/cases/signed_id_test.rb +57 -5
- data/test/cases/statement_cache_test.rb +31 -30
- data/test/cases/statement_invalid_test.rb +8 -4
- data/test/cases/store_test.rb +73 -9
- data/test/cases/strict_loading_test.rb +327 -13
- data/test/cases/table_metadata_test.rb +16 -0
- data/test/cases/tasks/database_tasks_test.rb +517 -244
- data/test/cases/test_case.rb +254 -60
- data/test/cases/test_case_test.rb +69 -0
- data/test/cases/test_databases_test.rb +7 -3
- data/test/cases/test_fixtures_test.rb +19 -40
- data/test/cases/time_precision_test.rb +17 -5
- data/test/cases/timestamp_test.rb +124 -16
- data/test/cases/token_for_test.rb +165 -0
- data/test/cases/touch_later_test.rb +43 -1
- data/test/cases/transaction_callbacks_test.rb +325 -8
- data/test/cases/transaction_instrumentation_test.rb +453 -0
- data/test/cases/transaction_isolation_test.rb +12 -8
- data/test/cases/transactions_test.rb +629 -112
- data/test/cases/type/date_time_test.rb +7 -1
- data/test/cases/type/time_test.rb +9 -0
- data/test/cases/type/type_map_test.rb +108 -73
- data/test/cases/type/unsigned_integer_test.rb +12 -0
- data/test/cases/type_caster/connection_test.rb +19 -0
- data/test/cases/type_test.rb +1 -1
- data/test/cases/unconnected_test.rb +7 -7
- data/test/cases/unsafe_raw_sql_test.rb +39 -8
- data/test/cases/validations/absence_validation_test.rb +1 -1
- data/test/cases/validations/association_validation_test.rb +25 -3
- data/test/cases/validations/numericality_validation_test.rb +3 -9
- data/test/cases/validations/presence_validation_test.rb +1 -1
- data/test/cases/validations/uniqueness_validation_test.rb +280 -40
- data/test/cases/validations_test.rb +2 -2
- data/test/cases/view_test.rb +33 -22
- data/test/cases/yaml_serialization_test.rb +23 -17
- data/test/config.example.yml +58 -56
- data/test/config.rb +1 -0
- data/test/fixtures/1_need_quoting.yml +2 -0
- data/test/fixtures/accounts.yml +5 -0
- data/test/fixtures/aircrafts.yml +7 -0
- data/test/fixtures/book_identifiers.yml +11 -0
- data/test/fixtures/books.yml +5 -4
- data/test/fixtures/cake_designers.yml +5 -0
- data/test/fixtures/cars.yml +6 -0
- data/test/fixtures/chefs.yml +5 -0
- data/test/fixtures/clothing_items.yml +23 -0
- data/test/fixtures/clubs.yml +1 -1
- data/test/fixtures/comments.yml +2 -1
- data/test/fixtures/cpk_authors.yml +8 -0
- data/test/fixtures/cpk_books.yml +21 -0
- data/test/fixtures/cpk_order_agreements.yml +13 -0
- data/test/fixtures/cpk_order_tags.yml +15 -0
- data/test/fixtures/cpk_orders.yml +11 -0
- data/test/fixtures/cpk_posts.yml +12 -0
- data/test/fixtures/cpk_reviews.yml +13 -0
- data/test/fixtures/cpk_tags.yml +11 -0
- data/test/fixtures/drink_designers.yml +5 -0
- data/test/fixtures/encrypted_book_that_ignores_cases.yml +4 -0
- data/test/fixtures/encrypted_books.yml +4 -0
- data/test/fixtures/fk_object_to_point_to.yml +2 -0
- data/test/fixtures/memberships.yml +15 -15
- data/test/fixtures/paragraphs.yml +5 -0
- data/test/fixtures/parrots.yml +4 -0
- data/test/fixtures/people.yml +2 -0
- data/test/fixtures/pirates.yml +2 -2
- data/test/fixtures/primary_key_error/primary_key_error.yml +6 -0
- data/test/fixtures/references.yml +3 -3
- data/test/fixtures/sharded_blog_posts.yml +14 -0
- data/test/fixtures/sharded_blog_posts_tags.yml +27 -0
- data/test/fixtures/sharded_blogs.yml +8 -0
- data/test/fixtures/sharded_comments.yml +22 -0
- data/test/fixtures/sharded_tags.yml +34 -0
- data/test/fixtures/sponsors.yml +2 -2
- data/test/fixtures/topics.yml +1 -0
- data/test/fixtures/treasures.yml +4 -0
- data/test/fixtures/virtual_columns.yml +5 -0
- data/test/fixtures/warehouse_things.yml +1 -1
- data/test/migrations/old_and_new_versions/20210716122844_add_people_description.rb +5 -0
- data/test/migrations/old_and_new_versions/20210716123013_add_people_number_of_legs.rb +5 -0
- data/test/migrations/old_and_new_versions/230_add_people_hobby.rb +5 -0
- data/test/migrations/old_and_new_versions/231_add_people_last_name.rb +5 -0
- data/test/migrations/scope/1_unscoped.rb +7 -0
- data/test/migrations/scope/2_mysql_only.mysql.rb +7 -0
- data/test/models/admin/user.rb +2 -0
- data/test/models/admin/user_json.rb +48 -0
- data/test/models/attachment.rb +7 -0
- data/test/models/author.rb +70 -3
- data/test/models/author_encrypted.rb +16 -0
- data/test/models/bird.rb +1 -1
- data/test/models/book.rb +18 -11
- data/test/models/book_destroy_async.rb +1 -1
- data/test/models/book_encrypted.rb +106 -0
- data/test/models/book_identifier.rb +5 -0
- data/test/models/branch.rb +11 -0
- data/test/models/bulb.rb +1 -1
- data/test/models/car.rb +8 -1
- data/test/models/cat.rb +1 -1
- data/test/models/category.rb +3 -1
- data/test/models/chat_message.rb +8 -0
- data/test/models/chef.rb +52 -0
- data/test/models/clothing_item.rb +12 -0
- data/test/models/club.rb +4 -1
- data/test/models/comment.rb +7 -4
- data/test/models/comment_overlapping_counter_cache.rb +15 -0
- data/test/models/company.rb +16 -2
- data/test/models/computer.rb +1 -0
- data/test/models/contact.rb +3 -3
- data/test/models/contract.rb +5 -1
- data/test/models/cpk/author.rb +9 -0
- data/test/models/cpk/book.rb +55 -0
- data/test/models/cpk/book_destroy_async.rb +9 -0
- data/test/models/cpk/car.rb +9 -0
- data/test/models/cpk/car_review.rb +9 -0
- data/test/models/cpk/chapter.rb +16 -0
- data/test/models/cpk/chapter_destroy_async.rb +10 -0
- data/test/models/cpk/comment.rb +9 -0
- data/test/models/cpk/order.rb +55 -0
- data/test/models/cpk/order_agreement.rb +10 -0
- data/test/models/cpk/order_tag.rb +10 -0
- data/test/models/cpk/post.rb +10 -0
- data/test/models/cpk/posts_tag.rb +10 -0
- data/test/models/cpk/review.rb +9 -0
- data/test/models/cpk/tag.rb +10 -0
- data/test/models/cpk.rb +15 -0
- data/test/models/customer.rb +3 -1
- data/test/models/destroy_async_parent.rb +1 -1
- data/test/models/developer.rb +44 -3
- data/test/models/discount.rb +4 -0
- data/test/models/drink_designer.rb +1 -0
- data/test/models/editor.rb +8 -0
- data/test/models/editorship.rb +6 -0
- data/test/models/entry.rb +5 -0
- data/test/models/essay.rb +6 -1
- data/test/models/essay_destroy_async.rb +1 -0
- data/test/models/eye.rb +87 -21
- data/test/models/face.rb +1 -1
- data/test/models/friendship.rb +3 -0
- data/test/models/hardback.rb +7 -0
- data/test/models/hotel.rb +2 -0
- data/test/models/human.rb +2 -2
- data/test/models/invoice.rb +2 -1
- data/test/models/invokes_an_undefined_method.rb +5 -0
- data/test/models/line_item.rb +6 -0
- data/test/models/member.rb +9 -4
- data/test/models/membership.rb +2 -2
- data/test/models/message.rb +2 -1
- data/test/models/need_quoting.rb +5 -0
- data/test/models/paragraph.rb +5 -0
- data/test/models/parrot.rb +6 -3
- data/test/models/person.rb +7 -4
- data/test/models/pirate.rb +4 -1
- data/test/models/pk_autopopulated_by_a_trigger_record.rb +5 -0
- data/test/models/post.rb +65 -2
- data/test/models/post_encrypted.rb +15 -0
- data/test/models/post_with_prefetched_pk.rb +15 -0
- data/test/models/project.rb +1 -0
- data/test/models/publication.rb +16 -0
- data/test/models/raises_argument_error.rb +5 -0
- data/test/models/raises_no_method_error.rb +5 -0
- data/test/models/recipient.rb +5 -0
- data/test/models/reference.rb +1 -1
- data/test/models/reply.rb +1 -1
- data/test/models/room.rb +3 -0
- data/test/models/sharded/blog.rb +12 -0
- data/test/models/sharded/blog_post.rb +17 -0
- data/test/models/sharded/blog_post_destroy_async.rb +14 -0
- data/test/models/sharded/blog_post_tag.rb +11 -0
- data/test/models/sharded/blog_post_with_revision.rb +11 -0
- data/test/models/sharded/comment.rb +12 -0
- data/test/models/sharded/comment_destroy_async.rb +12 -0
- data/test/models/sharded/tag.rb +11 -0
- data/test/models/sharded.rb +8 -0
- data/test/models/ship.rb +1 -1
- data/test/models/shipping_line.rb +11 -0
- data/test/models/subscriber.rb +1 -0
- data/test/models/subscription.rb +3 -1
- data/test/models/too_long_table_name.rb +5 -0
- data/test/models/topic.rb +3 -1
- data/test/models/traffic_light.rb +2 -2
- data/test/models/traffic_light_encrypted.rb +21 -0
- data/test/models/translation.rb +9 -0
- data/test/models/treasure.rb +1 -1
- data/test/models/tyre.rb +1 -1
- data/test/models/user.rb +16 -0
- data/test/models/user_with_invalid_relation.rb +28 -0
- data/test/models/uuid_comment.rb +5 -0
- data/test/models/uuid_entry.rb +5 -0
- data/test/models/uuid_message.rb +5 -0
- data/test/models/zine.rb +2 -1
- data/test/schema/mysql2_specific_schema.rb +26 -12
- data/test/schema/postgresql_specific_schema.rb +121 -13
- data/test/schema/schema.rb +361 -103
- data/test/schema/sqlite_specific_schema.rb +17 -6
- data/test/schema/trilogy_specific_schema.rb +96 -0
- data/test/support/adapter_helper.rb +104 -0
- data/test/support/async_helper.rb +15 -0
- data/test/support/config.rb +1 -1
- data/test/support/connection.rb +14 -2
- data/test/support/ddl_helper.rb +1 -1
- data/test/support/fake_adapter.rb +42 -0
- data/test/support/load_schema_helper.rb +22 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic_associations.dump +0 -0
- data/test/support/schema_dumping_helper.rb +15 -9
- data/test/support/tools.rb +37 -0
- data/test/support/yaml_compatibility_fixtures/rails_4_1_no_symbol.yml +22 -0
- metadata +247 -15
|
@@ -9,10 +9,16 @@ module ActiveRecord
|
|
|
9
9
|
attr_reader :connection
|
|
10
10
|
self.use_transactional_tests = false
|
|
11
11
|
|
|
12
|
+
class TestModel < ActiveRecord::Base
|
|
13
|
+
self.table_name = :testings
|
|
14
|
+
end
|
|
15
|
+
|
|
12
16
|
def setup
|
|
13
17
|
super
|
|
14
|
-
@connection = ActiveRecord::Base.
|
|
15
|
-
@
|
|
18
|
+
@connection = ActiveRecord::Base.lease_connection
|
|
19
|
+
@pool = ActiveRecord::Base.connection_pool
|
|
20
|
+
@schema_migration = @pool.schema_migration
|
|
21
|
+
@internal_metadata = @pool.internal_metadata
|
|
16
22
|
@verbose_was = ActiveRecord::Migration.verbose
|
|
17
23
|
ActiveRecord::Migration.verbose = false
|
|
18
24
|
|
|
@@ -25,7 +31,7 @@ module ActiveRecord
|
|
|
25
31
|
teardown do
|
|
26
32
|
connection.drop_table :testings rescue nil
|
|
27
33
|
ActiveRecord::Migration.verbose = @verbose_was
|
|
28
|
-
|
|
34
|
+
@schema_migration.delete_all_versions rescue nil
|
|
29
35
|
end
|
|
30
36
|
|
|
31
37
|
def test_migration_doesnt_remove_named_index
|
|
@@ -39,7 +45,7 @@ module ActiveRecord
|
|
|
39
45
|
}.new
|
|
40
46
|
|
|
41
47
|
assert connection.index_exists?(:testings, :foo, name: "custom_index_name")
|
|
42
|
-
assert_raise(StandardError) { ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate }
|
|
48
|
+
assert_raise(StandardError) { ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate }
|
|
43
49
|
assert connection.index_exists?(:testings, :foo, name: "custom_index_name")
|
|
44
50
|
end
|
|
45
51
|
|
|
@@ -54,13 +60,14 @@ module ActiveRecord
|
|
|
54
60
|
}.new
|
|
55
61
|
|
|
56
62
|
assert connection.index_exists?(:testings, :bar)
|
|
57
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
63
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
58
64
|
assert_not connection.index_exists?(:testings, :bar)
|
|
59
65
|
end
|
|
60
66
|
|
|
61
67
|
def test_references_does_not_add_index_by_default
|
|
62
68
|
migration = Class.new(ActiveRecord::Migration[4.2]) {
|
|
63
69
|
def migrate(x)
|
|
70
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
64
71
|
create_table :more_testings do |t|
|
|
65
72
|
t.references :foo
|
|
66
73
|
t.belongs_to :bar, index: false
|
|
@@ -68,7 +75,7 @@ module ActiveRecord
|
|
|
68
75
|
end
|
|
69
76
|
}.new
|
|
70
77
|
|
|
71
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
78
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
72
79
|
|
|
73
80
|
assert_not connection.index_exists?(:more_testings, :foo_id)
|
|
74
81
|
assert_not connection.index_exists?(:more_testings, :bar_id)
|
|
@@ -79,13 +86,14 @@ module ActiveRecord
|
|
|
79
86
|
def test_timestamps_have_null_constraints_if_not_present_in_migration_of_create_table
|
|
80
87
|
migration = Class.new(ActiveRecord::Migration[4.2]) {
|
|
81
88
|
def migrate(x)
|
|
89
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
82
90
|
create_table :more_testings do |t|
|
|
83
91
|
t.timestamps
|
|
84
92
|
end
|
|
85
93
|
end
|
|
86
94
|
}.new
|
|
87
95
|
|
|
88
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
96
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
89
97
|
|
|
90
98
|
assert connection.column_exists?(:more_testings, :created_at, null: true)
|
|
91
99
|
assert connection.column_exists?(:more_testings, :updated_at, null: true)
|
|
@@ -102,13 +110,13 @@ module ActiveRecord
|
|
|
102
110
|
end
|
|
103
111
|
}.new
|
|
104
112
|
|
|
105
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
113
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
106
114
|
|
|
107
115
|
assert connection.column_exists?(:testings, :created_at, null: true)
|
|
108
116
|
assert connection.column_exists?(:testings, :updated_at, null: true)
|
|
109
117
|
end
|
|
110
118
|
|
|
111
|
-
if ActiveRecord::Base.
|
|
119
|
+
if ActiveRecord::Base.lease_connection.supports_bulk_alter?
|
|
112
120
|
def test_timestamps_have_null_constraints_if_not_present_in_migration_of_change_table_with_bulk
|
|
113
121
|
migration = Class.new(ActiveRecord::Migration[4.2]) {
|
|
114
122
|
def migrate(x)
|
|
@@ -118,7 +126,7 @@ module ActiveRecord
|
|
|
118
126
|
end
|
|
119
127
|
}.new
|
|
120
128
|
|
|
121
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
129
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
122
130
|
|
|
123
131
|
assert connection.column_exists?(:testings, :created_at, null: true)
|
|
124
132
|
assert connection.column_exists?(:testings, :updated_at, null: true)
|
|
@@ -132,7 +140,7 @@ module ActiveRecord
|
|
|
132
140
|
end
|
|
133
141
|
}.new
|
|
134
142
|
|
|
135
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
143
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
136
144
|
|
|
137
145
|
assert connection.column_exists?(:testings, :created_at, null: true)
|
|
138
146
|
assert connection.column_exists?(:testings, :updated_at, null: true)
|
|
@@ -141,16 +149,17 @@ module ActiveRecord
|
|
|
141
149
|
def test_timestamps_doesnt_set_precision_on_create_table
|
|
142
150
|
migration = Class.new(ActiveRecord::Migration[5.2]) {
|
|
143
151
|
def migrate(x)
|
|
152
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
144
153
|
create_table :more_testings do |t|
|
|
145
154
|
t.timestamps
|
|
146
155
|
end
|
|
147
156
|
end
|
|
148
157
|
}.new
|
|
149
158
|
|
|
150
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
159
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
151
160
|
|
|
152
|
-
|
|
153
|
-
|
|
161
|
+
assert_timestamp_precision_implicit(:more_testings, :created_at)
|
|
162
|
+
assert_timestamp_precision_implicit(:more_testings, :updated_at)
|
|
154
163
|
ensure
|
|
155
164
|
connection.drop_table :more_testings rescue nil
|
|
156
165
|
end
|
|
@@ -164,13 +173,13 @@ module ActiveRecord
|
|
|
164
173
|
end
|
|
165
174
|
}.new
|
|
166
175
|
|
|
167
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
176
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
168
177
|
|
|
169
|
-
|
|
170
|
-
|
|
178
|
+
assert_timestamp_precision_implicit(:testings, :created_at)
|
|
179
|
+
assert_timestamp_precision_implicit(:testings, :updated_at)
|
|
171
180
|
end
|
|
172
181
|
|
|
173
|
-
if ActiveRecord::Base.
|
|
182
|
+
if ActiveRecord::Base.lease_connection.supports_bulk_alter?
|
|
174
183
|
def test_timestamps_doesnt_set_precision_on_change_table_with_bulk
|
|
175
184
|
migration = Class.new(ActiveRecord::Migration[5.2]) {
|
|
176
185
|
def migrate(x)
|
|
@@ -180,7 +189,7 @@ module ActiveRecord
|
|
|
180
189
|
end
|
|
181
190
|
}.new
|
|
182
191
|
|
|
183
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
192
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
184
193
|
|
|
185
194
|
assert connection.column_exists?(:testings, :created_at, null: false, **precision_implicit_default)
|
|
186
195
|
assert connection.column_exists?(:testings, :updated_at, null: false, **precision_implicit_default)
|
|
@@ -194,24 +203,25 @@ module ActiveRecord
|
|
|
194
203
|
end
|
|
195
204
|
}.new
|
|
196
205
|
|
|
197
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
206
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
198
207
|
|
|
199
|
-
|
|
200
|
-
|
|
208
|
+
assert_timestamp_precision_implicit(:testings, :created_at)
|
|
209
|
+
assert_timestamp_precision_implicit(:testings, :updated_at)
|
|
201
210
|
end
|
|
202
211
|
|
|
203
212
|
def test_legacy_migrations_raises_exception_when_inherited
|
|
204
213
|
e = assert_raises(StandardError) do
|
|
205
214
|
class_eval("class LegacyMigration < ActiveRecord::Migration; end")
|
|
206
215
|
end
|
|
207
|
-
assert_match(/LegacyMigration < ActiveRecord::Migration\[
|
|
216
|
+
assert_match(/LegacyMigration < ActiveRecord::Migration\[\d\.\d\]/, e.message)
|
|
208
217
|
end
|
|
209
218
|
|
|
210
219
|
def test_legacy_migrations_not_raise_exception_on_reverting_transaction
|
|
211
220
|
migration = Class.new(ActiveRecord::Migration[5.2]) {
|
|
212
221
|
def change
|
|
213
222
|
transaction do
|
|
214
|
-
|
|
223
|
+
sql = connection.adapter_name == "IBM_DB" ? "select 1 from SYSIBM.DUAL" : "select 1"
|
|
224
|
+
execute sql
|
|
215
225
|
end
|
|
216
226
|
end
|
|
217
227
|
}.new
|
|
@@ -221,7 +231,7 @@ module ActiveRecord
|
|
|
221
231
|
end
|
|
222
232
|
end
|
|
223
233
|
|
|
224
|
-
if ActiveRecord::Base.
|
|
234
|
+
if ActiveRecord::Base.lease_connection.supports_comments?
|
|
225
235
|
def test_change_column_comment_can_be_reverted
|
|
226
236
|
migration = Class.new(ActiveRecord::Migration[5.2]) {
|
|
227
237
|
def migrate(x)
|
|
@@ -231,11 +241,13 @@ module ActiveRecord
|
|
|
231
241
|
end
|
|
232
242
|
}.new
|
|
233
243
|
|
|
234
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
244
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
235
245
|
assert connection.column_exists?(:testings, :foo, comment: "comment")
|
|
236
246
|
end
|
|
237
247
|
|
|
238
248
|
def test_change_table_comment_can_be_reverted
|
|
249
|
+
skip "DB2 does not reliably round-trip table comments in compatibility revert paths" if current_adapter?(:IBM_DBAdapter)
|
|
250
|
+
|
|
239
251
|
migration = Class.new(ActiveRecord::Migration[5.2]) {
|
|
240
252
|
def migrate(x)
|
|
241
253
|
revert do
|
|
@@ -244,12 +256,30 @@ module ActiveRecord
|
|
|
244
256
|
end
|
|
245
257
|
}.new
|
|
246
258
|
|
|
247
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
259
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
248
260
|
|
|
249
261
|
assert_equal "comment", connection.table_comment("testings")
|
|
250
262
|
end
|
|
251
263
|
end
|
|
252
264
|
|
|
265
|
+
def test_create_table_allows_duplicate_column_names
|
|
266
|
+
migration = Class.new(ActiveRecord::Migration[5.2]) {
|
|
267
|
+
def migrate(x)
|
|
268
|
+
create_table :tests do |t|
|
|
269
|
+
t.integer :some_id
|
|
270
|
+
t.string :some_id
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
}.new
|
|
274
|
+
|
|
275
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
276
|
+
|
|
277
|
+
column = connection.columns(:tests).find { |column| column.name == "some_id" }
|
|
278
|
+
assert_equal :string, column.type
|
|
279
|
+
ensure
|
|
280
|
+
connection.drop_table :tests, if_exists: true
|
|
281
|
+
end
|
|
282
|
+
|
|
253
283
|
if current_adapter?(:PostgreSQLAdapter)
|
|
254
284
|
class Testing < ActiveRecord::Base
|
|
255
285
|
end
|
|
@@ -262,60 +292,413 @@ module ActiveRecord
|
|
|
262
292
|
}.new
|
|
263
293
|
|
|
264
294
|
Testing.create!
|
|
265
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
295
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
266
296
|
assert_equal ["foobar"], Testing.all.map(&:foo)
|
|
267
297
|
ensure
|
|
268
298
|
ActiveRecord::Base.clear_cache!
|
|
269
299
|
end
|
|
270
300
|
end
|
|
271
301
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
302
|
+
def test_timestamps_sets_default_precision_on_create_table
|
|
303
|
+
migration = Class.new(ActiveRecord::Migration[6.1]) {
|
|
304
|
+
def migrate(x)
|
|
305
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
306
|
+
create_table :more_testings do |t|
|
|
307
|
+
t.timestamps
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
}.new
|
|
311
|
+
|
|
312
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
313
|
+
|
|
314
|
+
assert connection.column_exists?(:more_testings, :created_at, precision: 6)
|
|
315
|
+
assert connection.column_exists?(:more_testings, :updated_at, precision: 6)
|
|
316
|
+
ensure
|
|
317
|
+
connection.drop_table :more_testings rescue nil
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
def test_datetime_doesnt_set_precision_on_add_column_5_0
|
|
321
|
+
migration = Class.new(ActiveRecord::Migration[5.0]) {
|
|
322
|
+
def migrate(x)
|
|
323
|
+
add_column :testings, :published_at, :datetime, default: Time.now
|
|
324
|
+
end
|
|
325
|
+
}.new
|
|
326
|
+
|
|
327
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
328
|
+
|
|
329
|
+
assert_datetime_precision_implicit(:testings, :published_at)
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
def test_datetime_doesnt_set_precision_on_add_column_6_1
|
|
333
|
+
migration = Class.new(ActiveRecord::Migration[6.1]) {
|
|
334
|
+
def migrate(x)
|
|
335
|
+
add_column :testings, :published_at, :datetime, default: Time.now
|
|
336
|
+
end
|
|
337
|
+
}.new
|
|
338
|
+
|
|
339
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
340
|
+
|
|
341
|
+
assert_datetime_precision_implicit(:testings, :published_at)
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
def test_change_table_allows_if_exists_option_on_7_0
|
|
345
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) {
|
|
346
|
+
def migrate(x)
|
|
347
|
+
change_table(:testings) do |t|
|
|
348
|
+
t.remove :foo, if_exists: true
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
}.new
|
|
352
|
+
|
|
353
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
354
|
+
|
|
355
|
+
assert_not connection.column_exists?(:testings, :foo)
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
def test_add_reference_allows_if_exists_option_on_7_0
|
|
359
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) {
|
|
360
|
+
def migrate(x)
|
|
361
|
+
add_reference :testings, :widget, if_not_exists: true
|
|
362
|
+
end
|
|
363
|
+
}.new
|
|
364
|
+
|
|
365
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
366
|
+
|
|
367
|
+
assert connection.column_exists?(:testings, :widget_id)
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
def test_references_on_create_table_on_6_0
|
|
371
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
372
|
+
migration = Class.new(ActiveRecord::Migration[6.0]) {
|
|
373
|
+
def migrate(x)
|
|
374
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
375
|
+
create_table :more_testings do |t|
|
|
376
|
+
t.references :testings
|
|
377
|
+
end
|
|
378
|
+
end
|
|
379
|
+
}.new
|
|
380
|
+
|
|
381
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
382
|
+
|
|
383
|
+
column = connection.columns(:more_testings).find { |el| el.name == "testings_id" }
|
|
384
|
+
|
|
385
|
+
if current_adapter?(:SQLite3Adapter, :IBM_DBAdapter)
|
|
386
|
+
assert_match(/integer/i, column.sql_type)
|
|
387
|
+
else
|
|
388
|
+
assert_predicate(column, :bigint?)
|
|
389
|
+
end
|
|
390
|
+
ensure
|
|
391
|
+
connection.drop_table :more_testings rescue nil
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
def test_add_index_errors_on_too_long_name_7_0
|
|
395
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) {
|
|
396
|
+
def migrate(x)
|
|
397
|
+
add_column :testings, :very_long_column_name_to_test_with, :string
|
|
398
|
+
add_index :testings, [:foo, :bar, :very_long_column_name_to_test_with]
|
|
399
|
+
end
|
|
400
|
+
}.new
|
|
401
|
+
|
|
402
|
+
error = assert_raises(StandardError) do
|
|
403
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
assert_match(/index_testings_on_foo_and_bar_and_very_long_column_name_to_test_with/i, error.message)
|
|
407
|
+
assert_match(/is too long/i, error.message)
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
def test_create_table_add_index_errors_on_too_long_name_7_0
|
|
411
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) {
|
|
412
|
+
def migrate(x)
|
|
413
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
414
|
+
create_table :more_testings do |t|
|
|
415
|
+
t.integer :foo
|
|
416
|
+
t.integer :bar
|
|
417
|
+
t.integer :very_long_column_name_to_test_with
|
|
418
|
+
t.index [:foo, :bar, :very_long_column_name_to_test_with]
|
|
419
|
+
end
|
|
420
|
+
end
|
|
421
|
+
}.new
|
|
422
|
+
|
|
423
|
+
error = assert_raises(StandardError) do
|
|
424
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
assert_match(/index_more_testings_on_foo_and_bar_and_very_long_column_name_to_test_with/i, error.message)
|
|
428
|
+
assert_match(/is too long/i, error.message)
|
|
429
|
+
ensure
|
|
430
|
+
connection.drop_table :more_testings rescue nil
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
def test_rename_table_errors_on_too_long_index_name_7_0
|
|
434
|
+
skip "DB2 auto-adjusts index naming on table rename and does not raise long-index-name errors" if current_adapter?(:IBM_DBAdapter)
|
|
435
|
+
|
|
436
|
+
long_table_name = "a" * connection.table_name_length
|
|
437
|
+
|
|
438
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) {
|
|
439
|
+
def migrate(x)
|
|
440
|
+
add_index :testings, :foo
|
|
441
|
+
long_table_name = "a" * connection.table_name_length
|
|
442
|
+
rename_table :testings, long_table_name
|
|
443
|
+
end
|
|
444
|
+
}.new
|
|
445
|
+
|
|
446
|
+
error = assert_raises(StandardError) do
|
|
447
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
assert_match(/index_#{long_table_name}_on_foo/i, error.message)
|
|
451
|
+
assert_match(/is too long/i, error.message)
|
|
452
|
+
ensure
|
|
453
|
+
connection.drop_table long_table_name, if_exists: true if long_table_name
|
|
454
|
+
end
|
|
455
|
+
|
|
456
|
+
if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
|
|
457
|
+
def test_change_table_collation_not_unset_7_0
|
|
458
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) {
|
|
275
459
|
def migrate(x)
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
end
|
|
460
|
+
add_column :testings, :txt_collated, :string, charset: "utf8mb4", collation: "utf8mb4_general_ci"
|
|
461
|
+
change_column :testings, :txt_collated, :string, default: "hi", collation: "utf8mb4_esperanto_ci"
|
|
279
462
|
end
|
|
280
463
|
}.new
|
|
464
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
465
|
+
column = @connection.columns(:testings).find { |c| c.name == "txt_collated" }
|
|
466
|
+
assert_equal "hi", column.default
|
|
467
|
+
assert_equal "utf8mb4_esperanto_ci", column.collation
|
|
468
|
+
end
|
|
469
|
+
end
|
|
281
470
|
|
|
282
|
-
|
|
471
|
+
def test_add_reference_on_6_0
|
|
472
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
473
|
+
create_migration = Class.new(ActiveRecord::Migration[6.0]) {
|
|
474
|
+
def version; 100 end
|
|
475
|
+
def migrate(x)
|
|
476
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
477
|
+
create_table :more_testings do |t|
|
|
478
|
+
t.string :test
|
|
479
|
+
end
|
|
480
|
+
end
|
|
481
|
+
}.new
|
|
482
|
+
|
|
483
|
+
migration = Class.new(ActiveRecord::Migration[6.0]) {
|
|
484
|
+
def version; 101 end
|
|
485
|
+
def migrate(x)
|
|
486
|
+
add_reference :more_testings, :testings
|
|
487
|
+
end
|
|
488
|
+
}.new
|
|
489
|
+
|
|
490
|
+
ActiveRecord::Migrator.new(:up, [create_migration, migration], @schema_migration, @internal_metadata).migrate
|
|
283
491
|
|
|
284
|
-
|
|
285
|
-
|
|
492
|
+
column = connection.columns(:more_testings).find { |el| el.name == "testings_id" }
|
|
493
|
+
|
|
494
|
+
if current_adapter?(:SQLite3Adapter, :IBM_DBAdapter)
|
|
495
|
+
assert_match(/integer/i, column.sql_type)
|
|
496
|
+
else
|
|
497
|
+
assert_predicate(column, :bigint?)
|
|
498
|
+
end
|
|
499
|
+
ensure
|
|
500
|
+
connection.drop_table :more_testings rescue nil
|
|
501
|
+
end
|
|
502
|
+
|
|
503
|
+
def test_create_table_on_7_0
|
|
504
|
+
long_table_name = "a" * (connection.table_name_length + 1)
|
|
505
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) {
|
|
506
|
+
@@long_table_name = long_table_name
|
|
507
|
+
def version; 100 end
|
|
508
|
+
def migrate(x)
|
|
509
|
+
create_table @@long_table_name
|
|
510
|
+
end
|
|
511
|
+
}.new
|
|
512
|
+
|
|
513
|
+
if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
|
|
514
|
+
# MySQL does not allow to create table names longer than limit
|
|
515
|
+
error = assert_raises(StandardError) do
|
|
516
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
517
|
+
end
|
|
518
|
+
if connection.mariadb?
|
|
519
|
+
assert_match(/Incorrect table name '#{long_table_name}'/i, error.message)
|
|
520
|
+
else
|
|
521
|
+
assert_match(/Identifier name '#{long_table_name}' is too long/i, error.message)
|
|
522
|
+
end
|
|
523
|
+
else
|
|
524
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
525
|
+
assert connection.table_exists?(long_table_name)
|
|
526
|
+
end
|
|
527
|
+
ensure
|
|
528
|
+
connection.drop_table(long_table_name) rescue nil
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
def test_rename_table_on_7_0
|
|
532
|
+
long_table_name = "a" * (connection.table_name_length + 1)
|
|
533
|
+
connection.create_table(:more_testings)
|
|
534
|
+
|
|
535
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) {
|
|
536
|
+
@@long_table_name = long_table_name
|
|
537
|
+
def version; 100 end
|
|
538
|
+
def migrate(x)
|
|
539
|
+
rename_table :more_testings, @@long_table_name
|
|
540
|
+
end
|
|
541
|
+
}.new
|
|
542
|
+
|
|
543
|
+
if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
|
|
544
|
+
# MySQL does not allow to create table names longer than limit
|
|
545
|
+
error = assert_raises(StandardError) do
|
|
546
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
547
|
+
end
|
|
548
|
+
if connection.mariadb?
|
|
549
|
+
assert_match(/Incorrect table name '#{long_table_name}'/i, error.message)
|
|
550
|
+
else
|
|
551
|
+
assert_match(/Identifier name '#{long_table_name}' is too long/i, error.message)
|
|
552
|
+
end
|
|
553
|
+
else
|
|
554
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
555
|
+
assert connection.table_exists?(long_table_name)
|
|
556
|
+
assert_not connection.table_exists?(:more_testings)
|
|
557
|
+
assert connection.table_exists?(long_table_name)
|
|
558
|
+
end
|
|
559
|
+
ensure
|
|
560
|
+
connection.drop_table(:more_testings) rescue nil
|
|
561
|
+
connection.drop_table(long_table_name) rescue nil
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
def test_invert_rename_table_on_7_0
|
|
565
|
+
connection.create_table(:more_testings)
|
|
566
|
+
|
|
567
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) {
|
|
568
|
+
def change
|
|
569
|
+
rename_table :more_testings, :new_more_testings
|
|
570
|
+
end
|
|
571
|
+
}.new
|
|
572
|
+
|
|
573
|
+
migration.migrate(:up)
|
|
574
|
+
assert connection.table_exists?(:new_more_testings)
|
|
575
|
+
assert_not connection.table_exists?(:more_testings)
|
|
576
|
+
|
|
577
|
+
migration.migrate(:down)
|
|
578
|
+
assert_not connection.table_exists?(:new_more_testings)
|
|
579
|
+
assert connection.table_exists?(:more_testings)
|
|
580
|
+
ensure
|
|
581
|
+
connection.drop_table(:more_testings) rescue nil
|
|
582
|
+
connection.drop_table(:new_more_testings) rescue nil
|
|
583
|
+
end
|
|
584
|
+
|
|
585
|
+
def test_change_column_null_with_non_boolean_arguments_raises_in_a_migration
|
|
586
|
+
migration = Class.new(ActiveRecord::Migration[7.1]) do
|
|
587
|
+
def up
|
|
588
|
+
add_column :testings, :name, :string
|
|
589
|
+
change_column_null :testings, :name, from: true, to: false
|
|
590
|
+
end
|
|
591
|
+
end
|
|
592
|
+
e = assert_raise(StandardError) do
|
|
593
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
594
|
+
end
|
|
595
|
+
assert_includes e.message, "change_column_null expects a boolean value (true for NULL, false for NOT NULL). Got: #{{ from: true, to: false }}"
|
|
596
|
+
end
|
|
597
|
+
|
|
598
|
+
def test_change_column_null_with_non_boolean_arguments_does_not_raise_in_old_rails_versions
|
|
599
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) do
|
|
600
|
+
def up
|
|
601
|
+
add_column :testings, :name, :string
|
|
602
|
+
change_column_null :testings, :name, from: true, to: false
|
|
603
|
+
end
|
|
604
|
+
end
|
|
605
|
+
assert_nothing_raised do
|
|
606
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
607
|
+
end
|
|
608
|
+
TestModel.reset_column_information
|
|
609
|
+
assert_difference("TestModel.count" => 1) do
|
|
610
|
+
TestModel.create!(name: nil)
|
|
611
|
+
end
|
|
612
|
+
end
|
|
613
|
+
|
|
614
|
+
def test_change_column_null_with_boolean_arguments_does_not_raise_in_old_rails_versions
|
|
615
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) do
|
|
616
|
+
def up
|
|
617
|
+
add_column :testings, :name, :string
|
|
618
|
+
change_column_null :testings, :name, false
|
|
619
|
+
end
|
|
620
|
+
end
|
|
621
|
+
assert_nothing_raised do
|
|
622
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
623
|
+
end
|
|
624
|
+
TestModel.reset_column_information
|
|
625
|
+
assert_raise(ActiveRecord::NotNullViolation) do
|
|
626
|
+
TestModel.create!(name: nil)
|
|
627
|
+
end
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
if current_adapter?(:PostgreSQLAdapter)
|
|
631
|
+
def test_disable_extension_on_7_0
|
|
632
|
+
enable_extension!(:hstore, connection)
|
|
633
|
+
|
|
634
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) do
|
|
635
|
+
def up
|
|
636
|
+
add_column :testings, :settings, :hstore
|
|
637
|
+
disable_extension :hstore
|
|
638
|
+
end
|
|
639
|
+
end
|
|
640
|
+
|
|
641
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
642
|
+
assert_not connection.extension_enabled?(:hstore)
|
|
286
643
|
ensure
|
|
287
|
-
|
|
644
|
+
disable_extension!(:hstore, connection)
|
|
288
645
|
end
|
|
289
646
|
|
|
290
|
-
def
|
|
291
|
-
|
|
292
|
-
def version; 100 end
|
|
647
|
+
def test_legacy_add_foreign_key_with_deferrable_true
|
|
648
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) {
|
|
293
649
|
def migrate(x)
|
|
294
|
-
create_table :
|
|
295
|
-
t.
|
|
650
|
+
create_table :sub_testings do |t|
|
|
651
|
+
t.bigint :testing_id
|
|
296
652
|
end
|
|
297
|
-
end
|
|
298
|
-
}.new
|
|
299
653
|
|
|
300
|
-
|
|
301
|
-
def version; 101 end
|
|
302
|
-
def migrate(x)
|
|
303
|
-
add_reference :more_testings, :testings
|
|
654
|
+
add_foreign_key(:sub_testings, :testings, name: "deferrable_foreign_key", deferrable: true)
|
|
304
655
|
end
|
|
305
656
|
}.new
|
|
306
657
|
|
|
307
|
-
ActiveRecord::Migrator.new(:up, [
|
|
658
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
308
659
|
|
|
309
|
-
|
|
310
|
-
assert_equal
|
|
660
|
+
foreign_keys = Testing.lease_connection.foreign_keys("sub_testings")
|
|
661
|
+
assert_equal 1, foreign_keys.size
|
|
662
|
+
assert_equal :immediate, foreign_keys.first.deferrable
|
|
311
663
|
ensure
|
|
312
|
-
connection.drop_table :
|
|
664
|
+
connection.drop_table(:sub_testings, if_exists: true)
|
|
665
|
+
ActiveRecord::Base.clear_cache!
|
|
666
|
+
end
|
|
667
|
+
end
|
|
668
|
+
|
|
669
|
+
if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
|
|
670
|
+
def test_change_column_on_7_0
|
|
671
|
+
migration = Class.new(ActiveRecord::Migration[7.0]) do
|
|
672
|
+
def up
|
|
673
|
+
execute("ALTER TABLE testings CONVERT TO CHARACTER SET utf32")
|
|
674
|
+
change_column(:testings, :foo, "varchar(255) CHARACTER SET ascii")
|
|
675
|
+
end
|
|
676
|
+
end
|
|
677
|
+
assert_nothing_raised do
|
|
678
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
679
|
+
end
|
|
313
680
|
end
|
|
314
681
|
end
|
|
315
682
|
|
|
316
683
|
private
|
|
684
|
+
def assert_timestamp_precision_implicit(table_name, column_name)
|
|
685
|
+
if current_adapter?(:IBM_DBAdapter)
|
|
686
|
+
assert connection.column_exists?(table_name, column_name, null: false)
|
|
687
|
+
else
|
|
688
|
+
assert connection.column_exists?(table_name, column_name, null: false, **precision_implicit_default)
|
|
689
|
+
end
|
|
690
|
+
end
|
|
691
|
+
|
|
692
|
+
def assert_datetime_precision_implicit(table_name, column_name)
|
|
693
|
+
if current_adapter?(:IBM_DBAdapter)
|
|
694
|
+
assert connection.column_exists?(table_name, column_name)
|
|
695
|
+
else
|
|
696
|
+
assert connection.column_exists?(table_name, column_name, **precision_implicit_default)
|
|
697
|
+
end
|
|
698
|
+
end
|
|
699
|
+
|
|
317
700
|
def precision_implicit_default
|
|
318
|
-
if current_adapter?(:Mysql2Adapter)
|
|
701
|
+
if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
|
|
319
702
|
{ precision: 0 }
|
|
320
703
|
elsif current_adapter?(:IBM_DBAdapter)
|
|
321
704
|
{ precision: 6 }
|
|
@@ -327,12 +710,292 @@ module ActiveRecord
|
|
|
327
710
|
end
|
|
328
711
|
end
|
|
329
712
|
|
|
713
|
+
module NoOptionValidationTestCases
|
|
714
|
+
def test_options_are_not_validated
|
|
715
|
+
skip "DB2 validates unknown migration options in legacy compatibility paths" if current_adapter?(:IBM_DBAdapter)
|
|
716
|
+
|
|
717
|
+
migration = Class.new(migration_class) {
|
|
718
|
+
def migrate(x)
|
|
719
|
+
create_table :tests, wrong_id: false do |t|
|
|
720
|
+
t.references :some_table, wrong_primary_key: true
|
|
721
|
+
t.integer :some_id, wrong_unique: true
|
|
722
|
+
t.string :some_string_column, wrong_null: false
|
|
723
|
+
end
|
|
724
|
+
|
|
725
|
+
add_column :tests, "last_name", :string, wrong_precision: true
|
|
726
|
+
|
|
727
|
+
change_column :tests, :some_id, :float, wrong_index: true
|
|
728
|
+
|
|
729
|
+
add_reference :tests, :another_table, invalid_option: :something
|
|
730
|
+
|
|
731
|
+
change_table :tests do |t|
|
|
732
|
+
t.change :some_id, :float, null: false, wrong_index: true
|
|
733
|
+
t.integer :another_id, wrong_unique: true
|
|
734
|
+
t.references :yet_another_table, bad: :option
|
|
735
|
+
end
|
|
736
|
+
end
|
|
737
|
+
}.new
|
|
738
|
+
|
|
739
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
740
|
+
|
|
741
|
+
assert connection.table_exists?(:tests)
|
|
742
|
+
ensure
|
|
743
|
+
connection.drop_table :tests, if_exists: true
|
|
744
|
+
end
|
|
745
|
+
end
|
|
746
|
+
|
|
747
|
+
module DefaultPrecisionImplicitTestCases
|
|
748
|
+
def test_datetime_doesnt_set_precision_on_change_table
|
|
749
|
+
create_migration = Class.new(migration_class) {
|
|
750
|
+
def migrate(x)
|
|
751
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
752
|
+
create_table :more_testings do |t|
|
|
753
|
+
t.datetime :published_at
|
|
754
|
+
end
|
|
755
|
+
end
|
|
756
|
+
}.new(nil, 1)
|
|
757
|
+
|
|
758
|
+
change_migration = Class.new(migration_class) {
|
|
759
|
+
def migrate(x)
|
|
760
|
+
change_table :more_testings do |t|
|
|
761
|
+
t.change :published_at, :datetime, default: Time.now
|
|
762
|
+
end
|
|
763
|
+
end
|
|
764
|
+
}.new(nil, 2)
|
|
765
|
+
|
|
766
|
+
ActiveRecord::Migrator.new(:up, [create_migration, change_migration], @schema_migration, @internal_metadata).migrate
|
|
767
|
+
|
|
768
|
+
assert_datetime_precision_implicit(:more_testings, :published_at)
|
|
769
|
+
ensure
|
|
770
|
+
connection.drop_table :more_testings rescue nil
|
|
771
|
+
end
|
|
772
|
+
|
|
773
|
+
def test_datetime_doesnt_set_precision_on_create_table
|
|
774
|
+
migration = Class.new(migration_class) {
|
|
775
|
+
def migrate(x)
|
|
776
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
777
|
+
create_table :more_testings do |t|
|
|
778
|
+
t.datetime :published_at
|
|
779
|
+
end
|
|
780
|
+
end
|
|
781
|
+
}.new
|
|
782
|
+
|
|
783
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
784
|
+
|
|
785
|
+
assert_datetime_precision_implicit(:more_testings, :published_at)
|
|
786
|
+
ensure
|
|
787
|
+
connection.drop_table :more_testings rescue nil
|
|
788
|
+
end
|
|
789
|
+
|
|
790
|
+
def test_datetime_doesnt_set_precision_on_change_column
|
|
791
|
+
create_migration = Class.new(migration_class) {
|
|
792
|
+
def migrate(x)
|
|
793
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
794
|
+
create_table :more_testings do |t|
|
|
795
|
+
t.date :published_at
|
|
796
|
+
end
|
|
797
|
+
end
|
|
798
|
+
}.new(nil, 0)
|
|
799
|
+
|
|
800
|
+
change_migration = Class.new(migration_class) {
|
|
801
|
+
def migrate(x)
|
|
802
|
+
change_column :more_testings, :published_at, :datetime
|
|
803
|
+
end
|
|
804
|
+
}.new(nil, 1)
|
|
805
|
+
|
|
806
|
+
ActiveRecord::Migrator.new(:up, [create_migration, change_migration], @schema_migration, @internal_metadata).migrate
|
|
807
|
+
|
|
808
|
+
assert_datetime_precision_implicit(:more_testings, :published_at)
|
|
809
|
+
ensure
|
|
810
|
+
connection.drop_table :more_testings rescue nil
|
|
811
|
+
end
|
|
812
|
+
|
|
813
|
+
private
|
|
814
|
+
def assert_datetime_precision_implicit(table_name, column_name)
|
|
815
|
+
if current_adapter?(:IBM_DBAdapter)
|
|
816
|
+
assert connection.column_exists?(table_name, column_name)
|
|
817
|
+
else
|
|
818
|
+
assert connection.column_exists?(table_name, column_name, **precision_implicit_default)
|
|
819
|
+
end
|
|
820
|
+
end
|
|
821
|
+
|
|
822
|
+
def precision_implicit_default
|
|
823
|
+
if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
|
|
824
|
+
{ precision: 0 }
|
|
825
|
+
elsif current_adapter?(:IBM_DBAdapter)
|
|
826
|
+
{ precision: 6 }
|
|
827
|
+
else
|
|
828
|
+
{ precision: nil }
|
|
829
|
+
end
|
|
830
|
+
end
|
|
831
|
+
end
|
|
832
|
+
|
|
833
|
+
module DefaultPrecisionSixTestCases
|
|
834
|
+
def test_datetime_sets_precision_6_on_change_table
|
|
835
|
+
create_migration = Class.new(migration_class) {
|
|
836
|
+
def migrate(x)
|
|
837
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
838
|
+
create_table :more_testings do |t|
|
|
839
|
+
t.datetime :published_at
|
|
840
|
+
end
|
|
841
|
+
end
|
|
842
|
+
}.new(nil, 1)
|
|
843
|
+
|
|
844
|
+
change_migration = Class.new(migration_class) {
|
|
845
|
+
def migrate(x)
|
|
846
|
+
change_table :more_testings do |t|
|
|
847
|
+
t.change :published_at, :datetime, default: Time.now
|
|
848
|
+
end
|
|
849
|
+
end
|
|
850
|
+
}.new(nil, 2)
|
|
851
|
+
|
|
852
|
+
ActiveRecord::Migrator.new(:up, [create_migration, change_migration], @schema_migration, @internal_metadata).migrate
|
|
853
|
+
|
|
854
|
+
assert connection.column_exists?(:more_testings, :published_at, precision: 6)
|
|
855
|
+
ensure
|
|
856
|
+
connection.drop_table :more_testings rescue nil
|
|
857
|
+
end
|
|
858
|
+
|
|
859
|
+
def test_datetime_sets_precision_6_on_create_table
|
|
860
|
+
migration = Class.new(migration_class) {
|
|
861
|
+
def migrate(x)
|
|
862
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
863
|
+
create_table :more_testings do |t|
|
|
864
|
+
t.datetime :published_at
|
|
865
|
+
end
|
|
866
|
+
end
|
|
867
|
+
}.new
|
|
868
|
+
|
|
869
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
870
|
+
|
|
871
|
+
assert connection.column_exists?(:more_testings, :published_at, precision: 6)
|
|
872
|
+
ensure
|
|
873
|
+
connection.drop_table :more_testings rescue nil
|
|
874
|
+
end
|
|
875
|
+
|
|
876
|
+
def test_datetime_sets_precision_6_on_change_column
|
|
877
|
+
skip "DB2 change_column datetime metadata does not guarantee precision 6 in compatibility paths" if current_adapter?(:IBM_DBAdapter)
|
|
878
|
+
|
|
879
|
+
create_migration = Class.new(migration_class) {
|
|
880
|
+
def migrate(x)
|
|
881
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
882
|
+
create_table :more_testings do |t|
|
|
883
|
+
t.date :published_at
|
|
884
|
+
end
|
|
885
|
+
end
|
|
886
|
+
}.new(nil, 0)
|
|
887
|
+
|
|
888
|
+
change_migration = Class.new(migration_class) {
|
|
889
|
+
def migrate(x)
|
|
890
|
+
change_column :more_testings, :published_at, :datetime
|
|
891
|
+
end
|
|
892
|
+
}.new(nil, 1)
|
|
893
|
+
|
|
894
|
+
ActiveRecord::Migrator.new(:up, [create_migration, change_migration], @schema_migration, @internal_metadata).migrate
|
|
895
|
+
|
|
896
|
+
assert connection.column_exists?(:more_testings, :published_at, precision: 6)
|
|
897
|
+
ensure
|
|
898
|
+
connection.drop_table :more_testings rescue nil
|
|
899
|
+
end
|
|
900
|
+
end
|
|
901
|
+
|
|
902
|
+
class BaseCompatibilityTest < ActiveRecord::TestCase
|
|
903
|
+
attr_reader :connection
|
|
904
|
+
|
|
905
|
+
def setup
|
|
906
|
+
@connection = ActiveRecord::Base.lease_connection
|
|
907
|
+
@pool = ActiveRecord::Base.connection_pool
|
|
908
|
+
@schema_migration = @pool.schema_migration
|
|
909
|
+
@internal_metadata = @pool.internal_metadata
|
|
910
|
+
|
|
911
|
+
@verbose_was = ActiveRecord::Migration.verbose
|
|
912
|
+
ActiveRecord::Migration.verbose = false
|
|
913
|
+
end
|
|
914
|
+
|
|
915
|
+
def teardown
|
|
916
|
+
ActiveRecord::Migration.verbose = @verbose_was
|
|
917
|
+
@schema_migration.delete_all_versions rescue nil
|
|
918
|
+
end
|
|
919
|
+
end
|
|
920
|
+
|
|
921
|
+
class CompatibilityTest7_0 < BaseCompatibilityTest
|
|
922
|
+
include DefaultPrecisionSixTestCases
|
|
923
|
+
include NoOptionValidationTestCases
|
|
924
|
+
|
|
925
|
+
private
|
|
926
|
+
def migration_class
|
|
927
|
+
ActiveRecord::Migration[7.0]
|
|
928
|
+
end
|
|
929
|
+
end
|
|
930
|
+
|
|
931
|
+
class CompatibilityTest6_1 < BaseCompatibilityTest
|
|
932
|
+
include DefaultPrecisionImplicitTestCases
|
|
933
|
+
include NoOptionValidationTestCases
|
|
934
|
+
|
|
935
|
+
private
|
|
936
|
+
def migration_class
|
|
937
|
+
ActiveRecord::Migration[6.1]
|
|
938
|
+
end
|
|
939
|
+
end
|
|
940
|
+
|
|
941
|
+
class CompatibilityTest6_0 < BaseCompatibilityTest
|
|
942
|
+
include DefaultPrecisionImplicitTestCases
|
|
943
|
+
include NoOptionValidationTestCases
|
|
944
|
+
|
|
945
|
+
private
|
|
946
|
+
def migration_class
|
|
947
|
+
ActiveRecord::Migration[6.0]
|
|
948
|
+
end
|
|
949
|
+
end
|
|
950
|
+
|
|
951
|
+
class CompatibilityTest5_2 < BaseCompatibilityTest
|
|
952
|
+
include DefaultPrecisionImplicitTestCases
|
|
953
|
+
include NoOptionValidationTestCases
|
|
954
|
+
|
|
955
|
+
private
|
|
956
|
+
def migration_class
|
|
957
|
+
ActiveRecord::Migration[5.2]
|
|
958
|
+
end
|
|
959
|
+
end
|
|
960
|
+
|
|
961
|
+
class CompatibilityTest5_1 < BaseCompatibilityTest
|
|
962
|
+
include DefaultPrecisionImplicitTestCases
|
|
963
|
+
include NoOptionValidationTestCases
|
|
964
|
+
|
|
965
|
+
private
|
|
966
|
+
def migration_class
|
|
967
|
+
ActiveRecord::Migration[5.1]
|
|
968
|
+
end
|
|
969
|
+
end
|
|
970
|
+
|
|
971
|
+
class CompatibilityTest5_0 < BaseCompatibilityTest
|
|
972
|
+
include DefaultPrecisionImplicitTestCases
|
|
973
|
+
include NoOptionValidationTestCases
|
|
974
|
+
|
|
975
|
+
private
|
|
976
|
+
def migration_class
|
|
977
|
+
ActiveRecord::Migration[5.0]
|
|
978
|
+
end
|
|
979
|
+
end
|
|
980
|
+
|
|
981
|
+
class CompatibilityTest4_2 < BaseCompatibilityTest
|
|
982
|
+
include DefaultPrecisionImplicitTestCases
|
|
983
|
+
include NoOptionValidationTestCases
|
|
984
|
+
|
|
985
|
+
private
|
|
986
|
+
def migration_class
|
|
987
|
+
ActiveRecord::Migration[4.2]
|
|
988
|
+
end
|
|
989
|
+
end
|
|
990
|
+
|
|
330
991
|
module LegacyPolymorphicReferenceIndexTestCases
|
|
331
992
|
attr_reader :connection
|
|
332
993
|
|
|
333
994
|
def setup
|
|
334
|
-
@connection = ActiveRecord::Base.
|
|
335
|
-
@
|
|
995
|
+
@connection = ActiveRecord::Base.lease_connection
|
|
996
|
+
@pool = ActiveRecord::Base.connection_pool
|
|
997
|
+
@schema_migration = @pool.schema_migration
|
|
998
|
+
@internal_metadata = @pool.internal_metadata
|
|
336
999
|
@verbose_was = ActiveRecord::Migration.verbose
|
|
337
1000
|
ActiveRecord::Migration.verbose = false
|
|
338
1001
|
|
|
@@ -341,13 +1004,18 @@ module LegacyPolymorphicReferenceIndexTestCases
|
|
|
341
1004
|
|
|
342
1005
|
def teardown
|
|
343
1006
|
ActiveRecord::Migration.verbose = @verbose_was
|
|
344
|
-
|
|
1007
|
+
@schema_migration.delete_all_versions rescue nil
|
|
345
1008
|
connection.drop_table :testings rescue nil
|
|
346
1009
|
end
|
|
347
1010
|
|
|
348
1011
|
def test_create_table_with_polymorphic_reference_uses_all_column_names_in_index
|
|
1012
|
+
if current_adapter?(:IBM_DBAdapter) && self.class.name.match?(/LegacyPolymorphicReferenceIndexTest::V(?:4_2|5_1|5_2|6_0)/)
|
|
1013
|
+
skip "DB2 legacy create_table compatibility paths do not reliably expose polymorphic composite indexes"
|
|
1014
|
+
end
|
|
1015
|
+
|
|
349
1016
|
migration = Class.new(migration_class) {
|
|
350
1017
|
def migrate(x)
|
|
1018
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
351
1019
|
create_table :more_testings do |t|
|
|
352
1020
|
t.references :widget, polymorphic: true, index: true
|
|
353
1021
|
t.belongs_to :gizmo, polymorphic: true, index: true
|
|
@@ -355,7 +1023,7 @@ module LegacyPolymorphicReferenceIndexTestCases
|
|
|
355
1023
|
end
|
|
356
1024
|
}.new
|
|
357
1025
|
|
|
358
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
1026
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
359
1027
|
|
|
360
1028
|
assert connection.index_exists?(:more_testings, [:widget_type, :widget_id], name: :index_more_testings_on_widget_type_and_widget_id)
|
|
361
1029
|
assert connection.index_exists?(:more_testings, [:gizmo_type, :gizmo_id], name: :index_more_testings_on_gizmo_type_and_gizmo_id)
|
|
@@ -364,6 +1032,10 @@ module LegacyPolymorphicReferenceIndexTestCases
|
|
|
364
1032
|
end
|
|
365
1033
|
|
|
366
1034
|
def test_change_table_with_polymorphic_reference_uses_all_column_names_in_index
|
|
1035
|
+
if current_adapter?(:IBM_DBAdapter) && self.class.name.match?(/LegacyPolymorphicReferenceIndexTest::V(?:4_2|5_0|5_1|6_0)/)
|
|
1036
|
+
skip "DB2 legacy change_table compatibility paths (<= 6.0) do not create polymorphic composite indexes"
|
|
1037
|
+
end
|
|
1038
|
+
|
|
367
1039
|
migration = Class.new(migration_class) {
|
|
368
1040
|
def migrate(x)
|
|
369
1041
|
change_table :testings do |t|
|
|
@@ -373,15 +1045,25 @@ module LegacyPolymorphicReferenceIndexTestCases
|
|
|
373
1045
|
end
|
|
374
1046
|
}.new
|
|
375
1047
|
|
|
376
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
1048
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
377
1049
|
|
|
378
|
-
|
|
379
|
-
|
|
1050
|
+
if current_adapter?(:IBM_DBAdapter)
|
|
1051
|
+
assert connection.index_exists?(:testings, [:widget_type, :widget_id])
|
|
1052
|
+
assert connection.index_exists?(:testings, [:gizmo_type, :gizmo_id])
|
|
1053
|
+
else
|
|
1054
|
+
assert connection.index_exists?(:testings, [:widget_type, :widget_id], name: :index_testings_on_widget_type_and_widget_id)
|
|
1055
|
+
assert connection.index_exists?(:testings, [:gizmo_type, :gizmo_id], name: :index_testings_on_gizmo_type_and_gizmo_id)
|
|
1056
|
+
end
|
|
380
1057
|
end
|
|
381
1058
|
|
|
382
1059
|
def test_create_join_table_with_polymorphic_reference_uses_all_column_names_in_index
|
|
1060
|
+
if current_adapter?(:IBM_DBAdapter) && self.class.name.match?(/LegacyPolymorphicReferenceIndexTest::V4_2/)
|
|
1061
|
+
skip "DB2 legacy create_join_table compatibility path (4.2) does not create polymorphic composite indexes with expected names"
|
|
1062
|
+
end
|
|
1063
|
+
|
|
383
1064
|
migration = Class.new(migration_class) {
|
|
384
1065
|
def migrate(x)
|
|
1066
|
+
connection.drop_table :more_testings, if_exists: true rescue nil
|
|
385
1067
|
create_join_table :more, :testings do |t|
|
|
386
1068
|
t.references :widget, polymorphic: true, index: true
|
|
387
1069
|
t.belongs_to :gizmo, polymorphic: true, index: true
|
|
@@ -389,7 +1071,7 @@ module LegacyPolymorphicReferenceIndexTestCases
|
|
|
389
1071
|
end
|
|
390
1072
|
}.new
|
|
391
1073
|
|
|
392
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
1074
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
393
1075
|
|
|
394
1076
|
assert connection.index_exists?(:more_testings, [:widget_type, :widget_id], name: :index_more_testings_on_widget_type_and_widget_id)
|
|
395
1077
|
assert connection.index_exists?(:more_testings, [:gizmo_type, :gizmo_id], name: :index_more_testings_on_gizmo_type_and_gizmo_id)
|
|
@@ -405,7 +1087,7 @@ module LegacyPolymorphicReferenceIndexTestCases
|
|
|
405
1087
|
end
|
|
406
1088
|
}.new
|
|
407
1089
|
|
|
408
|
-
ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
|
|
1090
|
+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
|
|
409
1091
|
|
|
410
1092
|
assert connection.index_exists?(:testings, [:widget_type, :widget_id], name: :index_testings_on_widget_type_and_widget_id)
|
|
411
1093
|
assert connection.index_exists?(:testings, [:gizmo_type, :gizmo_id], name: :index_testings_on_gizmo_type_and_gizmo_id)
|
|
@@ -454,198 +1136,203 @@ module LegacyPolymorphicReferenceIndexTest
|
|
|
454
1136
|
end
|
|
455
1137
|
|
|
456
1138
|
module LegacyPrimaryKeyTestCases
|
|
1139
|
+
extend ActiveSupport::Concern
|
|
457
1140
|
include SchemaDumpingHelper
|
|
458
1141
|
|
|
459
1142
|
class LegacyPrimaryKey < ActiveRecord::Base
|
|
460
1143
|
end
|
|
461
1144
|
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
1145
|
+
included do
|
|
1146
|
+
def setup
|
|
1147
|
+
@migration = nil
|
|
1148
|
+
@verbose_was = ActiveRecord::Migration.verbose
|
|
1149
|
+
ActiveRecord::Migration.verbose = false
|
|
1150
|
+
end
|
|
467
1151
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
1152
|
+
def teardown
|
|
1153
|
+
@migration.migrate(:down) if @migration
|
|
1154
|
+
ActiveRecord::Migration.verbose = @verbose_was
|
|
1155
|
+
ActiveRecord::Base.connection_pool.schema_migration.delete_all_versions rescue nil
|
|
1156
|
+
LegacyPrimaryKey.reset_column_information
|
|
1157
|
+
end
|
|
474
1158
|
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
1159
|
+
def test_legacy_primary_key_should_be_auto_incremented
|
|
1160
|
+
@migration = Class.new(migration_class) {
|
|
1161
|
+
def change
|
|
1162
|
+
create_table :legacy_primary_keys do |t|
|
|
1163
|
+
t.references :legacy_ref
|
|
1164
|
+
end
|
|
480
1165
|
end
|
|
481
|
-
|
|
482
|
-
}.new
|
|
483
|
-
|
|
484
|
-
@migration.migrate(:up)
|
|
485
|
-
|
|
486
|
-
assert_legacy_primary_key
|
|
487
|
-
|
|
488
|
-
legacy_ref = LegacyPrimaryKey.columns_hash["legacy_ref_id"]
|
|
489
|
-
assert_not_predicate legacy_ref, :bigint?
|
|
490
|
-
|
|
491
|
-
record1 = LegacyPrimaryKey.create!
|
|
492
|
-
assert_not_nil record1.id
|
|
1166
|
+
}.new
|
|
493
1167
|
|
|
494
|
-
|
|
1168
|
+
@migration.migrate(:up)
|
|
495
1169
|
|
|
496
|
-
|
|
497
|
-
assert_not_nil record2.id
|
|
498
|
-
assert_operator record2.id, :>, record1.id
|
|
499
|
-
end
|
|
1170
|
+
assert_legacy_primary_key
|
|
500
1171
|
|
|
501
|
-
|
|
502
|
-
|
|
1172
|
+
legacy_ref = LegacyPrimaryKey.columns_hash["legacy_ref_id"]
|
|
1173
|
+
assert_not_predicate legacy_ref, :bigint?
|
|
503
1174
|
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
create_table :legacy_primary_keys, id: :integer do |t|
|
|
507
|
-
end
|
|
508
|
-
end
|
|
509
|
-
}.new
|
|
1175
|
+
record1 = LegacyPrimaryKey.create!
|
|
1176
|
+
assert_not_nil record1.id
|
|
510
1177
|
|
|
511
|
-
|
|
1178
|
+
record1.destroy
|
|
512
1179
|
|
|
513
|
-
|
|
514
|
-
|
|
1180
|
+
record2 = LegacyPrimaryKey.create!
|
|
1181
|
+
assert_not_nil record2.id
|
|
1182
|
+
assert_operator record2.id, :>, record1.id
|
|
515
1183
|
end
|
|
516
1184
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
end
|
|
1185
|
+
def test_legacy_integer_primary_key_should_not_be_auto_incremented
|
|
1186
|
+
skip if current_adapter?(:SQLite3Adapter, :IBM_DBAdapter)
|
|
520
1187
|
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
t.primary_key :id
|
|
1188
|
+
@migration = Class.new(migration_class) {
|
|
1189
|
+
def change
|
|
1190
|
+
create_table :legacy_primary_keys, id: :integer do |t|
|
|
1191
|
+
end
|
|
526
1192
|
end
|
|
527
|
-
|
|
528
|
-
}.new
|
|
529
|
-
|
|
530
|
-
@migration.migrate(:up)
|
|
1193
|
+
}.new
|
|
531
1194
|
|
|
532
|
-
|
|
533
|
-
end
|
|
1195
|
+
@migration.migrate(:up)
|
|
534
1196
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
def change
|
|
538
|
-
create_table :legacy_primary_keys, id: false do |t|
|
|
539
|
-
t.integer :dummy
|
|
540
|
-
end
|
|
541
|
-
change_table :legacy_primary_keys do |t|
|
|
542
|
-
t.primary_key :id
|
|
543
|
-
end
|
|
1197
|
+
assert_raises(ActiveRecord::NotNullViolation) do
|
|
1198
|
+
LegacyPrimaryKey.create!
|
|
544
1199
|
end
|
|
545
|
-
}.new
|
|
546
|
-
|
|
547
|
-
@migration.migrate(:up)
|
|
548
1200
|
|
|
549
|
-
|
|
550
|
-
|
|
1201
|
+
schema = dump_table_schema "legacy_primary_keys"
|
|
1202
|
+
assert_match %r{create_table "legacy_primary_keys", id: :integer, default: nil}, schema
|
|
1203
|
+
end
|
|
551
1204
|
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
1205
|
+
def test_legacy_primary_key_in_create_table_should_be_integer
|
|
1206
|
+
@migration = Class.new(migration_class) {
|
|
1207
|
+
def change
|
|
1208
|
+
create_table :legacy_primary_keys, id: false do |t|
|
|
1209
|
+
t.primary_key :id
|
|
1210
|
+
end
|
|
557
1211
|
end
|
|
558
|
-
|
|
559
|
-
end
|
|
560
|
-
}.new
|
|
1212
|
+
}.new
|
|
561
1213
|
|
|
562
|
-
|
|
1214
|
+
@migration.migrate(:up)
|
|
563
1215
|
|
|
564
|
-
|
|
565
|
-
|
|
1216
|
+
assert_legacy_primary_key
|
|
1217
|
+
end
|
|
566
1218
|
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
1219
|
+
def test_legacy_primary_key_in_change_table_should_be_integer
|
|
1220
|
+
@migration = Class.new(migration_class) {
|
|
1221
|
+
def change
|
|
1222
|
+
create_table :legacy_primary_keys, id: false do |t|
|
|
1223
|
+
t.integer :dummy
|
|
1224
|
+
end
|
|
1225
|
+
change_table :legacy_primary_keys do |t|
|
|
1226
|
+
t.primary_key :id
|
|
1227
|
+
end
|
|
571
1228
|
end
|
|
572
|
-
|
|
573
|
-
}.new
|
|
1229
|
+
}.new
|
|
574
1230
|
|
|
575
|
-
|
|
1231
|
+
@migration.migrate(:up)
|
|
576
1232
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
assert_match %r{integer "banana_id", null: false}, schema
|
|
580
|
-
end
|
|
1233
|
+
assert_legacy_primary_key
|
|
1234
|
+
end
|
|
581
1235
|
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
1236
|
+
def test_add_column_with_legacy_primary_key_should_be_integer
|
|
1237
|
+
@migration = Class.new(migration_class) {
|
|
1238
|
+
def change
|
|
1239
|
+
create_table :legacy_primary_keys, id: false do |t|
|
|
1240
|
+
t.integer :dummy
|
|
1241
|
+
end
|
|
1242
|
+
add_column :legacy_primary_keys, :id, :primary_key
|
|
586
1243
|
end
|
|
587
|
-
|
|
588
|
-
}.new
|
|
1244
|
+
}.new
|
|
589
1245
|
|
|
590
|
-
|
|
1246
|
+
@migration.migrate(:up)
|
|
591
1247
|
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
assert_match %r{bigint "banana_id", null: false}, schema
|
|
595
|
-
end
|
|
1248
|
+
assert_legacy_primary_key
|
|
1249
|
+
end
|
|
596
1250
|
|
|
597
|
-
|
|
598
|
-
def test_legacy_bigint_primary_key_should_be_auto_incremented
|
|
1251
|
+
def test_legacy_join_table_foreign_keys_should_be_integer
|
|
599
1252
|
@migration = Class.new(migration_class) {
|
|
600
1253
|
def change
|
|
601
|
-
|
|
1254
|
+
create_join_table :apples, :bananas do |t|
|
|
1255
|
+
end
|
|
602
1256
|
end
|
|
603
1257
|
}.new
|
|
604
1258
|
|
|
605
1259
|
@migration.migrate(:up)
|
|
606
1260
|
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
schema = dump_table_schema "legacy_primary_keys"
|
|
612
|
-
assert_match %r{create_table "legacy_primary_keys", (?!id: :bigint, default: nil)}, schema
|
|
1261
|
+
schema = dump_table_schema "apples_bananas"
|
|
1262
|
+
assert_match %r{integer "apple_id", null: false}, schema
|
|
1263
|
+
assert_match %r{integer "banana_id", null: false}, schema
|
|
613
1264
|
end
|
|
614
|
-
|
|
615
|
-
def
|
|
1265
|
+
|
|
1266
|
+
def test_legacy_join_table_column_options_should_be_overwritten
|
|
616
1267
|
@migration = Class.new(migration_class) {
|
|
617
1268
|
def change
|
|
618
|
-
|
|
1269
|
+
create_join_table :apples, :bananas, column_options: { type: :bigint } do |t|
|
|
619
1270
|
end
|
|
620
1271
|
end
|
|
621
1272
|
}.new
|
|
622
1273
|
|
|
623
1274
|
@migration.migrate(:up)
|
|
624
1275
|
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
schema = dump_table_schema "legacy_primary_keys"
|
|
630
|
-
assert_match %r{create_table "legacy_primary_keys", id: :bigint, default: nil}, schema
|
|
1276
|
+
schema = dump_table_schema "apples_bananas"
|
|
1277
|
+
assert_match %r{bigint "apple_id", null: false}, schema
|
|
1278
|
+
assert_match %r{bigint "banana_id", null: false}, schema
|
|
631
1279
|
end
|
|
632
|
-
end
|
|
633
1280
|
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
1281
|
+
if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
|
|
1282
|
+
def test_legacy_bigint_primary_key_should_be_auto_incremented
|
|
1283
|
+
@migration = Class.new(migration_class) {
|
|
1284
|
+
def change
|
|
1285
|
+
create_table :legacy_primary_keys, id: :bigint
|
|
1286
|
+
end
|
|
1287
|
+
}.new
|
|
1288
|
+
|
|
1289
|
+
@migration.migrate(:up)
|
|
1290
|
+
|
|
1291
|
+
legacy_pk = LegacyPrimaryKey.columns_hash["id"]
|
|
1292
|
+
assert_predicate legacy_pk, :bigint?
|
|
1293
|
+
assert_predicate legacy_pk, :auto_increment?
|
|
1294
|
+
|
|
1295
|
+
schema = dump_table_schema "legacy_primary_keys"
|
|
1296
|
+
assert_match %r{create_table "legacy_primary_keys", (?!id: :bigint, default: nil)}, schema
|
|
1297
|
+
end
|
|
1298
|
+
else
|
|
1299
|
+
def test_legacy_bigint_primary_key_should_not_be_auto_incremented
|
|
1300
|
+
skip "DB2 auto-generates bigint primary keys in legacy migrations" if current_adapter?(:IBM_DBAdapter)
|
|
637
1301
|
|
|
638
|
-
|
|
1302
|
+
@migration = Class.new(migration_class) {
|
|
1303
|
+
def change
|
|
1304
|
+
create_table :legacy_primary_keys, id: :bigint do |t|
|
|
1305
|
+
end
|
|
1306
|
+
end
|
|
1307
|
+
}.new
|
|
639
1308
|
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
1309
|
+
@migration.migrate(:up)
|
|
1310
|
+
|
|
1311
|
+
assert_raises(ActiveRecord::NotNullViolation) do
|
|
1312
|
+
LegacyPrimaryKey.create!
|
|
1313
|
+
end
|
|
643
1314
|
|
|
644
|
-
if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter)
|
|
645
1315
|
schema = dump_table_schema "legacy_primary_keys"
|
|
646
|
-
assert_match %r{create_table "legacy_primary_keys", id: :
|
|
1316
|
+
assert_match %r{create_table "legacy_primary_keys", id: :bigint, default: nil}, schema
|
|
647
1317
|
end
|
|
648
1318
|
end
|
|
1319
|
+
|
|
1320
|
+
private
|
|
1321
|
+
def assert_legacy_primary_key
|
|
1322
|
+
assert_equal "id", LegacyPrimaryKey.primary_key
|
|
1323
|
+
|
|
1324
|
+
legacy_pk = LegacyPrimaryKey.columns_hash["id"]
|
|
1325
|
+
|
|
1326
|
+
assert_equal :integer, legacy_pk.type
|
|
1327
|
+
assert_not_predicate legacy_pk, :bigint?
|
|
1328
|
+
assert_not legacy_pk.null
|
|
1329
|
+
|
|
1330
|
+
if current_adapter?(:Mysql2Adapter, :TrilogyAdapter, :PostgreSQLAdapter)
|
|
1331
|
+
schema = dump_table_schema "legacy_primary_keys"
|
|
1332
|
+
assert_match %r{create_table "legacy_primary_keys", id: :(?:integer|serial), (?!default: nil)}, schema
|
|
1333
|
+
end
|
|
1334
|
+
end
|
|
1335
|
+
end
|
|
649
1336
|
end
|
|
650
1337
|
|
|
651
1338
|
module LegacyPrimaryKeyTest
|