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,45 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
class Mysql2DatetimePrecisionQuotingTest < ActiveRecord::Mysql2TestCase
|
4
|
+
setup do
|
5
|
+
@connection = ActiveRecord::Base.connection
|
6
|
+
end
|
7
|
+
|
8
|
+
test 'microsecond precision for MySQL gte 5.6.4' do
|
9
|
+
stub_version '5.6.4'
|
10
|
+
assert_microsecond_precision
|
11
|
+
end
|
12
|
+
|
13
|
+
test 'no microsecond precision for MySQL lt 5.6.4' do
|
14
|
+
stub_version '5.6.3'
|
15
|
+
assert_no_microsecond_precision
|
16
|
+
end
|
17
|
+
|
18
|
+
test 'microsecond precision for MariaDB gte 5.3.0' do
|
19
|
+
stub_version '5.5.5-10.1.8-MariaDB-log'
|
20
|
+
assert_microsecond_precision
|
21
|
+
end
|
22
|
+
|
23
|
+
test 'no microsecond precision for MariaDB lt 5.3.0' do
|
24
|
+
stub_version '5.2.9-MariaDB'
|
25
|
+
assert_no_microsecond_precision
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def assert_microsecond_precision
|
30
|
+
assert_match_quoted_microsecond_datetime(/\.000001\z/)
|
31
|
+
end
|
32
|
+
|
33
|
+
def assert_no_microsecond_precision
|
34
|
+
assert_match_quoted_microsecond_datetime(/\d\z/)
|
35
|
+
end
|
36
|
+
|
37
|
+
def assert_match_quoted_microsecond_datetime(match)
|
38
|
+
assert_match match, @connection.quoted_date(Time.now.change(usec: 1))
|
39
|
+
end
|
40
|
+
|
41
|
+
def stub_version(full_version_string)
|
42
|
+
@connection.stubs(:full_version).returns(full_version_string)
|
43
|
+
@connection.remove_instance_variable(:@version) if @connection.instance_variable_defined?(:@version)
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
class Mysql2EnumTest < ActiveRecord::Mysql2TestCase
|
4
|
+
class EnumTest < ActiveRecord::Base
|
5
|
+
end
|
6
|
+
|
7
|
+
def test_enum_limit
|
8
|
+
column = EnumTest.columns_hash['enum_column']
|
9
|
+
assert_equal 8, column.limit
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_should_not_be_blob_or_text_column
|
13
|
+
column = EnumTest.columns_hash['enum_column']
|
14
|
+
assert_not column.blob_or_text_column?
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_should_not_be_unsigned
|
18
|
+
column = EnumTest.columns_hash['enum_column']
|
19
|
+
assert_not column.unsigned?
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_should_not_be_bigint
|
23
|
+
column = EnumTest.columns_hash['enum_column']
|
24
|
+
assert_not column.bigint?
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/developer'
|
3
|
+
require 'models/computer'
|
4
|
+
|
5
|
+
class Mysql2ExplainTest < ActiveRecord::Mysql2TestCase
|
6
|
+
fixtures :developers
|
7
|
+
|
8
|
+
def test_explain_for_one_query
|
9
|
+
explain = Developer.where(id: 1).explain
|
10
|
+
assert_match %(EXPLAIN for: SELECT `developers`.* FROM `developers` WHERE `developers`.`id` = 1), explain
|
11
|
+
assert_match %r(developers |.* const), explain
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_explain_with_eager_loading
|
15
|
+
explain = Developer.where(id: 1).includes(:audit_logs).explain
|
16
|
+
assert_match %(EXPLAIN for: SELECT `developers`.* FROM `developers` WHERE `developers`.`id` = 1), explain
|
17
|
+
assert_match %r(developers |.* const), explain
|
18
|
+
assert_match %(EXPLAIN for: SELECT `audit_logs`.* FROM `audit_logs` WHERE `audit_logs`.`developer_id` = 1), explain
|
19
|
+
assert_match %r(audit_logs |.* ALL), explain
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,195 @@
|
|
1
|
+
require 'cases/helper'
|
2
|
+
require 'support/schema_dumping_helper'
|
3
|
+
|
4
|
+
if ActiveRecord::Base.connection.supports_json?
|
5
|
+
class Mysql2JSONTest < ActiveRecord::Mysql2TestCase
|
6
|
+
include SchemaDumpingHelper
|
7
|
+
self.use_transactional_tests = false
|
8
|
+
|
9
|
+
class JsonDataType < ActiveRecord::Base
|
10
|
+
self.table_name = 'json_data_type'
|
11
|
+
|
12
|
+
store_accessor :settings, :resolution
|
13
|
+
end
|
14
|
+
|
15
|
+
def setup
|
16
|
+
@connection = ActiveRecord::Base.connection
|
17
|
+
begin
|
18
|
+
@connection.create_table('json_data_type') do |t|
|
19
|
+
t.json 'payload'
|
20
|
+
t.json 'settings'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def teardown
|
26
|
+
@connection.drop_table :json_data_type, if_exists: true
|
27
|
+
JsonDataType.reset_column_information
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_column
|
31
|
+
column = JsonDataType.columns_hash["payload"]
|
32
|
+
assert_equal :json, column.type
|
33
|
+
assert_equal 'json', column.sql_type
|
34
|
+
|
35
|
+
type = JsonDataType.type_for_attribute("payload")
|
36
|
+
assert_not type.binary?
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_change_table_supports_json
|
40
|
+
@connection.change_table('json_data_type') do |t|
|
41
|
+
t.json 'users'
|
42
|
+
end
|
43
|
+
JsonDataType.reset_column_information
|
44
|
+
column = JsonDataType.columns_hash['users']
|
45
|
+
assert_equal :json, column.type
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_schema_dumping
|
49
|
+
output = dump_table_schema("json_data_type")
|
50
|
+
assert_match(/t\.json\s+"settings"/, output)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_cast_value_on_write
|
54
|
+
x = JsonDataType.new payload: {"string" => "foo", :symbol => :bar}
|
55
|
+
assert_equal({"string" => "foo", :symbol => :bar}, x.payload_before_type_cast)
|
56
|
+
assert_equal({"string" => "foo", "symbol" => "bar"}, x.payload)
|
57
|
+
x.save
|
58
|
+
assert_equal({"string" => "foo", "symbol" => "bar"}, x.reload.payload)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_type_cast_json
|
62
|
+
type = JsonDataType.type_for_attribute("payload")
|
63
|
+
|
64
|
+
data = "{\"a_key\":\"a_value\"}"
|
65
|
+
hash = type.deserialize(data)
|
66
|
+
assert_equal({'a_key' => 'a_value'}, hash)
|
67
|
+
assert_equal({'a_key' => 'a_value'}, type.deserialize(data))
|
68
|
+
|
69
|
+
assert_equal({}, type.deserialize("{}"))
|
70
|
+
assert_equal({'key'=>nil}, type.deserialize('{"key": null}'))
|
71
|
+
assert_equal({'c'=>'}','"a"'=>'b "a b'}, type.deserialize(%q({"c":"}", "\"a\"":"b \"a b"})))
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_rewrite
|
75
|
+
@connection.execute "insert into json_data_type (payload) VALUES ('{\"k\":\"v\"}')"
|
76
|
+
x = JsonDataType.first
|
77
|
+
x.payload = { '"a\'' => 'b' }
|
78
|
+
assert x.save!
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_select
|
82
|
+
@connection.execute "insert into json_data_type (payload) VALUES ('{\"k\":\"v\"}')"
|
83
|
+
x = JsonDataType.first
|
84
|
+
assert_equal({'k' => 'v'}, x.payload)
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_select_multikey
|
88
|
+
@connection.execute %q|insert into json_data_type (payload) VALUES ('{"k1":"v1", "k2":"v2", "k3":[1,2,3]}')|
|
89
|
+
x = JsonDataType.first
|
90
|
+
assert_equal({'k1' => 'v1', 'k2' => 'v2', 'k3' => [1,2,3]}, x.payload)
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_null_json
|
94
|
+
@connection.execute %q|insert into json_data_type (payload) VALUES(null)|
|
95
|
+
x = JsonDataType.first
|
96
|
+
assert_equal(nil, x.payload)
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_select_array_json_value
|
100
|
+
@connection.execute %q|insert into json_data_type (payload) VALUES ('["v0",{"k1":"v1"}]')|
|
101
|
+
x = JsonDataType.first
|
102
|
+
assert_equal(['v0', {'k1' => 'v1'}], x.payload)
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_select_nil_json_after_create
|
106
|
+
json = JsonDataType.create(payload: nil)
|
107
|
+
x = JsonDataType.where(payload:nil).first
|
108
|
+
assert_equal(json, x)
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_select_nil_json_after_update
|
112
|
+
json = JsonDataType.create(payload: "foo")
|
113
|
+
x = JsonDataType.where(payload:nil).first
|
114
|
+
assert_equal(nil, x)
|
115
|
+
|
116
|
+
json.update_attributes payload: nil
|
117
|
+
x = JsonDataType.where(payload:nil).first
|
118
|
+
assert_equal(json.reload, x)
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_rewrite_array_json_value
|
122
|
+
@connection.execute %q|insert into json_data_type (payload) VALUES ('["v0",{"k1":"v1"}]')|
|
123
|
+
x = JsonDataType.first
|
124
|
+
x.payload = ["v1", { "k2" => "v2" }, "v3"]
|
125
|
+
assert x.save!
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_with_store_accessors
|
129
|
+
x = JsonDataType.new(resolution: "320×480")
|
130
|
+
assert_equal "320×480", x.resolution
|
131
|
+
|
132
|
+
x.save!
|
133
|
+
x = JsonDataType.first
|
134
|
+
assert_equal "320×480", x.resolution
|
135
|
+
|
136
|
+
x.resolution = "640×1136"
|
137
|
+
x.save!
|
138
|
+
|
139
|
+
x = JsonDataType.first
|
140
|
+
assert_equal "640×1136", x.resolution
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_duplication_with_store_accessors
|
144
|
+
x = JsonDataType.new(resolution: "320×480")
|
145
|
+
assert_equal "320×480", x.resolution
|
146
|
+
|
147
|
+
y = x.dup
|
148
|
+
assert_equal "320×480", y.resolution
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_yaml_round_trip_with_store_accessors
|
152
|
+
x = JsonDataType.new(resolution: "320×480")
|
153
|
+
assert_equal "320×480", x.resolution
|
154
|
+
|
155
|
+
y = YAML.load(YAML.dump(x))
|
156
|
+
assert_equal "320×480", y.resolution
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_changes_in_place
|
160
|
+
json = JsonDataType.new
|
161
|
+
assert_not json.changed?
|
162
|
+
|
163
|
+
json.payload = { 'one' => 'two' }
|
164
|
+
assert json.changed?
|
165
|
+
assert json.payload_changed?
|
166
|
+
|
167
|
+
json.save!
|
168
|
+
assert_not json.changed?
|
169
|
+
|
170
|
+
json.payload['three'] = 'four'
|
171
|
+
assert json.payload_changed?
|
172
|
+
|
173
|
+
json.save!
|
174
|
+
json.reload
|
175
|
+
|
176
|
+
assert_equal({ 'one' => 'two', 'three' => 'four' }, json.payload)
|
177
|
+
assert_not json.changed?
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_assigning_string_literal
|
181
|
+
json = JsonDataType.create(payload: "foo")
|
182
|
+
assert_equal "foo", json.payload
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_assigning_number
|
186
|
+
json = JsonDataType.create(payload: 1.234)
|
187
|
+
assert_equal 1.234, json.payload
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_assigning_boolean
|
191
|
+
json = JsonDataType.create(payload: true)
|
192
|
+
assert_equal true, json.payload
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require "support/ddl_helper"
|
3
|
+
|
4
|
+
class Mysql2AdapterTest < ActiveRecord::Mysql2TestCase
|
5
|
+
include DdlHelper
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@conn = ActiveRecord::Base.connection
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_exec_query_nothing_raises_with_no_result_queries
|
12
|
+
assert_nothing_raised do
|
13
|
+
with_example_table do
|
14
|
+
@conn.exec_query('INSERT INTO ex (number) VALUES (1)')
|
15
|
+
@conn.exec_query('DELETE FROM ex WHERE number = 1')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_valid_column
|
21
|
+
with_example_table do
|
22
|
+
column = @conn.columns('ex').find { |col| col.name == 'id' }
|
23
|
+
assert @conn.valid_type?(column.type)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_invalid_column
|
28
|
+
assert_not @conn.valid_type?(:foobar)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_columns_for_distinct_zero_orders
|
32
|
+
assert_equal "posts.id",
|
33
|
+
@conn.columns_for_distinct("posts.id", [])
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_columns_for_distinct_one_order
|
37
|
+
assert_equal "posts.id, posts.created_at AS alias_0",
|
38
|
+
@conn.columns_for_distinct("posts.id", ["posts.created_at desc"])
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_columns_for_distinct_few_orders
|
42
|
+
assert_equal "posts.id, posts.created_at AS alias_0, posts.position AS alias_1",
|
43
|
+
@conn.columns_for_distinct("posts.id", ["posts.created_at desc", "posts.position asc"])
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_columns_for_distinct_with_case
|
47
|
+
assert_equal(
|
48
|
+
'posts.id, CASE WHEN author.is_active THEN UPPER(author.name) ELSE UPPER(author.email) END AS alias_0',
|
49
|
+
@conn.columns_for_distinct('posts.id',
|
50
|
+
["CASE WHEN author.is_active THEN UPPER(author.name) ELSE UPPER(author.email) END"])
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_columns_for_distinct_blank_not_nil_orders
|
55
|
+
assert_equal "posts.id, posts.created_at AS alias_0",
|
56
|
+
@conn.columns_for_distinct("posts.id", ["posts.created_at desc", "", " "])
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_columns_for_distinct_with_arel_order
|
60
|
+
order = Object.new
|
61
|
+
def order.to_sql
|
62
|
+
"posts.created_at desc"
|
63
|
+
end
|
64
|
+
assert_equal "posts.id, posts.created_at AS alias_0",
|
65
|
+
@conn.columns_for_distinct("posts.id", [order])
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_table_exists_acts_upon_current_database
|
69
|
+
previous_db = @conn.select_value("SELECT DATABASE()")
|
70
|
+
|
71
|
+
assert @conn.table_exists?("accounts")
|
72
|
+
@conn.execute("USE activerecord_unittest2")
|
73
|
+
assert_not @conn.table_exists?("accounts")
|
74
|
+
ensure
|
75
|
+
@conn.execute("USE #{previous_db}")
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def with_example_table(definition = 'id int auto_increment primary key, number int, data varchar(255)', &block)
|
81
|
+
super(@conn, 'ex', definition, &block)
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
# a suite of tests to ensure the ConnectionAdapters#MysqlAdapter can handle tables with
|
4
|
+
# reserved word names (ie: group, order, values, etc...)
|
5
|
+
class Mysql2ReservedWordTest < ActiveRecord::Mysql2TestCase
|
6
|
+
class Group < ActiveRecord::Base
|
7
|
+
Group.table_name = 'group'
|
8
|
+
belongs_to :select
|
9
|
+
has_one :values
|
10
|
+
end
|
11
|
+
|
12
|
+
class Select < ActiveRecord::Base
|
13
|
+
Select.table_name = 'select'
|
14
|
+
has_many :groups
|
15
|
+
end
|
16
|
+
|
17
|
+
class Values < ActiveRecord::Base
|
18
|
+
Values.table_name = 'values'
|
19
|
+
end
|
20
|
+
|
21
|
+
class Distinct < ActiveRecord::Base
|
22
|
+
Distinct.table_name = 'distinct'
|
23
|
+
has_and_belongs_to_many :selects
|
24
|
+
has_many :values, :through => :groups
|
25
|
+
end
|
26
|
+
|
27
|
+
def setup
|
28
|
+
@connection = ActiveRecord::Base.connection
|
29
|
+
|
30
|
+
# we call execute directly here (and do similar below) because ActiveRecord::Base#create_table()
|
31
|
+
# will fail with these table names if these test cases fail
|
32
|
+
|
33
|
+
create_tables_directly 'group'=>'id int auto_increment primary key, `order` varchar(255), select_id int',
|
34
|
+
'select'=>'id int auto_increment primary key',
|
35
|
+
'values'=>'id int auto_increment primary key, group_id int',
|
36
|
+
'distinct'=>'id int auto_increment primary key',
|
37
|
+
'distinct_select'=>'distinct_id int, select_id int'
|
38
|
+
end
|
39
|
+
|
40
|
+
teardown do
|
41
|
+
drop_tables_directly ['group', 'select', 'values', 'distinct', 'distinct_select', 'order']
|
42
|
+
end
|
43
|
+
|
44
|
+
# create tables with reserved-word names and columns
|
45
|
+
def test_create_tables
|
46
|
+
assert_nothing_raised {
|
47
|
+
@connection.create_table :order do |t|
|
48
|
+
t.column :group, :string
|
49
|
+
end
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
# rename tables with reserved-word names
|
54
|
+
def test_rename_tables
|
55
|
+
assert_nothing_raised { @connection.rename_table(:group, :order) }
|
56
|
+
end
|
57
|
+
|
58
|
+
# alter column with a reserved-word name in a table with a reserved-word name
|
59
|
+
def test_change_columns
|
60
|
+
assert_nothing_raised { @connection.change_column_default(:group, :order, 'whatever') }
|
61
|
+
#the quoting here will reveal any double quoting issues in change_column's interaction with the column method in the adapter
|
62
|
+
assert_nothing_raised { @connection.change_column('group', 'order', :Int, :default => 0) }
|
63
|
+
assert_nothing_raised { @connection.rename_column(:group, :order, :values) }
|
64
|
+
end
|
65
|
+
|
66
|
+
# introspect table with reserved word name
|
67
|
+
def test_introspect
|
68
|
+
assert_nothing_raised { @connection.columns(:group) }
|
69
|
+
assert_nothing_raised { @connection.indexes(:group) }
|
70
|
+
end
|
71
|
+
|
72
|
+
#fixtures
|
73
|
+
self.use_instantiated_fixtures = true
|
74
|
+
self.use_transactional_tests = false
|
75
|
+
|
76
|
+
#activerecord model class with reserved-word table name
|
77
|
+
def test_activerecord_model
|
78
|
+
create_test_fixtures :select, :distinct, :group, :values, :distinct_select
|
79
|
+
x = nil
|
80
|
+
assert_nothing_raised { x = Group.new }
|
81
|
+
x.order = 'x'
|
82
|
+
assert_nothing_raised { x.save }
|
83
|
+
x.order = 'y'
|
84
|
+
assert_nothing_raised { x.save }
|
85
|
+
assert_nothing_raised { Group.find_by_order('y') }
|
86
|
+
assert_nothing_raised { Group.find(1) }
|
87
|
+
end
|
88
|
+
|
89
|
+
# has_one association with reserved-word table name
|
90
|
+
def test_has_one_associations
|
91
|
+
create_test_fixtures :select, :distinct, :group, :values, :distinct_select
|
92
|
+
v = nil
|
93
|
+
assert_nothing_raised { v = Group.find(1).values }
|
94
|
+
assert_equal 2, v.id
|
95
|
+
end
|
96
|
+
|
97
|
+
# belongs_to association with reserved-word table name
|
98
|
+
def test_belongs_to_associations
|
99
|
+
create_test_fixtures :select, :distinct, :group, :values, :distinct_select
|
100
|
+
gs = nil
|
101
|
+
assert_nothing_raised { gs = Select.find(2).groups }
|
102
|
+
assert_equal gs.length, 2
|
103
|
+
assert(gs.collect(&:id).sort == [2, 3])
|
104
|
+
end
|
105
|
+
|
106
|
+
# has_and_belongs_to_many with reserved-word table name
|
107
|
+
def test_has_and_belongs_to_many
|
108
|
+
create_test_fixtures :select, :distinct, :group, :values, :distinct_select
|
109
|
+
s = nil
|
110
|
+
assert_nothing_raised { s = Distinct.find(1).selects }
|
111
|
+
assert_equal s.length, 2
|
112
|
+
assert(s.collect(&:id).sort == [1, 2])
|
113
|
+
end
|
114
|
+
|
115
|
+
# activerecord model introspection with reserved-word table and column names
|
116
|
+
def test_activerecord_introspection
|
117
|
+
assert_nothing_raised { Group.table_exists? }
|
118
|
+
assert_nothing_raised { Group.columns }
|
119
|
+
end
|
120
|
+
|
121
|
+
# Calculations
|
122
|
+
def test_calculations_work_with_reserved_words
|
123
|
+
assert_nothing_raised { Group.count }
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_associations_work_with_reserved_words
|
127
|
+
assert_nothing_raised { Select.all.merge!(:includes => [:groups]).to_a }
|
128
|
+
end
|
129
|
+
|
130
|
+
#the following functions were added to DRY test cases
|
131
|
+
|
132
|
+
private
|
133
|
+
# custom fixture loader, uses FixtureSet#create_fixtures and appends base_path to the current file's path
|
134
|
+
def create_test_fixtures(*fixture_names)
|
135
|
+
ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT + "/reserved_words", fixture_names)
|
136
|
+
end
|
137
|
+
|
138
|
+
# custom drop table, uses execute on connection to drop a table if it exists. note: escapes table_name
|
139
|
+
def drop_tables_directly(table_names, connection = @connection)
|
140
|
+
table_names.each do |name|
|
141
|
+
connection.drop_table name, if_exists: true
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# custom create table, uses execute on connection to create a table, note: escapes table_name, does NOT escape columns
|
146
|
+
def create_tables_directly(tables, connection = @connection)
|
147
|
+
tables.each do |table_name, column_properties|
|
148
|
+
connection.execute("CREATE TABLE `#{table_name}` ( #{column_properties} )")
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|