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.
Files changed (463) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -1
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/README +225 -225
  6. data/ext/Makefile.nt32 +181 -181
  7. data/ext/Makefile.nt32.191 +212 -212
  8. data/ext/extconf.rb +291 -291
  9. data/ext/ibm_db.c +11887 -11884
  10. data/ext/ruby_ibm_db.h +241 -241
  11. data/ext/ruby_ibm_db_cli.c +866 -866
  12. data/ext/ruby_ibm_db_cli.h +500 -500
  13. data/init.rb +41 -41
  14. data/lib/IBM_DB.rb +27 -27
  15. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3177 -3177
  16. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
  17. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  18. data/lib/mswin32/ibm_db.rb +122 -122
  19. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  20. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  21. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  22. data/test/active_record/connection_adapters/fake_adapter.rb +46 -46
  23. data/test/assets/example.log +1 -1
  24. data/test/assets/test.txt +1 -1
  25. data/test/cases/adapter_test.rb +276 -261
  26. data/test/cases/aggregations_test.rb +158 -158
  27. data/test/cases/ar_schema_test.rb +161 -161
  28. data/test/cases/associations/association_scope_test.rb +21 -21
  29. data/test/cases/associations/belongs_to_associations_test.rb +1029 -1029
  30. data/test/cases/associations/callbacks_test.rb +192 -192
  31. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  32. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -26
  33. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  34. data/test/cases/associations/eager_load_nested_include_test.rb +128 -128
  35. data/test/cases/associations/eager_singularization_test.rb +148 -148
  36. data/test/cases/associations/eager_test.rb +1429 -1411
  37. data/test/cases/associations/extension_test.rb +82 -82
  38. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +972 -932
  39. data/test/cases/associations/has_many_associations_test.rb +2182 -2162
  40. data/test/cases/associations/has_many_through_associations_test.rb +1204 -1204
  41. data/test/cases/associations/has_one_associations_test.rb +610 -610
  42. data/test/cases/associations/has_one_through_associations_test.rb +380 -380
  43. data/test/cases/associations/inner_join_association_test.rb +139 -139
  44. data/test/cases/associations/inverse_associations_test.rb +706 -693
  45. data/test/cases/associations/join_model_test.rb +754 -754
  46. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  47. data/test/cases/associations/required_test.rb +82 -82
  48. data/test/cases/associations_test.rb +380 -380
  49. data/test/cases/attribute_decorators_test.rb +125 -125
  50. data/test/cases/attribute_methods/read_test.rb +60 -60
  51. data/test/cases/attribute_methods/serialization_test.rb +29 -29
  52. data/test/cases/attribute_methods_test.rb +952 -952
  53. data/test/cases/attribute_set_test.rb +210 -200
  54. data/test/cases/attribute_test.rb +180 -180
  55. data/test/cases/attributes_test.rb +136 -136
  56. data/test/cases/autosave_association_test.rb +1595 -1595
  57. data/test/cases/base_test.rb +1664 -1638
  58. data/test/cases/batches_test.rb +212 -212
  59. data/test/cases/binary_test.rb +52 -52
  60. data/test/cases/bind_parameter_test.rb +100 -100
  61. data/test/cases/calculations_test.rb +646 -646
  62. data/test/cases/callbacks_test.rb +543 -543
  63. data/test/cases/clone_test.rb +40 -40
  64. data/test/cases/coders/yaml_column_test.rb +63 -63
  65. data/test/cases/column_alias_test.rb +17 -17
  66. data/test/cases/column_definition_test.rb +123 -123
  67. data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -54
  68. data/test/cases/connection_adapters/connection_handler_test.rb +53 -53
  69. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  70. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -293
  71. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -65
  72. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  73. data/test/cases/connection_adapters/schema_cache_test.rb +56 -56
  74. data/test/cases/connection_adapters/type_lookup_test.rb +110 -110
  75. data/test/cases/connection_management_test.rb +122 -122
  76. data/test/cases/connection_pool_test.rb +346 -346
  77. data/test/cases/connection_specification/resolver_test.rb +116 -116
  78. data/test/cases/core_test.rb +112 -112
  79. data/test/cases/counter_cache_test.rb +209 -209
  80. data/test/cases/custom_locking_test.rb +17 -17
  81. data/test/cases/database_statements_test.rb +19 -19
  82. data/test/cases/date_time_test.rb +61 -61
  83. data/test/cases/defaults_test.rb +223 -223
  84. data/test/cases/dirty_test.rb +785 -775
  85. data/test/cases/disconnected_test.rb +28 -28
  86. data/test/cases/dup_test.rb +157 -157
  87. data/test/cases/enum_test.rb +290 -290
  88. data/test/cases/explain_subscriber_test.rb +64 -64
  89. data/test/cases/explain_test.rb +76 -76
  90. data/test/cases/finder_respond_to_test.rb +60 -60
  91. data/test/cases/finder_test.rb +1169 -1166
  92. data/test/cases/fixture_set/file_test.rb +138 -138
  93. data/test/cases/fixtures_test.rb +908 -897
  94. data/test/cases/forbidden_attributes_protection_test.rb +99 -99
  95. data/test/cases/habtm_destroy_order_test.rb +61 -61
  96. data/test/cases/helper.rb +210 -210
  97. data/test/cases/hot_compatibility_test.rb +54 -54
  98. data/test/cases/i18n_test.rb +45 -45
  99. data/test/cases/inheritance_test.rb +375 -375
  100. data/test/cases/integration_test.rb +139 -139
  101. data/test/cases/invalid_connection_test.rb +22 -22
  102. data/test/cases/invalid_date_test.rb +32 -32
  103. data/test/cases/invertible_migration_test.rb +295 -295
  104. data/test/cases/json_serialization_test.rb +302 -302
  105. data/test/cases/locking_test.rb +477 -477
  106. data/test/cases/log_subscriber_test.rb +136 -136
  107. data/test/cases/migration/change_schema_test - Copy.rb +448 -448
  108. data/test/cases/migration/change_schema_test.rb +512 -472
  109. data/test/cases/migration/change_table_test.rb +224 -224
  110. data/test/cases/migration/column_attributes_test.rb +192 -192
  111. data/test/cases/migration/column_positioning_test.rb +56 -56
  112. data/test/cases/migration/columns_test.rb +304 -304
  113. data/test/cases/migration/command_recorder_test.rb +305 -305
  114. data/test/cases/migration/create_join_table_test.rb +148 -148
  115. data/test/cases/migration/foreign_key_test - Changed.rb +325 -325
  116. data/test/cases/migration/foreign_key_test.rb +328 -360
  117. data/test/cases/migration/helper.rb +39 -39
  118. data/test/cases/migration/index_test.rb +216 -216
  119. data/test/cases/migration/logger_test.rb +36 -36
  120. data/test/cases/migration/pending_migrations_test.rb +53 -53
  121. data/test/cases/migration/references_foreign_key_test.rb +169 -214
  122. data/test/cases/migration/references_index_test.rb +101 -101
  123. data/test/cases/migration/references_statements_test.rb +116 -116
  124. data/test/cases/migration/rename_table_test.rb +93 -93
  125. data/test/cases/migration/table_and_index_test.rb +24 -24
  126. data/test/cases/migration_test.rb +959 -959
  127. data/test/cases/migrator_test.rb +388 -388
  128. data/test/cases/mixin_test.rb +70 -70
  129. data/test/cases/modules_test.rb +173 -173
  130. data/test/cases/multiparameter_attributes_test.rb +350 -350
  131. data/test/cases/multiple_db_test.rb +115 -115
  132. data/test/cases/nested_attributes_test.rb +1070 -1057
  133. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  134. data/test/cases/persistence_test.rb +909 -909
  135. data/test/cases/pooled_connections_test.rb +81 -81
  136. data/test/cases/primary_keys_test.rb +237 -237
  137. data/test/cases/query_cache_test.rb +326 -326
  138. data/test/cases/quoting_test.rb +156 -156
  139. data/test/cases/readonly_test.rb +118 -118
  140. data/test/cases/reaper_test.rb +85 -85
  141. data/test/cases/reflection_test.rb +463 -454
  142. data/test/cases/relation/delegation_test.rb +68 -68
  143. data/test/cases/relation/merging_test.rb +161 -161
  144. data/test/cases/relation/mutation_test.rb +165 -165
  145. data/test/cases/relation/predicate_builder_test.rb +14 -14
  146. data/test/cases/relation/where_chain_test.rb +181 -181
  147. data/test/cases/relation/where_test.rb +300 -300
  148. data/test/cases/relation/where_test2.rb +36 -36
  149. data/test/cases/relation_test.rb +319 -297
  150. data/test/cases/relations_test.rb +1815 -1815
  151. data/test/cases/reload_models_test.rb +22 -22
  152. data/test/cases/result_test.rb +80 -80
  153. data/test/cases/sanitize_test.rb +83 -83
  154. data/test/cases/schema_dumper_test.rb +463 -463
  155. data/test/cases/scoping/default_scoping_test.rb +454 -454
  156. data/test/cases/scoping/named_scoping_test.rb +524 -524
  157. data/test/cases/scoping/relation_scoping_test.rb +357 -357
  158. data/test/cases/serialization_test.rb +104 -104
  159. data/test/cases/serialized_attribute_test.rb +277 -277
  160. data/test/cases/statement_cache_test.rb +98 -98
  161. data/test/cases/store_test.rb +194 -194
  162. data/test/cases/tasks/database_tasks_test.rb +398 -396
  163. data/test/cases/tasks/mysql_rake_test.rb +324 -311
  164. data/test/cases/tasks/postgresql_rake_test.rb +250 -245
  165. data/test/cases/tasks/sqlite_rake_test.rb +193 -193
  166. data/test/cases/test_case.rb +123 -123
  167. data/test/cases/timestamp_test.rb +467 -468
  168. data/test/cases/transaction_callbacks_test.rb +452 -452
  169. data/test/cases/transaction_isolation_test.rb +106 -106
  170. data/test/cases/transactions_test.rb +817 -817
  171. data/test/cases/type/decimal_test.rb +56 -51
  172. data/test/cases/type/integer_test.rb +121 -121
  173. data/test/cases/type/string_test.rb +36 -36
  174. data/test/cases/type/type_map_test.rb +177 -177
  175. data/test/cases/type/unsigned_integer_test.rb +18 -18
  176. data/test/cases/types_test.rb +141 -141
  177. data/test/cases/unconnected_test.rb +33 -33
  178. data/test/cases/validations/association_validation_test.rb +86 -86
  179. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  180. data/test/cases/validations/i18n_validation_test.rb +90 -90
  181. data/test/cases/validations/length_validation_test.rb +47 -47
  182. data/test/cases/validations/presence_validation_test.rb +68 -68
  183. data/test/cases/validations/uniqueness_validation_test.rb +457 -434
  184. data/test/cases/validations_repair_helper.rb +23 -23
  185. data/test/cases/validations_test.rb +165 -165
  186. data/test/cases/view_test.rb +119 -113
  187. data/test/cases/xml_serialization_test.rb +457 -457
  188. data/test/cases/yaml_serialization_test.rb +126 -86
  189. data/test/config.rb +5 -5
  190. data/test/config.yml +154 -154
  191. data/test/connections/native_ibm_db/connection.rb +43 -43
  192. data/test/fixtures/accounts.yml +29 -29
  193. data/test/fixtures/admin/accounts.yml +2 -2
  194. data/test/fixtures/admin/randomly_named_a9.yml +7 -7
  195. data/test/fixtures/admin/randomly_named_b0.yml +7 -7
  196. data/test/fixtures/admin/users.yml +10 -10
  197. data/test/fixtures/author_addresses.yml +17 -17
  198. data/test/fixtures/author_favorites.yml +3 -3
  199. data/test/fixtures/authors.yml +23 -23
  200. data/test/fixtures/binaries.yml +133 -133
  201. data/test/fixtures/books.yml +11 -11
  202. data/test/fixtures/bulbs.yml +5 -5
  203. data/test/fixtures/cars.yml +9 -9
  204. data/test/fixtures/categories.yml +19 -19
  205. data/test/fixtures/categories/special_categories.yml +9 -9
  206. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  207. data/test/fixtures/categories_ordered.yml +7 -7
  208. data/test/fixtures/categories_posts.yml +31 -31
  209. data/test/fixtures/categorizations.yml +23 -23
  210. data/test/fixtures/clubs.yml +8 -8
  211. data/test/fixtures/collections.yml +3 -3
  212. data/test/fixtures/colleges.yml +3 -3
  213. data/test/fixtures/comments.yml +65 -65
  214. data/test/fixtures/companies.yml +67 -67
  215. data/test/fixtures/computers.yml +10 -10
  216. data/test/fixtures/courses.yml +8 -8
  217. data/test/fixtures/customers.yml +25 -25
  218. data/test/fixtures/dashboards.yml +6 -6
  219. data/test/fixtures/developers.yml +21 -21
  220. data/test/fixtures/developers_projects.yml +16 -16
  221. data/test/fixtures/dog_lovers.yml +7 -7
  222. data/test/fixtures/dogs.yml +4 -4
  223. data/test/fixtures/doubloons.yml +3 -3
  224. data/test/fixtures/edges.yml +5 -5
  225. data/test/fixtures/entrants.yml +14 -14
  226. data/test/fixtures/essays.yml +6 -6
  227. data/test/fixtures/faces.yml +11 -11
  228. data/test/fixtures/fk_test_has_fk.yml +3 -3
  229. data/test/fixtures/fk_test_has_pk.yml +1 -1
  230. data/test/fixtures/friendships.yml +4 -4
  231. data/test/fixtures/funny_jokes.yml +10 -10
  232. data/test/fixtures/interests.yml +33 -33
  233. data/test/fixtures/items.yml +3 -3
  234. data/test/fixtures/jobs.yml +7 -7
  235. data/test/fixtures/legacy_things.yml +3 -3
  236. data/test/fixtures/mateys.yml +4 -4
  237. data/test/fixtures/member_details.yml +8 -8
  238. data/test/fixtures/member_types.yml +6 -6
  239. data/test/fixtures/members.yml +11 -11
  240. data/test/fixtures/memberships.yml +34 -34
  241. data/test/fixtures/men.yml +5 -5
  242. data/test/fixtures/minimalistics.yml +2 -2
  243. data/test/fixtures/minivans.yml +5 -5
  244. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  245. data/test/fixtures/mixins.yml +29 -29
  246. data/test/fixtures/movies.yml +7 -7
  247. data/test/fixtures/naked/csv/accounts.csv +1 -1
  248. data/test/fixtures/naked/yml/accounts.yml +1 -1
  249. data/test/fixtures/naked/yml/companies.yml +1 -1
  250. data/test/fixtures/naked/yml/courses.yml +1 -1
  251. data/test/fixtures/organizations.yml +5 -5
  252. data/test/fixtures/other_topics.yml +42 -42
  253. data/test/fixtures/owners.yml +9 -9
  254. data/test/fixtures/parrots.yml +27 -27
  255. data/test/fixtures/parrots_pirates.yml +7 -7
  256. data/test/fixtures/people.yml +24 -24
  257. data/test/fixtures/peoples_treasures.yml +3 -3
  258. data/test/fixtures/pets.yml +19 -19
  259. data/test/fixtures/pirates.yml +12 -12
  260. data/test/fixtures/posts.yml +80 -80
  261. data/test/fixtures/price_estimates.yml +7 -7
  262. data/test/fixtures/products.yml +4 -4
  263. data/test/fixtures/projects.yml +7 -7
  264. data/test/fixtures/randomly_named_a9.yml +7 -7
  265. data/test/fixtures/ratings.yml +14 -14
  266. data/test/fixtures/readers.yml +11 -11
  267. data/test/fixtures/references.yml +17 -17
  268. data/test/fixtures/reserved_words/distinct.yml +5 -5
  269. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  270. data/test/fixtures/reserved_words/group.yml +14 -14
  271. data/test/fixtures/reserved_words/select.yml +8 -8
  272. data/test/fixtures/reserved_words/values.yml +7 -7
  273. data/test/fixtures/ships.yml +6 -6
  274. data/test/fixtures/speedometers.yml +8 -8
  275. data/test/fixtures/sponsors.yml +12 -12
  276. data/test/fixtures/string_key_objects.yml +7 -7
  277. data/test/fixtures/subscribers.yml +10 -10
  278. data/test/fixtures/subscriptions.yml +12 -12
  279. data/test/fixtures/taggings.yml +78 -78
  280. data/test/fixtures/tags.yml +11 -11
  281. data/test/fixtures/tasks.yml +7 -7
  282. data/test/fixtures/teapots.yml +3 -3
  283. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  284. data/test/fixtures/to_be_linked/users.yml +10 -10
  285. data/test/fixtures/topics.yml +49 -49
  286. data/test/fixtures/toys.yml +14 -14
  287. data/test/fixtures/traffic_lights.yml +9 -9
  288. data/test/fixtures/treasures.yml +10 -10
  289. data/test/fixtures/uuid_children.yml +3 -3
  290. data/test/fixtures/uuid_parents.yml +2 -2
  291. data/test/fixtures/variants.yml +4 -4
  292. data/test/fixtures/vegetables.yml +19 -19
  293. data/test/fixtures/vertices.yml +3 -3
  294. data/test/fixtures/warehouse_things.yml +2 -2
  295. data/test/fixtures/zines.yml +5 -5
  296. data/test/ibm_db_test.rb +24 -24
  297. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  298. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  299. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  300. data/test/migrations/missing/1000_people_have_middle_names.rb +8 -8
  301. data/test/migrations/missing/1_people_have_last_names.rb +8 -8
  302. data/test/migrations/missing/3_we_need_reminders.rb +11 -11
  303. data/test/migrations/missing/4_innocent_jointable.rb +11 -11
  304. data/test/migrations/rename/1_we_need_things.rb +10 -10
  305. data/test/migrations/rename/2_rename_things.rb +8 -8
  306. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  307. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  308. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  309. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  310. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  311. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  312. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  313. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  314. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  315. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  316. data/test/migrations/valid/2_we_need_reminders.rb +11 -11
  317. data/test/migrations/valid/3_innocent_jointable.rb +11 -11
  318. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  319. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +11 -11
  320. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +11 -11
  321. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  322. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  323. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  324. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  325. data/test/models/admin.rb +4 -4
  326. data/test/models/admin/account.rb +2 -2
  327. data/test/models/admin/randomly_named_c1.rb +3 -3
  328. data/test/models/admin/user.rb +40 -40
  329. data/test/models/aircraft.rb +4 -4
  330. data/test/models/arunit2_model.rb +3 -3
  331. data/test/models/author.rb +212 -212
  332. data/test/models/auto_id.rb +4 -4
  333. data/test/models/autoloadable/extra_firm.rb +2 -2
  334. data/test/models/binary.rb +1 -1
  335. data/test/models/bird.rb +12 -12
  336. data/test/models/book.rb +18 -18
  337. data/test/models/boolean.rb +2 -2
  338. data/test/models/bulb.rb +51 -51
  339. data/test/models/cake_designer.rb +3 -3
  340. data/test/models/car.rb +26 -26
  341. data/test/models/carrier.rb +2 -2
  342. data/test/models/categorization.rb +19 -19
  343. data/test/models/category.rb +35 -35
  344. data/test/models/chef.rb +7 -3
  345. data/test/models/citation.rb +3 -3
  346. data/test/models/club.rb +23 -23
  347. data/test/models/college.rb +10 -10
  348. data/test/models/column.rb +3 -3
  349. data/test/models/column_name.rb +3 -3
  350. data/test/models/comment.rb +64 -64
  351. data/test/models/company.rb +228 -225
  352. data/test/models/company_in_module.rb +98 -98
  353. data/test/models/computer.rb +3 -3
  354. data/test/models/contact.rb +41 -41
  355. data/test/models/contract.rb +20 -20
  356. data/test/models/country.rb +7 -7
  357. data/test/models/course.rb +6 -6
  358. data/test/models/customer.rb +77 -77
  359. data/test/models/customer_carrier.rb +14 -14
  360. data/test/models/dashboard.rb +3 -3
  361. data/test/models/default.rb +2 -2
  362. data/test/models/department.rb +4 -4
  363. data/test/models/developer.rb +255 -252
  364. data/test/models/dog.rb +5 -5
  365. data/test/models/dog_lover.rb +5 -5
  366. data/test/models/doubloon.rb +12 -12
  367. data/test/models/drink_designer.rb +3 -3
  368. data/test/models/edge.rb +5 -5
  369. data/test/models/electron.rb +5 -5
  370. data/test/models/engine.rb +4 -4
  371. data/test/models/entrant.rb +3 -3
  372. data/test/models/essay.rb +5 -5
  373. data/test/models/event.rb +2 -2
  374. data/test/models/eye.rb +37 -37
  375. data/test/models/face.rb +9 -9
  376. data/test/models/friendship.rb +6 -6
  377. data/test/models/guid.rb +1 -1
  378. data/test/models/hotel.rb +9 -6
  379. data/test/models/image.rb +3 -3
  380. data/test/models/interest.rb +5 -5
  381. data/test/models/invoice.rb +4 -4
  382. data/test/models/item.rb +7 -7
  383. data/test/models/job.rb +7 -7
  384. data/test/models/joke.rb +7 -7
  385. data/test/models/keyboard.rb +3 -3
  386. data/test/models/legacy_thing.rb +3 -3
  387. data/test/models/lesson.rb +11 -11
  388. data/test/models/line_item.rb +3 -3
  389. data/test/models/liquid.rb +4 -4
  390. data/test/models/man.rb +11 -11
  391. data/test/models/matey.rb +4 -4
  392. data/test/models/member.rb +41 -41
  393. data/test/models/member_detail.rb +7 -7
  394. data/test/models/member_type.rb +3 -3
  395. data/test/models/membership.rb +35 -35
  396. data/test/models/minimalistic.rb +2 -2
  397. data/test/models/minivan.rb +9 -9
  398. data/test/models/mixed_case_monkey.rb +3 -3
  399. data/test/models/molecule.rb +6 -6
  400. data/test/models/movie.rb +5 -5
  401. data/test/models/order.rb +4 -4
  402. data/test/models/organization.rb +14 -14
  403. data/test/models/owner.rb +34 -34
  404. data/test/models/parrot.rb +29 -29
  405. data/test/models/person.rb +143 -143
  406. data/test/models/personal_legacy_thing.rb +4 -4
  407. data/test/models/pet.rb +15 -15
  408. data/test/models/pirate.rb +92 -92
  409. data/test/models/possession.rb +3 -3
  410. data/test/models/post.rb +264 -264
  411. data/test/models/price_estimate.rb +4 -4
  412. data/test/models/professor.rb +5 -5
  413. data/test/models/project.rb +31 -29
  414. data/test/models/publisher.rb +2 -2
  415. data/test/models/publisher/article.rb +4 -4
  416. data/test/models/publisher/magazine.rb +3 -3
  417. data/test/models/randomly_named_c1.rb +3 -3
  418. data/test/models/rating.rb +4 -4
  419. data/test/models/reader.rb +23 -23
  420. data/test/models/record.rb +2 -2
  421. data/test/models/reference.rb +22 -22
  422. data/test/models/reply.rb +61 -61
  423. data/test/models/ship.rb +33 -33
  424. data/test/models/ship_part.rb +7 -7
  425. data/test/models/shop.rb +17 -17
  426. data/test/models/shop_account.rb +6 -6
  427. data/test/models/speedometer.rb +6 -6
  428. data/test/models/sponsor.rb +7 -7
  429. data/test/models/string_key_object.rb +3 -3
  430. data/test/models/student.rb +4 -4
  431. data/test/models/subject.rb +16 -16
  432. data/test/models/subscriber.rb +8 -8
  433. data/test/models/subscription.rb +4 -4
  434. data/test/models/tag.rb +7 -7
  435. data/test/models/tagging.rb +13 -13
  436. data/test/models/task.rb +5 -5
  437. data/test/models/topic.rb +124 -124
  438. data/test/models/toy.rb +6 -6
  439. data/test/models/traffic_light.rb +4 -4
  440. data/test/models/treasure.rb +14 -14
  441. data/test/models/treaty.rb +7 -7
  442. data/test/models/tyre.rb +11 -11
  443. data/test/models/uuid_child.rb +3 -3
  444. data/test/models/uuid_parent.rb +3 -3
  445. data/test/models/vegetables.rb +24 -24
  446. data/test/models/vehicle.rb +6 -6
  447. data/test/models/vertex.rb +9 -9
  448. data/test/models/warehouse_thing.rb +5 -5
  449. data/test/models/wheel.rb +3 -3
  450. data/test/models/without_table.rb +3 -3
  451. data/test/models/zine.rb +3 -3
  452. data/test/schema/mysql2_specific_schema.rb +58 -58
  453. data/test/schema/mysql_specific_schema.rb +70 -70
  454. data/test/schema/oracle_specific_schema.rb +43 -43
  455. data/test/schema/postgresql_specific_schema.rb +202 -202
  456. data/test/schema/schema.rb +952 -938
  457. data/test/schema/sqlite_specific_schema.rb +21 -21
  458. data/test/support/config.rb +43 -43
  459. data/test/support/connection.rb +22 -22
  460. data/test/support/connection_helper.rb +14 -14
  461. data/test/support/ddl_helper.rb +8 -8
  462. data/test/support/schema_dumping_helper.rb +20 -20
  463. metadata +2 -2
@@ -1,472 +1,512 @@
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.drop_table :testings rescue nil
40
- connection.create_table :testings do |t|
41
- t.column :foo, :string
42
- end
43
-
44
- assert_equal %w(id foo), connection.columns(:testings).map(&:name)
45
- end
46
-
47
- def test_create_table_with_not_null_column
48
- connection.drop_table :testings rescue nil
49
- connection.create_table :testings do |t|
50
- t.column :foo, :string, :null => false
51
- end
52
-
53
- assert_raises(ActiveRecord::StatementInvalid) do
54
- connection.execute "insert into testings (foo) values (NULL)"
55
- end
56
- end
57
-
58
- def test_create_table_with_defaults
59
- # MySQL doesn't allow defaults on TEXT or BLOB columns.
60
- mysql = current_adapter?(:MysqlAdapter, :Mysql2Adapter, :IBM_DBAdapter)
61
- connection.drop_table :testings rescue nil
62
- connection.create_table :testings do |t|
63
- t.column :one, :string, :default => "hello"
64
- t.column :two, :boolean, :default => true
65
- t.column :three, :boolean, :default => false
66
- t.column :four, :integer, :default => 1
67
- t.column :five, :text, :default => "hello" unless mysql
68
- end
69
-
70
- columns = connection.columns(:testings)
71
- one = columns.detect { |c| c.name == "one" }
72
- two = columns.detect { |c| c.name == "two" }
73
- three = columns.detect { |c| c.name == "three" }
74
- four = columns.detect { |c| c.name == "four" }
75
- five = columns.detect { |c| c.name == "five" } unless mysql
76
-
77
- assert_equal "hello", one.default
78
- assert_equal true, two.type_cast_from_database(two.default)
79
- assert_equal false, three.type_cast_from_database(three.default)
80
- assert_equal '1', four.default
81
- assert_equal "hello", five.default unless mysql
82
- end
83
-
84
- if current_adapter?(:PostgreSQLAdapter)
85
- def test_add_column_with_array
86
- connection.drop_table :testings rescue nil
87
- connection.create_table :testings
88
- connection.add_column :testings, :foo, :string, :array => true
89
-
90
- columns = connection.columns(:testings)
91
- array_column = columns.detect { |c| c.name == "foo" }
92
-
93
- assert array_column.array
94
- end
95
-
96
- def test_create_table_with_array_column
97
- connection.drop_table :testings rescue nil
98
- connection.create_table :testings do |t|
99
- t.string :foo, :array => true
100
- end
101
-
102
- columns = connection.columns(:testings)
103
- array_column = columns.detect { |c| c.name == "foo" }
104
-
105
- assert array_column.array
106
- end
107
- end
108
-
109
- def test_create_table_with_bigint
110
- connection.drop_table :testings rescue nil
111
- connection.create_table :testings do |t|
112
- t.bigint :eight_int
113
- end
114
- columns = connection.columns(:testings)
115
- eight = columns.detect { |c| c.name == "eight_int" }
116
-
117
- if current_adapter?(:OracleAdapter)
118
- assert_equal 'NUMBER(19)', eight.sql_type
119
- elsif current_adapter?(:SQLite3Adapter)
120
- assert_equal 'bigint', eight.sql_type
121
- else
122
- assert_equal :integer, eight.type
123
- assert_equal 8, eight.limit
124
- end
125
- ensure
126
- connection.drop_table :testings
127
- end
128
-
129
- def test_create_table_with_limits
130
- connection.drop_table :testings rescue nil
131
- connection.create_table :testings do |t|
132
- t.column :foo, :string, :limit => 255
133
-
134
- t.column :default_int, :integer
135
-
136
- t.column :one_int, :integer, :limit => 1
137
- t.column :four_int, :integer, :limit => 4
138
- t.column :eight_int, :integer, :limit => 8
139
- end
140
-
141
- columns = connection.columns(:testings)
142
- foo = columns.detect { |c| c.name == "foo" }
143
- assert_equal 255, foo.limit
144
-
145
- default = columns.detect { |c| c.name == "default_int" }
146
- one = columns.detect { |c| c.name == "one_int" }
147
- four = columns.detect { |c| c.name == "four_int" }
148
- eight = columns.detect { |c| c.name == "eight_int" }
149
-
150
- if current_adapter?(:PostgreSQLAdapter)
151
- assert_equal 'integer', default.sql_type
152
- assert_equal 'smallint', one.sql_type
153
- assert_equal 'integer', four.sql_type
154
- assert_equal 'bigint', eight.sql_type
155
- elsif current_adapter?(:MysqlAdapter, :Mysql2Adapter)
156
- assert_match 'int(11)', default.sql_type
157
- assert_match 'tinyint', one.sql_type
158
- assert_match 'int', four.sql_type
159
- assert_match 'bigint', eight.sql_type
160
- elsif current_adapter?(:OracleAdapter)
161
- assert_equal 'NUMBER(38)', default.sql_type
162
- assert_equal 'NUMBER(1)', one.sql_type
163
- assert_equal 'NUMBER(4)', four.sql_type
164
- assert_equal 'NUMBER(8)', eight.sql_type
165
- end
166
- end
167
-
168
- def test_create_table_with_primary_key_prefix_as_table_name_with_underscore
169
- ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
170
- connection.drop_table :testings rescue nil
171
- connection.create_table :testings do |t|
172
- t.column :foo, :string
173
- end
174
-
175
- assert_equal %w(testing_id foo), connection.columns(:testings).map(&:name)
176
- end
177
-
178
- def test_create_table_with_primary_key_prefix_as_table_name
179
- ActiveRecord::Base.primary_key_prefix_type = :table_name
180
- connection.drop_table :testings rescue nil
181
- connection.create_table :testings do |t|
182
- t.column :foo, :string
183
- end
184
-
185
- assert_equal %w(testingid foo), connection.columns(:testings).map(&:name)
186
- end
187
-
188
- def test_create_table_raises_when_redefining_primary_key_column
189
-
190
- unless current_adapter?(:IBM_DBAdapter)
191
- #DB2 instead of ArgumentError exception, thorws Class: <ActiveRecord::StatementInvalid> Message: <"RuntimeError: Failed to execute statement due to: [IBM][CLI Driver][DB2/NT64] SQL0612N \"ID\" is a duplicate name. SQLSTATE=42711\r SQLCODE=-612: CREATE TABLE testings (id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 10000) PRIMARY KEY, id varchar(255)) ">
192
- error = assert_raise(ArgumentError) do
193
- connection.drop_table :testings rescue nil
194
- connection.create_table :testings do |t|
195
- t.column :id, :string
196
- end
197
- end
198
- 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
199
- end
200
- end
201
-
202
- def test_create_table_raises_when_redefining_custom_primary_key_column
203
- connection.drop_table :testings rescue nil
204
- error = assert_raise(ArgumentError) do
205
- connection.create_table :testings, primary_key: :testing_id do |t|
206
- t.column :testing_id, :string
207
- end
208
- end
209
-
210
- 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
211
- end
212
-
213
- def test_create_table_with_timestamps_should_create_datetime_columns
214
- # FIXME: Remove the silence when we change the default `null` behavior
215
- ActiveSupport::Deprecation.silence do
216
- connection.drop_table :testings rescue nil
217
- connection.create_table table_name do |t|
218
- t.timestamps
219
- end
220
- end
221
- created_columns = connection.columns(table_name)
222
-
223
- created_at_column = created_columns.detect {|c| c.name == 'created_at' }
224
- updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
225
-
226
- assert created_at_column.null
227
- assert updated_at_column.null
228
- end
229
-
230
- def test_create_table_with_timestamps_should_create_datetime_columns_with_options
231
- connection.drop_table :testings rescue nil
232
- connection.create_table table_name do |t|
233
- t.timestamps :null => false
234
- end
235
- created_columns = connection.columns(table_name)
236
-
237
- created_at_column = created_columns.detect {|c| c.name == 'created_at' }
238
- updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
239
-
240
- assert !created_at_column.null
241
- assert !updated_at_column.null
242
- end
243
-
244
- def test_create_table_without_a_block
245
- connection.drop_table :testings rescue nil
246
- connection.create_table table_name
247
- end
248
-
249
- # Sybase, and SQLite3 will not allow you to add a NOT NULL
250
- # column to a table without a default value.
251
- unless current_adapter?(:SybaseAdapter, :SQLite3Adapter, :IBM_DBAdapter)
252
- def test_add_column_not_null_without_default
253
- connection.drop_table :testings rescue nil
254
- connection.create_table :testings do |t|
255
- t.column :foo, :string
256
- end
257
- connection.add_column :testings, :bar, :string, :null => false
258
-
259
- assert_raise(ActiveRecord::StatementInvalid) do
260
- connection.execute "insert into testings (foo, bar) values ('hello', NULL)"
261
- end
262
- end
263
- end
264
-
265
- def test_add_column_not_null_with_default
266
- connection.drop_table :testings rescue nil
267
- connection.create_table :testings do |t|
268
- t.column :foo, :string
269
- end
270
-
271
- con = connection
272
- connection.enable_identity_insert("testings", true) if current_adapter?(:SybaseAdapter)
273
- connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}) values (1, 'hello')"
274
- connection.enable_identity_insert("testings", false) if current_adapter?(:SybaseAdapter)
275
- assert_nothing_raised {connection.add_column :testings, :bar, :string, :null => false, :default => "default" }
276
-
277
- assert_raises(ActiveRecord::StatementInvalid) do
278
- unless current_adapter?(:OpenBaseAdapter)
279
- connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}, #{con.quote_column_name('bar')}) values (2, 'hello', NULL)"
280
- else
281
- connection.insert("INSERT INTO testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}, #{con.quote_column_name('bar')}) VALUES (2, 'hello', NULL)",
282
- "Testing Insert","id",2)
283
- end
284
- end
285
- end
286
-
287
- def test_change_column_quotes_column_names
288
- connection.drop_table :testings rescue nil
289
- connection.create_table :testings do |t|
290
- unless current_adapter?(:IBM_DBAdapter)
291
- t.column :select, :string
292
- else
293
- # If no limit specified by default column of length 255 is created, which later cannot be scaled down to 10
294
- t.column :select, :string, :limit => 5
295
- end
296
- end
297
-
298
- connection.change_column :testings, :select, :string, :limit => 10
299
-
300
- # Oracle needs primary key value from sequence
301
- if current_adapter?(:OracleAdapter)
302
- connection.execute "insert into testings (id, #{connection.quote_column_name('select')}) values (testings_seq.nextval, '7 chars')"
303
- else
304
- connection.execute "insert into testings (#{connection.quote_column_name('select')}) values ('7 chars')"
305
- end
306
- end
307
-
308
- def test_keeping_default_and_notnull_constraints_on_change
309
- connection.drop_table :testings rescue nil
310
- connection.create_table :testings do |t|
311
- t.column :title, :string
312
- end
313
- person_klass = Class.new(ActiveRecord::Base)
314
- person_klass.table_name = 'testings'
315
-
316
- person_klass.connection.add_column "testings", "wealth", :integer, :null => false, :default => 99
317
- person_klass.reset_column_information
318
- assert_equal "99", person_klass.columns_hash["wealth"].default
319
- assert_equal false, person_klass.columns_hash["wealth"].null
320
- # Oracle needs primary key value from sequence
321
- if current_adapter?(:OracleAdapter)
322
- assert_nothing_raised {person_klass.connection.execute("insert into testings (id, title) values (testings_seq.nextval, 'tester')")}
323
- else
324
- assert_nothing_raised {person_klass.connection.execute("insert into testings (title) values ('tester')")}
325
- end
326
-
327
- # change column default to see that column doesn't lose its not null definition
328
- person_klass.connection.change_column_default "testings", "wealth", 100
329
- person_klass.reset_column_information
330
- assert_equal "100", person_klass.columns_hash["wealth"].default
331
- assert_equal false, person_klass.columns_hash["wealth"].null
332
-
333
- if (!current_adapter?(:IBM_DBAdapter))
334
- # rename column to see that column doesn't lose its not null and/or default definition
335
- person_klass.connection.rename_column "testings", "wealth", "money"
336
- person_klass.reset_column_information
337
- assert_nil person_klass.columns_hash["wealth"]
338
- assert_equal 100, person_klass.columns_hash["money"].default
339
- assert_equal false, person_klass.columns_hash["money"].null
340
- end
341
-
342
- # change column
343
- unless current_adapter?(:IBM_DBAdapter)
344
- person_klass.connection.change_column "testings", "money", :integer, :null => false, :default => 1000
345
- person_klass.reset_column_information
346
- assert_equal 1000, person_klass.columns_hash["money"].default
347
- assert_equal false, person_klass.columns_hash["money"].null
348
- else
349
- person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 15, :scale => 1,:null => false, :default => 1000
350
- person_klass.reset_column_information
351
- assert_equal "1000", person_klass.columns_hash["wealth"].default
352
- assert_equal false, person_klass.columns_hash["wealth"].null
353
- end
354
-
355
- # change column, make it nullable and clear default
356
- unless current_adapter?(:IBM_DBAdapter)
357
- person_klass.connection.change_column "testings", "money", :integer, :null => true, :default => nil
358
- person_klass.reset_column_information
359
- assert_nil person_klass.columns_hash["money"].default
360
- assert_equal true, person_klass.columns_hash["money"].null
361
- else
362
- person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 20, :scale => 2, :null => true, :default => nil
363
- person_klass.reset_column_information
364
- assert_nil person_klass.columns_hash["wealth"].default
365
- assert_equal true, person_klass.columns_hash["wealth"].null
366
- end
367
-
368
- # change_column_null, make it not nullable and set null values to a default value
369
- unless current_adapter?(:IBM_DBAdapter)
370
- person_klass.connection.execute('UPDATE testings SET money = NULL')
371
- person_klass.connection.change_column_null "testings", "money", false, 2000
372
- person_klass.reset_column_information
373
- assert_nil person_klass.columns_hash["money"].default
374
- assert_equal false, person_klass.columns_hash["money"].null
375
- assert_equal [2000], Person.connection.select_values("SELECT money FROM testings").map { |s| s.to_i }.sort
376
- else
377
- # Trying to set the value of the column wealth to NULL and
378
- # in the next statement a not null constraint is being applied which is wrong
379
- #person_klass.connection.execute('UPDATE testings SET money = NULL')
380
- person_klass.connection.change_column_null "testings", "wealth", false, 2000
381
- person_klass.reset_column_information
382
- #assert_nil person_klass.columns_hash["wealth"].default #Setting default to 2000 and expecting nil is nor correct
383
- assert_not_nil person_klass.columns_hash["wealth"].default
384
- assert_equal false, person_klass.columns_hash["wealth"].null
385
- #Changing default does not change the already inserted value. Hence expecting 2000 is wrong.
386
- #assert_equal [99], Person.connection.select_values("SELECT wealth FROM testings").map { |s| s.to_i }.sort
387
- assert_equal [99], person_klass.connection.select_values("SELECT wealth FROM testings").map { |s| s.to_i }.sort
388
- end
389
- end
390
-
391
- def test_change_column_null
392
- testing_table_with_only_foo_attribute do
393
- notnull_migration = Class.new(ActiveRecord::Migration) do
394
- def change
395
- change_column_null :testings, :foo, false
396
- end
397
- end
398
- notnull_migration.new.suppress_messages do
399
- notnull_migration.migrate(:up)
400
- assert_equal false, connection.columns(:testings).find{ |c| c.name == "foo"}.null
401
- notnull_migration.migrate(:down)
402
- assert connection.columns(:testings).find{ |c| c.name == "foo"}.null
403
- end
404
- end
405
- end
406
-
407
- def test_column_exists
408
- connection.drop_table :testings rescue nil
409
- connection.create_table :testings do |t|
410
- t.column :foo, :string
411
- end
412
-
413
- assert connection.column_exists?(:testings, :foo)
414
- assert_not connection.column_exists?(:testings, :bar)
415
- end
416
-
417
- def test_column_exists_with_type
418
- connection.drop_table :testings rescue nil
419
- connection.create_table :testings do |t|
420
- t.column :foo, :string
421
- t.column :bar, :decimal, :precision => 8, :scale => 2
422
- end
423
-
424
- assert connection.column_exists?(:testings, :foo, :string)
425
- assert_not connection.column_exists?(:testings, :foo, :integer)
426
-
427
- assert connection.column_exists?(:testings, :bar, :decimal)
428
- assert_not connection.column_exists?(:testings, :bar, :integer)
429
- end
430
-
431
- def test_column_exists_with_definition
432
- connection.drop_table :testings rescue nil
433
- connection.create_table :testings do |t|
434
- t.column :foo, :string, limit: 100
435
- t.column :bar, :decimal, precision: 8, scale: 2
436
- t.column :taggable_id, :integer, null: false
437
- t.column :taggable_type, :string, default: 'Photo'
438
- end
439
-
440
- assert connection.column_exists?(:testings, :foo, :string, limit: 100)
441
- assert_not connection.column_exists?(:testings, :foo, :string, limit: nil)
442
- assert connection.column_exists?(:testings, :bar, :decimal, precision: 8, scale: 2)
443
- assert_not connection.column_exists?(:testings, :bar, :decimal, precision: nil, scale: nil)
444
- assert connection.column_exists?(:testings, :taggable_id, :integer, null: false)
445
- assert_not connection.column_exists?(:testings, :taggable_id, :integer, null: true)
446
- assert connection.column_exists?(:testings, :taggable_type, :string, default: 'Photo')
447
- assert_not connection.column_exists?(:testings, :taggable_type, :string, default: nil)
448
- end
449
-
450
- def test_column_exists_on_table_with_no_options_parameter_supplied
451
- connection.drop_table :testings rescue nil
452
- connection.create_table :testings do |t|
453
- t.string :foo
454
- end
455
- connection.change_table :testings do |t|
456
- assert t.column_exists?(:foo)
457
- assert !(t.column_exists?(:bar))
458
- end
459
- end
460
-
461
- private
462
- def testing_table_with_only_foo_attribute
463
- connection.drop_table :testings rescue nil
464
- connection.create_table :testings, :id => false do |t|
465
- t.column :foo, :string
466
- end
467
-
468
- yield
469
- end
470
- end
471
- end
472
- 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.drop_table :testings rescue nil
40
+ connection.create_table :testings do |t|
41
+ t.column :foo, :string
42
+ end
43
+
44
+ assert_equal %w(id foo), connection.columns(:testings).map(&:name)
45
+ end
46
+
47
+ def test_create_table_with_not_null_column
48
+ connection.drop_table :testings rescue nil
49
+ connection.create_table :testings do |t|
50
+ t.column :foo, :string, :null => false
51
+ end
52
+
53
+ assert_raises(ActiveRecord::StatementInvalid) do
54
+ connection.execute "insert into testings (foo) values (NULL)"
55
+ end
56
+ end
57
+
58
+ def test_create_table_with_defaults
59
+ # MySQL doesn't allow defaults on TEXT or BLOB columns.
60
+ mysql = current_adapter?(:MysqlAdapter, :Mysql2Adapter, :IBM_DBAdapter)
61
+ connection.drop_table :testings rescue nil
62
+ connection.create_table :testings do |t|
63
+ t.column :one, :string, :default => "hello"
64
+ t.column :two, :boolean, :default => true
65
+ t.column :three, :boolean, :default => false
66
+ t.column :four, :integer, :default => 1
67
+ t.column :five, :text, :default => "hello" unless mysql
68
+ end
69
+
70
+ columns = connection.columns(:testings)
71
+ one = columns.detect { |c| c.name == "one" }
72
+ two = columns.detect { |c| c.name == "two" }
73
+ three = columns.detect { |c| c.name == "three" }
74
+ four = columns.detect { |c| c.name == "four" }
75
+ five = columns.detect { |c| c.name == "five" } unless mysql
76
+
77
+ assert_equal "hello", one.default
78
+ assert_equal true, two.type_cast_from_database(two.default)
79
+ assert_equal false, three.type_cast_from_database(three.default)
80
+ assert_equal '1', four.default
81
+ assert_equal "hello", five.default unless mysql
82
+ end
83
+
84
+ if current_adapter?(:PostgreSQLAdapter)
85
+ def test_add_column_with_array
86
+ connection.drop_table :testings rescue nil
87
+ connection.create_table :testings
88
+ connection.add_column :testings, :foo, :string, :array => true
89
+
90
+ columns = connection.columns(:testings)
91
+ array_column = columns.detect { |c| c.name == "foo" }
92
+
93
+ assert array_column.array
94
+ end
95
+
96
+ def test_create_table_with_array_column
97
+ connection.drop_table :testings rescue nil
98
+ connection.create_table :testings do |t|
99
+ t.string :foo, :array => true
100
+ end
101
+
102
+ columns = connection.columns(:testings)
103
+ array_column = columns.detect { |c| c.name == "foo" }
104
+
105
+ assert array_column.array
106
+ end
107
+ end
108
+
109
+ def test_create_table_with_bigint
110
+ connection.drop_table :testings rescue nil
111
+ connection.create_table :testings do |t|
112
+ t.bigint :eight_int
113
+ end
114
+ columns = connection.columns(:testings)
115
+ eight = columns.detect { |c| c.name == "eight_int" }
116
+
117
+ if current_adapter?(:OracleAdapter)
118
+ assert_equal 'NUMBER(19)', eight.sql_type
119
+ elsif current_adapter?(:SQLite3Adapter)
120
+ assert_equal 'bigint', eight.sql_type
121
+ else
122
+ assert_equal :integer, eight.type
123
+ assert_equal 8, eight.limit
124
+ end
125
+ ensure
126
+ connection.drop_table :testings
127
+ end
128
+
129
+ def test_create_table_with_limits
130
+ connection.drop_table :testings rescue nil
131
+ connection.create_table :testings do |t|
132
+ t.column :foo, :string, :limit => 255
133
+
134
+ t.column :default_int, :integer
135
+
136
+ t.column :one_int, :integer, :limit => 1
137
+ t.column :four_int, :integer, :limit => 4
138
+ t.column :eight_int, :integer, :limit => 8
139
+ end
140
+
141
+ columns = connection.columns(:testings)
142
+ foo = columns.detect { |c| c.name == "foo" }
143
+ assert_equal 255, foo.limit
144
+
145
+ default = columns.detect { |c| c.name == "default_int" }
146
+ one = columns.detect { |c| c.name == "one_int" }
147
+ four = columns.detect { |c| c.name == "four_int" }
148
+ eight = columns.detect { |c| c.name == "eight_int" }
149
+
150
+ if current_adapter?(:PostgreSQLAdapter)
151
+ assert_equal 'integer', default.sql_type
152
+ assert_equal 'smallint', one.sql_type
153
+ assert_equal 'integer', four.sql_type
154
+ assert_equal 'bigint', eight.sql_type
155
+ elsif current_adapter?(:MysqlAdapter, :Mysql2Adapter)
156
+ assert_match 'int(11)', default.sql_type
157
+ assert_match 'tinyint', one.sql_type
158
+ assert_match 'int', four.sql_type
159
+ assert_match 'bigint', eight.sql_type
160
+ elsif current_adapter?(:OracleAdapter)
161
+ assert_equal 'NUMBER(38)', default.sql_type
162
+ assert_equal 'NUMBER(1)', one.sql_type
163
+ assert_equal 'NUMBER(4)', four.sql_type
164
+ assert_equal 'NUMBER(8)', eight.sql_type
165
+ end
166
+ end
167
+
168
+ def test_create_table_with_primary_key_prefix_as_table_name_with_underscore
169
+ ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
170
+ connection.drop_table :testings rescue nil
171
+ connection.create_table :testings do |t|
172
+ t.column :foo, :string
173
+ end
174
+
175
+ assert_equal %w(testing_id foo), connection.columns(:testings).map(&:name)
176
+ end
177
+
178
+ def test_create_table_with_primary_key_prefix_as_table_name
179
+ ActiveRecord::Base.primary_key_prefix_type = :table_name
180
+ connection.drop_table :testings rescue nil
181
+ connection.create_table :testings do |t|
182
+ t.column :foo, :string
183
+ end
184
+
185
+ assert_equal %w(testingid foo), connection.columns(:testings).map(&:name)
186
+ end
187
+
188
+ def test_create_table_raises_when_redefining_primary_key_column
189
+ unless current_adapter?(:IBM_DBAdapter)
190
+ #DB2 instead of ArgumentError exception, thorws Class: <ActiveRecord::StatementInvalid> Message: <"RuntimeError: Failed to execute statement due to: [IBM][CLI Driver][DB2/NT64] SQL0612N \"ID\" is a duplicate name. SQLSTATE=42711\r SQLCODE=-612: CREATE TABLE testings (id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 10000) PRIMARY KEY, id varchar(255)) ">
191
+ error = assert_raise(ArgumentError) do
192
+ connection.drop_table :testings rescue nil
193
+ connection.create_table :testings do |t|
194
+ t.column :id, :string
195
+ end
196
+ end
197
+ 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
198
+ end
199
+ end
200
+
201
+ def test_create_table_raises_when_redefining_custom_primary_key_column
202
+ error = assert_raise(ArgumentError) do
203
+ connection.create_table :testings, primary_key: :testing_id do |t|
204
+ t.column :testing_id, :string
205
+ end
206
+ end
207
+
208
+ 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
209
+ end
210
+
211
+ def test_create_table_with_timestamps_should_create_datetime_columns
212
+ # FIXME: Remove the silence when we change the default `null` behavior
213
+ ActiveSupport::Deprecation.silence do
214
+ connection.drop_table :testings rescue nil
215
+ connection.create_table table_name do |t|
216
+ t.timestamps
217
+ end
218
+ end
219
+ created_columns = connection.columns(table_name)
220
+
221
+ created_at_column = created_columns.detect {|c| c.name == 'created_at' }
222
+ updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
223
+
224
+ assert created_at_column.null
225
+ assert updated_at_column.null
226
+ end
227
+
228
+ def test_create_table_with_timestamps_should_create_datetime_columns_with_options
229
+ connection.drop_table :testings rescue nil
230
+ connection.create_table table_name do |t|
231
+ t.timestamps :null => false
232
+ end
233
+ created_columns = connection.columns(table_name)
234
+
235
+ created_at_column = created_columns.detect {|c| c.name == 'created_at' }
236
+ updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
237
+
238
+ assert !created_at_column.null
239
+ assert !updated_at_column.null
240
+ end
241
+
242
+ def test_create_table_without_a_block
243
+ connection.drop_table :testings rescue nil
244
+ connection.create_table table_name
245
+ end
246
+
247
+ # Sybase, and SQLite3 will not allow you to add a NOT NULL
248
+ # column to a table without a default value.
249
+ unless current_adapter?(:SybaseAdapter, :SQLite3Adapter, :IBM_DBAdapter)
250
+ def test_add_column_not_null_without_default
251
+ connection.drop_table :testings rescue nil
252
+ connection.create_table :testings do |t|
253
+ t.column :foo, :string
254
+ end
255
+ connection.add_column :testings, :bar, :string, :null => false
256
+
257
+ assert_raise(ActiveRecord::StatementInvalid) do
258
+ connection.execute "insert into testings (foo, bar) values ('hello', NULL)"
259
+ end
260
+ end
261
+ end
262
+
263
+ def test_add_column_not_null_with_default
264
+ connection.drop_table :testings rescue nil
265
+ connection.create_table :testings do |t|
266
+ t.column :foo, :string
267
+ end
268
+
269
+ con = connection
270
+ connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}) values (1, 'hello')"
271
+ assert_nothing_raised {connection.add_column :testings, :bar, :string, :null => false, :default => "default" }
272
+
273
+ assert_raises(ActiveRecord::StatementInvalid) do
274
+ connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}, #{con.quote_column_name('bar')}) values (2, 'hello', NULL)"
275
+ end
276
+ end
277
+
278
+ def test_add_column_with_timestamp_type
279
+ connection.drop_table :testings rescue nil
280
+ connection.create_table :testings do |t|
281
+ t.column :foo, :timestamp
282
+ end
283
+
284
+ klass = Class.new(ActiveRecord::Base)
285
+ klass.table_name = 'testings'
286
+
287
+ assert_equal :datetime, klass.columns_hash['foo'].type
288
+
289
+ if current_adapter?(:PostgreSQLAdapter)
290
+ assert_equal 'timestamp without time zone', klass.columns_hash['foo'].sql_type
291
+ else
292
+ assert_equal klass.connection.type_to_sql('datetime'), klass.columns_hash['foo'].sql_type
293
+ end
294
+ end
295
+
296
+ def test_change_column_quotes_column_names
297
+ connection.drop_table :testings rescue nil
298
+ connection.create_table :testings do |t|
299
+ unless current_adapter?(:IBM_DBAdapter)
300
+ t.column :select, :string
301
+ else
302
+ # If no limit specified by default column of length 255 is created, which later cannot be scaled down to 10
303
+ t.column :select, :string, :limit => 5
304
+ end
305
+ end
306
+
307
+ connection.change_column :testings, :select, :string, :limit => 10
308
+
309
+ # Oracle needs primary key value from sequence
310
+ if current_adapter?(:OracleAdapter)
311
+ connection.execute "insert into testings (id, #{connection.quote_column_name('select')}) values (testings_seq.nextval, '7 chars')"
312
+ else
313
+ connection.execute "insert into testings (#{connection.quote_column_name('select')}) values ('7 chars')"
314
+ end
315
+ end
316
+
317
+ def test_keeping_default_and_notnull_constraints_on_change
318
+ connection.drop_table :testings rescue nil
319
+ connection.create_table :testings do |t|
320
+ t.column :title, :string
321
+ end
322
+ person_klass = Class.new(ActiveRecord::Base)
323
+ person_klass.table_name = 'testings'
324
+
325
+ person_klass.connection.add_column "testings", "wealth", :integer, :null => false, :default => 99
326
+ person_klass.reset_column_information
327
+ assert_equal 99, person_klass.column_defaults["wealth"]
328
+ assert_equal false, person_klass.columns_hash["wealth"].null
329
+ # Oracle needs primary key value from sequence
330
+ if current_adapter?(:OracleAdapter)
331
+ assert_nothing_raised {person_klass.connection.execute("insert into testings (id, title) values (testings_seq.nextval, 'tester')")}
332
+ else
333
+ assert_nothing_raised {person_klass.connection.execute("insert into testings (title) values ('tester')")}
334
+ end
335
+
336
+ # change column default to see that column doesn't lose its not null definition
337
+ person_klass.connection.change_column_default "testings", "wealth", 100
338
+ person_klass.reset_column_information
339
+ assert_equal 100, person_klass.column_defaults["wealth"]
340
+ assert_equal false, person_klass.columns_hash["wealth"].null
341
+
342
+ if (!current_adapter?(:IBM_DBAdapter))
343
+ # rename column to see that column doesn't lose its not null and/or default definition
344
+ person_klass.connection.rename_column "testings", "wealth", "money"
345
+ person_klass.reset_column_information
346
+ assert_nil person_klass.columns_hash["wealth"]
347
+ assert_equal 100, person_klass.column_defaults["money"]
348
+ assert_equal false, person_klass.columns_hash["money"].null
349
+ end
350
+
351
+ # change column
352
+ unless current_adapter?(:IBM_DBAdapter)
353
+ person_klass.connection.change_column "testings", "money", :integer, :null => false, :default => 1000
354
+ person_klass.reset_column_information
355
+ assert_equal 1000, person_klass.column_defaults["money"]
356
+ assert_equal false, person_klass.columns_hash["money"].null
357
+ else
358
+ person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 15, :scale => 1,:null => false, :default => 1000
359
+ person_klass.reset_column_information
360
+ assert_equal "1000", person_klass.columns_hash["wealth"].default
361
+ assert_equal false, person_klass.columns_hash["wealth"].null
362
+ end
363
+
364
+ # change column, make it nullable and clear default
365
+ unless current_adapter?(:IBM_DBAdapter)
366
+ person_klass.connection.change_column "testings", "money", :integer, :null => true, :default => nil
367
+ person_klass.reset_column_information
368
+ assert_nil person_klass.columns_hash["money"].default
369
+ assert_equal true, person_klass.columns_hash["money"].null
370
+ else
371
+ person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 20, :scale => 2, :null => true, :default => nil
372
+ person_klass.reset_column_information
373
+ assert_nil person_klass.columns_hash["wealth"].default
374
+ assert_equal true, person_klass.columns_hash["wealth"].null
375
+ end
376
+
377
+ # change_column_null, make it not nullable and set null values to a default value
378
+ unless current_adapter?(:IBM_DBAdapter)
379
+ person_klass.connection.execute('UPDATE testings SET money = NULL')
380
+ person_klass.connection.change_column_null "testings", "money", false, 2000
381
+ person_klass.reset_column_information
382
+ assert_nil person_klass.columns_hash["money"].default
383
+ assert_equal false, person_klass.columns_hash["money"].null
384
+ assert_equal 2000, connection.select_values("SELECT money FROM testings").first.to_i
385
+ else
386
+ # Trying to set the value of the column wealth to NULL and
387
+ # in the next statement a not null constraint is being applied which is wrong
388
+ #person_klass.connection.execute('UPDATE testings SET money = NULL')
389
+ person_klass.connection.change_column_null "testings", "wealth", false, 2000
390
+ person_klass.reset_column_information
391
+ #assert_nil person_klass.columns_hash["wealth"].default #Setting default to 2000 and expecting nil is nor correct
392
+ assert_not_nil person_klass.columns_hash["wealth"].default
393
+ assert_equal false, person_klass.columns_hash["wealth"].null
394
+ #Changing default does not change the already inserted value. Hence expecting 2000 is wrong.
395
+ #assert_equal [99], Person.connection.select_values("SELECT wealth FROM testings").map { |s| s.to_i }.sort
396
+ assert_equal [99], person_klass.connection.select_values("SELECT wealth FROM testings").map { |s| s.to_i }.sort
397
+ end
398
+ end
399
+
400
+ def test_change_column_null
401
+ testing_table_with_only_foo_attribute do
402
+ notnull_migration = Class.new(ActiveRecord::Migration) do
403
+ def change
404
+ change_column_null :testings, :foo, false
405
+ end
406
+ end
407
+ notnull_migration.new.suppress_messages do
408
+ notnull_migration.migrate(:up)
409
+ assert_equal false, connection.columns(:testings).find{ |c| c.name == "foo"}.null
410
+ notnull_migration.migrate(:down)
411
+ assert connection.columns(:testings).find{ |c| c.name == "foo"}.null
412
+ end
413
+ end
414
+ end
415
+
416
+ def test_column_exists
417
+ connection.drop_table :testings rescue nil
418
+ connection.create_table :testings do |t|
419
+ t.column :foo, :string
420
+ end
421
+
422
+ assert connection.column_exists?(:testings, :foo)
423
+ assert_not connection.column_exists?(:testings, :bar)
424
+ end
425
+
426
+ def test_column_exists_with_type
427
+ connection.drop_table :testings rescue nil
428
+ connection.create_table :testings do |t|
429
+ t.column :foo, :string
430
+ t.column :bar, :decimal, :precision => 8, :scale => 2
431
+ end
432
+
433
+ assert connection.column_exists?(:testings, :foo, :string)
434
+ assert_not connection.column_exists?(:testings, :foo, :integer)
435
+
436
+ assert connection.column_exists?(:testings, :bar, :decimal)
437
+ assert_not connection.column_exists?(:testings, :bar, :integer)
438
+ end
439
+
440
+ def test_column_exists_with_definition
441
+ connection.drop_table :testings rescue nil
442
+ connection.create_table :testings do |t|
443
+ t.column :foo, :string, limit: 100
444
+ t.column :bar, :decimal, precision: 8, scale: 2
445
+ t.column :taggable_id, :integer, null: false
446
+ t.column :taggable_type, :string, default: 'Photo'
447
+ end
448
+
449
+ assert connection.column_exists?(:testings, :foo, :string, limit: 100)
450
+ assert_not connection.column_exists?(:testings, :foo, :string, limit: nil)
451
+ assert connection.column_exists?(:testings, :bar, :decimal, precision: 8, scale: 2)
452
+ assert_not connection.column_exists?(:testings, :bar, :decimal, precision: nil, scale: nil)
453
+ assert connection.column_exists?(:testings, :taggable_id, :integer, null: false)
454
+ assert_not connection.column_exists?(:testings, :taggable_id, :integer, null: true)
455
+ assert connection.column_exists?(:testings, :taggable_type, :string, default: 'Photo')
456
+ assert_not connection.column_exists?(:testings, :taggable_type, :string, default: nil)
457
+ end
458
+
459
+ def test_column_exists_on_table_with_no_options_parameter_supplied
460
+ connection.drop_table :testings rescue nil
461
+ connection.create_table :testings do |t|
462
+ t.string :foo
463
+ end
464
+ connection.change_table :testings do |t|
465
+ assert t.column_exists?(:foo)
466
+ assert !(t.column_exists?(:bar))
467
+ end
468
+ end
469
+
470
+ private
471
+ def testing_table_with_only_foo_attribute
472
+ connection.drop_table :testings rescue nil
473
+ connection.create_table :testings, :id => false do |t|
474
+ t.column :foo, :string
475
+ end
476
+
477
+ yield
478
+ end
479
+ end
480
+
481
+ if ActiveRecord::Base.connection.supports_foreign_keys?
482
+ class ChangeSchemaWithDependentObjectsTest < ActiveRecord::TestCase
483
+ self.use_transactional_fixtures = false
484
+
485
+ setup do
486
+ @connection = ActiveRecord::Base.connection
487
+ @connection.create_table :trains
488
+ @connection.create_table(:wagons) { |t| t.references :train }
489
+ @connection.add_foreign_key :wagons, :trains
490
+ end
491
+
492
+ teardown do
493
+ [:wagons, :trains].each do |table|
494
+ @connection.drop_table(table) if @connection.table_exists?(table)
495
+ end
496
+ end
497
+
498
+ def test_create_table_with_force_cascade_drops_dependent_objects
499
+ skip "MySQL > 5.5 does not drop dependent objects with DROP TABLE CASCADE" if current_adapter?(:MysqlAdapter, :Mysql2Adapter, :IBM_DBAdapter)
500
+ # can't re-create table referenced by foreign key
501
+ assert_raises(ActiveRecord::StatementInvalid) do
502
+ @connection.create_table :trains, force: true
503
+ end
504
+
505
+ # can recreate referenced table with force: :cascade
506
+ @connection.create_table :trains, force: :cascade
507
+ assert_equal [], @connection.foreign_keys(:wagons)
508
+ end
509
+ end
510
+ end
511
+ end
512
+ end