ibm_db 5.6.1-arm64-darwin-24
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 +7 -0
- data/CHANGES +299 -0
- data/LICENSE +55 -0
- data/MANIFEST +14 -0
- data/ParameterizedQueries README +39 -0
- data/README +210 -0
- data/ext/Makefile +270 -0
- data/ext/Makefile.nt32 +181 -0
- data/ext/Makefile.nt32.191 +212 -0
- data/ext/extconf.rb +320 -0
- data/ext/gil_release_version.h +3 -0
- data/ext/ibm_db.bundle +0 -0
- data/ext/ibm_db.c +11865 -0
- data/ext/ibm_db.o +0 -0
- data/ext/mkmf.log +98 -0
- data/ext/ruby_ibm_db.h +241 -0
- data/ext/ruby_ibm_db_cli.c +867 -0
- data/ext/ruby_ibm_db_cli.h +508 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/ext/unicode_support_version.h +3 -0
- data/init.rb +42 -0
- data/lib/IBM_DB.rb +27 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +4407 -0
- data/lib/active_record/connection_adapters/ibm_db_pstmt.rb +1965 -0
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -0
- data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -0
- data/lib/ibm_db.bundle +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +52 -0
- 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/example.log +1 -0
- data/test/assets/flowers.jpg +0 -0
- data/test/assets/schema_dump_5_1.yml +345 -0
- data/test/assets/test.txt +1 -0
- data/test/cases/adapter_prevent_writes_test.rb +334 -0
- data/test/cases/adapter_test.rb +565 -0
- data/test/cases/adapters/mysql2/active_schema_test.rb +203 -0
- data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +52 -0
- data/test/cases/adapters/mysql2/boolean_test.rb +102 -0
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +65 -0
- data/test/cases/adapters/mysql2/charset_collation_test.rb +57 -0
- data/test/cases/adapters/mysql2/connection_test.rb +208 -0
- data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +49 -0
- data/test/cases/adapters/mysql2/enum_test.rb +47 -0
- data/test/cases/adapters/mysql2/explain_test.rb +23 -0
- data/test/cases/adapters/mysql2/json_test.rb +24 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +238 -0
- 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/reserved_word_test.rb +152 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +64 -0
- data/test/cases/adapters/mysql2/schema_test.rb +128 -0
- data/test/cases/adapters/mysql2/set_test.rb +32 -0
- data/test/cases/adapters/mysql2/sp_test.rb +38 -0
- data/test/cases/adapters/mysql2/sql_types_test.rb +16 -0
- data/test/cases/adapters/mysql2/table_options_test.rb +125 -0
- data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +68 -0
- data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +113 -0
- data/test/cases/adapters/postgresql/array_test.rb +394 -0
- data/test/cases/adapters/postgresql/bit_string_test.rb +84 -0
- data/test/cases/adapters/postgresql/bytea_test.rb +135 -0
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +27 -0
- data/test/cases/adapters/postgresql/change_schema_test.rb +40 -0
- data/test/cases/adapters/postgresql/cidr_test.rb +27 -0
- data/test/cases/adapters/postgresql/citext_test.rb +78 -0
- data/test/cases/adapters/postgresql/collation_test.rb +55 -0
- data/test/cases/adapters/postgresql/composite_test.rb +134 -0
- data/test/cases/adapters/postgresql/connection_test.rb +245 -0
- data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +89 -0
- data/test/cases/adapters/postgresql/date_test.rb +42 -0
- data/test/cases/adapters/postgresql/domain_test.rb +49 -0
- data/test/cases/adapters/postgresql/enum_test.rb +93 -0
- data/test/cases/adapters/postgresql/explain_test.rb +22 -0
- data/test/cases/adapters/postgresql/extension_migration_test.rb +64 -0
- data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +46 -0
- data/test/cases/adapters/postgresql/geometric_test.rb +372 -0
- data/test/cases/adapters/postgresql/hstore_test.rb +390 -0
- data/test/cases/adapters/postgresql/infinity_test.rb +108 -0
- data/test/cases/adapters/postgresql/integer_test.rb +27 -0
- data/test/cases/adapters/postgresql/interval_test.rb +99 -0
- data/test/cases/adapters/postgresql/json_test.rb +52 -0
- data/test/cases/adapters/postgresql/ltree_test.rb +51 -0
- data/test/cases/adapters/postgresql/money_test.rb +127 -0
- data/test/cases/adapters/postgresql/network_test.rb +102 -0
- data/test/cases/adapters/postgresql/numbers_test.rb +51 -0
- 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 +447 -0
- data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
- data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +50 -0
- data/test/cases/adapters/postgresql/range_test.rb +457 -0
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +112 -0
- data/test/cases/adapters/postgresql/rename_table_test.rb +35 -0
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +110 -0
- data/test/cases/adapters/postgresql/schema_test.rb +713 -0
- data/test/cases/adapters/postgresql/serial_test.rb +156 -0
- data/test/cases/adapters/postgresql/statement_pool_test.rb +61 -0
- data/test/cases/adapters/postgresql/timestamp_test.rb +92 -0
- 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 +35 -0
- data/test/cases/adapters/postgresql/utils_test.rb +64 -0
- data/test/cases/adapters/postgresql/uuid_test.rb +411 -0
- data/test/cases/adapters/postgresql/xml_test.rb +50 -0
- data/test/cases/adapters/sqlite3/collation_test.rb +64 -0
- data/test/cases/adapters/sqlite3/copy_table_test.rb +101 -0
- data/test/cases/adapters/sqlite3/explain_test.rb +23 -0
- data/test/cases/adapters/sqlite3/json_test.rb +29 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +79 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +628 -0
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +21 -0
- data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
- data/test/cases/aggregations_test.rb +170 -0
- data/test/cases/annotate_test.rb +46 -0
- data/test/cases/ar_schema_test.rb +213 -0
- 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/association_scope_test.rb +16 -0
- data/test/cases/associations/belongs_to_associations_test.rb +1493 -0
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +43 -0
- data/test/cases/associations/callbacks_test.rb +208 -0
- data/test/cases/associations/cascaded_eager_loading_test.rb +245 -0
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +156 -0
- data/test/cases/associations/eager_load_nested_include_test.rb +127 -0
- data/test/cases/associations/eager_singularization_test.rb +148 -0
- data/test/cases/associations/eager_test.rb +1658 -0
- data/test/cases/associations/extension_test.rb +93 -0
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1025 -0
- data/test/cases/associations/has_many_associations_test.rb +3074 -0
- data/test/cases/associations/has_many_through_associations_test.rb +1580 -0
- data/test/cases/associations/has_one_associations_test.rb +872 -0
- data/test/cases/associations/has_one_through_associations_test.rb +429 -0
- data/test/cases/associations/inner_join_association_test.rb +215 -0
- data/test/cases/associations/inverse_associations_test.rb +941 -0
- data/test/cases/associations/join_model_test.rb +787 -0
- data/test/cases/associations/left_outer_join_association_test.rb +123 -0
- data/test/cases/associations/nested_through_associations_test.rb +636 -0
- data/test/cases/associations/required_test.rb +127 -0
- data/test/cases/associations_test.rb +516 -0
- data/test/cases/attribute_decorators_test.rb +126 -0
- data/test/cases/attribute_methods/read_test.rb +60 -0
- data/test/cases/attribute_methods_test.rb +1124 -0
- data/test/cases/attribute_set_test.rb +270 -0
- data/test/cases/attribute_test.rb +246 -0
- data/test/cases/attributes_test.rb +371 -0
- data/test/cases/autosave_association_test.rb +1953 -0
- data/test/cases/base_prevent_writes_test.rb +229 -0
- data/test/cases/base_test.rb +1770 -0
- data/test/cases/batches_test.rb +695 -0
- data/test/cases/binary_test.rb +39 -0
- data/test/cases/bind_parameter_test.rb +283 -0
- data/test/cases/boolean_test.rb +52 -0
- data/test/cases/cache_key_test.rb +131 -0
- data/test/cases/calculations_test.rb +1361 -0
- data/test/cases/callbacks_test.rb +503 -0
- data/test/cases/clone_test.rb +45 -0
- data/test/cases/coders/json_test.rb +17 -0
- data/test/cases/coders/yaml_column_test.rb +66 -0
- data/test/cases/collection_cache_key_test.rb +272 -0
- data/test/cases/column_alias_test.rb +19 -0
- data/test/cases/column_definition_test.rb +34 -0
- data/test/cases/comment_test.rb +204 -0
- data/test/cases/connection_adapters/adapter_leasing_test.rb +60 -0
- data/test/cases/connection_adapters/connection_handler_test.rb +467 -0
- 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_specification_test.rb +12 -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 +436 -0
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +81 -0
- data/test/cases/connection_adapters/quoting_test.rb +13 -0
- data/test/cases/connection_adapters/schema_cache_test.rb +294 -0
- data/test/cases/connection_adapters/type_lookup_test.rb +119 -0
- data/test/cases/connection_management_test.rb +114 -0
- data/test/cases/connection_pool_test.rb +754 -0
- data/test/cases/connection_specification/resolver_test.rb +131 -0
- data/test/cases/core_test.rb +136 -0
- data/test/cases/counter_cache_test.rb +368 -0
- data/test/cases/custom_locking_test.rb +19 -0
- 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 +36 -0
- data/test/cases/date_test.rb +36 -0
- data/test/cases/date_time_precision_test.rb +129 -0
- data/test/cases/date_time_test.rb +76 -0
- data/test/cases/defaults_test.rb +254 -0
- data/test/cases/delegated_type_test.rb +57 -0
- data/test/cases/dirty_test.rb +959 -0
- data/test/cases/disconnected_test.rb +30 -0
- data/test/cases/dup_test.rb +184 -0
- data/test/cases/enum_test.rb +823 -0
- data/test/cases/errors_test.rb +16 -0
- data/test/cases/explain_subscriber_test.rb +66 -0
- data/test/cases/explain_test.rb +79 -0
- data/test/cases/filter_attributes_test.rb +153 -0
- data/test/cases/finder_respond_to_test.rb +60 -0
- data/test/cases/finder_test.rb +1676 -0
- data/test/cases/fixture_set/file_test.rb +152 -0
- data/test/cases/fixtures_test.rb +1645 -0
- data/test/cases/forbidden_attributes_protection_test.rb +130 -0
- data/test/cases/habtm_destroy_order_test.rb +61 -0
- data/test/cases/helper.rb +233 -0
- data/test/cases/hot_compatibility_test.rb +143 -0
- data/test/cases/i18n_test.rb +46 -0
- data/test/cases/inheritance_test.rb +671 -0
- data/test/cases/insert_all_test.rb +489 -0
- data/test/cases/instrumentation_test.rb +101 -0
- data/test/cases/integration_test.rb +243 -0
- data/test/cases/invalid_connection_test.rb +26 -0
- data/test/cases/invertible_migration_test.rb +527 -0
- data/test/cases/json_attribute_test.rb +35 -0
- data/test/cases/json_serialization_test.rb +310 -0
- data/test/cases/json_shared_test_cases.rb +290 -0
- data/test/cases/locking_test.rb +787 -0
- data/test/cases/log_subscriber_test.rb +267 -0
- data/test/cases/marshal_serialization_test.rb +39 -0
- data/test/cases/migration/change_schema_test.rb +504 -0
- data/test/cases/migration/change_table_test.rb +364 -0
- data/test/cases/migration/check_constraint_test.rb +162 -0
- data/test/cases/migration/column_attributes_test.rb +186 -0
- data/test/cases/migration/column_positioning_test.rb +68 -0
- data/test/cases/migration/columns_test.rb +326 -0
- data/test/cases/migration/command_recorder_test.rb +437 -0
- data/test/cases/migration/compatibility_test.rb +673 -0
- data/test/cases/migration/create_join_table_test.rb +167 -0
- data/test/cases/migration/foreign_key_test.rb +581 -0
- data/test/cases/migration/helper.rb +40 -0
- data/test/cases/migration/index_test.rb +267 -0
- data/test/cases/migration/logger_test.rb +39 -0
- data/test/cases/migration/pending_migrations_test.rb +106 -0
- data/test/cases/migration/references_foreign_key_test.rb +235 -0
- data/test/cases/migration/references_index_test.rb +120 -0
- data/test/cases/migration/references_statements_test.rb +137 -0
- data/test/cases/migration/rename_table_test.rb +116 -0
- data/test/cases/migration_test.rb +1525 -0
- data/test/cases/migrator_test.rb +527 -0
- data/test/cases/mixin_test.rb +64 -0
- data/test/cases/modules_test.rb +174 -0
- data/test/cases/multi_db_migrator_test.rb +223 -0
- data/test/cases/multiparameter_attributes_test.rb +399 -0
- data/test/cases/multiple_db_test.rb +116 -0
- data/test/cases/nested_attributes_test.rb +1119 -0
- data/test/cases/nested_attributes_with_callbacks_test.rb +146 -0
- data/test/cases/null_relation_test.rb +84 -0
- data/test/cases/numeric_data_test.rb +93 -0
- data/test/cases/persistence_test.rb +1093 -0
- data/test/cases/pooled_connections_test.rb +73 -0
- data/test/cases/prepared_statement_status_test.rb +48 -0
- data/test/cases/primary_keys_test.rb +482 -0
- data/test/cases/query_cache_test.rb +915 -0
- data/test/cases/quoting_test.rb +303 -0
- data/test/cases/readonly_test.rb +120 -0
- data/test/cases/reaper_test.rb +199 -0
- data/test/cases/reflection_test.rb +520 -0
- data/test/cases/relation/delegation_test.rb +76 -0
- data/test/cases/relation/delete_all_test.rb +117 -0
- data/test/cases/relation/merging_test.rb +434 -0
- data/test/cases/relation/mutation_test.rb +145 -0
- data/test/cases/relation/or_test.rb +192 -0
- data/test/cases/relation/predicate_builder_test.rb +31 -0
- data/test/cases/relation/record_fetch_warning_test.rb +42 -0
- 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 +141 -0
- data/test/cases/relation/where_clause_test.rb +257 -0
- data/test/cases/relation/where_test.rb +429 -0
- data/test/cases/relation_test.rb +482 -0
- data/test/cases/relations_test.rb +2251 -0
- data/test/cases/reload_models_test.rb +26 -0
- data/test/cases/reserved_word_test.rb +141 -0
- data/test/cases/result_test.rb +141 -0
- data/test/cases/sanitize_test.rb +192 -0
- data/test/cases/schema_dumper_test.rb +550 -0
- data/test/cases/schema_loading_test.rb +53 -0
- data/test/cases/scoping/default_scoping_test.rb +569 -0
- data/test/cases/scoping/named_scoping_test.rb +649 -0
- data/test/cases/scoping/relation_scoping_test.rb +522 -0
- data/test/cases/secure_token_test.rb +47 -0
- data/test/cases/serialization_test.rb +106 -0
- data/test/cases/serialized_attribute_test.rb +455 -0
- data/test/cases/signed_id_test.rb +168 -0
- data/test/cases/statement_cache_test.rb +153 -0
- data/test/cases/statement_invalid_test.rb +42 -0
- data/test/cases/store_test.rb +320 -0
- data/test/cases/strict_loading_test.rb +473 -0
- data/test/cases/suppressor_test.rb +77 -0
- data/test/cases/tasks/database_tasks_test.rb +1526 -0
- data/test/cases/tasks/mysql_rake_test.rb +417 -0
- data/test/cases/tasks/postgresql_rake_test.rb +534 -0
- data/test/cases/tasks/sqlite_rake_test.rb +267 -0
- data/test/cases/test_case.rb +142 -0
- data/test/cases/test_databases_test.rb +79 -0
- data/test/cases/test_fixtures_test.rb +96 -0
- data/test/cases/time_precision_test.rb +125 -0
- data/test/cases/timestamp_test.rb +504 -0
- data/test/cases/touch_later_test.rb +123 -0
- data/test/cases/transaction_callbacks_test.rb +772 -0
- data/test/cases/transaction_isolation_test.rb +106 -0
- data/test/cases/transactions_test.rb +1285 -0
- data/test/cases/type/adapter_specific_registry_test.rb +145 -0
- data/test/cases/type/date_time_test.rb +16 -0
- data/test/cases/type/integer_test.rb +29 -0
- data/test/cases/type/string_test.rb +24 -0
- data/test/cases/type/time_test.rb +28 -0
- data/test/cases/type/type_map_test.rb +178 -0
- data/test/cases/type/unsigned_integer_test.rb +19 -0
- data/test/cases/type_test.rb +41 -0
- data/test/cases/types_test.rb +26 -0
- data/test/cases/unconnected_test.rb +46 -0
- data/test/cases/unsafe_raw_sql_test.rb +274 -0
- data/test/cases/validations/absence_validation_test.rb +75 -0
- data/test/cases/validations/association_validation_test.rb +99 -0
- data/test/cases/validations/i18n_generate_message_validation_test.rb +102 -0
- data/test/cases/validations/i18n_validation_test.rb +87 -0
- data/test/cases/validations/length_validation_test.rb +80 -0
- data/test/cases/validations/numericality_validation_test.rb +181 -0
- data/test/cases/validations/presence_validation_test.rb +105 -0
- data/test/cases/validations/uniqueness_validation_test.rb +618 -0
- data/test/cases/validations_repair_helper.rb +21 -0
- data/test/cases/validations_test.rb +229 -0
- data/test/cases/view_test.rb +222 -0
- data/test/cases/yaml_serialization_test.rb +166 -0
- data/test/config.example.yml +97 -0
- data/test/config.rb +7 -0
- data/test/config.yml +220 -0
- data/test/connections/native_ibm_db/connection.rb +44 -0
- data/test/fixtures/accounts.yml +29 -0
- data/test/fixtures/admin/accounts.yml +2 -0
- data/test/fixtures/admin/randomly_named_a9.yml +7 -0
- data/test/fixtures/admin/randomly_named_b0.yml +7 -0
- data/test/fixtures/admin/users.yml +10 -0
- data/test/fixtures/all/admin +1 -0
- data/test/fixtures/all/developers.yml +0 -0
- data/test/fixtures/all/namespaced/accounts.yml +2 -0
- data/test/fixtures/all/people.yml +0 -0
- data/test/fixtures/all/tasks.yml +0 -0
- data/test/fixtures/author_addresses.yml +11 -0
- data/test/fixtures/author_favorites.yml +4 -0
- data/test/fixtures/authors.yml +17 -0
- data/test/fixtures/bad_posts.yml +9 -0
- data/test/fixtures/binaries.yml +137 -0
- data/test/fixtures/books.yml +38 -0
- data/test/fixtures/bulbs.yml +5 -0
- data/test/fixtures/cars.yml +9 -0
- data/test/fixtures/categories/special_categories.yml +9 -0
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
- data/test/fixtures/categories.yml +19 -0
- data/test/fixtures/categories_ordered.yml +7 -0
- data/test/fixtures/categories_posts.yml +34 -0
- data/test/fixtures/categorizations.yml +23 -0
- data/test/fixtures/citations.yml +5 -0
- data/test/fixtures/clubs.yml +8 -0
- data/test/fixtures/collections.yml +3 -0
- data/test/fixtures/colleges.yml +3 -0
- data/test/fixtures/comments.yml +72 -0
- data/test/fixtures/companies.yml +72 -0
- data/test/fixtures/computers.yml +12 -0
- data/test/fixtures/content.yml +3 -0
- data/test/fixtures/content_positions.yml +3 -0
- data/test/fixtures/courses.yml +8 -0
- data/test/fixtures/customers.yml +35 -0
- data/test/fixtures/dashboards.yml +6 -0
- data/test/fixtures/dead_parrots.yml +5 -0
- data/test/fixtures/developers.yml +22 -0
- data/test/fixtures/developers_projects.yml +17 -0
- data/test/fixtures/dog_lovers.yml +7 -0
- data/test/fixtures/dogs.yml +4 -0
- data/test/fixtures/doubloons.yml +3 -0
- data/test/fixtures/edges.yml +5 -0
- data/test/fixtures/entrants.yml +14 -0
- data/test/fixtures/essays.yml +16 -0
- data/test/fixtures/faces.yml +11 -0
- data/test/fixtures/fk_test_has_fk.yml +3 -0
- data/test/fixtures/fk_test_has_pk.yml +2 -0
- data/test/fixtures/friendships.yml +4 -0
- data/test/fixtures/funny_jokes.yml +10 -0
- data/test/fixtures/humans.yml +5 -0
- data/test/fixtures/interests.yml +33 -0
- data/test/fixtures/items.yml +3 -0
- data/test/fixtures/jobs.yml +7 -0
- data/test/fixtures/legacy_things.yml +3 -0
- data/test/fixtures/live_parrots.yml +4 -0
- data/test/fixtures/mateys.yml +4 -0
- data/test/fixtures/member_details.yml +8 -0
- data/test/fixtures/member_types.yml +6 -0
- data/test/fixtures/members.yml +11 -0
- data/test/fixtures/memberships.yml +41 -0
- data/test/fixtures/men.yml +5 -0
- data/test/fixtures/minimalistics.yml +5 -0
- data/test/fixtures/minivans.yml +5 -0
- data/test/fixtures/mixed_case_monkeys.yml +6 -0
- data/test/fixtures/mixins.yml +29 -0
- data/test/fixtures/movies.yml +7 -0
- data/test/fixtures/naked/yml/accounts.yml +1 -0
- data/test/fixtures/naked/yml/companies.yml +1 -0
- data/test/fixtures/naked/yml/courses.yml +1 -0
- data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
- data/test/fixtures/naked/yml/parrots.yml +3 -0
- data/test/fixtures/naked/yml/trees.yml +3 -0
- data/test/fixtures/nodes.yml +29 -0
- data/test/fixtures/organizations.yml +5 -0
- data/test/fixtures/other_books.yml +26 -0
- data/test/fixtures/other_comments.yml +6 -0
- data/test/fixtures/other_dogs.yml +2 -0
- data/test/fixtures/other_posts.yml +8 -0
- data/test/fixtures/other_topics.yml +42 -0
- data/test/fixtures/owners.yml +9 -0
- data/test/fixtures/parrots.yml +33 -0
- data/test/fixtures/parrots_pirates.yml +7 -0
- data/test/fixtures/people.yml +24 -0
- data/test/fixtures/peoples_treasures.yml +3 -0
- data/test/fixtures/pets.yml +19 -0
- data/test/fixtures/pirates.yml +15 -0
- data/test/fixtures/posts.yml +88 -0
- data/test/fixtures/price_estimates.yml +16 -0
- data/test/fixtures/products.yml +4 -0
- data/test/fixtures/projects.yml +7 -0
- data/test/fixtures/randomly_named_a9.yml +7 -0
- data/test/fixtures/ratings.yml +14 -0
- data/test/fixtures/readers.yml +17 -0
- data/test/fixtures/references.yml +17 -0
- data/test/fixtures/reserved_words/distinct.yml +5 -0
- data/test/fixtures/reserved_words/distinct_select.yml +11 -0
- data/test/fixtures/reserved_words/group.yml +14 -0
- data/test/fixtures/reserved_words/select.yml +8 -0
- data/test/fixtures/reserved_words/values.yml +7 -0
- data/test/fixtures/ships.yml +6 -0
- data/test/fixtures/speedometers.yml +8 -0
- data/test/fixtures/sponsors.yml +15 -0
- data/test/fixtures/strict_zines.yml +2 -0
- data/test/fixtures/string_key_objects.yml +7 -0
- data/test/fixtures/subscribers.yml +11 -0
- data/test/fixtures/subscriptions.yml +12 -0
- data/test/fixtures/taggings.yml +78 -0
- data/test/fixtures/tags.yml +11 -0
- data/test/fixtures/tasks.yml +7 -0
- data/test/fixtures/teapots.yml +3 -0
- data/test/fixtures/to_be_linked/accounts.yml +2 -0
- data/test/fixtures/to_be_linked/users.yml +10 -0
- data/test/fixtures/topics.yml +49 -0
- data/test/fixtures/toys.yml +14 -0
- data/test/fixtures/traffic_lights.yml +10 -0
- data/test/fixtures/treasures.yml +10 -0
- data/test/fixtures/trees.yml +3 -0
- data/test/fixtures/uuid_children.yml +3 -0
- data/test/fixtures/uuid_parents.yml +2 -0
- data/test/fixtures/variants.yml +4 -0
- data/test/fixtures/vegetables.yml +20 -0
- data/test/fixtures/vertices.yml +4 -0
- data/test/fixtures/warehouse-things.yml +3 -0
- data/test/fixtures/warehouse_things.yml +3 -0
- data/test/fixtures/zines.yml +5 -0
- data/test/ibm_db_test.rb +25 -0
- data/test/migrations/10_urban/9_add_expressions.rb +13 -0
- data/test/migrations/decimal/1_give_me_big_numbers.rb +17 -0
- data/test/migrations/magic/1_currencies_have_symbols.rb +13 -0
- data/test/migrations/missing/1000_people_have_middle_names.rb +11 -0
- data/test/migrations/missing/1_people_have_last_names.rb +11 -0
- data/test/migrations/missing/3_we_need_reminders.rb +14 -0
- data/test/migrations/missing/4_innocent_jointable.rb +14 -0
- data/test/migrations/rename/1_we_need_things.rb +13 -0
- data/test/migrations/rename/2_rename_things.rb +11 -0
- data/test/migrations/to_copy/1_people_have_hobbies.rb +11 -0
- data/test/migrations/to_copy/2_people_have_descriptions.rb +11 -0
- data/test/migrations/to_copy2/1_create_articles.rb +9 -0
- data/test/migrations/to_copy2/2_create_comments.rb +9 -0
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +11 -0
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +11 -0
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +11 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +9 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +9 -0
- data/test/migrations/valid/1_valid_people_have_last_names.rb +11 -0
- data/test/migrations/valid/2_we_need_reminders.rb +14 -0
- data/test/migrations/valid/3_innocent_jointable.rb +14 -0
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +11 -0
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +14 -0
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +14 -0
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +11 -0
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +14 -0
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +14 -0
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +10 -0
- data/test/models/account.rb +46 -0
- data/test/models/admin/account.rb +5 -0
- data/test/models/admin/randomly_named_c1.rb +9 -0
- data/test/models/admin/user.rb +48 -0
- data/test/models/admin.rb +7 -0
- data/test/models/aircraft.rb +7 -0
- data/test/models/arunit2_model.rb +5 -0
- data/test/models/author.rb +260 -0
- data/test/models/auto_id.rb +6 -0
- data/test/models/autoloadable/extra_firm.rb +4 -0
- data/test/models/binary.rb +4 -0
- data/test/models/binary_field.rb +6 -0
- data/test/models/bird.rb +24 -0
- data/test/models/book.rb +33 -0
- data/test/models/book_destroy_async.rb +24 -0
- data/test/models/boolean.rb +7 -0
- data/test/models/bulb.rb +61 -0
- data/test/models/cake_designer.rb +5 -0
- data/test/models/car.rb +36 -0
- data/test/models/carrier.rb +4 -0
- data/test/models/cart.rb +5 -0
- data/test/models/cat.rb +12 -0
- data/test/models/categorization.rb +21 -0
- data/test/models/category.rb +47 -0
- data/test/models/chef.rb +10 -0
- data/test/models/citation.rb +7 -0
- data/test/models/club.rb +28 -0
- data/test/models/college.rb +12 -0
- data/test/models/column.rb +5 -0
- data/test/models/column_name.rb +5 -0
- data/test/models/comment.rb +98 -0
- data/test/models/company.rb +226 -0
- data/test/models/company_in_module.rb +99 -0
- data/test/models/computer.rb +5 -0
- data/test/models/contact.rb +43 -0
- data/test/models/content.rb +42 -0
- data/test/models/contract.rb +38 -0
- data/test/models/country.rb +5 -0
- data/test/models/course.rb +8 -0
- data/test/models/customer.rb +85 -0
- data/test/models/customer_carrier.rb +16 -0
- data/test/models/dashboard.rb +5 -0
- data/test/models/default.rb +4 -0
- data/test/models/department.rb +6 -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 +341 -0
- 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 +7 -0
- data/test/models/dog_lover.rb +7 -0
- data/test/models/doubloon.rb +14 -0
- data/test/models/drink_designer.rb +20 -0
- data/test/models/edge.rb +7 -0
- data/test/models/electron.rb +7 -0
- data/test/models/engine.rb +5 -0
- data/test/models/entrant.rb +5 -0
- data/test/models/entry.rb +5 -0
- data/test/models/essay.rb +8 -0
- data/test/models/essay_destroy_async.rb +12 -0
- data/test/models/event.rb +5 -0
- data/test/models/eye.rb +39 -0
- data/test/models/face.rb +17 -0
- data/test/models/family.rb +6 -0
- data/test/models/family_tree.rb +6 -0
- data/test/models/friendship.rb +8 -0
- data/test/models/frog.rb +8 -0
- data/test/models/guid.rb +4 -0
- data/test/models/guitar.rb +6 -0
- data/test/models/hotel.rb +13 -0
- data/test/models/human.rb +39 -0
- data/test/models/image.rb +5 -0
- data/test/models/interest.rb +16 -0
- data/test/models/invoice.rb +6 -0
- data/test/models/item.rb +9 -0
- data/test/models/job.rb +9 -0
- data/test/models/joke.rb +9 -0
- data/test/models/keyboard.rb +5 -0
- data/test/models/legacy_thing.rb +5 -0
- data/test/models/lesson.rb +13 -0
- data/test/models/line_item.rb +5 -0
- data/test/models/liquid.rb +6 -0
- data/test/models/man.rb +11 -0
- data/test/models/matey.rb +6 -0
- data/test/models/measurement.rb +4 -0
- data/test/models/member.rb +45 -0
- data/test/models/member_detail.rb +11 -0
- data/test/models/member_type.rb +5 -0
- data/test/models/membership.rb +38 -0
- data/test/models/mentor.rb +5 -0
- data/test/models/message.rb +5 -0
- data/test/models/minimalistic.rb +4 -0
- data/test/models/minivan.rb +10 -0
- data/test/models/mixed_case_monkey.rb +5 -0
- data/test/models/mocktail_designer.rb +2 -0
- data/test/models/molecule.rb +8 -0
- data/test/models/mouse.rb +6 -0
- data/test/models/movie.rb +7 -0
- data/test/models/node.rb +7 -0
- data/test/models/non_primary_key.rb +4 -0
- data/test/models/notification.rb +5 -0
- data/test/models/numeric_data.rb +12 -0
- data/test/models/order.rb +6 -0
- data/test/models/organization.rb +16 -0
- data/test/models/other_dog.rb +7 -0
- data/test/models/owner.rb +39 -0
- data/test/models/parrot.rb +36 -0
- data/test/models/person.rb +147 -0
- data/test/models/personal_legacy_thing.rb +6 -0
- data/test/models/pet.rb +20 -0
- data/test/models/pet_treasure.rb +8 -0
- data/test/models/pirate.rb +116 -0
- data/test/models/possession.rb +5 -0
- data/test/models/post.rb +371 -0
- data/test/models/price_estimate.rb +14 -0
- data/test/models/professor.rb +7 -0
- data/test/models/project.rb +42 -0
- data/test/models/publisher/article.rb +6 -0
- data/test/models/publisher/magazine.rb +5 -0
- data/test/models/publisher.rb +4 -0
- data/test/models/randomly_named_c1.rb +5 -0
- data/test/models/rating.rb +8 -0
- data/test/models/reader.rb +25 -0
- data/test/models/recipe.rb +5 -0
- data/test/models/record.rb +4 -0
- data/test/models/reference.rb +25 -0
- data/test/models/reply.rb +79 -0
- 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 +42 -0
- data/test/models/ship_part.rb +10 -0
- data/test/models/shop.rb +19 -0
- data/test/models/shop_account.rb +8 -0
- data/test/models/speedometer.rb +8 -0
- data/test/models/sponsor.rb +10 -0
- data/test/models/squeak.rb +6 -0
- data/test/models/strict_zine.rb +7 -0
- data/test/models/string_key_object.rb +5 -0
- data/test/models/student.rb +6 -0
- data/test/models/subject.rb +16 -0
- data/test/models/subscriber.rb +10 -0
- data/test/models/subscription.rb +8 -0
- data/test/models/tag.rb +16 -0
- data/test/models/tagging.rb +20 -0
- data/test/models/task.rb +7 -0
- data/test/models/topic.rb +153 -0
- data/test/models/toy.rb +10 -0
- data/test/models/traffic_light.rb +6 -0
- data/test/models/treasure.rb +16 -0
- data/test/models/treaty.rb +5 -0
- data/test/models/tree.rb +5 -0
- data/test/models/tuning_peg.rb +6 -0
- data/test/models/tyre.rb +13 -0
- data/test/models/user.rb +22 -0
- data/test/models/uuid_child.rb +5 -0
- data/test/models/uuid_item.rb +8 -0
- data/test/models/uuid_parent.rb +5 -0
- data/test/models/vegetables.rb +33 -0
- data/test/models/vehicle.rb +7 -0
- data/test/models/vertex.rb +11 -0
- data/test/models/warehouse_thing.rb +7 -0
- data/test/models/wheel.rb +5 -0
- data/test/models/without_table.rb +5 -0
- data/test/models/zine.rb +5 -0
- data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
- data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
- data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
- data/test/schema/mysql2_specific_schema.rb +82 -0
- data/test/schema/oracle_specific_schema.rb +38 -0
- data/test/schema/postgresql_specific_schema.rb +125 -0
- data/test/schema/schema.rb +1237 -0
- data/test/schema/schema.rb.original +1057 -0
- data/test/schema/sqlite_specific_schema.rb +11 -0
- data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
- data/test/support/config.rb +43 -0
- data/test/support/connection.rb +29 -0
- data/test/support/connection_helper.rb +16 -0
- data/test/support/ddl_helper.rb +10 -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 +22 -0
- data/test/support/stubs/strong_parameters.rb +40 -0
- data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
- data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -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 +876 -0
@@ -0,0 +1,238 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
require "support/ddl_helper"
|
5
|
+
|
6
|
+
class Mysql2AdapterTest < ActiveRecord::Mysql2TestCase
|
7
|
+
include DdlHelper
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@conn = ActiveRecord::Base.connection
|
11
|
+
@connection_handler = ActiveRecord::Base.connection_handler
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_connection_error
|
15
|
+
assert_raises ActiveRecord::ConnectionNotEstablished do
|
16
|
+
ActiveRecord::Base.mysql2_connection(socket: File::NULL)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_reconnection_error
|
21
|
+
fake_connection = Class.new do
|
22
|
+
def query_options
|
23
|
+
{}
|
24
|
+
end
|
25
|
+
|
26
|
+
def query(*)
|
27
|
+
end
|
28
|
+
|
29
|
+
def close
|
30
|
+
end
|
31
|
+
end.new
|
32
|
+
@conn = ActiveRecord::ConnectionAdapters::Mysql2Adapter.new(
|
33
|
+
fake_connection,
|
34
|
+
ActiveRecord::Base.logger,
|
35
|
+
nil,
|
36
|
+
{ socket: File::NULL }
|
37
|
+
)
|
38
|
+
assert_raises ActiveRecord::ConnectionNotEstablished do
|
39
|
+
@conn.reconnect!
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_exec_query_nothing_raises_with_no_result_queries
|
44
|
+
assert_nothing_raised do
|
45
|
+
with_example_table do
|
46
|
+
@conn.exec_query("INSERT INTO ex (number) VALUES (1)")
|
47
|
+
@conn.exec_query("DELETE FROM ex WHERE number = 1")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_database_exists_returns_false_if_database_does_not_exist
|
53
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
|
54
|
+
config = db_config.configuration_hash.merge(database: "inexistent_activerecord_unittest")
|
55
|
+
assert_not ActiveRecord::ConnectionAdapters::Mysql2Adapter.database_exists?(config),
|
56
|
+
"expected database to not exist"
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_database_exists_returns_true_when_the_database_exists
|
60
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
|
61
|
+
assert ActiveRecord::ConnectionAdapters::Mysql2Adapter.database_exists?(db_config.configuration_hash),
|
62
|
+
"expected database #{db_config.database} to exist"
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_columns_for_distinct_zero_orders
|
66
|
+
assert_equal "posts.id",
|
67
|
+
@conn.columns_for_distinct("posts.id", [])
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_columns_for_distinct_one_order
|
71
|
+
assert_equal "posts.created_at AS alias_0, posts.id",
|
72
|
+
@conn.columns_for_distinct("posts.id", ["posts.created_at desc"])
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_columns_for_distinct_few_orders
|
76
|
+
assert_equal "posts.created_at AS alias_0, posts.position AS alias_1, posts.id",
|
77
|
+
@conn.columns_for_distinct("posts.id", ["posts.created_at desc", "posts.position asc"])
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_columns_for_distinct_with_case
|
81
|
+
assert_equal(
|
82
|
+
"CASE WHEN author.is_active THEN UPPER(author.name) ELSE UPPER(author.email) END AS alias_0, posts.id",
|
83
|
+
@conn.columns_for_distinct("posts.id",
|
84
|
+
["CASE WHEN author.is_active THEN UPPER(author.name) ELSE UPPER(author.email) END"])
|
85
|
+
)
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_columns_for_distinct_blank_not_nil_orders
|
89
|
+
assert_equal "posts.created_at AS alias_0, posts.id",
|
90
|
+
@conn.columns_for_distinct("posts.id", ["posts.created_at desc", "", " "])
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_columns_for_distinct_with_arel_order
|
94
|
+
Arel::Table.engine = nil # should not rely on the global Arel::Table.engine
|
95
|
+
|
96
|
+
order = Arel.sql("posts.created_at").desc
|
97
|
+
assert_equal "posts.created_at AS alias_0, posts.id",
|
98
|
+
@conn.columns_for_distinct("posts.id", [order])
|
99
|
+
ensure
|
100
|
+
Arel::Table.engine = ActiveRecord::Base
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_errors_for_bigint_fks_on_integer_pk_table_in_alter_table
|
104
|
+
# table old_cars has primary key of integer
|
105
|
+
|
106
|
+
error = assert_raises(ActiveRecord::MismatchedForeignKey) do
|
107
|
+
@conn.add_reference :engines, :old_car
|
108
|
+
@conn.add_foreign_key :engines, :old_cars
|
109
|
+
end
|
110
|
+
|
111
|
+
assert_match(
|
112
|
+
%r/Column `old_car_id` on table `engines` does not match column `id` on `old_cars`, which has type `int(\(11\))?`\./,
|
113
|
+
error.message
|
114
|
+
)
|
115
|
+
assert_match(
|
116
|
+
%r/To resolve this issue, change the type of the `old_car_id` column on `engines` to be :integer\. \(For example `t.integer :old_car_id`\)\./,
|
117
|
+
error.message
|
118
|
+
)
|
119
|
+
assert_not_nil error.cause
|
120
|
+
ensure
|
121
|
+
@conn.execute("ALTER TABLE engines DROP COLUMN old_car_id") rescue nil
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_errors_for_bigint_fks_on_integer_pk_table_in_create_table
|
125
|
+
# table old_cars has primary key of integer
|
126
|
+
|
127
|
+
error = assert_raises(ActiveRecord::MismatchedForeignKey) do
|
128
|
+
@conn.execute(<<~SQL)
|
129
|
+
CREATE TABLE activerecord_unittest.foos (
|
130
|
+
id bigint NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
131
|
+
old_car_id bigint,
|
132
|
+
INDEX index_foos_on_old_car_id (old_car_id),
|
133
|
+
CONSTRAINT fk_rails_ff771f3c96 FOREIGN KEY (old_car_id) REFERENCES old_cars (id)
|
134
|
+
)
|
135
|
+
SQL
|
136
|
+
end
|
137
|
+
|
138
|
+
assert_match(
|
139
|
+
%r/Column `old_car_id` on table `foos` does not match column `id` on `old_cars`, which has type `int(\(11\))?`\./,
|
140
|
+
error.message
|
141
|
+
)
|
142
|
+
assert_match(
|
143
|
+
%r/To resolve this issue, change the type of the `old_car_id` column on `foos` to be :integer\. \(For example `t.integer :old_car_id`\)\./,
|
144
|
+
error.message
|
145
|
+
)
|
146
|
+
assert_not_nil error.cause
|
147
|
+
ensure
|
148
|
+
@conn.drop_table :foos, if_exists: true
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_errors_for_integer_fks_on_bigint_pk_table_in_create_table
|
152
|
+
# table old_cars has primary key of bigint
|
153
|
+
|
154
|
+
error = assert_raises(ActiveRecord::MismatchedForeignKey) do
|
155
|
+
@conn.execute(<<~SQL)
|
156
|
+
CREATE TABLE activerecord_unittest.foos (
|
157
|
+
id bigint NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
158
|
+
car_id int,
|
159
|
+
INDEX index_foos_on_car_id (car_id),
|
160
|
+
CONSTRAINT fk_rails_ff771f3c96 FOREIGN KEY (car_id) REFERENCES cars (id)
|
161
|
+
)
|
162
|
+
SQL
|
163
|
+
end
|
164
|
+
|
165
|
+
assert_match(
|
166
|
+
%r/Column `car_id` on table `foos` does not match column `id` on `cars`, which has type `bigint(\(20\))?`\./,
|
167
|
+
error.message
|
168
|
+
)
|
169
|
+
assert_match(
|
170
|
+
%r/To resolve this issue, change the type of the `car_id` column on `foos` to be :bigint\. \(For example `t.bigint :car_id`\)\./,
|
171
|
+
error.message
|
172
|
+
)
|
173
|
+
assert_not_nil error.cause
|
174
|
+
ensure
|
175
|
+
@conn.drop_table :foos, if_exists: true
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_errors_for_bigint_fks_on_string_pk_table_in_create_table
|
179
|
+
# table old_cars has primary key of string
|
180
|
+
|
181
|
+
error = assert_raises(ActiveRecord::MismatchedForeignKey) do
|
182
|
+
@conn.execute(<<~SQL)
|
183
|
+
CREATE TABLE activerecord_unittest.foos (
|
184
|
+
id bigint NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
185
|
+
subscriber_id bigint,
|
186
|
+
INDEX index_foos_on_subscriber_id (subscriber_id),
|
187
|
+
CONSTRAINT fk_rails_ff771f3c96 FOREIGN KEY (subscriber_id) REFERENCES subscribers (nick)
|
188
|
+
)
|
189
|
+
SQL
|
190
|
+
end
|
191
|
+
|
192
|
+
assert_includes error.message, <<~MSG.squish
|
193
|
+
Column `subscriber_id` on table `foos` does not match column `nick` on `subscribers`,
|
194
|
+
which has type `varchar(255)`. To resolve this issue, change the type of the `subscriber_id`
|
195
|
+
column on `foos` to be :string. (For example `t.string :subscriber_id`).
|
196
|
+
MSG
|
197
|
+
assert_not_nil error.cause
|
198
|
+
ensure
|
199
|
+
@conn.drop_table :foos, if_exists: true
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_read_timeout_exception
|
203
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
|
204
|
+
|
205
|
+
ActiveRecord::Base.establish_connection(
|
206
|
+
db_config.configuration_hash.merge("read_timeout" => 1)
|
207
|
+
)
|
208
|
+
|
209
|
+
error = assert_raises(ActiveRecord::AdapterTimeout) do
|
210
|
+
ActiveRecord::Base.connection.execute("SELECT SLEEP(2)")
|
211
|
+
end
|
212
|
+
assert_kind_of ActiveRecord::QueryAborted, error
|
213
|
+
|
214
|
+
assert_equal Mysql2::Error::TimeoutError, error.cause.class
|
215
|
+
ensure
|
216
|
+
ActiveRecord::Base.establish_connection :arunit
|
217
|
+
end
|
218
|
+
|
219
|
+
def test_statement_timeout_error_codes
|
220
|
+
raw_conn = @conn.raw_connection
|
221
|
+
assert_raises(ActiveRecord::StatementTimeout) do
|
222
|
+
raw_conn.stub(:query, ->(_sql) { raise Mysql2::Error.new("fail", 50700, ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::ER_FILSORT_ABORT) }) {
|
223
|
+
@conn.execute("SELECT 1")
|
224
|
+
}
|
225
|
+
end
|
226
|
+
|
227
|
+
assert_raises(ActiveRecord::StatementTimeout) do
|
228
|
+
raw_conn.stub(:query, ->(_sql) { raise Mysql2::Error.new("fail", 50700, ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::ER_QUERY_TIMEOUT) }) {
|
229
|
+
@conn.execute("SELECT 1")
|
230
|
+
}
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
private
|
235
|
+
def with_example_table(definition = "id int auto_increment primary key, number int, data varchar(255)", &block)
|
236
|
+
super(@conn, "ex", definition, &block)
|
237
|
+
end
|
238
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
require "support/connection_helper"
|
5
|
+
|
6
|
+
module ActiveRecord
|
7
|
+
class Mysql2NestedDeadlockTest < ActiveRecord::Mysql2TestCase
|
8
|
+
self.use_transactional_tests = false
|
9
|
+
|
10
|
+
class Sample < ActiveRecord::Base
|
11
|
+
self.table_name = "samples"
|
12
|
+
end
|
13
|
+
|
14
|
+
setup do
|
15
|
+
@abort, Thread.abort_on_exception = Thread.abort_on_exception, false
|
16
|
+
Thread.report_on_exception, @original_report_on_exception = false, Thread.report_on_exception
|
17
|
+
|
18
|
+
connection = ActiveRecord::Base.connection
|
19
|
+
connection.clear_cache!
|
20
|
+
|
21
|
+
connection.create_table("samples", force: true) do |t|
|
22
|
+
t.integer "value"
|
23
|
+
end
|
24
|
+
|
25
|
+
Sample.reset_column_information
|
26
|
+
end
|
27
|
+
|
28
|
+
teardown do
|
29
|
+
ActiveRecord::Base.clear_active_connections!
|
30
|
+
ActiveRecord::Base.connection.drop_table "samples", if_exists: true
|
31
|
+
|
32
|
+
Thread.abort_on_exception = @abort
|
33
|
+
Thread.report_on_exception = @original_report_on_exception
|
34
|
+
end
|
35
|
+
|
36
|
+
test "deadlock correctly raises Deadlocked inside nested SavepointTransaction" do
|
37
|
+
assert_raises(ActiveRecord::Deadlocked) do
|
38
|
+
barrier = Concurrent::CyclicBarrier.new(2)
|
39
|
+
|
40
|
+
s1 = Sample.create value: 1
|
41
|
+
s2 = Sample.create value: 2
|
42
|
+
|
43
|
+
begin
|
44
|
+
thread = Thread.new do
|
45
|
+
Sample.transaction(requires_new: false) do
|
46
|
+
Sample.transaction(requires_new: true) do
|
47
|
+
s1.lock!
|
48
|
+
barrier.wait
|
49
|
+
s2.update value: 1
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
begin
|
55
|
+
Sample.transaction(requires_new: false) do
|
56
|
+
Sample.transaction(requires_new: true) do
|
57
|
+
s2.lock!
|
58
|
+
barrier.wait
|
59
|
+
s1.update value: 2
|
60
|
+
end
|
61
|
+
end
|
62
|
+
ensure
|
63
|
+
thread.join
|
64
|
+
end
|
65
|
+
rescue ActiveRecord::StatementInvalid => e
|
66
|
+
if /SAVEPOINT active_record_. does not exist/ =~ e.to_s
|
67
|
+
flunk "ROLLBACK TO SAVEPOINT query issued for savepoint that no longer exists due to deadlock: #{e}"
|
68
|
+
else
|
69
|
+
raise e
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
require "models/post"
|
5
|
+
|
6
|
+
if supports_optimizer_hints?
|
7
|
+
class Mysql2OptimzerHintsTest < ActiveRecord::Mysql2TestCase
|
8
|
+
fixtures :posts
|
9
|
+
|
10
|
+
def test_optimizer_hints
|
11
|
+
assert_sql(%r{\ASELECT /\*\+ NO_RANGE_OPTIMIZATION\(posts index_posts_on_author_id\) \*/}) do
|
12
|
+
posts = Post.optimizer_hints("NO_RANGE_OPTIMIZATION(posts index_posts_on_author_id)")
|
13
|
+
posts = posts.select(:id).where(author_id: [0, 1])
|
14
|
+
assert_includes posts.explain, "| index | index_posts_on_author_id | index_posts_on_author_id |"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_optimizer_hints_with_count_subquery
|
19
|
+
assert_sql(%r{\ASELECT /\*\+ NO_RANGE_OPTIMIZATION\(posts index_posts_on_author_id\) \*/}) do
|
20
|
+
posts = Post.optimizer_hints("NO_RANGE_OPTIMIZATION(posts index_posts_on_author_id)")
|
21
|
+
posts = posts.select(:id).where(author_id: [0, 1]).limit(5)
|
22
|
+
assert_equal 5, posts.count
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_optimizer_hints_is_sanitized
|
27
|
+
assert_sql(%r{\ASELECT /\*\+ NO_RANGE_OPTIMIZATION\(posts index_posts_on_author_id\) \*/}) do
|
28
|
+
posts = Post.optimizer_hints("/*+ NO_RANGE_OPTIMIZATION(posts index_posts_on_author_id) */")
|
29
|
+
posts = posts.select(:id).where(author_id: [0, 1])
|
30
|
+
assert_includes posts.explain, "| index | index_posts_on_author_id | index_posts_on_author_id |"
|
31
|
+
end
|
32
|
+
|
33
|
+
assert_sql(%r{\ASELECT /\*\+ `posts`\.\*, \*/}) do
|
34
|
+
posts = Post.optimizer_hints("**// `posts`.*, //**")
|
35
|
+
posts = posts.select(:id).where(author_id: [0, 1])
|
36
|
+
assert_equal({ "id" => 1 }, posts.first.as_json)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_optimizer_hints_with_unscope
|
41
|
+
assert_sql(%r{\ASELECT `posts`\.`id`}) do
|
42
|
+
posts = Post.optimizer_hints("/*+ NO_RANGE_OPTIMIZATION(posts index_posts_on_author_id) */")
|
43
|
+
posts = posts.select(:id).where(author_id: [0, 1])
|
44
|
+
posts.unscope(:optimizer_hints).load
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_optimizer_hints_with_or
|
49
|
+
assert_sql(%r{\ASELECT /\*\+ NO_RANGE_OPTIMIZATION\(posts index_posts_on_author_id\) \*/}) do
|
50
|
+
Post.optimizer_hints("NO_RANGE_OPTIMIZATION(posts index_posts_on_author_id)")
|
51
|
+
.or(Post.all).load
|
52
|
+
end
|
53
|
+
|
54
|
+
queries = capture_sql do
|
55
|
+
Post.optimizer_hints("NO_RANGE_OPTIMIZATION(posts index_posts_on_author_id)")
|
56
|
+
.or(Post.optimizer_hints("NO_ICP(posts)")).load
|
57
|
+
end
|
58
|
+
assert_equal 1, queries.length
|
59
|
+
assert_includes queries.first, "NO_RANGE_OPTIMIZATION(posts index_posts_on_author_id)"
|
60
|
+
assert_not_includes queries.first, "NO_ICP(posts)"
|
61
|
+
|
62
|
+
queries = capture_sql do
|
63
|
+
Post.all.or(Post.optimizer_hints("NO_ICP(posts)")).load
|
64
|
+
end
|
65
|
+
assert_equal 1, queries.length
|
66
|
+
assert_not_includes queries.first, "NO_ICP(posts)"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
# a suite of tests to ensure the ConnectionAdapters#MysqlAdapter can handle tables with
|
4
|
+
# reserved word names (ie: group, order, values, etc...)
|
5
|
+
class Mysql2ReservedWordTest < ActiveRecord::Mysql2TestCase
|
6
|
+
class Group < ActiveRecord::Base
|
7
|
+
Group.table_name = 'group'
|
8
|
+
belongs_to :select
|
9
|
+
has_one :values
|
10
|
+
end
|
11
|
+
|
12
|
+
class Select < ActiveRecord::Base
|
13
|
+
Select.table_name = 'select'
|
14
|
+
has_many :groups
|
15
|
+
end
|
16
|
+
|
17
|
+
class Values < ActiveRecord::Base
|
18
|
+
Values.table_name = 'values'
|
19
|
+
end
|
20
|
+
|
21
|
+
class Distinct < ActiveRecord::Base
|
22
|
+
Distinct.table_name = 'distinct'
|
23
|
+
has_and_belongs_to_many :selects
|
24
|
+
has_many :values, :through => :groups
|
25
|
+
end
|
26
|
+
|
27
|
+
def setup
|
28
|
+
@connection = ActiveRecord::Base.connection
|
29
|
+
|
30
|
+
# we call execute directly here (and do similar below) because ActiveRecord::Base#create_table()
|
31
|
+
# will fail with these table names if these test cases fail
|
32
|
+
|
33
|
+
create_tables_directly 'group'=>'id int auto_increment primary key, `order` varchar(255), select_id int',
|
34
|
+
'select'=>'id int auto_increment primary key',
|
35
|
+
'values'=>'id int auto_increment primary key, group_id int',
|
36
|
+
'distinct'=>'id int auto_increment primary key',
|
37
|
+
'distinct_select'=>'distinct_id int, select_id int'
|
38
|
+
end
|
39
|
+
|
40
|
+
teardown do
|
41
|
+
drop_tables_directly ['group', 'select', 'values', 'distinct', 'distinct_select', 'order']
|
42
|
+
end
|
43
|
+
|
44
|
+
# create tables with reserved-word names and columns
|
45
|
+
def test_create_tables
|
46
|
+
assert_nothing_raised {
|
47
|
+
@connection.create_table :order do |t|
|
48
|
+
t.column :group, :string
|
49
|
+
end
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
# rename tables with reserved-word names
|
54
|
+
def test_rename_tables
|
55
|
+
assert_nothing_raised { @connection.rename_table(:group, :order) }
|
56
|
+
end
|
57
|
+
|
58
|
+
# alter column with a reserved-word name in a table with a reserved-word name
|
59
|
+
def test_change_columns
|
60
|
+
assert_nothing_raised { @connection.change_column_default(:group, :order, 'whatever') }
|
61
|
+
#the quoting here will reveal any double quoting issues in change_column's interaction with the column method in the adapter
|
62
|
+
assert_nothing_raised { @connection.change_column('group', 'order', :Int, :default => 0) }
|
63
|
+
assert_nothing_raised { @connection.rename_column(:group, :order, :values) }
|
64
|
+
end
|
65
|
+
|
66
|
+
# introspect table with reserved word name
|
67
|
+
def test_introspect
|
68
|
+
assert_nothing_raised { @connection.columns(:group) }
|
69
|
+
assert_nothing_raised { @connection.indexes(:group) }
|
70
|
+
end
|
71
|
+
|
72
|
+
#fixtures
|
73
|
+
self.use_instantiated_fixtures = true
|
74
|
+
self.use_transactional_tests = false
|
75
|
+
|
76
|
+
#activerecord model class with reserved-word table name
|
77
|
+
def test_activerecord_model
|
78
|
+
create_test_fixtures :select, :distinct, :group, :values, :distinct_select
|
79
|
+
x = nil
|
80
|
+
assert_nothing_raised { x = Group.new }
|
81
|
+
x.order = 'x'
|
82
|
+
assert_nothing_raised { x.save }
|
83
|
+
x.order = 'y'
|
84
|
+
assert_nothing_raised { x.save }
|
85
|
+
assert_nothing_raised { Group.find_by_order('y') }
|
86
|
+
assert_nothing_raised { Group.find(1) }
|
87
|
+
end
|
88
|
+
|
89
|
+
# has_one association with reserved-word table name
|
90
|
+
def test_has_one_associations
|
91
|
+
create_test_fixtures :select, :distinct, :group, :values, :distinct_select
|
92
|
+
v = nil
|
93
|
+
assert_nothing_raised { v = Group.find(1).values }
|
94
|
+
assert_equal 2, v.id
|
95
|
+
end
|
96
|
+
|
97
|
+
# belongs_to association with reserved-word table name
|
98
|
+
def test_belongs_to_associations
|
99
|
+
create_test_fixtures :select, :distinct, :group, :values, :distinct_select
|
100
|
+
gs = nil
|
101
|
+
assert_nothing_raised { gs = Select.find(2).groups }
|
102
|
+
assert_equal gs.length, 2
|
103
|
+
assert(gs.collect(&:id).sort == [2, 3])
|
104
|
+
end
|
105
|
+
|
106
|
+
# has_and_belongs_to_many with reserved-word table name
|
107
|
+
def test_has_and_belongs_to_many
|
108
|
+
create_test_fixtures :select, :distinct, :group, :values, :distinct_select
|
109
|
+
s = nil
|
110
|
+
assert_nothing_raised { s = Distinct.find(1).selects }
|
111
|
+
assert_equal s.length, 2
|
112
|
+
assert(s.collect(&:id).sort == [1, 2])
|
113
|
+
end
|
114
|
+
|
115
|
+
# activerecord model introspection with reserved-word table and column names
|
116
|
+
def test_activerecord_introspection
|
117
|
+
assert_nothing_raised { Group.table_exists? }
|
118
|
+
assert_nothing_raised { Group.columns }
|
119
|
+
end
|
120
|
+
|
121
|
+
# Calculations
|
122
|
+
def test_calculations_work_with_reserved_words
|
123
|
+
assert_nothing_raised { Group.count }
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_associations_work_with_reserved_words
|
127
|
+
assert_nothing_raised { Select.all.merge!(:includes => [:groups]).to_a }
|
128
|
+
end
|
129
|
+
|
130
|
+
#the following functions were added to DRY test cases
|
131
|
+
|
132
|
+
private
|
133
|
+
# custom fixture loader, uses FixtureSet#create_fixtures and appends base_path to the current file's path
|
134
|
+
def create_test_fixtures(*fixture_names)
|
135
|
+
ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT + "/reserved_words", fixture_names)
|
136
|
+
end
|
137
|
+
|
138
|
+
# custom drop table, uses execute on connection to drop a table if it exists. note: escapes table_name
|
139
|
+
def drop_tables_directly(table_names, connection = @connection)
|
140
|
+
table_names.each do |name|
|
141
|
+
connection.drop_table name, if_exists: true
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# custom create table, uses execute on connection to create a table, note: escapes table_name, does NOT escape columns
|
146
|
+
def create_tables_directly(tables, connection = @connection)
|
147
|
+
tables.each do |table_name, column_properties|
|
148
|
+
connection.execute("CREATE TABLE `#{table_name}` ( #{column_properties} )")
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
|
5
|
+
class SchemaMigrationsTest < ActiveRecord::Mysql2TestCase
|
6
|
+
self.use_transactional_tests = false
|
7
|
+
|
8
|
+
def test_renaming_index_on_foreign_key
|
9
|
+
connection.add_index "engines", "car_id"
|
10
|
+
connection.add_foreign_key :engines, :cars, name: "fk_engines_cars"
|
11
|
+
|
12
|
+
connection.rename_index("engines", "index_engines_on_car_id", "idx_renamed")
|
13
|
+
assert_equal ["idx_renamed"], connection.indexes("engines").map(&:name)
|
14
|
+
ensure
|
15
|
+
connection.remove_foreign_key :engines, name: "fk_engines_cars"
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_initializes_schema_migrations_for_encoding_utf8mb4
|
19
|
+
with_encoding_utf8mb4 do
|
20
|
+
table_name = ActiveRecord::SchemaMigration.table_name
|
21
|
+
connection.drop_table table_name, if_exists: true
|
22
|
+
|
23
|
+
ActiveRecord::SchemaMigration.create_table
|
24
|
+
|
25
|
+
assert connection.column_exists?(table_name, :version, :string)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_initializes_internal_metadata_for_encoding_utf8mb4
|
30
|
+
with_encoding_utf8mb4 do
|
31
|
+
table_name = ActiveRecord::InternalMetadata.table_name
|
32
|
+
connection.drop_table table_name, if_exists: true
|
33
|
+
|
34
|
+
ActiveRecord::InternalMetadata.create_table
|
35
|
+
|
36
|
+
assert connection.column_exists?(table_name, :key, :string)
|
37
|
+
end
|
38
|
+
ensure
|
39
|
+
ActiveRecord::InternalMetadata[:environment] = connection.migration_context.current_environment
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def with_encoding_utf8mb4
|
44
|
+
database_name = connection.current_database
|
45
|
+
database_info = connection.select_one("SELECT * FROM information_schema.schemata WHERE schema_name = '#{database_name}'")
|
46
|
+
|
47
|
+
original_charset = database_info["DEFAULT_CHARACTER_SET_NAME"]
|
48
|
+
original_collation = database_info["DEFAULT_COLLATION_NAME"]
|
49
|
+
|
50
|
+
execute("ALTER DATABASE #{database_name} DEFAULT CHARACTER SET utf8mb4")
|
51
|
+
|
52
|
+
yield
|
53
|
+
ensure
|
54
|
+
execute("ALTER DATABASE #{database_name} DEFAULT CHARACTER SET #{original_charset} COLLATE #{original_collation}")
|
55
|
+
end
|
56
|
+
|
57
|
+
def connection
|
58
|
+
@connection ||= ActiveRecord::Base.connection
|
59
|
+
end
|
60
|
+
|
61
|
+
def execute(sql)
|
62
|
+
connection.execute(sql)
|
63
|
+
end
|
64
|
+
end
|