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,5 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
|
-
require
|
4
|
+
require "support/connection_helper"
|
3
5
|
|
4
6
|
module ActiveRecord
|
5
7
|
class PostgresqlConnectionTest < ActiveRecord::PostgreSQLTestCase
|
@@ -13,8 +15,9 @@ module ActiveRecord
|
|
13
15
|
def setup
|
14
16
|
super
|
15
17
|
@subscriber = SQLSubscriber.new
|
16
|
-
@subscription = ActiveSupport::Notifications.subscribe('sql.active_record', @subscriber)
|
17
18
|
@connection = ActiveRecord::Base.connection
|
19
|
+
@connection.materialize_transactions
|
20
|
+
@subscription = ActiveSupport::Notifications.subscribe("sql.active_record", @subscriber)
|
18
21
|
end
|
19
22
|
|
20
23
|
def teardown
|
@@ -22,24 +25,22 @@ module ActiveRecord
|
|
22
25
|
super
|
23
26
|
end
|
24
27
|
|
25
|
-
def test_truncate
|
26
|
-
count = ActiveRecord::Base.connection.execute("select count(*) from comments").first['count'].to_i
|
27
|
-
assert_operator count, :>, 0
|
28
|
-
ActiveRecord::Base.connection.truncate("comments")
|
29
|
-
count = ActiveRecord::Base.connection.execute("select count(*) from comments").first['count'].to_i
|
30
|
-
assert_equal 0, count
|
31
|
-
end
|
32
|
-
|
33
28
|
def test_encoding
|
34
|
-
|
29
|
+
assert_queries(1, ignore_none: true) do
|
30
|
+
assert_not_nil @connection.encoding
|
31
|
+
end
|
35
32
|
end
|
36
33
|
|
37
34
|
def test_collation
|
38
|
-
|
35
|
+
assert_queries(1, ignore_none: true) do
|
36
|
+
assert_not_nil @connection.collation
|
37
|
+
end
|
39
38
|
end
|
40
39
|
|
41
40
|
def test_ctype
|
42
|
-
|
41
|
+
assert_queries(1, ignore_none: true) do
|
42
|
+
assert_not_nil @connection.ctype
|
43
|
+
end
|
43
44
|
end
|
44
45
|
|
45
46
|
def test_default_client_min_messages
|
@@ -49,133 +50,114 @@ module ActiveRecord
|
|
49
50
|
# Ensure, we can set connection params using the example of Generic
|
50
51
|
# Query Optimizer (geqo). It is 'on' per default.
|
51
52
|
def test_connection_options
|
52
|
-
params = ActiveRecord::Base.
|
53
|
+
params = ActiveRecord::Base.connection_db_config.configuration_hash.dup
|
53
54
|
params[:options] = "-c geqo=off"
|
54
55
|
NonExistentTable.establish_connection(params)
|
55
56
|
|
56
57
|
# Verify the connection param has been applied.
|
57
|
-
expect = NonExistentTable.connection.query(
|
58
|
-
assert_equal
|
58
|
+
expect = NonExistentTable.connection.query("show geqo").first.first
|
59
|
+
assert_equal "off", expect
|
59
60
|
end
|
60
61
|
|
61
62
|
def test_reset
|
62
|
-
@connection.query(
|
63
|
-
@connection.query(
|
63
|
+
@connection.query("ROLLBACK")
|
64
|
+
@connection.query("SET geqo TO off")
|
64
65
|
|
65
66
|
# Verify the setting has been applied.
|
66
|
-
expect = @connection.query(
|
67
|
-
assert_equal
|
67
|
+
expect = @connection.query("show geqo").first.first
|
68
|
+
assert_equal "off", expect
|
68
69
|
|
69
70
|
@connection.reset!
|
70
71
|
|
71
72
|
# Verify the setting has been cleared.
|
72
|
-
expect = @connection.query(
|
73
|
-
assert_equal
|
73
|
+
expect = @connection.query("show geqo").first.first
|
74
|
+
assert_equal "on", expect
|
74
75
|
end
|
75
76
|
|
76
77
|
def test_reset_with_transaction
|
77
|
-
@connection.query(
|
78
|
-
@connection.query(
|
78
|
+
@connection.query("ROLLBACK")
|
79
|
+
@connection.query("SET geqo TO off")
|
79
80
|
|
80
81
|
# Verify the setting has been applied.
|
81
|
-
expect = @connection.query(
|
82
|
-
assert_equal
|
82
|
+
expect = @connection.query("show geqo").first.first
|
83
|
+
assert_equal "off", expect
|
83
84
|
|
84
|
-
@connection.query(
|
85
|
+
@connection.query("BEGIN")
|
85
86
|
@connection.reset!
|
86
87
|
|
87
88
|
# Verify the setting has been cleared.
|
88
|
-
expect = @connection.query(
|
89
|
-
assert_equal
|
89
|
+
expect = @connection.query("show geqo").first.first
|
90
|
+
assert_equal "on", expect
|
90
91
|
end
|
91
92
|
|
92
93
|
def test_tables_logs_name
|
93
|
-
|
94
|
-
assert_equal
|
94
|
+
@connection.tables
|
95
|
+
assert_equal "SCHEMA", @subscriber.logged[0][1]
|
95
96
|
end
|
96
97
|
|
97
98
|
def test_indexes_logs_name
|
98
|
-
@connection.indexes(
|
99
|
-
assert_equal
|
99
|
+
@connection.indexes("items")
|
100
|
+
assert_equal "SCHEMA", @subscriber.logged[0][1]
|
100
101
|
end
|
101
102
|
|
102
103
|
def test_table_exists_logs_name
|
103
|
-
|
104
|
-
assert_equal
|
104
|
+
@connection.table_exists?("items")
|
105
|
+
assert_equal "SCHEMA", @subscriber.logged[0][1]
|
105
106
|
end
|
106
107
|
|
107
108
|
def test_table_alias_length_logs_name
|
108
109
|
@connection.instance_variable_set("@max_identifier_length", nil)
|
109
110
|
@connection.table_alias_length
|
110
|
-
assert_equal
|
111
|
+
assert_equal "SCHEMA", @subscriber.logged[0][1]
|
111
112
|
end
|
112
113
|
|
113
114
|
def test_current_database_logs_name
|
114
115
|
@connection.current_database
|
115
|
-
assert_equal
|
116
|
+
assert_equal "SCHEMA", @subscriber.logged[0][1]
|
116
117
|
end
|
117
118
|
|
118
119
|
def test_encoding_logs_name
|
119
120
|
@connection.encoding
|
120
|
-
assert_equal
|
121
|
+
assert_equal "SCHEMA", @subscriber.logged[0][1]
|
121
122
|
end
|
122
123
|
|
123
124
|
def test_schema_names_logs_name
|
124
125
|
@connection.schema_names
|
125
|
-
assert_equal
|
126
|
+
assert_equal "SCHEMA", @subscriber.logged[0][1]
|
126
127
|
end
|
127
128
|
|
128
129
|
if ActiveRecord::Base.connection.prepared_statements
|
129
130
|
def test_statement_key_is_logged
|
130
131
|
bind = Relation::QueryAttribute.new(nil, 1, Type::Value.new)
|
131
|
-
@connection.exec_query(
|
132
|
+
@connection.exec_query("SELECT $1::integer", "SQL", [bind], prepare: true)
|
132
133
|
name = @subscriber.payloads.last[:statement_name]
|
133
134
|
assert name
|
134
135
|
res = @connection.exec_query("EXPLAIN (FORMAT JSON) EXECUTE #{name}(1)")
|
135
|
-
plan = res.column_types[
|
136
|
+
plan = res.column_types["QUERY PLAN"].deserialize res.rows.first.first
|
136
137
|
assert_operator plan.length, :>, 0
|
137
138
|
end
|
138
139
|
end
|
139
140
|
|
140
|
-
# Must have PostgreSQL >= 9.2, or with_manual_interventions set to
|
141
|
-
# true for this test to run.
|
142
|
-
#
|
143
|
-
# When prompted, restart the PostgreSQL server with the
|
144
|
-
# "-m fast" option or kill the individual connection assuming
|
145
|
-
# you know the incantation to do that.
|
146
|
-
# To restart PostgreSQL 9.1 on OS X, installed via MacPorts, ...
|
147
|
-
# sudo su postgres -c "pg_ctl restart -D /opt/local/var/db/postgresql91/defaultdb/ -m fast"
|
148
141
|
def test_reconnection_after_actual_disconnection_with_verify
|
149
|
-
original_connection_pid = @connection.query(
|
142
|
+
original_connection_pid = @connection.query("select pg_backend_pid()")
|
150
143
|
|
151
144
|
# Sanity check.
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
ActiveRecord::Base.connection_pool.checkin(secondary_connection)
|
158
|
-
elsif ARTest.config['with_manual_interventions']
|
159
|
-
puts 'Kill the connection now (e.g. by restarting the PostgreSQL ' +
|
160
|
-
'server with the "-m fast" option) and then press enter.'
|
161
|
-
$stdin.gets
|
162
|
-
else
|
163
|
-
# We're not capable of terminating the backend ourselves, and
|
164
|
-
# we're not allowed to seek assistance; bail out without
|
165
|
-
# actually testing anything.
|
166
|
-
return
|
167
|
-
end
|
145
|
+
assert_predicate @connection, :active?
|
146
|
+
|
147
|
+
secondary_connection = ActiveRecord::Base.connection_pool.checkout
|
148
|
+
secondary_connection.query("select pg_terminate_backend(#{original_connection_pid.first.first})")
|
149
|
+
ActiveRecord::Base.connection_pool.checkin(secondary_connection)
|
168
150
|
|
169
151
|
@connection.verify!
|
170
152
|
|
171
|
-
|
153
|
+
assert_predicate @connection, :active?
|
172
154
|
|
173
155
|
# If we get no exception here, then either we re-connected successfully, or
|
174
156
|
# we never actually got disconnected.
|
175
|
-
new_connection_pid = @connection.query(
|
157
|
+
new_connection_pid = @connection.query("select pg_backend_pid()")
|
176
158
|
|
177
159
|
assert_not_equal original_connection_pid, new_connection_pid,
|
178
|
-
"umm -- looks like you didn't break the connection, because we're still "
|
160
|
+
"umm -- looks like you didn't break the connection, because we're still " \
|
179
161
|
"successfully querying with the same connection pid."
|
180
162
|
ensure
|
181
163
|
# Repair all fixture connections so other tests won't break.
|
@@ -184,7 +166,7 @@ module ActiveRecord
|
|
184
166
|
|
185
167
|
def test_set_session_variable_true
|
186
168
|
run_without_connection do |orig_connection|
|
187
|
-
ActiveRecord::Base.establish_connection(orig_connection.deep_merge(
|
169
|
+
ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { debug_print_plan: true }))
|
188
170
|
set_true = ActiveRecord::Base.connection.exec_query "SHOW DEBUG_PRINT_PLAN"
|
189
171
|
assert_equal set_true.rows, [["on"]]
|
190
172
|
end
|
@@ -192,7 +174,7 @@ module ActiveRecord
|
|
192
174
|
|
193
175
|
def test_set_session_variable_false
|
194
176
|
run_without_connection do |orig_connection|
|
195
|
-
ActiveRecord::Base.establish_connection(orig_connection.deep_merge(
|
177
|
+
ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { debug_print_plan: false }))
|
196
178
|
set_false = ActiveRecord::Base.connection.exec_query "SHOW DEBUG_PRINT_PLAN"
|
197
179
|
assert_equal set_false.rows, [["off"]]
|
198
180
|
end
|
@@ -201,20 +183,27 @@ module ActiveRecord
|
|
201
183
|
def test_set_session_variable_nil
|
202
184
|
run_without_connection do |orig_connection|
|
203
185
|
# This should be a no-op that does not raise an error
|
204
|
-
ActiveRecord::Base.establish_connection(orig_connection.deep_merge(
|
186
|
+
ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { debug_print_plan: nil }))
|
205
187
|
end
|
206
188
|
end
|
207
189
|
|
208
190
|
def test_set_session_variable_default
|
209
191
|
run_without_connection do |orig_connection|
|
210
192
|
# This should execute a query that does not raise an error
|
211
|
-
ActiveRecord::Base.establish_connection(orig_connection.deep_merge(
|
193
|
+
ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { debug_print_plan: :default }))
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_set_session_timezone
|
198
|
+
run_without_connection do |orig_connection|
|
199
|
+
ActiveRecord::Base.establish_connection(orig_connection.deep_merge(variables: { timezone: "America/New_York" }))
|
200
|
+
assert_equal "America/New_York", ActiveRecord::Base.connection.query_value("SHOW TIME ZONE")
|
212
201
|
end
|
213
202
|
end
|
214
203
|
|
215
204
|
def test_get_and_release_advisory_lock
|
216
205
|
lock_id = 5295901941911233559
|
217
|
-
list_advisory_locks =
|
206
|
+
list_advisory_locks = <<~SQL
|
218
207
|
SELECT locktype,
|
219
208
|
(classid::bigint << 32) | objid::bigint AS lock_id
|
220
209
|
FROM pg_locks
|
@@ -224,14 +213,14 @@ module ActiveRecord
|
|
224
213
|
got_lock = @connection.get_advisory_lock(lock_id)
|
225
214
|
assert got_lock, "get_advisory_lock should have returned true but it didn't"
|
226
215
|
|
227
|
-
advisory_lock = @connection.query(list_advisory_locks).find {|l| l[1] == lock_id}
|
216
|
+
advisory_lock = @connection.query(list_advisory_locks).find { |l| l[1] == lock_id }
|
228
217
|
assert advisory_lock,
|
229
218
|
"expected to find an advisory lock with lock_id #{lock_id} but there wasn't one"
|
230
219
|
|
231
220
|
released_lock = @connection.release_advisory_lock(lock_id)
|
232
221
|
assert released_lock, "expected release_advisory_lock to return true but it didn't"
|
233
222
|
|
234
|
-
advisory_locks = @connection.query(list_advisory_locks).select {|l| l[1] == lock_id}
|
223
|
+
advisory_locks = @connection.query(list_advisory_locks).select { |l| l[1] == lock_id }
|
235
224
|
assert_empty advisory_locks,
|
236
225
|
"expected to have released advisory lock with lock_id #{lock_id} but it was still held"
|
237
226
|
end
|
@@ -241,17 +230,16 @@ module ActiveRecord
|
|
241
230
|
with_warning_suppression do
|
242
231
|
released_non_existent_lock = @connection.release_advisory_lock(fake_lock_id)
|
243
232
|
assert_equal released_non_existent_lock, false,
|
244
|
-
|
233
|
+
"expected release_advisory_lock to return false when there was no lock to release"
|
245
234
|
end
|
246
235
|
end
|
247
236
|
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
end
|
237
|
+
private
|
238
|
+
def with_warning_suppression
|
239
|
+
log_level = @connection.client_min_messages
|
240
|
+
@connection.client_min_messages = "error"
|
241
|
+
yield
|
242
|
+
@connection.client_min_messages = log_level
|
243
|
+
end
|
256
244
|
end
|
257
245
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
require "support/schema_dumping_helper"
|
5
|
+
|
6
|
+
class UnloggedTablesTest < ActiveRecord::PostgreSQLTestCase
|
7
|
+
include SchemaDumpingHelper
|
8
|
+
|
9
|
+
TABLE_NAME = "things"
|
10
|
+
LOGGED_FIELD = "relpersistence"
|
11
|
+
LOGGED_QUERY = "SELECT #{LOGGED_FIELD} FROM pg_class WHERE relname = '#{TABLE_NAME}'"
|
12
|
+
LOGGED = "p"
|
13
|
+
UNLOGGED = "u"
|
14
|
+
TEMPORARY = "t"
|
15
|
+
|
16
|
+
class Thing < ActiveRecord::Base
|
17
|
+
self.table_name = TABLE_NAME
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup
|
21
|
+
@connection = ActiveRecord::Base.connection
|
22
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = false
|
23
|
+
end
|
24
|
+
|
25
|
+
teardown do
|
26
|
+
@connection.drop_table TABLE_NAME, if_exists: true
|
27
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = false
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_logged_by_default
|
31
|
+
@connection.create_table(TABLE_NAME) do |t|
|
32
|
+
end
|
33
|
+
assert_equal @connection.execute(LOGGED_QUERY).first[LOGGED_FIELD], LOGGED
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_unlogged_in_test_environment_when_unlogged_setting_enabled
|
37
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = true
|
38
|
+
|
39
|
+
@connection.create_table(TABLE_NAME) do |t|
|
40
|
+
end
|
41
|
+
assert_equal @connection.execute(LOGGED_QUERY).first[LOGGED_FIELD], UNLOGGED
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_not_included_in_schema_dump
|
45
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = true
|
46
|
+
|
47
|
+
@connection.create_table(TABLE_NAME) do |t|
|
48
|
+
end
|
49
|
+
assert_no_match(/unlogged/i, dump_table_schema(TABLE_NAME))
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_not_changed_in_change_table
|
53
|
+
@connection.create_table(TABLE_NAME) do |t|
|
54
|
+
end
|
55
|
+
|
56
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables = true
|
57
|
+
|
58
|
+
@connection.change_table(TABLE_NAME) do |t|
|
59
|
+
t.column :name, :string
|
60
|
+
end
|
61
|
+
assert_equal @connection.execute(LOGGED_QUERY).first[LOGGED_FIELD], LOGGED
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_gracefully_handles_temporary_tables
|
65
|
+
@connection.create_table(TABLE_NAME, temporary: true) do |t|
|
66
|
+
end
|
67
|
+
|
68
|
+
# Temporary tables are already unlogged, though this query results in a
|
69
|
+
# different result ("t" vs. "u"). This test is really just checking that we
|
70
|
+
# didn't try to run `CREATE TEMPORARY UNLOGGED TABLE`, which would result in
|
71
|
+
# a PostgreSQL error.
|
72
|
+
assert_equal @connection.execute(LOGGED_QUERY).first[LOGGED_FIELD], TEMPORARY
|
73
|
+
end
|
74
|
+
end
|
@@ -1,8 +1,12 @@
|
|
1
|
-
|
2
|
-
require 'support/ddl_helper'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
3
|
+
require "cases/helper"
|
4
|
+
require "support/ddl_helper"
|
4
5
|
|
5
6
|
class PostgresqlTime < ActiveRecord::Base
|
7
|
+
# Declare attributes to get rid from deprecation warnings on ActiveRecord 6.1
|
8
|
+
attribute :time_interval, :string
|
9
|
+
attribute :scaled_time_interval, :interval
|
6
10
|
end
|
7
11
|
|
8
12
|
class PostgresqlOid < ActiveRecord::Base
|
@@ -29,32 +33,25 @@ class PostgresqlDataTypeTest < ActiveRecord::PostgreSQLTestCase
|
|
29
33
|
end
|
30
34
|
|
31
35
|
def test_data_type_of_time_types
|
32
|
-
assert_equal :
|
33
|
-
assert_equal :
|
36
|
+
assert_equal :interval, @first_time.column_for_attribute(:time_interval).type
|
37
|
+
assert_equal :interval, @first_time.column_for_attribute(:scaled_time_interval).type
|
34
38
|
end
|
35
39
|
|
36
40
|
def test_data_type_of_oid_types
|
37
|
-
assert_equal :
|
41
|
+
assert_equal :oid, @first_oid.column_for_attribute(:obj_id).type
|
38
42
|
end
|
39
43
|
|
40
44
|
def test_time_values
|
41
|
-
assert_equal
|
42
|
-
assert_equal
|
45
|
+
assert_equal "P-1Y-2D", @first_time.time_interval
|
46
|
+
assert_equal (-21.day), @first_time.scaled_time_interval
|
43
47
|
end
|
44
48
|
|
45
49
|
def test_oid_values
|
46
50
|
assert_equal 1234, @first_oid.obj_id
|
47
51
|
end
|
48
52
|
|
49
|
-
def test_update_time
|
50
|
-
@first_time.time_interval = '2 years 3 minutes'
|
51
|
-
assert @first_time.save
|
52
|
-
assert @first_time.reload
|
53
|
-
assert_equal '2 years 00:03:00', @first_time.time_interval
|
54
|
-
end
|
55
|
-
|
56
53
|
def test_update_oid
|
57
|
-
new_value =
|
54
|
+
new_value = 2147483648
|
58
55
|
@first_oid.obj_id = new_value
|
59
56
|
assert @first_oid.save
|
60
57
|
assert @first_oid.reload
|
@@ -62,9 +59,9 @@ class PostgresqlDataTypeTest < ActiveRecord::PostgreSQLTestCase
|
|
62
59
|
end
|
63
60
|
|
64
61
|
def test_text_columns_are_limitless_the_upper_limit_is_one_GB
|
65
|
-
assert_equal
|
66
|
-
assert_raise
|
67
|
-
@connection.type_to_sql
|
62
|
+
assert_equal "text", @connection.type_to_sql(:text, limit: 100_000)
|
63
|
+
assert_raise ArgumentError do
|
64
|
+
@connection.type_to_sql(:text, limit: 4294967295)
|
68
65
|
end
|
69
66
|
end
|
70
67
|
end
|
@@ -77,15 +74,15 @@ class PostgresqlInternalDataTypeTest < ActiveRecord::PostgreSQLTestCase
|
|
77
74
|
end
|
78
75
|
|
79
76
|
def test_name_column_type
|
80
|
-
with_example_table @connection,
|
81
|
-
column = @connection.columns(
|
77
|
+
with_example_table @connection, "ex", "data name" do
|
78
|
+
column = @connection.columns("ex").find { |col| col.name == "data" }
|
82
79
|
assert_equal :string, column.type
|
83
80
|
end
|
84
81
|
end
|
85
82
|
|
86
83
|
def test_char_column_type
|
87
|
-
with_example_table @connection,
|
88
|
-
column = @connection.columns(
|
84
|
+
with_example_table @connection, "ex", 'data "char"' do
|
85
|
+
column = @connection.columns("ex").find { |col| col.name == "data" }
|
89
86
|
assert_equal :string, column.type
|
90
87
|
end
|
91
88
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
require "models/topic"
|
5
|
+
|
6
|
+
class PostgresqlDateTest < ActiveRecord::PostgreSQLTestCase
|
7
|
+
def test_load_infinity_and_beyond
|
8
|
+
topic = Topic.find_by_sql("SELECT 'infinity'::date AS last_read").first
|
9
|
+
assert topic.last_read.infinite?, "timestamp should be infinite"
|
10
|
+
assert_operator topic.last_read, :>, 0
|
11
|
+
|
12
|
+
topic = Topic.find_by_sql("SELECT '-infinity'::date AS last_read").first
|
13
|
+
assert topic.last_read.infinite?, "timestamp should be infinite"
|
14
|
+
assert_operator topic.last_read, :<, 0
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_save_infinity_and_beyond
|
18
|
+
topic = Topic.create!(last_read: 1.0 / 0.0)
|
19
|
+
assert_equal(1.0 / 0.0, topic.last_read)
|
20
|
+
|
21
|
+
topic = Topic.create!(last_read: -1.0 / 0.0)
|
22
|
+
assert_equal(-1.0 / 0.0, topic.last_read)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_bc_date
|
26
|
+
date = Date.new(0) - 1.week
|
27
|
+
topic = Topic.create!(last_read: date)
|
28
|
+
assert_equal date, Topic.find(topic.id).last_read
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_bc_date_leap_year
|
32
|
+
date = Time.utc(-4, 2, 29).to_date
|
33
|
+
topic = Topic.create!(last_read: date)
|
34
|
+
assert_equal date, Topic.find(topic.id).last_read
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_bc_date_year_zero
|
38
|
+
date = Time.utc(0, 4, 7).to_date
|
39
|
+
topic = Topic.create!(last_read: date)
|
40
|
+
assert_equal date, Topic.find(topic.id).last_read
|
41
|
+
end
|
42
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
|
-
require
|
4
|
+
require "support/connection_helper"
|
3
5
|
|
4
6
|
class PostgresqlDomainTest < ActiveRecord::PostgreSQLTestCase
|
5
7
|
include ConnectionHelper
|
@@ -12,15 +14,15 @@ class PostgresqlDomainTest < ActiveRecord::PostgreSQLTestCase
|
|
12
14
|
@connection = ActiveRecord::Base.connection
|
13
15
|
@connection.transaction do
|
14
16
|
@connection.execute "CREATE DOMAIN custom_money as numeric(8,2)"
|
15
|
-
@connection.create_table(
|
17
|
+
@connection.create_table("postgresql_domains") do |t|
|
16
18
|
t.column :price, :custom_money
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
23
|
teardown do
|
22
|
-
@connection.drop_table
|
23
|
-
@connection.execute
|
24
|
+
@connection.drop_table "postgresql_domains", if_exists: true
|
25
|
+
@connection.execute "DROP DOMAIN IF EXISTS custom_money"
|
24
26
|
reset_connection
|
25
27
|
end
|
26
28
|
|
@@ -28,10 +30,10 @@ class PostgresqlDomainTest < ActiveRecord::PostgreSQLTestCase
|
|
28
30
|
column = PostgresqlDomain.columns_hash["price"]
|
29
31
|
assert_equal :decimal, column.type
|
30
32
|
assert_equal "custom_money", column.sql_type
|
31
|
-
|
33
|
+
assert_not_predicate column, :array?
|
32
34
|
|
33
35
|
type = PostgresqlDomain.type_for_attribute("price")
|
34
|
-
|
36
|
+
assert_not_predicate type, :binary?
|
35
37
|
end
|
36
38
|
|
37
39
|
def test_domain_acts_like_basetype
|
@@ -42,6 +44,6 @@ class PostgresqlDomainTest < ActiveRecord::PostgreSQLTestCase
|
|
42
44
|
record.price = "34.15"
|
43
45
|
record.save!
|
44
46
|
|
45
|
-
assert_equal BigDecimal
|
47
|
+
assert_equal BigDecimal("34.15"), record.reload.price
|
46
48
|
end
|
47
49
|
end
|
@@ -1,5 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
|
-
require
|
4
|
+
require "support/connection_helper"
|
3
5
|
|
4
6
|
class PostgresqlEnumTest < ActiveRecord::PostgreSQLTestCase
|
5
7
|
include ConnectionHelper
|
@@ -11,18 +13,18 @@ class PostgresqlEnumTest < ActiveRecord::PostgreSQLTestCase
|
|
11
13
|
def setup
|
12
14
|
@connection = ActiveRecord::Base.connection
|
13
15
|
@connection.transaction do
|
14
|
-
@connection.execute
|
16
|
+
@connection.execute <<~SQL
|
15
17
|
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
|
16
18
|
SQL
|
17
|
-
@connection.create_table(
|
19
|
+
@connection.create_table("postgresql_enums") do |t|
|
18
20
|
t.column :current_mood, :mood
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
23
25
|
teardown do
|
24
|
-
@connection.drop_table
|
25
|
-
@connection.execute
|
26
|
+
@connection.drop_table "postgresql_enums", if_exists: true
|
27
|
+
@connection.execute "DROP TYPE IF EXISTS mood"
|
26
28
|
reset_connection
|
27
29
|
end
|
28
30
|
|
@@ -30,17 +32,17 @@ class PostgresqlEnumTest < ActiveRecord::PostgreSQLTestCase
|
|
30
32
|
column = PostgresqlEnum.columns_hash["current_mood"]
|
31
33
|
assert_equal :enum, column.type
|
32
34
|
assert_equal "mood", column.sql_type
|
33
|
-
|
35
|
+
assert_not_predicate column, :array?
|
34
36
|
|
35
37
|
type = PostgresqlEnum.type_for_attribute("current_mood")
|
36
|
-
|
38
|
+
assert_not_predicate type, :binary?
|
37
39
|
end
|
38
40
|
|
39
41
|
def test_enum_defaults
|
40
|
-
@connection.add_column
|
42
|
+
@connection.add_column "postgresql_enums", "good_mood", :mood, default: "happy"
|
41
43
|
PostgresqlEnum.reset_column_information
|
42
44
|
|
43
|
-
assert_equal "happy", PostgresqlEnum.column_defaults[
|
45
|
+
assert_equal "happy", PostgresqlEnum.column_defaults["good_mood"]
|
44
46
|
assert_equal "happy", PostgresqlEnum.new.good_mood
|
45
47
|
ensure
|
46
48
|
PostgresqlEnum.reset_column_information
|
@@ -71,7 +73,7 @@ class PostgresqlEnumTest < ActiveRecord::PostgreSQLTestCase
|
|
71
73
|
@connection.execute "INSERT INTO postgresql_enums VALUES (1, 'sad');"
|
72
74
|
stderr_output = capture(:stderr) { PostgresqlEnum.first }
|
73
75
|
|
74
|
-
|
76
|
+
assert_predicate stderr_output, :blank?
|
75
77
|
end
|
76
78
|
|
77
79
|
def test_enum_type_cast
|
@@ -1,20 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
|
-
require
|
3
|
-
require
|
4
|
+
require "models/author"
|
5
|
+
require "models/post"
|
4
6
|
|
5
7
|
class PostgreSQLExplainTest < ActiveRecord::PostgreSQLTestCase
|
6
|
-
fixtures :
|
8
|
+
fixtures :authors
|
7
9
|
|
8
10
|
def test_explain_for_one_query
|
9
|
-
explain =
|
10
|
-
assert_match %r(EXPLAIN for: SELECT "
|
11
|
+
explain = Author.where(id: 1).explain
|
12
|
+
assert_match %r(EXPLAIN for: SELECT "authors"\.\* FROM "authors" WHERE "authors"\."id" = (?:\$1 \[\["id", 1\]\]|1)), explain
|
11
13
|
assert_match %(QUERY PLAN), explain
|
12
14
|
end
|
13
15
|
|
14
16
|
def test_explain_with_eager_loading
|
15
|
-
explain =
|
17
|
+
explain = Author.where(id: 1).includes(:posts).explain
|
16
18
|
assert_match %(QUERY PLAN), explain
|
17
|
-
assert_match %r(EXPLAIN for: SELECT "
|
18
|
-
assert_match %(EXPLAIN for: SELECT "
|
19
|
+
assert_match %r(EXPLAIN for: SELECT "authors"\.\* FROM "authors" WHERE "authors"\."id" = (?:\$1 \[\["id", 1\]\]|1)), explain
|
20
|
+
assert_match %r(EXPLAIN for: SELECT "posts"\.\* FROM "posts" WHERE "posts"\."author_id" = (?:\$1 \[\["author_id", 1\]\]|1)), explain
|
19
21
|
end
|
20
22
|
end
|