ibm_db 3.0.5-x86-mingw32 → 4.0.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 +4 -0
- data/LICENSE +1 -1
- data/MANIFEST +14 -14
- data/ParameterizedQueries README +6 -6
- data/README +208 -225
- data/ext/Makefile.nt32 +181 -181
- data/ext/Makefile.nt32.191 +212 -212
- data/ext/extconf.rb +291 -291
- data/ext/ibm_db.c +11887 -11887
- data/ext/ruby_ibm_db.h +241 -241
- data/ext/ruby_ibm_db_cli.c +866 -866
- data/ext/ruby_ibm_db_cli.h +500 -500
- data/init.rb +41 -41
- data/lib/IBM_DB.rb +27 -27
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3452 -3177
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -2
- data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
- data/lib/mswin32/ibm_db.rb +91 -123
- data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +49 -46
- data/test/assets/example.log +1 -1
- data/test/assets/test.txt +1 -1
- data/test/cases/adapter_test.rb +351 -276
- 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 +168 -158
- data/test/cases/ar_schema_test.rb +146 -161
- data/test/cases/associations/association_scope_test.rb +16 -21
- data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
- data/test/cases/associations/callbacks_test.rb +190 -192
- data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
- data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
- data/test/cases/associations/eager_singularization_test.rb +148 -148
- data/test/cases/associations/eager_test.rb +1514 -1429
- data/test/cases/associations/extension_test.rb +87 -82
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -972
- data/test/cases/associations/has_many_associations_test.rb +2501 -2182
- data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
- data/test/cases/associations/has_one_associations_test.rb +707 -610
- data/test/cases/associations/has_one_through_associations_test.rb +383 -380
- data/test/cases/associations/inner_join_association_test.rb +139 -139
- data/test/cases/associations/inverse_associations_test.rb +733 -706
- data/test/cases/associations/join_model_test.rb +777 -754
- data/test/cases/associations/left_outer_join_association_test.rb +88 -0
- data/test/cases/associations/nested_through_associations_test.rb +579 -579
- data/test/cases/associations/required_test.rb +102 -82
- data/test/cases/associations_test.rb +385 -380
- data/test/cases/attribute_decorators_test.rb +125 -125
- data/test/cases/attribute_methods/read_test.rb +60 -60
- data/test/cases/attribute_methods_test.rb +1009 -952
- data/test/cases/attribute_set_test.rb +270 -210
- data/test/cases/attribute_test.rb +246 -180
- data/test/cases/attributes_test.rb +253 -136
- data/test/cases/autosave_association_test.rb +1708 -1595
- data/test/cases/base_test.rb +1713 -1664
- data/test/cases/batches_test.rb +489 -212
- data/test/cases/binary_test.rb +44 -52
- data/test/cases/bind_parameter_test.rb +110 -100
- data/test/cases/cache_key_test.rb +25 -0
- data/test/cases/calculations_test.rb +798 -646
- data/test/cases/callbacks_test.rb +636 -543
- data/test/cases/clone_test.rb +40 -40
- data/test/cases/coders/json_test.rb +15 -0
- data/test/cases/coders/yaml_column_test.rb +63 -63
- data/test/cases/collection_cache_key_test.rb +115 -0
- data/test/cases/column_alias_test.rb +17 -17
- data/test/cases/column_definition_test.rb +92 -123
- data/test/cases/comment_test.rb +143 -0
- data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
- data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
- data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
- data/test/cases/connection_adapters/quoting_test.rb +13 -13
- data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
- data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
- data/test/cases/connection_management_test.rb +112 -122
- data/test/cases/connection_pool_test.rb +521 -346
- data/test/cases/connection_specification/resolver_test.rb +131 -116
- data/test/cases/core_test.rb +112 -112
- data/test/cases/counter_cache_test.rb +214 -209
- data/test/cases/custom_locking_test.rb +17 -17
- data/test/cases/database_statements_test.rb +34 -19
- data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
- data/test/cases/date_time_precision_test.rb +106 -0
- data/test/cases/date_time_test.rb +61 -61
- data/test/cases/defaults_test.rb +218 -223
- data/test/cases/dirty_test.rb +763 -785
- data/test/cases/disconnected_test.rb +30 -28
- data/test/cases/dup_test.rb +157 -157
- data/test/cases/enum_test.rb +444 -290
- data/test/cases/errors_test.rb +16 -0
- data/test/cases/explain_subscriber_test.rb +64 -64
- data/test/cases/explain_test.rb +87 -76
- data/test/cases/finder_respond_to_test.rb +60 -60
- data/test/cases/finder_test.rb +1294 -1169
- data/test/cases/fixture_set/file_test.rb +156 -138
- data/test/cases/fixtures_test.rb +988 -908
- data/test/cases/forbidden_attributes_protection_test.rb +165 -99
- data/test/cases/habtm_destroy_order_test.rb +61 -61
- data/test/cases/helper.rb +204 -210
- data/test/cases/hot_compatibility_test.rb +142 -54
- data/test/cases/i18n_test.rb +45 -45
- data/test/cases/inheritance_test.rb +606 -375
- data/test/cases/integration_test.rb +155 -139
- data/test/cases/invalid_connection_test.rb +24 -22
- data/test/cases/invertible_migration_test.rb +387 -295
- data/test/cases/json_serialization_test.rb +311 -302
- data/test/cases/locking_test.rb +493 -477
- data/test/cases/log_subscriber_test.rb +225 -136
- data/test/cases/migration/change_schema_test.rb +458 -512
- data/test/cases/migration/change_table_test.rb +256 -224
- data/test/cases/migration/column_attributes_test.rb +176 -192
- data/test/cases/migration/column_positioning_test.rb +56 -56
- data/test/cases/migration/columns_test.rb +310 -304
- data/test/cases/migration/command_recorder_test.rb +350 -305
- data/test/cases/migration/compatibility_test.rb +118 -0
- data/test/cases/migration/create_join_table_test.rb +157 -148
- data/test/cases/migration/foreign_key_test.rb +360 -328
- data/test/cases/migration/helper.rb +39 -39
- data/test/cases/migration/index_test.rb +218 -216
- data/test/cases/migration/logger_test.rb +36 -36
- data/test/cases/migration/pending_migrations_test.rb +52 -53
- data/test/cases/migration/references_foreign_key_test.rb +216 -169
- data/test/cases/migration/references_index_test.rb +101 -101
- data/test/cases/migration/references_statements_test.rb +136 -116
- data/test/cases/migration/rename_table_test.rb +93 -93
- data/test/cases/migration_test.rb +1157 -959
- data/test/cases/migrator_test.rb +470 -388
- data/test/cases/mixin_test.rb +68 -70
- data/test/cases/modules_test.rb +172 -173
- data/test/cases/multiparameter_attributes_test.rb +372 -350
- data/test/cases/multiple_db_test.rb +122 -115
- data/test/cases/nested_attributes_test.rb +1098 -1070
- data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
- data/test/cases/persistence_test.rb +1001 -909
- data/test/cases/pooled_connections_test.rb +81 -81
- data/test/cases/primary_keys_test.rb +376 -237
- data/test/cases/query_cache_test.rb +446 -326
- data/test/cases/quoting_test.rb +202 -156
- data/test/cases/readonly_test.rb +119 -118
- data/test/cases/reaper_test.rb +85 -85
- data/test/cases/reflection_test.rb +509 -463
- data/test/cases/relation/delegation_test.rb +63 -68
- data/test/cases/relation/merging_test.rb +157 -161
- data/test/cases/relation/mutation_test.rb +183 -165
- data/test/cases/relation/or_test.rb +92 -0
- data/test/cases/relation/predicate_builder_test.rb +16 -14
- data/test/cases/relation/record_fetch_warning_test.rb +40 -0
- data/test/cases/relation/where_chain_test.rb +105 -181
- data/test/cases/relation/where_clause_test.rb +182 -0
- data/test/cases/relation/where_test.rb +322 -300
- data/test/cases/relation_test.rb +328 -319
- data/test/cases/relations_test.rb +2026 -1815
- data/test/cases/reload_models_test.rb +22 -22
- data/test/cases/result_test.rb +90 -80
- data/test/cases/sanitize_test.rb +176 -83
- data/test/cases/schema_dumper_test.rb +457 -463
- data/test/cases/schema_loading_test.rb +52 -0
- data/test/cases/scoping/default_scoping_test.rb +528 -454
- data/test/cases/scoping/named_scoping_test.rb +561 -524
- data/test/cases/scoping/relation_scoping_test.rb +400 -357
- data/test/cases/secure_token_test.rb +32 -0
- data/test/cases/serialization_test.rb +104 -104
- data/test/cases/serialized_attribute_test.rb +364 -277
- data/test/cases/statement_cache_test.rb +136 -98
- data/test/cases/store_test.rb +195 -194
- data/test/cases/suppressor_test.rb +63 -0
- data/test/cases/tasks/database_tasks_test.rb +462 -398
- data/test/cases/tasks/mysql_rake_test.rb +345 -324
- data/test/cases/tasks/postgresql_rake_test.rb +304 -250
- data/test/cases/tasks/sqlite_rake_test.rb +220 -193
- data/test/cases/test_case.rb +131 -123
- data/test/cases/test_fixtures_test.rb +36 -0
- data/test/cases/time_precision_test.rb +102 -0
- data/test/cases/timestamp_test.rb +501 -467
- data/test/cases/touch_later_test.rb +121 -0
- data/test/cases/transaction_callbacks_test.rb +518 -452
- data/test/cases/transaction_isolation_test.rb +106 -106
- data/test/cases/transactions_test.rb +834 -817
- 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 +27 -121
- data/test/cases/type/string_test.rb +22 -36
- data/test/cases/type/type_map_test.rb +177 -177
- data/test/cases/type_test.rb +39 -0
- data/test/cases/types_test.rb +24 -141
- data/test/cases/unconnected_test.rb +33 -33
- data/test/cases/validations/absence_validation_test.rb +73 -0
- data/test/cases/validations/association_validation_test.rb +97 -86
- data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
- data/test/cases/validations/i18n_validation_test.rb +86 -90
- data/test/cases/validations/length_validation_test.rb +79 -47
- data/test/cases/validations/presence_validation_test.rb +103 -68
- data/test/cases/validations/uniqueness_validation_test.rb +548 -457
- data/test/cases/validations_repair_helper.rb +19 -23
- data/test/cases/validations_test.rb +194 -165
- data/test/cases/view_test.rb +216 -119
- data/test/cases/yaml_serialization_test.rb +121 -126
- data/test/config.example.yml +97 -0
- data/test/config.rb +5 -5
- data/test/fixtures/accounts.yml +29 -29
- data/test/fixtures/admin/accounts.yml +2 -2
- data/test/fixtures/admin/users.yml +10 -10
- data/test/fixtures/author_addresses.original +11 -0
- data/test/fixtures/author_addresses.yml +17 -17
- data/test/fixtures/author_favorites.yml +3 -3
- data/test/fixtures/authors.original +17 -0
- data/test/fixtures/authors.yml +23 -23
- data/test/fixtures/bad_posts.yml +9 -0
- data/test/fixtures/binaries.yml +133 -133
- data/test/fixtures/books.yml +31 -11
- data/test/fixtures/bulbs.yml +5 -5
- data/test/fixtures/cars.yml +9 -9
- data/test/fixtures/categories.yml +19 -19
- data/test/fixtures/categories/special_categories.yml +9 -9
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
- data/test/fixtures/categories_ordered.yml +7 -7
- data/test/fixtures/categories_posts.yml +31 -31
- data/test/fixtures/categorizations.yml +23 -23
- data/test/fixtures/clubs.yml +8 -8
- data/test/fixtures/collections.yml +3 -3
- data/test/fixtures/colleges.yml +3 -3
- data/test/fixtures/comments.yml +65 -65
- data/test/fixtures/companies.yml +67 -67
- data/test/fixtures/computers.yml +10 -10
- data/test/fixtures/content.yml +3 -0
- data/test/fixtures/content_positions.yml +3 -0
- data/test/fixtures/courses.yml +8 -8
- data/test/fixtures/customers.yml +25 -25
- data/test/fixtures/dashboards.yml +6 -6
- data/test/fixtures/dead_parrots.yml +5 -0
- data/test/fixtures/developers.yml +22 -22
- data/test/fixtures/developers_projects.yml +16 -16
- data/test/fixtures/dog_lovers.yml +7 -7
- data/test/fixtures/dogs.yml +4 -4
- data/test/fixtures/doubloons.yml +3 -3
- data/test/fixtures/edges.yml +5 -5
- data/test/fixtures/entrants.yml +14 -14
- data/test/fixtures/essays.yml +6 -6
- data/test/fixtures/faces.yml +11 -11
- data/test/fixtures/fk_test_has_fk.yml +3 -3
- data/test/fixtures/fk_test_has_pk.yml +1 -1
- data/test/fixtures/friendships.yml +4 -4
- data/test/fixtures/funny_jokes.yml +10 -10
- data/test/fixtures/interests.yml +33 -33
- data/test/fixtures/items.yml +3 -3
- data/test/fixtures/jobs.yml +7 -7
- data/test/fixtures/legacy_things.yml +3 -3
- data/test/fixtures/live_parrots.yml +4 -0
- data/test/fixtures/mateys.yml +4 -4
- data/test/fixtures/member_details.yml +8 -8
- data/test/fixtures/member_types.yml +6 -6
- data/test/fixtures/members.yml +11 -11
- data/test/fixtures/memberships.yml +34 -34
- data/test/fixtures/men.yml +5 -5
- data/test/fixtures/minimalistics.yml +2 -2
- data/test/fixtures/minivans.yml +5 -5
- data/test/fixtures/mixed_case_monkeys.yml +6 -6
- data/test/fixtures/mixins.yml +29 -29
- data/test/fixtures/movies.yml +7 -7
- data/test/fixtures/naked/yml/accounts.yml +1 -1
- data/test/fixtures/naked/yml/companies.yml +1 -1
- data/test/fixtures/naked/yml/courses.yml +1 -1
- 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/organizations.yml +5 -5
- 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/other_topics.yml +42 -42
- data/test/fixtures/owners.yml +9 -9
- data/test/fixtures/parrots.yml +27 -27
- data/test/fixtures/parrots_pirates.yml +7 -7
- data/test/fixtures/people.yml +24 -24
- data/test/fixtures/peoples_treasures.yml +3 -3
- data/test/fixtures/pets.yml +19 -19
- data/test/fixtures/pirates.yml +15 -12
- data/test/fixtures/posts.yml +80 -80
- data/test/fixtures/price_estimates.yml +16 -7
- data/test/fixtures/products.yml +4 -4
- data/test/fixtures/projects.yml +7 -7
- data/test/fixtures/ratings.yml +14 -14
- data/test/fixtures/readers.yml +11 -11
- data/test/fixtures/references.yml +17 -17
- data/test/fixtures/reserved_words/distinct.yml +5 -5
- data/test/fixtures/reserved_words/distinct_select.yml +11 -11
- data/test/fixtures/reserved_words/group.yml +14 -14
- data/test/fixtures/reserved_words/select.yml +8 -8
- data/test/fixtures/reserved_words/values.yml +7 -7
- data/test/fixtures/ships.yml +6 -6
- data/test/fixtures/speedometers.yml +8 -8
- data/test/fixtures/sponsors.yml +12 -12
- data/test/fixtures/string_key_objects.yml +7 -7
- data/test/fixtures/subscribers.yml +10 -10
- data/test/fixtures/subscriptions.yml +12 -12
- data/test/fixtures/taggings.yml +78 -78
- data/test/fixtures/tags.yml +11 -11
- data/test/fixtures/tasks.yml +7 -7
- data/test/fixtures/teapots.yml +3 -3
- data/test/fixtures/to_be_linked/accounts.yml +2 -2
- data/test/fixtures/to_be_linked/users.yml +10 -10
- data/test/fixtures/topics.yml +49 -49
- data/test/fixtures/toys.yml +14 -14
- data/test/fixtures/traffic_lights.yml +9 -9
- data/test/fixtures/treasures.yml +10 -10
- data/test/fixtures/trees.yml +3 -0
- data/test/fixtures/uuid_children.yml +3 -3
- data/test/fixtures/uuid_parents.yml +2 -2
- data/test/fixtures/variants.yml +4 -4
- data/test/fixtures/vegetables.yml +19 -19
- data/test/fixtures/vertices.yml +3 -3
- data/test/fixtures/warehouse_things.yml +2 -2
- data/test/fixtures/zines.yml +5 -5
- data/test/migrations/10_urban/9_add_expressions.rb +11 -11
- data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
- data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
- data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
- data/test/migrations/missing/1_people_have_last_names.rb +9 -9
- data/test/migrations/missing/3_we_need_reminders.rb +12 -12
- data/test/migrations/missing/4_innocent_jointable.rb +12 -12
- data/test/migrations/rename/1_we_need_things.rb +11 -11
- data/test/migrations/rename/2_rename_things.rb +9 -9
- data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
- data/test/migrations/to_copy2/1_create_articles.rb +7 -7
- data/test/migrations/to_copy2/2_create_comments.rb +7 -7
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
- data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
- data/test/migrations/valid/2_we_need_reminders.rb +12 -12
- data/test/migrations/valid/3_innocent_jointable.rb +12 -12
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
- data/test/models/admin.rb +5 -5
- data/test/models/admin/account.rb +3 -3
- data/test/models/admin/randomly_named_c1.rb +6 -2
- data/test/models/admin/user.rb +40 -40
- data/test/models/aircraft.rb +5 -4
- data/test/models/arunit2_model.rb +3 -3
- data/test/models/author.rb +209 -212
- data/test/models/auto_id.rb +4 -4
- data/test/models/autoloadable/extra_firm.rb +2 -2
- data/test/models/binary.rb +2 -2
- data/test/models/bird.rb +12 -12
- data/test/models/book.rb +23 -18
- data/test/models/boolean.rb +2 -2
- data/test/models/bulb.rb +52 -51
- data/test/models/cake_designer.rb +3 -3
- data/test/models/car.rb +29 -26
- data/test/models/carrier.rb +2 -2
- data/test/models/cat.rb +10 -0
- data/test/models/categorization.rb +19 -19
- data/test/models/category.rb +35 -35
- data/test/models/chef.rb +8 -7
- data/test/models/citation.rb +3 -3
- data/test/models/club.rb +25 -23
- data/test/models/college.rb +10 -10
- data/test/models/column.rb +3 -3
- data/test/models/column_name.rb +3 -3
- data/test/models/comment.rb +76 -64
- data/test/models/company.rb +230 -228
- data/test/models/company_in_module.rb +98 -98
- data/test/models/computer.rb +3 -3
- data/test/models/contact.rb +41 -41
- data/test/models/content.rb +40 -0
- data/test/models/contract.rb +20 -20
- data/test/models/country.rb +7 -7
- data/test/models/course.rb +6 -6
- data/test/models/customer.rb +83 -77
- data/test/models/customer_carrier.rb +14 -14
- data/test/models/dashboard.rb +3 -3
- data/test/models/default.rb +2 -2
- data/test/models/department.rb +4 -4
- data/test/models/developer.rb +274 -255
- data/test/models/dog.rb +5 -5
- data/test/models/dog_lover.rb +5 -5
- data/test/models/doubloon.rb +12 -12
- data/test/models/drink_designer.rb +3 -3
- data/test/models/edge.rb +5 -5
- data/test/models/electron.rb +5 -5
- data/test/models/engine.rb +4 -4
- data/test/models/entrant.rb +3 -3
- data/test/models/essay.rb +5 -5
- data/test/models/event.rb +3 -3
- data/test/models/eye.rb +37 -37
- data/test/models/face.rb +9 -9
- data/test/models/friendship.rb +6 -6
- data/test/models/guid.rb +2 -2
- data/test/models/guitar.rb +4 -0
- data/test/models/hotel.rb +11 -9
- data/test/models/image.rb +3 -3
- data/test/models/interest.rb +5 -5
- data/test/models/invoice.rb +4 -4
- data/test/models/item.rb +7 -7
- data/test/models/job.rb +7 -7
- data/test/models/joke.rb +7 -7
- data/test/models/keyboard.rb +3 -3
- data/test/models/legacy_thing.rb +3 -3
- data/test/models/lesson.rb +11 -11
- data/test/models/line_item.rb +3 -3
- data/test/models/liquid.rb +4 -4
- data/test/models/man.rb +11 -11
- data/test/models/matey.rb +4 -4
- data/test/models/member.rb +42 -41
- data/test/models/member_detail.rb +8 -7
- data/test/models/member_type.rb +3 -3
- data/test/models/membership.rb +35 -35
- data/test/models/mentor.rb +3 -0
- data/test/models/minimalistic.rb +2 -2
- data/test/models/minivan.rb +9 -9
- data/test/models/mixed_case_monkey.rb +3 -3
- data/test/models/mocktail_designer.rb +2 -0
- data/test/models/molecule.rb +6 -6
- data/test/models/movie.rb +5 -5
- 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/order.rb +4 -4
- data/test/models/organization.rb +14 -14
- data/test/models/other_dog.rb +5 -0
- data/test/models/owner.rb +37 -34
- data/test/models/parrot.rb +28 -29
- data/test/models/person.rb +142 -143
- data/test/models/personal_legacy_thing.rb +4 -4
- data/test/models/pet.rb +18 -15
- data/test/models/pet_treasure.rb +6 -0
- data/test/models/pirate.rb +92 -92
- data/test/models/possession.rb +3 -3
- data/test/models/post.rb +273 -264
- data/test/models/price_estimate.rb +4 -4
- data/test/models/professor.rb +5 -5
- data/test/models/project.rb +40 -31
- data/test/models/publisher.rb +2 -2
- data/test/models/publisher/article.rb +4 -4
- data/test/models/publisher/magazine.rb +3 -3
- data/test/models/randomly_named_c1.rb +1 -1
- data/test/models/rating.rb +4 -4
- data/test/models/reader.rb +23 -23
- data/test/models/recipe.rb +3 -0
- data/test/models/record.rb +2 -2
- data/test/models/reference.rb +22 -22
- data/test/models/reply.rb +61 -61
- data/test/models/ship.rb +39 -33
- data/test/models/ship_part.rb +8 -8
- data/test/models/shop.rb +17 -17
- data/test/models/shop_account.rb +6 -6
- data/test/models/speedometer.rb +6 -6
- data/test/models/sponsor.rb +7 -7
- data/test/models/string_key_object.rb +3 -3
- data/test/models/student.rb +4 -4
- data/test/models/subject.rb +16 -16
- data/test/models/subscriber.rb +8 -8
- data/test/models/subscription.rb +4 -4
- data/test/models/tag.rb +13 -7
- data/test/models/tagging.rb +13 -13
- data/test/models/task.rb +5 -5
- data/test/models/topic.rb +118 -124
- data/test/models/toy.rb +6 -6
- data/test/models/traffic_light.rb +4 -4
- data/test/models/treasure.rb +14 -14
- data/test/models/treaty.rb +7 -7
- data/test/models/tree.rb +3 -0
- data/test/models/tuning_peg.rb +4 -0
- data/test/models/tyre.rb +11 -11
- data/test/models/user.rb +14 -0
- data/test/models/uuid_child.rb +3 -3
- data/test/models/uuid_item.rb +6 -0
- data/test/models/uuid_parent.rb +3 -3
- data/test/models/vegetables.rb +24 -24
- data/test/models/vehicle.rb +6 -6
- data/test/models/vertex.rb +9 -9
- data/test/models/warehouse_thing.rb +5 -5
- data/test/models/wheel.rb +3 -3
- data/test/models/without_table.rb +3 -3
- data/test/models/zine.rb +3 -3
- data/test/schema/mysql2_specific_schema.rb +68 -58
- data/test/schema/oracle_specific_schema.rb +40 -43
- data/test/schema/postgresql_specific_schema.rb +114 -202
- data/test/schema/schema.rb +1057 -952
- data/test/schema/schema.rb.original +1057 -0
- data/test/schema/sqlite_specific_schema.rb +18 -22
- data/test/support/config.rb +43 -43
- data/test/support/connection.rb +23 -22
- data/test/support/connection_helper.rb +14 -14
- data/test/support/ddl_helper.rb +8 -8
- data/test/support/schema_dumping_helper.rb +20 -20
- 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 +129 -28
- 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/connections/native_ibm_db/connection.rb +0 -44
- data/test/fixtures/naked/csv/accounts.csv +0 -1
- data/test/schema/i5/ibm_db_specific_schema.rb +0 -137
- data/test/schema/ids/ibm_db_specific_schema.rb +0 -140
- data/test/schema/luw/ibm_db_specific_schema.rb +0 -137
- data/test/schema/mysql_specific_schema.rb +0 -70
- data/test/schema/zOS/ibm_db_specific_schema.rb +0 -208
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'cases/helper'
|
2
|
+
require 'support/schema_dumping_helper'
|
3
|
+
|
4
|
+
class PostgresqlXMLTest < ActiveRecord::PostgreSQLTestCase
|
5
|
+
include SchemaDumpingHelper
|
6
|
+
class XmlDataType < ActiveRecord::Base
|
7
|
+
self.table_name = 'xml_data_type'
|
8
|
+
end
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@connection = ActiveRecord::Base.connection
|
12
|
+
begin
|
13
|
+
@connection.transaction do
|
14
|
+
@connection.create_table('xml_data_type') do |t|
|
15
|
+
t.xml 'payload'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
rescue ActiveRecord::StatementInvalid
|
19
|
+
skip "do not test on PG without xml"
|
20
|
+
end
|
21
|
+
@column = XmlDataType.columns_hash['payload']
|
22
|
+
end
|
23
|
+
|
24
|
+
teardown do
|
25
|
+
@connection.drop_table 'xml_data_type', if_exists: true
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_column
|
29
|
+
assert_equal :xml, @column.type
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_null_xml
|
33
|
+
@connection.execute %q|insert into xml_data_type (payload) VALUES(null)|
|
34
|
+
assert_nil XmlDataType.first.payload
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_round_trip
|
38
|
+
data = XmlDataType.new(payload: "<foo>bar</foo>")
|
39
|
+
assert_equal "<foo>bar</foo>", data.payload
|
40
|
+
data.save!
|
41
|
+
assert_equal "<foo>bar</foo>", data.reload.payload
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_update_all
|
45
|
+
data = XmlDataType.create!
|
46
|
+
XmlDataType.update_all(payload: "<bar>baz</bar>")
|
47
|
+
assert_equal "<bar>baz</bar>", data.reload.payload
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_schema_dump_with_shorthand
|
51
|
+
output = dump_table_schema("xml_data_type")
|
52
|
+
assert_match %r{t\.xml "payload"}, output
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'support/schema_dumping_helper'
|
3
|
+
|
4
|
+
class SQLite3CollationTest < ActiveRecord::SQLite3TestCase
|
5
|
+
include SchemaDumpingHelper
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@connection = ActiveRecord::Base.connection
|
9
|
+
@connection.create_table :collation_table_sqlite3, force: true do |t|
|
10
|
+
t.string :string_nocase, collation: 'NOCASE'
|
11
|
+
t.text :text_rtrim, collation: 'RTRIM'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def teardown
|
16
|
+
@connection.drop_table :collation_table_sqlite3, if_exists: true
|
17
|
+
end
|
18
|
+
|
19
|
+
test "string column with collation" do
|
20
|
+
column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == 'string_nocase' }
|
21
|
+
assert_equal :string, column.type
|
22
|
+
assert_equal 'NOCASE', column.collation
|
23
|
+
end
|
24
|
+
|
25
|
+
test "text column with collation" do
|
26
|
+
column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == 'text_rtrim' }
|
27
|
+
assert_equal :text, column.type
|
28
|
+
assert_equal 'RTRIM', column.collation
|
29
|
+
end
|
30
|
+
|
31
|
+
test "add column with collation" do
|
32
|
+
@connection.add_column :collation_table_sqlite3, :title, :string, collation: 'RTRIM'
|
33
|
+
|
34
|
+
column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == 'title' }
|
35
|
+
assert_equal :string, column.type
|
36
|
+
assert_equal 'RTRIM', column.collation
|
37
|
+
end
|
38
|
+
|
39
|
+
test "change column with collation" do
|
40
|
+
@connection.add_column :collation_table_sqlite3, :description, :string
|
41
|
+
@connection.change_column :collation_table_sqlite3, :description, :text, collation: 'RTRIM'
|
42
|
+
|
43
|
+
column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == 'description' }
|
44
|
+
assert_equal :text, column.type
|
45
|
+
assert_equal 'RTRIM', column.collation
|
46
|
+
end
|
47
|
+
|
48
|
+
test "schema dump includes collation" do
|
49
|
+
output = dump_table_schema("collation_table_sqlite3")
|
50
|
+
assert_match %r{t.string\s+"string_nocase",\s+collation: "NOCASE"$}, output
|
51
|
+
assert_match %r{t.text\s+"text_rtrim",\s+collation: "RTRIM"$}, output
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
class CopyTableTest < ActiveRecord::SQLite3TestCase
|
4
|
+
fixtures :customers
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@connection = ActiveRecord::Base.connection
|
8
|
+
class << @connection
|
9
|
+
public :copy_table, :table_structure, :indexes
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_copy_table(from = 'customers', to = 'customers2', options = {})
|
14
|
+
assert_nothing_raised {copy_table(from, to, options)}
|
15
|
+
assert_equal row_count(from), row_count(to)
|
16
|
+
|
17
|
+
if block_given?
|
18
|
+
yield from, to, options
|
19
|
+
else
|
20
|
+
assert_equal column_names(from), column_names(to)
|
21
|
+
end
|
22
|
+
|
23
|
+
@connection.drop_table(to) rescue nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_copy_table_renaming_column
|
27
|
+
test_copy_table('customers', 'customers2',
|
28
|
+
:rename => {'name' => 'person_name'}) do |from, to, options|
|
29
|
+
expected = column_values(from, 'name')
|
30
|
+
assert_equal expected, column_values(to, 'person_name')
|
31
|
+
assert expected.any?, "No values in table: #{expected.inspect}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_copy_table_allows_to_pass_options_to_create_table
|
36
|
+
@connection.create_table('blocker_table')
|
37
|
+
test_copy_table('customers', 'blocker_table', force: true)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_copy_table_with_index
|
41
|
+
test_copy_table('comments', 'comments_with_index') do
|
42
|
+
@connection.add_index('comments_with_index', ['post_id', 'type'])
|
43
|
+
test_copy_table('comments_with_index', 'comments_with_index2') do
|
44
|
+
assert_equal table_indexes_without_name('comments_with_index'),
|
45
|
+
table_indexes_without_name('comments_with_index2')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_copy_table_without_primary_key
|
51
|
+
test_copy_table('developers_projects', 'programmers_projects') do
|
52
|
+
assert_nil @connection.primary_key('programmers_projects')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_copy_table_with_id_col_that_is_not_primary_key
|
57
|
+
test_copy_table('goofy_string_id', 'goofy_string_id2') do
|
58
|
+
original_id = @connection.columns('goofy_string_id').detect{|col| col.name == 'id' }
|
59
|
+
copied_id = @connection.columns('goofy_string_id2').detect{|col| col.name == 'id' }
|
60
|
+
assert_equal original_id.type, copied_id.type
|
61
|
+
assert_equal original_id.sql_type, copied_id.sql_type
|
62
|
+
assert_equal original_id.limit, copied_id.limit
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_copy_table_with_unconventional_primary_key
|
67
|
+
test_copy_table('owners', 'owners_unconventional') do
|
68
|
+
original_pk = @connection.primary_key('owners')
|
69
|
+
copied_pk = @connection.primary_key('owners_unconventional')
|
70
|
+
assert_equal original_pk, copied_pk
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_copy_table_with_binary_column
|
75
|
+
test_copy_table 'binaries', 'binaries2'
|
76
|
+
end
|
77
|
+
|
78
|
+
protected
|
79
|
+
def copy_table(from, to, options = {})
|
80
|
+
@connection.copy_table(from, to, {:temporary => true}.merge(options))
|
81
|
+
end
|
82
|
+
|
83
|
+
def column_names(table)
|
84
|
+
@connection.table_structure(table).map {|column| column['name']}
|
85
|
+
end
|
86
|
+
|
87
|
+
def column_values(table, column)
|
88
|
+
@connection.select_all("SELECT #{column} FROM #{table} ORDER BY id").map {|row| row[column]}
|
89
|
+
end
|
90
|
+
|
91
|
+
def table_indexes_without_name(table)
|
92
|
+
@connection.indexes(table).delete(:name)
|
93
|
+
end
|
94
|
+
|
95
|
+
def row_count(table)
|
96
|
+
@connection.select_one("SELECT COUNT(*) AS count FROM #{table}")['count']
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/developer'
|
3
|
+
require 'models/computer'
|
4
|
+
|
5
|
+
class SQLite3ExplainTest < ActiveRecord::SQLite3TestCase
|
6
|
+
fixtures :developers
|
7
|
+
|
8
|
+
def test_explain_for_one_query
|
9
|
+
explain = Developer.where(id: 1).explain
|
10
|
+
assert_match %r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = (?:\? \[\["id", 1\]\]|1)), explain
|
11
|
+
assert_match(/(SEARCH )?TABLE developers USING (INTEGER )?PRIMARY KEY/, explain)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_explain_with_eager_loading
|
15
|
+
explain = Developer.where(id: 1).includes(:audit_logs).explain
|
16
|
+
assert_match %r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = (?:\? \[\["id", 1\]\]|1)), explain
|
17
|
+
assert_match(/(SEARCH )?TABLE developers USING (INTEGER )?PRIMARY KEY/, explain)
|
18
|
+
assert_match %(EXPLAIN for: SELECT "audit_logs".* FROM "audit_logs" WHERE "audit_logs"."developer_id" = 1), explain
|
19
|
+
assert_match(/(SCAN )?TABLE audit_logs/, explain)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'bigdecimal'
|
3
|
+
require 'yaml'
|
4
|
+
require 'securerandom'
|
5
|
+
|
6
|
+
class SQLite3QuotingTest < ActiveRecord::SQLite3TestCase
|
7
|
+
def setup
|
8
|
+
@conn = ActiveRecord::Base.connection
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_type_cast_binary_encoding_without_logger
|
12
|
+
@conn.extend(Module.new { def logger; end })
|
13
|
+
binary = SecureRandom.hex
|
14
|
+
expected = binary.dup.encode!(Encoding::UTF_8)
|
15
|
+
assert_equal expected, @conn.type_cast(binary)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_type_cast_symbol
|
19
|
+
assert_equal 'foo', @conn.type_cast(:foo)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_type_cast_date
|
23
|
+
date = Date.today
|
24
|
+
expected = @conn.quoted_date(date)
|
25
|
+
assert_equal expected, @conn.type_cast(date)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_type_cast_time
|
29
|
+
time = Time.now
|
30
|
+
expected = @conn.quoted_date(time)
|
31
|
+
assert_equal expected, @conn.type_cast(time)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_type_cast_numeric
|
35
|
+
assert_equal 10, @conn.type_cast(10)
|
36
|
+
assert_equal 2.2, @conn.type_cast(2.2)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_type_cast_nil
|
40
|
+
assert_equal nil, @conn.type_cast(nil)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_type_cast_true
|
44
|
+
assert_equal 't', @conn.type_cast(true)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_type_cast_false
|
48
|
+
assert_equal 'f', @conn.type_cast(false)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_type_cast_bigdecimal
|
52
|
+
bd = BigDecimal.new '10.0'
|
53
|
+
assert_equal bd.to_f, @conn.type_cast(bd)
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_type_cast_unknown_should_raise_error
|
57
|
+
obj = Class.new.new
|
58
|
+
assert_raise(TypeError) { @conn.type_cast(obj) }
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_type_cast_object_which_responds_to_quoted_id
|
62
|
+
quoted_id_obj = Class.new {
|
63
|
+
def quoted_id
|
64
|
+
"'zomg'"
|
65
|
+
end
|
66
|
+
|
67
|
+
def id
|
68
|
+
10
|
69
|
+
end
|
70
|
+
}.new
|
71
|
+
assert_equal 10, @conn.type_cast(quoted_id_obj)
|
72
|
+
|
73
|
+
quoted_id_obj = Class.new {
|
74
|
+
def quoted_id
|
75
|
+
"'zomg'"
|
76
|
+
end
|
77
|
+
}.new
|
78
|
+
assert_raise(TypeError) { @conn.type_cast(quoted_id_obj) }
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_quoting_binary_strings
|
82
|
+
value = "hello".encode('ascii-8bit')
|
83
|
+
type = ActiveRecord::Type::String.new
|
84
|
+
|
85
|
+
assert_equal "'hello'", @conn.quote(type.serialize(value))
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_quoted_time_returns_date_qualified_time
|
89
|
+
value = ::Time.utc(2000, 1, 1, 12, 30, 0, 999999)
|
90
|
+
type = ActiveRecord::Type::Time.new
|
91
|
+
|
92
|
+
assert_equal "'2000-01-01 12:30:00.999999'", @conn.quote(type.serialize(value))
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_quoted_time_normalizes_date_qualified_time
|
96
|
+
value = ::Time.utc(2018, 3, 11, 12, 30, 0, 999999)
|
97
|
+
type = ActiveRecord::Type::Time.new
|
98
|
+
|
99
|
+
assert_equal "'2000-01-01 12:30:00.999999'", @conn.quote(type.serialize(value))
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,441 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/owner'
|
3
|
+
require 'tempfile'
|
4
|
+
require 'support/ddl_helper'
|
5
|
+
|
6
|
+
module ActiveRecord
|
7
|
+
module ConnectionAdapters
|
8
|
+
class SQLite3AdapterTest < ActiveRecord::SQLite3TestCase
|
9
|
+
include DdlHelper
|
10
|
+
|
11
|
+
self.use_transactional_tests = false
|
12
|
+
|
13
|
+
class DualEncoding < ActiveRecord::Base
|
14
|
+
end
|
15
|
+
|
16
|
+
def setup
|
17
|
+
@conn = Base.sqlite3_connection database: ':memory:',
|
18
|
+
adapter: 'sqlite3',
|
19
|
+
timeout: 100
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_bad_connection
|
23
|
+
assert_raise ActiveRecord::NoDatabaseError do
|
24
|
+
connection = ActiveRecord::Base.sqlite3_connection(adapter: "sqlite3", database: "/tmp/should/_not/_exist/-cinco-dog.db")
|
25
|
+
connection.drop_table 'ex', if_exists: true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
unless in_memory_db?
|
30
|
+
def test_connect_with_url
|
31
|
+
original_connection = ActiveRecord::Base.remove_connection
|
32
|
+
tf = Tempfile.open 'whatever'
|
33
|
+
url = "sqlite3:#{tf.path}"
|
34
|
+
ActiveRecord::Base.establish_connection(url)
|
35
|
+
assert ActiveRecord::Base.connection
|
36
|
+
ensure
|
37
|
+
tf.close
|
38
|
+
tf.unlink
|
39
|
+
ActiveRecord::Base.establish_connection(original_connection)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_connect_memory_with_url
|
43
|
+
original_connection = ActiveRecord::Base.remove_connection
|
44
|
+
url = "sqlite3::memory:"
|
45
|
+
ActiveRecord::Base.establish_connection(url)
|
46
|
+
assert ActiveRecord::Base.connection
|
47
|
+
ensure
|
48
|
+
ActiveRecord::Base.establish_connection(original_connection)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_valid_column
|
53
|
+
with_example_table do
|
54
|
+
column = @conn.columns('ex').find { |col| col.name == 'id' }
|
55
|
+
assert @conn.valid_type?(column.type)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# sqlite3 databases should be able to support any type and not just the
|
60
|
+
# ones mentioned in the native_database_types.
|
61
|
+
#
|
62
|
+
# Therefore test_invalid column should always return true even if the
|
63
|
+
# type is not valid.
|
64
|
+
def test_invalid_column
|
65
|
+
assert @conn.valid_type?(:foobar)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_column_types
|
69
|
+
owner = Owner.create!(name: "hello".encode('ascii-8bit'))
|
70
|
+
owner.reload
|
71
|
+
select = Owner.columns.map { |c| "typeof(#{c.name})" }.join ', '
|
72
|
+
result = Owner.connection.exec_query <<-esql
|
73
|
+
SELECT #{select}
|
74
|
+
FROM #{Owner.table_name}
|
75
|
+
WHERE #{Owner.primary_key} = #{owner.id}
|
76
|
+
esql
|
77
|
+
|
78
|
+
assert(!result.rows.first.include?("blob"), "should not store blobs")
|
79
|
+
ensure
|
80
|
+
owner.delete
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_exec_insert
|
84
|
+
with_example_table do
|
85
|
+
vals = [Relation::QueryAttribute.new("number", 10, Type::Value.new)]
|
86
|
+
@conn.exec_insert('insert into ex (number) VALUES (?)', 'SQL', vals)
|
87
|
+
|
88
|
+
result = @conn.exec_query(
|
89
|
+
'select number from ex where number = ?', 'SQL', vals)
|
90
|
+
|
91
|
+
assert_equal 1, result.rows.length
|
92
|
+
assert_equal 10, result.rows.first.first
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_primary_key_returns_nil_for_no_pk
|
97
|
+
with_example_table 'id int, data string' do
|
98
|
+
assert_nil @conn.primary_key('ex')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_connection_no_db
|
103
|
+
assert_raises(ArgumentError) do
|
104
|
+
Base.sqlite3_connection {}
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_bad_timeout
|
109
|
+
assert_raises(TypeError) do
|
110
|
+
Base.sqlite3_connection database: ':memory:',
|
111
|
+
adapter: 'sqlite3',
|
112
|
+
timeout: 'usa'
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# connection is OK with a nil timeout
|
117
|
+
def test_nil_timeout
|
118
|
+
conn = Base.sqlite3_connection database: ':memory:',
|
119
|
+
adapter: 'sqlite3',
|
120
|
+
timeout: nil
|
121
|
+
assert conn, 'made a connection'
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_connect
|
125
|
+
assert @conn, 'should have connection'
|
126
|
+
end
|
127
|
+
|
128
|
+
# sqlite3 defaults to UTF-8 encoding
|
129
|
+
def test_encoding
|
130
|
+
assert_equal 'UTF-8', @conn.encoding
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_exec_no_binds
|
134
|
+
with_example_table 'id int, data string' do
|
135
|
+
result = @conn.exec_query('SELECT id, data FROM ex')
|
136
|
+
assert_equal 0, result.rows.length
|
137
|
+
assert_equal 2, result.columns.length
|
138
|
+
assert_equal %w{ id data }, result.columns
|
139
|
+
|
140
|
+
@conn.exec_query('INSERT INTO ex (id, data) VALUES (1, "foo")')
|
141
|
+
result = @conn.exec_query('SELECT id, data FROM ex')
|
142
|
+
assert_equal 1, result.rows.length
|
143
|
+
assert_equal 2, result.columns.length
|
144
|
+
|
145
|
+
assert_equal [[1, 'foo']], result.rows
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_exec_query_with_binds
|
150
|
+
with_example_table 'id int, data string' do
|
151
|
+
@conn.exec_query('INSERT INTO ex (id, data) VALUES (1, "foo")')
|
152
|
+
result = @conn.exec_query(
|
153
|
+
'SELECT id, data FROM ex WHERE id = ?', nil, [Relation::QueryAttribute.new(nil, 1, Type::Value.new)])
|
154
|
+
|
155
|
+
assert_equal 1, result.rows.length
|
156
|
+
assert_equal 2, result.columns.length
|
157
|
+
|
158
|
+
assert_equal [[1, 'foo']], result.rows
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_exec_query_typecasts_bind_vals
|
163
|
+
with_example_table 'id int, data string' do
|
164
|
+
@conn.exec_query('INSERT INTO ex (id, data) VALUES (1, "foo")')
|
165
|
+
|
166
|
+
result = @conn.exec_query(
|
167
|
+
'SELECT id, data FROM ex WHERE id = ?', nil, [Relation::QueryAttribute.new("id", "1-fuu", Type::Integer.new)])
|
168
|
+
|
169
|
+
assert_equal 1, result.rows.length
|
170
|
+
assert_equal 2, result.columns.length
|
171
|
+
|
172
|
+
assert_equal [[1, 'foo']], result.rows
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_quote_binary_column_escapes_it
|
177
|
+
DualEncoding.connection.execute(<<-eosql)
|
178
|
+
CREATE TABLE IF NOT EXISTS dual_encodings (
|
179
|
+
id integer PRIMARY KEY AUTOINCREMENT,
|
180
|
+
name varchar(255),
|
181
|
+
data binary
|
182
|
+
)
|
183
|
+
eosql
|
184
|
+
str = "\x80".force_encoding("ASCII-8BIT")
|
185
|
+
binary = DualEncoding.new name: 'いただきます!', data: str
|
186
|
+
binary.save!
|
187
|
+
assert_equal str, binary.data
|
188
|
+
ensure
|
189
|
+
DualEncoding.connection.drop_table 'dual_encodings', if_exists: true
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_type_cast_should_not_mutate_encoding
|
193
|
+
name = 'hello'.force_encoding(Encoding::ASCII_8BIT)
|
194
|
+
Owner.create(name: name)
|
195
|
+
assert_equal Encoding::ASCII_8BIT, name.encoding
|
196
|
+
ensure
|
197
|
+
Owner.delete_all
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_execute
|
201
|
+
with_example_table do
|
202
|
+
@conn.execute "INSERT INTO ex (number) VALUES (10)"
|
203
|
+
records = @conn.execute "SELECT * FROM ex"
|
204
|
+
assert_equal 1, records.length
|
205
|
+
|
206
|
+
record = records.first
|
207
|
+
assert_equal 10, record['number']
|
208
|
+
assert_equal 1, record['id']
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
def test_quote_string
|
213
|
+
assert_equal "''", @conn.quote_string("'")
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_insert_logged
|
217
|
+
with_example_table do
|
218
|
+
sql = "INSERT INTO ex (number) VALUES (10)"
|
219
|
+
name = "foo"
|
220
|
+
assert_logged [[sql, name, []]] do
|
221
|
+
@conn.insert(sql, name)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def test_insert_id_value_returned
|
227
|
+
with_example_table do
|
228
|
+
sql = "INSERT INTO ex (number) VALUES (10)"
|
229
|
+
idval = 'vuvuzela'
|
230
|
+
id = @conn.insert(sql, nil, nil, idval)
|
231
|
+
assert_equal idval, id
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
def test_select_rows
|
236
|
+
with_example_table do
|
237
|
+
2.times do |i|
|
238
|
+
@conn.create "INSERT INTO ex (number) VALUES (#{i})"
|
239
|
+
end
|
240
|
+
rows = @conn.select_rows 'select number, id from ex'
|
241
|
+
assert_equal [[0, 1], [1, 2]], rows
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
def test_select_rows_logged
|
246
|
+
with_example_table do
|
247
|
+
sql = "select * from ex"
|
248
|
+
name = "foo"
|
249
|
+
assert_logged [[sql, name, []]] do
|
250
|
+
@conn.select_rows sql, name
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
def test_transaction
|
256
|
+
with_example_table do
|
257
|
+
count_sql = 'select count(*) from ex'
|
258
|
+
|
259
|
+
@conn.begin_db_transaction
|
260
|
+
@conn.create "INSERT INTO ex (number) VALUES (10)"
|
261
|
+
|
262
|
+
assert_equal 1, @conn.select_rows(count_sql).first.first
|
263
|
+
@conn.rollback_db_transaction
|
264
|
+
assert_equal 0, @conn.select_rows(count_sql).first.first
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
def test_tables
|
269
|
+
with_example_table do
|
270
|
+
ActiveSupport::Deprecation.silence { assert_equal %w{ ex }, @conn.tables }
|
271
|
+
with_example_table 'id integer PRIMARY KEY AUTOINCREMENT, number integer', 'people' do
|
272
|
+
ActiveSupport::Deprecation.silence { assert_equal %w{ ex people }.sort, @conn.tables.sort }
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def test_tables_logs_name
|
278
|
+
sql = <<-SQL
|
279
|
+
SELECT name FROM sqlite_master
|
280
|
+
WHERE type IN ('table','view') AND name <> 'sqlite_sequence'
|
281
|
+
SQL
|
282
|
+
assert_logged [[sql.squish, 'SCHEMA', []]] do
|
283
|
+
ActiveSupport::Deprecation.silence do
|
284
|
+
@conn.tables('hello')
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def test_indexes_logs_name
|
290
|
+
with_example_table do
|
291
|
+
assert_logged [["PRAGMA index_list(\"ex\")", 'SCHEMA', []]] do
|
292
|
+
@conn.indexes('ex', 'hello')
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
def test_table_exists_logs_name
|
298
|
+
with_example_table do
|
299
|
+
sql = <<-SQL
|
300
|
+
SELECT name FROM sqlite_master
|
301
|
+
WHERE type IN ('table','view') AND name <> 'sqlite_sequence' AND name = 'ex'
|
302
|
+
SQL
|
303
|
+
assert_logged [[sql.squish, 'SCHEMA', []]] do
|
304
|
+
ActiveSupport::Deprecation.silence do
|
305
|
+
assert @conn.table_exists?('ex')
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
def test_columns
|
312
|
+
with_example_table do
|
313
|
+
columns = @conn.columns('ex').sort_by(&:name)
|
314
|
+
assert_equal 2, columns.length
|
315
|
+
assert_equal %w{ id number }.sort, columns.map(&:name)
|
316
|
+
assert_equal [nil, nil], columns.map(&:default)
|
317
|
+
assert_equal [true, true], columns.map(&:null)
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
def test_columns_with_default
|
322
|
+
with_example_table 'id integer PRIMARY KEY AUTOINCREMENT, number integer default 10' do
|
323
|
+
column = @conn.columns('ex').find { |x|
|
324
|
+
x.name == 'number'
|
325
|
+
}
|
326
|
+
assert_equal '10', column.default
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
def test_columns_with_not_null
|
331
|
+
with_example_table 'id integer PRIMARY KEY AUTOINCREMENT, number integer not null' do
|
332
|
+
column = @conn.columns('ex').find { |x| x.name == 'number' }
|
333
|
+
assert_not column.null, "column should not be null"
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
def test_indexes_logs
|
338
|
+
with_example_table do
|
339
|
+
assert_logged [["PRAGMA index_list(\"ex\")", "SCHEMA", []]] do
|
340
|
+
@conn.indexes('ex')
|
341
|
+
end
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
def test_no_indexes
|
346
|
+
assert_equal [], @conn.indexes('items')
|
347
|
+
end
|
348
|
+
|
349
|
+
def test_index
|
350
|
+
with_example_table do
|
351
|
+
@conn.add_index 'ex', 'id', unique: true, name: 'fun'
|
352
|
+
index = @conn.indexes('ex').find { |idx| idx.name == 'fun' }
|
353
|
+
|
354
|
+
assert_equal 'ex', index.table
|
355
|
+
assert index.unique, 'index is unique'
|
356
|
+
assert_equal ['id'], index.columns
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
def test_non_unique_index
|
361
|
+
with_example_table do
|
362
|
+
@conn.add_index 'ex', 'id', name: 'fun'
|
363
|
+
index = @conn.indexes('ex').find { |idx| idx.name == 'fun' }
|
364
|
+
assert_not index.unique, 'index is not unique'
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
def test_compound_index
|
369
|
+
with_example_table do
|
370
|
+
@conn.add_index 'ex', %w{ id number }, name: 'fun'
|
371
|
+
index = @conn.indexes('ex').find { |idx| idx.name == 'fun' }
|
372
|
+
assert_equal %w{ id number }.sort, index.columns.sort
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
376
|
+
def test_primary_key
|
377
|
+
with_example_table do
|
378
|
+
assert_equal 'id', @conn.primary_key('ex')
|
379
|
+
with_example_table 'internet integer PRIMARY KEY AUTOINCREMENT, number integer not null', 'foos' do
|
380
|
+
assert_equal 'internet', @conn.primary_key('foos')
|
381
|
+
end
|
382
|
+
end
|
383
|
+
end
|
384
|
+
|
385
|
+
def test_no_primary_key
|
386
|
+
with_example_table 'number integer not null' do
|
387
|
+
assert_nil @conn.primary_key('ex')
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
391
|
+
def test_supports_extensions
|
392
|
+
assert_not @conn.supports_extensions?, 'does not support extensions'
|
393
|
+
end
|
394
|
+
|
395
|
+
def test_respond_to_enable_extension
|
396
|
+
assert @conn.respond_to?(:enable_extension)
|
397
|
+
end
|
398
|
+
|
399
|
+
def test_respond_to_disable_extension
|
400
|
+
assert @conn.respond_to?(:disable_extension)
|
401
|
+
end
|
402
|
+
|
403
|
+
def test_statement_closed
|
404
|
+
db = ::SQLite3::Database.new(ActiveRecord::Base.
|
405
|
+
configurations['arunit']['database'])
|
406
|
+
statement = ::SQLite3::Statement.new(db,
|
407
|
+
'CREATE TABLE statement_test (number integer not null)')
|
408
|
+
statement.stub(:step, ->{ raise ::SQLite3::BusyException.new('busy') }) do
|
409
|
+
assert_called(statement, :columns, returns: []) do
|
410
|
+
assert_called(statement, :close) do
|
411
|
+
::SQLite3::Statement.stub(:new, statement) do
|
412
|
+
assert_raises ActiveRecord::StatementInvalid do
|
413
|
+
@conn.exec_query 'select * from statement_test'
|
414
|
+
end
|
415
|
+
end
|
416
|
+
end
|
417
|
+
end
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
421
|
+
private
|
422
|
+
|
423
|
+
def assert_logged logs
|
424
|
+
subscriber = SQLSubscriber.new
|
425
|
+
subscription = ActiveSupport::Notifications.subscribe('sql.active_record', subscriber)
|
426
|
+
yield
|
427
|
+
assert_equal logs, subscriber.logged
|
428
|
+
ensure
|
429
|
+
ActiveSupport::Notifications.unsubscribe(subscription)
|
430
|
+
end
|
431
|
+
|
432
|
+
def with_example_table(definition = nil, table_name = 'ex', &block)
|
433
|
+
definition ||= <<-SQL
|
434
|
+
id integer PRIMARY KEY AUTOINCREMENT,
|
435
|
+
number integer
|
436
|
+
SQL
|
437
|
+
super(@conn, table_name, definition, &block)
|
438
|
+
end
|
439
|
+
end
|
440
|
+
end
|
441
|
+
end
|