ibm_db 5.2.0-x86-mingw32 → 5.3.2-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES +9 -0
- data/LICENSE +55 -18
- data/ext/Makefile +15 -13
- data/ext/ibm_db.c +62 -57
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +26 -24
- data/ext/ruby_ibm_db_cli.c +1 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
- data/lib/ibm_db.so +1 -0
- data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
- data/test/activejob/destroy_association_async_test.rb +305 -0
- data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
- data/test/activejob/helper.rb +15 -0
- data/test/assets/schema_dump_5_1.yml +345 -0
- data/test/cases/adapter_prevent_writes_test.rb +334 -0
- data/test/cases/adapter_test.rb +432 -218
- data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
- data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
- data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
- data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
- data/test/cases/adapters/mysql2/connection_test.rb +48 -50
- data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
- data/test/cases/adapters/mysql2/enum_test.rb +32 -11
- data/test/cases/adapters/mysql2/explain_test.rb +13 -11
- data/test/cases/adapters/mysql2/json_test.rb +17 -188
- data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
- data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
- data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
- data/test/cases/adapters/mysql2/schema_test.rb +24 -22
- data/test/cases/adapters/mysql2/set_test.rb +32 -0
- data/test/cases/adapters/mysql2/sp_test.rb +10 -8
- data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
- data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
- data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
- data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
- data/test/cases/adapters/postgresql/array_test.rb +118 -63
- data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
- data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
- data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
- data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
- data/test/cases/adapters/postgresql/citext_test.rb +58 -58
- data/test/cases/adapters/postgresql/collation_test.rb +17 -15
- data/test/cases/adapters/postgresql/composite_test.rb +25 -23
- data/test/cases/adapters/postgresql/connection_test.rb +73 -85
- data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
- data/test/cases/adapters/postgresql/date_test.rb +42 -0
- data/test/cases/adapters/postgresql/domain_test.rb +9 -7
- data/test/cases/adapters/postgresql/enum_test.rb +12 -10
- data/test/cases/adapters/postgresql/explain_test.rb +10 -8
- data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
- data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
- data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
- data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
- data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
- data/test/cases/adapters/postgresql/integer_test.rb +2 -0
- data/test/cases/adapters/postgresql/interval_test.rb +99 -0
- data/test/cases/adapters/postgresql/json_test.rb +16 -201
- data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
- data/test/cases/adapters/postgresql/money_test.rb +47 -16
- data/test/cases/adapters/postgresql/network_test.rb +36 -28
- data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
- data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
- data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
- data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
- data/test/cases/adapters/postgresql/range_test.rb +406 -292
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
- data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
- data/test/cases/adapters/postgresql/schema_test.rb +207 -91
- data/test/cases/adapters/postgresql/serial_test.rb +9 -7
- data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
- data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
- data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
- data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
- data/test/cases/adapters/postgresql/utils_test.rb +11 -9
- data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
- data/test/cases/adapters/postgresql/xml_test.rb +10 -14
- data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
- data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
- data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
- data/test/cases/adapters/sqlite3/json_test.rb +29 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
- data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
- data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
- data/test/cases/aggregations_test.rb +14 -12
- data/test/cases/annotate_test.rb +46 -0
- data/test/cases/ar_schema_test.rb +153 -86
- data/test/cases/arel/attributes/attribute_test.rb +1145 -0
- data/test/cases/arel/attributes/math_test.rb +83 -0
- data/test/cases/arel/attributes_test.rb +27 -0
- data/test/cases/arel/collectors/bind_test.rb +40 -0
- data/test/cases/arel/collectors/composite_test.rb +47 -0
- data/test/cases/arel/collectors/sql_string_test.rb +41 -0
- data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
- data/test/cases/arel/crud_test.rb +65 -0
- data/test/cases/arel/delete_manager_test.rb +53 -0
- data/test/cases/arel/factory_methods_test.rb +46 -0
- data/test/cases/arel/helper.rb +45 -0
- data/test/cases/arel/insert_manager_test.rb +241 -0
- data/test/cases/arel/nodes/and_test.rb +30 -0
- data/test/cases/arel/nodes/as_test.rb +36 -0
- data/test/cases/arel/nodes/ascending_test.rb +46 -0
- data/test/cases/arel/nodes/bin_test.rb +35 -0
- data/test/cases/arel/nodes/binary_test.rb +29 -0
- data/test/cases/arel/nodes/bind_param_test.rb +22 -0
- data/test/cases/arel/nodes/case_test.rb +96 -0
- data/test/cases/arel/nodes/casted_test.rb +18 -0
- data/test/cases/arel/nodes/comment_test.rb +22 -0
- data/test/cases/arel/nodes/count_test.rb +35 -0
- data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
- data/test/cases/arel/nodes/descending_test.rb +46 -0
- data/test/cases/arel/nodes/distinct_test.rb +21 -0
- data/test/cases/arel/nodes/equality_test.rb +62 -0
- data/test/cases/arel/nodes/extract_test.rb +43 -0
- data/test/cases/arel/nodes/false_test.rb +21 -0
- data/test/cases/arel/nodes/grouping_test.rb +26 -0
- data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
- data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
- data/test/cases/arel/nodes/named_function_test.rb +48 -0
- data/test/cases/arel/nodes/node_test.rb +22 -0
- data/test/cases/arel/nodes/not_test.rb +31 -0
- data/test/cases/arel/nodes/or_test.rb +36 -0
- data/test/cases/arel/nodes/over_test.rb +69 -0
- data/test/cases/arel/nodes/select_core_test.rb +79 -0
- data/test/cases/arel/nodes/select_statement_test.rb +51 -0
- data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
- data/test/cases/arel/nodes/sum_test.rb +35 -0
- data/test/cases/arel/nodes/table_alias_test.rb +29 -0
- data/test/cases/arel/nodes/true_test.rb +21 -0
- data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
- data/test/cases/arel/nodes/update_statement_test.rb +60 -0
- data/test/cases/arel/nodes/window_test.rb +81 -0
- data/test/cases/arel/nodes_test.rb +34 -0
- data/test/cases/arel/select_manager_test.rb +1238 -0
- data/test/cases/arel/support/fake_record.rb +135 -0
- data/test/cases/arel/table_test.rb +216 -0
- data/test/cases/arel/update_manager_test.rb +126 -0
- data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
- data/test/cases/arel/visitors/dot_test.rb +90 -0
- data/test/cases/arel/visitors/mysql_test.rb +157 -0
- data/test/cases/arel/visitors/postgres_test.rb +366 -0
- data/test/cases/arel/visitors/sqlite_test.rb +75 -0
- data/test/cases/arel/visitors/to_sql_test.rb +750 -0
- data/test/cases/associations/belongs_to_associations_test.rb +510 -158
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
- data/test/cases/associations/callbacks_test.rb +56 -38
- data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
- data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
- data/test/cases/associations/eager_singularization_test.rb +21 -21
- data/test/cases/associations/eager_test.rb +559 -415
- data/test/cases/associations/extension_test.rb +18 -12
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
- data/test/cases/associations/has_many_associations_test.rb +1038 -465
- data/test/cases/associations/has_many_through_associations_test.rb +558 -249
- data/test/cases/associations/has_one_associations_test.rb +294 -129
- data/test/cases/associations/has_one_through_associations_test.rb +121 -75
- data/test/cases/associations/inner_join_association_test.rb +114 -38
- data/test/cases/associations/inverse_associations_test.rb +606 -398
- data/test/cases/associations/join_model_test.rb +158 -148
- data/test/cases/associations/left_outer_join_association_test.rb +59 -24
- data/test/cases/associations/nested_through_associations_test.rb +166 -109
- data/test/cases/associations/required_test.rb +35 -10
- data/test/cases/associations_test.rb +241 -110
- data/test/cases/attribute_methods/read_test.rb +11 -11
- data/test/cases/attribute_methods_test.rb +413 -298
- data/test/cases/attributes_test.rb +145 -27
- data/test/cases/autosave_association_test.rb +681 -436
- data/test/cases/base_prevent_writes_test.rb +229 -0
- data/test/cases/base_test.rb +599 -542
- data/test/cases/batches_test.rb +288 -82
- data/test/cases/binary_test.rb +26 -31
- data/test/cases/bind_parameter_test.rb +194 -21
- data/test/cases/boolean_test.rb +52 -0
- data/test/cases/cache_key_test.rb +110 -5
- data/test/cases/calculations_test.rb +740 -177
- data/test/cases/callbacks_test.rb +74 -207
- data/test/cases/clone_test.rb +15 -10
- data/test/cases/coders/json_test.rb +2 -0
- data/test/cases/coders/yaml_column_test.rb +16 -13
- data/test/cases/collection_cache_key_test.rb +177 -20
- data/test/cases/column_alias_test.rb +9 -7
- data/test/cases/column_definition_test.rb +10 -68
- data/test/cases/comment_test.rb +166 -107
- data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
- data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
- data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
- data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
- data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
- data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
- data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
- data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
- data/test/cases/connection_management_test.rb +13 -11
- data/test/cases/connection_pool_test.rb +316 -83
- data/test/cases/core_test.rb +82 -58
- data/test/cases/counter_cache_test.rb +204 -50
- data/test/cases/custom_locking_test.rb +5 -3
- data/test/cases/database_configurations/hash_config_test.rb +74 -0
- data/test/cases/database_configurations/resolver_test.rb +150 -0
- data/test/cases/database_configurations_test.rb +145 -0
- data/test/cases/database_selector_test.rb +296 -0
- data/test/cases/database_statements_test.rb +18 -16
- data/test/cases/date_test.rb +8 -16
- data/test/cases/date_time_precision_test.rb +100 -78
- data/test/cases/date_time_test.rb +23 -8
- data/test/cases/defaults_test.rb +106 -71
- data/test/cases/delegated_type_test.rb +57 -0
- data/test/cases/dirty_test.rb +419 -223
- data/test/cases/disconnected_test.rb +6 -6
- data/test/cases/dup_test.rb +54 -27
- data/test/cases/enum_test.rb +461 -82
- data/test/cases/errors_test.rb +7 -7
- data/test/cases/explain_subscriber_test.rb +17 -15
- data/test/cases/explain_test.rb +11 -19
- data/test/cases/filter_attributes_test.rb +153 -0
- data/test/cases/finder_respond_to_test.rb +14 -14
- data/test/cases/finder_test.rb +669 -287
- data/test/cases/fixture_set/file_test.rb +34 -38
- data/test/cases/fixtures_test.rb +833 -176
- data/test/cases/forbidden_attributes_protection_test.rb +32 -67
- data/test/cases/habtm_destroy_order_test.rb +25 -25
- data/test/cases/helper.rb +78 -49
- data/test/cases/hot_compatibility_test.rb +33 -32
- data/test/cases/i18n_test.rb +18 -17
- data/test/cases/inheritance_test.rb +180 -115
- data/test/cases/insert_all_test.rb +489 -0
- data/test/cases/instrumentation_test.rb +101 -0
- data/test/cases/integration_test.rb +119 -31
- data/test/cases/invalid_connection_test.rb +18 -16
- data/test/cases/invertible_migration_test.rb +183 -43
- data/test/cases/json_attribute_test.rb +35 -0
- data/test/cases/json_serialization_test.rb +57 -58
- data/test/cases/json_shared_test_cases.rb +290 -0
- data/test/cases/locking_test.rb +413 -119
- data/test/cases/log_subscriber_test.rb +68 -26
- data/test/cases/marshal_serialization_test.rb +39 -0
- data/test/cases/migration/change_schema_test.rb +118 -72
- data/test/cases/migration/change_table_test.rb +138 -30
- data/test/cases/migration/check_constraint_test.rb +162 -0
- data/test/cases/migration/column_attributes_test.rb +45 -35
- data/test/cases/migration/column_positioning_test.rb +18 -6
- data/test/cases/migration/columns_test.rb +93 -77
- data/test/cases/migration/command_recorder_test.rb +121 -34
- data/test/cases/migration/compatibility_test.rb +578 -23
- data/test/cases/migration/create_join_table_test.rb +35 -25
- data/test/cases/migration/foreign_key_test.rb +503 -284
- data/test/cases/migration/helper.rb +4 -3
- data/test/cases/migration/index_test.rb +119 -70
- data/test/cases/migration/logger_test.rb +9 -6
- data/test/cases/migration/pending_migrations_test.rb +88 -34
- data/test/cases/migration/references_foreign_key_test.rb +164 -150
- data/test/cases/migration/references_index_test.rb +38 -19
- data/test/cases/migration/references_statements_test.rb +15 -14
- data/test/cases/migration/rename_table_test.rb +53 -30
- data/test/cases/migration_test.rb +637 -269
- data/test/cases/migrator_test.rb +191 -135
- data/test/cases/mixin_test.rb +7 -11
- data/test/cases/modules_test.rb +36 -34
- data/test/cases/multi_db_migrator_test.rb +223 -0
- data/test/cases/multiparameter_attributes_test.rb +60 -33
- data/test/cases/multiple_db_test.rb +16 -22
- data/test/cases/nested_attributes_test.rb +341 -320
- data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
- data/test/cases/null_relation_test.rb +84 -0
- data/test/cases/numeric_data_test.rb +93 -0
- data/test/cases/persistence_test.rb +361 -269
- data/test/cases/pooled_connections_test.rb +18 -26
- data/test/cases/prepared_statement_status_test.rb +48 -0
- data/test/cases/primary_keys_test.rb +210 -104
- data/test/cases/query_cache_test.rb +610 -141
- data/test/cases/quoting_test.rb +132 -31
- data/test/cases/readonly_test.rb +49 -48
- data/test/cases/reaper_test.rb +146 -32
- data/test/cases/reflection_test.rb +167 -156
- data/test/cases/relation/delegation_test.rb +49 -36
- data/test/cases/relation/delete_all_test.rb +117 -0
- data/test/cases/relation/merging_test.rb +319 -42
- data/test/cases/relation/mutation_test.rb +55 -93
- data/test/cases/relation/or_test.rb +129 -29
- data/test/cases/relation/predicate_builder_test.rb +21 -6
- data/test/cases/relation/record_fetch_warning_test.rb +5 -3
- data/test/cases/relation/select_test.rb +67 -0
- data/test/cases/relation/update_all_test.rb +317 -0
- data/test/cases/relation/where_chain_test.rb +68 -32
- data/test/cases/relation/where_clause_test.rb +136 -61
- data/test/cases/relation/where_test.rb +155 -48
- data/test/cases/relation_test.rb +266 -112
- data/test/cases/relations_test.rb +969 -744
- data/test/cases/reload_models_test.rb +13 -9
- data/test/cases/reserved_word_test.rb +141 -0
- data/test/cases/result_test.rb +68 -17
- data/test/cases/sanitize_test.rb +87 -71
- data/test/cases/schema_dumper_test.rb +221 -128
- data/test/cases/schema_loading_test.rb +3 -2
- data/test/cases/scoping/default_scoping_test.rb +185 -144
- data/test/cases/scoping/named_scoping_test.rb +177 -89
- data/test/cases/scoping/relation_scoping_test.rb +197 -75
- data/test/cases/secure_token_test.rb +18 -3
- data/test/cases/serialization_test.rb +30 -28
- data/test/cases/serialized_attribute_test.rb +133 -42
- data/test/cases/signed_id_test.rb +168 -0
- data/test/cases/statement_cache_test.rb +41 -24
- data/test/cases/statement_invalid_test.rb +42 -0
- data/test/cases/store_test.rb +180 -55
- data/test/cases/strict_loading_test.rb +473 -0
- data/test/cases/suppressor_test.rb +26 -12
- data/test/cases/tasks/database_tasks_test.rb +1258 -194
- data/test/cases/tasks/mysql_rake_test.rb +370 -298
- data/test/cases/tasks/postgresql_rake_test.rb +481 -251
- data/test/cases/tasks/sqlite_rake_test.rb +225 -178
- data/test/cases/test_case.rb +51 -40
- data/test/cases/test_databases_test.rb +79 -0
- data/test/cases/test_fixtures_test.rb +79 -19
- data/test/cases/time_precision_test.rb +98 -76
- data/test/cases/timestamp_test.rb +102 -99
- data/test/cases/touch_later_test.rb +12 -10
- data/test/cases/transaction_callbacks_test.rb +344 -90
- data/test/cases/transaction_isolation_test.rb +12 -12
- data/test/cases/transactions_test.rb +612 -162
- data/test/cases/type/adapter_specific_registry_test.rb +14 -2
- data/test/cases/type/date_time_test.rb +4 -2
- data/test/cases/type/integer_test.rb +4 -2
- data/test/cases/type/string_test.rb +10 -8
- data/test/cases/type/time_test.rb +28 -0
- data/test/cases/type/type_map_test.rb +29 -28
- data/test/cases/type/unsigned_integer_test.rb +19 -0
- data/test/cases/type_test.rb +2 -0
- data/test/cases/types_test.rb +3 -1
- data/test/cases/unconnected_test.rb +14 -1
- data/test/cases/unsafe_raw_sql_test.rb +274 -0
- data/test/cases/validations/absence_validation_test.rb +19 -17
- data/test/cases/validations/association_validation_test.rb +30 -28
- data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
- data/test/cases/validations/i18n_validation_test.rb +22 -21
- data/test/cases/validations/length_validation_test.rb +34 -33
- data/test/cases/validations/numericality_validation_test.rb +181 -0
- data/test/cases/validations/presence_validation_test.rb +21 -19
- data/test/cases/validations/uniqueness_validation_test.rb +156 -86
- data/test/cases/validations_repair_helper.rb +2 -0
- data/test/cases/validations_test.rb +61 -26
- data/test/cases/view_test.rb +122 -116
- data/test/cases/yaml_serialization_test.rb +79 -34
- data/test/config.example.yml +19 -19
- data/test/config.rb +3 -1
- data/test/config.yml +16 -6
- data/test/fixtures/all/namespaced/accounts.yml +2 -0
- data/test/fixtures/author_addresses.yml +1 -8
- data/test/fixtures/authors.yml +1 -7
- data/test/fixtures/binaries.yml +4 -0
- data/test/fixtures/books.yml +9 -2
- data/test/fixtures/categories_posts.yml +3 -0
- data/test/fixtures/citations.yml +5 -0
- data/test/fixtures/comments.yml +7 -0
- data/test/fixtures/companies.yml +5 -0
- data/test/fixtures/computers.yml +2 -0
- data/test/fixtures/customers.yml +10 -1
- data/test/fixtures/developers.yml +1 -1
- data/test/fixtures/essays.yml +10 -0
- data/test/fixtures/faces.yml +3 -3
- data/test/fixtures/humans.yml +5 -0
- data/test/fixtures/interests.yml +7 -7
- data/test/fixtures/memberships.yml +7 -0
- data/test/fixtures/minimalistics.yml +3 -0
- data/test/fixtures/mixed_case_monkeys.yml +2 -2
- data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
- data/test/fixtures/naked/yml/parrots.yml +1 -0
- data/test/fixtures/other_books.yml +26 -0
- data/test/fixtures/other_posts.yml +1 -0
- data/test/fixtures/parrots.yml +7 -1
- data/test/fixtures/pirates.yml +3 -0
- data/test/fixtures/posts.yml +11 -3
- data/test/fixtures/readers.yml +6 -0
- data/test/fixtures/reserved_words/values.yml +2 -2
- data/test/fixtures/sponsors.yml +3 -0
- data/test/fixtures/strict_zines.yml +2 -0
- data/test/fixtures/subscribers.yml +1 -1
- data/test/fixtures/tasks.yml +1 -1
- data/test/fixtures/warehouse-things.yml +3 -0
- data/test/migrations/10_urban/9_add_expressions.rb +2 -0
- data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
- data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
- data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
- data/test/migrations/missing/1_people_have_last_names.rb +2 -0
- data/test/migrations/missing/3_we_need_reminders.rb +2 -0
- data/test/migrations/missing/4_innocent_jointable.rb +3 -1
- data/test/migrations/rename/1_we_need_things.rb +2 -0
- data/test/migrations/rename/2_rename_things.rb +2 -0
- data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy2/1_create_articles.rb +2 -0
- data/test/migrations/to_copy2/2_create_comments.rb +3 -1
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
- data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
- data/test/models/account.rb +46 -0
- data/test/models/admin/account.rb +3 -1
- data/test/models/admin/randomly_named_c1.rb +2 -0
- data/test/models/admin/user.rb +16 -8
- data/test/models/admin.rb +4 -2
- data/test/models/aircraft.rb +3 -1
- data/test/models/arunit2_model.rb +2 -0
- data/test/models/author.rb +153 -102
- data/test/models/auto_id.rb +2 -0
- data/test/models/autoloadable/extra_firm.rb +2 -0
- data/test/models/binary.rb +3 -1
- data/test/models/binary_field.rb +6 -0
- data/test/models/bird.rb +13 -1
- data/test/models/book.rb +14 -4
- data/test/models/book_destroy_async.rb +24 -0
- data/test/models/boolean.rb +5 -0
- data/test/models/bulb.rb +13 -4
- data/test/models/cake_designer.rb +2 -0
- data/test/models/car.rb +17 -10
- data/test/models/carrier.rb +2 -0
- data/test/models/cart.rb +5 -0
- data/test/models/cat.rb +2 -0
- data/test/models/categorization.rb +8 -6
- data/test/models/category.rb +28 -16
- data/test/models/chef.rb +2 -0
- data/test/models/citation.rb +5 -1
- data/test/models/club.rb +13 -10
- data/test/models/college.rb +4 -2
- data/test/models/column.rb +2 -0
- data/test/models/column_name.rb +2 -0
- data/test/models/comment.rb +32 -10
- data/test/models/company.rb +102 -106
- data/test/models/company_in_module.rb +27 -26
- data/test/models/computer.rb +3 -1
- data/test/models/contact.rb +15 -13
- data/test/models/content.rb +5 -3
- data/test/models/contract.rb +21 -3
- data/test/models/country.rb +2 -4
- data/test/models/course.rb +3 -1
- data/test/models/customer.rb +10 -8
- data/test/models/customer_carrier.rb +2 -0
- data/test/models/dashboard.rb +2 -0
- data/test/models/default.rb +2 -0
- data/test/models/department.rb +2 -0
- data/test/models/destroy_async_parent.rb +15 -0
- data/test/models/destroy_async_parent_soft_delete.rb +20 -0
- data/test/models/developer.rb +152 -85
- data/test/models/dl_keyed_belongs_to.rb +13 -0
- data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
- data/test/models/dl_keyed_has_many.rb +5 -0
- data/test/models/dl_keyed_has_many_through.rb +5 -0
- data/test/models/dl_keyed_has_one.rb +5 -0
- data/test/models/dl_keyed_join.rb +10 -0
- data/test/models/dog.rb +2 -0
- data/test/models/dog_lover.rb +2 -0
- data/test/models/doubloon.rb +3 -1
- data/test/models/drink_designer.rb +17 -0
- data/test/models/edge.rb +4 -2
- data/test/models/electron.rb +2 -0
- data/test/models/engine.rb +3 -2
- data/test/models/entrant.rb +2 -0
- data/test/models/entry.rb +5 -0
- data/test/models/essay.rb +6 -3
- data/test/models/essay_destroy_async.rb +12 -0
- data/test/models/event.rb +3 -1
- data/test/models/eye.rb +5 -3
- data/test/models/face.rb +14 -6
- data/test/models/family.rb +6 -0
- data/test/models/family_tree.rb +6 -0
- data/test/models/friendship.rb +5 -3
- data/test/models/frog.rb +8 -0
- data/test/models/guid.rb +3 -1
- data/test/models/guitar.rb +2 -0
- data/test/models/hotel.rb +5 -3
- data/test/models/human.rb +39 -0
- data/test/models/image.rb +3 -1
- data/test/models/interest.rb +14 -3
- data/test/models/invoice.rb +4 -2
- data/test/models/item.rb +3 -1
- data/test/models/job.rb +5 -3
- data/test/models/joke.rb +4 -2
- data/test/models/keyboard.rb +3 -1
- data/test/models/legacy_thing.rb +2 -0
- data/test/models/lesson.rb +2 -0
- data/test/models/line_item.rb +3 -1
- data/test/models/liquid.rb +2 -0
- data/test/models/matey.rb +3 -1
- data/test/models/measurement.rb +4 -0
- data/test/models/member.rb +23 -20
- data/test/models/member_detail.rb +3 -0
- data/test/models/member_type.rb +2 -0
- data/test/models/membership.rb +4 -1
- data/test/models/mentor.rb +3 -1
- data/test/models/message.rb +5 -0
- data/test/models/minimalistic.rb +2 -0
- data/test/models/minivan.rb +3 -2
- data/test/models/mixed_case_monkey.rb +3 -1
- data/test/models/molecule.rb +2 -0
- data/test/models/mouse.rb +6 -0
- data/test/models/movie.rb +2 -0
- data/test/models/node.rb +4 -2
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +2 -0
- data/test/models/numeric_data.rb +12 -0
- data/test/models/order.rb +4 -2
- data/test/models/organization.rb +9 -7
- data/test/models/other_dog.rb +3 -1
- data/test/models/owner.rb +6 -4
- data/test/models/parrot.rb +12 -4
- data/test/models/person.rb +59 -54
- data/test/models/personal_legacy_thing.rb +3 -1
- data/test/models/pet.rb +4 -2
- data/test/models/pet_treasure.rb +2 -0
- data/test/models/pirate.rb +67 -43
- data/test/models/possession.rb +3 -1
- data/test/models/post.rb +184 -86
- data/test/models/price_estimate.rb +11 -1
- data/test/models/professor.rb +3 -1
- data/test/models/project.rb +14 -12
- data/test/models/publisher/article.rb +2 -0
- data/test/models/publisher/magazine.rb +2 -0
- data/test/models/publisher.rb +2 -0
- data/test/models/randomly_named_c1.rb +2 -0
- data/test/models/rating.rb +5 -1
- data/test/models/reader.rb +7 -5
- data/test/models/recipe.rb +2 -0
- data/test/models/record.rb +2 -0
- data/test/models/reference.rb +6 -3
- data/test/models/reply.rb +39 -21
- data/test/models/room.rb +6 -0
- data/test/models/section.rb +6 -0
- data/test/models/seminar.rb +6 -0
- data/test/models/session.rb +6 -0
- data/test/models/ship.rb +12 -9
- data/test/models/ship_part.rb +5 -3
- data/test/models/shop.rb +4 -2
- data/test/models/shop_account.rb +2 -0
- data/test/models/speedometer.rb +2 -0
- data/test/models/sponsor.rb +8 -5
- data/test/models/squeak.rb +6 -0
- data/test/models/strict_zine.rb +7 -0
- data/test/models/string_key_object.rb +2 -0
- data/test/models/student.rb +2 -0
- data/test/models/subscriber.rb +4 -2
- data/test/models/subscription.rb +5 -1
- data/test/models/tag.rb +6 -3
- data/test/models/tagging.rb +13 -6
- data/test/models/task.rb +2 -0
- data/test/models/topic.rb +54 -19
- data/test/models/toy.rb +4 -0
- data/test/models/traffic_light.rb +2 -0
- data/test/models/treasure.rb +5 -3
- data/test/models/treaty.rb +2 -4
- data/test/models/tree.rb +2 -0
- data/test/models/tuning_peg.rb +2 -0
- data/test/models/tyre.rb +2 -0
- data/test/models/user.rb +12 -4
- data/test/models/uuid_child.rb +2 -0
- data/test/models/uuid_item.rb +2 -0
- data/test/models/uuid_parent.rb +2 -0
- data/test/models/vegetables.rb +12 -3
- data/test/models/vertex.rb +6 -4
- data/test/models/warehouse_thing.rb +2 -0
- data/test/models/wheel.rb +3 -1
- data/test/models/without_table.rb +3 -1
- data/test/models/zine.rb +3 -1
- data/test/schema/mysql2_specific_schema.rb +49 -35
- data/test/schema/oracle_specific_schema.rb +13 -15
- data/test/schema/postgresql_specific_schema.rb +51 -40
- data/test/schema/schema.rb +334 -154
- data/test/schema/sqlite_specific_schema.rb +9 -16
- data/test/support/config.rb +26 -26
- data/test/support/connection.rb +14 -8
- data/test/support/connection_helper.rb +3 -1
- data/test/support/ddl_helper.rb +2 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
- data/test/support/schema_dumping_helper.rb +2 -0
- data/test/support/stubs/strong_parameters.rb +40 -0
- data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
- data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
- metadata +190 -14
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
4
|
+
require "models/owner"
|
5
|
+
require "tempfile"
|
6
|
+
require "support/ddl_helper"
|
5
7
|
|
6
8
|
module ActiveRecord
|
7
9
|
module ConnectionAdapters
|
@@ -14,22 +16,35 @@ module ActiveRecord
|
|
14
16
|
end
|
15
17
|
|
16
18
|
def setup
|
17
|
-
@conn = Base.sqlite3_connection database:
|
18
|
-
adapter:
|
19
|
+
@conn = Base.sqlite3_connection database: ":memory:",
|
20
|
+
adapter: "sqlite3",
|
19
21
|
timeout: 100
|
22
|
+
|
23
|
+
@connection_handler = ActiveRecord::Base.connection_handler
|
20
24
|
end
|
21
25
|
|
22
26
|
def test_bad_connection
|
23
27
|
assert_raise ActiveRecord::NoDatabaseError do
|
24
28
|
connection = ActiveRecord::Base.sqlite3_connection(adapter: "sqlite3", database: "/tmp/should/_not/_exist/-cinco-dog.db")
|
25
|
-
connection.drop_table
|
29
|
+
connection.drop_table "ex", if_exists: true
|
26
30
|
end
|
27
31
|
end
|
28
32
|
|
33
|
+
def test_database_exists_returns_false_when_the_database_does_not_exist
|
34
|
+
assert_not SQLite3Adapter.database_exists?(adapter: "sqlite3", database: "non_extant_db"),
|
35
|
+
"expected non_extant_db to not exist"
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_database_exists_returns_true_when_database_exists
|
39
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
|
40
|
+
assert SQLite3Adapter.database_exists?(db_config.configuration_hash),
|
41
|
+
"expected #{db_config.database} to exist"
|
42
|
+
end
|
43
|
+
|
29
44
|
unless in_memory_db?
|
30
45
|
def test_connect_with_url
|
31
46
|
original_connection = ActiveRecord::Base.remove_connection
|
32
|
-
tf = Tempfile.open
|
47
|
+
tf = Tempfile.open "whatever"
|
33
48
|
url = "sqlite3:#{tf.path}"
|
34
49
|
ActiveRecord::Base.establish_connection(url)
|
35
50
|
assert ActiveRecord::Base.connection
|
@@ -49,33 +64,22 @@ module ActiveRecord
|
|
49
64
|
end
|
50
65
|
end
|
51
66
|
|
52
|
-
def
|
53
|
-
|
54
|
-
|
55
|
-
assert @conn.valid_type?(column.type)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
# sqlite3 databases should be able to support any type and not just the
|
60
|
-
# ones mentioned in the native_database_types.
|
61
|
-
#
|
62
|
-
# Therefore test_invalid column should always return true even if the
|
63
|
-
# type is not valid.
|
64
|
-
def test_invalid_column
|
65
|
-
assert @conn.valid_type?(:foobar)
|
67
|
+
def test_database_exists_returns_true_for_an_in_memory_db
|
68
|
+
assert SQLite3Adapter.database_exists?(database: ":memory:"),
|
69
|
+
"Expected in memory database to exist"
|
66
70
|
end
|
67
71
|
|
68
72
|
def test_column_types
|
69
|
-
owner = Owner.create!(name: "hello".encode(
|
73
|
+
owner = Owner.create!(name: "hello".encode("ascii-8bit"))
|
70
74
|
owner.reload
|
71
|
-
select = Owner.columns.map { |c| "typeof(#{c.name})" }.join
|
72
|
-
result = Owner.connection.exec_query
|
75
|
+
select = Owner.columns.map { |c| "typeof(#{c.name})" }.join ", "
|
76
|
+
result = Owner.connection.exec_query <<~SQL
|
73
77
|
SELECT #{select}
|
74
78
|
FROM #{Owner.table_name}
|
75
79
|
WHERE #{Owner.primary_key} = #{owner.id}
|
76
|
-
|
80
|
+
SQL
|
77
81
|
|
78
|
-
|
82
|
+
assert_not(result.rows.first.include?("blob"), "should not store blobs")
|
79
83
|
ensure
|
80
84
|
owner.delete
|
81
85
|
end
|
@@ -83,10 +87,10 @@ module ActiveRecord
|
|
83
87
|
def test_exec_insert
|
84
88
|
with_example_table do
|
85
89
|
vals = [Relation::QueryAttribute.new("number", 10, Type::Value.new)]
|
86
|
-
@conn.exec_insert(
|
90
|
+
@conn.exec_insert("insert into ex (number) VALUES (?)", "SQL", vals)
|
87
91
|
|
88
92
|
result = @conn.exec_query(
|
89
|
-
|
93
|
+
"select number from ex where number = ?", "SQL", vals)
|
90
94
|
|
91
95
|
assert_equal 1, result.rows.length
|
92
96
|
assert_equal 10, result.rows.first.first
|
@@ -94,103 +98,103 @@ module ActiveRecord
|
|
94
98
|
end
|
95
99
|
|
96
100
|
def test_primary_key_returns_nil_for_no_pk
|
97
|
-
with_example_table
|
98
|
-
assert_nil @conn.primary_key(
|
101
|
+
with_example_table "id int, data string" do
|
102
|
+
assert_nil @conn.primary_key("ex")
|
99
103
|
end
|
100
104
|
end
|
101
105
|
|
102
106
|
def test_connection_no_db
|
103
107
|
assert_raises(ArgumentError) do
|
104
|
-
Base.sqlite3_connection {}
|
108
|
+
Base.sqlite3_connection { }
|
105
109
|
end
|
106
110
|
end
|
107
111
|
|
108
112
|
def test_bad_timeout
|
109
113
|
assert_raises(TypeError) do
|
110
|
-
Base.sqlite3_connection database:
|
111
|
-
adapter:
|
112
|
-
timeout:
|
114
|
+
Base.sqlite3_connection database: ":memory:",
|
115
|
+
adapter: "sqlite3",
|
116
|
+
timeout: "usa"
|
113
117
|
end
|
114
118
|
end
|
115
119
|
|
116
120
|
# connection is OK with a nil timeout
|
117
121
|
def test_nil_timeout
|
118
|
-
conn = Base.sqlite3_connection database:
|
119
|
-
adapter:
|
122
|
+
conn = Base.sqlite3_connection database: ":memory:",
|
123
|
+
adapter: "sqlite3",
|
120
124
|
timeout: nil
|
121
|
-
assert conn,
|
125
|
+
assert conn, "made a connection"
|
122
126
|
end
|
123
127
|
|
124
128
|
def test_connect
|
125
|
-
assert @conn,
|
129
|
+
assert @conn, "should have connection"
|
126
130
|
end
|
127
131
|
|
128
132
|
# sqlite3 defaults to UTF-8 encoding
|
129
133
|
def test_encoding
|
130
|
-
assert_equal
|
134
|
+
assert_equal "UTF-8", @conn.encoding
|
131
135
|
end
|
132
136
|
|
133
137
|
def test_exec_no_binds
|
134
|
-
with_example_table
|
135
|
-
result = @conn.exec_query(
|
138
|
+
with_example_table "id int, data string" do
|
139
|
+
result = @conn.exec_query("SELECT id, data FROM ex")
|
136
140
|
assert_equal 0, result.rows.length
|
137
141
|
assert_equal 2, result.columns.length
|
138
142
|
assert_equal %w{ id data }, result.columns
|
139
143
|
|
140
144
|
@conn.exec_query('INSERT INTO ex (id, data) VALUES (1, "foo")')
|
141
|
-
result = @conn.exec_query(
|
145
|
+
result = @conn.exec_query("SELECT id, data FROM ex")
|
142
146
|
assert_equal 1, result.rows.length
|
143
147
|
assert_equal 2, result.columns.length
|
144
148
|
|
145
|
-
assert_equal [[1,
|
149
|
+
assert_equal [[1, "foo"]], result.rows
|
146
150
|
end
|
147
151
|
end
|
148
152
|
|
149
153
|
def test_exec_query_with_binds
|
150
|
-
with_example_table
|
154
|
+
with_example_table "id int, data string" do
|
151
155
|
@conn.exec_query('INSERT INTO ex (id, data) VALUES (1, "foo")')
|
152
156
|
result = @conn.exec_query(
|
153
|
-
|
157
|
+
"SELECT id, data FROM ex WHERE id = ?", nil, [Relation::QueryAttribute.new(nil, 1, Type::Value.new)])
|
154
158
|
|
155
159
|
assert_equal 1, result.rows.length
|
156
160
|
assert_equal 2, result.columns.length
|
157
161
|
|
158
|
-
assert_equal [[1,
|
162
|
+
assert_equal [[1, "foo"]], result.rows
|
159
163
|
end
|
160
164
|
end
|
161
165
|
|
162
166
|
def test_exec_query_typecasts_bind_vals
|
163
|
-
with_example_table
|
167
|
+
with_example_table "id int, data string" do
|
164
168
|
@conn.exec_query('INSERT INTO ex (id, data) VALUES (1, "foo")')
|
165
169
|
|
166
170
|
result = @conn.exec_query(
|
167
|
-
|
171
|
+
"SELECT id, data FROM ex WHERE id = ?", nil, [Relation::QueryAttribute.new("id", "1-fuu", Type::Integer.new)])
|
168
172
|
|
169
173
|
assert_equal 1, result.rows.length
|
170
174
|
assert_equal 2, result.columns.length
|
171
175
|
|
172
|
-
assert_equal [[1,
|
176
|
+
assert_equal [[1, "foo"]], result.rows
|
173
177
|
end
|
174
178
|
end
|
175
179
|
|
176
180
|
def test_quote_binary_column_escapes_it
|
177
|
-
DualEncoding.connection.execute(
|
181
|
+
DualEncoding.connection.execute(<<~SQL)
|
178
182
|
CREATE TABLE IF NOT EXISTS dual_encodings (
|
179
183
|
id integer PRIMARY KEY AUTOINCREMENT,
|
180
184
|
name varchar(255),
|
181
185
|
data binary
|
182
186
|
)
|
183
|
-
|
184
|
-
str = "\x80".force_encoding("ASCII-8BIT")
|
185
|
-
binary = DualEncoding.new name:
|
187
|
+
SQL
|
188
|
+
str = (+"\x80").force_encoding("ASCII-8BIT")
|
189
|
+
binary = DualEncoding.new name: "いただきます!", data: str
|
186
190
|
binary.save!
|
187
191
|
assert_equal str, binary.data
|
188
192
|
ensure
|
189
|
-
DualEncoding.connection.drop_table
|
193
|
+
DualEncoding.connection.drop_table "dual_encodings", if_exists: true
|
190
194
|
end
|
191
195
|
|
192
196
|
def test_type_cast_should_not_mutate_encoding
|
193
|
-
name
|
197
|
+
name = (+"hello").force_encoding(Encoding::ASCII_8BIT)
|
194
198
|
Owner.create(name: name)
|
195
199
|
assert_equal Encoding::ASCII_8BIT, name.encoding
|
196
200
|
ensure
|
@@ -204,8 +208,8 @@ module ActiveRecord
|
|
204
208
|
assert_equal 1, records.length
|
205
209
|
|
206
210
|
record = records.first
|
207
|
-
assert_equal 10, record[
|
208
|
-
assert_equal 1, record[
|
211
|
+
assert_equal 10, record["number"]
|
212
|
+
assert_equal 1, record["id"]
|
209
213
|
end
|
210
214
|
end
|
211
215
|
|
@@ -226,7 +230,7 @@ module ActiveRecord
|
|
226
230
|
def test_insert_id_value_returned
|
227
231
|
with_example_table do
|
228
232
|
sql = "INSERT INTO ex (number) VALUES (10)"
|
229
|
-
idval =
|
233
|
+
idval = "vuvuzela"
|
230
234
|
id = @conn.insert(sql, nil, nil, idval)
|
231
235
|
assert_equal idval, id
|
232
236
|
end
|
@@ -237,7 +241,7 @@ module ActiveRecord
|
|
237
241
|
2.times do |i|
|
238
242
|
@conn.create "INSERT INTO ex (number) VALUES (#{i})"
|
239
243
|
end
|
240
|
-
rows = @conn.select_rows
|
244
|
+
rows = @conn.select_rows "select number, id from ex"
|
241
245
|
assert_equal [[0, 1], [1, 2]], rows
|
242
246
|
end
|
243
247
|
end
|
@@ -254,7 +258,7 @@ module ActiveRecord
|
|
254
258
|
|
255
259
|
def test_transaction
|
256
260
|
with_example_table do
|
257
|
-
count_sql =
|
261
|
+
count_sql = "select count(*) from ex"
|
258
262
|
|
259
263
|
@conn.begin_db_transaction
|
260
264
|
@conn.create "INSERT INTO ex (number) VALUES (10)"
|
@@ -267,50 +271,36 @@ module ActiveRecord
|
|
267
271
|
|
268
272
|
def test_tables
|
269
273
|
with_example_table do
|
270
|
-
|
271
|
-
with_example_table
|
272
|
-
|
274
|
+
assert_equal %w{ ex }, @conn.tables
|
275
|
+
with_example_table "id integer PRIMARY KEY AUTOINCREMENT, number integer", "people" do
|
276
|
+
assert_equal %w{ ex people }.sort, @conn.tables.sort
|
273
277
|
end
|
274
278
|
end
|
275
279
|
end
|
276
280
|
|
277
281
|
def test_tables_logs_name
|
278
|
-
sql =
|
279
|
-
SELECT name FROM sqlite_master
|
280
|
-
WHERE type IN ('table','view') AND name <> 'sqlite_sequence'
|
282
|
+
sql = <<~SQL
|
283
|
+
SELECT name FROM sqlite_master WHERE name <> 'sqlite_sequence' AND type IN ('table')
|
281
284
|
SQL
|
282
|
-
assert_logged [[sql.squish,
|
283
|
-
|
284
|
-
@conn.tables('hello')
|
285
|
-
end
|
286
|
-
end
|
287
|
-
end
|
288
|
-
|
289
|
-
def test_indexes_logs_name
|
290
|
-
with_example_table do
|
291
|
-
assert_logged [["PRAGMA index_list(\"ex\")", 'SCHEMA', []]] do
|
292
|
-
@conn.indexes('ex', 'hello')
|
293
|
-
end
|
285
|
+
assert_logged [[sql.squish, "SCHEMA", []]] do
|
286
|
+
@conn.tables
|
294
287
|
end
|
295
288
|
end
|
296
289
|
|
297
290
|
def test_table_exists_logs_name
|
298
291
|
with_example_table do
|
299
|
-
sql =
|
300
|
-
SELECT name FROM sqlite_master
|
301
|
-
WHERE type IN ('table','view') AND name <> 'sqlite_sequence' AND name = 'ex'
|
292
|
+
sql = <<~SQL
|
293
|
+
SELECT name FROM sqlite_master WHERE name <> 'sqlite_sequence' AND name = 'ex' AND type IN ('table')
|
302
294
|
SQL
|
303
|
-
assert_logged [[sql.squish,
|
304
|
-
|
305
|
-
assert @conn.table_exists?('ex')
|
306
|
-
end
|
295
|
+
assert_logged [[sql.squish, "SCHEMA", []]] do
|
296
|
+
assert @conn.table_exists?("ex")
|
307
297
|
end
|
308
298
|
end
|
309
299
|
end
|
310
300
|
|
311
301
|
def test_columns
|
312
302
|
with_example_table do
|
313
|
-
columns = @conn.columns(
|
303
|
+
columns = @conn.columns("ex").sort_by(&:name)
|
314
304
|
assert_equal 2, columns.length
|
315
305
|
assert_equal %w{ id number }.sort, columns.map(&:name)
|
316
306
|
assert_equal [nil, nil], columns.map(&:default)
|
@@ -319,17 +309,25 @@ module ActiveRecord
|
|
319
309
|
end
|
320
310
|
|
321
311
|
def test_columns_with_default
|
322
|
-
with_example_table
|
323
|
-
column = @conn.columns(
|
324
|
-
x.name ==
|
312
|
+
with_example_table "id integer PRIMARY KEY AUTOINCREMENT, number integer default 10" do
|
313
|
+
column = @conn.columns("ex").find { |x|
|
314
|
+
x.name == "number"
|
325
315
|
}
|
326
|
-
assert_equal
|
316
|
+
assert_equal "10", column.default
|
327
317
|
end
|
328
318
|
end
|
329
319
|
|
330
320
|
def test_columns_with_not_null
|
331
|
-
with_example_table
|
332
|
-
column = @conn.columns(
|
321
|
+
with_example_table "id integer PRIMARY KEY AUTOINCREMENT, number integer not null" do
|
322
|
+
column = @conn.columns("ex").find { |x| x.name == "number" }
|
323
|
+
assert_not column.null, "column should not be null"
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
def test_add_column_with_not_null
|
328
|
+
with_example_table "id integer PRIMARY KEY AUTOINCREMENT, number integer not null" do
|
329
|
+
assert_nothing_raised { @conn.add_column :ex, :name, :string, null: false }
|
330
|
+
column = @conn.columns("ex").find { |x| x.name == "name" }
|
333
331
|
assert_not column.null, "column should not be null"
|
334
332
|
end
|
335
333
|
end
|
@@ -337,80 +335,237 @@ module ActiveRecord
|
|
337
335
|
def test_indexes_logs
|
338
336
|
with_example_table do
|
339
337
|
assert_logged [["PRAGMA index_list(\"ex\")", "SCHEMA", []]] do
|
340
|
-
@conn.indexes(
|
338
|
+
@conn.indexes("ex")
|
341
339
|
end
|
342
340
|
end
|
343
341
|
end
|
344
342
|
|
345
343
|
def test_no_indexes
|
346
|
-
assert_equal [], @conn.indexes(
|
344
|
+
assert_equal [], @conn.indexes("items")
|
347
345
|
end
|
348
346
|
|
349
347
|
def test_index
|
350
348
|
with_example_table do
|
351
|
-
@conn.add_index
|
352
|
-
index = @conn.indexes(
|
349
|
+
@conn.add_index "ex", "id", unique: true, name: "fun"
|
350
|
+
index = @conn.indexes("ex").find { |idx| idx.name == "fun" }
|
353
351
|
|
354
|
-
assert_equal
|
355
|
-
assert index.unique,
|
356
|
-
assert_equal [
|
352
|
+
assert_equal "ex", index.table
|
353
|
+
assert index.unique, "index is unique"
|
354
|
+
assert_equal ["id"], index.columns
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
def test_index_with_if_not_exists
|
359
|
+
with_example_table do
|
360
|
+
@conn.add_index "ex", "id"
|
361
|
+
|
362
|
+
assert_nothing_raised do
|
363
|
+
@conn.add_index "ex", "id", if_not_exists: true
|
364
|
+
end
|
357
365
|
end
|
358
366
|
end
|
359
367
|
|
360
368
|
def test_non_unique_index
|
361
369
|
with_example_table do
|
362
|
-
@conn.add_index
|
363
|
-
index = @conn.indexes(
|
364
|
-
assert_not index.unique,
|
370
|
+
@conn.add_index "ex", "id", name: "fun"
|
371
|
+
index = @conn.indexes("ex").find { |idx| idx.name == "fun" }
|
372
|
+
assert_not index.unique, "index is not unique"
|
365
373
|
end
|
366
374
|
end
|
367
375
|
|
368
376
|
def test_compound_index
|
369
377
|
with_example_table do
|
370
|
-
@conn.add_index
|
371
|
-
index = @conn.indexes(
|
378
|
+
@conn.add_index "ex", %w{ id number }, name: "fun"
|
379
|
+
index = @conn.indexes("ex").find { |idx| idx.name == "fun" }
|
372
380
|
assert_equal %w{ id number }.sort, index.columns.sort
|
373
381
|
end
|
374
382
|
end
|
375
383
|
|
384
|
+
if ActiveRecord::Base.connection.supports_expression_index?
|
385
|
+
def test_expression_index
|
386
|
+
with_example_table do
|
387
|
+
@conn.add_index "ex", "max(id, number)", name: "expression"
|
388
|
+
index = @conn.indexes("ex").find { |idx| idx.name == "expression" }
|
389
|
+
assert_equal "max(id, number)", index.columns
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
def test_expression_index_with_where
|
394
|
+
with_example_table do
|
395
|
+
@conn.add_index "ex", "id % 10, max(id, number)", name: "expression", where: "id > 1000"
|
396
|
+
index = @conn.indexes("ex").find { |idx| idx.name == "expression" }
|
397
|
+
assert_equal "id % 10, max(id, number)", index.columns
|
398
|
+
assert_equal "id > 1000", index.where
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
def test_complicated_expression
|
403
|
+
with_example_table do
|
404
|
+
@conn.execute "CREATE INDEX expression ON ex (id % 10, (CASE WHEN number > 0 THEN max(id, number) END))WHERE(id > 1000)"
|
405
|
+
index = @conn.indexes("ex").find { |idx| idx.name == "expression" }
|
406
|
+
assert_equal "id % 10, (CASE WHEN number > 0 THEN max(id, number) END)", index.columns
|
407
|
+
assert_equal "(id > 1000)", index.where
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
def test_not_everything_an_expression
|
412
|
+
with_example_table do
|
413
|
+
@conn.add_index "ex", "id, max(id, number)", name: "expression"
|
414
|
+
index = @conn.indexes("ex").find { |idx| idx.name == "expression" }
|
415
|
+
assert_equal "id, max(id, number)", index.columns
|
416
|
+
end
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
376
420
|
def test_primary_key
|
377
421
|
with_example_table do
|
378
|
-
assert_equal
|
379
|
-
with_example_table
|
380
|
-
assert_equal
|
422
|
+
assert_equal "id", @conn.primary_key("ex")
|
423
|
+
with_example_table "internet integer PRIMARY KEY AUTOINCREMENT, number integer not null", "foos" do
|
424
|
+
assert_equal "internet", @conn.primary_key("foos")
|
381
425
|
end
|
382
426
|
end
|
383
427
|
end
|
384
428
|
|
385
429
|
def test_no_primary_key
|
386
|
-
with_example_table
|
387
|
-
assert_nil @conn.primary_key(
|
430
|
+
with_example_table "number integer not null" do
|
431
|
+
assert_nil @conn.primary_key("ex")
|
388
432
|
end
|
389
433
|
end
|
390
434
|
|
435
|
+
class Barcode < ActiveRecord::Base
|
436
|
+
self.primary_key = "code"
|
437
|
+
end
|
438
|
+
|
439
|
+
def test_copy_table_with_existing_records_have_custom_primary_key
|
440
|
+
connection = Barcode.connection
|
441
|
+
connection.create_table(:barcodes, primary_key: "code", id: :string, limit: 42, force: true) do |t|
|
442
|
+
t.text :other_attr
|
443
|
+
end
|
444
|
+
code = "214fe0c2-dd47-46df-b53b-66090b3c1d40"
|
445
|
+
Barcode.create!(code: code, other_attr: "xxx")
|
446
|
+
|
447
|
+
connection.remove_column("barcodes", "other_attr")
|
448
|
+
|
449
|
+
assert_equal code, Barcode.first.id
|
450
|
+
ensure
|
451
|
+
Barcode.reset_column_information
|
452
|
+
end
|
453
|
+
|
454
|
+
def test_copy_table_with_composite_primary_keys
|
455
|
+
connection = Barcode.connection
|
456
|
+
connection.create_table(:barcodes, primary_key: ["region", "code"], force: true) do |t|
|
457
|
+
t.string :region
|
458
|
+
t.string :code
|
459
|
+
t.text :other_attr
|
460
|
+
end
|
461
|
+
region = "US"
|
462
|
+
code = "214fe0c2-dd47-46df-b53b-66090b3c1d40"
|
463
|
+
Barcode.create!(region: region, code: code, other_attr: "xxx")
|
464
|
+
|
465
|
+
connection.remove_column("barcodes", "other_attr")
|
466
|
+
|
467
|
+
assert_equal ["region", "code"], connection.primary_keys("barcodes")
|
468
|
+
|
469
|
+
barcode = Barcode.first
|
470
|
+
assert_equal region, barcode.region
|
471
|
+
assert_equal code, barcode.code
|
472
|
+
ensure
|
473
|
+
Barcode.reset_column_information
|
474
|
+
end
|
475
|
+
|
476
|
+
def test_custom_primary_key_in_create_table
|
477
|
+
connection = Barcode.connection
|
478
|
+
connection.create_table :barcodes, id: false, force: true do |t|
|
479
|
+
t.primary_key :id, :string
|
480
|
+
end
|
481
|
+
|
482
|
+
assert_equal "id", connection.primary_key("barcodes")
|
483
|
+
|
484
|
+
custom_pk = Barcode.columns_hash["id"]
|
485
|
+
|
486
|
+
assert_equal :string, custom_pk.type
|
487
|
+
assert_not custom_pk.null
|
488
|
+
ensure
|
489
|
+
Barcode.reset_column_information
|
490
|
+
end
|
491
|
+
|
492
|
+
def test_custom_primary_key_in_change_table
|
493
|
+
connection = Barcode.connection
|
494
|
+
connection.create_table :barcodes, id: false, force: true do |t|
|
495
|
+
t.integer :dummy
|
496
|
+
end
|
497
|
+
connection.change_table :barcodes do |t|
|
498
|
+
t.primary_key :id, :string
|
499
|
+
end
|
500
|
+
|
501
|
+
assert_equal "id", connection.primary_key("barcodes")
|
502
|
+
|
503
|
+
custom_pk = Barcode.columns_hash["id"]
|
504
|
+
|
505
|
+
assert_equal :string, custom_pk.type
|
506
|
+
assert_not custom_pk.null
|
507
|
+
ensure
|
508
|
+
Barcode.reset_column_information
|
509
|
+
end
|
510
|
+
|
511
|
+
def test_add_column_with_custom_primary_key
|
512
|
+
connection = Barcode.connection
|
513
|
+
connection.create_table :barcodes, id: false, force: true do |t|
|
514
|
+
t.integer :dummy
|
515
|
+
end
|
516
|
+
connection.add_column :barcodes, :id, :string, primary_key: true
|
517
|
+
|
518
|
+
assert_equal "id", connection.primary_key("barcodes")
|
519
|
+
|
520
|
+
custom_pk = Barcode.columns_hash["id"]
|
521
|
+
|
522
|
+
assert_equal :string, custom_pk.type
|
523
|
+
assert_not custom_pk.null
|
524
|
+
ensure
|
525
|
+
Barcode.reset_column_information
|
526
|
+
end
|
527
|
+
|
528
|
+
def test_remove_column_preserves_partial_indexes
|
529
|
+
connection = Barcode.connection
|
530
|
+
connection.create_table :barcodes, force: true do |t|
|
531
|
+
t.string :code
|
532
|
+
t.string :region
|
533
|
+
t.boolean :bool_attr
|
534
|
+
|
535
|
+
t.index :code, unique: true, where: :bool_attr, name: "partial"
|
536
|
+
end
|
537
|
+
connection.remove_column :barcodes, :region
|
538
|
+
|
539
|
+
index = connection.indexes("barcodes").find { |idx| idx.name == "partial" }
|
540
|
+
assert_equal "bool_attr", index.where
|
541
|
+
ensure
|
542
|
+
Barcode.reset_column_information
|
543
|
+
end
|
544
|
+
|
391
545
|
def test_supports_extensions
|
392
|
-
assert_not @conn.supports_extensions?,
|
546
|
+
assert_not @conn.supports_extensions?, "does not support extensions"
|
393
547
|
end
|
394
548
|
|
395
549
|
def test_respond_to_enable_extension
|
396
|
-
|
550
|
+
assert_respond_to @conn, :enable_extension
|
397
551
|
end
|
398
552
|
|
399
553
|
def test_respond_to_disable_extension
|
400
|
-
|
554
|
+
assert_respond_to @conn, :disable_extension
|
401
555
|
end
|
402
556
|
|
403
557
|
def test_statement_closed
|
404
|
-
|
405
|
-
|
558
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
|
559
|
+
db = ::SQLite3::Database.new(db_config.database)
|
560
|
+
|
406
561
|
statement = ::SQLite3::Statement.new(db,
|
407
|
-
|
408
|
-
statement.stub(:step, ->{ raise ::SQLite3::BusyException.new(
|
562
|
+
"CREATE TABLE statement_test (number integer not null)")
|
563
|
+
statement.stub(:step, -> { raise ::SQLite3::BusyException.new("busy") }) do
|
409
564
|
assert_called(statement, :columns, returns: []) do
|
410
565
|
assert_called(statement, :close) do
|
411
566
|
::SQLite3::Statement.stub(:new, statement) do
|
412
567
|
assert_raises ActiveRecord::StatementInvalid do
|
413
|
-
@conn.exec_query
|
568
|
+
@conn.exec_query "select * from statement_test"
|
414
569
|
end
|
415
570
|
end
|
416
571
|
end
|
@@ -418,24 +573,56 @@ module ActiveRecord
|
|
418
573
|
end
|
419
574
|
end
|
420
575
|
|
421
|
-
|
576
|
+
def test_db_is_not_readonly_when_readonly_option_is_false
|
577
|
+
conn = Base.sqlite3_connection database: ":memory:",
|
578
|
+
adapter: "sqlite3",
|
579
|
+
readonly: false
|
422
580
|
|
423
|
-
|
424
|
-
subscriber = SQLSubscriber.new
|
425
|
-
subscription = ActiveSupport::Notifications.subscribe('sql.active_record', subscriber)
|
426
|
-
yield
|
427
|
-
assert_equal logs, subscriber.logged
|
428
|
-
ensure
|
429
|
-
ActiveSupport::Notifications.unsubscribe(subscription)
|
581
|
+
assert_not_predicate conn.raw_connection, :readonly?
|
430
582
|
end
|
431
583
|
|
432
|
-
def
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
584
|
+
def test_db_is_not_readonly_when_readonly_option_is_unspecified
|
585
|
+
conn = Base.sqlite3_connection database: ":memory:",
|
586
|
+
adapter: "sqlite3"
|
587
|
+
|
588
|
+
assert_not_predicate conn.raw_connection, :readonly?
|
589
|
+
end
|
590
|
+
|
591
|
+
def test_db_is_readonly_when_readonly_option_is_true
|
592
|
+
conn = Base.sqlite3_connection database: ":memory:",
|
593
|
+
adapter: "sqlite3",
|
594
|
+
readonly: true
|
595
|
+
|
596
|
+
assert_predicate conn.raw_connection, :readonly?
|
438
597
|
end
|
598
|
+
|
599
|
+
def test_writes_are_not_permitted_to_readonly_databases
|
600
|
+
conn = Base.sqlite3_connection database: ":memory:",
|
601
|
+
adapter: "sqlite3",
|
602
|
+
readonly: true
|
603
|
+
|
604
|
+
assert_raises(ActiveRecord::StatementInvalid, /SQLite3::ReadOnlyException/) do
|
605
|
+
conn.execute("CREATE TABLE test(id integer)")
|
606
|
+
end
|
607
|
+
end
|
608
|
+
|
609
|
+
private
|
610
|
+
def assert_logged(logs)
|
611
|
+
subscriber = SQLSubscriber.new
|
612
|
+
subscription = ActiveSupport::Notifications.subscribe("sql.active_record", subscriber)
|
613
|
+
yield
|
614
|
+
assert_equal logs, subscriber.logged
|
615
|
+
ensure
|
616
|
+
ActiveSupport::Notifications.unsubscribe(subscription)
|
617
|
+
end
|
618
|
+
|
619
|
+
def with_example_table(definition = nil, table_name = "ex", &block)
|
620
|
+
definition ||= <<~SQL
|
621
|
+
id integer PRIMARY KEY AUTOINCREMENT,
|
622
|
+
number integer
|
623
|
+
SQL
|
624
|
+
super(@conn, table_name, definition, &block)
|
625
|
+
end
|
439
626
|
end
|
440
627
|
end
|
441
628
|
end
|