ibm_db 3.0.5-x86-mingw32 → 5.0.5-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 +5 -5
- data/CHANGES +4 -0
- data/LICENSE +1 -1
- data/ParameterizedQueries README +6 -6
- data/README +38 -55
- data/ext/Makefile +269 -0
- data/ext/extconf.rb +34 -3
- data/ext/gil_release_version +3 -0
- data/ext/ibm_db-i386-mingw32.def +2 -0
- data/ext/ibm_db.c +100 -108
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +110 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/ext/unicode_support_version +3 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +923 -527
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +4 -1
- data/lib/mswin32/ibm_db.rb +7 -39
- data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +8 -5
- data/test/cases/adapter_test.rb +133 -58
- data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
- data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
- data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
- data/test/cases/adapters/mysql2/connection_test.rb +210 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
- data/test/cases/adapters/mysql2/enum_test.rb +26 -0
- data/test/cases/adapters/mysql2/explain_test.rb +21 -0
- data/test/cases/adapters/mysql2/json_test.rb +195 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
- data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
- data/test/cases/adapters/mysql2/schema_test.rb +126 -0
- data/test/cases/adapters/mysql2/sp_test.rb +36 -0
- data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
- data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
- data/test/cases/adapters/postgresql/array_test.rb +339 -0
- data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
- data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
- data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
- data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
- data/test/cases/adapters/postgresql/citext_test.rb +78 -0
- data/test/cases/adapters/postgresql/collation_test.rb +53 -0
- data/test/cases/adapters/postgresql/composite_test.rb +132 -0
- data/test/cases/adapters/postgresql/connection_test.rb +257 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
- data/test/cases/adapters/postgresql/domain_test.rb +47 -0
- data/test/cases/adapters/postgresql/enum_test.rb +91 -0
- data/test/cases/adapters/postgresql/explain_test.rb +20 -0
- data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
- data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
- data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
- data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
- data/test/cases/adapters/postgresql/integer_test.rb +25 -0
- data/test/cases/adapters/postgresql/json_test.rb +237 -0
- data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
- data/test/cases/adapters/postgresql/money_test.rb +96 -0
- data/test/cases/adapters/postgresql/network_test.rb +94 -0
- data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
- data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
- data/test/cases/adapters/postgresql/range_test.rb +343 -0
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
- data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
- data/test/cases/adapters/postgresql/schema_test.rb +597 -0
- data/test/cases/adapters/postgresql/serial_test.rb +154 -0
- data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
- data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
- data/test/cases/adapters/postgresql/utils_test.rb +62 -0
- data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
- data/test/cases/adapters/postgresql/xml_test.rb +54 -0
- data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
- data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
- data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
- data/test/cases/aggregations_test.rb +11 -1
- data/test/cases/ar_schema_test.rb +35 -50
- data/test/cases/associations/association_scope_test.rb +1 -6
- data/test/cases/associations/belongs_to_associations_test.rb +122 -10
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
- data/test/cases/associations/callbacks_test.rb +5 -7
- data/test/cases/associations/cascaded_eager_loading_test.rb +1 -1
- data/test/cases/associations/eager_load_nested_include_test.rb +1 -3
- data/test/cases/associations/eager_test.rb +158 -73
- data/test/cases/associations/extension_test.rb +7 -2
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +64 -32
- data/test/cases/associations/has_many_associations_test.rb +362 -43
- data/test/cases/associations/has_many_through_associations_test.rb +108 -41
- data/test/cases/associations/has_one_associations_test.rb +105 -8
- data/test/cases/associations/has_one_through_associations_test.rb +6 -3
- data/test/cases/associations/inner_join_association_test.rb +3 -3
- data/test/cases/associations/inverse_associations_test.rb +38 -11
- data/test/cases/associations/join_model_test.rb +59 -36
- data/test/cases/associations/left_outer_join_association_test.rb +88 -0
- data/test/cases/associations/nested_through_associations_test.rb +2 -2
- data/test/cases/associations/required_test.rb +25 -5
- data/test/cases/associations_test.rb +39 -34
- data/test/cases/attribute_decorators_test.rb +9 -8
- data/test/cases/attribute_methods/read_test.rb +5 -5
- data/test/cases/attribute_methods_test.rb +97 -40
- data/test/cases/attribute_set_test.rb +64 -4
- data/test/cases/attribute_test.rb +84 -18
- data/test/cases/attributes_test.rb +151 -34
- data/test/cases/autosave_association_test.rb +149 -36
- data/test/cases/base_test.rb +290 -241
- data/test/cases/batches_test.rb +299 -22
- data/test/cases/binary_test.rb +2 -10
- data/test/cases/bind_parameter_test.rb +76 -66
- data/test/cases/cache_key_test.rb +26 -0
- data/test/cases/calculations_test.rb +167 -15
- data/test/cases/callbacks_test.rb +161 -68
- data/test/cases/coders/json_test.rb +15 -0
- data/test/cases/collection_cache_key_test.rb +115 -0
- data/test/cases/column_definition_test.rb +26 -57
- data/test/cases/comment_test.rb +145 -0
- data/test/cases/connection_adapters/adapter_leasing_test.rb +5 -3
- data/test/cases/connection_adapters/connection_handler_test.rb +128 -21
- data/test/cases/connection_adapters/connection_specification_test.rb +1 -1
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +0 -38
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -1
- data/test/cases/connection_adapters/schema_cache_test.rb +8 -3
- data/test/cases/connection_adapters/type_lookup_test.rb +15 -7
- data/test/cases/connection_management_test.rb +46 -56
- data/test/cases/connection_pool_test.rb +195 -20
- data/test/cases/connection_specification/resolver_test.rb +15 -0
- data/test/cases/counter_cache_test.rb +10 -5
- data/test/cases/custom_locking_test.rb +1 -1
- data/test/cases/database_statements_test.rb +18 -3
- data/test/cases/{invalid_date_test.rb → date_test.rb} +13 -1
- data/test/cases/date_time_precision_test.rb +107 -0
- data/test/cases/defaults_test.rb +85 -89
- data/test/cases/dirty_test.rb +30 -52
- data/test/cases/disconnected_test.rb +4 -2
- data/test/cases/enum_test.rb +178 -24
- data/test/cases/errors_test.rb +16 -0
- data/test/cases/explain_test.rb +32 -21
- data/test/cases/finder_test.rb +273 -148
- data/test/cases/fixture_set/file_test.rb +18 -0
- data/test/cases/fixtures_test.rb +112 -32
- data/test/cases/forbidden_attributes_protection_test.rb +69 -3
- data/test/cases/helper.rb +10 -16
- data/test/cases/hot_compatibility_test.rb +89 -1
- data/test/cases/inheritance_test.rb +284 -53
- data/test/cases/integration_test.rb +23 -7
- data/test/cases/invalid_connection_test.rb +4 -2
- data/test/cases/invertible_migration_test.rb +124 -32
- data/test/cases/json_serialization_test.rb +11 -2
- data/test/cases/locking_test.rb +22 -6
- data/test/cases/log_subscriber_test.rb +106 -17
- data/test/cases/migration/change_schema_test.rb +60 -114
- data/test/cases/migration/change_table_test.rb +34 -2
- data/test/cases/migration/column_attributes_test.rb +7 -23
- data/test/cases/migration/column_positioning_test.rb +8 -8
- data/test/cases/migration/columns_test.rb +17 -11
- data/test/cases/migration/command_recorder_test.rb +47 -2
- data/test/cases/migration/compatibility_test.rb +118 -0
- data/test/cases/migration/create_join_table_test.rb +21 -12
- data/test/cases/migration/foreign_key_test.rb +52 -18
- data/test/cases/migration/index_test.rb +14 -12
- data/test/cases/migration/logger_test.rb +1 -1
- data/test/cases/migration/pending_migrations_test.rb +0 -1
- data/test/cases/migration/references_foreign_key_test.rb +59 -7
- data/test/cases/migration/references_index_test.rb +4 -4
- data/test/cases/migration/references_statements_test.rb +26 -6
- data/test/cases/migration/rename_table_test.rb +25 -25
- data/test/cases/migration_test.rb +279 -81
- data/test/cases/migrator_test.rb +91 -8
- data/test/cases/mixin_test.rb +0 -2
- data/test/cases/modules_test.rb +3 -4
- data/test/cases/multiparameter_attributes_test.rb +24 -2
- data/test/cases/multiple_db_test.rb +11 -4
- data/test/cases/nested_attributes_test.rb +61 -33
- data/test/cases/persistence_test.rb +102 -10
- data/test/cases/pooled_connections_test.rb +3 -3
- data/test/cases/primary_keys_test.rb +170 -31
- data/test/cases/query_cache_test.rb +216 -96
- data/test/cases/quoting_test.rb +65 -19
- data/test/cases/readonly_test.rb +2 -1
- data/test/cases/reflection_test.rb +68 -22
- data/test/cases/relation/delegation_test.rb +3 -8
- data/test/cases/relation/merging_test.rb +10 -14
- data/test/cases/relation/mutation_test.rb +42 -24
- data/test/cases/relation/or_test.rb +92 -0
- data/test/cases/relation/predicate_builder_test.rb +4 -2
- data/test/cases/relation/record_fetch_warning_test.rb +40 -0
- data/test/cases/relation/where_chain_test.rb +23 -99
- data/test/cases/relation/where_clause_test.rb +182 -0
- data/test/cases/relation/where_test.rb +45 -23
- data/test/cases/relation_test.rb +67 -58
- data/test/cases/relations_test.rb +249 -38
- data/test/cases/result_test.rb +10 -0
- data/test/cases/sanitize_test.rb +108 -15
- data/test/cases/schema_dumper_test.rb +119 -125
- data/test/cases/schema_loading_test.rb +52 -0
- data/test/cases/scoping/default_scoping_test.rb +113 -39
- data/test/cases/scoping/named_scoping_test.rb +46 -9
- data/test/cases/scoping/relation_scoping_test.rb +47 -4
- data/test/cases/secure_token_test.rb +32 -0
- data/test/cases/serialization_test.rb +1 -1
- data/test/cases/serialized_attribute_test.rb +93 -6
- data/test/cases/statement_cache_test.rb +38 -0
- data/test/cases/store_test.rb +2 -1
- data/test/cases/suppressor_test.rb +63 -0
- data/test/cases/tasks/database_tasks_test.rb +73 -9
- data/test/cases/tasks/mysql_rake_test.rb +139 -118
- data/test/cases/tasks/postgresql_rake_test.rb +60 -6
- data/test/cases/tasks/sqlite_rake_test.rb +30 -3
- data/test/cases/test_case.rb +28 -20
- data/test/cases/test_fixtures_test.rb +36 -0
- data/test/cases/time_precision_test.rb +103 -0
- data/test/cases/timestamp_test.rb +44 -10
- data/test/cases/touch_later_test.rb +121 -0
- data/test/cases/transaction_callbacks_test.rb +128 -62
- data/test/cases/transaction_isolation_test.rb +2 -2
- data/test/cases/transactions_test.rb +61 -43
- data/test/cases/type/adapter_specific_registry_test.rb +133 -0
- data/test/cases/type/date_time_test.rb +14 -0
- data/test/cases/type/integer_test.rb +2 -96
- data/test/cases/type/string_test.rb +0 -14
- data/test/cases/type_test.rb +39 -0
- data/test/cases/types_test.rb +1 -118
- data/test/cases/unconnected_test.rb +1 -1
- data/test/cases/validations/absence_validation_test.rb +73 -0
- data/test/cases/validations/association_validation_test.rb +13 -2
- data/test/cases/validations/i18n_validation_test.rb +6 -10
- data/test/cases/validations/length_validation_test.rb +62 -30
- data/test/cases/validations/presence_validation_test.rb +36 -1
- data/test/cases/validations/uniqueness_validation_test.rb +128 -37
- data/test/cases/validations_repair_helper.rb +2 -6
- data/test/cases/validations_test.rb +36 -7
- data/test/cases/view_test.rb +102 -5
- data/test/cases/yaml_serialization_test.rb +21 -26
- data/test/config.example.yml +97 -0
- data/test/fixtures/bad_posts.yml +9 -0
- data/test/fixtures/books.yml +20 -0
- data/test/fixtures/content.yml +3 -0
- data/test/fixtures/content_positions.yml +3 -0
- data/test/fixtures/dead_parrots.yml +5 -0
- data/test/fixtures/live_parrots.yml +4 -0
- data/test/fixtures/naked/yml/parrots.yml +2 -0
- data/test/fixtures/naked/yml/trees.yml +3 -0
- data/test/fixtures/nodes.yml +29 -0
- data/test/fixtures/other_comments.yml +6 -0
- data/test/fixtures/other_dogs.yml +2 -0
- data/test/fixtures/other_posts.yml +7 -0
- data/test/fixtures/price_estimates.yml +10 -1
- data/test/fixtures/trees.yml +3 -0
- data/test/migrations/10_urban/9_add_expressions.rb +1 -1
- data/test/migrations/decimal/1_give_me_big_numbers.rb +1 -1
- data/test/migrations/magic/1_currencies_have_symbols.rb +1 -1
- data/test/migrations/missing/1000_people_have_middle_names.rb +2 -2
- data/test/migrations/missing/1_people_have_last_names.rb +2 -2
- data/test/migrations/missing/3_we_need_reminders.rb +2 -2
- data/test/migrations/missing/4_innocent_jointable.rb +2 -2
- data/test/migrations/rename/1_we_need_things.rb +2 -2
- data/test/migrations/rename/2_rename_things.rb +2 -2
- data/test/migrations/to_copy/1_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy/2_people_have_descriptions.rb +1 -1
- data/test/migrations/to_copy2/1_create_articles.rb +1 -1
- data/test/migrations/to_copy2/2_create_comments.rb +1 -1
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +1 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +1 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +1 -1
- data/test/migrations/valid/1_valid_people_have_last_names.rb +1 -1
- data/test/migrations/valid/2_we_need_reminders.rb +2 -2
- data/test/migrations/valid/3_innocent_jointable.rb +2 -2
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +1 -1
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -2
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +2 -2
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +1 -1
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +1 -1
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +1 -1
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +1 -1
- data/test/models/admin/randomly_named_c1.rb +6 -2
- data/test/models/aircraft.rb +1 -0
- data/test/models/author.rb +4 -7
- data/test/models/bird.rb +1 -1
- data/test/models/book.rb +5 -0
- data/test/models/bulb.rb +2 -1
- data/test/models/car.rb +3 -0
- data/test/models/cat.rb +10 -0
- data/test/models/chef.rb +1 -0
- data/test/models/club.rb +2 -0
- data/test/models/comment.rb +17 -5
- data/test/models/company.rb +4 -2
- data/test/models/company_in_module.rb +1 -1
- data/test/models/contact.rb +1 -1
- data/test/models/content.rb +40 -0
- data/test/models/customer.rb +8 -2
- data/test/models/developer.rb +19 -0
- data/test/models/face.rb +1 -1
- data/test/models/guitar.rb +4 -0
- data/test/models/hotel.rb +2 -0
- data/test/models/member.rb +1 -0
- data/test/models/member_detail.rb +4 -3
- data/test/models/mentor.rb +3 -0
- data/test/models/mocktail_designer.rb +2 -0
- data/test/models/node.rb +5 -0
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +3 -0
- data/test/models/other_dog.rb +5 -0
- data/test/models/owner.rb +4 -1
- data/test/models/parrot.rb +6 -7
- data/test/models/person.rb +0 -1
- data/test/models/pet.rb +3 -0
- data/test/models/pet_treasure.rb +6 -0
- data/test/models/pirate.rb +3 -3
- data/test/models/post.rb +18 -9
- data/test/models/project.rb +9 -0
- data/test/models/randomly_named_c1.rb +1 -1
- data/test/models/recipe.rb +3 -0
- data/test/models/ship.rb +8 -2
- data/test/models/tag.rb +6 -0
- data/test/models/topic.rb +2 -8
- data/test/models/tree.rb +3 -0
- data/test/models/tuning_peg.rb +4 -0
- data/test/models/user.rb +14 -0
- data/test/models/uuid_item.rb +6 -0
- data/test/schema/mysql2_specific_schema.rb +33 -23
- data/test/schema/oracle_specific_schema.rb +1 -4
- data/test/schema/postgresql_specific_schema.rb +36 -124
- data/test/schema/schema.rb +170 -65
- data/test/schema/schema.rb.original +1057 -0
- data/test/schema/sqlite_specific_schema.rb +1 -5
- data/test/support/connection.rb +1 -0
- data/test/support/schema_dumping_helper.rb +1 -1
- data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
- data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
- metadata +146 -30
- data/lib/mswin32/rb19x/ibm_db.so +0 -0
- data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
- data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
- data/test/cases/attribute_methods/serialization_test.rb +0 -29
- data/test/cases/migration/change_schema_test - Copy.rb +0 -448
- data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
- data/test/cases/migration/table_and_index_test.rb +0 -24
- data/test/cases/relation/where_test2.rb +0 -36
- data/test/cases/type/decimal_test.rb +0 -56
- data/test/cases/type/unsigned_integer_test.rb +0 -18
- data/test/cases/xml_serialization_test.rb +0 -457
- data/test/fixtures/naked/csv/accounts.csv +0 -1
- data/test/schema/mysql_specific_schema.rb +0 -70
@@ -0,0 +1,59 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
class SchemaMigrationsTest < ActiveRecord::Mysql2TestCase
|
4
|
+
def test_renaming_index_on_foreign_key
|
5
|
+
connection.add_index "engines", "car_id"
|
6
|
+
connection.add_foreign_key :engines, :cars, name: "fk_engines_cars"
|
7
|
+
|
8
|
+
connection.rename_index("engines", "index_engines_on_car_id", "idx_renamed")
|
9
|
+
assert_equal ["idx_renamed"], connection.indexes("engines").map(&:name)
|
10
|
+
ensure
|
11
|
+
connection.remove_foreign_key :engines, name: "fk_engines_cars"
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_initializes_schema_migrations_for_encoding_utf8mb4
|
15
|
+
with_encoding_utf8mb4 do
|
16
|
+
table_name = ActiveRecord::SchemaMigration.table_name
|
17
|
+
connection.drop_table table_name, if_exists: true
|
18
|
+
|
19
|
+
connection.initialize_schema_migrations_table
|
20
|
+
|
21
|
+
assert connection.column_exists?(table_name, :version, :string, collation: 'utf8_general_ci')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_initializes_internal_metadata_for_encoding_utf8mb4
|
26
|
+
with_encoding_utf8mb4 do
|
27
|
+
table_name = ActiveRecord::InternalMetadata.table_name
|
28
|
+
connection.drop_table table_name, if_exists: true
|
29
|
+
|
30
|
+
connection.initialize_internal_metadata_table
|
31
|
+
|
32
|
+
assert connection.column_exists?(table_name, :key, :string, collation: 'utf8_general_ci')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def with_encoding_utf8mb4
|
39
|
+
database_name = connection.current_database
|
40
|
+
database_info = connection.select_one("SELECT * FROM information_schema.schemata WHERE schema_name = '#{database_name}'")
|
41
|
+
|
42
|
+
original_charset = database_info["DEFAULT_CHARACTER_SET_NAME"]
|
43
|
+
original_collation = database_info["DEFAULT_COLLATION_NAME"]
|
44
|
+
|
45
|
+
execute("ALTER DATABASE #{database_name} DEFAULT CHARACTER SET utf8mb4")
|
46
|
+
|
47
|
+
yield
|
48
|
+
ensure
|
49
|
+
execute("ALTER DATABASE #{database_name} DEFAULT CHARACTER SET #{original_charset} COLLATE #{original_collation}")
|
50
|
+
end
|
51
|
+
|
52
|
+
def connection
|
53
|
+
@connection ||= ActiveRecord::Base.connection
|
54
|
+
end
|
55
|
+
|
56
|
+
def execute(sql)
|
57
|
+
connection.execute(sql)
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/post'
|
3
|
+
require 'models/comment'
|
4
|
+
|
5
|
+
module ActiveRecord
|
6
|
+
module ConnectionAdapters
|
7
|
+
class Mysql2SchemaTest < ActiveRecord::Mysql2TestCase
|
8
|
+
fixtures :posts
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@connection = ActiveRecord::Base.connection
|
12
|
+
db = Post.connection_pool.spec.config[:database]
|
13
|
+
table = Post.table_name
|
14
|
+
@db_name = db
|
15
|
+
|
16
|
+
@omgpost = Class.new(ActiveRecord::Base) do
|
17
|
+
self.inheritance_column = :disabled
|
18
|
+
self.table_name = "#{db}.#{table}"
|
19
|
+
def self.name; 'Post'; end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_float_limits
|
24
|
+
@connection.create_table :mysql_doubles do |t|
|
25
|
+
t.float :float_no_limit
|
26
|
+
t.float :float_short, limit: 5
|
27
|
+
t.float :float_long, limit: 53
|
28
|
+
|
29
|
+
t.float :float_23, limit: 23
|
30
|
+
t.float :float_24, limit: 24
|
31
|
+
t.float :float_25, limit: 25
|
32
|
+
end
|
33
|
+
|
34
|
+
column_no_limit = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_no_limit' }
|
35
|
+
column_short = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_short' }
|
36
|
+
column_long = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_long' }
|
37
|
+
|
38
|
+
column_23 = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_23' }
|
39
|
+
column_24 = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_24' }
|
40
|
+
column_25 = @connection.columns(:mysql_doubles).find { |c| c.name == 'float_25' }
|
41
|
+
|
42
|
+
# Mysql floats are precision 0..24, Mysql doubles are precision 25..53
|
43
|
+
assert_equal 24, column_no_limit.limit
|
44
|
+
assert_equal 24, column_short.limit
|
45
|
+
assert_equal 53, column_long.limit
|
46
|
+
|
47
|
+
assert_equal 24, column_23.limit
|
48
|
+
assert_equal 24, column_24.limit
|
49
|
+
assert_equal 53, column_25.limit
|
50
|
+
ensure
|
51
|
+
@connection.drop_table "mysql_doubles", if_exists: true
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_schema
|
55
|
+
assert @omgpost.first
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_primary_key
|
59
|
+
assert_equal 'id', @omgpost.primary_key
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_data_source_exists?
|
63
|
+
name = @omgpost.table_name
|
64
|
+
assert @connection.data_source_exists?(name), "#{name} data_source should exist"
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_data_source_exists_wrong_schema
|
68
|
+
assert(!@connection.data_source_exists?("#{@db_name}.zomg"), "data_source should not exist")
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_dump_indexes
|
72
|
+
index_a_name = 'index_key_tests_on_snack'
|
73
|
+
index_b_name = 'index_key_tests_on_pizza'
|
74
|
+
index_c_name = 'index_key_tests_on_awesome'
|
75
|
+
|
76
|
+
table = 'key_tests'
|
77
|
+
|
78
|
+
indexes = @connection.indexes(table).sort_by(&:name)
|
79
|
+
assert_equal 3,indexes.size
|
80
|
+
|
81
|
+
index_a = indexes.select{|i| i.name == index_a_name}[0]
|
82
|
+
index_b = indexes.select{|i| i.name == index_b_name}[0]
|
83
|
+
index_c = indexes.select{|i| i.name == index_c_name}[0]
|
84
|
+
assert_equal :btree, index_a.using
|
85
|
+
assert_nil index_a.type
|
86
|
+
assert_equal :btree, index_b.using
|
87
|
+
assert_nil index_b.type
|
88
|
+
|
89
|
+
assert_nil index_c.using
|
90
|
+
assert_equal :fulltext, index_c.type
|
91
|
+
end
|
92
|
+
|
93
|
+
unless mysql_enforcing_gtid_consistency?
|
94
|
+
def test_drop_temporary_table
|
95
|
+
@connection.transaction do
|
96
|
+
@connection.create_table(:temp_table, temporary: true)
|
97
|
+
# if it doesn't properly say DROP TEMPORARY TABLE, the transaction commit
|
98
|
+
# will complain that no transaction is active
|
99
|
+
@connection.drop_table(:temp_table, temporary: true)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
class Mysql2AnsiQuotesTest < ActiveRecord::Mysql2TestCase
|
108
|
+
def setup
|
109
|
+
@connection = ActiveRecord::Base.connection
|
110
|
+
@connection.execute("SET SESSION sql_mode='ANSI_QUOTES'")
|
111
|
+
end
|
112
|
+
|
113
|
+
def teardown
|
114
|
+
@connection.reconnect!
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_primary_key_method_with_ansi_quotes
|
118
|
+
assert_equal "id", @connection.primary_key("topics")
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_foreign_keys_method_with_ansi_quotes
|
122
|
+
fks = @connection.foreign_keys("lessons_students")
|
123
|
+
assert_equal([["lessons_students", "students", :cascade]],
|
124
|
+
fks.map {|fk| [fk.from_table, fk.to_table, fk.on_delete] })
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/topic'
|
3
|
+
require 'models/reply'
|
4
|
+
|
5
|
+
class Mysql2StoredProcedureTest < ActiveRecord::Mysql2TestCase
|
6
|
+
fixtures :topics
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@connection = ActiveRecord::Base.connection
|
10
|
+
unless ActiveRecord::Base.connection.version >= '5.6.0'
|
11
|
+
skip("no stored procedure support")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Test that MySQL allows multiple results for stored procedures
|
16
|
+
#
|
17
|
+
# In MySQL 5.6, CLIENT_MULTI_RESULTS is enabled by default.
|
18
|
+
# http://dev.mysql.com/doc/refman/5.6/en/call.html
|
19
|
+
def test_multi_results
|
20
|
+
rows = @connection.select_rows('CALL ten();')
|
21
|
+
assert_equal 10, rows[0][0].to_i, "ten() did not return 10 as expected: #{rows.inspect}"
|
22
|
+
assert @connection.active?, "Bad connection use by 'Mysql2Adapter.select_rows'"
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_multi_results_from_select_one
|
26
|
+
row = @connection.select_one('CALL topics(1);')
|
27
|
+
assert_equal 'David', row['author_name']
|
28
|
+
assert @connection.active?, "Bad connection use by 'Mysql2Adapter.select_one'"
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_multi_results_from_find_by_sql
|
32
|
+
topics = Topic.find_by_sql 'CALL topics(3);'
|
33
|
+
assert_equal 3, topics.size
|
34
|
+
assert @connection.active?, "Bad connection use by 'Mysql2Adapter.select'"
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
class Mysql2SqlTypesTest < ActiveRecord::Mysql2TestCase
|
4
|
+
def test_binary_types
|
5
|
+
assert_equal 'varbinary(64)', type_to_sql(:binary, 64)
|
6
|
+
assert_equal 'varbinary(4095)', type_to_sql(:binary, 4095)
|
7
|
+
assert_equal 'blob', type_to_sql(:binary, 4096)
|
8
|
+
assert_equal 'blob', type_to_sql(:binary)
|
9
|
+
end
|
10
|
+
|
11
|
+
def type_to_sql(*args)
|
12
|
+
ActiveRecord::Base.connection.type_to_sql(*args)
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'support/schema_dumping_helper'
|
3
|
+
|
4
|
+
class Mysql2TableOptionsTest < ActiveRecord::Mysql2TestCase
|
5
|
+
include SchemaDumpingHelper
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@connection = ActiveRecord::Base.connection
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
@connection.drop_table "mysql_table_options", if_exists: true
|
13
|
+
end
|
14
|
+
|
15
|
+
test "table options with ENGINE" do
|
16
|
+
@connection.create_table "mysql_table_options", force: true, options: "ENGINE=MyISAM"
|
17
|
+
output = dump_table_schema("mysql_table_options")
|
18
|
+
options = %r{create_table "mysql_table_options", force: :cascade, options: "(?<options>.*)"}.match(output)[:options]
|
19
|
+
assert_match %r{ENGINE=MyISAM}, options
|
20
|
+
end
|
21
|
+
|
22
|
+
test "table options with ROW_FORMAT" do
|
23
|
+
@connection.create_table "mysql_table_options", force: true, options: "ROW_FORMAT=REDUNDANT"
|
24
|
+
output = dump_table_schema("mysql_table_options")
|
25
|
+
options = %r{create_table "mysql_table_options", force: :cascade, options: "(?<options>.*)"}.match(output)[:options]
|
26
|
+
assert_match %r{ROW_FORMAT=REDUNDANT}, options
|
27
|
+
end
|
28
|
+
|
29
|
+
test "table options with CHARSET" do
|
30
|
+
@connection.create_table "mysql_table_options", force: true, options: "CHARSET=utf8mb4"
|
31
|
+
output = dump_table_schema("mysql_table_options")
|
32
|
+
options = %r{create_table "mysql_table_options", force: :cascade, options: "(?<options>.*)"}.match(output)[:options]
|
33
|
+
assert_match %r{CHARSET=utf8mb4}, options
|
34
|
+
end
|
35
|
+
|
36
|
+
test "table options with COLLATE" do
|
37
|
+
@connection.create_table "mysql_table_options", force: true, options: "COLLATE=utf8mb4_bin"
|
38
|
+
output = dump_table_schema("mysql_table_options")
|
39
|
+
options = %r{create_table "mysql_table_options", force: :cascade, options: "(?<options>.*)"}.match(output)[:options]
|
40
|
+
assert_match %r{COLLATE=utf8mb4_bin}, options
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require "support/schema_dumping_helper"
|
3
|
+
|
4
|
+
class Mysql2UnsignedTypeTest < ActiveRecord::Mysql2TestCase
|
5
|
+
include SchemaDumpingHelper
|
6
|
+
self.use_transactional_tests = false
|
7
|
+
|
8
|
+
class UnsignedType < ActiveRecord::Base
|
9
|
+
end
|
10
|
+
|
11
|
+
setup do
|
12
|
+
@connection = ActiveRecord::Base.connection
|
13
|
+
@connection.create_table("unsigned_types", force: true) do |t|
|
14
|
+
t.integer :unsigned_integer, unsigned: true
|
15
|
+
t.bigint :unsigned_bigint, unsigned: true
|
16
|
+
t.float :unsigned_float, unsigned: true
|
17
|
+
t.decimal :unsigned_decimal, unsigned: true, precision: 10, scale: 2
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
teardown do
|
22
|
+
@connection.drop_table "unsigned_types", if_exists: true
|
23
|
+
end
|
24
|
+
|
25
|
+
test "unsigned int max value is in range" do
|
26
|
+
assert expected = UnsignedType.create(unsigned_integer: 4294967295)
|
27
|
+
assert_equal expected, UnsignedType.find_by(unsigned_integer: 4294967295)
|
28
|
+
end
|
29
|
+
|
30
|
+
test "minus value is out of range" do
|
31
|
+
assert_raise(ActiveModel::RangeError) do
|
32
|
+
UnsignedType.create(unsigned_integer: -10)
|
33
|
+
end
|
34
|
+
assert_raise(ActiveModel::RangeError) do
|
35
|
+
UnsignedType.create(unsigned_bigint: -10)
|
36
|
+
end
|
37
|
+
assert_raise(ActiveRecord::StatementInvalid) do
|
38
|
+
UnsignedType.create(unsigned_float: -10.0)
|
39
|
+
end
|
40
|
+
assert_raise(ActiveRecord::StatementInvalid) do
|
41
|
+
UnsignedType.create(unsigned_decimal: -10.0)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
test "schema definition can use unsigned as the type" do
|
46
|
+
@connection.change_table("unsigned_types") do |t|
|
47
|
+
t.unsigned_integer :unsigned_integer_t
|
48
|
+
t.unsigned_bigint :unsigned_bigint_t
|
49
|
+
t.unsigned_float :unsigned_float_t
|
50
|
+
t.unsigned_decimal :unsigned_decimal_t, precision: 10, scale: 2
|
51
|
+
t.column :unsigned_zerofill, "int unsigned zerofill"
|
52
|
+
end
|
53
|
+
|
54
|
+
@connection.columns("unsigned_types").select { |c| /^unsigned_/ === c.name }.each do |column|
|
55
|
+
assert column.unsigned?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
test "schema dump includes unsigned option" do
|
60
|
+
schema = dump_table_schema "unsigned_types"
|
61
|
+
assert_match %r{t.integer\s+"unsigned_integer",\s+unsigned: true$}, schema
|
62
|
+
assert_match %r{t.bigint\s+"unsigned_bigint",\s+unsigned: true$}, schema
|
63
|
+
assert_match %r{t.float\s+"unsigned_float",\s+limit: 24,\s+unsigned: true$}, schema
|
64
|
+
assert_match %r{t.decimal\s+"unsigned_decimal",\s+precision: 10,\s+scale: 2,\s+unsigned: true$}, schema
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'cases/helper'
|
2
|
+
|
3
|
+
class PostgresqlActiveSchemaTest < ActiveRecord::PostgreSQLTestCase
|
4
|
+
def setup
|
5
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
6
|
+
def execute(sql, name = nil) sql end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
teardown do
|
11
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
12
|
+
remove_method :execute
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_create_database_with_encoding
|
17
|
+
assert_equal %(CREATE DATABASE "matt" ENCODING = 'utf8'), create_database(:matt)
|
18
|
+
assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, :encoding => :latin1)
|
19
|
+
assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, 'encoding' => :latin1)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_create_database_with_collation_and_ctype
|
23
|
+
assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'UTF8' LC_COLLATE = 'ja_JP.UTF8' LC_CTYPE = 'ja_JP.UTF8'), create_database(:aimonetti, :encoding => :"UTF8", :collation => :"ja_JP.UTF8", :ctype => :"ja_JP.UTF8")
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_add_index
|
27
|
+
# add_index calls index_name_exists? which can't work since execute is stubbed
|
28
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send(:define_method, :index_name_exists?) { |*| false }
|
29
|
+
|
30
|
+
expected = %(CREATE UNIQUE INDEX "index_people_on_last_name" ON "people" ("last_name") WHERE state = 'active')
|
31
|
+
assert_equal expected, add_index(:people, :last_name, unique: true, where: "state = 'active'")
|
32
|
+
|
33
|
+
expected = %(CREATE UNIQUE INDEX "index_people_on_lower_last_name" ON "people" (lower(last_name)))
|
34
|
+
assert_equal expected, add_index(:people, 'lower(last_name)', unique: true)
|
35
|
+
|
36
|
+
expected = %(CREATE UNIQUE INDEX "index_people_on_last_name_varchar_pattern_ops" ON "people" (last_name varchar_pattern_ops))
|
37
|
+
assert_equal expected, add_index(:people, 'last_name varchar_pattern_ops', unique: true)
|
38
|
+
|
39
|
+
expected = %(CREATE INDEX CONCURRENTLY "index_people_on_last_name" ON "people" ("last_name"))
|
40
|
+
assert_equal expected, add_index(:people, :last_name, algorithm: :concurrently)
|
41
|
+
|
42
|
+
expected = %(CREATE INDEX "index_people_on_last_name_and_first_name" ON "people" ("last_name" DESC, "first_name" ASC))
|
43
|
+
assert_equal expected, add_index(:people, [:last_name, :first_name], order: { last_name: :desc, first_name: :asc })
|
44
|
+
assert_equal expected, add_index(:people, ["last_name", :first_name], order: { last_name: :desc, "first_name" => :asc })
|
45
|
+
|
46
|
+
%w(gin gist hash btree).each do |type|
|
47
|
+
expected = %(CREATE INDEX "index_people_on_last_name" ON "people" USING #{type} ("last_name"))
|
48
|
+
assert_equal expected, add_index(:people, :last_name, using: type)
|
49
|
+
|
50
|
+
expected = %(CREATE INDEX CONCURRENTLY "index_people_on_last_name" ON "people" USING #{type} ("last_name"))
|
51
|
+
assert_equal expected, add_index(:people, :last_name, using: type, algorithm: :concurrently)
|
52
|
+
|
53
|
+
expected = %(CREATE UNIQUE INDEX "index_people_on_last_name" ON "people" USING #{type} ("last_name") WHERE state = 'active')
|
54
|
+
assert_equal expected, add_index(:people, :last_name, using: type, unique: true, where: "state = 'active'")
|
55
|
+
|
56
|
+
expected = %(CREATE UNIQUE INDEX "index_people_on_lower_last_name" ON "people" USING #{type} (lower(last_name)))
|
57
|
+
assert_equal expected, add_index(:people, 'lower(last_name)', using: type, unique: true)
|
58
|
+
end
|
59
|
+
|
60
|
+
assert_raise ArgumentError do
|
61
|
+
add_index(:people, :last_name, algorithm: :copy)
|
62
|
+
end
|
63
|
+
|
64
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send :remove_method, :index_name_exists?
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_remove_index
|
68
|
+
# remove_index calls index_name_for_remove which can't work since execute is stubbed
|
69
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send(:define_method, :index_name_for_remove) do |*|
|
70
|
+
'index_people_on_last_name'
|
71
|
+
end
|
72
|
+
|
73
|
+
expected = %(DROP INDEX CONCURRENTLY "index_people_on_last_name")
|
74
|
+
assert_equal expected, remove_index(:people, name: "index_people_on_last_name", algorithm: :concurrently)
|
75
|
+
|
76
|
+
assert_raise ArgumentError do
|
77
|
+
add_index(:people, :last_name, algorithm: :copy)
|
78
|
+
end
|
79
|
+
|
80
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send :remove_method, :index_name_for_remove
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_remove_index_when_name_is_specified
|
84
|
+
expected = %(DROP INDEX CONCURRENTLY "index_people_on_last_name")
|
85
|
+
assert_equal expected, remove_index(:people, name: "index_people_on_last_name", algorithm: :concurrently)
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_remove_index_with_wrong_option
|
89
|
+
assert_raises ArgumentError do
|
90
|
+
remove_index(:people, coulmn: :last_name)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
def method_missing(method_symbol, *arguments)
|
96
|
+
ActiveRecord::Base.connection.send(method_symbol, *arguments)
|
97
|
+
end
|
98
|
+
end
|