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
data/test/cases/adapter_test.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
4
|
+
require "support/connection_helper"
|
2
5
|
require "models/book"
|
3
6
|
require "models/post"
|
4
7
|
require "models/author"
|
@@ -6,140 +9,152 @@ require "models/event"
|
|
6
9
|
|
7
10
|
module ActiveRecord
|
8
11
|
class AdapterTest < ActiveRecord::TestCase
|
9
|
-
def setup
|
12
|
+
def setup
|
10
13
|
@connection = ActiveRecord::Base.connection
|
14
|
+
@connection.materialize_transactions
|
11
15
|
end
|
12
16
|
|
13
17
|
##
|
14
18
|
# PostgreSQL does not support null bytes in strings
|
15
|
-
unless current_adapter?(:PostgreSQLAdapter
|
19
|
+
unless current_adapter?(:PostgreSQLAdapter) ||
|
16
20
|
(current_adapter?(:SQLite3Adapter) && !ActiveRecord::Base.connection.prepared_statements)
|
17
21
|
def test_update_prepared_statement
|
18
22
|
b = Book.create(name: "my \x00 book")
|
19
23
|
b.reload
|
20
24
|
assert_equal "my \x00 book", b.name
|
21
|
-
b.
|
25
|
+
b.update(name: "my other \x00 book")
|
22
26
|
b.reload
|
23
27
|
assert_equal "my other \x00 book", b.name
|
24
28
|
end
|
25
29
|
end
|
26
30
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
assert_nothing_raised { Book.destroy(0) }
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_tables
|
36
|
-
tables = nil
|
37
|
-
ActiveSupport::Deprecation.silence { tables = @connection.tables }
|
38
|
-
assert tables.include?("accounts")
|
39
|
-
assert tables.include?("authors")
|
40
|
-
assert tables.include?("tasks")
|
41
|
-
assert tables.include?("topics")
|
31
|
+
def test_create_record_with_pk_as_zero
|
32
|
+
Book.create(id: 0)
|
33
|
+
assert_equal 0, Book.find(0).id
|
34
|
+
assert_nothing_raised { Book.destroy(0) }
|
42
35
|
end
|
43
36
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
assert @connection.table_exists?("accounts")
|
48
|
-
assert !@connection.table_exists?("nonexistingtable")
|
49
|
-
assert !@connection.table_exists?(nil)
|
37
|
+
def test_valid_column
|
38
|
+
@connection.native_database_types.each_key do |type|
|
39
|
+
assert @connection.valid_type?(type)
|
50
40
|
end
|
51
41
|
end
|
52
42
|
|
53
|
-
def
|
54
|
-
|
43
|
+
def test_invalid_column
|
44
|
+
assert_not @connection.valid_type?(:foobar)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_tables
|
48
|
+
tables = @connection.tables
|
49
|
+
assert_includes tables, "accounts"
|
50
|
+
assert_includes tables, "authors"
|
51
|
+
assert_includes tables, "tasks"
|
52
|
+
assert_includes tables, "topics"
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_table_exists?
|
56
|
+
assert @connection.table_exists?("accounts")
|
57
|
+
assert @connection.table_exists?(:accounts)
|
58
|
+
assert_not @connection.table_exists?("nonexistingtable")
|
59
|
+
assert_not @connection.table_exists?("'")
|
60
|
+
assert_not @connection.table_exists?(nil)
|
55
61
|
end
|
56
62
|
|
57
63
|
def test_data_sources
|
58
64
|
data_sources = @connection.data_sources
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
65
|
+
assert_includes data_sources, "accounts"
|
66
|
+
assert_includes data_sources, "authors"
|
67
|
+
assert_includes data_sources, "tasks"
|
68
|
+
assert_includes data_sources, "topics"
|
63
69
|
end
|
64
70
|
|
65
71
|
def test_data_source_exists?
|
66
72
|
assert @connection.data_source_exists?("accounts")
|
67
73
|
assert @connection.data_source_exists?(:accounts)
|
68
74
|
assert_not @connection.data_source_exists?("nonexistingtable")
|
75
|
+
assert_not @connection.data_source_exists?("'")
|
69
76
|
assert_not @connection.data_source_exists?(nil)
|
70
77
|
end
|
71
78
|
|
72
79
|
def test_indexes
|
73
80
|
idx_name = "accounts_idx"
|
74
81
|
|
75
|
-
|
76
|
-
|
77
|
-
assert indexes.empty?
|
82
|
+
indexes = @connection.indexes("accounts")
|
83
|
+
assert_empty indexes
|
78
84
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
85
|
+
@connection.add_index :accounts, :firm_id, name: idx_name
|
86
|
+
indexes = @connection.indexes("accounts")
|
87
|
+
assert_equal "accounts", indexes.first.table
|
88
|
+
assert_equal idx_name, indexes.first.name
|
89
|
+
assert_not indexes.first.unique
|
90
|
+
assert_equal ["firm_id"], indexes.first.columns
|
91
|
+
ensure
|
92
|
+
@connection.remove_index(:accounts, name: idx_name) rescue nil
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_remove_index_when_name_and_wrong_column_name_specified
|
96
|
+
index_name = "accounts_idx"
|
97
|
+
|
98
|
+
@connection.add_index :accounts, :firm_id, name: index_name
|
99
|
+
assert_raises ArgumentError do
|
100
|
+
@connection.remove_index :accounts, name: index_name, column: :wrong_column_name
|
87
101
|
end
|
102
|
+
ensure
|
103
|
+
@connection.remove_index(:accounts, name: index_name)
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_remove_index_when_name_and_wrong_column_name_specified_positional_argument
|
107
|
+
index_name = "accounts_idx"
|
88
108
|
|
109
|
+
@connection.add_index :accounts, :firm_id, name: index_name
|
110
|
+
assert_raises ArgumentError do
|
111
|
+
@connection.remove_index :accounts, :wrong_column_name, name: index_name
|
112
|
+
end
|
89
113
|
ensure
|
90
|
-
@connection.remove_index(:accounts, :
|
91
|
-
end
|
92
|
-
|
93
|
-
unless current_adapter?(:IBM_DBAdapter)
|
94
|
-
def test_remove_index_when_name_and_wrong_column_name_specified
|
95
|
-
index_name = "accounts_idx"
|
96
|
-
|
97
|
-
@connection.add_index :accounts, :firm_id, :name => index_name
|
98
|
-
assert_raises ArgumentError do
|
99
|
-
@connection.remove_index :accounts, :name => index_name, :column => :wrong_column_name
|
100
|
-
end
|
101
|
-
ensure
|
102
|
-
@connection.remove_index(:accounts, :name => index_name)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
114
|
+
@connection.remove_index(:accounts, name: index_name)
|
115
|
+
end
|
116
|
+
|
106
117
|
def test_current_database
|
107
118
|
if @connection.respond_to?(:current_database)
|
108
|
-
assert_equal ARTest.
|
119
|
+
assert_equal ARTest.test_configuration_hashes["arunit"]["database"], @connection.current_database
|
109
120
|
end
|
110
121
|
end
|
111
122
|
|
123
|
+
def test_exec_query_returns_an_empty_result
|
124
|
+
result = @connection.exec_query "INSERT INTO subscribers(nick) VALUES('me')"
|
125
|
+
assert_instance_of(ActiveRecord::Result, result)
|
126
|
+
end
|
127
|
+
|
112
128
|
if current_adapter?(:Mysql2Adapter)
|
113
129
|
def test_charset
|
114
130
|
assert_not_nil @connection.charset
|
115
|
-
assert_not_equal
|
116
|
-
assert_equal @connection.show_variable(
|
131
|
+
assert_not_equal "character_set_database", @connection.charset
|
132
|
+
assert_equal @connection.show_variable("character_set_database"), @connection.charset
|
117
133
|
end
|
118
134
|
|
119
135
|
def test_collation
|
120
136
|
assert_not_nil @connection.collation
|
121
|
-
assert_not_equal
|
122
|
-
assert_equal @connection.show_variable(
|
137
|
+
assert_not_equal "collation_database", @connection.collation
|
138
|
+
assert_equal @connection.show_variable("collation_database"), @connection.collation
|
123
139
|
end
|
124
140
|
|
125
141
|
def test_show_nonexistent_variable_returns_nil
|
126
|
-
assert_nil @connection.show_variable(
|
142
|
+
assert_nil @connection.show_variable("foo_bar_baz")
|
127
143
|
end
|
128
144
|
|
129
145
|
def test_not_specifying_database_name_for_cross_database_selects
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
end
|
140
|
-
ensure
|
141
|
-
ActiveRecord::Base.establish_connection :arunit
|
146
|
+
assert_nothing_raised do
|
147
|
+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
|
148
|
+
ActiveRecord::Base.establish_connection(db_config.configuration_hash.except(:database))
|
149
|
+
|
150
|
+
config = ARTest.test_configuration_hashes
|
151
|
+
ActiveRecord::Base.connection.execute(
|
152
|
+
"SELECT #{config['arunit']['database']}.pirates.*, #{config['arunit2']['database']}.courses.* " \
|
153
|
+
"FROM #{config['arunit']['database']}.pirates, #{config['arunit2']['database']}.courses"
|
154
|
+
)
|
142
155
|
end
|
156
|
+
ensure
|
157
|
+
ActiveRecord::Base.establish_connection :arunit
|
143
158
|
end
|
144
159
|
end
|
145
160
|
|
@@ -150,9 +165,9 @@ module ActiveRecord
|
|
150
165
|
alias_method :table_alias_length, :test_table_alias_length
|
151
166
|
end
|
152
167
|
|
153
|
-
assert_equal
|
154
|
-
assert_equal
|
155
|
-
assert_equal
|
168
|
+
assert_equal "posts", @connection.table_alias_for("posts")
|
169
|
+
assert_equal "posts_comm", @connection.table_alias_for("posts_comments")
|
170
|
+
assert_equal "dbo_posts", @connection.table_alias_for("dbo.posts")
|
156
171
|
|
157
172
|
class << @connection
|
158
173
|
remove_method :table_alias_length
|
@@ -160,90 +175,61 @@ module ActiveRecord
|
|
160
175
|
end
|
161
176
|
end
|
162
177
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
def test_reset_empty_table_with_custom_pk
|
169
|
-
Movie.delete_all
|
170
|
-
Movie.connection.reset_pk_sequence! 'movies'
|
171
|
-
assert_equal 1, Movie.create(:name => 'fight club').id
|
178
|
+
def test_uniqueness_violations_are_translated_to_specific_exception
|
179
|
+
@connection.execute "INSERT INTO subscribers(nick) VALUES('me')"
|
180
|
+
error = assert_raises(ActiveRecord::RecordNotUnique) do
|
181
|
+
@connection.execute "INSERT INTO subscribers(nick) VALUES('me')"
|
172
182
|
end
|
173
183
|
|
174
|
-
|
175
|
-
Subscriber.delete_all
|
176
|
-
Subscriber.connection.reset_pk_sequence! 'subscribers'
|
177
|
-
sub = Subscriber.new(:name => 'robert drake')
|
178
|
-
sub.id = 'bob drake'
|
179
|
-
assert_nothing_raised { sub.save! }
|
180
|
-
end
|
184
|
+
assert_not_nil error.cause
|
181
185
|
end
|
182
|
-
|
183
|
-
unless current_adapter?(:IBM_DBAdapter)
|
184
|
-
def test_uniqueness_violations_are_translated_to_specific_exception
|
185
|
-
@connection.execute "INSERT INTO subscribers(nick) VALUES('me')"
|
186
|
-
error = assert_raises(ActiveRecord::RecordNotUnique) do
|
187
|
-
@connection.execute "INSERT INTO subscribers(nick) VALUES('me')"
|
188
|
-
end
|
189
|
-
|
190
|
-
assert_not_nil error.cause
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
unless current_adapter?(:SQLite3Adapter, :IBM_DBAdapter)
|
195
|
-
def test_foreign_key_violations_are_translated_to_specific_exception
|
196
|
-
error = assert_raises(ActiveRecord::InvalidForeignKey) do
|
197
|
-
# Oracle adapter uses prefetched primary key values from sequence and passes them to connection adapter insert method
|
198
|
-
if @connection.prefetch_primary_key?
|
199
|
-
id_value = @connection.next_sequence_value(@connection.default_sequence_name("fk_test_has_fk", "id"))
|
200
|
-
@connection.execute "INSERT INTO fk_test_has_fk (id, fk_id) VALUES (#{id_value},0)"
|
201
|
-
else
|
202
|
-
@connection.execute "INSERT INTO fk_test_has_fk (fk_id) VALUES (0)"
|
203
|
-
end
|
204
|
-
end
|
205
186
|
|
206
|
-
|
187
|
+
def test_not_null_violations_are_translated_to_specific_exception
|
188
|
+
error = assert_raises(ActiveRecord::NotNullViolation) do
|
189
|
+
Post.create
|
207
190
|
end
|
208
191
|
|
209
|
-
|
210
|
-
|
211
|
-
self.table_name = 'fk_test_has_fk'
|
212
|
-
end
|
192
|
+
assert_not_nil error.cause
|
193
|
+
end
|
213
194
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
195
|
+
unless current_adapter?(:SQLite3Adapter)
|
196
|
+
def test_value_limit_violations_are_translated_to_specific_exception
|
197
|
+
error = assert_raises(ActiveRecord::ValueTooLong) do
|
198
|
+
Event.create(title: "abcdefgh")
|
218
199
|
end
|
219
200
|
|
220
201
|
assert_not_nil error.cause
|
221
202
|
end
|
222
203
|
|
223
|
-
def
|
224
|
-
error = assert_raises(ActiveRecord::
|
225
|
-
|
204
|
+
def test_numeric_value_out_of_ranges_are_translated_to_specific_exception
|
205
|
+
error = assert_raises(ActiveRecord::RangeError) do
|
206
|
+
Book.connection.create("INSERT INTO books(author_id) VALUES (9223372036854775808)")
|
226
207
|
end
|
227
208
|
|
228
209
|
assert_not_nil error.cause
|
229
210
|
end
|
230
211
|
end
|
231
212
|
|
232
|
-
def
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
id_value = @connection.next_sequence_value(@connection.default_sequence_name("fk_test_has_fk", "id"))
|
238
|
-
@connection.execute "INSERT INTO fk_test_has_fk (id, fk_id) VALUES (#{id_value},0)"
|
239
|
-
else
|
240
|
-
@connection.execute "INSERT INTO fk_test_has_fk (fk_id) VALUES (0)"
|
241
|
-
end
|
242
|
-
# should delete created record as otherwise disable_referential_integrity will try to enable constraints after executed block
|
243
|
-
# and will fail (at least on Oracle)
|
244
|
-
@connection.execute "DELETE FROM fk_test_has_fk"
|
245
|
-
end
|
213
|
+
def test_exceptions_from_notifications_are_not_translated
|
214
|
+
original_error = StandardError.new("This StandardError shouldn't get translated")
|
215
|
+
subscriber = ActiveSupport::Notifications.subscribe("sql.active_record") { raise original_error }
|
216
|
+
actual_error = assert_raises(StandardError) do
|
217
|
+
@connection.execute("SELECT * FROM posts")
|
246
218
|
end
|
219
|
+
|
220
|
+
assert_equal original_error, actual_error
|
221
|
+
|
222
|
+
ensure
|
223
|
+
ActiveSupport::Notifications.unsubscribe(subscriber) if subscriber
|
224
|
+
end
|
225
|
+
|
226
|
+
def test_database_related_exceptions_are_translated_to_statement_invalid
|
227
|
+
error = assert_raises(ActiveRecord::StatementInvalid) do
|
228
|
+
@connection.execute("This is a syntax error")
|
229
|
+
end
|
230
|
+
|
231
|
+
assert_instance_of ActiveRecord::StatementInvalid, error
|
232
|
+
assert_kind_of Exception, error.cause
|
247
233
|
end
|
248
234
|
|
249
235
|
def test_select_all_always_return_activerecord_result
|
@@ -252,100 +238,328 @@ module ActiveRecord
|
|
252
238
|
end
|
253
239
|
|
254
240
|
if ActiveRecord::Base.connection.prepared_statements
|
255
|
-
def
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
241
|
+
def test_select_all_insert_update_delete_with_legacy_binds
|
242
|
+
binds = [[Event.column_for_attribute("id"), 1]]
|
243
|
+
bind_param = Arel::Nodes::BindParam.new(nil)
|
244
|
+
|
245
|
+
assert_deprecated do
|
246
|
+
id = @connection.insert("INSERT INTO events(id) VALUES (#{bind_param.to_sql})", nil, nil, nil, nil, binds)
|
247
|
+
assert_equal 1, id
|
248
|
+
end
|
249
|
+
|
250
|
+
assert_deprecated do
|
251
|
+
updated = @connection.update("UPDATE events SET title = 'foo' WHERE id = #{bind_param.to_sql}", nil, binds)
|
252
|
+
assert_equal 1, updated
|
253
|
+
end
|
254
|
+
|
255
|
+
assert_deprecated do
|
256
|
+
result = @connection.select_all("SELECT * FROM events WHERE id = #{bind_param.to_sql}", nil, binds)
|
257
|
+
assert_equal({ "id" => 1, "title" => "foo" }, result.first)
|
258
|
+
end
|
259
|
+
|
260
|
+
assert_deprecated do
|
261
|
+
deleted = @connection.delete("DELETE FROM events WHERE id = #{bind_param.to_sql}", nil, binds)
|
262
|
+
assert_equal 1, deleted
|
263
|
+
end
|
264
|
+
|
265
|
+
assert_deprecated do
|
266
|
+
result = @connection.select_all("SELECT * FROM events WHERE id = #{bind_param.to_sql}", nil, binds)
|
267
|
+
assert_nil result.first
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
def test_select_all_insert_update_delete_with_casted_binds
|
272
|
+
binds = [Event.type_for_attribute("id").serialize(1)]
|
273
|
+
bind_param = Arel::Nodes::BindParam.new(nil)
|
274
|
+
|
275
|
+
id = @connection.insert("INSERT INTO events(id) VALUES (#{bind_param.to_sql})", nil, nil, nil, nil, binds)
|
276
|
+
assert_equal 1, id
|
277
|
+
|
278
|
+
updated = @connection.update("UPDATE events SET title = 'foo' WHERE id = #{bind_param.to_sql}", nil, binds)
|
279
|
+
assert_equal 1, updated
|
280
|
+
|
281
|
+
result = @connection.select_all("SELECT * FROM events WHERE id = #{bind_param.to_sql}", nil, binds)
|
282
|
+
assert_equal({ "id" => 1, "title" => "foo" }, result.first)
|
283
|
+
|
284
|
+
deleted = @connection.delete("DELETE FROM events WHERE id = #{bind_param.to_sql}", nil, binds)
|
285
|
+
assert_equal 1, deleted
|
286
|
+
|
287
|
+
result = @connection.select_all("SELECT * FROM events WHERE id = #{bind_param.to_sql}", nil, binds)
|
288
|
+
assert_nil result.first
|
289
|
+
end
|
290
|
+
|
291
|
+
def test_select_all_insert_update_delete_with_binds
|
292
|
+
binds = [Relation::QueryAttribute.new("id", 1, Event.type_for_attribute("id"))]
|
293
|
+
bind_param = Arel::Nodes::BindParam.new(nil)
|
294
|
+
|
295
|
+
id = @connection.insert("INSERT INTO events(id) VALUES (#{bind_param.to_sql})", nil, nil, nil, nil, binds)
|
296
|
+
assert_equal 1, id
|
297
|
+
|
298
|
+
updated = @connection.update("UPDATE events SET title = 'foo' WHERE id = #{bind_param.to_sql}", nil, binds)
|
299
|
+
assert_equal 1, updated
|
300
|
+
|
301
|
+
result = @connection.select_all("SELECT * FROM events WHERE id = #{bind_param.to_sql}", nil, binds)
|
302
|
+
assert_equal({ "id" => 1, "title" => "foo" }, result.first)
|
303
|
+
|
304
|
+
deleted = @connection.delete("DELETE FROM events WHERE id = #{bind_param.to_sql}", nil, binds)
|
305
|
+
assert_equal 1, deleted
|
306
|
+
|
307
|
+
result = @connection.select_all("SELECT * FROM events WHERE id = #{bind_param.to_sql}", nil, binds)
|
308
|
+
assert_nil result.first
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
def test_select_methods_passing_a_association_relation
|
313
|
+
author = Author.create!(name: "john")
|
314
|
+
Post.create!(author: author, title: "foo", body: "bar")
|
315
|
+
query = author.posts.where(title: "foo").select(:title)
|
316
|
+
assert_equal({ "title" => "foo" }, @connection.select_one(query))
|
317
|
+
assert @connection.select_all(query).is_a?(ActiveRecord::Result)
|
318
|
+
assert_equal "foo", @connection.select_value(query)
|
319
|
+
assert_equal ["foo"], @connection.select_values(query)
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_select_methods_passing_a_relation
|
323
|
+
Post.create!(title: "foo", body: "bar")
|
324
|
+
query = Post.where(title: "foo").select(:title)
|
325
|
+
assert_equal({ "title" => "foo" }, @connection.select_one(query))
|
326
|
+
assert @connection.select_all(query).is_a?(ActiveRecord::Result)
|
327
|
+
assert_equal "foo", @connection.select_value(query)
|
328
|
+
assert_equal ["foo"], @connection.select_values(query)
|
329
|
+
end
|
287
330
|
|
288
331
|
test "type_to_sql returns a String for unmapped types" do
|
289
332
|
assert_equal "special_db_type", @connection.type_to_sql(:special_db_type)
|
290
333
|
end
|
291
334
|
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
@connection.send :log, "SELECT 'ы' FROM DUAL" do
|
296
|
-
raise 'ы'.force_encoding(Encoding::ASCII_8BIT)
|
297
|
-
end
|
298
|
-
end
|
335
|
+
def test_allowed_index_name_length_is_deprecated
|
336
|
+
assert_deprecated { @connection.allowed_index_name_length }
|
337
|
+
end
|
299
338
|
|
300
|
-
|
339
|
+
unless current_adapter?(:OracleAdapter)
|
340
|
+
def test_in_clause_length_is_deprecated
|
341
|
+
assert_deprecated { @connection.in_clause_length }
|
301
342
|
end
|
302
343
|
end
|
344
|
+
end
|
345
|
+
|
346
|
+
class AdapterForeignKeyTest < ActiveRecord::TestCase
|
347
|
+
self.use_transactional_tests = false
|
303
348
|
|
304
|
-
|
305
|
-
|
306
|
-
|
349
|
+
fixtures :fk_test_has_pk
|
350
|
+
|
351
|
+
def setup
|
352
|
+
@connection = ActiveRecord::Base.connection
|
353
|
+
end
|
354
|
+
|
355
|
+
def test_foreign_key_violations_are_translated_to_specific_exception_with_validate_false
|
356
|
+
klass_has_fk = Class.new(ActiveRecord::Base) do
|
357
|
+
self.table_name = "fk_test_has_fk"
|
307
358
|
end
|
359
|
+
|
360
|
+
error = assert_raises(ActiveRecord::InvalidForeignKey) do
|
361
|
+
has_fk = klass_has_fk.new
|
362
|
+
has_fk.fk_id = 1231231231
|
363
|
+
has_fk.save(validate: false)
|
364
|
+
end
|
365
|
+
|
366
|
+
assert_not_nil error.cause
|
308
367
|
end
|
309
368
|
|
310
|
-
def
|
311
|
-
|
369
|
+
def test_foreign_key_violations_on_insert_are_translated_to_specific_exception
|
370
|
+
error = assert_raises(ActiveRecord::InvalidForeignKey) do
|
371
|
+
insert_into_fk_test_has_fk
|
372
|
+
end
|
373
|
+
|
374
|
+
assert_not_nil error.cause
|
312
375
|
end
|
376
|
+
|
377
|
+
def test_foreign_key_violations_on_delete_are_translated_to_specific_exception
|
378
|
+
insert_into_fk_test_has_fk fk_id: 1
|
379
|
+
|
380
|
+
error = assert_raises(ActiveRecord::InvalidForeignKey) do
|
381
|
+
@connection.execute "DELETE FROM fk_test_has_pk WHERE pk_id = 1"
|
382
|
+
end
|
383
|
+
|
384
|
+
assert_not_nil error.cause
|
385
|
+
end
|
386
|
+
|
387
|
+
def test_disable_referential_integrity
|
388
|
+
assert_nothing_raised do
|
389
|
+
@connection.disable_referential_integrity do
|
390
|
+
insert_into_fk_test_has_fk
|
391
|
+
# should delete created record as otherwise disable_referential_integrity will try to enable constraints
|
392
|
+
# after executed block and will fail (at least on Oracle)
|
393
|
+
@connection.execute "DELETE FROM fk_test_has_fk"
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
private
|
399
|
+
def insert_into_fk_test_has_fk(fk_id: 0)
|
400
|
+
# Oracle adapter uses prefetched primary key values from sequence and passes them to connection adapter insert method
|
401
|
+
if @connection.prefetch_primary_key?
|
402
|
+
id_value = @connection.next_sequence_value(@connection.default_sequence_name("fk_test_has_fk", "id"))
|
403
|
+
@connection.execute "INSERT INTO fk_test_has_fk (id,fk_id) VALUES (#{id_value},#{fk_id})"
|
404
|
+
else
|
405
|
+
@connection.execute "INSERT INTO fk_test_has_fk (fk_id) VALUES (#{fk_id})"
|
406
|
+
end
|
407
|
+
end
|
313
408
|
end
|
314
409
|
|
315
410
|
class AdapterTestWithoutTransaction < ActiveRecord::TestCase
|
316
411
|
self.use_transactional_tests = false
|
317
412
|
|
318
|
-
|
319
|
-
end
|
413
|
+
fixtures :posts, :authors, :author_addresses
|
320
414
|
|
321
415
|
def setup
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
416
|
+
@connection = ActiveRecord::Base.connection
|
417
|
+
end
|
418
|
+
|
419
|
+
unless in_memory_db?
|
420
|
+
test "reconnect after a disconnect" do
|
421
|
+
assert_predicate @connection, :active?
|
422
|
+
@connection.disconnect!
|
423
|
+
assert_not_predicate @connection, :active?
|
424
|
+
@connection.reconnect!
|
425
|
+
assert_predicate @connection, :active?
|
426
|
+
end
|
427
|
+
|
428
|
+
test "transaction state is reset after a reconnect" do
|
429
|
+
@connection.begin_transaction
|
430
|
+
assert_predicate @connection, :transaction_open?
|
431
|
+
@connection.reconnect!
|
432
|
+
assert_not_predicate @connection, :transaction_open?
|
433
|
+
end
|
434
|
+
|
435
|
+
test "transaction state is reset after a disconnect" do
|
436
|
+
@connection.begin_transaction
|
437
|
+
assert_predicate @connection, :transaction_open?
|
438
|
+
@connection.disconnect!
|
439
|
+
assert_not_predicate @connection, :transaction_open?
|
440
|
+
ensure
|
441
|
+
@connection.reconnect!
|
442
|
+
end
|
443
|
+
end
|
444
|
+
|
445
|
+
def test_create_with_query_cache
|
446
|
+
@connection.enable_query_cache!
|
447
|
+
|
448
|
+
count = Post.count
|
449
|
+
|
450
|
+
@connection.create("INSERT INTO posts(title, body) VALUES ('', '')")
|
451
|
+
|
452
|
+
assert_equal count + 1, Post.count
|
453
|
+
ensure
|
454
|
+
reset_fixtures("posts")
|
455
|
+
@connection.disable_query_cache!
|
456
|
+
end
|
457
|
+
|
458
|
+
def test_truncate
|
459
|
+
assert_operator Post.count, :>, 0
|
460
|
+
|
461
|
+
@connection.truncate("posts")
|
462
|
+
|
463
|
+
assert_equal 0, Post.count
|
464
|
+
ensure
|
465
|
+
reset_fixtures("posts")
|
466
|
+
end
|
467
|
+
|
468
|
+
def test_truncate_with_query_cache
|
469
|
+
@connection.enable_query_cache!
|
470
|
+
|
471
|
+
assert_operator Post.count, :>, 0
|
472
|
+
|
473
|
+
@connection.truncate("posts")
|
474
|
+
|
475
|
+
assert_equal 0, Post.count
|
476
|
+
ensure
|
477
|
+
reset_fixtures("posts")
|
478
|
+
@connection.disable_query_cache!
|
479
|
+
end
|
480
|
+
|
481
|
+
def test_truncate_tables
|
482
|
+
assert_operator Post.count, :>, 0
|
483
|
+
assert_operator Author.count, :>, 0
|
484
|
+
assert_operator AuthorAddress.count, :>, 0
|
485
|
+
|
486
|
+
@connection.truncate_tables("author_addresses", "authors", "posts")
|
487
|
+
|
488
|
+
assert_equal 0, Post.count
|
489
|
+
assert_equal 0, Author.count
|
490
|
+
assert_equal 0, AuthorAddress.count
|
491
|
+
ensure
|
492
|
+
reset_fixtures("posts", "authors", "author_addresses")
|
493
|
+
end
|
494
|
+
|
495
|
+
def test_truncate_tables_with_query_cache
|
496
|
+
@connection.enable_query_cache!
|
497
|
+
|
498
|
+
assert_operator Post.count, :>, 0
|
499
|
+
assert_operator Author.count, :>, 0
|
500
|
+
assert_operator AuthorAddress.count, :>, 0
|
501
|
+
|
502
|
+
@connection.truncate_tables("author_addresses", "authors", "posts")
|
503
|
+
|
504
|
+
assert_equal 0, Post.count
|
505
|
+
assert_equal 0, Author.count
|
506
|
+
assert_equal 0, AuthorAddress.count
|
507
|
+
ensure
|
508
|
+
reset_fixtures("posts", "authors", "author_addresses")
|
509
|
+
@connection.disable_query_cache!
|
510
|
+
end
|
511
|
+
|
512
|
+
# test resetting sequences in odd tables in PostgreSQL
|
513
|
+
if ActiveRecord::Base.connection.respond_to?(:reset_pk_sequence!)
|
514
|
+
require "models/movie"
|
515
|
+
require "models/subscriber"
|
516
|
+
|
517
|
+
def test_reset_empty_table_with_custom_pk
|
518
|
+
Movie.delete_all
|
519
|
+
Movie.connection.reset_pk_sequence! "movies"
|
520
|
+
assert_equal 1, Movie.create(name: "fight club").id
|
521
|
+
end
|
522
|
+
|
523
|
+
def test_reset_table_with_non_integer_pk
|
524
|
+
Subscriber.delete_all
|
525
|
+
Subscriber.connection.reset_pk_sequence! "subscribers"
|
526
|
+
sub = Subscriber.new(name: "robert drake")
|
527
|
+
sub.id = "bob drake"
|
528
|
+
assert_nothing_raised { sub.save! }
|
529
|
+
end
|
530
|
+
end
|
531
|
+
|
532
|
+
private
|
533
|
+
def reset_fixtures(*fixture_names)
|
534
|
+
ActiveRecord::FixtureSet.reset_cache
|
535
|
+
|
536
|
+
fixture_names.each do |fixture_name|
|
537
|
+
ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT, fixture_name)
|
538
|
+
end
|
539
|
+
end
|
540
|
+
end
|
541
|
+
end
|
542
|
+
|
543
|
+
if ActiveRecord::Base.connection.supports_advisory_locks?
|
544
|
+
class AdvisoryLocksEnabledTest < ActiveRecord::TestCase
|
545
|
+
include ConnectionHelper
|
546
|
+
|
547
|
+
def test_advisory_locks_enabled?
|
548
|
+
assert ActiveRecord::Base.connection.advisory_locks_enabled?
|
549
|
+
|
550
|
+
run_without_connection do |orig_connection|
|
551
|
+
ActiveRecord::Base.establish_connection(
|
552
|
+
orig_connection.merge(advisory_locks: false)
|
553
|
+
)
|
554
|
+
|
555
|
+
assert_not ActiveRecord::Base.connection.advisory_locks_enabled?
|
556
|
+
|
557
|
+
ActiveRecord::Base.establish_connection(
|
558
|
+
orig_connection.merge(advisory_locks: true)
|
559
|
+
)
|
560
|
+
|
561
|
+
assert ActiveRecord::Base.connection.advisory_locks_enabled?
|
562
|
+
end
|
563
|
+
end
|
348
564
|
end
|
349
|
-
|
350
|
-
|
351
565
|
end
|