ibm_db 5.6.1 → 5.7.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 (592) hide show
  1. checksums.yaml +4 -4
  2. data/ext/Makefile +13 -9
  3. data/ext/extconf.rb +176 -110
  4. data/ext/ibm_db.c +60 -0
  5. data/ext/ibm_db.o +0 -0
  6. data/ext/ibm_db.so +0 -0
  7. data/ext/mkmf.log +6 -6
  8. data/ext/ruby_ibm_db_cli.c +14 -10
  9. data/ext/ruby_ibm_db_cli.h +4 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/IBM_DB.rb +2 -2
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1254 -277
  13. data/test/active_record/connection_adapters/fake_legacy_adapter.rb +17 -0
  14. data/test/active_record/connection_adapters/fake_misleading_legacy_adapter.rb +8 -0
  15. data/test/activejob/destroy_association_async_job_test.rb +62 -0
  16. data/test/activejob/destroy_association_async_test.rb +147 -11
  17. data/test/activejob/job_runtime_test.rb +41 -0
  18. data/test/activejob/unloadable_base_job.rb +3 -0
  19. data/test/cases/active_record_schema_test.rb +196 -0
  20. data/test/cases/active_record_test.rb +21 -0
  21. data/test/cases/adapter_prevent_writes_test.rb +26 -202
  22. data/test/cases/adapter_test.rb +592 -82
  23. data/test/cases/adapters/abstract_mysql_adapter/active_schema_test.rb +210 -0
  24. data/test/cases/adapters/abstract_mysql_adapter/adapter_prevent_writes_test.rb +111 -0
  25. data/test/cases/adapters/abstract_mysql_adapter/auto_increment_test.rb +48 -0
  26. data/test/cases/adapters/abstract_mysql_adapter/bind_parameter_test.rb +91 -0
  27. data/test/cases/adapters/abstract_mysql_adapter/case_sensitivity_test.rb +65 -0
  28. data/test/cases/adapters/abstract_mysql_adapter/charset_collation_test.rb +85 -0
  29. data/test/cases/adapters/abstract_mysql_adapter/connection_test.rb +267 -0
  30. data/test/cases/adapters/abstract_mysql_adapter/count_deleted_rows_with_lock_test.rb +29 -0
  31. data/test/cases/adapters/abstract_mysql_adapter/json_test.rb +24 -0
  32. data/test/cases/adapters/abstract_mysql_adapter/mysql_boolean_test.rb +102 -0
  33. data/test/cases/adapters/abstract_mysql_adapter/mysql_enum_test.rb +47 -0
  34. data/test/cases/adapters/abstract_mysql_adapter/mysql_explain_test.rb +71 -0
  35. data/test/cases/adapters/abstract_mysql_adapter/nested_deadlock_test.rb +191 -0
  36. data/test/cases/adapters/abstract_mysql_adapter/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/abstract_mysql_adapter/quoting_test.rb +49 -0
  38. data/test/cases/adapters/abstract_mysql_adapter/schema_migrations_test.rb +68 -0
  39. data/test/cases/adapters/abstract_mysql_adapter/schema_test.rb +130 -0
  40. data/test/cases/adapters/abstract_mysql_adapter/set_test.rb +32 -0
  41. data/test/cases/adapters/abstract_mysql_adapter/sp_test.rb +39 -0
  42. data/test/cases/adapters/abstract_mysql_adapter/sql_types_test.rb +16 -0
  43. data/test/cases/adapters/abstract_mysql_adapter/table_options_test.rb +125 -0
  44. data/test/cases/adapters/abstract_mysql_adapter/transaction_test.rb +204 -0
  45. data/test/cases/adapters/abstract_mysql_adapter/unsigned_type_test.rb +77 -0
  46. data/test/cases/adapters/abstract_mysql_adapter/virtual_column_test.rb +69 -0
  47. data/test/cases/adapters/abstract_mysql_adapter/warnings_test.rb +109 -0
  48. data/test/cases/adapters/mysql2/check_constraint_quoting_test.rb +35 -0
  49. data/test/cases/adapters/mysql2/dbconsole_test.rb +87 -0
  50. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +136 -10
  51. data/test/cases/adapters/mysql2/mysql2_rake_test.rb +433 -0
  52. data/test/cases/adapters/postgresql/active_schema_test.rb +8 -4
  53. data/test/cases/adapters/postgresql/array_test.rb +6 -6
  54. data/test/cases/adapters/postgresql/bind_parameter_test.rb +52 -0
  55. data/test/cases/adapters/postgresql/bit_string_test.rb +2 -2
  56. data/test/cases/adapters/postgresql/bytea_test.rb +3 -3
  57. data/test/cases/adapters/postgresql/case_insensitive_test.rb +1 -1
  58. data/test/cases/adapters/postgresql/change_schema_test.rb +32 -1
  59. data/test/cases/adapters/postgresql/cidr_test.rb +17 -0
  60. data/test/cases/adapters/postgresql/citext_test.rb +7 -1
  61. data/test/cases/adapters/postgresql/collation_test.rb +1 -1
  62. data/test/cases/adapters/postgresql/composite_test.rb +1 -1
  63. data/test/cases/adapters/postgresql/connection_test.rb +43 -36
  64. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +3 -2
  65. data/test/cases/adapters/postgresql/datatype_test.rb +9 -4
  66. data/test/cases/adapters/postgresql/date_test.rb +2 -2
  67. data/test/cases/adapters/postgresql/dbconsole_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/deferred_constraints_test.rb +55 -0
  69. data/test/cases/adapters/postgresql/domain_test.rb +1 -1
  70. data/test/cases/adapters/postgresql/enum_test.rb +208 -8
  71. data/test/cases/adapters/postgresql/explain_test.rb +25 -6
  72. data/test/cases/adapters/postgresql/extension_migration_test.rb +51 -9
  73. data/test/cases/adapters/postgresql/foreign_table_test.rb +3 -3
  74. data/test/cases/adapters/postgresql/full_text_test.rb +1 -1
  75. data/test/cases/adapters/postgresql/geometric_test.rb +13 -6
  76. data/test/cases/adapters/postgresql/hstore_test.rb +22 -32
  77. data/test/cases/adapters/postgresql/infinity_test.rb +13 -2
  78. data/test/cases/adapters/postgresql/integer_test.rb +1 -1
  79. data/test/cases/adapters/postgresql/interval_test.rb +9 -17
  80. data/test/cases/adapters/postgresql/invertible_migration_test.rb +139 -0
  81. data/test/cases/adapters/postgresql/json_test.rb +5 -0
  82. data/test/cases/adapters/postgresql/ltree_test.rb +1 -1
  83. data/test/cases/adapters/postgresql/money_test.rb +17 -9
  84. data/test/cases/adapters/postgresql/network_test.rb +13 -1
  85. data/test/cases/adapters/postgresql/numbers_test.rb +18 -2
  86. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +9 -9
  87. data/test/cases/adapters/postgresql/partitions_test.rb +5 -2
  88. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +7 -110
  89. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +403 -20
  90. data/test/cases/adapters/postgresql/postgresql_rake_test.rb +637 -0
  91. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +1 -1
  92. data/test/cases/adapters/postgresql/quoting_test.rb +60 -1
  93. data/test/cases/adapters/postgresql/range_test.rb +185 -21
  94. data/test/cases/adapters/postgresql/referential_integrity_test.rb +29 -5
  95. data/test/cases/adapters/postgresql/rename_table_test.rb +35 -8
  96. data/test/cases/adapters/postgresql/schema_authorization_test.rb +2 -2
  97. data/test/cases/adapters/postgresql/schema_test.rb +270 -20
  98. data/test/cases/adapters/postgresql/serial_test.rb +5 -5
  99. data/test/cases/adapters/postgresql/statement_pool_test.rb +6 -2
  100. data/test/cases/adapters/postgresql/timestamp_test.rb +122 -5
  101. data/test/cases/adapters/postgresql/transaction_nested_test.rb +130 -6
  102. data/test/cases/adapters/postgresql/transaction_test.rb +37 -11
  103. data/test/cases/adapters/postgresql/type_lookup_test.rb +1 -1
  104. data/test/cases/adapters/postgresql/uuid_test.rb +77 -9
  105. data/test/cases/adapters/postgresql/virtual_column_test.rb +114 -0
  106. data/test/cases/adapters/postgresql/xml_test.rb +1 -1
  107. data/test/cases/adapters/sqlite3/bind_parameter_test.rb +52 -0
  108. data/test/cases/adapters/sqlite3/collation_test.rb +1 -1
  109. data/test/cases/adapters/sqlite3/copy_table_test.rb +28 -7
  110. data/test/cases/adapters/sqlite3/dbconsole_test.rb +81 -0
  111. data/test/cases/adapters/sqlite3/explain_test.rb +3 -3
  112. data/test/cases/adapters/sqlite3/quoting_test.rb +34 -3
  113. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +9 -102
  114. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +727 -72
  115. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +6 -3
  116. data/test/cases/adapters/sqlite3/sqlite_rake_test.rb +264 -0
  117. data/test/cases/adapters/sqlite3/statement_pool_test.rb +1 -1
  118. data/test/cases/adapters/sqlite3/transaction_test.rb +6 -3
  119. data/test/cases/adapters/sqlite3/virtual_column_test.rb +138 -0
  120. data/test/cases/adapters/sqlite3/virtual_table_test.rb +51 -0
  121. data/test/cases/adapters/trilogy/dbconsole_test.rb +76 -0
  122. data/test/cases/adapters/trilogy/trilogy_adapter_test.rb +473 -0
  123. data/test/cases/adapters/trilogy/trilogy_rake_test.rb +433 -0
  124. data/test/cases/aggregations_test.rb +16 -0
  125. data/test/cases/annotate_test.rb +14 -12
  126. data/test/cases/arel/attributes/attribute_test.rb +86 -47
  127. data/test/cases/arel/collectors/bind_test.rb +1 -1
  128. data/test/cases/arel/collectors/composite_test.rb +11 -1
  129. data/test/cases/arel/collectors/sql_string_test.rb +1 -1
  130. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +1 -1
  131. data/test/cases/arel/delete_manager_test.rb +0 -6
  132. data/test/cases/arel/factory_methods_test.rb +45 -0
  133. data/test/cases/arel/insert_manager_test.rb +1 -7
  134. data/test/cases/arel/nodes/as_test.rb +12 -0
  135. data/test/cases/arel/nodes/ascending_test.rb +1 -1
  136. data/test/cases/arel/nodes/bin_test.rb +1 -1
  137. data/test/cases/arel/nodes/bound_sql_literal_test.rb +31 -0
  138. data/test/cases/arel/nodes/cte_test.rb +46 -0
  139. data/test/cases/arel/nodes/descending_test.rb +1 -1
  140. data/test/cases/arel/nodes/equality_test.rb +3 -3
  141. data/test/cases/arel/nodes/filter_test.rb +37 -0
  142. data/test/cases/arel/nodes/fragments_test.rb +38 -0
  143. data/test/cases/arel/nodes/homogeneous_in_test.rb +52 -0
  144. data/test/cases/arel/nodes/infix_operation_test.rb +1 -1
  145. data/test/cases/arel/nodes/node_test.rb +1 -1
  146. data/test/cases/arel/nodes/or_test.rb +2 -2
  147. data/test/cases/arel/nodes/sql_literal_test.rb +18 -1
  148. data/test/cases/arel/nodes/table_alias_test.rb +12 -0
  149. data/test/cases/arel/nodes/unary_operation_test.rb +1 -1
  150. data/test/cases/arel/nodes/update_statement_test.rb +4 -0
  151. data/test/cases/arel/nodes_test.rb +3 -2
  152. data/test/cases/arel/select_manager_test.rb +12 -12
  153. data/test/cases/arel/support/fake_record.rb +22 -17
  154. data/test/cases/arel/table_test.rb +15 -25
  155. data/test/cases/arel/update_manager_test.rb +51 -6
  156. data/test/cases/arel/visitors/dispatch_contamination_test.rb +1 -1
  157. data/test/cases/arel/visitors/dot_test.rb +177 -2
  158. data/test/cases/arel/visitors/mysql_test.rb +49 -1
  159. data/test/cases/arel/visitors/postgres_test.rb +1 -31
  160. data/test/cases/arel/visitors/sqlite_test.rb +1 -1
  161. data/test/cases/arel/visitors/to_sql_test.rb +330 -20
  162. data/test/cases/assertions/query_assertions_test.rb +136 -0
  163. data/test/cases/associations/belongs_to_associations_test.rb +502 -41
  164. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +1 -1
  165. data/test/cases/associations/cascaded_eager_loading_test.rb +26 -15
  166. data/test/cases/associations/eager_load_nested_include_test.rb +1 -1
  167. data/test/cases/associations/eager_singularization_test.rb +1 -1
  168. data/test/cases/associations/eager_test.rb +255 -93
  169. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +25 -53
  170. data/test/cases/associations/has_many_associations_test.rb +282 -72
  171. data/test/cases/associations/has_many_through_associations_test.rb +172 -45
  172. data/test/cases/associations/has_many_through_disable_joins_associations_test.rb +197 -0
  173. data/test/cases/associations/has_one_associations_test.rb +160 -29
  174. data/test/cases/associations/has_one_through_associations_test.rb +64 -15
  175. data/test/cases/associations/has_one_through_disable_joins_associations_test.rb +82 -0
  176. data/test/cases/associations/inner_join_association_test.rb +36 -6
  177. data/test/cases/associations/inverse_associations_test.rb +177 -40
  178. data/test/cases/associations/join_model_test.rb +17 -12
  179. data/test/cases/associations/left_outer_join_association_test.rb +14 -3
  180. data/test/cases/associations/nested_error_test.rb +116 -0
  181. data/test/cases/associations/nested_through_associations_test.rb +54 -19
  182. data/test/cases/associations/required_test.rb +1 -1
  183. data/test/cases/associations_test.rb +1278 -21
  184. data/test/cases/asynchronous_queries_test.rb +310 -0
  185. data/test/cases/attribute_methods/read_test.rb +6 -0
  186. data/test/cases/attribute_methods/time_zone_converter_test.rb +21 -0
  187. data/test/cases/attribute_methods_test.rb +565 -46
  188. data/test/cases/attributes_test.rb +42 -1
  189. data/test/cases/autosave_association_test.rb +645 -92
  190. data/test/cases/base_prevent_writes_test.rb +28 -159
  191. data/test/cases/base_test.rb +434 -209
  192. data/test/cases/batches_test.rb +441 -57
  193. data/test/cases/binary_test.rb +31 -0
  194. data/test/cases/bind_parameter_test.rb +107 -16
  195. data/test/cases/cache_key_test.rb +7 -7
  196. data/test/cases/calculations_test.rb +541 -110
  197. data/test/cases/callbacks_test.rb +0 -1
  198. data/test/cases/clone_test.rb +5 -4
  199. data/test/cases/coders/yaml_column_test.rb +97 -2
  200. data/test/cases/collection_cache_key_test.rb +24 -16
  201. data/test/cases/column_alias_test.rb +2 -8
  202. data/test/cases/column_definition_test.rb +12 -3
  203. data/test/cases/comment_test.rb +23 -26
  204. data/test/cases/connection_adapters/adapter_leasing_test.rb +9 -9
  205. data/test/cases/connection_adapters/connection_handler_test.rb +145 -99
  206. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +79 -55
  207. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +17 -20
  208. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +146 -55
  209. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +136 -23
  210. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +96 -27
  211. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -5
  212. data/test/cases/connection_adapters/registration_test.rb +98 -0
  213. data/test/cases/connection_adapters/schema_cache_test.rb +288 -135
  214. data/test/cases/connection_adapters/standalone_connection_test.rb +38 -0
  215. data/test/cases/connection_adapters/statement_pool_test.rb +29 -0
  216. data/test/cases/connection_adapters/type_lookup_test.rb +12 -24
  217. data/test/cases/connection_handling_test.rb +210 -0
  218. data/test/cases/connection_management_test.rb +44 -7
  219. data/test/cases/connection_pool_test.rb +466 -99
  220. data/test/cases/core_test.rb +167 -9
  221. data/test/cases/counter_cache_test.rb +129 -2
  222. data/test/cases/custom_locking_test.rb +3 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +149 -13
  224. data/test/cases/database_configurations/resolver_test.rb +14 -10
  225. data/test/cases/database_configurations/url_config_test.rb +53 -0
  226. data/test/cases/database_configurations_test.rb +86 -43
  227. data/test/cases/database_selector_test.rb +30 -8
  228. data/test/cases/database_statements_test.rb +10 -14
  229. data/test/cases/date_time_precision_test.rb +141 -11
  230. data/test/cases/date_time_test.rb +19 -1
  231. data/test/cases/defaults_test.rb +107 -41
  232. data/test/cases/delegated_type_test.rb +69 -9
  233. data/test/cases/dirty_test.rb +82 -25
  234. data/test/cases/disconnected_test.rb +10 -9
  235. data/test/cases/dup_test.rb +26 -6
  236. data/test/cases/encryption/cipher/aes256_gcm_test.rb +50 -0
  237. data/test/cases/encryption/cipher_test.rb +65 -0
  238. data/test/cases/encryption/concurrency_test.rb +27 -0
  239. data/test/cases/encryption/config_test.rb +21 -0
  240. data/test/cases/encryption/configurable_test.rb +93 -0
  241. data/test/cases/encryption/contexts_test.rb +105 -0
  242. data/test/cases/encryption/derived_secret_key_provider_test.rb +31 -0
  243. data/test/cases/encryption/deterministic_key_provider_test.rb +11 -0
  244. data/test/cases/encryption/encryptable_record_api_test.rb +175 -0
  245. data/test/cases/encryption/encryptable_record_message_pack_serialized_test.rb +42 -0
  246. data/test/cases/encryption/encryptable_record_test.rb +470 -0
  247. data/test/cases/encryption/encrypted_fixtures_test.rb +22 -0
  248. data/test/cases/encryption/encrypting_only_encryptor_test.rb +20 -0
  249. data/test/cases/encryption/encryption_schemes_test.rb +240 -0
  250. data/test/cases/encryption/encryptor_test.rb +113 -0
  251. data/test/cases/encryption/envelope_encryption_key_provider_test.rb +49 -0
  252. data/test/cases/encryption/extended_deterministic_queries_test.rb +81 -0
  253. data/test/cases/encryption/helper.rb +152 -0
  254. data/test/cases/encryption/key_generator_test.rb +55 -0
  255. data/test/cases/encryption/key_provider_test.rb +57 -0
  256. data/test/cases/encryption/key_test.rb +17 -0
  257. data/test/cases/encryption/message_pack_message_serializer_test.rb +70 -0
  258. data/test/cases/encryption/message_serializer_test.rb +82 -0
  259. data/test/cases/encryption/message_test.rb +43 -0
  260. data/test/cases/encryption/null_encryptor_test.rb +21 -0
  261. data/test/cases/encryption/properties_test.rb +69 -0
  262. data/test/cases/encryption/read_only_null_encryptor_test.rb +19 -0
  263. data/test/cases/encryption/scheme_test.rb +58 -0
  264. data/test/cases/encryption/unencrypted_attributes_test.rb +27 -0
  265. data/test/cases/encryption/uniqueness_validations_test.rb +65 -0
  266. data/test/cases/enum_test.rb +374 -72
  267. data/test/cases/errors_test.rb +7 -4
  268. data/test/cases/excluding_test.rb +116 -0
  269. data/test/cases/explain_subscriber_test.rb +6 -1
  270. data/test/cases/explain_test.rb +119 -10
  271. data/test/cases/filter_attributes_test.rb +7 -14
  272. data/test/cases/finder_respond_to_test.rb +3 -3
  273. data/test/cases/finder_test.rb +357 -72
  274. data/test/cases/fixture_set/file_test.rb +9 -0
  275. data/test/cases/fixtures_test.rb +426 -190
  276. data/test/cases/helper.rb +66 -192
  277. data/test/cases/hot_compatibility_test.rb +10 -10
  278. data/test/cases/inheritance_test.rb +51 -61
  279. data/test/cases/inherited_test.rb +40 -0
  280. data/test/cases/insert_all_test.rb +419 -9
  281. data/test/cases/instrumentation_test.rb +202 -30
  282. data/test/cases/integration_test.rb +25 -7
  283. data/test/cases/invalid_connection_test.rb +5 -5
  284. data/test/cases/invertible_migration_test.rb +108 -24
  285. data/test/cases/json_attribute_test.rb +1 -0
  286. data/test/cases/json_serialization_test.rb +5 -5
  287. data/test/cases/json_shared_test_cases.rb +5 -9
  288. data/test/cases/locking_test.rb +67 -31
  289. data/test/cases/log_subscriber_test.rb +17 -15
  290. data/test/cases/marshal_serialization_test.rb +78 -5
  291. data/test/cases/message_pack_test.rb +91 -0
  292. data/test/cases/migration/change_schema_test.rb +77 -46
  293. data/test/cases/migration/change_table_test.rb +129 -114
  294. data/test/cases/migration/check_constraint_test.rb +192 -10
  295. data/test/cases/migration/column_attributes_test.rb +4 -9
  296. data/test/cases/migration/column_positioning_test.rb +2 -2
  297. data/test/cases/migration/columns_test.rb +118 -4
  298. data/test/cases/migration/command_recorder_test.rb +181 -14
  299. data/test/cases/migration/compatibility_test.rb +883 -196
  300. data/test/cases/migration/create_join_table_test.rb +8 -1
  301. data/test/cases/migration/exclusion_constraint_test.rb +192 -0
  302. data/test/cases/migration/foreign_key_test.rb +356 -14
  303. data/test/cases/migration/helper.rb +4 -1
  304. data/test/cases/migration/index_test.rb +67 -2
  305. data/test/cases/migration/invalid_options_test.rb +129 -0
  306. data/test/cases/migration/logger_test.rb +7 -4
  307. data/test/cases/migration/pending_migrations_test.rb +103 -60
  308. data/test/cases/migration/references_foreign_key_test.rb +73 -4
  309. data/test/cases/migration/references_index_test.rb +25 -27
  310. data/test/cases/migration/references_statements_test.rb +27 -3
  311. data/test/cases/migration/rename_table_test.rb +39 -54
  312. data/test/cases/migration/schema_definitions_test.rb +109 -0
  313. data/test/cases/migration/unique_constraint_test.rb +248 -0
  314. data/test/cases/migration_test.rb +677 -220
  315. data/test/cases/migrator_test.rb +102 -75
  316. data/test/cases/multi_db_migrator_test.rb +55 -34
  317. data/test/cases/multiparameter_attributes_test.rb +26 -29
  318. data/test/cases/multiple_db_test.rb +42 -19
  319. data/test/cases/nested_attributes_test.rb +124 -6
  320. data/test/cases/nested_attributes_with_callbacks_test.rb +2 -2
  321. data/test/cases/normalized_attribute_test.rb +117 -0
  322. data/test/cases/null_relation_test.rb +35 -2
  323. data/test/cases/persistence/reload_association_cache_test.rb +20 -0
  324. data/test/cases/persistence_test.rb +629 -22
  325. data/test/cases/pooled_connections_test.rb +57 -56
  326. data/test/cases/prepared_statement_status_test.rb +8 -3
  327. data/test/cases/primary_class_test.rb +134 -0
  328. data/test/cases/primary_keys_test.rb +171 -55
  329. data/test/cases/query_cache_test.rb +558 -263
  330. data/test/cases/query_logs_test.rb +293 -0
  331. data/test/cases/quoting_test.rb +39 -72
  332. data/test/cases/readonly_test.rb +50 -12
  333. data/test/cases/reaper_test.rb +22 -6
  334. data/test/cases/reflection_test.rb +207 -9
  335. data/test/cases/relation/and_test.rb +43 -0
  336. data/test/cases/relation/delegation_test.rb +32 -5
  337. data/test/cases/relation/delete_all_test.rb +27 -6
  338. data/test/cases/relation/field_ordered_values_test.rb +128 -0
  339. data/test/cases/relation/load_async_test.rb +650 -0
  340. data/test/cases/relation/merging_test.rb +80 -109
  341. data/test/cases/relation/mutation_test.rb +12 -7
  342. data/test/cases/relation/or_test.rb +11 -8
  343. data/test/cases/relation/order_test.rb +90 -0
  344. data/test/cases/relation/predicate_builder_test.rb +21 -6
  345. data/test/cases/relation/select_test.rb +162 -3
  346. data/test/cases/relation/structural_compatibility_test.rb +38 -0
  347. data/test/cases/relation/update_all_test.rb +81 -27
  348. data/test/cases/relation/where_chain_test.rb +190 -3
  349. data/test/cases/relation/where_clause_test.rb +43 -1
  350. data/test/cases/relation/where_test.rb +95 -7
  351. data/test/cases/relation/with_test.rb +165 -0
  352. data/test/cases/relation_test.rb +42 -37
  353. data/test/cases/relations_test.rb +436 -138
  354. data/test/cases/reload_models_test.rb +18 -14
  355. data/test/cases/reserved_word_test.rb +2 -1
  356. data/test/cases/result_test.rb +14 -22
  357. data/test/cases/sanitize_test.rb +89 -27
  358. data/test/cases/schema_dumper_test.rb +535 -62
  359. data/test/cases/scoping/default_scoping_test.rb +219 -35
  360. data/test/cases/scoping/named_scoping_test.rb +25 -46
  361. data/test/cases/scoping/relation_scoping_test.rb +112 -4
  362. data/test/cases/secure_password_test.rb +108 -0
  363. data/test/cases/secure_token_test.rb +72 -0
  364. data/test/cases/serialization_test.rb +1 -1
  365. data/test/cases/serialized_attribute_test.rb +305 -60
  366. data/test/cases/shard_keys_test.rb +125 -0
  367. data/test/cases/shard_selector_test.rb +45 -0
  368. data/test/cases/signed_id_test.rb +57 -5
  369. data/test/cases/statement_cache_test.rb +31 -30
  370. data/test/cases/statement_invalid_test.rb +8 -4
  371. data/test/cases/store_test.rb +73 -9
  372. data/test/cases/strict_loading_test.rb +327 -13
  373. data/test/cases/table_metadata_test.rb +16 -0
  374. data/test/cases/tasks/database_tasks_test.rb +517 -244
  375. data/test/cases/test_case.rb +254 -60
  376. data/test/cases/test_case_test.rb +69 -0
  377. data/test/cases/test_databases_test.rb +7 -3
  378. data/test/cases/test_fixtures_test.rb +19 -40
  379. data/test/cases/time_precision_test.rb +17 -5
  380. data/test/cases/timestamp_test.rb +124 -16
  381. data/test/cases/token_for_test.rb +165 -0
  382. data/test/cases/touch_later_test.rb +43 -1
  383. data/test/cases/transaction_callbacks_test.rb +325 -8
  384. data/test/cases/transaction_instrumentation_test.rb +453 -0
  385. data/test/cases/transaction_isolation_test.rb +12 -8
  386. data/test/cases/transactions_test.rb +629 -112
  387. data/test/cases/type/date_time_test.rb +7 -1
  388. data/test/cases/type/time_test.rb +9 -0
  389. data/test/cases/type/type_map_test.rb +108 -73
  390. data/test/cases/type/unsigned_integer_test.rb +12 -0
  391. data/test/cases/type_caster/connection_test.rb +19 -0
  392. data/test/cases/type_test.rb +1 -1
  393. data/test/cases/unconnected_test.rb +7 -7
  394. data/test/cases/unsafe_raw_sql_test.rb +39 -8
  395. data/test/cases/validations/absence_validation_test.rb +1 -1
  396. data/test/cases/validations/association_validation_test.rb +25 -3
  397. data/test/cases/validations/numericality_validation_test.rb +3 -9
  398. data/test/cases/validations/presence_validation_test.rb +1 -1
  399. data/test/cases/validations/uniqueness_validation_test.rb +280 -40
  400. data/test/cases/validations_test.rb +2 -2
  401. data/test/cases/view_test.rb +33 -22
  402. data/test/cases/yaml_serialization_test.rb +23 -17
  403. data/test/config.example.yml +58 -56
  404. data/test/config.rb +1 -0
  405. data/test/fixtures/1_need_quoting.yml +2 -0
  406. data/test/fixtures/accounts.yml +5 -0
  407. data/test/fixtures/aircrafts.yml +7 -0
  408. data/test/fixtures/book_identifiers.yml +11 -0
  409. data/test/fixtures/books.yml +5 -4
  410. data/test/fixtures/cake_designers.yml +5 -0
  411. data/test/fixtures/cars.yml +6 -0
  412. data/test/fixtures/chefs.yml +5 -0
  413. data/test/fixtures/clothing_items.yml +23 -0
  414. data/test/fixtures/clubs.yml +1 -1
  415. data/test/fixtures/comments.yml +2 -1
  416. data/test/fixtures/cpk_authors.yml +8 -0
  417. data/test/fixtures/cpk_books.yml +21 -0
  418. data/test/fixtures/cpk_order_agreements.yml +13 -0
  419. data/test/fixtures/cpk_order_tags.yml +15 -0
  420. data/test/fixtures/cpk_orders.yml +11 -0
  421. data/test/fixtures/cpk_posts.yml +12 -0
  422. data/test/fixtures/cpk_reviews.yml +13 -0
  423. data/test/fixtures/cpk_tags.yml +11 -0
  424. data/test/fixtures/drink_designers.yml +5 -0
  425. data/test/fixtures/encrypted_book_that_ignores_cases.yml +4 -0
  426. data/test/fixtures/encrypted_books.yml +4 -0
  427. data/test/fixtures/fk_object_to_point_to.yml +2 -0
  428. data/test/fixtures/memberships.yml +15 -15
  429. data/test/fixtures/paragraphs.yml +5 -0
  430. data/test/fixtures/parrots.yml +4 -0
  431. data/test/fixtures/people.yml +2 -0
  432. data/test/fixtures/pirates.yml +2 -2
  433. data/test/fixtures/primary_key_error/primary_key_error.yml +6 -0
  434. data/test/fixtures/references.yml +3 -3
  435. data/test/fixtures/sharded_blog_posts.yml +14 -0
  436. data/test/fixtures/sharded_blog_posts_tags.yml +27 -0
  437. data/test/fixtures/sharded_blogs.yml +8 -0
  438. data/test/fixtures/sharded_comments.yml +22 -0
  439. data/test/fixtures/sharded_tags.yml +34 -0
  440. data/test/fixtures/sponsors.yml +2 -2
  441. data/test/fixtures/topics.yml +1 -0
  442. data/test/fixtures/treasures.yml +4 -0
  443. data/test/fixtures/virtual_columns.yml +5 -0
  444. data/test/fixtures/warehouse_things.yml +1 -1
  445. data/test/migrations/old_and_new_versions/20210716122844_add_people_description.rb +5 -0
  446. data/test/migrations/old_and_new_versions/20210716123013_add_people_number_of_legs.rb +5 -0
  447. data/test/migrations/old_and_new_versions/230_add_people_hobby.rb +5 -0
  448. data/test/migrations/old_and_new_versions/231_add_people_last_name.rb +5 -0
  449. data/test/migrations/scope/1_unscoped.rb +7 -0
  450. data/test/migrations/scope/2_mysql_only.mysql.rb +7 -0
  451. data/test/models/admin/user.rb +2 -0
  452. data/test/models/admin/user_json.rb +48 -0
  453. data/test/models/attachment.rb +7 -0
  454. data/test/models/author.rb +70 -3
  455. data/test/models/author_encrypted.rb +16 -0
  456. data/test/models/bird.rb +1 -1
  457. data/test/models/book.rb +18 -11
  458. data/test/models/book_destroy_async.rb +1 -1
  459. data/test/models/book_encrypted.rb +106 -0
  460. data/test/models/book_identifier.rb +5 -0
  461. data/test/models/branch.rb +11 -0
  462. data/test/models/bulb.rb +1 -1
  463. data/test/models/car.rb +8 -1
  464. data/test/models/cat.rb +1 -1
  465. data/test/models/category.rb +3 -1
  466. data/test/models/chat_message.rb +8 -0
  467. data/test/models/chef.rb +52 -0
  468. data/test/models/clothing_item.rb +12 -0
  469. data/test/models/club.rb +4 -1
  470. data/test/models/comment.rb +7 -4
  471. data/test/models/comment_overlapping_counter_cache.rb +15 -0
  472. data/test/models/company.rb +16 -2
  473. data/test/models/computer.rb +1 -0
  474. data/test/models/contact.rb +3 -3
  475. data/test/models/contract.rb +5 -1
  476. data/test/models/cpk/author.rb +9 -0
  477. data/test/models/cpk/book.rb +55 -0
  478. data/test/models/cpk/book_destroy_async.rb +9 -0
  479. data/test/models/cpk/car.rb +9 -0
  480. data/test/models/cpk/car_review.rb +9 -0
  481. data/test/models/cpk/chapter.rb +16 -0
  482. data/test/models/cpk/chapter_destroy_async.rb +10 -0
  483. data/test/models/cpk/comment.rb +9 -0
  484. data/test/models/cpk/order.rb +55 -0
  485. data/test/models/cpk/order_agreement.rb +10 -0
  486. data/test/models/cpk/order_tag.rb +10 -0
  487. data/test/models/cpk/post.rb +10 -0
  488. data/test/models/cpk/posts_tag.rb +10 -0
  489. data/test/models/cpk/review.rb +9 -0
  490. data/test/models/cpk/tag.rb +10 -0
  491. data/test/models/cpk.rb +15 -0
  492. data/test/models/customer.rb +3 -1
  493. data/test/models/destroy_async_parent.rb +1 -1
  494. data/test/models/developer.rb +44 -3
  495. data/test/models/discount.rb +4 -0
  496. data/test/models/drink_designer.rb +1 -0
  497. data/test/models/editor.rb +8 -0
  498. data/test/models/editorship.rb +6 -0
  499. data/test/models/entry.rb +5 -0
  500. data/test/models/essay.rb +6 -1
  501. data/test/models/essay_destroy_async.rb +1 -0
  502. data/test/models/eye.rb +87 -21
  503. data/test/models/face.rb +1 -1
  504. data/test/models/friendship.rb +3 -0
  505. data/test/models/hardback.rb +7 -0
  506. data/test/models/hotel.rb +2 -0
  507. data/test/models/human.rb +2 -2
  508. data/test/models/invoice.rb +2 -1
  509. data/test/models/invokes_an_undefined_method.rb +5 -0
  510. data/test/models/line_item.rb +6 -0
  511. data/test/models/member.rb +9 -4
  512. data/test/models/membership.rb +2 -2
  513. data/test/models/message.rb +2 -1
  514. data/test/models/need_quoting.rb +5 -0
  515. data/test/models/paragraph.rb +5 -0
  516. data/test/models/parrot.rb +6 -3
  517. data/test/models/person.rb +7 -4
  518. data/test/models/pirate.rb +4 -1
  519. data/test/models/pk_autopopulated_by_a_trigger_record.rb +5 -0
  520. data/test/models/post.rb +65 -2
  521. data/test/models/post_encrypted.rb +15 -0
  522. data/test/models/post_with_prefetched_pk.rb +15 -0
  523. data/test/models/project.rb +1 -0
  524. data/test/models/publication.rb +16 -0
  525. data/test/models/raises_argument_error.rb +5 -0
  526. data/test/models/raises_no_method_error.rb +5 -0
  527. data/test/models/recipient.rb +5 -0
  528. data/test/models/reference.rb +1 -1
  529. data/test/models/reply.rb +1 -1
  530. data/test/models/room.rb +3 -0
  531. data/test/models/sharded/blog.rb +12 -0
  532. data/test/models/sharded/blog_post.rb +17 -0
  533. data/test/models/sharded/blog_post_destroy_async.rb +14 -0
  534. data/test/models/sharded/blog_post_tag.rb +11 -0
  535. data/test/models/sharded/blog_post_with_revision.rb +11 -0
  536. data/test/models/sharded/comment.rb +12 -0
  537. data/test/models/sharded/comment_destroy_async.rb +12 -0
  538. data/test/models/sharded/tag.rb +11 -0
  539. data/test/models/sharded.rb +8 -0
  540. data/test/models/ship.rb +1 -1
  541. data/test/models/shipping_line.rb +11 -0
  542. data/test/models/subscriber.rb +1 -0
  543. data/test/models/subscription.rb +3 -1
  544. data/test/models/too_long_table_name.rb +5 -0
  545. data/test/models/topic.rb +3 -1
  546. data/test/models/traffic_light.rb +2 -2
  547. data/test/models/traffic_light_encrypted.rb +21 -0
  548. data/test/models/translation.rb +9 -0
  549. data/test/models/treasure.rb +1 -1
  550. data/test/models/tyre.rb +1 -1
  551. data/test/models/user.rb +16 -0
  552. data/test/models/user_with_invalid_relation.rb +28 -0
  553. data/test/models/uuid_comment.rb +5 -0
  554. data/test/models/uuid_entry.rb +5 -0
  555. data/test/models/uuid_message.rb +5 -0
  556. data/test/models/zine.rb +2 -1
  557. data/test/schema/mysql2_specific_schema.rb +26 -12
  558. data/test/schema/postgresql_specific_schema.rb +121 -13
  559. data/test/schema/schema.rb +361 -103
  560. data/test/schema/sqlite_specific_schema.rb +17 -6
  561. data/test/schema/trilogy_specific_schema.rb +96 -0
  562. data/test/support/adapter_helper.rb +104 -0
  563. data/test/support/async_helper.rb +15 -0
  564. data/test/support/config.rb +1 -1
  565. data/test/support/connection.rb +14 -2
  566. data/test/support/ddl_helper.rb +1 -1
  567. data/test/support/fake_adapter.rb +42 -0
  568. data/test/support/load_schema_helper.rb +22 -0
  569. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic.dump +0 -0
  570. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic_associations.dump +0 -0
  571. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic.dump +0 -0
  572. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic_associations.dump +0 -0
  573. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic.dump +0 -0
  574. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic_associations.dump +0 -0
  575. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic.dump +0 -0
  576. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic_associations.dump +0 -0
  577. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic.dump +0 -0
  578. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic_associations.dump +0 -0
  579. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic.dump +0 -0
  580. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic_associations.dump +0 -0
  581. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic.dump +0 -0
  582. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic_associations.dump +0 -0
  583. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic.dump +0 -0
  584. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic_associations.dump +0 -0
  585. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic.dump +0 -0
  586. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic_associations.dump +0 -0
  587. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic.dump +0 -0
  588. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic_associations.dump +0 -0
  589. data/test/support/schema_dumping_helper.rb +15 -9
  590. data/test/support/tools.rb +37 -0
  591. data/test/support/yaml_compatibility_fixtures/rails_4_1_no_symbol.yml +22 -0
  592. metadata +247 -15
@@ -9,10 +9,16 @@ module ActiveRecord
9
9
  attr_reader :connection
10
10
  self.use_transactional_tests = false
11
11
 
12
+ class TestModel < ActiveRecord::Base
13
+ self.table_name = :testings
14
+ end
15
+
12
16
  def setup
13
17
  super
14
- @connection = ActiveRecord::Base.connection
15
- @schema_migration = @connection.schema_migration
18
+ @connection = ActiveRecord::Base.lease_connection
19
+ @pool = ActiveRecord::Base.connection_pool
20
+ @schema_migration = @pool.schema_migration
21
+ @internal_metadata = @pool.internal_metadata
16
22
  @verbose_was = ActiveRecord::Migration.verbose
17
23
  ActiveRecord::Migration.verbose = false
18
24
 
@@ -25,7 +31,7 @@ module ActiveRecord
25
31
  teardown do
26
32
  connection.drop_table :testings rescue nil
27
33
  ActiveRecord::Migration.verbose = @verbose_was
28
- ActiveRecord::SchemaMigration.delete_all rescue nil
34
+ @schema_migration.delete_all_versions rescue nil
29
35
  end
30
36
 
31
37
  def test_migration_doesnt_remove_named_index
@@ -39,7 +45,7 @@ module ActiveRecord
39
45
  }.new
40
46
 
41
47
  assert connection.index_exists?(:testings, :foo, name: "custom_index_name")
42
- assert_raise(StandardError) { ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate }
48
+ assert_raise(StandardError) { ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate }
43
49
  assert connection.index_exists?(:testings, :foo, name: "custom_index_name")
44
50
  end
45
51
 
@@ -54,13 +60,14 @@ module ActiveRecord
54
60
  }.new
55
61
 
56
62
  assert connection.index_exists?(:testings, :bar)
57
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
63
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
58
64
  assert_not connection.index_exists?(:testings, :bar)
59
65
  end
60
66
 
61
67
  def test_references_does_not_add_index_by_default
62
68
  migration = Class.new(ActiveRecord::Migration[4.2]) {
63
69
  def migrate(x)
70
+ connection.drop_table :more_testings, if_exists: true rescue nil
64
71
  create_table :more_testings do |t|
65
72
  t.references :foo
66
73
  t.belongs_to :bar, index: false
@@ -68,7 +75,7 @@ module ActiveRecord
68
75
  end
69
76
  }.new
70
77
 
71
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
78
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
72
79
 
73
80
  assert_not connection.index_exists?(:more_testings, :foo_id)
74
81
  assert_not connection.index_exists?(:more_testings, :bar_id)
@@ -79,13 +86,14 @@ module ActiveRecord
79
86
  def test_timestamps_have_null_constraints_if_not_present_in_migration_of_create_table
80
87
  migration = Class.new(ActiveRecord::Migration[4.2]) {
81
88
  def migrate(x)
89
+ connection.drop_table :more_testings, if_exists: true rescue nil
82
90
  create_table :more_testings do |t|
83
91
  t.timestamps
84
92
  end
85
93
  end
86
94
  }.new
87
95
 
88
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
96
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
89
97
 
90
98
  assert connection.column_exists?(:more_testings, :created_at, null: true)
91
99
  assert connection.column_exists?(:more_testings, :updated_at, null: true)
@@ -102,13 +110,13 @@ module ActiveRecord
102
110
  end
103
111
  }.new
104
112
 
105
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
113
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
106
114
 
107
115
  assert connection.column_exists?(:testings, :created_at, null: true)
108
116
  assert connection.column_exists?(:testings, :updated_at, null: true)
109
117
  end
110
118
 
111
- if ActiveRecord::Base.connection.supports_bulk_alter?
119
+ if ActiveRecord::Base.lease_connection.supports_bulk_alter?
112
120
  def test_timestamps_have_null_constraints_if_not_present_in_migration_of_change_table_with_bulk
113
121
  migration = Class.new(ActiveRecord::Migration[4.2]) {
114
122
  def migrate(x)
@@ -118,7 +126,7 @@ module ActiveRecord
118
126
  end
119
127
  }.new
120
128
 
121
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
129
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
122
130
 
123
131
  assert connection.column_exists?(:testings, :created_at, null: true)
124
132
  assert connection.column_exists?(:testings, :updated_at, null: true)
@@ -132,7 +140,7 @@ module ActiveRecord
132
140
  end
133
141
  }.new
134
142
 
135
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
143
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
136
144
 
137
145
  assert connection.column_exists?(:testings, :created_at, null: true)
138
146
  assert connection.column_exists?(:testings, :updated_at, null: true)
@@ -141,16 +149,17 @@ module ActiveRecord
141
149
  def test_timestamps_doesnt_set_precision_on_create_table
142
150
  migration = Class.new(ActiveRecord::Migration[5.2]) {
143
151
  def migrate(x)
152
+ connection.drop_table :more_testings, if_exists: true rescue nil
144
153
  create_table :more_testings do |t|
145
154
  t.timestamps
146
155
  end
147
156
  end
148
157
  }.new
149
158
 
150
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
159
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
151
160
 
152
- assert connection.column_exists?(:more_testings, :created_at, null: false, **precision_implicit_default)
153
- assert connection.column_exists?(:more_testings, :updated_at, null: false, **precision_implicit_default)
161
+ assert_timestamp_precision_implicit(:more_testings, :created_at)
162
+ assert_timestamp_precision_implicit(:more_testings, :updated_at)
154
163
  ensure
155
164
  connection.drop_table :more_testings rescue nil
156
165
  end
@@ -164,13 +173,13 @@ module ActiveRecord
164
173
  end
165
174
  }.new
166
175
 
167
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
176
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
168
177
 
169
- assert connection.column_exists?(:testings, :created_at, null: false, **precision_implicit_default)
170
- assert connection.column_exists?(:testings, :updated_at, null: false, **precision_implicit_default)
178
+ assert_timestamp_precision_implicit(:testings, :created_at)
179
+ assert_timestamp_precision_implicit(:testings, :updated_at)
171
180
  end
172
181
 
173
- if ActiveRecord::Base.connection.supports_bulk_alter?
182
+ if ActiveRecord::Base.lease_connection.supports_bulk_alter?
174
183
  def test_timestamps_doesnt_set_precision_on_change_table_with_bulk
175
184
  migration = Class.new(ActiveRecord::Migration[5.2]) {
176
185
  def migrate(x)
@@ -180,7 +189,7 @@ module ActiveRecord
180
189
  end
181
190
  }.new
182
191
 
183
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
192
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
184
193
 
185
194
  assert connection.column_exists?(:testings, :created_at, null: false, **precision_implicit_default)
186
195
  assert connection.column_exists?(:testings, :updated_at, null: false, **precision_implicit_default)
@@ -194,24 +203,25 @@ module ActiveRecord
194
203
  end
195
204
  }.new
196
205
 
197
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
206
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
198
207
 
199
- assert connection.column_exists?(:testings, :created_at, null: false, **precision_implicit_default)
200
- assert connection.column_exists?(:testings, :updated_at, null: false, **precision_implicit_default)
208
+ assert_timestamp_precision_implicit(:testings, :created_at)
209
+ assert_timestamp_precision_implicit(:testings, :updated_at)
201
210
  end
202
211
 
203
212
  def test_legacy_migrations_raises_exception_when_inherited
204
213
  e = assert_raises(StandardError) do
205
214
  class_eval("class LegacyMigration < ActiveRecord::Migration; end")
206
215
  end
207
- assert_match(/LegacyMigration < ActiveRecord::Migration\[4\.2\]/, e.message)
216
+ assert_match(/LegacyMigration < ActiveRecord::Migration\[\d\.\d\]/, e.message)
208
217
  end
209
218
 
210
219
  def test_legacy_migrations_not_raise_exception_on_reverting_transaction
211
220
  migration = Class.new(ActiveRecord::Migration[5.2]) {
212
221
  def change
213
222
  transaction do
214
- execute "select 1 from SYSIBM.DUAL"
223
+ sql = connection.adapter_name == "IBM_DB" ? "select 1 from SYSIBM.DUAL" : "select 1"
224
+ execute sql
215
225
  end
216
226
  end
217
227
  }.new
@@ -221,7 +231,7 @@ module ActiveRecord
221
231
  end
222
232
  end
223
233
 
224
- if ActiveRecord::Base.connection.supports_comments?
234
+ if ActiveRecord::Base.lease_connection.supports_comments?
225
235
  def test_change_column_comment_can_be_reverted
226
236
  migration = Class.new(ActiveRecord::Migration[5.2]) {
227
237
  def migrate(x)
@@ -231,11 +241,13 @@ module ActiveRecord
231
241
  end
232
242
  }.new
233
243
 
234
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
244
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
235
245
  assert connection.column_exists?(:testings, :foo, comment: "comment")
236
246
  end
237
247
 
238
248
  def test_change_table_comment_can_be_reverted
249
+ skip "DB2 does not reliably round-trip table comments in compatibility revert paths" if current_adapter?(:IBM_DBAdapter)
250
+
239
251
  migration = Class.new(ActiveRecord::Migration[5.2]) {
240
252
  def migrate(x)
241
253
  revert do
@@ -244,12 +256,30 @@ module ActiveRecord
244
256
  end
245
257
  }.new
246
258
 
247
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
259
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
248
260
 
249
261
  assert_equal "comment", connection.table_comment("testings")
250
262
  end
251
263
  end
252
264
 
265
+ def test_create_table_allows_duplicate_column_names
266
+ migration = Class.new(ActiveRecord::Migration[5.2]) {
267
+ def migrate(x)
268
+ create_table :tests do |t|
269
+ t.integer :some_id
270
+ t.string :some_id
271
+ end
272
+ end
273
+ }.new
274
+
275
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
276
+
277
+ column = connection.columns(:tests).find { |column| column.name == "some_id" }
278
+ assert_equal :string, column.type
279
+ ensure
280
+ connection.drop_table :tests, if_exists: true
281
+ end
282
+
253
283
  if current_adapter?(:PostgreSQLAdapter)
254
284
  class Testing < ActiveRecord::Base
255
285
  end
@@ -262,60 +292,413 @@ module ActiveRecord
262
292
  }.new
263
293
 
264
294
  Testing.create!
265
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
295
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
266
296
  assert_equal ["foobar"], Testing.all.map(&:foo)
267
297
  ensure
268
298
  ActiveRecord::Base.clear_cache!
269
299
  end
270
300
  end
271
301
 
272
- if current_adapter?(:SQLite3Adapter)
273
- def test_references_stays_as_integer_column_on_create_table_with_reference_6_0
274
- migration = Class.new(ActiveRecord::Migration[6.0]) {
302
+ def test_timestamps_sets_default_precision_on_create_table
303
+ migration = Class.new(ActiveRecord::Migration[6.1]) {
304
+ def migrate(x)
305
+ connection.drop_table :more_testings, if_exists: true rescue nil
306
+ create_table :more_testings do |t|
307
+ t.timestamps
308
+ end
309
+ end
310
+ }.new
311
+
312
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
313
+
314
+ assert connection.column_exists?(:more_testings, :created_at, precision: 6)
315
+ assert connection.column_exists?(:more_testings, :updated_at, precision: 6)
316
+ ensure
317
+ connection.drop_table :more_testings rescue nil
318
+ end
319
+
320
+ def test_datetime_doesnt_set_precision_on_add_column_5_0
321
+ migration = Class.new(ActiveRecord::Migration[5.0]) {
322
+ def migrate(x)
323
+ add_column :testings, :published_at, :datetime, default: Time.now
324
+ end
325
+ }.new
326
+
327
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
328
+
329
+ assert_datetime_precision_implicit(:testings, :published_at)
330
+ end
331
+
332
+ def test_datetime_doesnt_set_precision_on_add_column_6_1
333
+ migration = Class.new(ActiveRecord::Migration[6.1]) {
334
+ def migrate(x)
335
+ add_column :testings, :published_at, :datetime, default: Time.now
336
+ end
337
+ }.new
338
+
339
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
340
+
341
+ assert_datetime_precision_implicit(:testings, :published_at)
342
+ end
343
+
344
+ def test_change_table_allows_if_exists_option_on_7_0
345
+ migration = Class.new(ActiveRecord::Migration[7.0]) {
346
+ def migrate(x)
347
+ change_table(:testings) do |t|
348
+ t.remove :foo, if_exists: true
349
+ end
350
+ end
351
+ }.new
352
+
353
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
354
+
355
+ assert_not connection.column_exists?(:testings, :foo)
356
+ end
357
+
358
+ def test_add_reference_allows_if_exists_option_on_7_0
359
+ migration = Class.new(ActiveRecord::Migration[7.0]) {
360
+ def migrate(x)
361
+ add_reference :testings, :widget, if_not_exists: true
362
+ end
363
+ }.new
364
+
365
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
366
+
367
+ assert connection.column_exists?(:testings, :widget_id)
368
+ end
369
+
370
+ def test_references_on_create_table_on_6_0
371
+ connection.drop_table :more_testings, if_exists: true rescue nil
372
+ migration = Class.new(ActiveRecord::Migration[6.0]) {
373
+ def migrate(x)
374
+ connection.drop_table :more_testings, if_exists: true rescue nil
375
+ create_table :more_testings do |t|
376
+ t.references :testings
377
+ end
378
+ end
379
+ }.new
380
+
381
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
382
+
383
+ column = connection.columns(:more_testings).find { |el| el.name == "testings_id" }
384
+
385
+ if current_adapter?(:SQLite3Adapter, :IBM_DBAdapter)
386
+ assert_match(/integer/i, column.sql_type)
387
+ else
388
+ assert_predicate(column, :bigint?)
389
+ end
390
+ ensure
391
+ connection.drop_table :more_testings rescue nil
392
+ end
393
+
394
+ def test_add_index_errors_on_too_long_name_7_0
395
+ migration = Class.new(ActiveRecord::Migration[7.0]) {
396
+ def migrate(x)
397
+ add_column :testings, :very_long_column_name_to_test_with, :string
398
+ add_index :testings, [:foo, :bar, :very_long_column_name_to_test_with]
399
+ end
400
+ }.new
401
+
402
+ error = assert_raises(StandardError) do
403
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
404
+ end
405
+
406
+ assert_match(/index_testings_on_foo_and_bar_and_very_long_column_name_to_test_with/i, error.message)
407
+ assert_match(/is too long/i, error.message)
408
+ end
409
+
410
+ def test_create_table_add_index_errors_on_too_long_name_7_0
411
+ migration = Class.new(ActiveRecord::Migration[7.0]) {
412
+ def migrate(x)
413
+ connection.drop_table :more_testings, if_exists: true rescue nil
414
+ create_table :more_testings do |t|
415
+ t.integer :foo
416
+ t.integer :bar
417
+ t.integer :very_long_column_name_to_test_with
418
+ t.index [:foo, :bar, :very_long_column_name_to_test_with]
419
+ end
420
+ end
421
+ }.new
422
+
423
+ error = assert_raises(StandardError) do
424
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
425
+ end
426
+
427
+ assert_match(/index_more_testings_on_foo_and_bar_and_very_long_column_name_to_test_with/i, error.message)
428
+ assert_match(/is too long/i, error.message)
429
+ ensure
430
+ connection.drop_table :more_testings rescue nil
431
+ end
432
+
433
+ def test_rename_table_errors_on_too_long_index_name_7_0
434
+ skip "DB2 auto-adjusts index naming on table rename and does not raise long-index-name errors" if current_adapter?(:IBM_DBAdapter)
435
+
436
+ long_table_name = "a" * connection.table_name_length
437
+
438
+ migration = Class.new(ActiveRecord::Migration[7.0]) {
439
+ def migrate(x)
440
+ add_index :testings, :foo
441
+ long_table_name = "a" * connection.table_name_length
442
+ rename_table :testings, long_table_name
443
+ end
444
+ }.new
445
+
446
+ error = assert_raises(StandardError) do
447
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
448
+ end
449
+
450
+ assert_match(/index_#{long_table_name}_on_foo/i, error.message)
451
+ assert_match(/is too long/i, error.message)
452
+ ensure
453
+ connection.drop_table long_table_name, if_exists: true if long_table_name
454
+ end
455
+
456
+ if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
457
+ def test_change_table_collation_not_unset_7_0
458
+ migration = Class.new(ActiveRecord::Migration[7.0]) {
275
459
  def migrate(x)
276
- create_table :more_testings do |t|
277
- t.references :testings
278
- end
460
+ add_column :testings, :txt_collated, :string, charset: "utf8mb4", collation: "utf8mb4_general_ci"
461
+ change_column :testings, :txt_collated, :string, default: "hi", collation: "utf8mb4_esperanto_ci"
279
462
  end
280
463
  }.new
464
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
465
+ column = @connection.columns(:testings).find { |c| c.name == "txt_collated" }
466
+ assert_equal "hi", column.default
467
+ assert_equal "utf8mb4_esperanto_ci", column.collation
468
+ end
469
+ end
281
470
 
282
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
471
+ def test_add_reference_on_6_0
472
+ connection.drop_table :more_testings, if_exists: true rescue nil
473
+ create_migration = Class.new(ActiveRecord::Migration[6.0]) {
474
+ def version; 100 end
475
+ def migrate(x)
476
+ connection.drop_table :more_testings, if_exists: true rescue nil
477
+ create_table :more_testings do |t|
478
+ t.string :test
479
+ end
480
+ end
481
+ }.new
482
+
483
+ migration = Class.new(ActiveRecord::Migration[6.0]) {
484
+ def version; 101 end
485
+ def migrate(x)
486
+ add_reference :more_testings, :testings
487
+ end
488
+ }.new
489
+
490
+ ActiveRecord::Migrator.new(:up, [create_migration, migration], @schema_migration, @internal_metadata).migrate
283
491
 
284
- testings_id_column = connection.columns(:more_testings).find { |el| el.name == "testings_id" }
285
- assert_equal "integer", testings_id_column.sql_type
492
+ column = connection.columns(:more_testings).find { |el| el.name == "testings_id" }
493
+
494
+ if current_adapter?(:SQLite3Adapter, :IBM_DBAdapter)
495
+ assert_match(/integer/i, column.sql_type)
496
+ else
497
+ assert_predicate(column, :bigint?)
498
+ end
499
+ ensure
500
+ connection.drop_table :more_testings rescue nil
501
+ end
502
+
503
+ def test_create_table_on_7_0
504
+ long_table_name = "a" * (connection.table_name_length + 1)
505
+ migration = Class.new(ActiveRecord::Migration[7.0]) {
506
+ @@long_table_name = long_table_name
507
+ def version; 100 end
508
+ def migrate(x)
509
+ create_table @@long_table_name
510
+ end
511
+ }.new
512
+
513
+ if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
514
+ # MySQL does not allow to create table names longer than limit
515
+ error = assert_raises(StandardError) do
516
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
517
+ end
518
+ if connection.mariadb?
519
+ assert_match(/Incorrect table name '#{long_table_name}'/i, error.message)
520
+ else
521
+ assert_match(/Identifier name '#{long_table_name}' is too long/i, error.message)
522
+ end
523
+ else
524
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
525
+ assert connection.table_exists?(long_table_name)
526
+ end
527
+ ensure
528
+ connection.drop_table(long_table_name) rescue nil
529
+ end
530
+
531
+ def test_rename_table_on_7_0
532
+ long_table_name = "a" * (connection.table_name_length + 1)
533
+ connection.create_table(:more_testings)
534
+
535
+ migration = Class.new(ActiveRecord::Migration[7.0]) {
536
+ @@long_table_name = long_table_name
537
+ def version; 100 end
538
+ def migrate(x)
539
+ rename_table :more_testings, @@long_table_name
540
+ end
541
+ }.new
542
+
543
+ if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
544
+ # MySQL does not allow to create table names longer than limit
545
+ error = assert_raises(StandardError) do
546
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
547
+ end
548
+ if connection.mariadb?
549
+ assert_match(/Incorrect table name '#{long_table_name}'/i, error.message)
550
+ else
551
+ assert_match(/Identifier name '#{long_table_name}' is too long/i, error.message)
552
+ end
553
+ else
554
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
555
+ assert connection.table_exists?(long_table_name)
556
+ assert_not connection.table_exists?(:more_testings)
557
+ assert connection.table_exists?(long_table_name)
558
+ end
559
+ ensure
560
+ connection.drop_table(:more_testings) rescue nil
561
+ connection.drop_table(long_table_name) rescue nil
562
+ end
563
+
564
+ def test_invert_rename_table_on_7_0
565
+ connection.create_table(:more_testings)
566
+
567
+ migration = Class.new(ActiveRecord::Migration[7.0]) {
568
+ def change
569
+ rename_table :more_testings, :new_more_testings
570
+ end
571
+ }.new
572
+
573
+ migration.migrate(:up)
574
+ assert connection.table_exists?(:new_more_testings)
575
+ assert_not connection.table_exists?(:more_testings)
576
+
577
+ migration.migrate(:down)
578
+ assert_not connection.table_exists?(:new_more_testings)
579
+ assert connection.table_exists?(:more_testings)
580
+ ensure
581
+ connection.drop_table(:more_testings) rescue nil
582
+ connection.drop_table(:new_more_testings) rescue nil
583
+ end
584
+
585
+ def test_change_column_null_with_non_boolean_arguments_raises_in_a_migration
586
+ migration = Class.new(ActiveRecord::Migration[7.1]) do
587
+ def up
588
+ add_column :testings, :name, :string
589
+ change_column_null :testings, :name, from: true, to: false
590
+ end
591
+ end
592
+ e = assert_raise(StandardError) do
593
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
594
+ end
595
+ assert_includes e.message, "change_column_null expects a boolean value (true for NULL, false for NOT NULL). Got: #{{ from: true, to: false }}"
596
+ end
597
+
598
+ def test_change_column_null_with_non_boolean_arguments_does_not_raise_in_old_rails_versions
599
+ migration = Class.new(ActiveRecord::Migration[7.0]) do
600
+ def up
601
+ add_column :testings, :name, :string
602
+ change_column_null :testings, :name, from: true, to: false
603
+ end
604
+ end
605
+ assert_nothing_raised do
606
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
607
+ end
608
+ TestModel.reset_column_information
609
+ assert_difference("TestModel.count" => 1) do
610
+ TestModel.create!(name: nil)
611
+ end
612
+ end
613
+
614
+ def test_change_column_null_with_boolean_arguments_does_not_raise_in_old_rails_versions
615
+ migration = Class.new(ActiveRecord::Migration[7.0]) do
616
+ def up
617
+ add_column :testings, :name, :string
618
+ change_column_null :testings, :name, false
619
+ end
620
+ end
621
+ assert_nothing_raised do
622
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
623
+ end
624
+ TestModel.reset_column_information
625
+ assert_raise(ActiveRecord::NotNullViolation) do
626
+ TestModel.create!(name: nil)
627
+ end
628
+ end
629
+
630
+ if current_adapter?(:PostgreSQLAdapter)
631
+ def test_disable_extension_on_7_0
632
+ enable_extension!(:hstore, connection)
633
+
634
+ migration = Class.new(ActiveRecord::Migration[7.0]) do
635
+ def up
636
+ add_column :testings, :settings, :hstore
637
+ disable_extension :hstore
638
+ end
639
+ end
640
+
641
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
642
+ assert_not connection.extension_enabled?(:hstore)
286
643
  ensure
287
- connection.drop_table :more_testings rescue nil
644
+ disable_extension!(:hstore, connection)
288
645
  end
289
646
 
290
- def test_references_stays_as_integer_column_on_add_reference_6_0
291
- create_migration = Class.new(ActiveRecord::Migration[6.0]) {
292
- def version; 100 end
647
+ def test_legacy_add_foreign_key_with_deferrable_true
648
+ migration = Class.new(ActiveRecord::Migration[7.0]) {
293
649
  def migrate(x)
294
- create_table :more_testings do |t|
295
- t.string :test
650
+ create_table :sub_testings do |t|
651
+ t.bigint :testing_id
296
652
  end
297
- end
298
- }.new
299
653
 
300
- migration = Class.new(ActiveRecord::Migration[6.0]) {
301
- def version; 101 end
302
- def migrate(x)
303
- add_reference :more_testings, :testings
654
+ add_foreign_key(:sub_testings, :testings, name: "deferrable_foreign_key", deferrable: true)
304
655
  end
305
656
  }.new
306
657
 
307
- ActiveRecord::Migrator.new(:up, [create_migration, migration], @schema_migration).migrate
658
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
308
659
 
309
- testings_id_column = connection.columns(:more_testings).find { |el| el.name == "testings_id" }
310
- assert_equal "integer", testings_id_column.sql_type
660
+ foreign_keys = Testing.lease_connection.foreign_keys("sub_testings")
661
+ assert_equal 1, foreign_keys.size
662
+ assert_equal :immediate, foreign_keys.first.deferrable
311
663
  ensure
312
- connection.drop_table :more_testings rescue nil
664
+ connection.drop_table(:sub_testings, if_exists: true)
665
+ ActiveRecord::Base.clear_cache!
666
+ end
667
+ end
668
+
669
+ if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
670
+ def test_change_column_on_7_0
671
+ migration = Class.new(ActiveRecord::Migration[7.0]) do
672
+ def up
673
+ execute("ALTER TABLE testings CONVERT TO CHARACTER SET utf32")
674
+ change_column(:testings, :foo, "varchar(255) CHARACTER SET ascii")
675
+ end
676
+ end
677
+ assert_nothing_raised do
678
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
679
+ end
313
680
  end
314
681
  end
315
682
 
316
683
  private
684
+ def assert_timestamp_precision_implicit(table_name, column_name)
685
+ if current_adapter?(:IBM_DBAdapter)
686
+ assert connection.column_exists?(table_name, column_name, null: false)
687
+ else
688
+ assert connection.column_exists?(table_name, column_name, null: false, **precision_implicit_default)
689
+ end
690
+ end
691
+
692
+ def assert_datetime_precision_implicit(table_name, column_name)
693
+ if current_adapter?(:IBM_DBAdapter)
694
+ assert connection.column_exists?(table_name, column_name)
695
+ else
696
+ assert connection.column_exists?(table_name, column_name, **precision_implicit_default)
697
+ end
698
+ end
699
+
317
700
  def precision_implicit_default
318
- if current_adapter?(:Mysql2Adapter)
701
+ if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
319
702
  { precision: 0 }
320
703
  elsif current_adapter?(:IBM_DBAdapter)
321
704
  { precision: 6 }
@@ -327,12 +710,292 @@ module ActiveRecord
327
710
  end
328
711
  end
329
712
 
713
+ module NoOptionValidationTestCases
714
+ def test_options_are_not_validated
715
+ skip "DB2 validates unknown migration options in legacy compatibility paths" if current_adapter?(:IBM_DBAdapter)
716
+
717
+ migration = Class.new(migration_class) {
718
+ def migrate(x)
719
+ create_table :tests, wrong_id: false do |t|
720
+ t.references :some_table, wrong_primary_key: true
721
+ t.integer :some_id, wrong_unique: true
722
+ t.string :some_string_column, wrong_null: false
723
+ end
724
+
725
+ add_column :tests, "last_name", :string, wrong_precision: true
726
+
727
+ change_column :tests, :some_id, :float, wrong_index: true
728
+
729
+ add_reference :tests, :another_table, invalid_option: :something
730
+
731
+ change_table :tests do |t|
732
+ t.change :some_id, :float, null: false, wrong_index: true
733
+ t.integer :another_id, wrong_unique: true
734
+ t.references :yet_another_table, bad: :option
735
+ end
736
+ end
737
+ }.new
738
+
739
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
740
+
741
+ assert connection.table_exists?(:tests)
742
+ ensure
743
+ connection.drop_table :tests, if_exists: true
744
+ end
745
+ end
746
+
747
+ module DefaultPrecisionImplicitTestCases
748
+ def test_datetime_doesnt_set_precision_on_change_table
749
+ create_migration = Class.new(migration_class) {
750
+ def migrate(x)
751
+ connection.drop_table :more_testings, if_exists: true rescue nil
752
+ create_table :more_testings do |t|
753
+ t.datetime :published_at
754
+ end
755
+ end
756
+ }.new(nil, 1)
757
+
758
+ change_migration = Class.new(migration_class) {
759
+ def migrate(x)
760
+ change_table :more_testings do |t|
761
+ t.change :published_at, :datetime, default: Time.now
762
+ end
763
+ end
764
+ }.new(nil, 2)
765
+
766
+ ActiveRecord::Migrator.new(:up, [create_migration, change_migration], @schema_migration, @internal_metadata).migrate
767
+
768
+ assert_datetime_precision_implicit(:more_testings, :published_at)
769
+ ensure
770
+ connection.drop_table :more_testings rescue nil
771
+ end
772
+
773
+ def test_datetime_doesnt_set_precision_on_create_table
774
+ migration = Class.new(migration_class) {
775
+ def migrate(x)
776
+ connection.drop_table :more_testings, if_exists: true rescue nil
777
+ create_table :more_testings do |t|
778
+ t.datetime :published_at
779
+ end
780
+ end
781
+ }.new
782
+
783
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
784
+
785
+ assert_datetime_precision_implicit(:more_testings, :published_at)
786
+ ensure
787
+ connection.drop_table :more_testings rescue nil
788
+ end
789
+
790
+ def test_datetime_doesnt_set_precision_on_change_column
791
+ create_migration = Class.new(migration_class) {
792
+ def migrate(x)
793
+ connection.drop_table :more_testings, if_exists: true rescue nil
794
+ create_table :more_testings do |t|
795
+ t.date :published_at
796
+ end
797
+ end
798
+ }.new(nil, 0)
799
+
800
+ change_migration = Class.new(migration_class) {
801
+ def migrate(x)
802
+ change_column :more_testings, :published_at, :datetime
803
+ end
804
+ }.new(nil, 1)
805
+
806
+ ActiveRecord::Migrator.new(:up, [create_migration, change_migration], @schema_migration, @internal_metadata).migrate
807
+
808
+ assert_datetime_precision_implicit(:more_testings, :published_at)
809
+ ensure
810
+ connection.drop_table :more_testings rescue nil
811
+ end
812
+
813
+ private
814
+ def assert_datetime_precision_implicit(table_name, column_name)
815
+ if current_adapter?(:IBM_DBAdapter)
816
+ assert connection.column_exists?(table_name, column_name)
817
+ else
818
+ assert connection.column_exists?(table_name, column_name, **precision_implicit_default)
819
+ end
820
+ end
821
+
822
+ def precision_implicit_default
823
+ if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
824
+ { precision: 0 }
825
+ elsif current_adapter?(:IBM_DBAdapter)
826
+ { precision: 6 }
827
+ else
828
+ { precision: nil }
829
+ end
830
+ end
831
+ end
832
+
833
+ module DefaultPrecisionSixTestCases
834
+ def test_datetime_sets_precision_6_on_change_table
835
+ create_migration = Class.new(migration_class) {
836
+ def migrate(x)
837
+ connection.drop_table :more_testings, if_exists: true rescue nil
838
+ create_table :more_testings do |t|
839
+ t.datetime :published_at
840
+ end
841
+ end
842
+ }.new(nil, 1)
843
+
844
+ change_migration = Class.new(migration_class) {
845
+ def migrate(x)
846
+ change_table :more_testings do |t|
847
+ t.change :published_at, :datetime, default: Time.now
848
+ end
849
+ end
850
+ }.new(nil, 2)
851
+
852
+ ActiveRecord::Migrator.new(:up, [create_migration, change_migration], @schema_migration, @internal_metadata).migrate
853
+
854
+ assert connection.column_exists?(:more_testings, :published_at, precision: 6)
855
+ ensure
856
+ connection.drop_table :more_testings rescue nil
857
+ end
858
+
859
+ def test_datetime_sets_precision_6_on_create_table
860
+ migration = Class.new(migration_class) {
861
+ def migrate(x)
862
+ connection.drop_table :more_testings, if_exists: true rescue nil
863
+ create_table :more_testings do |t|
864
+ t.datetime :published_at
865
+ end
866
+ end
867
+ }.new
868
+
869
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
870
+
871
+ assert connection.column_exists?(:more_testings, :published_at, precision: 6)
872
+ ensure
873
+ connection.drop_table :more_testings rescue nil
874
+ end
875
+
876
+ def test_datetime_sets_precision_6_on_change_column
877
+ skip "DB2 change_column datetime metadata does not guarantee precision 6 in compatibility paths" if current_adapter?(:IBM_DBAdapter)
878
+
879
+ create_migration = Class.new(migration_class) {
880
+ def migrate(x)
881
+ connection.drop_table :more_testings, if_exists: true rescue nil
882
+ create_table :more_testings do |t|
883
+ t.date :published_at
884
+ end
885
+ end
886
+ }.new(nil, 0)
887
+
888
+ change_migration = Class.new(migration_class) {
889
+ def migrate(x)
890
+ change_column :more_testings, :published_at, :datetime
891
+ end
892
+ }.new(nil, 1)
893
+
894
+ ActiveRecord::Migrator.new(:up, [create_migration, change_migration], @schema_migration, @internal_metadata).migrate
895
+
896
+ assert connection.column_exists?(:more_testings, :published_at, precision: 6)
897
+ ensure
898
+ connection.drop_table :more_testings rescue nil
899
+ end
900
+ end
901
+
902
+ class BaseCompatibilityTest < ActiveRecord::TestCase
903
+ attr_reader :connection
904
+
905
+ def setup
906
+ @connection = ActiveRecord::Base.lease_connection
907
+ @pool = ActiveRecord::Base.connection_pool
908
+ @schema_migration = @pool.schema_migration
909
+ @internal_metadata = @pool.internal_metadata
910
+
911
+ @verbose_was = ActiveRecord::Migration.verbose
912
+ ActiveRecord::Migration.verbose = false
913
+ end
914
+
915
+ def teardown
916
+ ActiveRecord::Migration.verbose = @verbose_was
917
+ @schema_migration.delete_all_versions rescue nil
918
+ end
919
+ end
920
+
921
+ class CompatibilityTest7_0 < BaseCompatibilityTest
922
+ include DefaultPrecisionSixTestCases
923
+ include NoOptionValidationTestCases
924
+
925
+ private
926
+ def migration_class
927
+ ActiveRecord::Migration[7.0]
928
+ end
929
+ end
930
+
931
+ class CompatibilityTest6_1 < BaseCompatibilityTest
932
+ include DefaultPrecisionImplicitTestCases
933
+ include NoOptionValidationTestCases
934
+
935
+ private
936
+ def migration_class
937
+ ActiveRecord::Migration[6.1]
938
+ end
939
+ end
940
+
941
+ class CompatibilityTest6_0 < BaseCompatibilityTest
942
+ include DefaultPrecisionImplicitTestCases
943
+ include NoOptionValidationTestCases
944
+
945
+ private
946
+ def migration_class
947
+ ActiveRecord::Migration[6.0]
948
+ end
949
+ end
950
+
951
+ class CompatibilityTest5_2 < BaseCompatibilityTest
952
+ include DefaultPrecisionImplicitTestCases
953
+ include NoOptionValidationTestCases
954
+
955
+ private
956
+ def migration_class
957
+ ActiveRecord::Migration[5.2]
958
+ end
959
+ end
960
+
961
+ class CompatibilityTest5_1 < BaseCompatibilityTest
962
+ include DefaultPrecisionImplicitTestCases
963
+ include NoOptionValidationTestCases
964
+
965
+ private
966
+ def migration_class
967
+ ActiveRecord::Migration[5.1]
968
+ end
969
+ end
970
+
971
+ class CompatibilityTest5_0 < BaseCompatibilityTest
972
+ include DefaultPrecisionImplicitTestCases
973
+ include NoOptionValidationTestCases
974
+
975
+ private
976
+ def migration_class
977
+ ActiveRecord::Migration[5.0]
978
+ end
979
+ end
980
+
981
+ class CompatibilityTest4_2 < BaseCompatibilityTest
982
+ include DefaultPrecisionImplicitTestCases
983
+ include NoOptionValidationTestCases
984
+
985
+ private
986
+ def migration_class
987
+ ActiveRecord::Migration[4.2]
988
+ end
989
+ end
990
+
330
991
  module LegacyPolymorphicReferenceIndexTestCases
331
992
  attr_reader :connection
332
993
 
333
994
  def setup
334
- @connection = ActiveRecord::Base.connection
335
- @schema_migration = @connection.schema_migration
995
+ @connection = ActiveRecord::Base.lease_connection
996
+ @pool = ActiveRecord::Base.connection_pool
997
+ @schema_migration = @pool.schema_migration
998
+ @internal_metadata = @pool.internal_metadata
336
999
  @verbose_was = ActiveRecord::Migration.verbose
337
1000
  ActiveRecord::Migration.verbose = false
338
1001
 
@@ -341,13 +1004,18 @@ module LegacyPolymorphicReferenceIndexTestCases
341
1004
 
342
1005
  def teardown
343
1006
  ActiveRecord::Migration.verbose = @verbose_was
344
- ActiveRecord::SchemaMigration.delete_all rescue nil
1007
+ @schema_migration.delete_all_versions rescue nil
345
1008
  connection.drop_table :testings rescue nil
346
1009
  end
347
1010
 
348
1011
  def test_create_table_with_polymorphic_reference_uses_all_column_names_in_index
1012
+ if current_adapter?(:IBM_DBAdapter) && self.class.name.match?(/LegacyPolymorphicReferenceIndexTest::V(?:4_2|5_1|5_2|6_0)/)
1013
+ skip "DB2 legacy create_table compatibility paths do not reliably expose polymorphic composite indexes"
1014
+ end
1015
+
349
1016
  migration = Class.new(migration_class) {
350
1017
  def migrate(x)
1018
+ connection.drop_table :more_testings, if_exists: true rescue nil
351
1019
  create_table :more_testings do |t|
352
1020
  t.references :widget, polymorphic: true, index: true
353
1021
  t.belongs_to :gizmo, polymorphic: true, index: true
@@ -355,7 +1023,7 @@ module LegacyPolymorphicReferenceIndexTestCases
355
1023
  end
356
1024
  }.new
357
1025
 
358
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
1026
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
359
1027
 
360
1028
  assert connection.index_exists?(:more_testings, [:widget_type, :widget_id], name: :index_more_testings_on_widget_type_and_widget_id)
361
1029
  assert connection.index_exists?(:more_testings, [:gizmo_type, :gizmo_id], name: :index_more_testings_on_gizmo_type_and_gizmo_id)
@@ -364,6 +1032,10 @@ module LegacyPolymorphicReferenceIndexTestCases
364
1032
  end
365
1033
 
366
1034
  def test_change_table_with_polymorphic_reference_uses_all_column_names_in_index
1035
+ if current_adapter?(:IBM_DBAdapter) && self.class.name.match?(/LegacyPolymorphicReferenceIndexTest::V(?:4_2|5_0|5_1|6_0)/)
1036
+ skip "DB2 legacy change_table compatibility paths (<= 6.0) do not create polymorphic composite indexes"
1037
+ end
1038
+
367
1039
  migration = Class.new(migration_class) {
368
1040
  def migrate(x)
369
1041
  change_table :testings do |t|
@@ -373,15 +1045,25 @@ module LegacyPolymorphicReferenceIndexTestCases
373
1045
  end
374
1046
  }.new
375
1047
 
376
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
1048
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
377
1049
 
378
- assert connection.index_exists?(:testings, [:widget_type, :widget_id], name: :index_testings_on_widget_type_and_widget_id)
379
- assert connection.index_exists?(:testings, [:gizmo_type, :gizmo_id], name: :index_testings_on_gizmo_type_and_gizmo_id)
1050
+ if current_adapter?(:IBM_DBAdapter)
1051
+ assert connection.index_exists?(:testings, [:widget_type, :widget_id])
1052
+ assert connection.index_exists?(:testings, [:gizmo_type, :gizmo_id])
1053
+ else
1054
+ assert connection.index_exists?(:testings, [:widget_type, :widget_id], name: :index_testings_on_widget_type_and_widget_id)
1055
+ assert connection.index_exists?(:testings, [:gizmo_type, :gizmo_id], name: :index_testings_on_gizmo_type_and_gizmo_id)
1056
+ end
380
1057
  end
381
1058
 
382
1059
  def test_create_join_table_with_polymorphic_reference_uses_all_column_names_in_index
1060
+ if current_adapter?(:IBM_DBAdapter) && self.class.name.match?(/LegacyPolymorphicReferenceIndexTest::V4_2/)
1061
+ skip "DB2 legacy create_join_table compatibility path (4.2) does not create polymorphic composite indexes with expected names"
1062
+ end
1063
+
383
1064
  migration = Class.new(migration_class) {
384
1065
  def migrate(x)
1066
+ connection.drop_table :more_testings, if_exists: true rescue nil
385
1067
  create_join_table :more, :testings do |t|
386
1068
  t.references :widget, polymorphic: true, index: true
387
1069
  t.belongs_to :gizmo, polymorphic: true, index: true
@@ -389,7 +1071,7 @@ module LegacyPolymorphicReferenceIndexTestCases
389
1071
  end
390
1072
  }.new
391
1073
 
392
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
1074
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
393
1075
 
394
1076
  assert connection.index_exists?(:more_testings, [:widget_type, :widget_id], name: :index_more_testings_on_widget_type_and_widget_id)
395
1077
  assert connection.index_exists?(:more_testings, [:gizmo_type, :gizmo_id], name: :index_more_testings_on_gizmo_type_and_gizmo_id)
@@ -405,7 +1087,7 @@ module LegacyPolymorphicReferenceIndexTestCases
405
1087
  end
406
1088
  }.new
407
1089
 
408
- ActiveRecord::Migrator.new(:up, [migration], @schema_migration).migrate
1090
+ ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
409
1091
 
410
1092
  assert connection.index_exists?(:testings, [:widget_type, :widget_id], name: :index_testings_on_widget_type_and_widget_id)
411
1093
  assert connection.index_exists?(:testings, [:gizmo_type, :gizmo_id], name: :index_testings_on_gizmo_type_and_gizmo_id)
@@ -454,198 +1136,203 @@ module LegacyPolymorphicReferenceIndexTest
454
1136
  end
455
1137
 
456
1138
  module LegacyPrimaryKeyTestCases
1139
+ extend ActiveSupport::Concern
457
1140
  include SchemaDumpingHelper
458
1141
 
459
1142
  class LegacyPrimaryKey < ActiveRecord::Base
460
1143
  end
461
1144
 
462
- def setup
463
- @migration = nil
464
- @verbose_was = ActiveRecord::Migration.verbose
465
- ActiveRecord::Migration.verbose = false
466
- end
1145
+ included do
1146
+ def setup
1147
+ @migration = nil
1148
+ @verbose_was = ActiveRecord::Migration.verbose
1149
+ ActiveRecord::Migration.verbose = false
1150
+ end
467
1151
 
468
- def teardown
469
- @migration.migrate(:down) if @migration
470
- ActiveRecord::Migration.verbose = @verbose_was
471
- ActiveRecord::SchemaMigration.delete_all rescue nil
472
- LegacyPrimaryKey.reset_column_information
473
- end
1152
+ def teardown
1153
+ @migration.migrate(:down) if @migration
1154
+ ActiveRecord::Migration.verbose = @verbose_was
1155
+ ActiveRecord::Base.connection_pool.schema_migration.delete_all_versions rescue nil
1156
+ LegacyPrimaryKey.reset_column_information
1157
+ end
474
1158
 
475
- def test_legacy_primary_key_should_be_auto_incremented
476
- @migration = Class.new(migration_class) {
477
- def change
478
- create_table :legacy_primary_keys do |t|
479
- t.references :legacy_ref
1159
+ def test_legacy_primary_key_should_be_auto_incremented
1160
+ @migration = Class.new(migration_class) {
1161
+ def change
1162
+ create_table :legacy_primary_keys do |t|
1163
+ t.references :legacy_ref
1164
+ end
480
1165
  end
481
- end
482
- }.new
483
-
484
- @migration.migrate(:up)
485
-
486
- assert_legacy_primary_key
487
-
488
- legacy_ref = LegacyPrimaryKey.columns_hash["legacy_ref_id"]
489
- assert_not_predicate legacy_ref, :bigint?
490
-
491
- record1 = LegacyPrimaryKey.create!
492
- assert_not_nil record1.id
1166
+ }.new
493
1167
 
494
- record1.destroy
1168
+ @migration.migrate(:up)
495
1169
 
496
- record2 = LegacyPrimaryKey.create!
497
- assert_not_nil record2.id
498
- assert_operator record2.id, :>, record1.id
499
- end
1170
+ assert_legacy_primary_key
500
1171
 
501
- def test_legacy_integer_primary_key_should_not_be_auto_incremented
502
- skip if current_adapter?(:SQLite3Adapter, :IBM_DBAdapter)
1172
+ legacy_ref = LegacyPrimaryKey.columns_hash["legacy_ref_id"]
1173
+ assert_not_predicate legacy_ref, :bigint?
503
1174
 
504
- @migration = Class.new(migration_class) {
505
- def change
506
- create_table :legacy_primary_keys, id: :integer do |t|
507
- end
508
- end
509
- }.new
1175
+ record1 = LegacyPrimaryKey.create!
1176
+ assert_not_nil record1.id
510
1177
 
511
- @migration.migrate(:up)
1178
+ record1.destroy
512
1179
 
513
- assert_raises(ActiveRecord::NotNullViolation) do
514
- LegacyPrimaryKey.create!
1180
+ record2 = LegacyPrimaryKey.create!
1181
+ assert_not_nil record2.id
1182
+ assert_operator record2.id, :>, record1.id
515
1183
  end
516
1184
 
517
- schema = dump_table_schema "legacy_primary_keys"
518
- assert_match %r{create_table "legacy_primary_keys", id: :integer, default: nil}, schema
519
- end
1185
+ def test_legacy_integer_primary_key_should_not_be_auto_incremented
1186
+ skip if current_adapter?(:SQLite3Adapter, :IBM_DBAdapter)
520
1187
 
521
- def test_legacy_primary_key_in_create_table_should_be_integer
522
- @migration = Class.new(migration_class) {
523
- def change
524
- create_table :legacy_primary_keys, id: false do |t|
525
- t.primary_key :id
1188
+ @migration = Class.new(migration_class) {
1189
+ def change
1190
+ create_table :legacy_primary_keys, id: :integer do |t|
1191
+ end
526
1192
  end
527
- end
528
- }.new
529
-
530
- @migration.migrate(:up)
1193
+ }.new
531
1194
 
532
- assert_legacy_primary_key
533
- end
1195
+ @migration.migrate(:up)
534
1196
 
535
- def test_legacy_primary_key_in_change_table_should_be_integer
536
- @migration = Class.new(migration_class) {
537
- def change
538
- create_table :legacy_primary_keys, id: false do |t|
539
- t.integer :dummy
540
- end
541
- change_table :legacy_primary_keys do |t|
542
- t.primary_key :id
543
- end
1197
+ assert_raises(ActiveRecord::NotNullViolation) do
1198
+ LegacyPrimaryKey.create!
544
1199
  end
545
- }.new
546
-
547
- @migration.migrate(:up)
548
1200
 
549
- assert_legacy_primary_key
550
- end
1201
+ schema = dump_table_schema "legacy_primary_keys"
1202
+ assert_match %r{create_table "legacy_primary_keys", id: :integer, default: nil}, schema
1203
+ end
551
1204
 
552
- def test_add_column_with_legacy_primary_key_should_be_integer
553
- @migration = Class.new(migration_class) {
554
- def change
555
- create_table :legacy_primary_keys, id: false do |t|
556
- t.integer :dummy
1205
+ def test_legacy_primary_key_in_create_table_should_be_integer
1206
+ @migration = Class.new(migration_class) {
1207
+ def change
1208
+ create_table :legacy_primary_keys, id: false do |t|
1209
+ t.primary_key :id
1210
+ end
557
1211
  end
558
- add_column :legacy_primary_keys, :id, :primary_key
559
- end
560
- }.new
1212
+ }.new
561
1213
 
562
- @migration.migrate(:up)
1214
+ @migration.migrate(:up)
563
1215
 
564
- assert_legacy_primary_key
565
- end
1216
+ assert_legacy_primary_key
1217
+ end
566
1218
 
567
- def test_legacy_join_table_foreign_keys_should_be_integer
568
- @migration = Class.new(migration_class) {
569
- def change
570
- create_join_table :apples, :bananas do |t|
1219
+ def test_legacy_primary_key_in_change_table_should_be_integer
1220
+ @migration = Class.new(migration_class) {
1221
+ def change
1222
+ create_table :legacy_primary_keys, id: false do |t|
1223
+ t.integer :dummy
1224
+ end
1225
+ change_table :legacy_primary_keys do |t|
1226
+ t.primary_key :id
1227
+ end
571
1228
  end
572
- end
573
- }.new
1229
+ }.new
574
1230
 
575
- @migration.migrate(:up)
1231
+ @migration.migrate(:up)
576
1232
 
577
- schema = dump_table_schema "apples_bananas"
578
- assert_match %r{integer "apple_id", null: false}, schema
579
- assert_match %r{integer "banana_id", null: false}, schema
580
- end
1233
+ assert_legacy_primary_key
1234
+ end
581
1235
 
582
- def test_legacy_join_table_column_options_should_be_overwritten
583
- @migration = Class.new(migration_class) {
584
- def change
585
- create_join_table :apples, :bananas, column_options: { type: :bigint } do |t|
1236
+ def test_add_column_with_legacy_primary_key_should_be_integer
1237
+ @migration = Class.new(migration_class) {
1238
+ def change
1239
+ create_table :legacy_primary_keys, id: false do |t|
1240
+ t.integer :dummy
1241
+ end
1242
+ add_column :legacy_primary_keys, :id, :primary_key
586
1243
  end
587
- end
588
- }.new
1244
+ }.new
589
1245
 
590
- @migration.migrate(:up)
1246
+ @migration.migrate(:up)
591
1247
 
592
- schema = dump_table_schema "apples_bananas"
593
- assert_match %r{bigint "apple_id", null: false}, schema
594
- assert_match %r{bigint "banana_id", null: false}, schema
595
- end
1248
+ assert_legacy_primary_key
1249
+ end
596
1250
 
597
- if current_adapter?(:Mysql2Adapter)
598
- def test_legacy_bigint_primary_key_should_be_auto_incremented
1251
+ def test_legacy_join_table_foreign_keys_should_be_integer
599
1252
  @migration = Class.new(migration_class) {
600
1253
  def change
601
- create_table :legacy_primary_keys, id: :bigint
1254
+ create_join_table :apples, :bananas do |t|
1255
+ end
602
1256
  end
603
1257
  }.new
604
1258
 
605
1259
  @migration.migrate(:up)
606
1260
 
607
- legacy_pk = LegacyPrimaryKey.columns_hash["id"]
608
- assert_predicate legacy_pk, :bigint?
609
- assert_predicate legacy_pk, :auto_increment?
610
-
611
- schema = dump_table_schema "legacy_primary_keys"
612
- assert_match %r{create_table "legacy_primary_keys", (?!id: :bigint, default: nil)}, schema
1261
+ schema = dump_table_schema "apples_bananas"
1262
+ assert_match %r{integer "apple_id", null: false}, schema
1263
+ assert_match %r{integer "banana_id", null: false}, schema
613
1264
  end
614
- else
615
- def test_legacy_bigint_primary_key_should_not_be_auto_incremented
1265
+
1266
+ def test_legacy_join_table_column_options_should_be_overwritten
616
1267
  @migration = Class.new(migration_class) {
617
1268
  def change
618
- create_table :legacy_primary_keys, id: :bigint do |t|
1269
+ create_join_table :apples, :bananas, column_options: { type: :bigint } do |t|
619
1270
  end
620
1271
  end
621
1272
  }.new
622
1273
 
623
1274
  @migration.migrate(:up)
624
1275
 
625
- assert_raises(ActiveRecord::NotNullViolation) do
626
- LegacyPrimaryKey.create!
627
- end
628
-
629
- schema = dump_table_schema "legacy_primary_keys"
630
- assert_match %r{create_table "legacy_primary_keys", id: :bigint, default: nil}, schema
1276
+ schema = dump_table_schema "apples_bananas"
1277
+ assert_match %r{bigint "apple_id", null: false}, schema
1278
+ assert_match %r{bigint "banana_id", null: false}, schema
631
1279
  end
632
- end
633
1280
 
634
- private
635
- def assert_legacy_primary_key
636
- assert_equal "id", LegacyPrimaryKey.primary_key
1281
+ if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
1282
+ def test_legacy_bigint_primary_key_should_be_auto_incremented
1283
+ @migration = Class.new(migration_class) {
1284
+ def change
1285
+ create_table :legacy_primary_keys, id: :bigint
1286
+ end
1287
+ }.new
1288
+
1289
+ @migration.migrate(:up)
1290
+
1291
+ legacy_pk = LegacyPrimaryKey.columns_hash["id"]
1292
+ assert_predicate legacy_pk, :bigint?
1293
+ assert_predicate legacy_pk, :auto_increment?
1294
+
1295
+ schema = dump_table_schema "legacy_primary_keys"
1296
+ assert_match %r{create_table "legacy_primary_keys", (?!id: :bigint, default: nil)}, schema
1297
+ end
1298
+ else
1299
+ def test_legacy_bigint_primary_key_should_not_be_auto_incremented
1300
+ skip "DB2 auto-generates bigint primary keys in legacy migrations" if current_adapter?(:IBM_DBAdapter)
637
1301
 
638
- legacy_pk = LegacyPrimaryKey.columns_hash["id"]
1302
+ @migration = Class.new(migration_class) {
1303
+ def change
1304
+ create_table :legacy_primary_keys, id: :bigint do |t|
1305
+ end
1306
+ end
1307
+ }.new
639
1308
 
640
- assert_equal :integer, legacy_pk.type
641
- assert_not_predicate legacy_pk, :bigint?
642
- assert_not legacy_pk.null
1309
+ @migration.migrate(:up)
1310
+
1311
+ assert_raises(ActiveRecord::NotNullViolation) do
1312
+ LegacyPrimaryKey.create!
1313
+ end
643
1314
 
644
- if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter)
645
1315
  schema = dump_table_schema "legacy_primary_keys"
646
- assert_match %r{create_table "legacy_primary_keys", id: :(?:integer|serial), (?!default: nil)}, schema
1316
+ assert_match %r{create_table "legacy_primary_keys", id: :bigint, default: nil}, schema
647
1317
  end
648
1318
  end
1319
+
1320
+ private
1321
+ def assert_legacy_primary_key
1322
+ assert_equal "id", LegacyPrimaryKey.primary_key
1323
+
1324
+ legacy_pk = LegacyPrimaryKey.columns_hash["id"]
1325
+
1326
+ assert_equal :integer, legacy_pk.type
1327
+ assert_not_predicate legacy_pk, :bigint?
1328
+ assert_not legacy_pk.null
1329
+
1330
+ if current_adapter?(:Mysql2Adapter, :TrilogyAdapter, :PostgreSQLAdapter)
1331
+ schema = dump_table_schema "legacy_primary_keys"
1332
+ assert_match %r{create_table "legacy_primary_keys", id: :(?:integer|serial), (?!default: nil)}, schema
1333
+ end
1334
+ end
1335
+ end
649
1336
  end
650
1337
 
651
1338
  module LegacyPrimaryKeyTest