ibm_db 3.0.5 → 4.0.0

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 (580) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/ParameterizedQueries README +6 -6
  6. data/README +208 -225
  7. data/ext/Makefile.nt32 +181 -181
  8. data/ext/Makefile.nt32.191 +212 -212
  9. data/ext/extconf.rb +291 -291
  10. data/ext/ibm_db.c +11887 -11887
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.c +866 -866
  13. data/ext/ruby_ibm_db_cli.h +500 -500
  14. data/init.rb +41 -41
  15. data/lib/IBM_DB.rb +27 -27
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3452 -3177
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -2
  18. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  19. data/test/active_record/connection_adapters/fake_adapter.rb +49 -46
  20. data/test/assets/example.log +1 -1
  21. data/test/assets/test.txt +1 -1
  22. data/test/cases/adapter_test.rb +351 -276
  23. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  24. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  25. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  26. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  27. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  28. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  30. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  31. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  32. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  33. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  34. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  35. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  36. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  37. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  38. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  39. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  40. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  41. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  42. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  43. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  44. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  45. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  46. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  47. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  48. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  49. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  50. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  51. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  52. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  53. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  54. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  55. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  56. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  57. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  58. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  59. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  60. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  61. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  62. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  63. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  64. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  65. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  66. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  67. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  68. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  69. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  70. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  71. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  72. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  73. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  74. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  75. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  76. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  77. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  78. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  79. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  80. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  81. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  82. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  83. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  84. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  85. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  86. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  87. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  88. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  89. data/test/cases/aggregations_test.rb +168 -158
  90. data/test/cases/ar_schema_test.rb +146 -161
  91. data/test/cases/associations/association_scope_test.rb +16 -21
  92. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
  93. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  94. data/test/cases/associations/callbacks_test.rb +190 -192
  95. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  96. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  97. data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
  98. data/test/cases/associations/eager_singularization_test.rb +148 -148
  99. data/test/cases/associations/eager_test.rb +1514 -1429
  100. data/test/cases/associations/extension_test.rb +87 -82
  101. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -972
  102. data/test/cases/associations/has_many_associations_test.rb +2501 -2182
  103. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
  104. data/test/cases/associations/has_one_associations_test.rb +707 -610
  105. data/test/cases/associations/has_one_through_associations_test.rb +383 -380
  106. data/test/cases/associations/inner_join_association_test.rb +139 -139
  107. data/test/cases/associations/inverse_associations_test.rb +733 -706
  108. data/test/cases/associations/join_model_test.rb +777 -754
  109. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  110. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  111. data/test/cases/associations/required_test.rb +102 -82
  112. data/test/cases/associations_test.rb +385 -380
  113. data/test/cases/attribute_decorators_test.rb +125 -125
  114. data/test/cases/attribute_methods/read_test.rb +60 -60
  115. data/test/cases/attribute_methods_test.rb +1009 -952
  116. data/test/cases/attribute_set_test.rb +270 -210
  117. data/test/cases/attribute_test.rb +246 -180
  118. data/test/cases/attributes_test.rb +253 -136
  119. data/test/cases/autosave_association_test.rb +1708 -1595
  120. data/test/cases/base_test.rb +1713 -1664
  121. data/test/cases/batches_test.rb +489 -212
  122. data/test/cases/binary_test.rb +44 -52
  123. data/test/cases/bind_parameter_test.rb +110 -100
  124. data/test/cases/cache_key_test.rb +25 -0
  125. data/test/cases/calculations_test.rb +798 -646
  126. data/test/cases/callbacks_test.rb +636 -543
  127. data/test/cases/clone_test.rb +40 -40
  128. data/test/cases/coders/json_test.rb +15 -0
  129. data/test/cases/coders/yaml_column_test.rb +63 -63
  130. data/test/cases/collection_cache_key_test.rb +115 -0
  131. data/test/cases/column_alias_test.rb +17 -17
  132. data/test/cases/column_definition_test.rb +92 -123
  133. data/test/cases/comment_test.rb +143 -0
  134. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
  135. data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
  136. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  137. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
  138. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
  139. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  140. data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
  141. data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
  142. data/test/cases/connection_management_test.rb +112 -122
  143. data/test/cases/connection_pool_test.rb +521 -346
  144. data/test/cases/connection_specification/resolver_test.rb +131 -116
  145. data/test/cases/core_test.rb +112 -112
  146. data/test/cases/counter_cache_test.rb +214 -209
  147. data/test/cases/custom_locking_test.rb +17 -17
  148. data/test/cases/database_statements_test.rb +34 -19
  149. data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
  150. data/test/cases/date_time_precision_test.rb +106 -0
  151. data/test/cases/date_time_test.rb +61 -61
  152. data/test/cases/defaults_test.rb +218 -223
  153. data/test/cases/dirty_test.rb +763 -785
  154. data/test/cases/disconnected_test.rb +30 -28
  155. data/test/cases/dup_test.rb +157 -157
  156. data/test/cases/enum_test.rb +444 -290
  157. data/test/cases/errors_test.rb +16 -0
  158. data/test/cases/explain_subscriber_test.rb +64 -64
  159. data/test/cases/explain_test.rb +87 -76
  160. data/test/cases/finder_respond_to_test.rb +60 -60
  161. data/test/cases/finder_test.rb +1294 -1169
  162. data/test/cases/fixture_set/file_test.rb +156 -138
  163. data/test/cases/fixtures_test.rb +988 -908
  164. data/test/cases/forbidden_attributes_protection_test.rb +165 -99
  165. data/test/cases/habtm_destroy_order_test.rb +61 -61
  166. data/test/cases/helper.rb +204 -210
  167. data/test/cases/hot_compatibility_test.rb +142 -54
  168. data/test/cases/i18n_test.rb +45 -45
  169. data/test/cases/inheritance_test.rb +606 -375
  170. data/test/cases/integration_test.rb +155 -139
  171. data/test/cases/invalid_connection_test.rb +24 -22
  172. data/test/cases/invertible_migration_test.rb +387 -295
  173. data/test/cases/json_serialization_test.rb +311 -302
  174. data/test/cases/locking_test.rb +493 -477
  175. data/test/cases/log_subscriber_test.rb +225 -136
  176. data/test/cases/migration/change_schema_test.rb +458 -512
  177. data/test/cases/migration/change_table_test.rb +256 -224
  178. data/test/cases/migration/column_attributes_test.rb +176 -192
  179. data/test/cases/migration/column_positioning_test.rb +56 -56
  180. data/test/cases/migration/columns_test.rb +310 -304
  181. data/test/cases/migration/command_recorder_test.rb +350 -305
  182. data/test/cases/migration/compatibility_test.rb +118 -0
  183. data/test/cases/migration/create_join_table_test.rb +157 -148
  184. data/test/cases/migration/foreign_key_test.rb +360 -328
  185. data/test/cases/migration/helper.rb +39 -39
  186. data/test/cases/migration/index_test.rb +218 -216
  187. data/test/cases/migration/logger_test.rb +36 -36
  188. data/test/cases/migration/pending_migrations_test.rb +52 -53
  189. data/test/cases/migration/references_foreign_key_test.rb +216 -169
  190. data/test/cases/migration/references_index_test.rb +101 -101
  191. data/test/cases/migration/references_statements_test.rb +136 -116
  192. data/test/cases/migration/rename_table_test.rb +93 -93
  193. data/test/cases/migration_test.rb +1157 -959
  194. data/test/cases/migrator_test.rb +470 -388
  195. data/test/cases/mixin_test.rb +68 -70
  196. data/test/cases/modules_test.rb +172 -173
  197. data/test/cases/multiparameter_attributes_test.rb +372 -350
  198. data/test/cases/multiple_db_test.rb +122 -115
  199. data/test/cases/nested_attributes_test.rb +1098 -1070
  200. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  201. data/test/cases/persistence_test.rb +1001 -909
  202. data/test/cases/pooled_connections_test.rb +81 -81
  203. data/test/cases/primary_keys_test.rb +376 -237
  204. data/test/cases/query_cache_test.rb +446 -326
  205. data/test/cases/quoting_test.rb +202 -156
  206. data/test/cases/readonly_test.rb +119 -118
  207. data/test/cases/reaper_test.rb +85 -85
  208. data/test/cases/reflection_test.rb +509 -463
  209. data/test/cases/relation/delegation_test.rb +63 -68
  210. data/test/cases/relation/merging_test.rb +157 -161
  211. data/test/cases/relation/mutation_test.rb +183 -165
  212. data/test/cases/relation/or_test.rb +92 -0
  213. data/test/cases/relation/predicate_builder_test.rb +16 -14
  214. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  215. data/test/cases/relation/where_chain_test.rb +105 -181
  216. data/test/cases/relation/where_clause_test.rb +182 -0
  217. data/test/cases/relation/where_test.rb +322 -300
  218. data/test/cases/relation_test.rb +328 -319
  219. data/test/cases/relations_test.rb +2026 -1815
  220. data/test/cases/reload_models_test.rb +22 -22
  221. data/test/cases/result_test.rb +90 -80
  222. data/test/cases/sanitize_test.rb +176 -83
  223. data/test/cases/schema_dumper_test.rb +457 -463
  224. data/test/cases/schema_loading_test.rb +52 -0
  225. data/test/cases/scoping/default_scoping_test.rb +528 -454
  226. data/test/cases/scoping/named_scoping_test.rb +561 -524
  227. data/test/cases/scoping/relation_scoping_test.rb +400 -357
  228. data/test/cases/secure_token_test.rb +32 -0
  229. data/test/cases/serialization_test.rb +104 -104
  230. data/test/cases/serialized_attribute_test.rb +364 -277
  231. data/test/cases/statement_cache_test.rb +136 -98
  232. data/test/cases/store_test.rb +195 -194
  233. data/test/cases/suppressor_test.rb +63 -0
  234. data/test/cases/tasks/database_tasks_test.rb +462 -398
  235. data/test/cases/tasks/mysql_rake_test.rb +345 -324
  236. data/test/cases/tasks/postgresql_rake_test.rb +304 -250
  237. data/test/cases/tasks/sqlite_rake_test.rb +220 -193
  238. data/test/cases/test_case.rb +131 -123
  239. data/test/cases/test_fixtures_test.rb +36 -0
  240. data/test/cases/time_precision_test.rb +102 -0
  241. data/test/cases/timestamp_test.rb +501 -467
  242. data/test/cases/touch_later_test.rb +121 -0
  243. data/test/cases/transaction_callbacks_test.rb +518 -452
  244. data/test/cases/transaction_isolation_test.rb +106 -106
  245. data/test/cases/transactions_test.rb +834 -817
  246. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  247. data/test/cases/type/date_time_test.rb +14 -0
  248. data/test/cases/type/integer_test.rb +27 -121
  249. data/test/cases/type/string_test.rb +22 -36
  250. data/test/cases/type/type_map_test.rb +177 -177
  251. data/test/cases/type_test.rb +39 -0
  252. data/test/cases/types_test.rb +24 -141
  253. data/test/cases/unconnected_test.rb +33 -33
  254. data/test/cases/validations/absence_validation_test.rb +73 -0
  255. data/test/cases/validations/association_validation_test.rb +97 -86
  256. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  257. data/test/cases/validations/i18n_validation_test.rb +86 -90
  258. data/test/cases/validations/length_validation_test.rb +79 -47
  259. data/test/cases/validations/presence_validation_test.rb +103 -68
  260. data/test/cases/validations/uniqueness_validation_test.rb +548 -457
  261. data/test/cases/validations_repair_helper.rb +19 -23
  262. data/test/cases/validations_test.rb +194 -165
  263. data/test/cases/view_test.rb +216 -119
  264. data/test/cases/yaml_serialization_test.rb +121 -126
  265. data/test/config.example.yml +97 -0
  266. data/test/config.rb +5 -5
  267. data/test/fixtures/accounts.yml +29 -29
  268. data/test/fixtures/admin/accounts.yml +2 -2
  269. data/test/fixtures/admin/users.yml +10 -10
  270. data/test/fixtures/author_addresses.original +11 -0
  271. data/test/fixtures/author_addresses.yml +17 -17
  272. data/test/fixtures/author_favorites.yml +3 -3
  273. data/test/fixtures/authors.original +17 -0
  274. data/test/fixtures/authors.yml +23 -23
  275. data/test/fixtures/bad_posts.yml +9 -0
  276. data/test/fixtures/binaries.yml +133 -133
  277. data/test/fixtures/books.yml +31 -11
  278. data/test/fixtures/bulbs.yml +5 -5
  279. data/test/fixtures/cars.yml +9 -9
  280. data/test/fixtures/categories.yml +19 -19
  281. data/test/fixtures/categories/special_categories.yml +9 -9
  282. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  283. data/test/fixtures/categories_ordered.yml +7 -7
  284. data/test/fixtures/categories_posts.yml +31 -31
  285. data/test/fixtures/categorizations.yml +23 -23
  286. data/test/fixtures/clubs.yml +8 -8
  287. data/test/fixtures/collections.yml +3 -3
  288. data/test/fixtures/colleges.yml +3 -3
  289. data/test/fixtures/comments.yml +65 -65
  290. data/test/fixtures/companies.yml +67 -67
  291. data/test/fixtures/computers.yml +10 -10
  292. data/test/fixtures/content.yml +3 -0
  293. data/test/fixtures/content_positions.yml +3 -0
  294. data/test/fixtures/courses.yml +8 -8
  295. data/test/fixtures/customers.yml +25 -25
  296. data/test/fixtures/dashboards.yml +6 -6
  297. data/test/fixtures/dead_parrots.yml +5 -0
  298. data/test/fixtures/developers.yml +22 -22
  299. data/test/fixtures/developers_projects.yml +16 -16
  300. data/test/fixtures/dog_lovers.yml +7 -7
  301. data/test/fixtures/dogs.yml +4 -4
  302. data/test/fixtures/doubloons.yml +3 -3
  303. data/test/fixtures/edges.yml +5 -5
  304. data/test/fixtures/entrants.yml +14 -14
  305. data/test/fixtures/essays.yml +6 -6
  306. data/test/fixtures/faces.yml +11 -11
  307. data/test/fixtures/fk_test_has_fk.yml +3 -3
  308. data/test/fixtures/fk_test_has_pk.yml +1 -1
  309. data/test/fixtures/friendships.yml +4 -4
  310. data/test/fixtures/funny_jokes.yml +10 -10
  311. data/test/fixtures/interests.yml +33 -33
  312. data/test/fixtures/items.yml +3 -3
  313. data/test/fixtures/jobs.yml +7 -7
  314. data/test/fixtures/legacy_things.yml +3 -3
  315. data/test/fixtures/live_parrots.yml +4 -0
  316. data/test/fixtures/mateys.yml +4 -4
  317. data/test/fixtures/member_details.yml +8 -8
  318. data/test/fixtures/member_types.yml +6 -6
  319. data/test/fixtures/members.yml +11 -11
  320. data/test/fixtures/memberships.yml +34 -34
  321. data/test/fixtures/men.yml +5 -5
  322. data/test/fixtures/minimalistics.yml +2 -2
  323. data/test/fixtures/minivans.yml +5 -5
  324. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  325. data/test/fixtures/mixins.yml +29 -29
  326. data/test/fixtures/movies.yml +7 -7
  327. data/test/fixtures/naked/yml/accounts.yml +1 -1
  328. data/test/fixtures/naked/yml/companies.yml +1 -1
  329. data/test/fixtures/naked/yml/courses.yml +1 -1
  330. data/test/fixtures/naked/yml/parrots.yml +2 -0
  331. data/test/fixtures/naked/yml/trees.yml +3 -0
  332. data/test/fixtures/nodes.yml +29 -0
  333. data/test/fixtures/organizations.yml +5 -5
  334. data/test/fixtures/other_comments.yml +6 -0
  335. data/test/fixtures/other_dogs.yml +2 -0
  336. data/test/fixtures/other_posts.yml +7 -0
  337. data/test/fixtures/other_topics.yml +42 -42
  338. data/test/fixtures/owners.yml +9 -9
  339. data/test/fixtures/parrots.yml +27 -27
  340. data/test/fixtures/parrots_pirates.yml +7 -7
  341. data/test/fixtures/people.yml +24 -24
  342. data/test/fixtures/peoples_treasures.yml +3 -3
  343. data/test/fixtures/pets.yml +19 -19
  344. data/test/fixtures/pirates.yml +15 -12
  345. data/test/fixtures/posts.yml +80 -80
  346. data/test/fixtures/price_estimates.yml +16 -7
  347. data/test/fixtures/products.yml +4 -4
  348. data/test/fixtures/projects.yml +7 -7
  349. data/test/fixtures/ratings.yml +14 -14
  350. data/test/fixtures/readers.yml +11 -11
  351. data/test/fixtures/references.yml +17 -17
  352. data/test/fixtures/reserved_words/distinct.yml +5 -5
  353. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  354. data/test/fixtures/reserved_words/group.yml +14 -14
  355. data/test/fixtures/reserved_words/select.yml +8 -8
  356. data/test/fixtures/reserved_words/values.yml +7 -7
  357. data/test/fixtures/ships.yml +6 -6
  358. data/test/fixtures/speedometers.yml +8 -8
  359. data/test/fixtures/sponsors.yml +12 -12
  360. data/test/fixtures/string_key_objects.yml +7 -7
  361. data/test/fixtures/subscribers.yml +10 -10
  362. data/test/fixtures/subscriptions.yml +12 -12
  363. data/test/fixtures/taggings.yml +78 -78
  364. data/test/fixtures/tags.yml +11 -11
  365. data/test/fixtures/tasks.yml +7 -7
  366. data/test/fixtures/teapots.yml +3 -3
  367. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  368. data/test/fixtures/to_be_linked/users.yml +10 -10
  369. data/test/fixtures/topics.yml +49 -49
  370. data/test/fixtures/toys.yml +14 -14
  371. data/test/fixtures/traffic_lights.yml +9 -9
  372. data/test/fixtures/treasures.yml +10 -10
  373. data/test/fixtures/trees.yml +3 -0
  374. data/test/fixtures/uuid_children.yml +3 -3
  375. data/test/fixtures/uuid_parents.yml +2 -2
  376. data/test/fixtures/variants.yml +4 -4
  377. data/test/fixtures/vegetables.yml +19 -19
  378. data/test/fixtures/vertices.yml +3 -3
  379. data/test/fixtures/warehouse_things.yml +2 -2
  380. data/test/fixtures/zines.yml +5 -5
  381. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  382. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  383. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  384. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  385. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  386. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  387. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  388. data/test/migrations/rename/1_we_need_things.rb +11 -11
  389. data/test/migrations/rename/2_rename_things.rb +9 -9
  390. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  391. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  392. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  393. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  394. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  395. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  396. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  397. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  398. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  399. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  400. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  401. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  402. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  403. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  404. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  405. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  406. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  407. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  408. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  409. data/test/models/admin.rb +5 -5
  410. data/test/models/admin/account.rb +3 -3
  411. data/test/models/admin/randomly_named_c1.rb +6 -2
  412. data/test/models/admin/user.rb +40 -40
  413. data/test/models/aircraft.rb +5 -4
  414. data/test/models/arunit2_model.rb +3 -3
  415. data/test/models/author.rb +209 -212
  416. data/test/models/auto_id.rb +4 -4
  417. data/test/models/autoloadable/extra_firm.rb +2 -2
  418. data/test/models/binary.rb +2 -2
  419. data/test/models/bird.rb +12 -12
  420. data/test/models/book.rb +23 -18
  421. data/test/models/boolean.rb +2 -2
  422. data/test/models/bulb.rb +52 -51
  423. data/test/models/cake_designer.rb +3 -3
  424. data/test/models/car.rb +29 -26
  425. data/test/models/carrier.rb +2 -2
  426. data/test/models/cat.rb +10 -0
  427. data/test/models/categorization.rb +19 -19
  428. data/test/models/category.rb +35 -35
  429. data/test/models/chef.rb +8 -7
  430. data/test/models/citation.rb +3 -3
  431. data/test/models/club.rb +25 -23
  432. data/test/models/college.rb +10 -10
  433. data/test/models/column.rb +3 -3
  434. data/test/models/column_name.rb +3 -3
  435. data/test/models/comment.rb +76 -64
  436. data/test/models/company.rb +230 -228
  437. data/test/models/company_in_module.rb +98 -98
  438. data/test/models/computer.rb +3 -3
  439. data/test/models/contact.rb +41 -41
  440. data/test/models/content.rb +40 -0
  441. data/test/models/contract.rb +20 -20
  442. data/test/models/country.rb +7 -7
  443. data/test/models/course.rb +6 -6
  444. data/test/models/customer.rb +83 -77
  445. data/test/models/customer_carrier.rb +14 -14
  446. data/test/models/dashboard.rb +3 -3
  447. data/test/models/default.rb +2 -2
  448. data/test/models/department.rb +4 -4
  449. data/test/models/developer.rb +274 -255
  450. data/test/models/dog.rb +5 -5
  451. data/test/models/dog_lover.rb +5 -5
  452. data/test/models/doubloon.rb +12 -12
  453. data/test/models/drink_designer.rb +3 -3
  454. data/test/models/edge.rb +5 -5
  455. data/test/models/electron.rb +5 -5
  456. data/test/models/engine.rb +4 -4
  457. data/test/models/entrant.rb +3 -3
  458. data/test/models/essay.rb +5 -5
  459. data/test/models/event.rb +3 -3
  460. data/test/models/eye.rb +37 -37
  461. data/test/models/face.rb +9 -9
  462. data/test/models/friendship.rb +6 -6
  463. data/test/models/guid.rb +2 -2
  464. data/test/models/guitar.rb +4 -0
  465. data/test/models/hotel.rb +11 -9
  466. data/test/models/image.rb +3 -3
  467. data/test/models/interest.rb +5 -5
  468. data/test/models/invoice.rb +4 -4
  469. data/test/models/item.rb +7 -7
  470. data/test/models/job.rb +7 -7
  471. data/test/models/joke.rb +7 -7
  472. data/test/models/keyboard.rb +3 -3
  473. data/test/models/legacy_thing.rb +3 -3
  474. data/test/models/lesson.rb +11 -11
  475. data/test/models/line_item.rb +3 -3
  476. data/test/models/liquid.rb +4 -4
  477. data/test/models/man.rb +11 -11
  478. data/test/models/matey.rb +4 -4
  479. data/test/models/member.rb +42 -41
  480. data/test/models/member_detail.rb +8 -7
  481. data/test/models/member_type.rb +3 -3
  482. data/test/models/membership.rb +35 -35
  483. data/test/models/mentor.rb +3 -0
  484. data/test/models/minimalistic.rb +2 -2
  485. data/test/models/minivan.rb +9 -9
  486. data/test/models/mixed_case_monkey.rb +3 -3
  487. data/test/models/mocktail_designer.rb +2 -0
  488. data/test/models/molecule.rb +6 -6
  489. data/test/models/movie.rb +5 -5
  490. data/test/models/node.rb +5 -0
  491. data/test/models/non_primary_key.rb +2 -0
  492. data/test/models/notification.rb +3 -0
  493. data/test/models/order.rb +4 -4
  494. data/test/models/organization.rb +14 -14
  495. data/test/models/other_dog.rb +5 -0
  496. data/test/models/owner.rb +37 -34
  497. data/test/models/parrot.rb +28 -29
  498. data/test/models/person.rb +142 -143
  499. data/test/models/personal_legacy_thing.rb +4 -4
  500. data/test/models/pet.rb +18 -15
  501. data/test/models/pet_treasure.rb +6 -0
  502. data/test/models/pirate.rb +92 -92
  503. data/test/models/possession.rb +3 -3
  504. data/test/models/post.rb +273 -264
  505. data/test/models/price_estimate.rb +4 -4
  506. data/test/models/professor.rb +5 -5
  507. data/test/models/project.rb +40 -31
  508. data/test/models/publisher.rb +2 -2
  509. data/test/models/publisher/article.rb +4 -4
  510. data/test/models/publisher/magazine.rb +3 -3
  511. data/test/models/randomly_named_c1.rb +1 -1
  512. data/test/models/rating.rb +4 -4
  513. data/test/models/reader.rb +23 -23
  514. data/test/models/recipe.rb +3 -0
  515. data/test/models/record.rb +2 -2
  516. data/test/models/reference.rb +22 -22
  517. data/test/models/reply.rb +61 -61
  518. data/test/models/ship.rb +39 -33
  519. data/test/models/ship_part.rb +8 -8
  520. data/test/models/shop.rb +17 -17
  521. data/test/models/shop_account.rb +6 -6
  522. data/test/models/speedometer.rb +6 -6
  523. data/test/models/sponsor.rb +7 -7
  524. data/test/models/string_key_object.rb +3 -3
  525. data/test/models/student.rb +4 -4
  526. data/test/models/subject.rb +16 -16
  527. data/test/models/subscriber.rb +8 -8
  528. data/test/models/subscription.rb +4 -4
  529. data/test/models/tag.rb +13 -7
  530. data/test/models/tagging.rb +13 -13
  531. data/test/models/task.rb +5 -5
  532. data/test/models/topic.rb +118 -124
  533. data/test/models/toy.rb +6 -6
  534. data/test/models/traffic_light.rb +4 -4
  535. data/test/models/treasure.rb +14 -14
  536. data/test/models/treaty.rb +7 -7
  537. data/test/models/tree.rb +3 -0
  538. data/test/models/tuning_peg.rb +4 -0
  539. data/test/models/tyre.rb +11 -11
  540. data/test/models/user.rb +14 -0
  541. data/test/models/uuid_child.rb +3 -3
  542. data/test/models/uuid_item.rb +6 -0
  543. data/test/models/uuid_parent.rb +3 -3
  544. data/test/models/vegetables.rb +24 -24
  545. data/test/models/vehicle.rb +6 -6
  546. data/test/models/vertex.rb +9 -9
  547. data/test/models/warehouse_thing.rb +5 -5
  548. data/test/models/wheel.rb +3 -3
  549. data/test/models/without_table.rb +3 -3
  550. data/test/models/zine.rb +3 -3
  551. data/test/schema/mysql2_specific_schema.rb +68 -58
  552. data/test/schema/oracle_specific_schema.rb +40 -43
  553. data/test/schema/postgresql_specific_schema.rb +114 -202
  554. data/test/schema/schema.rb +1057 -952
  555. data/test/schema/schema.rb.original +1057 -0
  556. data/test/schema/sqlite_specific_schema.rb +18 -22
  557. data/test/support/config.rb +43 -43
  558. data/test/support/connection.rb +23 -22
  559. data/test/support/connection_helper.rb +14 -14
  560. data/test/support/ddl_helper.rb +8 -8
  561. data/test/support/schema_dumping_helper.rb +20 -20
  562. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  563. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  564. metadata +129 -24
  565. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  566. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  567. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  568. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  569. data/test/cases/migration/table_and_index_test.rb +0 -24
  570. data/test/cases/relation/where_test2.rb +0 -36
  571. data/test/cases/type/decimal_test.rb +0 -56
  572. data/test/cases/type/unsigned_integer_test.rb +0 -18
  573. data/test/cases/xml_serialization_test.rb +0 -457
  574. data/test/connections/native_ibm_db/connection.rb +0 -44
  575. data/test/fixtures/naked/csv/accounts.csv +0 -1
  576. data/test/schema/i5/ibm_db_specific_schema.rb +0 -137
  577. data/test/schema/ids/ibm_db_specific_schema.rb +0 -140
  578. data/test/schema/luw/ibm_db_specific_schema.rb +0 -137
  579. data/test/schema/mysql_specific_schema.rb +0 -70
  580. data/test/schema/zOS/ibm_db_specific_schema.rb +0 -208
@@ -1,448 +0,0 @@
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,325 +0,0 @@
1
- require 'cases/helper'
2
- require 'support/ddl_helper'
3
- require 'support/schema_dumping_helper'
4
-
5
- if ActiveRecord::Base.connection.supports_foreign_keys?
6
- module ActiveRecord
7
- class Migration
8
- class ForeignKeyTest < ActiveRecord::TestCase
9
- include DdlHelper
10
- include SchemaDumpingHelper
11
-
12
- class Rocket < ActiveRecord::Base
13
- end
14
-
15
- class Astronaut < ActiveRecord::Base
16
- end
17
-
18
- setup do
19
- @connection = ActiveRecord::Base.connection
20
- @connection.create_table "rockets", force: true do |t|
21
- t.string :name
22
- end
23
-
24
- @connection.create_table "astronauts", force: true do |t|
25
- t.string :name
26
- t.references :rocket
27
- end
28
- end
29
-
30
-
31
- teardown do
32
- if defined?(@connection)
33
- #@connection.drop_table "astronauts" if @connection.table_exists? 'astronauts'
34
- #@connection.drop_table "rockets" if @connection.table_exists? 'rockets'
35
- end
36
- end
37
-
38
- def test_foreign_keys
39
- foreign_keys = @connection.foreign_keys("fk_test_has_fk")
40
- assert_equal 1, foreign_keys.size
41
-
42
- fk = foreign_keys.first
43
- if current_adapter?(:IBM_DBAdapter)
44
- assert_equal "fk_test_has_fk".upcase, fk.from_table.upcase
45
- assert_equal "fk_test_has_pk".upcase, fk.to_table.upcase
46
- else
47
- assert_equal "fk_test_has_fk", fk.from_table
48
- assert_equal "fk_test_has_pk", fk.to_table
49
- end
50
-
51
- assert_equal "fk_id", fk.column
52
- assert_equal "pk_id", fk.primary_key
53
- assert_equal "fk_name", fk.name
54
- end
55
-
56
- def test_add_foreign_key_inferes_column
57
- @connection.add_foreign_key :astronauts, :rockets
58
-
59
- foreign_keys = @connection.foreign_keys("astronauts")
60
- assert_equal 1, foreign_keys.size
61
-
62
- fk = foreign_keys.first
63
- if current_adapter?(:IBM_DBAdapter)
64
- assert_equal "astronauts".upcase, fk.from_table.upcase
65
- else
66
- assert_equal "astronauts", fk.from_table
67
- end
68
- assert_equal "rockets", fk.to_table
69
- assert_equal "rocket_id", fk.column
70
- assert_equal "id", fk.primary_key
71
- assert_equal("fk_rails_78146ddd2e", fk.name)
72
- end
73
-
74
- def test_add_foreign_key_with_column
75
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
76
-
77
- foreign_keys = @connection.foreign_keys("astronauts")
78
- assert_equal 1, foreign_keys.size
79
-
80
- fk = foreign_keys.first
81
- if current_adapter?(:IBM_DBAdapter)
82
- assert_equal "astronauts".upcase, fk.from_table.upcase
83
- else
84
- assert_equal "astronauts", fk.from_table
85
- end
86
- assert_equal "rockets", fk.to_table
87
- assert_equal "rocket_id", fk.column
88
- assert_equal "id", fk.primary_key
89
- assert_equal("fk_rails_78146ddd2e", fk.name)
90
- end
91
-
92
- def test_add_foreign_key_with_non_standard_primary_key
93
- #@connection.create_table :space_shuttles, force: true, id: false do |t|
94
- # t.primary_key :pk
95
- #end
96
- with_example_table @connection, "space_shuttles", "pk integer PRIMARY KEY" do
97
- @connection.add_foreign_key(:astronauts, :space_shuttles,
98
- column: "rocket_id", primary_key: "pk", name: "custom_pk")
99
-
100
- foreign_keys = @connection.foreign_keys("astronauts")
101
- assert_equal 1, foreign_keys.size
102
-
103
- fk = foreign_keys.first
104
- if current_adapter?(:IBM_DBAdapter)
105
- assert_equal "astronauts".upcase, fk.from_table.upcase
106
- else
107
- assert_equal "astronauts", fk.from_table
108
- end
109
- assert_equal "space_shuttles", fk.to_table
110
- assert_equal "pk", fk.primary_key
111
-
112
- @connection.remove_foreign_key :astronauts, name: "custom_pk"
113
- end
114
- end
115
-
116
- def test_add_on_delete_restrict_foreign_key
117
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :restrict
118
-
119
- foreign_keys = @connection.foreign_keys("astronauts")
120
- assert_equal 1, foreign_keys.size
121
-
122
- fk = foreign_keys.first
123
- if current_adapter?(:MysqlAdapter, :Mysql2Adapter)
124
- # ON DELETE RESTRICT is the default on MySQL
125
- assert_equal "noaction", fk.on_delete
126
- elsif current_adapter?(:IBM_DBAdapter)
127
- assert_equal :noaction, fk.on_update
128
- else
129
- assert_equal :restrict, fk.on_delete
130
- end
131
- end
132
-
133
- def test_add_on_delete_cascade_foreign_key
134
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :cascade
135
-
136
- foreign_keys = @connection.foreign_keys("astronauts")
137
- assert_equal 1, foreign_keys.size
138
-
139
- fk = foreign_keys.first
140
-
141
- if current_adapter?(:IBM_DBAdapter)
142
- assert_equal :noaction, fk.on_update
143
- else
144
- assert_equal :cascade, fk.on_delete
145
- end
146
-
147
- end
148
-
149
- def test_add_on_delete_nullify_foreign_key
150
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify
151
-
152
- foreign_keys = @connection.foreign_keys("astronauts")
153
- assert_equal 1, foreign_keys.size
154
-
155
- fk = foreign_keys.first
156
-
157
- if current_adapter?(:IBM_DBAdapter)
158
- assert_equal :noaction, fk.on_update
159
- else
160
- assert_equal :nullify, fk.on_delete
161
- end
162
-
163
- end
164
-
165
- def test_on_update_and_on_delete_raises_with_invalid_values
166
- assert_raises ArgumentError do
167
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :invalid
168
- end
169
-
170
- assert_raises ArgumentError do
171
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_update: :invalid
172
- end
173
- end
174
-
175
- def test_add_foreign_key_with_on_update
176
- #@connection.add_foreign_key :astronauts, :rockets, column: "rocket_id" , on_update: :nullify
177
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
178
-
179
- foreign_keys = @connection.foreign_keys("astronauts")
180
- assert_equal 1, foreign_keys.size
181
-
182
- fk = foreign_keys.first
183
-
184
- if current_adapter?(:IBM_DBAdapter)
185
- assert_equal :noaction, fk.on_update
186
- else
187
- assert_equal :nullify, fk.on_update
188
- end
189
-
190
- end
191
-
192
- def test_remove_foreign_key_inferes_column
193
- @connection.add_foreign_key :astronauts, :rockets
194
-
195
- assert_equal 1, @connection.foreign_keys("astronauts").size
196
- @connection.remove_foreign_key :astronauts, :rockets
197
- assert_equal [], @connection.foreign_keys("astronauts")
198
- end
199
-
200
- def test_remove_foreign_key_by_column
201
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
202
-
203
- assert_equal 1, @connection.foreign_keys("astronauts").size
204
- @connection.remove_foreign_key :astronauts, column: "rocket_id"
205
- assert_equal [], @connection.foreign_keys("astronauts")
206
- end
207
-
208
- def test_remove_foreign_key_by_symbol_column
209
- @connection.add_foreign_key :astronauts, :rockets, column: :rocket_id
210
-
211
- assert_equal 1, @connection.foreign_keys("astronauts").size
212
- @connection.remove_foreign_key :astronauts, column: :rocket_id
213
- assert_equal [], @connection.foreign_keys("astronauts")
214
- end
215
-
216
- def test_remove_foreign_key_by_name
217
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", name: "fancy_named_fk"
218
-
219
- assert_equal 1, @connection.foreign_keys("astronauts").size
220
- @connection.remove_foreign_key :astronauts, name: "fancy_named_fk"
221
- assert_equal [], @connection.foreign_keys("astronauts")
222
- end
223
-
224
- def test_remove_foreign_non_existing_foreign_key_raises
225
- assert_raises ArgumentError do
226
- @connection.remove_foreign_key :astronauts, :rockets
227
- end
228
- end
229
-
230
- def test_schema_dumping
231
- @connection.add_foreign_key :astronauts, :rockets
232
- output = dump_table_schema "astronauts"
233
- assert_match %r{\s+add_foreign_key "astronauts", "rockets"$}, output
234
- end
235
-
236
- def test_schema_dumping_with_options
237
- output = dump_table_schema "fk_test_has_fk"
238
- assert_match %r{\s+add_foreign_key "fk_test_has_fk", "fk_test_has_pk", column: "fk_id", primary_key: "pk_id", name: "fk_name"$}, output
239
- end
240
-
241
- def test_schema_dumping_on_delete_and_on_update_options
242
- #@connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify, on_update: :cascade
243
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify, on_update: :restrict
244
-
245
- output = dump_table_schema "astronauts"
246
- #assert_match %r{\s+add_foreign_key "astronauts",.+on_update: :cascade,.+on_delete: :nullify$}, output
247
- assert_match %r{\s+add_foreign_key "astronauts",.+on_update: :restrict,.+on_delete: :nullify$}, output
248
- end
249
-
250
- class CreateCitiesAndHousesMigration < ActiveRecord::Migration
251
- def change
252
- create_table("cities") { |t| }
253
-
254
- create_table("houses") do |t|
255
- t.column :city_id, :integer
256
- end
257
- add_foreign_key :houses, :cities, column: "city_id"
258
- end
259
- end
260
-
261
- def test_add_foreign_key_is_reversible
262
- migration = CreateCitiesAndHousesMigration.new
263
- silence_stream($stdout) { migration.migrate(:up) }
264
- assert_equal 1, @connection.foreign_keys("houses").size
265
- ensure
266
- silence_stream($stdout) { migration.migrate(:down) }
267
- end
268
- class CreateSchoolsAndClassesMigration < ActiveRecord::Migration
269
- def change
270
- create_table(:schools)
271
-
272
- create_table(:classes) do |t|
273
- t.column :school_id, :integer
274
- end
275
- add_foreign_key :classes, :schools
276
- end
277
- end
278
-
279
- def test_add_foreign_key_with_prefix
280
- ActiveRecord::Base.table_name_prefix = 'p_'
281
- migration = CreateSchoolsAndClassesMigration.new
282
- silence_stream($stdout) { migration.migrate(:up) }
283
- assert_equal 1, @connection.foreign_keys("p_classes").size
284
- ensure
285
- silence_stream($stdout) { migration.migrate(:down) }
286
- ActiveRecord::Base.table_name_prefix = nil
287
- end
288
-
289
- def test_add_foreign_key_with_suffix
290
- ActiveRecord::Base.table_name_suffix = '_s'
291
- migration = CreateSchoolsAndClassesMigration.new
292
- silence_stream($stdout) { migration.migrate(:up) }
293
- assert_equal 1, @connection.foreign_keys("classes_s").size
294
- ensure
295
- silence_stream($stdout) { migration.migrate(:down) }
296
- ActiveRecord::Base.table_name_suffix = nil
297
- end
298
- end
299
- end
300
- end
301
- else
302
- module ActiveRecord
303
- class Migration
304
- class NoForeignKeySupportTest < ActiveRecord::TestCase
305
- setup do
306
- @connection = ActiveRecord::Base.connection
307
- end
308
-
309
- def test_add_foreign_key_should_be_noop
310
- @connection.add_foreign_key :clubs, :categories
311
- end
312
-
313
- def test_remove_foreign_key_should_be_noop
314
- @connection.remove_foreign_key :clubs, :categories
315
- end
316
-
317
- def test_foreign_keys_should_raise_not_implemented
318
- assert_raises NotImplementedError do
319
- @connection.foreign_keys("clubs")
320
- end
321
- end
322
- end
323
- end
324
- end
325
- end