ibm_db 3.0.4-x86-mingw32 → 3.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 +4 -4
- data/CHANGES +4 -1
- data/LICENSE +1 -1
- data/MANIFEST +14 -14
- data/README +225 -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 -11884
- 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 +3177 -3177
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
- data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
- data/lib/mswin32/ibm_db.rb +122 -122
- 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/active_record/connection_adapters/fake_adapter.rb +46 -46
- data/test/assets/example.log +1 -1
- data/test/assets/test.txt +1 -1
- data/test/cases/adapter_test.rb +276 -261
- data/test/cases/aggregations_test.rb +158 -158
- data/test/cases/ar_schema_test.rb +161 -161
- data/test/cases/associations/association_scope_test.rb +21 -21
- data/test/cases/associations/belongs_to_associations_test.rb +1029 -1029
- data/test/cases/associations/callbacks_test.rb +192 -192
- data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
- data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -26
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
- data/test/cases/associations/eager_load_nested_include_test.rb +128 -128
- data/test/cases/associations/eager_singularization_test.rb +148 -148
- data/test/cases/associations/eager_test.rb +1429 -1411
- data/test/cases/associations/extension_test.rb +82 -82
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +972 -932
- data/test/cases/associations/has_many_associations_test.rb +2182 -2162
- data/test/cases/associations/has_many_through_associations_test.rb +1204 -1204
- data/test/cases/associations/has_one_associations_test.rb +610 -610
- data/test/cases/associations/has_one_through_associations_test.rb +380 -380
- data/test/cases/associations/inner_join_association_test.rb +139 -139
- data/test/cases/associations/inverse_associations_test.rb +706 -693
- data/test/cases/associations/join_model_test.rb +754 -754
- data/test/cases/associations/nested_through_associations_test.rb +579 -579
- data/test/cases/associations/required_test.rb +82 -82
- data/test/cases/associations_test.rb +380 -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/serialization_test.rb +29 -29
- data/test/cases/attribute_methods_test.rb +952 -952
- data/test/cases/attribute_set_test.rb +210 -200
- data/test/cases/attribute_test.rb +180 -180
- data/test/cases/attributes_test.rb +136 -136
- data/test/cases/autosave_association_test.rb +1595 -1595
- data/test/cases/base_test.rb +1664 -1638
- data/test/cases/batches_test.rb +212 -212
- data/test/cases/binary_test.rb +52 -52
- data/test/cases/bind_parameter_test.rb +100 -100
- data/test/cases/calculations_test.rb +646 -646
- data/test/cases/callbacks_test.rb +543 -543
- data/test/cases/clone_test.rb +40 -40
- data/test/cases/coders/yaml_column_test.rb +63 -63
- data/test/cases/column_alias_test.rb +17 -17
- data/test/cases/column_definition_test.rb +123 -123
- data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -54
- data/test/cases/connection_adapters/connection_handler_test.rb +53 -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 +293 -293
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -65
- data/test/cases/connection_adapters/quoting_test.rb +13 -13
- data/test/cases/connection_adapters/schema_cache_test.rb +56 -56
- data/test/cases/connection_adapters/type_lookup_test.rb +110 -110
- data/test/cases/connection_management_test.rb +122 -122
- data/test/cases/connection_pool_test.rb +346 -346
- data/test/cases/connection_specification/resolver_test.rb +116 -116
- data/test/cases/core_test.rb +112 -112
- data/test/cases/counter_cache_test.rb +209 -209
- data/test/cases/custom_locking_test.rb +17 -17
- data/test/cases/database_statements_test.rb +19 -19
- data/test/cases/date_time_test.rb +61 -61
- data/test/cases/defaults_test.rb +223 -223
- data/test/cases/dirty_test.rb +785 -775
- data/test/cases/disconnected_test.rb +28 -28
- data/test/cases/dup_test.rb +157 -157
- data/test/cases/enum_test.rb +290 -290
- data/test/cases/explain_subscriber_test.rb +64 -64
- data/test/cases/explain_test.rb +76 -76
- data/test/cases/finder_respond_to_test.rb +60 -60
- data/test/cases/finder_test.rb +1169 -1166
- data/test/cases/fixture_set/file_test.rb +138 -138
- data/test/cases/fixtures_test.rb +908 -897
- data/test/cases/forbidden_attributes_protection_test.rb +99 -99
- data/test/cases/habtm_destroy_order_test.rb +61 -61
- data/test/cases/helper.rb +210 -210
- data/test/cases/hot_compatibility_test.rb +54 -54
- data/test/cases/i18n_test.rb +45 -45
- data/test/cases/inheritance_test.rb +375 -375
- data/test/cases/integration_test.rb +139 -139
- data/test/cases/invalid_connection_test.rb +22 -22
- data/test/cases/invalid_date_test.rb +32 -32
- data/test/cases/invertible_migration_test.rb +295 -295
- data/test/cases/json_serialization_test.rb +302 -302
- data/test/cases/locking_test.rb +477 -477
- data/test/cases/log_subscriber_test.rb +136 -136
- data/test/cases/migration/change_schema_test - Copy.rb +448 -448
- data/test/cases/migration/change_schema_test.rb +512 -472
- data/test/cases/migration/change_table_test.rb +224 -224
- data/test/cases/migration/column_attributes_test.rb +192 -192
- data/test/cases/migration/column_positioning_test.rb +56 -56
- data/test/cases/migration/columns_test.rb +304 -304
- data/test/cases/migration/command_recorder_test.rb +305 -305
- data/test/cases/migration/create_join_table_test.rb +148 -148
- data/test/cases/migration/foreign_key_test - Changed.rb +325 -325
- data/test/cases/migration/foreign_key_test.rb +328 -360
- data/test/cases/migration/helper.rb +39 -39
- data/test/cases/migration/index_test.rb +216 -216
- data/test/cases/migration/logger_test.rb +36 -36
- data/test/cases/migration/pending_migrations_test.rb +53 -53
- data/test/cases/migration/references_foreign_key_test.rb +169 -214
- data/test/cases/migration/references_index_test.rb +101 -101
- data/test/cases/migration/references_statements_test.rb +116 -116
- data/test/cases/migration/rename_table_test.rb +93 -93
- data/test/cases/migration/table_and_index_test.rb +24 -24
- data/test/cases/migration_test.rb +959 -959
- data/test/cases/migrator_test.rb +388 -388
- data/test/cases/mixin_test.rb +70 -70
- data/test/cases/modules_test.rb +173 -173
- data/test/cases/multiparameter_attributes_test.rb +350 -350
- data/test/cases/multiple_db_test.rb +115 -115
- data/test/cases/nested_attributes_test.rb +1070 -1057
- data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
- data/test/cases/persistence_test.rb +909 -909
- data/test/cases/pooled_connections_test.rb +81 -81
- data/test/cases/primary_keys_test.rb +237 -237
- data/test/cases/query_cache_test.rb +326 -326
- data/test/cases/quoting_test.rb +156 -156
- data/test/cases/readonly_test.rb +118 -118
- data/test/cases/reaper_test.rb +85 -85
- data/test/cases/reflection_test.rb +463 -454
- data/test/cases/relation/delegation_test.rb +68 -68
- data/test/cases/relation/merging_test.rb +161 -161
- data/test/cases/relation/mutation_test.rb +165 -165
- data/test/cases/relation/predicate_builder_test.rb +14 -14
- data/test/cases/relation/where_chain_test.rb +181 -181
- data/test/cases/relation/where_test.rb +300 -300
- data/test/cases/relation/where_test2.rb +36 -36
- data/test/cases/relation_test.rb +319 -297
- data/test/cases/relations_test.rb +1815 -1815
- data/test/cases/reload_models_test.rb +22 -22
- data/test/cases/result_test.rb +80 -80
- data/test/cases/sanitize_test.rb +83 -83
- data/test/cases/schema_dumper_test.rb +463 -463
- data/test/cases/scoping/default_scoping_test.rb +454 -454
- data/test/cases/scoping/named_scoping_test.rb +524 -524
- data/test/cases/scoping/relation_scoping_test.rb +357 -357
- data/test/cases/serialization_test.rb +104 -104
- data/test/cases/serialized_attribute_test.rb +277 -277
- data/test/cases/statement_cache_test.rb +98 -98
- data/test/cases/store_test.rb +194 -194
- data/test/cases/tasks/database_tasks_test.rb +398 -396
- data/test/cases/tasks/mysql_rake_test.rb +324 -311
- data/test/cases/tasks/postgresql_rake_test.rb +250 -245
- data/test/cases/tasks/sqlite_rake_test.rb +193 -193
- data/test/cases/test_case.rb +123 -123
- data/test/cases/timestamp_test.rb +467 -468
- data/test/cases/transaction_callbacks_test.rb +452 -452
- data/test/cases/transaction_isolation_test.rb +106 -106
- data/test/cases/transactions_test.rb +817 -817
- data/test/cases/type/decimal_test.rb +56 -51
- data/test/cases/type/integer_test.rb +121 -121
- data/test/cases/type/string_test.rb +36 -36
- data/test/cases/type/type_map_test.rb +177 -177
- data/test/cases/type/unsigned_integer_test.rb +18 -18
- data/test/cases/types_test.rb +141 -141
- data/test/cases/unconnected_test.rb +33 -33
- data/test/cases/validations/association_validation_test.rb +86 -86
- data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
- data/test/cases/validations/i18n_validation_test.rb +90 -90
- data/test/cases/validations/length_validation_test.rb +47 -47
- data/test/cases/validations/presence_validation_test.rb +68 -68
- data/test/cases/validations/uniqueness_validation_test.rb +457 -434
- data/test/cases/validations_repair_helper.rb +23 -23
- data/test/cases/validations_test.rb +165 -165
- data/test/cases/view_test.rb +119 -113
- data/test/cases/xml_serialization_test.rb +457 -457
- data/test/cases/yaml_serialization_test.rb +126 -86
- data/test/config.rb +5 -5
- data/test/config.yml +154 -154
- data/test/connections/native_ibm_db/connection.rb +43 -43
- data/test/fixtures/accounts.yml +29 -29
- data/test/fixtures/admin/accounts.yml +2 -2
- data/test/fixtures/admin/randomly_named_a9.yml +7 -7
- data/test/fixtures/admin/randomly_named_b0.yml +7 -7
- data/test/fixtures/admin/users.yml +10 -10
- data/test/fixtures/author_addresses.yml +17 -17
- data/test/fixtures/author_favorites.yml +3 -3
- data/test/fixtures/authors.yml +23 -23
- data/test/fixtures/binaries.yml +133 -133
- data/test/fixtures/books.yml +11 -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/courses.yml +8 -8
- data/test/fixtures/customers.yml +25 -25
- data/test/fixtures/dashboards.yml +6 -6
- data/test/fixtures/developers.yml +21 -21
- 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/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/csv/accounts.csv +1 -1
- 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/organizations.yml +5 -5
- 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 +12 -12
- data/test/fixtures/posts.yml +80 -80
- data/test/fixtures/price_estimates.yml +7 -7
- data/test/fixtures/products.yml +4 -4
- data/test/fixtures/projects.yml +7 -7
- data/test/fixtures/randomly_named_a9.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/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/ibm_db_test.rb +24 -24
- 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 +8 -8
- data/test/migrations/missing/1_people_have_last_names.rb +8 -8
- data/test/migrations/missing/3_we_need_reminders.rb +11 -11
- data/test/migrations/missing/4_innocent_jointable.rb +11 -11
- data/test/migrations/rename/1_we_need_things.rb +10 -10
- data/test/migrations/rename/2_rename_things.rb +8 -8
- 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 +11 -11
- data/test/migrations/valid/3_innocent_jointable.rb +11 -11
- 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 +11 -11
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +11 -11
- 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 +4 -4
- data/test/models/admin/account.rb +2 -2
- data/test/models/admin/randomly_named_c1.rb +3 -3
- data/test/models/admin/user.rb +40 -40
- data/test/models/aircraft.rb +4 -4
- data/test/models/arunit2_model.rb +3 -3
- data/test/models/author.rb +212 -212
- data/test/models/auto_id.rb +4 -4
- data/test/models/autoloadable/extra_firm.rb +2 -2
- data/test/models/binary.rb +1 -1
- data/test/models/bird.rb +12 -12
- data/test/models/book.rb +18 -18
- data/test/models/boolean.rb +2 -2
- data/test/models/bulb.rb +51 -51
- data/test/models/cake_designer.rb +3 -3
- data/test/models/car.rb +26 -26
- data/test/models/carrier.rb +2 -2
- data/test/models/categorization.rb +19 -19
- data/test/models/category.rb +35 -35
- data/test/models/chef.rb +7 -3
- data/test/models/citation.rb +3 -3
- data/test/models/club.rb +23 -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 +64 -64
- data/test/models/company.rb +228 -225
- 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/contract.rb +20 -20
- data/test/models/country.rb +7 -7
- data/test/models/course.rb +6 -6
- data/test/models/customer.rb +77 -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 +255 -252
- 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 +2 -2
- 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 +1 -1
- data/test/models/hotel.rb +9 -6
- 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 +41 -41
- data/test/models/member_detail.rb +7 -7
- data/test/models/member_type.rb +3 -3
- data/test/models/membership.rb +35 -35
- 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/molecule.rb +6 -6
- data/test/models/movie.rb +5 -5
- data/test/models/order.rb +4 -4
- data/test/models/organization.rb +14 -14
- data/test/models/owner.rb +34 -34
- data/test/models/parrot.rb +29 -29
- data/test/models/person.rb +143 -143
- data/test/models/personal_legacy_thing.rb +4 -4
- data/test/models/pet.rb +15 -15
- data/test/models/pirate.rb +92 -92
- data/test/models/possession.rb +3 -3
- data/test/models/post.rb +264 -264
- data/test/models/price_estimate.rb +4 -4
- data/test/models/professor.rb +5 -5
- data/test/models/project.rb +31 -29
- 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 +3 -3
- data/test/models/rating.rb +4 -4
- data/test/models/reader.rb +23 -23
- 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 +33 -33
- data/test/models/ship_part.rb +7 -7
- 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 +7 -7
- data/test/models/tagging.rb +13 -13
- data/test/models/task.rb +5 -5
- data/test/models/topic.rb +124 -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/tyre.rb +11 -11
- data/test/models/uuid_child.rb +3 -3
- 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 +58 -58
- data/test/schema/mysql_specific_schema.rb +70 -70
- data/test/schema/oracle_specific_schema.rb +43 -43
- data/test/schema/postgresql_specific_schema.rb +202 -202
- data/test/schema/schema.rb +952 -938
- data/test/schema/sqlite_specific_schema.rb +21 -21
- data/test/support/config.rb +43 -43
- data/test/support/connection.rb +22 -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
- metadata +2 -2
@@ -1,136 +1,136 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require "models/binary"
|
3
|
-
require "models/developer"
|
4
|
-
require "models/post"
|
5
|
-
require "active_support/log_subscriber/test_helper"
|
6
|
-
|
7
|
-
class LogSubscriberTest < ActiveRecord::TestCase
|
8
|
-
include ActiveSupport::LogSubscriber::TestHelper
|
9
|
-
include ActiveSupport::Logger::Severity
|
10
|
-
|
11
|
-
class TestDebugLogSubscriber < ActiveRecord::LogSubscriber
|
12
|
-
attr_reader :debugs
|
13
|
-
|
14
|
-
def initialize
|
15
|
-
@debugs = []
|
16
|
-
super
|
17
|
-
end
|
18
|
-
|
19
|
-
def debug message
|
20
|
-
@debugs << message
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
fixtures :posts
|
25
|
-
|
26
|
-
def setup
|
27
|
-
@old_logger = ActiveRecord::Base.logger
|
28
|
-
Developer.primary_key
|
29
|
-
super
|
30
|
-
ActiveRecord::LogSubscriber.attach_to(:active_record)
|
31
|
-
end
|
32
|
-
|
33
|
-
def teardown
|
34
|
-
super
|
35
|
-
ActiveRecord::LogSubscriber.log_subscribers.pop
|
36
|
-
ActiveRecord::Base.logger = @old_logger
|
37
|
-
end
|
38
|
-
|
39
|
-
def set_logger(logger)
|
40
|
-
ActiveRecord::Base.logger = logger
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_schema_statements_are_ignored
|
44
|
-
event = Struct.new(:duration, :payload)
|
45
|
-
|
46
|
-
logger = TestDebugLogSubscriber.new
|
47
|
-
assert_equal 0, logger.debugs.length
|
48
|
-
|
49
|
-
logger.sql(event.new(0, sql: 'hi mom!'))
|
50
|
-
assert_equal 1, logger.debugs.length
|
51
|
-
|
52
|
-
logger.sql(event.new(0, sql: 'hi mom!', name: 'foo'))
|
53
|
-
assert_equal 2, logger.debugs.length
|
54
|
-
|
55
|
-
logger.sql(event.new(0, sql: 'hi mom!', name: 'SCHEMA'))
|
56
|
-
assert_equal 2, logger.debugs.length
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_sql_statements_are_not_squeezed
|
60
|
-
event = Struct.new(:duration, :payload)
|
61
|
-
logger = TestDebugLogSubscriber.new
|
62
|
-
logger.sql(event.new(0, sql: 'ruby rails'))
|
63
|
-
assert_match(/ruby rails/, logger.debugs.first)
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_ignore_binds_payload_with_nil_column
|
67
|
-
event = Struct.new(:duration, :payload)
|
68
|
-
|
69
|
-
logger = TestDebugLogSubscriber.new
|
70
|
-
logger.sql(event.new(0, sql: 'hi mom!', binds: [[nil, 1]]))
|
71
|
-
assert_equal 1, logger.debugs.length
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_basic_query_logging
|
75
|
-
Developer.all.load
|
76
|
-
wait
|
77
|
-
assert_equal 1, @logger.logged(:debug).size
|
78
|
-
assert_match(/Developer Load/, @logger.logged(:debug).last)
|
79
|
-
assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_exists_query_logging
|
83
|
-
Developer.exists? 1
|
84
|
-
wait
|
85
|
-
assert_equal 1, @logger.logged(:debug).size
|
86
|
-
assert_match(/Developer Exists/, @logger.logged(:debug).last)
|
87
|
-
assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
|
88
|
-
end
|
89
|
-
|
90
|
-
def test_cached_queries
|
91
|
-
ActiveRecord::Base.cache do
|
92
|
-
Developer.all.load
|
93
|
-
Developer.all.load
|
94
|
-
end
|
95
|
-
wait
|
96
|
-
assert_equal 2, @logger.logged(:debug).size
|
97
|
-
assert_match(/CACHE/, @logger.logged(:debug).last)
|
98
|
-
assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_basic_query_doesnt_log_when_level_is_not_debug
|
102
|
-
@logger.level = INFO
|
103
|
-
Developer.all.load
|
104
|
-
wait
|
105
|
-
assert_equal 0, @logger.logged(:debug).size
|
106
|
-
end
|
107
|
-
|
108
|
-
def test_cached_queries_doesnt_log_when_level_is_not_debug
|
109
|
-
@logger.level = INFO
|
110
|
-
ActiveRecord::Base.cache do
|
111
|
-
Developer.all.load
|
112
|
-
Developer.all.load
|
113
|
-
end
|
114
|
-
wait
|
115
|
-
assert_equal 0, @logger.logged(:debug).size
|
116
|
-
end
|
117
|
-
|
118
|
-
def test_initializes_runtime
|
119
|
-
Thread.new { assert_equal 0, ActiveRecord::LogSubscriber.runtime }.join
|
120
|
-
end
|
121
|
-
|
122
|
-
unless current_adapter?(:Mysql2Adapter)
|
123
|
-
def test_binary_data_is_not_logged
|
124
|
-
Binary.create(data: 'some binary data')
|
125
|
-
wait
|
126
|
-
assert_match(/<16 bytes of binary data>/, @logger.logged(:debug).join)
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_nil_binary_data_is_logged
|
130
|
-
binary = Binary.create(data: "")
|
131
|
-
binary.update_attributes(data: nil)
|
132
|
-
wait
|
133
|
-
assert_match(/<NULL binary data>/, @logger.logged(:debug).join)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
1
|
+
require "cases/helper"
|
2
|
+
require "models/binary"
|
3
|
+
require "models/developer"
|
4
|
+
require "models/post"
|
5
|
+
require "active_support/log_subscriber/test_helper"
|
6
|
+
|
7
|
+
class LogSubscriberTest < ActiveRecord::TestCase
|
8
|
+
include ActiveSupport::LogSubscriber::TestHelper
|
9
|
+
include ActiveSupport::Logger::Severity
|
10
|
+
|
11
|
+
class TestDebugLogSubscriber < ActiveRecord::LogSubscriber
|
12
|
+
attr_reader :debugs
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@debugs = []
|
16
|
+
super
|
17
|
+
end
|
18
|
+
|
19
|
+
def debug message
|
20
|
+
@debugs << message
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
fixtures :posts
|
25
|
+
|
26
|
+
def setup
|
27
|
+
@old_logger = ActiveRecord::Base.logger
|
28
|
+
Developer.primary_key
|
29
|
+
super
|
30
|
+
ActiveRecord::LogSubscriber.attach_to(:active_record)
|
31
|
+
end
|
32
|
+
|
33
|
+
def teardown
|
34
|
+
super
|
35
|
+
ActiveRecord::LogSubscriber.log_subscribers.pop
|
36
|
+
ActiveRecord::Base.logger = @old_logger
|
37
|
+
end
|
38
|
+
|
39
|
+
def set_logger(logger)
|
40
|
+
ActiveRecord::Base.logger = logger
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_schema_statements_are_ignored
|
44
|
+
event = Struct.new(:duration, :payload)
|
45
|
+
|
46
|
+
logger = TestDebugLogSubscriber.new
|
47
|
+
assert_equal 0, logger.debugs.length
|
48
|
+
|
49
|
+
logger.sql(event.new(0, sql: 'hi mom!'))
|
50
|
+
assert_equal 1, logger.debugs.length
|
51
|
+
|
52
|
+
logger.sql(event.new(0, sql: 'hi mom!', name: 'foo'))
|
53
|
+
assert_equal 2, logger.debugs.length
|
54
|
+
|
55
|
+
logger.sql(event.new(0, sql: 'hi mom!', name: 'SCHEMA'))
|
56
|
+
assert_equal 2, logger.debugs.length
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_sql_statements_are_not_squeezed
|
60
|
+
event = Struct.new(:duration, :payload)
|
61
|
+
logger = TestDebugLogSubscriber.new
|
62
|
+
logger.sql(event.new(0, sql: 'ruby rails'))
|
63
|
+
assert_match(/ruby rails/, logger.debugs.first)
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_ignore_binds_payload_with_nil_column
|
67
|
+
event = Struct.new(:duration, :payload)
|
68
|
+
|
69
|
+
logger = TestDebugLogSubscriber.new
|
70
|
+
logger.sql(event.new(0, sql: 'hi mom!', binds: [[nil, 1]]))
|
71
|
+
assert_equal 1, logger.debugs.length
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_basic_query_logging
|
75
|
+
Developer.all.load
|
76
|
+
wait
|
77
|
+
assert_equal 1, @logger.logged(:debug).size
|
78
|
+
assert_match(/Developer Load/, @logger.logged(:debug).last)
|
79
|
+
assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_exists_query_logging
|
83
|
+
Developer.exists? 1
|
84
|
+
wait
|
85
|
+
assert_equal 1, @logger.logged(:debug).size
|
86
|
+
assert_match(/Developer Exists/, @logger.logged(:debug).last)
|
87
|
+
assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_cached_queries
|
91
|
+
ActiveRecord::Base.cache do
|
92
|
+
Developer.all.load
|
93
|
+
Developer.all.load
|
94
|
+
end
|
95
|
+
wait
|
96
|
+
assert_equal 2, @logger.logged(:debug).size
|
97
|
+
assert_match(/CACHE/, @logger.logged(:debug).last)
|
98
|
+
assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_basic_query_doesnt_log_when_level_is_not_debug
|
102
|
+
@logger.level = INFO
|
103
|
+
Developer.all.load
|
104
|
+
wait
|
105
|
+
assert_equal 0, @logger.logged(:debug).size
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_cached_queries_doesnt_log_when_level_is_not_debug
|
109
|
+
@logger.level = INFO
|
110
|
+
ActiveRecord::Base.cache do
|
111
|
+
Developer.all.load
|
112
|
+
Developer.all.load
|
113
|
+
end
|
114
|
+
wait
|
115
|
+
assert_equal 0, @logger.logged(:debug).size
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_initializes_runtime
|
119
|
+
Thread.new { assert_equal 0, ActiveRecord::LogSubscriber.runtime }.join
|
120
|
+
end
|
121
|
+
|
122
|
+
unless current_adapter?(:Mysql2Adapter)
|
123
|
+
def test_binary_data_is_not_logged
|
124
|
+
Binary.create(data: 'some binary data')
|
125
|
+
wait
|
126
|
+
assert_match(/<16 bytes of binary data>/, @logger.logged(:debug).join)
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_nil_binary_data_is_logged
|
130
|
+
binary = Binary.create(data: "")
|
131
|
+
binary.update_attributes(data: nil)
|
132
|
+
wait
|
133
|
+
assert_match(/<NULL binary data>/, @logger.logged(:debug).join)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -1,448 +1,448 @@
|
|
1
|
-
require 'cases/helper'
|
2
|
-
|
3
|
-
module ActiveRecord
|
4
|
-
class Migration
|
5
|
-
class ChangeSchemaTest < ActiveRecord::TestCase
|
6
|
-
attr_reader :connection, :table_name
|
7
|
-
|
8
|
-
def setup
|
9
|
-
super
|
10
|
-
@connection = ActiveRecord::Base.connection
|
11
|
-
@table_name = :testings
|
12
|
-
end
|
13
|
-
|
14
|
-
teardown do
|
15
|
-
connection.drop_table :testings rescue nil
|
16
|
-
ActiveRecord::Base.primary_key_prefix_type = nil
|
17
|
-
ActiveRecord::Base.clear_cache!
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_create_table_without_id
|
21
|
-
testing_table_with_only_foo_attribute do
|
22
|
-
assert_equal connection.columns(:testings).size, 1
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
unless current_adapter?(:IBM_DBAdapter)
|
27
|
-
# For DB2: Cannot add a primary key to a table with some rows already in it as it violates the unique constraint
|
28
|
-
# Secondly GENERATED BY DEFAULT AS IDENTITY cannot be applied in a alter table command.
|
29
|
-
# as this will be wrong sql syntax for DB
|
30
|
-
def test_add_column_with_primary_key_attribute
|
31
|
-
testing_table_with_only_foo_attribute do
|
32
|
-
connection.add_column :testings, :id, :primary_key
|
33
|
-
assert_equal connection.columns(:testings).size, 2
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_create_table_adds_id
|
39
|
-
connection.create_table :testings do |t|
|
40
|
-
t.column :foo, :string
|
41
|
-
end
|
42
|
-
|
43
|
-
assert_equal %w(id foo), connection.columns(:testings).map(&:name)
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_create_table_with_not_null_column
|
47
|
-
connection.create_table :testings do |t|
|
48
|
-
t.column :foo, :string, :null => false
|
49
|
-
end
|
50
|
-
|
51
|
-
assert_raises(ActiveRecord::StatementInvalid) do
|
52
|
-
connection.execute "insert into testings (foo) values (NULL)"
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_create_table_with_defaults
|
57
|
-
# MySQL doesn't allow defaults on TEXT or BLOB columns.
|
58
|
-
mysql = current_adapter?(:MysqlAdapter, :Mysql2Adapter)
|
59
|
-
|
60
|
-
connection.create_table :testings do |t|
|
61
|
-
t.column :one, :string, :default => "hello"
|
62
|
-
t.column :two, :boolean, :default => true
|
63
|
-
t.column :three, :boolean, :default => false
|
64
|
-
t.column :four, :integer, :default => 1
|
65
|
-
t.column :five, :text, :default => "hello" unless mysql
|
66
|
-
end
|
67
|
-
|
68
|
-
columns = connection.columns(:testings)
|
69
|
-
one = columns.detect { |c| c.name == "one" }
|
70
|
-
two = columns.detect { |c| c.name == "two" }
|
71
|
-
three = columns.detect { |c| c.name == "three" }
|
72
|
-
four = columns.detect { |c| c.name == "four" }
|
73
|
-
five = columns.detect { |c| c.name == "five" } unless mysql
|
74
|
-
|
75
|
-
assert_equal "hello", one.default
|
76
|
-
assert_equal true, two.type_cast_from_database(two.default)
|
77
|
-
assert_equal false, three.type_cast_from_database(three.default)
|
78
|
-
assert_equal '1', four.default
|
79
|
-
assert_equal "hello", five.default unless mysql
|
80
|
-
end
|
81
|
-
|
82
|
-
if current_adapter?(:PostgreSQLAdapter)
|
83
|
-
def test_add_column_with_array
|
84
|
-
connection.create_table :testings
|
85
|
-
connection.add_column :testings, :foo, :string, :array => true
|
86
|
-
|
87
|
-
columns = connection.columns(:testings)
|
88
|
-
array_column = columns.detect { |c| c.name == "foo" }
|
89
|
-
|
90
|
-
assert array_column.array
|
91
|
-
end
|
92
|
-
|
93
|
-
def test_create_table_with_array_column
|
94
|
-
connection.create_table :testings do |t|
|
95
|
-
t.string :foo, :array => true
|
96
|
-
end
|
97
|
-
|
98
|
-
columns = connection.columns(:testings)
|
99
|
-
array_column = columns.detect { |c| c.name == "foo" }
|
100
|
-
|
101
|
-
assert array_column.array
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def test_create_table_with_bigint
|
106
|
-
connection.create_table :testings do |t|
|
107
|
-
t.bigint :eight_int
|
108
|
-
end
|
109
|
-
columns = connection.columns(:testings)
|
110
|
-
eight = columns.detect { |c| c.name == "eight_int" }
|
111
|
-
|
112
|
-
if current_adapter?(:OracleAdapter)
|
113
|
-
assert_equal 'NUMBER(19)', eight.sql_type
|
114
|
-
elsif current_adapter?(:SQLite3Adapter)
|
115
|
-
assert_equal 'bigint', eight.sql_type
|
116
|
-
else
|
117
|
-
assert_equal :integer, eight.type
|
118
|
-
assert_equal 8, eight.limit
|
119
|
-
end
|
120
|
-
ensure
|
121
|
-
connection.drop_table :testings
|
122
|
-
end
|
123
|
-
|
124
|
-
def test_create_table_with_limits
|
125
|
-
connection.create_table :testings do |t|
|
126
|
-
t.column :foo, :string, :limit => 255
|
127
|
-
|
128
|
-
t.column :default_int, :integer
|
129
|
-
|
130
|
-
t.column :one_int, :integer, :limit => 1
|
131
|
-
t.column :four_int, :integer, :limit => 4
|
132
|
-
t.column :eight_int, :integer, :limit => 8
|
133
|
-
end
|
134
|
-
|
135
|
-
columns = connection.columns(:testings)
|
136
|
-
foo = columns.detect { |c| c.name == "foo" }
|
137
|
-
assert_equal 255, foo.limit
|
138
|
-
|
139
|
-
default = columns.detect { |c| c.name == "default_int" }
|
140
|
-
one = columns.detect { |c| c.name == "one_int" }
|
141
|
-
four = columns.detect { |c| c.name == "four_int" }
|
142
|
-
eight = columns.detect { |c| c.name == "eight_int" }
|
143
|
-
|
144
|
-
if current_adapter?(:PostgreSQLAdapter)
|
145
|
-
assert_equal 'integer', default.sql_type
|
146
|
-
assert_equal 'smallint', one.sql_type
|
147
|
-
assert_equal 'integer', four.sql_type
|
148
|
-
assert_equal 'bigint', eight.sql_type
|
149
|
-
elsif current_adapter?(:MysqlAdapter, :Mysql2Adapter)
|
150
|
-
assert_match 'int(11)', default.sql_type
|
151
|
-
assert_match 'tinyint', one.sql_type
|
152
|
-
assert_match 'int', four.sql_type
|
153
|
-
assert_match 'bigint', eight.sql_type
|
154
|
-
elsif current_adapter?(:OracleAdapter)
|
155
|
-
assert_equal 'NUMBER(38)', default.sql_type
|
156
|
-
assert_equal 'NUMBER(1)', one.sql_type
|
157
|
-
assert_equal 'NUMBER(4)', four.sql_type
|
158
|
-
assert_equal 'NUMBER(8)', eight.sql_type
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
def test_create_table_with_primary_key_prefix_as_table_name_with_underscore
|
163
|
-
ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
|
164
|
-
|
165
|
-
connection.create_table :testings do |t|
|
166
|
-
t.column :foo, :string
|
167
|
-
end
|
168
|
-
|
169
|
-
assert_equal %w(testing_id foo), connection.columns(:testings).map(&:name)
|
170
|
-
end
|
171
|
-
|
172
|
-
def test_create_table_with_primary_key_prefix_as_table_name
|
173
|
-
ActiveRecord::Base.primary_key_prefix_type = :table_name
|
174
|
-
|
175
|
-
connection.create_table :testings do |t|
|
176
|
-
t.column :foo, :string
|
177
|
-
end
|
178
|
-
|
179
|
-
assert_equal %w(testingid foo), connection.columns(:testings).map(&:name)
|
180
|
-
end
|
181
|
-
|
182
|
-
def test_create_table_raises_when_redefining_primary_key_column
|
183
|
-
error = assert_raise(ArgumentError) do
|
184
|
-
connection.create_table :testings do |t|
|
185
|
-
t.column :id, :string
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
assert_equal "you can't redefine the primary key column 'id'. To define a custom primary key, pass { id: false } to create_table.", error.message
|
190
|
-
end
|
191
|
-
|
192
|
-
def test_create_table_raises_when_redefining_custom_primary_key_column
|
193
|
-
error = assert_raise(ArgumentError) do
|
194
|
-
connection.create_table :testings, primary_key: :testing_id do |t|
|
195
|
-
t.column :testing_id, :string
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
assert_equal "you can't redefine the primary key column 'testing_id'. To define a custom primary key, pass { id: false } to create_table.", error.message
|
200
|
-
end
|
201
|
-
|
202
|
-
def test_create_table_with_timestamps_should_create_datetime_columns
|
203
|
-
# FIXME: Remove the silence when we change the default `null` behavior
|
204
|
-
ActiveSupport::Deprecation.silence do
|
205
|
-
connection.create_table table_name do |t|
|
206
|
-
t.timestamps
|
207
|
-
end
|
208
|
-
end
|
209
|
-
created_columns = connection.columns(table_name)
|
210
|
-
|
211
|
-
created_at_column = created_columns.detect {|c| c.name == 'created_at' }
|
212
|
-
updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
|
213
|
-
|
214
|
-
assert created_at_column.null
|
215
|
-
assert updated_at_column.null
|
216
|
-
end
|
217
|
-
|
218
|
-
def test_create_table_with_timestamps_should_create_datetime_columns_with_options
|
219
|
-
connection.create_table table_name do |t|
|
220
|
-
t.timestamps :null => false
|
221
|
-
end
|
222
|
-
created_columns = connection.columns(table_name)
|
223
|
-
|
224
|
-
created_at_column = created_columns.detect {|c| c.name == 'created_at' }
|
225
|
-
updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
|
226
|
-
|
227
|
-
assert !created_at_column.null
|
228
|
-
assert !updated_at_column.null
|
229
|
-
end
|
230
|
-
|
231
|
-
def test_create_table_without_a_block
|
232
|
-
connection.create_table table_name
|
233
|
-
end
|
234
|
-
|
235
|
-
# Sybase, and SQLite3 will not allow you to add a NOT NULL
|
236
|
-
# column to a table without a default value.
|
237
|
-
unless current_adapter?(:SybaseAdapter, :SQLite3Adapter, :IBM_DBAdapter)
|
238
|
-
def test_add_column_not_null_without_default
|
239
|
-
connection.create_table :testings do |t|
|
240
|
-
t.column :foo, :string
|
241
|
-
end
|
242
|
-
connection.add_column :testings, :bar, :string, :null => false
|
243
|
-
|
244
|
-
assert_raise(ActiveRecord::StatementInvalid) do
|
245
|
-
connection.execute "insert into testings (foo, bar) values ('hello', NULL)"
|
246
|
-
end
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
def test_add_column_not_null_with_default
|
251
|
-
connection.create_table :testings do |t|
|
252
|
-
t.column :foo, :string
|
253
|
-
end
|
254
|
-
|
255
|
-
con = connection
|
256
|
-
connection.enable_identity_insert("testings", true) if current_adapter?(:SybaseAdapter)
|
257
|
-
connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}) values (1, 'hello')"
|
258
|
-
connection.enable_identity_insert("testings", false) if current_adapter?(:SybaseAdapter)
|
259
|
-
assert_nothing_raised {connection.add_column :testings, :bar, :string, :null => false, :default => "default" }
|
260
|
-
|
261
|
-
assert_raises(ActiveRecord::StatementInvalid) do
|
262
|
-
unless current_adapter?(:OpenBaseAdapter)
|
263
|
-
connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}, #{con.quote_column_name('bar')}) values (2, 'hello', NULL)"
|
264
|
-
else
|
265
|
-
connection.insert("INSERT INTO testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}, #{con.quote_column_name('bar')}) VALUES (2, 'hello', NULL)",
|
266
|
-
"Testing Insert","id",2)
|
267
|
-
end
|
268
|
-
end
|
269
|
-
end
|
270
|
-
|
271
|
-
def test_change_column_quotes_column_names
|
272
|
-
connection.create_table :testings do |t|
|
273
|
-
unless current_adapter?(:IBM_DBAdapter)
|
274
|
-
t.column :select, :string
|
275
|
-
else
|
276
|
-
# If no limit specified by default column of length 255 is created, which later cannot be scaled down to 10
|
277
|
-
t.column :select, :string, :limit => 5
|
278
|
-
end
|
279
|
-
end
|
280
|
-
|
281
|
-
connection.change_column :testings, :select, :string, :limit => 10
|
282
|
-
|
283
|
-
# Oracle needs primary key value from sequence
|
284
|
-
if current_adapter?(:OracleAdapter)
|
285
|
-
connection.execute "insert into testings (id, #{connection.quote_column_name('select')}) values (testings_seq.nextval, '7 chars')"
|
286
|
-
else
|
287
|
-
connection.execute "insert into testings (#{connection.quote_column_name('select')}) values ('7 chars')"
|
288
|
-
end
|
289
|
-
end
|
290
|
-
|
291
|
-
def test_keeping_default_and_notnull_constraints_on_change
|
292
|
-
connection.create_table :testings do |t|
|
293
|
-
t.column :title, :string
|
294
|
-
end
|
295
|
-
person_klass = Class.new(ActiveRecord::Base)
|
296
|
-
person_klass.table_name = 'testings'
|
297
|
-
|
298
|
-
person_klass.connection.add_column "testings", "wealth", :integer, :null => false, :default => 99
|
299
|
-
person_klass.reset_column_information
|
300
|
-
assert_equal 99, person_klass.columns_hash["wealth"].default
|
301
|
-
assert_equal false, person_klass.columns_hash["wealth"].null
|
302
|
-
# Oracle needs primary key value from sequence
|
303
|
-
if current_adapter?(:OracleAdapter)
|
304
|
-
assert_nothing_raised {person_klass.connection.execute("insert into testings (id, title) values (testings_seq.nextval, 'tester')")}
|
305
|
-
else
|
306
|
-
assert_nothing_raised {person_klass.connection.execute("insert into testings (title) values ('tester')")}
|
307
|
-
end
|
308
|
-
|
309
|
-
# change column default to see that column doesn't lose its not null definition
|
310
|
-
person_klass.connection.change_column_default "testings", "wealth", 100
|
311
|
-
person_klass.reset_column_information
|
312
|
-
assert_equal 100, person_klass.columns_hash["wealth"].default
|
313
|
-
assert_equal false, person_klass.columns_hash["wealth"].null
|
314
|
-
|
315
|
-
if (!current_adapter?(:IBM_DBAdapter))
|
316
|
-
# rename column to see that column doesn't lose its not null and/or default definition
|
317
|
-
person_klass.connection.rename_column "testings", "wealth", "money"
|
318
|
-
person_klass.reset_column_information
|
319
|
-
assert_nil person_klass.columns_hash["wealth"]
|
320
|
-
assert_equal 100, person_klass.columns_hash["money"].default
|
321
|
-
assert_equal false, person_klass.columns_hash["money"].null
|
322
|
-
end
|
323
|
-
|
324
|
-
# change column
|
325
|
-
unless current_adapter?(:IBM_DBAdapter)
|
326
|
-
person_klass.connection.change_column "testings", "money", :integer, :null => false, :default => 1000
|
327
|
-
person_klass.reset_column_information
|
328
|
-
assert_equal 1000, person_klass.columns_hash["money"].default
|
329
|
-
assert_equal false, person_klass.columns_hash["money"].null
|
330
|
-
else
|
331
|
-
person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 15, :scale => 1,:null => false, :default => 1000
|
332
|
-
person_klass.reset_column_information
|
333
|
-
assert_equal 1000, person_klass.columns_hash["wealth"].default
|
334
|
-
assert_equal false, person_klass.columns_hash["wealth"].null
|
335
|
-
end
|
336
|
-
|
337
|
-
# change column, make it nullable and clear default
|
338
|
-
unless current_adapter?(:IBM_DBAdapter)
|
339
|
-
person_klass.connection.change_column "testings", "money", :integer, :null => true, :default => nil
|
340
|
-
person_klass.reset_column_information
|
341
|
-
assert_nil person_klass.columns_hash["money"].default
|
342
|
-
assert_equal true, person_klass.columns_hash["money"].null
|
343
|
-
else
|
344
|
-
person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 20, :scale => 2, :null => true, :default => nil
|
345
|
-
person_klass.reset_column_information
|
346
|
-
assert_nil person_klass.columns_hash["wealth"].default
|
347
|
-
assert_equal true, person_klass.columns_hash["wealth"].null
|
348
|
-
end
|
349
|
-
|
350
|
-
# change_column_null, make it not nullable and set null values to a default value
|
351
|
-
unless current_adapter?(:IBM_DBAdapter)
|
352
|
-
person_klass.connection.execute('UPDATE testings SET money = NULL')
|
353
|
-
person_klass.connection.change_column_null "testings", "money", false, 2000
|
354
|
-
person_klass.reset_column_information
|
355
|
-
assert_nil person_klass.columns_hash["money"].default
|
356
|
-
assert_equal false, person_klass.columns_hash["money"].null
|
357
|
-
assert_equal [2000], Person.connection.select_values("SELECT money FROM testings").map { |s| s.to_i }.sort
|
358
|
-
else
|
359
|
-
# Trying to set the value of the column wealth to NULL and
|
360
|
-
# in the next statement a not null constraint is being applied which is wrong
|
361
|
-
#person_klass.connection.execute('UPDATE testings SET money = NULL')
|
362
|
-
person_klass.connection.change_column_null "testings", "wealth", false, 2000
|
363
|
-
person_klass.reset_column_information
|
364
|
-
#assert_nil person_klass.columns_hash["wealth"].default #Setting default to 2000 and expecting nil is nor correct
|
365
|
-
assert_not_nil person_klass.columns_hash["wealth"].default
|
366
|
-
assert_equal false, person_klass.columns_hash["wealth"].null
|
367
|
-
#Changing default does not change the already inserted value. Hence expecting 2000 is wrong.
|
368
|
-
assert_equal [99], Person.connection.select_values("SELECT wealth FROM testings").map { |s| s.to_i }.sort
|
369
|
-
end
|
370
|
-
end
|
371
|
-
|
372
|
-
def test_change_column_null
|
373
|
-
testing_table_with_only_foo_attribute do
|
374
|
-
notnull_migration = Class.new(ActiveRecord::Migration) do
|
375
|
-
def change
|
376
|
-
change_column_null :testings, :foo, false
|
377
|
-
end
|
378
|
-
end
|
379
|
-
notnull_migration.new.suppress_messages do
|
380
|
-
notnull_migration.migrate(:up)
|
381
|
-
assert_equal false, connection.columns(:testings).find{ |c| c.name == "foo"}.null
|
382
|
-
notnull_migration.migrate(:down)
|
383
|
-
assert connection.columns(:testings).find{ |c| c.name == "foo"}.null
|
384
|
-
end
|
385
|
-
end
|
386
|
-
end
|
387
|
-
|
388
|
-
def test_column_exists
|
389
|
-
connection.create_table :testings do |t|
|
390
|
-
t.column :foo, :string
|
391
|
-
end
|
392
|
-
|
393
|
-
assert connection.column_exists?(:testings, :foo)
|
394
|
-
assert_not connection.column_exists?(:testings, :bar)
|
395
|
-
end
|
396
|
-
|
397
|
-
def test_column_exists_with_type
|
398
|
-
connection.create_table :testings do |t|
|
399
|
-
t.column :foo, :string
|
400
|
-
t.column :bar, :decimal, :precision => 8, :scale => 2
|
401
|
-
end
|
402
|
-
|
403
|
-
assert connection.column_exists?(:testings, :foo, :string)
|
404
|
-
assert_not connection.column_exists?(:testings, :foo, :integer)
|
405
|
-
|
406
|
-
assert connection.column_exists?(:testings, :bar, :decimal)
|
407
|
-
assert_not connection.column_exists?(:testings, :bar, :integer)
|
408
|
-
end
|
409
|
-
|
410
|
-
def test_column_exists_with_definition
|
411
|
-
connection.create_table :testings do |t|
|
412
|
-
t.column :foo, :string, limit: 100
|
413
|
-
t.column :bar, :decimal, precision: 8, scale: 2
|
414
|
-
t.column :taggable_id, :integer, null: false
|
415
|
-
t.column :taggable_type, :string, default: 'Photo'
|
416
|
-
end
|
417
|
-
|
418
|
-
assert connection.column_exists?(:testings, :foo, :string, limit: 100)
|
419
|
-
assert_not connection.column_exists?(:testings, :foo, :string, limit: nil)
|
420
|
-
assert connection.column_exists?(:testings, :bar, :decimal, precision: 8, scale: 2)
|
421
|
-
assert_not connection.column_exists?(:testings, :bar, :decimal, precision: nil, scale: nil)
|
422
|
-
assert connection.column_exists?(:testings, :taggable_id, :integer, null: false)
|
423
|
-
assert_not connection.column_exists?(:testings, :taggable_id, :integer, null: true)
|
424
|
-
assert connection.column_exists?(:testings, :taggable_type, :string, default: 'Photo')
|
425
|
-
assert_not connection.column_exists?(:testings, :taggable_type, :string, default: nil)
|
426
|
-
end
|
427
|
-
|
428
|
-
def test_column_exists_on_table_with_no_options_parameter_supplied
|
429
|
-
connection.create_table :testings do |t|
|
430
|
-
t.string :foo
|
431
|
-
end
|
432
|
-
connection.change_table :testings do |t|
|
433
|
-
assert t.column_exists?(:foo)
|
434
|
-
assert !(t.column_exists?(:bar))
|
435
|
-
end
|
436
|
-
end
|
437
|
-
|
438
|
-
private
|
439
|
-
def testing_table_with_only_foo_attribute
|
440
|
-
connection.create_table :testings, :id => false do |t|
|
441
|
-
t.column :foo, :string
|
442
|
-
end
|
443
|
-
|
444
|
-
yield
|
445
|
-
end
|
446
|
-
end
|
447
|
-
end
|
448
|
-
end
|
1
|
+
require 'cases/helper'
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
class Migration
|
5
|
+
class ChangeSchemaTest < ActiveRecord::TestCase
|
6
|
+
attr_reader :connection, :table_name
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
@connection = ActiveRecord::Base.connection
|
11
|
+
@table_name = :testings
|
12
|
+
end
|
13
|
+
|
14
|
+
teardown do
|
15
|
+
connection.drop_table :testings rescue nil
|
16
|
+
ActiveRecord::Base.primary_key_prefix_type = nil
|
17
|
+
ActiveRecord::Base.clear_cache!
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_create_table_without_id
|
21
|
+
testing_table_with_only_foo_attribute do
|
22
|
+
assert_equal connection.columns(:testings).size, 1
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
unless current_adapter?(:IBM_DBAdapter)
|
27
|
+
# For DB2: Cannot add a primary key to a table with some rows already in it as it violates the unique constraint
|
28
|
+
# Secondly GENERATED BY DEFAULT AS IDENTITY cannot be applied in a alter table command.
|
29
|
+
# as this will be wrong sql syntax for DB
|
30
|
+
def test_add_column_with_primary_key_attribute
|
31
|
+
testing_table_with_only_foo_attribute do
|
32
|
+
connection.add_column :testings, :id, :primary_key
|
33
|
+
assert_equal connection.columns(:testings).size, 2
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_create_table_adds_id
|
39
|
+
connection.create_table :testings do |t|
|
40
|
+
t.column :foo, :string
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_equal %w(id foo), connection.columns(:testings).map(&:name)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_create_table_with_not_null_column
|
47
|
+
connection.create_table :testings do |t|
|
48
|
+
t.column :foo, :string, :null => false
|
49
|
+
end
|
50
|
+
|
51
|
+
assert_raises(ActiveRecord::StatementInvalid) do
|
52
|
+
connection.execute "insert into testings (foo) values (NULL)"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_create_table_with_defaults
|
57
|
+
# MySQL doesn't allow defaults on TEXT or BLOB columns.
|
58
|
+
mysql = current_adapter?(:MysqlAdapter, :Mysql2Adapter)
|
59
|
+
|
60
|
+
connection.create_table :testings do |t|
|
61
|
+
t.column :one, :string, :default => "hello"
|
62
|
+
t.column :two, :boolean, :default => true
|
63
|
+
t.column :three, :boolean, :default => false
|
64
|
+
t.column :four, :integer, :default => 1
|
65
|
+
t.column :five, :text, :default => "hello" unless mysql
|
66
|
+
end
|
67
|
+
|
68
|
+
columns = connection.columns(:testings)
|
69
|
+
one = columns.detect { |c| c.name == "one" }
|
70
|
+
two = columns.detect { |c| c.name == "two" }
|
71
|
+
three = columns.detect { |c| c.name == "three" }
|
72
|
+
four = columns.detect { |c| c.name == "four" }
|
73
|
+
five = columns.detect { |c| c.name == "five" } unless mysql
|
74
|
+
|
75
|
+
assert_equal "hello", one.default
|
76
|
+
assert_equal true, two.type_cast_from_database(two.default)
|
77
|
+
assert_equal false, three.type_cast_from_database(three.default)
|
78
|
+
assert_equal '1', four.default
|
79
|
+
assert_equal "hello", five.default unless mysql
|
80
|
+
end
|
81
|
+
|
82
|
+
if current_adapter?(:PostgreSQLAdapter)
|
83
|
+
def test_add_column_with_array
|
84
|
+
connection.create_table :testings
|
85
|
+
connection.add_column :testings, :foo, :string, :array => true
|
86
|
+
|
87
|
+
columns = connection.columns(:testings)
|
88
|
+
array_column = columns.detect { |c| c.name == "foo" }
|
89
|
+
|
90
|
+
assert array_column.array
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_create_table_with_array_column
|
94
|
+
connection.create_table :testings do |t|
|
95
|
+
t.string :foo, :array => true
|
96
|
+
end
|
97
|
+
|
98
|
+
columns = connection.columns(:testings)
|
99
|
+
array_column = columns.detect { |c| c.name == "foo" }
|
100
|
+
|
101
|
+
assert array_column.array
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_create_table_with_bigint
|
106
|
+
connection.create_table :testings do |t|
|
107
|
+
t.bigint :eight_int
|
108
|
+
end
|
109
|
+
columns = connection.columns(:testings)
|
110
|
+
eight = columns.detect { |c| c.name == "eight_int" }
|
111
|
+
|
112
|
+
if current_adapter?(:OracleAdapter)
|
113
|
+
assert_equal 'NUMBER(19)', eight.sql_type
|
114
|
+
elsif current_adapter?(:SQLite3Adapter)
|
115
|
+
assert_equal 'bigint', eight.sql_type
|
116
|
+
else
|
117
|
+
assert_equal :integer, eight.type
|
118
|
+
assert_equal 8, eight.limit
|
119
|
+
end
|
120
|
+
ensure
|
121
|
+
connection.drop_table :testings
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_create_table_with_limits
|
125
|
+
connection.create_table :testings do |t|
|
126
|
+
t.column :foo, :string, :limit => 255
|
127
|
+
|
128
|
+
t.column :default_int, :integer
|
129
|
+
|
130
|
+
t.column :one_int, :integer, :limit => 1
|
131
|
+
t.column :four_int, :integer, :limit => 4
|
132
|
+
t.column :eight_int, :integer, :limit => 8
|
133
|
+
end
|
134
|
+
|
135
|
+
columns = connection.columns(:testings)
|
136
|
+
foo = columns.detect { |c| c.name == "foo" }
|
137
|
+
assert_equal 255, foo.limit
|
138
|
+
|
139
|
+
default = columns.detect { |c| c.name == "default_int" }
|
140
|
+
one = columns.detect { |c| c.name == "one_int" }
|
141
|
+
four = columns.detect { |c| c.name == "four_int" }
|
142
|
+
eight = columns.detect { |c| c.name == "eight_int" }
|
143
|
+
|
144
|
+
if current_adapter?(:PostgreSQLAdapter)
|
145
|
+
assert_equal 'integer', default.sql_type
|
146
|
+
assert_equal 'smallint', one.sql_type
|
147
|
+
assert_equal 'integer', four.sql_type
|
148
|
+
assert_equal 'bigint', eight.sql_type
|
149
|
+
elsif current_adapter?(:MysqlAdapter, :Mysql2Adapter)
|
150
|
+
assert_match 'int(11)', default.sql_type
|
151
|
+
assert_match 'tinyint', one.sql_type
|
152
|
+
assert_match 'int', four.sql_type
|
153
|
+
assert_match 'bigint', eight.sql_type
|
154
|
+
elsif current_adapter?(:OracleAdapter)
|
155
|
+
assert_equal 'NUMBER(38)', default.sql_type
|
156
|
+
assert_equal 'NUMBER(1)', one.sql_type
|
157
|
+
assert_equal 'NUMBER(4)', four.sql_type
|
158
|
+
assert_equal 'NUMBER(8)', eight.sql_type
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_create_table_with_primary_key_prefix_as_table_name_with_underscore
|
163
|
+
ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
|
164
|
+
|
165
|
+
connection.create_table :testings do |t|
|
166
|
+
t.column :foo, :string
|
167
|
+
end
|
168
|
+
|
169
|
+
assert_equal %w(testing_id foo), connection.columns(:testings).map(&:name)
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_create_table_with_primary_key_prefix_as_table_name
|
173
|
+
ActiveRecord::Base.primary_key_prefix_type = :table_name
|
174
|
+
|
175
|
+
connection.create_table :testings do |t|
|
176
|
+
t.column :foo, :string
|
177
|
+
end
|
178
|
+
|
179
|
+
assert_equal %w(testingid foo), connection.columns(:testings).map(&:name)
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_create_table_raises_when_redefining_primary_key_column
|
183
|
+
error = assert_raise(ArgumentError) do
|
184
|
+
connection.create_table :testings do |t|
|
185
|
+
t.column :id, :string
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
assert_equal "you can't redefine the primary key column 'id'. To define a custom primary key, pass { id: false } to create_table.", error.message
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_create_table_raises_when_redefining_custom_primary_key_column
|
193
|
+
error = assert_raise(ArgumentError) do
|
194
|
+
connection.create_table :testings, primary_key: :testing_id do |t|
|
195
|
+
t.column :testing_id, :string
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
assert_equal "you can't redefine the primary key column 'testing_id'. To define a custom primary key, pass { id: false } to create_table.", error.message
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_create_table_with_timestamps_should_create_datetime_columns
|
203
|
+
# FIXME: Remove the silence when we change the default `null` behavior
|
204
|
+
ActiveSupport::Deprecation.silence do
|
205
|
+
connection.create_table table_name do |t|
|
206
|
+
t.timestamps
|
207
|
+
end
|
208
|
+
end
|
209
|
+
created_columns = connection.columns(table_name)
|
210
|
+
|
211
|
+
created_at_column = created_columns.detect {|c| c.name == 'created_at' }
|
212
|
+
updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
|
213
|
+
|
214
|
+
assert created_at_column.null
|
215
|
+
assert updated_at_column.null
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_create_table_with_timestamps_should_create_datetime_columns_with_options
|
219
|
+
connection.create_table table_name do |t|
|
220
|
+
t.timestamps :null => false
|
221
|
+
end
|
222
|
+
created_columns = connection.columns(table_name)
|
223
|
+
|
224
|
+
created_at_column = created_columns.detect {|c| c.name == 'created_at' }
|
225
|
+
updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
|
226
|
+
|
227
|
+
assert !created_at_column.null
|
228
|
+
assert !updated_at_column.null
|
229
|
+
end
|
230
|
+
|
231
|
+
def test_create_table_without_a_block
|
232
|
+
connection.create_table table_name
|
233
|
+
end
|
234
|
+
|
235
|
+
# Sybase, and SQLite3 will not allow you to add a NOT NULL
|
236
|
+
# column to a table without a default value.
|
237
|
+
unless current_adapter?(:SybaseAdapter, :SQLite3Adapter, :IBM_DBAdapter)
|
238
|
+
def test_add_column_not_null_without_default
|
239
|
+
connection.create_table :testings do |t|
|
240
|
+
t.column :foo, :string
|
241
|
+
end
|
242
|
+
connection.add_column :testings, :bar, :string, :null => false
|
243
|
+
|
244
|
+
assert_raise(ActiveRecord::StatementInvalid) do
|
245
|
+
connection.execute "insert into testings (foo, bar) values ('hello', NULL)"
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
def test_add_column_not_null_with_default
|
251
|
+
connection.create_table :testings do |t|
|
252
|
+
t.column :foo, :string
|
253
|
+
end
|
254
|
+
|
255
|
+
con = connection
|
256
|
+
connection.enable_identity_insert("testings", true) if current_adapter?(:SybaseAdapter)
|
257
|
+
connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}) values (1, 'hello')"
|
258
|
+
connection.enable_identity_insert("testings", false) if current_adapter?(:SybaseAdapter)
|
259
|
+
assert_nothing_raised {connection.add_column :testings, :bar, :string, :null => false, :default => "default" }
|
260
|
+
|
261
|
+
assert_raises(ActiveRecord::StatementInvalid) do
|
262
|
+
unless current_adapter?(:OpenBaseAdapter)
|
263
|
+
connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}, #{con.quote_column_name('bar')}) values (2, 'hello', NULL)"
|
264
|
+
else
|
265
|
+
connection.insert("INSERT INTO testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}, #{con.quote_column_name('bar')}) VALUES (2, 'hello', NULL)",
|
266
|
+
"Testing Insert","id",2)
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
def test_change_column_quotes_column_names
|
272
|
+
connection.create_table :testings do |t|
|
273
|
+
unless current_adapter?(:IBM_DBAdapter)
|
274
|
+
t.column :select, :string
|
275
|
+
else
|
276
|
+
# If no limit specified by default column of length 255 is created, which later cannot be scaled down to 10
|
277
|
+
t.column :select, :string, :limit => 5
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
connection.change_column :testings, :select, :string, :limit => 10
|
282
|
+
|
283
|
+
# Oracle needs primary key value from sequence
|
284
|
+
if current_adapter?(:OracleAdapter)
|
285
|
+
connection.execute "insert into testings (id, #{connection.quote_column_name('select')}) values (testings_seq.nextval, '7 chars')"
|
286
|
+
else
|
287
|
+
connection.execute "insert into testings (#{connection.quote_column_name('select')}) values ('7 chars')"
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
def test_keeping_default_and_notnull_constraints_on_change
|
292
|
+
connection.create_table :testings do |t|
|
293
|
+
t.column :title, :string
|
294
|
+
end
|
295
|
+
person_klass = Class.new(ActiveRecord::Base)
|
296
|
+
person_klass.table_name = 'testings'
|
297
|
+
|
298
|
+
person_klass.connection.add_column "testings", "wealth", :integer, :null => false, :default => 99
|
299
|
+
person_klass.reset_column_information
|
300
|
+
assert_equal 99, person_klass.columns_hash["wealth"].default
|
301
|
+
assert_equal false, person_klass.columns_hash["wealth"].null
|
302
|
+
# Oracle needs primary key value from sequence
|
303
|
+
if current_adapter?(:OracleAdapter)
|
304
|
+
assert_nothing_raised {person_klass.connection.execute("insert into testings (id, title) values (testings_seq.nextval, 'tester')")}
|
305
|
+
else
|
306
|
+
assert_nothing_raised {person_klass.connection.execute("insert into testings (title) values ('tester')")}
|
307
|
+
end
|
308
|
+
|
309
|
+
# change column default to see that column doesn't lose its not null definition
|
310
|
+
person_klass.connection.change_column_default "testings", "wealth", 100
|
311
|
+
person_klass.reset_column_information
|
312
|
+
assert_equal 100, person_klass.columns_hash["wealth"].default
|
313
|
+
assert_equal false, person_klass.columns_hash["wealth"].null
|
314
|
+
|
315
|
+
if (!current_adapter?(:IBM_DBAdapter))
|
316
|
+
# rename column to see that column doesn't lose its not null and/or default definition
|
317
|
+
person_klass.connection.rename_column "testings", "wealth", "money"
|
318
|
+
person_klass.reset_column_information
|
319
|
+
assert_nil person_klass.columns_hash["wealth"]
|
320
|
+
assert_equal 100, person_klass.columns_hash["money"].default
|
321
|
+
assert_equal false, person_klass.columns_hash["money"].null
|
322
|
+
end
|
323
|
+
|
324
|
+
# change column
|
325
|
+
unless current_adapter?(:IBM_DBAdapter)
|
326
|
+
person_klass.connection.change_column "testings", "money", :integer, :null => false, :default => 1000
|
327
|
+
person_klass.reset_column_information
|
328
|
+
assert_equal 1000, person_klass.columns_hash["money"].default
|
329
|
+
assert_equal false, person_klass.columns_hash["money"].null
|
330
|
+
else
|
331
|
+
person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 15, :scale => 1,:null => false, :default => 1000
|
332
|
+
person_klass.reset_column_information
|
333
|
+
assert_equal 1000, person_klass.columns_hash["wealth"].default
|
334
|
+
assert_equal false, person_klass.columns_hash["wealth"].null
|
335
|
+
end
|
336
|
+
|
337
|
+
# change column, make it nullable and clear default
|
338
|
+
unless current_adapter?(:IBM_DBAdapter)
|
339
|
+
person_klass.connection.change_column "testings", "money", :integer, :null => true, :default => nil
|
340
|
+
person_klass.reset_column_information
|
341
|
+
assert_nil person_klass.columns_hash["money"].default
|
342
|
+
assert_equal true, person_klass.columns_hash["money"].null
|
343
|
+
else
|
344
|
+
person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 20, :scale => 2, :null => true, :default => nil
|
345
|
+
person_klass.reset_column_information
|
346
|
+
assert_nil person_klass.columns_hash["wealth"].default
|
347
|
+
assert_equal true, person_klass.columns_hash["wealth"].null
|
348
|
+
end
|
349
|
+
|
350
|
+
# change_column_null, make it not nullable and set null values to a default value
|
351
|
+
unless current_adapter?(:IBM_DBAdapter)
|
352
|
+
person_klass.connection.execute('UPDATE testings SET money = NULL')
|
353
|
+
person_klass.connection.change_column_null "testings", "money", false, 2000
|
354
|
+
person_klass.reset_column_information
|
355
|
+
assert_nil person_klass.columns_hash["money"].default
|
356
|
+
assert_equal false, person_klass.columns_hash["money"].null
|
357
|
+
assert_equal [2000], Person.connection.select_values("SELECT money FROM testings").map { |s| s.to_i }.sort
|
358
|
+
else
|
359
|
+
# Trying to set the value of the column wealth to NULL and
|
360
|
+
# in the next statement a not null constraint is being applied which is wrong
|
361
|
+
#person_klass.connection.execute('UPDATE testings SET money = NULL')
|
362
|
+
person_klass.connection.change_column_null "testings", "wealth", false, 2000
|
363
|
+
person_klass.reset_column_information
|
364
|
+
#assert_nil person_klass.columns_hash["wealth"].default #Setting default to 2000 and expecting nil is nor correct
|
365
|
+
assert_not_nil person_klass.columns_hash["wealth"].default
|
366
|
+
assert_equal false, person_klass.columns_hash["wealth"].null
|
367
|
+
#Changing default does not change the already inserted value. Hence expecting 2000 is wrong.
|
368
|
+
assert_equal [99], Person.connection.select_values("SELECT wealth FROM testings").map { |s| s.to_i }.sort
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
def test_change_column_null
|
373
|
+
testing_table_with_only_foo_attribute do
|
374
|
+
notnull_migration = Class.new(ActiveRecord::Migration) do
|
375
|
+
def change
|
376
|
+
change_column_null :testings, :foo, false
|
377
|
+
end
|
378
|
+
end
|
379
|
+
notnull_migration.new.suppress_messages do
|
380
|
+
notnull_migration.migrate(:up)
|
381
|
+
assert_equal false, connection.columns(:testings).find{ |c| c.name == "foo"}.null
|
382
|
+
notnull_migration.migrate(:down)
|
383
|
+
assert connection.columns(:testings).find{ |c| c.name == "foo"}.null
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
388
|
+
def test_column_exists
|
389
|
+
connection.create_table :testings do |t|
|
390
|
+
t.column :foo, :string
|
391
|
+
end
|
392
|
+
|
393
|
+
assert connection.column_exists?(:testings, :foo)
|
394
|
+
assert_not connection.column_exists?(:testings, :bar)
|
395
|
+
end
|
396
|
+
|
397
|
+
def test_column_exists_with_type
|
398
|
+
connection.create_table :testings do |t|
|
399
|
+
t.column :foo, :string
|
400
|
+
t.column :bar, :decimal, :precision => 8, :scale => 2
|
401
|
+
end
|
402
|
+
|
403
|
+
assert connection.column_exists?(:testings, :foo, :string)
|
404
|
+
assert_not connection.column_exists?(:testings, :foo, :integer)
|
405
|
+
|
406
|
+
assert connection.column_exists?(:testings, :bar, :decimal)
|
407
|
+
assert_not connection.column_exists?(:testings, :bar, :integer)
|
408
|
+
end
|
409
|
+
|
410
|
+
def test_column_exists_with_definition
|
411
|
+
connection.create_table :testings do |t|
|
412
|
+
t.column :foo, :string, limit: 100
|
413
|
+
t.column :bar, :decimal, precision: 8, scale: 2
|
414
|
+
t.column :taggable_id, :integer, null: false
|
415
|
+
t.column :taggable_type, :string, default: 'Photo'
|
416
|
+
end
|
417
|
+
|
418
|
+
assert connection.column_exists?(:testings, :foo, :string, limit: 100)
|
419
|
+
assert_not connection.column_exists?(:testings, :foo, :string, limit: nil)
|
420
|
+
assert connection.column_exists?(:testings, :bar, :decimal, precision: 8, scale: 2)
|
421
|
+
assert_not connection.column_exists?(:testings, :bar, :decimal, precision: nil, scale: nil)
|
422
|
+
assert connection.column_exists?(:testings, :taggable_id, :integer, null: false)
|
423
|
+
assert_not connection.column_exists?(:testings, :taggable_id, :integer, null: true)
|
424
|
+
assert connection.column_exists?(:testings, :taggable_type, :string, default: 'Photo')
|
425
|
+
assert_not connection.column_exists?(:testings, :taggable_type, :string, default: nil)
|
426
|
+
end
|
427
|
+
|
428
|
+
def test_column_exists_on_table_with_no_options_parameter_supplied
|
429
|
+
connection.create_table :testings do |t|
|
430
|
+
t.string :foo
|
431
|
+
end
|
432
|
+
connection.change_table :testings do |t|
|
433
|
+
assert t.column_exists?(:foo)
|
434
|
+
assert !(t.column_exists?(:bar))
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
private
|
439
|
+
def testing_table_with_only_foo_attribute
|
440
|
+
connection.create_table :testings, :id => false do |t|
|
441
|
+
t.column :foo, :string
|
442
|
+
end
|
443
|
+
|
444
|
+
yield
|
445
|
+
end
|
446
|
+
end
|
447
|
+
end
|
448
|
+
end
|