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,39 +1,39 @@
1
- require "cases/helper"
2
-
3
- module ActiveRecord
4
- class Migration
5
- class << self; attr_accessor :message_count; end
6
- self.message_count = 0
7
-
8
- module TestHelper
9
- attr_reader :connection, :table_name
10
-
11
- CONNECTION_METHODS = %w[add_column remove_column rename_column add_index change_column rename_table column_exists? index_exists? add_reference add_belongs_to remove_reference remove_references remove_belongs_to]
12
-
13
- class TestModel < ActiveRecord::Base
14
- self.table_name = :test_models
15
- end
16
-
17
- def setup
18
- super
19
- @connection = ActiveRecord::Base.connection
20
- connection.create_table :test_models do |t|
21
- t.timestamps null: true
22
- end
23
-
24
- TestModel.reset_column_information
25
- end
26
-
27
- def teardown
28
- super
29
- TestModel.reset_table_name
30
- TestModel.reset_sequence_name
31
- connection.drop_table :test_models rescue nil
32
- end
33
-
34
- private
35
-
36
- delegate(*CONNECTION_METHODS, to: :connection)
37
- end
38
- end
39
- end
1
+ require "cases/helper"
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ class << self; attr_accessor :message_count; end
6
+ self.message_count = 0
7
+
8
+ module TestHelper
9
+ attr_reader :connection, :table_name
10
+
11
+ CONNECTION_METHODS = %w[add_column remove_column rename_column add_index change_column rename_table column_exists? index_exists? add_reference add_belongs_to remove_reference remove_references remove_belongs_to]
12
+
13
+ class TestModel < ActiveRecord::Base
14
+ self.table_name = :test_models
15
+ end
16
+
17
+ def setup
18
+ super
19
+ @connection = ActiveRecord::Base.connection
20
+ connection.create_table :test_models do |t|
21
+ t.timestamps null: true
22
+ end
23
+
24
+ TestModel.reset_column_information
25
+ end
26
+
27
+ def teardown
28
+ super
29
+ TestModel.reset_table_name
30
+ TestModel.reset_sequence_name
31
+ connection.drop_table :test_models, if_exists: true
32
+ end
33
+
34
+ private
35
+
36
+ delegate(*CONNECTION_METHODS, to: :connection)
37
+ end
38
+ end
39
+ end
@@ -1,216 +1,218 @@
1
- require 'cases/helper'
2
-
3
- module ActiveRecord
4
- class Migration
5
- class IndexTest < ActiveRecord::TestCase
6
- attr_reader :connection, :table_name
7
-
8
- def setup
9
- super
10
- @connection = ActiveRecord::Base.connection
11
- @table_name = :testings
12
-
13
- if current_adapter?(:IBM_DBAdapter)
14
- connection.drop_table :testings rescue nil
15
- end
16
-
17
- connection.create_table table_name do |t|
18
- t.column :foo, :string, :limit => 100
19
- t.column :bar, :string, :limit => 100
20
-
21
- t.string :first_name
22
- t.string :last_name, :limit => 100
23
- t.string :key, :limit => 100
24
- t.boolean :administrator
25
- end
26
- end
27
-
28
- teardown do
29
- connection.drop_table :testings rescue nil
30
- ActiveRecord::Base.primary_key_prefix_type = nil
31
- end
32
-
33
- def test_rename_index
34
- # keep the names short to make Oracle and similar behave
35
- connection.add_index(table_name, [:foo], :name => 'old_idx')
36
- connection.rename_index(table_name, 'old_idx', 'new_idx')
37
-
38
- # if the adapter doesn't support the indexes call, pick defaults that let the test pass
39
- assert_not connection.index_name_exists?(table_name, 'old_idx', false)
40
- assert connection.index_name_exists?(table_name, 'new_idx', true)
41
- end
42
-
43
- def test_rename_index_too_long
44
- too_long_index_name = good_index_name + 'x'
45
- # keep the names short to make Oracle and similar behave
46
- connection.add_index(table_name, [:foo], :name => 'old_idx')
47
- e = assert_raises(ArgumentError) {
48
- connection.rename_index(table_name, 'old_idx', too_long_index_name)
49
- }
50
- assert_match(/too long; the limit is #{connection.allowed_index_name_length} characters/, e.message)
51
-
52
- # if the adapter doesn't support the indexes call, pick defaults that let the test pass
53
- assert connection.index_name_exists?(table_name, 'old_idx', false)
54
- end
55
-
56
-
57
- def test_double_add_index
58
- connection.add_index(table_name, [:foo], :name => 'some_idx')
59
- assert_raises(ArgumentError) {
60
- connection.add_index(table_name, [:foo], :name => 'some_idx')
61
- }
62
- end
63
-
64
- def test_remove_nonexistent_index
65
- if current_adapter?(:IBM_DBAdapter)
66
- assert_raise(ArgumentError) { connection.remove_index(table_name, "no_such_index") }
67
- else
68
- assert_raise(ArgumentError) { connection.remove_index(table_name, "no_such_index") }
69
- end
70
- end
71
-
72
- def test_add_index_works_with_long_index_names
73
- connection.add_index(table_name, "foo", name: good_index_name)
74
-
75
- assert connection.index_name_exists?(table_name, good_index_name, false)
76
- connection.remove_index(table_name, name: good_index_name)
77
- end
78
-
79
- def test_add_index_does_not_accept_too_long_index_names
80
- too_long_index_name = good_index_name + 'x'
81
-
82
- e = assert_raises(ArgumentError) {
83
- connection.add_index(table_name, "foo", name: too_long_index_name)
84
- }
85
- assert_match(/too long; the limit is #{connection.allowed_index_name_length} characters/, e.message)
86
-
87
- assert_not connection.index_name_exists?(table_name, too_long_index_name, false)
88
- connection.add_index(table_name, "foo", :name => good_index_name)
89
- end
90
-
91
- def test_internal_index_with_name_matching_database_limit
92
- good_index_name = 'x' * connection.index_name_length
93
- connection.add_index(table_name, "foo", name: good_index_name, internal: true)
94
-
95
- assert connection.index_name_exists?(table_name, good_index_name, false)
96
- connection.remove_index(table_name, name: good_index_name)
97
- end
98
-
99
- def test_index_symbol_names
100
- connection.add_index table_name, :foo, :name => :symbol_index_name
101
- assert connection.index_exists?(table_name, :foo, :name => :symbol_index_name)
102
-
103
- connection.remove_index table_name, :name => :symbol_index_name
104
- assert_not connection.index_exists?(table_name, :foo, :name => :symbol_index_name)
105
- end
106
-
107
- def test_index_exists
108
- connection.add_index :testings, :foo
109
-
110
- assert connection.index_exists?(:testings, :foo)
111
- assert !connection.index_exists?(:testings, :bar)
112
- end
113
-
114
- def test_index_exists_on_multiple_columns
115
- connection.add_index :testings, [:foo, :bar]
116
-
117
- assert connection.index_exists?(:testings, [:foo, :bar])
118
- end
119
-
120
- def test_index_exists_with_custom_name_checks_columns
121
- connection.add_index :testings, [:foo, :bar], name: "my_index"
122
- assert connection.index_exists?(:testings, [:foo, :bar], name: "my_index")
123
- assert_not connection.index_exists?(:testings, [:foo], name: "my_index")
124
- end
125
-
126
- def test_valid_index_options
127
- assert_raise ArgumentError do
128
- connection.add_index :testings, :foo, unqiue: true
129
- end
130
- end
131
-
132
- def test_unique_index_exists
133
- connection.add_index :testings, :foo, :unique => true
134
-
135
- assert connection.index_exists?(:testings, :foo, :unique => true)
136
- end
137
-
138
- def test_named_index_exists
139
- connection.add_index :testings, :foo, :name => "custom_index_name"
140
-
141
- assert connection.index_exists?(:testings, :foo, :name => "custom_index_name")
142
- end
143
-
144
- def test_add_index_attribute_length_limit
145
- connection.add_index :testings, [:foo, :bar], :length => {:foo => 10, :bar => nil}
146
-
147
- assert connection.index_exists?(:testings, [:foo, :bar])
148
- end
149
-
150
- def test_add_index
151
- connection.add_index("testings", "last_name")
152
- connection.remove_index("testings", "last_name")
153
-
154
- connection.add_index("testings", ["last_name", "first_name"])
155
- connection.remove_index("testings", :column => ["last_name", "first_name"])
156
-
157
- # Oracle adapter cannot have specified index name larger than 30 characters
158
- # Oracle adapter is shortening index name when just column list is given
159
- unless current_adapter?(:OracleAdapter)
160
- connection.add_index("testings", ["last_name", "first_name"])
161
- connection.remove_index("testings", :name => :index_testings_on_last_name_and_first_name)
162
- connection.add_index("testings", ["last_name", "first_name"])
163
- connection.remove_index("testings", "last_name_and_first_name")
164
- end
165
- connection.add_index("testings", ["last_name", "first_name"])
166
- connection.remove_index("testings", ["last_name", "first_name"])
167
-
168
- connection.add_index("testings", ["last_name"], :length => 10)
169
- connection.remove_index("testings", "last_name")
170
-
171
- connection.add_index("testings", ["last_name"], :length => {:last_name => 10})
172
- connection.remove_index("testings", ["last_name"])
173
-
174
- connection.add_index("testings", ["last_name", "first_name"], :length => 10)
175
- connection.remove_index("testings", ["last_name", "first_name"])
176
-
177
- connection.add_index("testings", ["last_name", "first_name"], :length => {:last_name => 10, :first_name => 20})
178
- connection.remove_index("testings", ["last_name", "first_name"])
179
-
180
- connection.add_index("testings", ["key"], :name => "key_idx", :unique => true)
181
- connection.remove_index("testings", :name => "key_idx", :unique => true)
182
-
183
- connection.add_index("testings", %w(last_name first_name administrator), :name => "named_admin")
184
- connection.remove_index("testings", :name => "named_admin")
185
-
186
- # Selected adapters support index sort order
187
- if current_adapter?(:SQLite3Adapter, :MysqlAdapter, :Mysql2Adapter, :PostgreSQLAdapter)
188
- connection.add_index("testings", ["last_name"], :order => {:last_name => :desc})
189
- connection.remove_index("testings", ["last_name"])
190
- connection.add_index("testings", ["last_name", "first_name"], :order => {:last_name => :desc})
191
- connection.remove_index("testings", ["last_name", "first_name"])
192
- connection.add_index("testings", ["last_name", "first_name"], :order => {:last_name => :desc, :first_name => :asc})
193
- connection.remove_index("testings", ["last_name", "first_name"])
194
- connection.add_index("testings", ["last_name", "first_name"], :order => :desc)
195
- connection.remove_index("testings", ["last_name", "first_name"])
196
- end
197
- end
198
-
199
- if current_adapter?(:PostgreSQLAdapter)
200
- def test_add_partial_index
201
- connection.add_index("testings", "last_name", :where => "first_name = 'john doe'")
202
- assert connection.index_exists?("testings", "last_name")
203
-
204
- connection.remove_index("testings", "last_name")
205
- assert !connection.index_exists?("testings", "last_name")
206
- end
207
- end
208
-
209
- private
210
- def good_index_name
211
- 'x' * connection.allowed_index_name_length
212
- end
213
-
214
- end
215
- end
216
- end
1
+ require 'cases/helper'
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ class IndexTest < ActiveRecord::TestCase
6
+ attr_reader :connection, :table_name
7
+
8
+ def setup
9
+ super
10
+ @connection = ActiveRecord::Base.connection
11
+ @table_name = :testings
12
+
13
+ connection.create_table table_name do |t|
14
+ t.column :foo, :string, :limit => 100
15
+ t.column :bar, :string, :limit => 100
16
+
17
+ t.string :first_name
18
+ t.string :last_name, :limit => 100
19
+ t.string :key, :limit => 100
20
+ t.boolean :administrator
21
+ end
22
+ end
23
+
24
+ teardown do
25
+ connection.drop_table :testings rescue nil
26
+ ActiveRecord::Base.primary_key_prefix_type = nil
27
+ end
28
+
29
+ def test_rename_index
30
+ # keep the names short to make Oracle and similar behave
31
+ connection.add_index(table_name, [:foo], :name => 'old_idx')
32
+ connection.rename_index(table_name, 'old_idx', 'new_idx')
33
+
34
+ # if the adapter doesn't support the indexes call, pick defaults that let the test pass
35
+ assert_not connection.index_name_exists?(table_name, 'old_idx', false)
36
+ assert connection.index_name_exists?(table_name, 'new_idx', true)
37
+ end
38
+
39
+ def test_rename_index_too_long
40
+ too_long_index_name = good_index_name + 'x'
41
+ # keep the names short to make Oracle and similar behave
42
+ connection.add_index(table_name, [:foo], :name => 'old_idx')
43
+ e = assert_raises(ArgumentError) {
44
+ connection.rename_index(table_name, 'old_idx', too_long_index_name)
45
+ }
46
+ assert_match(/too long; the limit is #{connection.allowed_index_name_length} characters/, e.message)
47
+
48
+ # if the adapter doesn't support the indexes call, pick defaults that let the test pass
49
+ assert connection.index_name_exists?(table_name, 'old_idx', false)
50
+ end
51
+
52
+
53
+ def test_double_add_index
54
+ connection.add_index(table_name, [:foo], :name => 'some_idx')
55
+ assert_raises(ArgumentError) {
56
+ connection.add_index(table_name, [:foo], :name => 'some_idx')
57
+ }
58
+ end
59
+
60
+ def test_remove_nonexistent_index
61
+ assert_raise(ArgumentError) { connection.remove_index(table_name, "no_such_index") }
62
+ end
63
+
64
+ def test_add_index_works_with_long_index_names
65
+ connection.add_index(table_name, "foo", name: good_index_name)
66
+
67
+ assert connection.index_name_exists?(table_name, good_index_name, false)
68
+ connection.remove_index(table_name, name: good_index_name)
69
+ end
70
+
71
+ def test_add_index_does_not_accept_too_long_index_names
72
+ too_long_index_name = good_index_name + 'x'
73
+
74
+ e = assert_raises(ArgumentError) {
75
+ connection.add_index(table_name, "foo", name: too_long_index_name)
76
+ }
77
+ assert_match(/too long; the limit is #{connection.allowed_index_name_length} characters/, e.message)
78
+
79
+ assert_not connection.index_name_exists?(table_name, too_long_index_name, false)
80
+ connection.add_index(table_name, "foo", :name => good_index_name)
81
+ end
82
+
83
+ def test_internal_index_with_name_matching_database_limit
84
+ good_index_name = 'x' * connection.index_name_length
85
+ connection.add_index(table_name, "foo", name: good_index_name, internal: true)
86
+
87
+ assert connection.index_name_exists?(table_name, good_index_name, false)
88
+ connection.remove_index(table_name, name: good_index_name)
89
+ end
90
+
91
+ def test_index_symbol_names
92
+ connection.add_index table_name, :foo, :name => :symbol_index_name
93
+ assert connection.index_exists?(table_name, :foo, :name => :symbol_index_name)
94
+
95
+ connection.remove_index table_name, :name => :symbol_index_name
96
+ assert_not connection.index_exists?(table_name, :foo, :name => :symbol_index_name)
97
+ end
98
+
99
+ def test_index_exists
100
+ connection.add_index :testings, :foo
101
+
102
+ assert connection.index_exists?(:testings, :foo)
103
+ assert !connection.index_exists?(:testings, :bar)
104
+ end
105
+
106
+ def test_index_exists_on_multiple_columns
107
+ connection.add_index :testings, [:foo, :bar]
108
+
109
+ assert connection.index_exists?(:testings, [:foo, :bar])
110
+ end
111
+
112
+ def test_index_exists_with_custom_name_checks_columns
113
+ connection.add_index :testings, [:foo, :bar], name: "my_index"
114
+ assert connection.index_exists?(:testings, [:foo, :bar], name: "my_index")
115
+ assert_not connection.index_exists?(:testings, [:foo], name: "my_index")
116
+ end
117
+
118
+ def test_valid_index_options
119
+ assert_raise ArgumentError do
120
+ connection.add_index :testings, :foo, unqiue: true
121
+ end
122
+ end
123
+
124
+ def test_unique_index_exists
125
+ connection.add_index :testings, :foo, :unique => true
126
+
127
+ assert connection.index_exists?(:testings, :foo, :unique => true)
128
+ end
129
+
130
+ def test_named_index_exists
131
+ connection.add_index :testings, :foo, :name => "custom_index_name"
132
+
133
+ assert connection.index_exists?(:testings, :foo)
134
+ assert connection.index_exists?(:testings, :foo, :name => "custom_index_name")
135
+ assert !connection.index_exists?(:testings, :foo, :name => "other_index_name")
136
+ end
137
+
138
+ def test_remove_named_index
139
+ connection.add_index :testings, :foo, :name => "custom_index_name"
140
+
141
+ assert connection.index_exists?(:testings, :foo)
142
+ connection.remove_index :testings, :foo
143
+ assert !connection.index_exists?(:testings, :foo)
144
+ end
145
+
146
+ def test_add_index_attribute_length_limit
147
+ connection.add_index :testings, [:foo, :bar], :length => {:foo => 10, :bar => nil}
148
+
149
+ assert connection.index_exists?(:testings, [:foo, :bar])
150
+ end
151
+
152
+ def test_add_index
153
+ connection.add_index("testings", "last_name")
154
+ connection.remove_index("testings", "last_name")
155
+
156
+ connection.add_index("testings", ["last_name", "first_name"])
157
+ connection.remove_index("testings", :column => ["last_name", "first_name"])
158
+
159
+ # Oracle adapter cannot have specified index name larger than 30 characters
160
+ # Oracle adapter is shortening index name when just column list is given
161
+ unless current_adapter?(:OracleAdapter)
162
+ connection.add_index("testings", ["last_name", "first_name"])
163
+ connection.remove_index("testings", :name => :index_testings_on_last_name_and_first_name)
164
+ connection.add_index("testings", ["last_name", "first_name"])
165
+ connection.remove_index("testings", "last_name_and_first_name")
166
+ end
167
+ connection.add_index("testings", ["last_name", "first_name"])
168
+ connection.remove_index("testings", ["last_name", "first_name"])
169
+
170
+ connection.add_index("testings", ["last_name"], :length => 10)
171
+ connection.remove_index("testings", "last_name")
172
+
173
+ connection.add_index("testings", ["last_name"], :length => {:last_name => 10})
174
+ connection.remove_index("testings", ["last_name"])
175
+
176
+ connection.add_index("testings", ["last_name", "first_name"], :length => 10)
177
+ connection.remove_index("testings", ["last_name", "first_name"])
178
+
179
+ connection.add_index("testings", ["last_name", "first_name"], :length => {:last_name => 10, :first_name => 20})
180
+ connection.remove_index("testings", ["last_name", "first_name"])
181
+
182
+ connection.add_index("testings", ["key"], :name => "key_idx", :unique => true)
183
+ connection.remove_index("testings", :name => "key_idx", :unique => true)
184
+
185
+ connection.add_index("testings", %w(last_name first_name administrator), :name => "named_admin")
186
+ connection.remove_index("testings", :name => "named_admin")
187
+
188
+ # Selected adapters support index sort order
189
+ if current_adapter?(:SQLite3Adapter, :Mysql2Adapter, :PostgreSQLAdapter)
190
+ connection.add_index("testings", ["last_name"], :order => {:last_name => :desc})
191
+ connection.remove_index("testings", ["last_name"])
192
+ connection.add_index("testings", ["last_name", "first_name"], :order => {:last_name => :desc})
193
+ connection.remove_index("testings", ["last_name", "first_name"])
194
+ connection.add_index("testings", ["last_name", "first_name"], :order => {:last_name => :desc, :first_name => :asc})
195
+ connection.remove_index("testings", ["last_name", "first_name"])
196
+ connection.add_index("testings", ["last_name", "first_name"], :order => :desc)
197
+ connection.remove_index("testings", ["last_name", "first_name"])
198
+ end
199
+ end
200
+
201
+ if current_adapter?(:PostgreSQLAdapter)
202
+ def test_add_partial_index
203
+ connection.add_index("testings", "last_name", :where => "first_name = 'john doe'")
204
+ assert connection.index_exists?("testings", "last_name")
205
+
206
+ connection.remove_index("testings", "last_name")
207
+ assert !connection.index_exists?("testings", "last_name")
208
+ end
209
+ end
210
+
211
+ private
212
+ def good_index_name
213
+ 'x' * connection.allowed_index_name_length
214
+ end
215
+
216
+ end
217
+ end
218
+ end