ibm_db 5.2.0-x86-mingw32 → 5.4.0-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES +9 -0
- data/LICENSE +55 -18
- data/README +1 -1
- data/debug.log +1 -0
- data/ext/Makefile +28 -24
- data/ext/ibm_db.c +66 -65
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +26 -24
- data/ext/ruby_ibm_db_cli.c +1 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
- data/lib/ibm_db.so +1 -0
- data/lib/mswin32/ibm_db.rb +3 -1
- data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
- data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
- data/test/activejob/destroy_association_async_test.rb +305 -0
- data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
- data/test/activejob/helper.rb +15 -0
- data/test/assets/schema_dump_5_1.yml +345 -0
- data/test/cases/adapter_prevent_writes_test.rb +334 -0
- data/test/cases/adapter_test.rb +432 -218
- data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
- data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
- data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
- data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
- data/test/cases/adapters/mysql2/connection_test.rb +48 -50
- data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
- data/test/cases/adapters/mysql2/enum_test.rb +32 -11
- data/test/cases/adapters/mysql2/explain_test.rb +13 -11
- data/test/cases/adapters/mysql2/json_test.rb +17 -188
- data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
- data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
- data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
- data/test/cases/adapters/mysql2/schema_test.rb +24 -22
- data/test/cases/adapters/mysql2/set_test.rb +32 -0
- data/test/cases/adapters/mysql2/sp_test.rb +10 -8
- data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
- data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
- data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
- data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
- data/test/cases/adapters/postgresql/array_test.rb +118 -63
- data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
- data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
- data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
- data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
- data/test/cases/adapters/postgresql/citext_test.rb +58 -58
- data/test/cases/adapters/postgresql/collation_test.rb +17 -15
- data/test/cases/adapters/postgresql/composite_test.rb +25 -23
- data/test/cases/adapters/postgresql/connection_test.rb +73 -85
- data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
- data/test/cases/adapters/postgresql/date_test.rb +42 -0
- data/test/cases/adapters/postgresql/domain_test.rb +9 -7
- data/test/cases/adapters/postgresql/enum_test.rb +12 -10
- data/test/cases/adapters/postgresql/explain_test.rb +10 -8
- data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
- data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
- data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
- data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
- data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
- data/test/cases/adapters/postgresql/integer_test.rb +2 -0
- data/test/cases/adapters/postgresql/interval_test.rb +99 -0
- data/test/cases/adapters/postgresql/json_test.rb +16 -201
- data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
- data/test/cases/adapters/postgresql/money_test.rb +47 -16
- data/test/cases/adapters/postgresql/network_test.rb +36 -28
- data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
- data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
- data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
- data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
- data/test/cases/adapters/postgresql/range_test.rb +406 -292
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
- data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
- data/test/cases/adapters/postgresql/schema_test.rb +207 -91
- data/test/cases/adapters/postgresql/serial_test.rb +9 -7
- data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
- data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
- data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
- data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
- data/test/cases/adapters/postgresql/utils_test.rb +11 -9
- data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
- data/test/cases/adapters/postgresql/xml_test.rb +10 -14
- data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
- data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
- data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
- data/test/cases/adapters/sqlite3/json_test.rb +29 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
- data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
- data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
- data/test/cases/aggregations_test.rb +14 -12
- data/test/cases/annotate_test.rb +46 -0
- data/test/cases/ar_schema_test.rb +153 -86
- data/test/cases/arel/attributes/attribute_test.rb +1145 -0
- data/test/cases/arel/attributes/math_test.rb +83 -0
- data/test/cases/arel/attributes_test.rb +27 -0
- data/test/cases/arel/collectors/bind_test.rb +40 -0
- data/test/cases/arel/collectors/composite_test.rb +47 -0
- data/test/cases/arel/collectors/sql_string_test.rb +41 -0
- data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
- data/test/cases/arel/crud_test.rb +65 -0
- data/test/cases/arel/delete_manager_test.rb +53 -0
- data/test/cases/arel/factory_methods_test.rb +46 -0
- data/test/cases/arel/helper.rb +45 -0
- data/test/cases/arel/insert_manager_test.rb +241 -0
- data/test/cases/arel/nodes/and_test.rb +30 -0
- data/test/cases/arel/nodes/as_test.rb +36 -0
- data/test/cases/arel/nodes/ascending_test.rb +46 -0
- data/test/cases/arel/nodes/bin_test.rb +35 -0
- data/test/cases/arel/nodes/binary_test.rb +29 -0
- data/test/cases/arel/nodes/bind_param_test.rb +22 -0
- data/test/cases/arel/nodes/case_test.rb +96 -0
- data/test/cases/arel/nodes/casted_test.rb +18 -0
- data/test/cases/arel/nodes/comment_test.rb +22 -0
- data/test/cases/arel/nodes/count_test.rb +35 -0
- data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
- data/test/cases/arel/nodes/descending_test.rb +46 -0
- data/test/cases/arel/nodes/distinct_test.rb +21 -0
- data/test/cases/arel/nodes/equality_test.rb +62 -0
- data/test/cases/arel/nodes/extract_test.rb +43 -0
- data/test/cases/arel/nodes/false_test.rb +21 -0
- data/test/cases/arel/nodes/grouping_test.rb +26 -0
- data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
- data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
- data/test/cases/arel/nodes/named_function_test.rb +48 -0
- data/test/cases/arel/nodes/node_test.rb +22 -0
- data/test/cases/arel/nodes/not_test.rb +31 -0
- data/test/cases/arel/nodes/or_test.rb +36 -0
- data/test/cases/arel/nodes/over_test.rb +69 -0
- data/test/cases/arel/nodes/select_core_test.rb +79 -0
- data/test/cases/arel/nodes/select_statement_test.rb +51 -0
- data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
- data/test/cases/arel/nodes/sum_test.rb +35 -0
- data/test/cases/arel/nodes/table_alias_test.rb +29 -0
- data/test/cases/arel/nodes/true_test.rb +21 -0
- data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
- data/test/cases/arel/nodes/update_statement_test.rb +60 -0
- data/test/cases/arel/nodes/window_test.rb +81 -0
- data/test/cases/arel/nodes_test.rb +34 -0
- data/test/cases/arel/select_manager_test.rb +1238 -0
- data/test/cases/arel/support/fake_record.rb +135 -0
- data/test/cases/arel/table_test.rb +216 -0
- data/test/cases/arel/update_manager_test.rb +126 -0
- data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
- data/test/cases/arel/visitors/dot_test.rb +90 -0
- data/test/cases/arel/visitors/mysql_test.rb +157 -0
- data/test/cases/arel/visitors/postgres_test.rb +366 -0
- data/test/cases/arel/visitors/sqlite_test.rb +75 -0
- data/test/cases/arel/visitors/to_sql_test.rb +750 -0
- data/test/cases/associations/belongs_to_associations_test.rb +510 -158
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
- data/test/cases/associations/callbacks_test.rb +56 -38
- data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
- data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
- data/test/cases/associations/eager_singularization_test.rb +21 -21
- data/test/cases/associations/eager_test.rb +559 -415
- data/test/cases/associations/extension_test.rb +18 -12
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
- data/test/cases/associations/has_many_associations_test.rb +1038 -465
- data/test/cases/associations/has_many_through_associations_test.rb +558 -249
- data/test/cases/associations/has_one_associations_test.rb +294 -129
- data/test/cases/associations/has_one_through_associations_test.rb +121 -75
- data/test/cases/associations/inner_join_association_test.rb +114 -38
- data/test/cases/associations/inverse_associations_test.rb +606 -398
- data/test/cases/associations/join_model_test.rb +158 -148
- data/test/cases/associations/left_outer_join_association_test.rb +59 -24
- data/test/cases/associations/nested_through_associations_test.rb +166 -109
- data/test/cases/associations/required_test.rb +35 -10
- data/test/cases/associations_test.rb +241 -110
- data/test/cases/attribute_methods/read_test.rb +11 -11
- data/test/cases/attribute_methods_test.rb +413 -298
- data/test/cases/attributes_test.rb +145 -27
- data/test/cases/autosave_association_test.rb +681 -436
- data/test/cases/base_prevent_writes_test.rb +229 -0
- data/test/cases/base_test.rb +599 -542
- data/test/cases/batches_test.rb +288 -82
- data/test/cases/binary_test.rb +26 -31
- data/test/cases/bind_parameter_test.rb +194 -21
- data/test/cases/boolean_test.rb +52 -0
- data/test/cases/cache_key_test.rb +110 -5
- data/test/cases/calculations_test.rb +740 -177
- data/test/cases/callbacks_test.rb +74 -207
- data/test/cases/clone_test.rb +15 -10
- data/test/cases/coders/json_test.rb +2 -0
- data/test/cases/coders/yaml_column_test.rb +16 -13
- data/test/cases/collection_cache_key_test.rb +177 -20
- data/test/cases/column_alias_test.rb +9 -7
- data/test/cases/column_definition_test.rb +10 -68
- data/test/cases/comment_test.rb +166 -107
- data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
- data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
- data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
- data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
- data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
- data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
- data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
- data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
- data/test/cases/connection_management_test.rb +13 -11
- data/test/cases/connection_pool_test.rb +316 -83
- data/test/cases/core_test.rb +82 -58
- data/test/cases/counter_cache_test.rb +204 -50
- data/test/cases/custom_locking_test.rb +5 -3
- data/test/cases/database_configurations/hash_config_test.rb +74 -0
- data/test/cases/database_configurations/resolver_test.rb +150 -0
- data/test/cases/database_configurations_test.rb +145 -0
- data/test/cases/database_selector_test.rb +296 -0
- data/test/cases/database_statements_test.rb +18 -16
- data/test/cases/date_test.rb +8 -16
- data/test/cases/date_time_precision_test.rb +100 -78
- data/test/cases/date_time_test.rb +23 -8
- data/test/cases/defaults_test.rb +106 -71
- data/test/cases/delegated_type_test.rb +57 -0
- data/test/cases/dirty_test.rb +419 -223
- data/test/cases/disconnected_test.rb +6 -6
- data/test/cases/dup_test.rb +54 -27
- data/test/cases/enum_test.rb +461 -82
- data/test/cases/errors_test.rb +7 -7
- data/test/cases/explain_subscriber_test.rb +17 -15
- data/test/cases/explain_test.rb +11 -19
- data/test/cases/filter_attributes_test.rb +153 -0
- data/test/cases/finder_respond_to_test.rb +14 -14
- data/test/cases/finder_test.rb +669 -287
- data/test/cases/fixture_set/file_test.rb +34 -38
- data/test/cases/fixtures_test.rb +833 -176
- data/test/cases/forbidden_attributes_protection_test.rb +32 -67
- data/test/cases/habtm_destroy_order_test.rb +25 -25
- data/test/cases/helper.rb +78 -49
- data/test/cases/hot_compatibility_test.rb +33 -32
- data/test/cases/i18n_test.rb +18 -17
- data/test/cases/inheritance_test.rb +180 -115
- data/test/cases/insert_all_test.rb +489 -0
- data/test/cases/instrumentation_test.rb +101 -0
- data/test/cases/integration_test.rb +119 -31
- data/test/cases/invalid_connection_test.rb +18 -16
- data/test/cases/invertible_migration_test.rb +183 -43
- data/test/cases/json_attribute_test.rb +35 -0
- data/test/cases/json_serialization_test.rb +57 -58
- data/test/cases/json_shared_test_cases.rb +290 -0
- data/test/cases/locking_test.rb +413 -119
- data/test/cases/log_subscriber_test.rb +68 -26
- data/test/cases/marshal_serialization_test.rb +39 -0
- data/test/cases/migration/change_schema_test.rb +118 -72
- data/test/cases/migration/change_table_test.rb +138 -30
- data/test/cases/migration/check_constraint_test.rb +162 -0
- data/test/cases/migration/column_attributes_test.rb +45 -35
- data/test/cases/migration/column_positioning_test.rb +18 -6
- data/test/cases/migration/columns_test.rb +93 -77
- data/test/cases/migration/command_recorder_test.rb +121 -34
- data/test/cases/migration/compatibility_test.rb +578 -23
- data/test/cases/migration/create_join_table_test.rb +35 -25
- data/test/cases/migration/foreign_key_test.rb +503 -284
- data/test/cases/migration/helper.rb +4 -3
- data/test/cases/migration/index_test.rb +119 -70
- data/test/cases/migration/logger_test.rb +9 -6
- data/test/cases/migration/pending_migrations_test.rb +88 -34
- data/test/cases/migration/references_foreign_key_test.rb +164 -150
- data/test/cases/migration/references_index_test.rb +38 -19
- data/test/cases/migration/references_statements_test.rb +15 -14
- data/test/cases/migration/rename_table_test.rb +53 -30
- data/test/cases/migration_test.rb +637 -269
- data/test/cases/migrator_test.rb +191 -135
- data/test/cases/mixin_test.rb +7 -11
- data/test/cases/modules_test.rb +36 -34
- data/test/cases/multi_db_migrator_test.rb +223 -0
- data/test/cases/multiparameter_attributes_test.rb +60 -33
- data/test/cases/multiple_db_test.rb +16 -22
- data/test/cases/nested_attributes_test.rb +341 -320
- data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
- data/test/cases/null_relation_test.rb +84 -0
- data/test/cases/numeric_data_test.rb +93 -0
- data/test/cases/persistence_test.rb +361 -269
- data/test/cases/pooled_connections_test.rb +18 -26
- data/test/cases/prepared_statement_status_test.rb +48 -0
- data/test/cases/primary_keys_test.rb +210 -104
- data/test/cases/query_cache_test.rb +610 -141
- data/test/cases/quoting_test.rb +132 -31
- data/test/cases/readonly_test.rb +49 -48
- data/test/cases/reaper_test.rb +146 -32
- data/test/cases/reflection_test.rb +167 -156
- data/test/cases/relation/delegation_test.rb +49 -36
- data/test/cases/relation/delete_all_test.rb +117 -0
- data/test/cases/relation/merging_test.rb +319 -42
- data/test/cases/relation/mutation_test.rb +55 -93
- data/test/cases/relation/or_test.rb +129 -29
- data/test/cases/relation/predicate_builder_test.rb +21 -6
- data/test/cases/relation/record_fetch_warning_test.rb +5 -3
- data/test/cases/relation/select_test.rb +67 -0
- data/test/cases/relation/update_all_test.rb +317 -0
- data/test/cases/relation/where_chain_test.rb +68 -32
- data/test/cases/relation/where_clause_test.rb +136 -61
- data/test/cases/relation/where_test.rb +155 -48
- data/test/cases/relation_test.rb +266 -112
- data/test/cases/relations_test.rb +969 -744
- data/test/cases/reload_models_test.rb +13 -9
- data/test/cases/reserved_word_test.rb +141 -0
- data/test/cases/result_test.rb +68 -17
- data/test/cases/sanitize_test.rb +87 -71
- data/test/cases/schema_dumper_test.rb +221 -128
- data/test/cases/schema_loading_test.rb +3 -2
- data/test/cases/scoping/default_scoping_test.rb +185 -144
- data/test/cases/scoping/named_scoping_test.rb +177 -89
- data/test/cases/scoping/relation_scoping_test.rb +197 -75
- data/test/cases/secure_token_test.rb +18 -3
- data/test/cases/serialization_test.rb +30 -28
- data/test/cases/serialized_attribute_test.rb +133 -42
- data/test/cases/signed_id_test.rb +168 -0
- data/test/cases/statement_cache_test.rb +41 -24
- data/test/cases/statement_invalid_test.rb +42 -0
- data/test/cases/store_test.rb +180 -55
- data/test/cases/strict_loading_test.rb +473 -0
- data/test/cases/suppressor_test.rb +26 -12
- data/test/cases/tasks/database_tasks_test.rb +1258 -194
- data/test/cases/tasks/mysql_rake_test.rb +370 -298
- data/test/cases/tasks/postgresql_rake_test.rb +481 -251
- data/test/cases/tasks/sqlite_rake_test.rb +225 -178
- data/test/cases/test_case.rb +51 -40
- data/test/cases/test_databases_test.rb +79 -0
- data/test/cases/test_fixtures_test.rb +79 -19
- data/test/cases/time_precision_test.rb +98 -76
- data/test/cases/timestamp_test.rb +102 -99
- data/test/cases/touch_later_test.rb +12 -10
- data/test/cases/transaction_callbacks_test.rb +344 -90
- data/test/cases/transaction_isolation_test.rb +12 -12
- data/test/cases/transactions_test.rb +612 -162
- data/test/cases/type/adapter_specific_registry_test.rb +14 -2
- data/test/cases/type/date_time_test.rb +4 -2
- data/test/cases/type/integer_test.rb +4 -2
- data/test/cases/type/string_test.rb +10 -8
- data/test/cases/type/time_test.rb +28 -0
- data/test/cases/type/type_map_test.rb +29 -28
- data/test/cases/type/unsigned_integer_test.rb +19 -0
- data/test/cases/type_test.rb +2 -0
- data/test/cases/types_test.rb +3 -1
- data/test/cases/unconnected_test.rb +14 -1
- data/test/cases/unsafe_raw_sql_test.rb +274 -0
- data/test/cases/validations/absence_validation_test.rb +19 -17
- data/test/cases/validations/association_validation_test.rb +30 -28
- data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
- data/test/cases/validations/i18n_validation_test.rb +22 -21
- data/test/cases/validations/length_validation_test.rb +34 -33
- data/test/cases/validations/numericality_validation_test.rb +181 -0
- data/test/cases/validations/presence_validation_test.rb +21 -19
- data/test/cases/validations/uniqueness_validation_test.rb +156 -86
- data/test/cases/validations_repair_helper.rb +2 -0
- data/test/cases/validations_test.rb +61 -26
- data/test/cases/view_test.rb +122 -116
- data/test/cases/yaml_serialization_test.rb +79 -34
- data/test/config.example.yml +19 -19
- data/test/config.rb +3 -1
- data/test/config.yml +16 -6
- data/test/fixtures/all/namespaced/accounts.yml +2 -0
- data/test/fixtures/author_addresses.yml +1 -8
- data/test/fixtures/authors.yml +1 -7
- data/test/fixtures/binaries.yml +4 -0
- data/test/fixtures/books.yml +9 -2
- data/test/fixtures/categories_posts.yml +3 -0
- data/test/fixtures/citations.yml +5 -0
- data/test/fixtures/comments.yml +7 -0
- data/test/fixtures/companies.yml +5 -0
- data/test/fixtures/computers.yml +2 -0
- data/test/fixtures/customers.yml +10 -1
- data/test/fixtures/developers.yml +1 -1
- data/test/fixtures/essays.yml +10 -0
- data/test/fixtures/faces.yml +3 -3
- data/test/fixtures/humans.yml +5 -0
- data/test/fixtures/interests.yml +7 -7
- data/test/fixtures/memberships.yml +7 -0
- data/test/fixtures/minimalistics.yml +3 -0
- data/test/fixtures/mixed_case_monkeys.yml +2 -2
- data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
- data/test/fixtures/naked/yml/parrots.yml +1 -0
- data/test/fixtures/other_books.yml +26 -0
- data/test/fixtures/other_posts.yml +1 -0
- data/test/fixtures/parrots.yml +7 -1
- data/test/fixtures/pirates.yml +3 -0
- data/test/fixtures/posts.yml +11 -3
- data/test/fixtures/readers.yml +6 -0
- data/test/fixtures/reserved_words/values.yml +2 -2
- data/test/fixtures/sponsors.yml +3 -0
- data/test/fixtures/strict_zines.yml +2 -0
- data/test/fixtures/subscribers.yml +1 -1
- data/test/fixtures/tasks.yml +1 -1
- data/test/fixtures/warehouse-things.yml +3 -0
- data/test/migrations/10_urban/9_add_expressions.rb +2 -0
- data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
- data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
- data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
- data/test/migrations/missing/1_people_have_last_names.rb +2 -0
- data/test/migrations/missing/3_we_need_reminders.rb +2 -0
- data/test/migrations/missing/4_innocent_jointable.rb +3 -1
- data/test/migrations/rename/1_we_need_things.rb +2 -0
- data/test/migrations/rename/2_rename_things.rb +2 -0
- data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy2/1_create_articles.rb +2 -0
- data/test/migrations/to_copy2/2_create_comments.rb +3 -1
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
- data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
- data/test/models/account.rb +46 -0
- data/test/models/admin/account.rb +3 -1
- data/test/models/admin/randomly_named_c1.rb +2 -0
- data/test/models/admin/user.rb +16 -8
- data/test/models/admin.rb +4 -2
- data/test/models/aircraft.rb +3 -1
- data/test/models/arunit2_model.rb +2 -0
- data/test/models/author.rb +153 -102
- data/test/models/auto_id.rb +2 -0
- data/test/models/autoloadable/extra_firm.rb +2 -0
- data/test/models/binary.rb +3 -1
- data/test/models/binary_field.rb +6 -0
- data/test/models/bird.rb +13 -1
- data/test/models/book.rb +14 -4
- data/test/models/book_destroy_async.rb +24 -0
- data/test/models/boolean.rb +5 -0
- data/test/models/bulb.rb +13 -4
- data/test/models/cake_designer.rb +2 -0
- data/test/models/car.rb +17 -10
- data/test/models/carrier.rb +2 -0
- data/test/models/cart.rb +5 -0
- data/test/models/cat.rb +2 -0
- data/test/models/categorization.rb +8 -6
- data/test/models/category.rb +28 -16
- data/test/models/chef.rb +2 -0
- data/test/models/citation.rb +5 -1
- data/test/models/club.rb +13 -10
- data/test/models/college.rb +4 -2
- data/test/models/column.rb +2 -0
- data/test/models/column_name.rb +2 -0
- data/test/models/comment.rb +32 -10
- data/test/models/company.rb +102 -106
- data/test/models/company_in_module.rb +27 -26
- data/test/models/computer.rb +3 -1
- data/test/models/contact.rb +15 -13
- data/test/models/content.rb +5 -3
- data/test/models/contract.rb +21 -3
- data/test/models/country.rb +2 -4
- data/test/models/course.rb +3 -1
- data/test/models/customer.rb +10 -8
- data/test/models/customer_carrier.rb +2 -0
- data/test/models/dashboard.rb +2 -0
- data/test/models/default.rb +2 -0
- data/test/models/department.rb +2 -0
- data/test/models/destroy_async_parent.rb +15 -0
- data/test/models/destroy_async_parent_soft_delete.rb +20 -0
- data/test/models/developer.rb +152 -85
- data/test/models/dl_keyed_belongs_to.rb +13 -0
- data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
- data/test/models/dl_keyed_has_many.rb +5 -0
- data/test/models/dl_keyed_has_many_through.rb +5 -0
- data/test/models/dl_keyed_has_one.rb +5 -0
- data/test/models/dl_keyed_join.rb +10 -0
- data/test/models/dog.rb +2 -0
- data/test/models/dog_lover.rb +2 -0
- data/test/models/doubloon.rb +3 -1
- data/test/models/drink_designer.rb +17 -0
- data/test/models/edge.rb +4 -2
- data/test/models/electron.rb +2 -0
- data/test/models/engine.rb +3 -2
- data/test/models/entrant.rb +2 -0
- data/test/models/entry.rb +5 -0
- data/test/models/essay.rb +6 -3
- data/test/models/essay_destroy_async.rb +12 -0
- data/test/models/event.rb +3 -1
- data/test/models/eye.rb +5 -3
- data/test/models/face.rb +14 -6
- data/test/models/family.rb +6 -0
- data/test/models/family_tree.rb +6 -0
- data/test/models/friendship.rb +5 -3
- data/test/models/frog.rb +8 -0
- data/test/models/guid.rb +3 -1
- data/test/models/guitar.rb +2 -0
- data/test/models/hotel.rb +5 -3
- data/test/models/human.rb +39 -0
- data/test/models/image.rb +3 -1
- data/test/models/interest.rb +14 -3
- data/test/models/invoice.rb +4 -2
- data/test/models/item.rb +3 -1
- data/test/models/job.rb +5 -3
- data/test/models/joke.rb +4 -2
- data/test/models/keyboard.rb +3 -1
- data/test/models/legacy_thing.rb +2 -0
- data/test/models/lesson.rb +2 -0
- data/test/models/line_item.rb +3 -1
- data/test/models/liquid.rb +2 -0
- data/test/models/matey.rb +3 -1
- data/test/models/measurement.rb +4 -0
- data/test/models/member.rb +23 -20
- data/test/models/member_detail.rb +3 -0
- data/test/models/member_type.rb +2 -0
- data/test/models/membership.rb +4 -1
- data/test/models/mentor.rb +3 -1
- data/test/models/message.rb +5 -0
- data/test/models/minimalistic.rb +2 -0
- data/test/models/minivan.rb +3 -2
- data/test/models/mixed_case_monkey.rb +3 -1
- data/test/models/molecule.rb +2 -0
- data/test/models/mouse.rb +6 -0
- data/test/models/movie.rb +2 -0
- data/test/models/node.rb +4 -2
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +2 -0
- data/test/models/numeric_data.rb +12 -0
- data/test/models/order.rb +4 -2
- data/test/models/organization.rb +9 -7
- data/test/models/other_dog.rb +3 -1
- data/test/models/owner.rb +6 -4
- data/test/models/parrot.rb +12 -4
- data/test/models/person.rb +59 -54
- data/test/models/personal_legacy_thing.rb +3 -1
- data/test/models/pet.rb +4 -2
- data/test/models/pet_treasure.rb +2 -0
- data/test/models/pirate.rb +67 -43
- data/test/models/possession.rb +3 -1
- data/test/models/post.rb +184 -86
- data/test/models/price_estimate.rb +11 -1
- data/test/models/professor.rb +3 -1
- data/test/models/project.rb +14 -12
- data/test/models/publisher/article.rb +2 -0
- data/test/models/publisher/magazine.rb +2 -0
- data/test/models/publisher.rb +2 -0
- data/test/models/randomly_named_c1.rb +2 -0
- data/test/models/rating.rb +5 -1
- data/test/models/reader.rb +7 -5
- data/test/models/recipe.rb +2 -0
- data/test/models/record.rb +2 -0
- data/test/models/reference.rb +6 -3
- data/test/models/reply.rb +39 -21
- data/test/models/room.rb +6 -0
- data/test/models/section.rb +6 -0
- data/test/models/seminar.rb +6 -0
- data/test/models/session.rb +6 -0
- data/test/models/ship.rb +12 -9
- data/test/models/ship_part.rb +5 -3
- data/test/models/shop.rb +4 -2
- data/test/models/shop_account.rb +2 -0
- data/test/models/speedometer.rb +2 -0
- data/test/models/sponsor.rb +8 -5
- data/test/models/squeak.rb +6 -0
- data/test/models/strict_zine.rb +7 -0
- data/test/models/string_key_object.rb +2 -0
- data/test/models/student.rb +2 -0
- data/test/models/subscriber.rb +4 -2
- data/test/models/subscription.rb +5 -1
- data/test/models/tag.rb +6 -3
- data/test/models/tagging.rb +13 -6
- data/test/models/task.rb +2 -0
- data/test/models/topic.rb +54 -19
- data/test/models/toy.rb +4 -0
- data/test/models/traffic_light.rb +2 -0
- data/test/models/treasure.rb +5 -3
- data/test/models/treaty.rb +2 -4
- data/test/models/tree.rb +2 -0
- data/test/models/tuning_peg.rb +2 -0
- data/test/models/tyre.rb +2 -0
- data/test/models/user.rb +12 -4
- data/test/models/uuid_child.rb +2 -0
- data/test/models/uuid_item.rb +2 -0
- data/test/models/uuid_parent.rb +2 -0
- data/test/models/vegetables.rb +12 -3
- data/test/models/vertex.rb +6 -4
- data/test/models/warehouse_thing.rb +2 -0
- data/test/models/wheel.rb +3 -1
- data/test/models/without_table.rb +3 -1
- data/test/models/zine.rb +3 -1
- data/test/schema/mysql2_specific_schema.rb +49 -35
- data/test/schema/oracle_specific_schema.rb +13 -15
- data/test/schema/postgresql_specific_schema.rb +51 -40
- data/test/schema/schema.rb +334 -154
- data/test/schema/sqlite_specific_schema.rb +9 -16
- data/test/support/config.rb +26 -26
- data/test/support/connection.rb +14 -8
- data/test/support/connection_helper.rb +3 -1
- data/test/support/ddl_helper.rb +2 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
- data/test/support/schema_dumping_helper.rb +2 -0
- data/test/support/stubs/strong_parameters.rb +40 -0
- data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
- data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
- metadata +192 -14
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
|
-
require
|
3
|
-
require
|
4
|
+
require "models/default"
|
5
|
+
require "support/schema_dumping_helper"
|
4
6
|
|
5
7
|
module PGSchemaHelper
|
6
8
|
def with_schema_search_path(schema_search_path)
|
@@ -17,32 +19,34 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
17
19
|
include PGSchemaHelper
|
18
20
|
self.use_transactional_tests = false
|
19
21
|
|
20
|
-
SCHEMA_NAME =
|
21
|
-
SCHEMA2_NAME =
|
22
|
-
TABLE_NAME =
|
23
|
-
CAPITALIZED_TABLE_NAME =
|
24
|
-
INDEX_A_NAME =
|
25
|
-
INDEX_B_NAME =
|
26
|
-
INDEX_C_NAME =
|
27
|
-
INDEX_D_NAME =
|
28
|
-
INDEX_E_NAME =
|
29
|
-
INDEX_A_COLUMN =
|
30
|
-
INDEX_B_COLUMN_S1 =
|
31
|
-
INDEX_B_COLUMN_S2 =
|
32
|
-
INDEX_C_COLUMN =
|
33
|
-
INDEX_D_COLUMN =
|
34
|
-
INDEX_E_COLUMN =
|
22
|
+
SCHEMA_NAME = "test_schema"
|
23
|
+
SCHEMA2_NAME = "test_schema2"
|
24
|
+
TABLE_NAME = "things"
|
25
|
+
CAPITALIZED_TABLE_NAME = "Things"
|
26
|
+
INDEX_A_NAME = "a_index_things_on_name"
|
27
|
+
INDEX_B_NAME = "b_index_things_on_different_columns_in_each_schema"
|
28
|
+
INDEX_C_NAME = "c_index_full_text_search"
|
29
|
+
INDEX_D_NAME = "d_index_things_on_description_desc"
|
30
|
+
INDEX_E_NAME = "e_index_things_on_name_vector"
|
31
|
+
INDEX_A_COLUMN = "name"
|
32
|
+
INDEX_B_COLUMN_S1 = "email"
|
33
|
+
INDEX_B_COLUMN_S2 = "moment"
|
34
|
+
INDEX_C_COLUMN = "(to_tsvector('english', coalesce(things.name, '')))"
|
35
|
+
INDEX_D_COLUMN = "description"
|
36
|
+
INDEX_E_COLUMN = "name_vector"
|
35
37
|
COLUMNS = [
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
"id integer",
|
39
|
+
"name character varying(50)",
|
40
|
+
"email character varying(50)",
|
41
|
+
"description character varying(100)",
|
42
|
+
"name_vector tsvector",
|
43
|
+
"moment timestamp without time zone default now()"
|
42
44
|
]
|
43
|
-
PK_TABLE_NAME =
|
44
|
-
UNMATCHED_SEQUENCE_NAME =
|
45
|
-
UNMATCHED_PK_TABLE_NAME =
|
45
|
+
PK_TABLE_NAME = "table_with_pk"
|
46
|
+
UNMATCHED_SEQUENCE_NAME = "unmatched_primary_key_default_value_seq"
|
47
|
+
UNMATCHED_PK_TABLE_NAME = "table_with_unmatched_sequence_for_pk"
|
48
|
+
PARTITIONED_TABLE = "measurements"
|
49
|
+
PARTITIONED_TABLE_INDEX = "index_measurements_on_logdate_and_city_id"
|
46
50
|
|
47
51
|
class Thing1 < ActiveRecord::Base
|
48
52
|
self.table_name = "test_schema.things"
|
@@ -61,7 +65,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
61
65
|
end
|
62
66
|
|
63
67
|
class Thing5 < ActiveRecord::Base
|
64
|
-
self.table_name =
|
68
|
+
self.table_name = "things"
|
65
69
|
end
|
66
70
|
|
67
71
|
class Song < ActiveRecord::Base
|
@@ -72,6 +76,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
72
76
|
class Album < ActiveRecord::Base
|
73
77
|
self.table_name = "music.albums"
|
74
78
|
has_and_belongs_to_many :songs
|
79
|
+
def self.default_scope; where(deleted: false); end
|
75
80
|
end
|
76
81
|
|
77
82
|
def setup
|
@@ -91,6 +96,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
91
96
|
@connection.execute "CREATE INDEX #{INDEX_E_NAME} ON #{SCHEMA_NAME}.#{TABLE_NAME} USING gin (#{INDEX_E_COLUMN});"
|
92
97
|
@connection.execute "CREATE INDEX #{INDEX_E_NAME} ON #{SCHEMA2_NAME}.#{TABLE_NAME} USING gin (#{INDEX_E_COLUMN});"
|
93
98
|
@connection.execute "CREATE TABLE #{SCHEMA_NAME}.#{PK_TABLE_NAME} (id serial primary key)"
|
99
|
+
@connection.execute "CREATE TABLE #{SCHEMA2_NAME}.#{PK_TABLE_NAME} (id serial primary key)"
|
94
100
|
@connection.execute "CREATE SEQUENCE #{SCHEMA_NAME}.#{UNMATCHED_SEQUENCE_NAME}"
|
95
101
|
@connection.execute "CREATE TABLE #{SCHEMA_NAME}.#{UNMATCHED_PK_TABLE_NAME} (id integer NOT NULL DEFAULT nextval('#{SCHEMA_NAME}.#{UNMATCHED_SEQUENCE_NAME}'::regclass), CONSTRAINT unmatched_pkey PRIMARY KEY (id))"
|
96
102
|
end
|
@@ -101,27 +107,27 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
101
107
|
end
|
102
108
|
|
103
109
|
def test_schema_names
|
104
|
-
|
110
|
+
schema_names = @connection.schema_names
|
111
|
+
assert_includes schema_names, "public"
|
112
|
+
assert_includes schema_names, "test_schema"
|
113
|
+
assert_includes schema_names, "test_schema2"
|
114
|
+
assert_includes schema_names, "hint_plan" if @connection.supports_optimizer_hints?
|
105
115
|
end
|
106
116
|
|
107
117
|
def test_create_schema
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
@connection.drop_schema "test_schema3"
|
113
|
-
end
|
118
|
+
@connection.create_schema "test_schema3"
|
119
|
+
assert @connection.schema_names.include? "test_schema3"
|
120
|
+
ensure
|
121
|
+
@connection.drop_schema "test_schema3"
|
114
122
|
end
|
115
123
|
|
116
124
|
def test_raise_create_schema_with_existing_schema
|
117
|
-
|
125
|
+
@connection.create_schema "test_schema3"
|
126
|
+
assert_raises(ActiveRecord::StatementInvalid) do
|
118
127
|
@connection.create_schema "test_schema3"
|
119
|
-
assert_raises(ActiveRecord::StatementInvalid) do
|
120
|
-
@connection.create_schema "test_schema3"
|
121
|
-
end
|
122
|
-
ensure
|
123
|
-
@connection.drop_schema "test_schema3"
|
124
128
|
end
|
129
|
+
ensure
|
130
|
+
@connection.drop_schema "test_schema3"
|
125
131
|
end
|
126
132
|
|
127
133
|
def test_drop_schema
|
@@ -130,7 +136,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
130
136
|
ensure
|
131
137
|
@connection.drop_schema "test_schema3"
|
132
138
|
end
|
133
|
-
|
139
|
+
assert_not_includes @connection.schema_names, "test_schema3"
|
134
140
|
end
|
135
141
|
|
136
142
|
def test_drop_schema_if_exists
|
@@ -143,15 +149,15 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
143
149
|
def test_habtm_table_name_with_schema
|
144
150
|
ActiveRecord::Base.connection.drop_schema "music", if_exists: true
|
145
151
|
ActiveRecord::Base.connection.create_schema "music"
|
146
|
-
ActiveRecord::Base.connection.execute
|
147
|
-
CREATE TABLE music.albums (id serial primary key);
|
152
|
+
ActiveRecord::Base.connection.execute <<~SQL
|
153
|
+
CREATE TABLE music.albums (id serial primary key, deleted boolean default false);
|
148
154
|
CREATE TABLE music.songs (id serial primary key);
|
149
155
|
CREATE TABLE music.albums_songs (album_id integer, song_id integer);
|
150
156
|
SQL
|
151
157
|
|
152
158
|
song = Song.create
|
153
|
-
|
154
|
-
assert_equal song, Song.includes(:albums).
|
159
|
+
album = song.albums.create
|
160
|
+
assert_equal song, Song.includes(:albums).where("albums.id": album.id).first
|
155
161
|
ensure
|
156
162
|
ActiveRecord::Base.connection.drop_schema "music", if_exists: true
|
157
163
|
end
|
@@ -168,21 +174,21 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
168
174
|
|
169
175
|
def test_raise_wrapped_exception_on_bad_prepare
|
170
176
|
assert_raises(ActiveRecord::StatementInvalid) do
|
171
|
-
@connection.exec_query "select * from developers where id = ?",
|
177
|
+
@connection.exec_query "select * from developers where id = ?", "sql", [bind_param(1)]
|
172
178
|
end
|
173
179
|
end
|
174
180
|
|
175
181
|
if ActiveRecord::Base.connection.prepared_statements
|
176
182
|
def test_schema_change_with_prepared_stmt
|
177
183
|
altered = false
|
178
|
-
@connection.exec_query "select * from developers where id = $1",
|
179
|
-
@connection.exec_query "alter table developers add column zomg int",
|
184
|
+
@connection.exec_query "select * from developers where id = $1", "sql", [bind_param(1)]
|
185
|
+
@connection.exec_query "alter table developers add column zomg int", "sql", []
|
180
186
|
altered = true
|
181
|
-
@connection.exec_query "select * from developers where id = $1",
|
187
|
+
@connection.exec_query "select * from developers where id = $1", "sql", [bind_param(1)]
|
182
188
|
ensure
|
183
189
|
# We are not using DROP COLUMN IF EXISTS because that syntax is only
|
184
190
|
# supported by pg 9.X
|
185
|
-
@connection.exec_query("alter table developers drop column zomg",
|
191
|
+
@connection.exec_query("alter table developers drop column zomg", "sql", []) if altered
|
186
192
|
end
|
187
193
|
end
|
188
194
|
|
@@ -200,13 +206,13 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
200
206
|
end
|
201
207
|
|
202
208
|
def test_data_source_exists_when_not_on_schema_search_path
|
203
|
-
with_schema_search_path(
|
204
|
-
|
209
|
+
with_schema_search_path("PUBLIC") do
|
210
|
+
assert_not(@connection.data_source_exists?(TABLE_NAME), "data_source exists but should not be found")
|
205
211
|
end
|
206
212
|
end
|
207
213
|
|
208
214
|
def test_data_source_exists_wrong_schema
|
209
|
-
|
215
|
+
assert_not(@connection.data_source_exists?("foo.things"), "data_source should not exist")
|
210
216
|
end
|
211
217
|
|
212
218
|
def test_data_source_exists_quoted_names
|
@@ -246,9 +252,9 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
246
252
|
end
|
247
253
|
|
248
254
|
def test_proper_encoding_of_table_name
|
249
|
-
assert_equal '"table_name"', @connection.quote_table_name(
|
255
|
+
assert_equal '"table_name"', @connection.quote_table_name("table_name")
|
250
256
|
assert_equal '"table.name"', @connection.quote_table_name('"table.name"')
|
251
|
-
assert_equal '"schema_name"."table_name"', @connection.quote_table_name(
|
257
|
+
assert_equal '"schema_name"."table_name"', @connection.quote_table_name("schema_name.table_name")
|
252
258
|
assert_equal '"schema_name"."table.name"', @connection.quote_table_name('schema_name."table.name"')
|
253
259
|
assert_equal '"schema.name"."table_name"', @connection.quote_table_name('"schema.name".table_name')
|
254
260
|
assert_equal '"schema.name"."table.name"', @connection.quote_table_name('"schema.name"."table.name"')
|
@@ -260,25 +266,25 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
260
266
|
assert_equal 0, Thing3.count
|
261
267
|
assert_equal 0, Thing4.count
|
262
268
|
|
263
|
-
Thing1.create(:
|
269
|
+
Thing1.create(id: 1, name: "thing1", email: "thing1@localhost", moment: Time.now)
|
264
270
|
assert_equal 1, Thing1.count
|
265
271
|
assert_equal 0, Thing2.count
|
266
272
|
assert_equal 0, Thing3.count
|
267
273
|
assert_equal 0, Thing4.count
|
268
274
|
|
269
|
-
Thing2.create(:
|
275
|
+
Thing2.create(id: 1, name: "thing1", email: "thing1@localhost", moment: Time.now)
|
270
276
|
assert_equal 1, Thing1.count
|
271
277
|
assert_equal 1, Thing2.count
|
272
278
|
assert_equal 0, Thing3.count
|
273
279
|
assert_equal 0, Thing4.count
|
274
280
|
|
275
|
-
Thing3.create(:
|
281
|
+
Thing3.create(id: 1, name: "thing1", email: "thing1@localhost", moment: Time.now)
|
276
282
|
assert_equal 1, Thing1.count
|
277
283
|
assert_equal 1, Thing2.count
|
278
284
|
assert_equal 1, Thing3.count
|
279
285
|
assert_equal 0, Thing4.count
|
280
286
|
|
281
|
-
Thing4.create(:
|
287
|
+
Thing4.create(id: 1, name: "thing1", email: "thing1@localhost", moment: Time.now)
|
282
288
|
assert_equal 1, Thing1.count
|
283
289
|
assert_equal 1, Thing2.count
|
284
290
|
assert_equal 1, Thing3.count
|
@@ -287,7 +293,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
287
293
|
|
288
294
|
def test_raise_on_unquoted_schema_name
|
289
295
|
assert_raises(ActiveRecord::StatementInvalid) do
|
290
|
-
with_schema_search_path
|
296
|
+
with_schema_search_path "$user,public"
|
291
297
|
end
|
292
298
|
end
|
293
299
|
|
@@ -301,13 +307,19 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
301
307
|
|
302
308
|
def test_index_name_exists
|
303
309
|
with_schema_search_path(SCHEMA_NAME) do
|
304
|
-
assert @connection.index_name_exists?(TABLE_NAME, INDEX_A_NAME
|
305
|
-
assert @connection.index_name_exists?(TABLE_NAME, INDEX_B_NAME
|
306
|
-
assert @connection.index_name_exists?(TABLE_NAME, INDEX_C_NAME
|
307
|
-
assert @connection.index_name_exists?(TABLE_NAME, INDEX_D_NAME
|
308
|
-
assert @connection.index_name_exists?(TABLE_NAME, INDEX_E_NAME
|
309
|
-
assert @connection.index_name_exists?(TABLE_NAME, INDEX_E_NAME
|
310
|
-
assert_not @connection.index_name_exists?(TABLE_NAME,
|
310
|
+
assert @connection.index_name_exists?(TABLE_NAME, INDEX_A_NAME)
|
311
|
+
assert @connection.index_name_exists?(TABLE_NAME, INDEX_B_NAME)
|
312
|
+
assert @connection.index_name_exists?(TABLE_NAME, INDEX_C_NAME)
|
313
|
+
assert @connection.index_name_exists?(TABLE_NAME, INDEX_D_NAME)
|
314
|
+
assert @connection.index_name_exists?(TABLE_NAME, INDEX_E_NAME)
|
315
|
+
assert @connection.index_name_exists?(TABLE_NAME, INDEX_E_NAME)
|
316
|
+
assert_not @connection.index_name_exists?(TABLE_NAME, "missing_index")
|
317
|
+
|
318
|
+
if supports_partitioned_indexes?
|
319
|
+
create_partitioned_table
|
320
|
+
create_partitioned_table_index
|
321
|
+
assert @connection.index_name_exists?(PARTITIONED_TABLE, PARTITIONED_TABLE_INDEX)
|
322
|
+
end
|
311
323
|
end
|
312
324
|
end
|
313
325
|
|
@@ -326,13 +338,29 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
326
338
|
def test_dump_indexes_for_table_with_scheme_specified_in_name
|
327
339
|
indexes = @connection.indexes("#{SCHEMA_NAME}.#{TABLE_NAME}")
|
328
340
|
assert_equal 5, indexes.size
|
341
|
+
|
342
|
+
if supports_partitioned_indexes?
|
343
|
+
create_partitioned_table
|
344
|
+
create_partitioned_table_index
|
345
|
+
indexes = @connection.indexes("#{SCHEMA_NAME}.#{PARTITIONED_TABLE}")
|
346
|
+
assert_equal 1, indexes.size
|
347
|
+
end
|
329
348
|
end
|
330
349
|
|
331
350
|
def test_with_uppercase_index_name
|
332
351
|
@connection.execute "CREATE INDEX \"things_Index\" ON #{SCHEMA_NAME}.things (name)"
|
333
352
|
|
334
353
|
with_schema_search_path SCHEMA_NAME do
|
335
|
-
assert_nothing_raised { @connection.remove_index "things", name: "things_Index"}
|
354
|
+
assert_nothing_raised { @connection.remove_index "things", name: "things_Index" }
|
355
|
+
end
|
356
|
+
|
357
|
+
if supports_partitioned_indexes?
|
358
|
+
create_partitioned_table
|
359
|
+
@connection.execute "CREATE INDEX \"#{PARTITIONED_TABLE}_Index\" ON #{SCHEMA_NAME}.#{PARTITIONED_TABLE} (logdate, city_id)"
|
360
|
+
|
361
|
+
with_schema_search_path SCHEMA_NAME do
|
362
|
+
assert_nothing_raised { @connection.remove_index PARTITIONED_TABLE, name: "#{PARTITIONED_TABLE}_Index" }
|
363
|
+
end
|
336
364
|
end
|
337
365
|
end
|
338
366
|
|
@@ -348,6 +376,22 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
348
376
|
|
349
377
|
@connection.execute "CREATE INDEX \"things_Index\" ON #{SCHEMA_NAME}.things (name)"
|
350
378
|
assert_raises(ArgumentError) { @connection.remove_index "#{SCHEMA2_NAME}.things", name: "#{SCHEMA_NAME}.things_Index" }
|
379
|
+
|
380
|
+
if supports_partitioned_indexes?
|
381
|
+
create_partitioned_table
|
382
|
+
|
383
|
+
@connection.execute "CREATE INDEX \"#{PARTITIONED_TABLE}_Index\" ON #{SCHEMA_NAME}.#{PARTITIONED_TABLE} (logdate, city_id)"
|
384
|
+
assert_nothing_raised { @connection.remove_index PARTITIONED_TABLE, name: "#{SCHEMA_NAME}.#{PARTITIONED_TABLE}_Index" }
|
385
|
+
|
386
|
+
@connection.execute "CREATE INDEX \"#{PARTITIONED_TABLE}_Index\" ON #{SCHEMA_NAME}.#{PARTITIONED_TABLE} (logdate, city_id)"
|
387
|
+
assert_nothing_raised { @connection.remove_index "#{SCHEMA_NAME}.#{PARTITIONED_TABLE}", name: "#{PARTITIONED_TABLE}_Index" }
|
388
|
+
|
389
|
+
@connection.execute "CREATE INDEX \"#{PARTITIONED_TABLE}_Index\" ON #{SCHEMA_NAME}.#{PARTITIONED_TABLE} (logdate, city_id)"
|
390
|
+
assert_nothing_raised { @connection.remove_index "#{SCHEMA_NAME}.#{PARTITIONED_TABLE}", name: "#{SCHEMA_NAME}.#{PARTITIONED_TABLE}_Index" }
|
391
|
+
|
392
|
+
@connection.execute "CREATE INDEX \"#{PARTITIONED_TABLE}_Index\" ON #{SCHEMA_NAME}.#{PARTITIONED_TABLE} (logdate, city_id)"
|
393
|
+
assert_raises(ArgumentError) { @connection.remove_index "#{SCHEMA2_NAME}.#{PARTITIONED_TABLE}", name: "#{SCHEMA_NAME}.#{PARTITIONED_TABLE}_Index" }
|
394
|
+
end
|
351
395
|
end
|
352
396
|
|
353
397
|
def test_primary_key_with_schema_specified
|
@@ -356,21 +400,13 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
356
400
|
%(#{SCHEMA_NAME}."#{PK_TABLE_NAME}"),
|
357
401
|
%(#{SCHEMA_NAME}.#{PK_TABLE_NAME})
|
358
402
|
].each do |given|
|
359
|
-
assert_equal
|
403
|
+
assert_equal "id", @connection.primary_key(given), "primary key should be found when table referenced as #{given}"
|
360
404
|
end
|
361
405
|
end
|
362
406
|
|
363
407
|
def test_primary_key_assuming_schema_search_path
|
364
|
-
with_schema_search_path(SCHEMA_NAME) do
|
365
|
-
assert_equal
|
366
|
-
end
|
367
|
-
end
|
368
|
-
|
369
|
-
def test_primary_key_raises_error_if_table_not_found_on_schema_search_path
|
370
|
-
with_schema_search_path(SCHEMA2_NAME) do
|
371
|
-
assert_raises(ActiveRecord::StatementInvalid) do
|
372
|
-
@connection.primary_key(PK_TABLE_NAME)
|
373
|
-
end
|
408
|
+
with_schema_search_path("#{SCHEMA_NAME}, #{SCHEMA2_NAME}") do
|
409
|
+
assert_equal "id", @connection.primary_key(PK_TABLE_NAME), "primary key should be found"
|
374
410
|
end
|
375
411
|
end
|
376
412
|
|
@@ -381,19 +417,19 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
381
417
|
%("#{SCHEMA_NAME}"."#{UNMATCHED_PK_TABLE_NAME}")
|
382
418
|
].each do |given|
|
383
419
|
pk, seq = @connection.pk_and_sequence_for(given)
|
384
|
-
assert_equal
|
420
|
+
assert_equal "id", pk, "primary key should be found when table referenced as #{given}"
|
385
421
|
assert_equal pg_name.new(SCHEMA_NAME, "#{PK_TABLE_NAME}_id_seq"), seq, "sequence name should be found when table referenced as #{given}" if given == %("#{SCHEMA_NAME}"."#{PK_TABLE_NAME}")
|
386
|
-
assert_equal pg_name.new(SCHEMA_NAME, UNMATCHED_SEQUENCE_NAME), seq, "sequence name should be found when table referenced as #{given}" if given ==
|
422
|
+
assert_equal pg_name.new(SCHEMA_NAME, UNMATCHED_SEQUENCE_NAME), seq, "sequence name should be found when table referenced as #{given}" if given == %("#{SCHEMA_NAME}"."#{UNMATCHED_PK_TABLE_NAME}")
|
387
423
|
end
|
388
424
|
end
|
389
425
|
|
390
426
|
def test_current_schema
|
391
427
|
{
|
392
|
-
%('$user',public) =>
|
428
|
+
%('$user',public) => "public",
|
393
429
|
SCHEMA_NAME => SCHEMA_NAME,
|
394
430
|
%(#{SCHEMA2_NAME},#{SCHEMA_NAME},public) => SCHEMA2_NAME,
|
395
|
-
%(public,#{SCHEMA2_NAME},#{SCHEMA_NAME}) =>
|
396
|
-
}.each do |given,expect|
|
431
|
+
%(public,#{SCHEMA2_NAME},#{SCHEMA_NAME}) => "public"
|
432
|
+
}.each do |given, expect|
|
397
433
|
with_schema_search_path(given) { assert_equal expect, @connection.current_schema }
|
398
434
|
end
|
399
435
|
end
|
@@ -401,7 +437,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
401
437
|
def test_prepared_statements_with_multiple_schemas
|
402
438
|
[SCHEMA_NAME, SCHEMA2_NAME].each do |schema_name|
|
403
439
|
with_schema_search_path schema_name do
|
404
|
-
Thing5.create(:
|
440
|
+
Thing5.create(id: 1, name: "thing inside #{SCHEMA_NAME}", email: "thing1@localhost", moment: Time.now)
|
405
441
|
end
|
406
442
|
end
|
407
443
|
|
@@ -414,11 +450,11 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
414
450
|
|
415
451
|
def test_schema_exists?
|
416
452
|
{
|
417
|
-
|
453
|
+
"public" => true,
|
418
454
|
SCHEMA_NAME => true,
|
419
455
|
SCHEMA2_NAME => true,
|
420
|
-
|
421
|
-
}.each do |given,expect|
|
456
|
+
"darkside" => false
|
457
|
+
}.each do |given, expect|
|
422
458
|
assert_equal expect, @connection.schema_exists?(given)
|
423
459
|
end
|
424
460
|
end
|
@@ -442,7 +478,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
442
478
|
private
|
443
479
|
def columns(table_name)
|
444
480
|
@connection.send(:column_definitions, table_name).map do |name, type, default|
|
445
|
-
"#{name} #{type}" + (default ? " default #{default}" :
|
481
|
+
"#{name} #{type}" + (default ? " default #{default}" : "")
|
446
482
|
end
|
447
483
|
end
|
448
484
|
|
@@ -464,7 +500,7 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
464
500
|
assert_equal :btree, index_d.using
|
465
501
|
assert_equal :gin, index_e.using
|
466
502
|
|
467
|
-
assert_equal :desc, index_d.orders
|
503
|
+
assert_equal :desc, index_d.orders
|
468
504
|
end
|
469
505
|
end
|
470
506
|
|
@@ -478,6 +514,14 @@ class SchemaTest < ActiveRecord::PostgreSQLTestCase
|
|
478
514
|
def bind_param(value)
|
479
515
|
ActiveRecord::Relation::QueryAttribute.new(nil, value, ActiveRecord::Type::Value.new)
|
480
516
|
end
|
517
|
+
|
518
|
+
def create_partitioned_table
|
519
|
+
@connection.execute "CREATE TABLE #{SCHEMA_NAME}.\"#{PARTITIONED_TABLE}\" (city_id integer not null, logdate date not null) PARTITION BY LIST (city_id)"
|
520
|
+
end
|
521
|
+
|
522
|
+
def create_partitioned_table_index
|
523
|
+
@connection.execute "CREATE INDEX #{PARTITIONED_TABLE_INDEX} ON #{SCHEMA_NAME}.#{PARTITIONED_TABLE} (logdate, city_id)"
|
524
|
+
end
|
481
525
|
end
|
482
526
|
|
483
527
|
class SchemaForeignKeyTest < ActiveRecord::PostgreSQLTestCase
|
@@ -505,6 +549,78 @@ class SchemaForeignKeyTest < ActiveRecord::PostgreSQLTestCase
|
|
505
549
|
end
|
506
550
|
end
|
507
551
|
|
552
|
+
class SchemaIndexOpclassTest < ActiveRecord::PostgreSQLTestCase
|
553
|
+
include SchemaDumpingHelper
|
554
|
+
|
555
|
+
setup do
|
556
|
+
@connection = ActiveRecord::Base.connection
|
557
|
+
@connection.create_table "trains" do |t|
|
558
|
+
t.string :name
|
559
|
+
t.string :position
|
560
|
+
t.text :description
|
561
|
+
end
|
562
|
+
end
|
563
|
+
|
564
|
+
teardown do
|
565
|
+
@connection.drop_table "trains", if_exists: true
|
566
|
+
end
|
567
|
+
|
568
|
+
def test_string_opclass_is_dumped
|
569
|
+
@connection.execute "CREATE INDEX trains_name_and_description ON trains USING btree(name text_pattern_ops, description text_pattern_ops)"
|
570
|
+
|
571
|
+
output = dump_table_schema "trains"
|
572
|
+
|
573
|
+
assert_match(/opclass: :text_pattern_ops/, output)
|
574
|
+
end
|
575
|
+
|
576
|
+
def test_non_default_opclass_is_dumped
|
577
|
+
@connection.execute "CREATE INDEX trains_name_and_description ON trains USING btree(name, description text_pattern_ops)"
|
578
|
+
|
579
|
+
output = dump_table_schema "trains"
|
580
|
+
|
581
|
+
assert_match(/opclass: \{ description: :text_pattern_ops \}/, output)
|
582
|
+
end
|
583
|
+
|
584
|
+
def test_opclass_class_parsing_on_non_reserved_and_cannot_be_function_or_type_keyword
|
585
|
+
@connection.enable_extension("pg_trgm")
|
586
|
+
@connection.execute "CREATE INDEX trains_position ON trains USING gin(position gin_trgm_ops)"
|
587
|
+
@connection.execute "CREATE INDEX trains_name_and_position ON trains USING btree(name, position text_pattern_ops)"
|
588
|
+
|
589
|
+
output = dump_table_schema "trains"
|
590
|
+
|
591
|
+
assert_match(/opclass: :gin_trgm_ops/, output)
|
592
|
+
assert_match(/opclass: \{ position: :text_pattern_ops \}/, output)
|
593
|
+
end
|
594
|
+
end
|
595
|
+
|
596
|
+
class SchemaIndexNullsOrderTest < ActiveRecord::PostgreSQLTestCase
|
597
|
+
include SchemaDumpingHelper
|
598
|
+
|
599
|
+
setup do
|
600
|
+
@connection = ActiveRecord::Base.connection
|
601
|
+
@connection.create_table "trains" do |t|
|
602
|
+
t.string :name
|
603
|
+
t.text :description
|
604
|
+
end
|
605
|
+
end
|
606
|
+
|
607
|
+
teardown do
|
608
|
+
@connection.drop_table "trains", if_exists: true
|
609
|
+
end
|
610
|
+
|
611
|
+
def test_nulls_order_is_dumped
|
612
|
+
@connection.execute "CREATE INDEX trains_name_and_description ON trains USING btree(name NULLS FIRST, description)"
|
613
|
+
output = dump_table_schema "trains"
|
614
|
+
assert_match(/order: \{ name: "NULLS FIRST" \}/, output)
|
615
|
+
end
|
616
|
+
|
617
|
+
def test_non_default_order_with_nulls_is_dumped
|
618
|
+
@connection.execute "CREATE INDEX trains_name_and_desc ON trains USING btree(name DESC NULLS LAST, description)"
|
619
|
+
output = dump_table_schema "trains"
|
620
|
+
assert_match(/order: \{ name: "DESC NULLS LAST" \}/, output)
|
621
|
+
end
|
622
|
+
end
|
623
|
+
|
508
624
|
class DefaultsUsingMultipleSchemasAndDomainTest < ActiveRecord::PostgreSQLTestCase
|
509
625
|
setup do
|
510
626
|
@connection = ActiveRecord::Base.connection
|
@@ -539,7 +655,7 @@ class DefaultsUsingMultipleSchemasAndDomainTest < ActiveRecord::PostgreSQLTestCa
|
|
539
655
|
end
|
540
656
|
|
541
657
|
def test_decimal_defaults_in_new_schema_when_overriding_domain
|
542
|
-
assert_equal BigDecimal
|
658
|
+
assert_equal BigDecimal("3.14159265358979323846"), Default.new.decimal_col, "Default of decimal column was not correctly parsed"
|
543
659
|
end
|
544
660
|
|
545
661
|
def test_bpchar_defaults_in_new_schema_when_overriding_domain
|
@@ -1,5 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
|
-
require
|
4
|
+
require "support/schema_dumping_helper"
|
3
5
|
|
4
6
|
class PostgresqlSerialTest < ActiveRecord::PostgreSQLTestCase
|
5
7
|
include SchemaDumpingHelper
|
@@ -22,14 +24,14 @@ class PostgresqlSerialTest < ActiveRecord::PostgreSQLTestCase
|
|
22
24
|
column = PostgresqlSerial.columns_hash["seq"]
|
23
25
|
assert_equal :integer, column.type
|
24
26
|
assert_equal "integer", column.sql_type
|
25
|
-
|
27
|
+
assert_predicate column, :serial?
|
26
28
|
end
|
27
29
|
|
28
30
|
def test_not_serial_column
|
29
31
|
column = PostgresqlSerial.columns_hash["serials_id"]
|
30
32
|
assert_equal :integer, column.type
|
31
33
|
assert_equal "integer", column.sql_type
|
32
|
-
|
34
|
+
assert_not_predicate column, :serial?
|
33
35
|
end
|
34
36
|
|
35
37
|
def test_schema_dump_with_shorthand
|
@@ -64,14 +66,14 @@ class PostgresqlBigSerialTest < ActiveRecord::PostgreSQLTestCase
|
|
64
66
|
column = PostgresqlBigSerial.columns_hash["seq"]
|
65
67
|
assert_equal :integer, column.type
|
66
68
|
assert_equal "bigint", column.sql_type
|
67
|
-
|
69
|
+
assert_predicate column, :serial?
|
68
70
|
end
|
69
71
|
|
70
72
|
def test_not_bigserial_column
|
71
73
|
column = PostgresqlBigSerial.columns_hash["serials_id"]
|
72
74
|
assert_equal :integer, column.type
|
73
75
|
assert_equal "bigint", column.sql_type
|
74
|
-
|
76
|
+
assert_not_predicate column, :serial?
|
75
77
|
end
|
76
78
|
|
77
79
|
def test_schema_dump_with_shorthand
|
@@ -109,7 +111,7 @@ module SequenceNameDetectionTestCases
|
|
109
111
|
columns = @connection.columns(:foo)
|
110
112
|
columns.each do |column|
|
111
113
|
assert_equal :integer, column.type
|
112
|
-
|
114
|
+
assert_predicate column, :serial?
|
113
115
|
end
|
114
116
|
end
|
115
117
|
|
@@ -140,7 +142,7 @@ module SequenceNameDetectionTestCases
|
|
140
142
|
columns = @connection.columns(@table_name)
|
141
143
|
columns.each do |column|
|
142
144
|
assert_equal :integer, column.type
|
143
|
-
|
145
|
+
assert_predicate column, :serial?
|
144
146
|
end
|
145
147
|
end
|
146
148
|
|
@@ -1,4 +1,8 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
require "models/computer"
|
5
|
+
require "models/developer"
|
2
6
|
|
3
7
|
module ActiveRecord
|
4
8
|
module ConnectionAdapters
|
@@ -14,27 +18,43 @@ module ActiveRecord
|
|
14
18
|
end
|
15
19
|
|
16
20
|
class StatementPoolTest < ActiveRecord::PostgreSQLTestCase
|
21
|
+
fixtures :developers
|
22
|
+
|
17
23
|
if Process.respond_to?(:fork)
|
18
24
|
def test_cache_is_per_pid
|
19
25
|
cache = StatementPool.new nil, 10
|
20
|
-
cache[
|
21
|
-
assert_equal
|
26
|
+
cache["foo"] = "bar"
|
27
|
+
assert_equal "bar", cache["foo"]
|
22
28
|
|
23
29
|
pid = fork {
|
24
|
-
lookup = cache[
|
30
|
+
lookup = cache["foo"]
|
25
31
|
exit!(!lookup)
|
26
32
|
}
|
27
33
|
|
28
34
|
Process.waitpid pid
|
29
|
-
assert $?.success?,
|
35
|
+
assert $?.success?, "process should exit successfully"
|
30
36
|
end
|
31
37
|
end
|
32
38
|
|
33
39
|
def test_dealloc_does_not_raise_on_inactive_connection
|
34
40
|
cache = StatementPool.new InactivePgConnection.new, 10
|
35
|
-
cache[
|
41
|
+
cache["foo"] = "bar"
|
36
42
|
assert_nothing_raised { cache.clear }
|
37
43
|
end
|
44
|
+
|
45
|
+
def test_prepared_statements_do_not_get_stuck_on_query_interruption
|
46
|
+
pg_connection = ActiveRecord::Base.connection.instance_variable_get(:@connection)
|
47
|
+
pg_connection.stub(:get_last_result, -> { raise "random error" }) do
|
48
|
+
assert_raises(RuntimeError) do
|
49
|
+
Developer.where(name: "David").last
|
50
|
+
end
|
51
|
+
|
52
|
+
# without fix, this raises PG::DuplicatePstatement: ERROR: prepared statement "a3" already exists
|
53
|
+
assert_raises(RuntimeError) do
|
54
|
+
Developer.where(name: "David").last
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
38
58
|
end
|
39
59
|
end
|
40
60
|
end
|