activerecord 6.1.7 → 7.1.5

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 (311) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2030 -1020
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +18 -18
  5. data/lib/active_record/aggregations.rb +17 -14
  6. data/lib/active_record/association_relation.rb +1 -11
  7. data/lib/active_record/associations/association.rb +51 -19
  8. data/lib/active_record/associations/association_scope.rb +17 -12
  9. data/lib/active_record/associations/belongs_to_association.rb +28 -9
  10. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +10 -2
  11. data/lib/active_record/associations/builder/association.rb +11 -5
  12. data/lib/active_record/associations/builder/belongs_to.rb +40 -14
  13. data/lib/active_record/associations/builder/collection_association.rb +10 -3
  14. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -5
  15. data/lib/active_record/associations/builder/has_many.rb +3 -2
  16. data/lib/active_record/associations/builder/has_one.rb +2 -1
  17. data/lib/active_record/associations/builder/singular_association.rb +6 -2
  18. data/lib/active_record/associations/collection_association.rb +39 -35
  19. data/lib/active_record/associations/collection_proxy.rb +30 -15
  20. data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
  21. data/lib/active_record/associations/foreign_association.rb +10 -3
  22. data/lib/active_record/associations/has_many_association.rb +28 -18
  23. data/lib/active_record/associations/has_many_through_association.rb +12 -7
  24. data/lib/active_record/associations/has_one_association.rb +20 -10
  25. data/lib/active_record/associations/has_one_through_association.rb +1 -1
  26. data/lib/active_record/associations/join_dependency/join_association.rb +3 -2
  27. data/lib/active_record/associations/join_dependency.rb +28 -20
  28. data/lib/active_record/associations/preloader/association.rb +210 -52
  29. data/lib/active_record/associations/preloader/batch.rb +48 -0
  30. data/lib/active_record/associations/preloader/branch.rb +147 -0
  31. data/lib/active_record/associations/preloader/through_association.rb +50 -14
  32. data/lib/active_record/associations/preloader.rb +50 -121
  33. data/lib/active_record/associations/singular_association.rb +9 -3
  34. data/lib/active_record/associations/through_association.rb +25 -14
  35. data/lib/active_record/associations.rb +446 -306
  36. data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
  37. data/lib/active_record/attribute_assignment.rb +1 -3
  38. data/lib/active_record/attribute_methods/before_type_cast.rb +24 -2
  39. data/lib/active_record/attribute_methods/dirty.rb +73 -22
  40. data/lib/active_record/attribute_methods/primary_key.rb +78 -26
  41. data/lib/active_record/attribute_methods/query.rb +31 -19
  42. data/lib/active_record/attribute_methods/read.rb +27 -12
  43. data/lib/active_record/attribute_methods/serialization.rb +194 -37
  44. data/lib/active_record/attribute_methods/time_zone_conversion.rb +8 -3
  45. data/lib/active_record/attribute_methods/write.rb +12 -15
  46. data/lib/active_record/attribute_methods.rb +161 -40
  47. data/lib/active_record/attributes.rb +27 -38
  48. data/lib/active_record/autosave_association.rb +65 -31
  49. data/lib/active_record/base.rb +25 -2
  50. data/lib/active_record/callbacks.rb +18 -34
  51. data/lib/active_record/coders/column_serializer.rb +61 -0
  52. data/lib/active_record/coders/json.rb +1 -1
  53. data/lib/active_record/coders/yaml_column.rb +70 -46
  54. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +367 -0
  55. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +211 -0
  56. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +78 -0
  57. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +113 -597
  58. data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -17
  59. data/lib/active_record/connection_adapters/abstract/database_statements.rb +172 -50
  60. data/lib/active_record/connection_adapters/abstract/query_cache.rb +78 -27
  61. data/lib/active_record/connection_adapters/abstract/quoting.rb +87 -73
  62. data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
  63. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +21 -20
  64. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +186 -31
  65. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +14 -1
  66. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +367 -141
  67. data/lib/active_record/connection_adapters/abstract/transaction.rb +281 -59
  68. data/lib/active_record/connection_adapters/abstract_adapter.rb +631 -150
  69. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +317 -164
  70. data/lib/active_record/connection_adapters/column.rb +13 -0
  71. data/lib/active_record/connection_adapters/mysql/column.rb +1 -0
  72. data/lib/active_record/connection_adapters/mysql/database_statements.rb +25 -134
  73. data/lib/active_record/connection_adapters/mysql/quoting.rb +56 -25
  74. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +9 -0
  75. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +10 -1
  76. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +8 -2
  77. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +39 -14
  78. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +151 -0
  79. data/lib/active_record/connection_adapters/mysql2_adapter.rb +112 -55
  80. data/lib/active_record/connection_adapters/pool_config.rb +20 -11
  81. data/lib/active_record/connection_adapters/pool_manager.rb +19 -9
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +30 -1
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +89 -52
  84. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
  85. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +8 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +5 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +53 -14
  89. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -2
  90. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +12 -3
  91. data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +18 -6
  94. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  95. data/lib/active_record/connection_adapters/postgresql/quoting.rb +89 -56
  96. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +28 -0
  97. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +92 -2
  98. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +153 -3
  99. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +78 -0
  100. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +397 -75
  101. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -10
  102. data/lib/active_record/connection_adapters/postgresql_adapter.rb +508 -246
  103. data/lib/active_record/connection_adapters/schema_cache.rb +319 -90
  104. data/lib/active_record/connection_adapters/sqlite3/column.rb +49 -0
  105. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +72 -53
  106. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +37 -21
  107. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +7 -0
  108. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +43 -22
  109. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +296 -104
  110. data/lib/active_record/connection_adapters/statement_pool.rb +7 -0
  111. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +99 -0
  112. data/lib/active_record/connection_adapters/trilogy_adapter.rb +258 -0
  113. data/lib/active_record/connection_adapters.rb +9 -6
  114. data/lib/active_record/connection_handling.rb +108 -137
  115. data/lib/active_record/core.rb +242 -233
  116. data/lib/active_record/counter_cache.rb +52 -27
  117. data/lib/active_record/database_configurations/connection_url_resolver.rb +3 -2
  118. data/lib/active_record/database_configurations/database_config.rb +21 -12
  119. data/lib/active_record/database_configurations/hash_config.rb +88 -16
  120. data/lib/active_record/database_configurations/url_config.rb +18 -12
  121. data/lib/active_record/database_configurations.rb +95 -59
  122. data/lib/active_record/delegated_type.rb +66 -20
  123. data/lib/active_record/deprecator.rb +7 -0
  124. data/lib/active_record/destroy_association_async_job.rb +4 -2
  125. data/lib/active_record/disable_joins_association_relation.rb +39 -0
  126. data/lib/active_record/dynamic_matchers.rb +1 -1
  127. data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
  128. data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
  129. data/lib/active_record/encryption/cipher.rb +53 -0
  130. data/lib/active_record/encryption/config.rb +68 -0
  131. data/lib/active_record/encryption/configurable.rb +60 -0
  132. data/lib/active_record/encryption/context.rb +42 -0
  133. data/lib/active_record/encryption/contexts.rb +76 -0
  134. data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
  135. data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
  136. data/lib/active_record/encryption/encryptable_record.rb +230 -0
  137. data/lib/active_record/encryption/encrypted_attribute_type.rb +155 -0
  138. data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
  139. data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
  140. data/lib/active_record/encryption/encryptor.rb +155 -0
  141. data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
  142. data/lib/active_record/encryption/errors.rb +15 -0
  143. data/lib/active_record/encryption/extended_deterministic_queries.rb +157 -0
  144. data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
  145. data/lib/active_record/encryption/key.rb +28 -0
  146. data/lib/active_record/encryption/key_generator.rb +53 -0
  147. data/lib/active_record/encryption/key_provider.rb +46 -0
  148. data/lib/active_record/encryption/message.rb +33 -0
  149. data/lib/active_record/encryption/message_serializer.rb +92 -0
  150. data/lib/active_record/encryption/null_encryptor.rb +21 -0
  151. data/lib/active_record/encryption/properties.rb +76 -0
  152. data/lib/active_record/encryption/read_only_null_encryptor.rb +24 -0
  153. data/lib/active_record/encryption/scheme.rb +100 -0
  154. data/lib/active_record/encryption.rb +58 -0
  155. data/lib/active_record/enum.rb +154 -63
  156. data/lib/active_record/errors.rb +172 -15
  157. data/lib/active_record/explain.rb +23 -3
  158. data/lib/active_record/explain_registry.rb +11 -6
  159. data/lib/active_record/explain_subscriber.rb +1 -1
  160. data/lib/active_record/fixture_set/file.rb +15 -1
  161. data/lib/active_record/fixture_set/model_metadata.rb +14 -4
  162. data/lib/active_record/fixture_set/render_context.rb +2 -0
  163. data/lib/active_record/fixture_set/table_row.rb +70 -14
  164. data/lib/active_record/fixture_set/table_rows.rb +4 -4
  165. data/lib/active_record/fixtures.rb +147 -86
  166. data/lib/active_record/future_result.rb +174 -0
  167. data/lib/active_record/gem_version.rb +3 -3
  168. data/lib/active_record/inheritance.rb +81 -29
  169. data/lib/active_record/insert_all.rb +135 -22
  170. data/lib/active_record/integration.rb +11 -10
  171. data/lib/active_record/internal_metadata.rb +119 -33
  172. data/lib/active_record/legacy_yaml_adapter.rb +2 -39
  173. data/lib/active_record/locking/optimistic.rb +37 -22
  174. data/lib/active_record/locking/pessimistic.rb +15 -6
  175. data/lib/active_record/log_subscriber.rb +52 -19
  176. data/lib/active_record/marshalling.rb +59 -0
  177. data/lib/active_record/message_pack.rb +124 -0
  178. data/lib/active_record/middleware/database_selector/resolver.rb +10 -10
  179. data/lib/active_record/middleware/database_selector.rb +23 -13
  180. data/lib/active_record/middleware/shard_selector.rb +62 -0
  181. data/lib/active_record/migration/command_recorder.rb +112 -14
  182. data/lib/active_record/migration/compatibility.rb +233 -46
  183. data/lib/active_record/migration/default_strategy.rb +23 -0
  184. data/lib/active_record/migration/execution_strategy.rb +19 -0
  185. data/lib/active_record/migration/join_table.rb +1 -1
  186. data/lib/active_record/migration/pending_migration_connection.rb +21 -0
  187. data/lib/active_record/migration.rb +361 -173
  188. data/lib/active_record/model_schema.rb +125 -101
  189. data/lib/active_record/nested_attributes.rb +50 -20
  190. data/lib/active_record/no_touching.rb +3 -3
  191. data/lib/active_record/normalization.rb +167 -0
  192. data/lib/active_record/persistence.rb +409 -88
  193. data/lib/active_record/promise.rb +84 -0
  194. data/lib/active_record/query_cache.rb +4 -22
  195. data/lib/active_record/query_logs.rb +174 -0
  196. data/lib/active_record/query_logs_formatter.rb +41 -0
  197. data/lib/active_record/querying.rb +29 -6
  198. data/lib/active_record/railtie.rb +220 -44
  199. data/lib/active_record/railties/controller_runtime.rb +15 -10
  200. data/lib/active_record/railties/databases.rake +188 -252
  201. data/lib/active_record/railties/job_runtime.rb +23 -0
  202. data/lib/active_record/readonly_attributes.rb +41 -3
  203. data/lib/active_record/reflection.rb +248 -81
  204. data/lib/active_record/relation/batches/batch_enumerator.rb +23 -7
  205. data/lib/active_record/relation/batches.rb +192 -63
  206. data/lib/active_record/relation/calculations.rb +246 -90
  207. data/lib/active_record/relation/delegation.rb +28 -14
  208. data/lib/active_record/relation/finder_methods.rb +108 -51
  209. data/lib/active_record/relation/merger.rb +22 -13
  210. data/lib/active_record/relation/predicate_builder/association_query_value.rb +31 -3
  211. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +10 -7
  212. data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
  213. data/lib/active_record/relation/predicate_builder.rb +27 -20
  214. data/lib/active_record/relation/query_attribute.rb +30 -12
  215. data/lib/active_record/relation/query_methods.rb +670 -129
  216. data/lib/active_record/relation/record_fetch_warning.rb +7 -9
  217. data/lib/active_record/relation/spawn_methods.rb +20 -3
  218. data/lib/active_record/relation/where_clause.rb +10 -19
  219. data/lib/active_record/relation.rb +287 -120
  220. data/lib/active_record/result.rb +37 -11
  221. data/lib/active_record/runtime_registry.rb +32 -13
  222. data/lib/active_record/sanitization.rb +65 -20
  223. data/lib/active_record/schema.rb +36 -22
  224. data/lib/active_record/schema_dumper.rb +73 -24
  225. data/lib/active_record/schema_migration.rb +68 -33
  226. data/lib/active_record/scoping/default.rb +72 -15
  227. data/lib/active_record/scoping/named.rb +5 -13
  228. data/lib/active_record/scoping.rb +65 -34
  229. data/lib/active_record/secure_password.rb +60 -0
  230. data/lib/active_record/secure_token.rb +21 -3
  231. data/lib/active_record/serialization.rb +6 -1
  232. data/lib/active_record/signed_id.rb +10 -8
  233. data/lib/active_record/store.rb +10 -10
  234. data/lib/active_record/suppressor.rb +13 -15
  235. data/lib/active_record/table_metadata.rb +16 -3
  236. data/lib/active_record/tasks/database_tasks.rb +251 -140
  237. data/lib/active_record/tasks/mysql_database_tasks.rb +16 -7
  238. data/lib/active_record/tasks/postgresql_database_tasks.rb +35 -26
  239. data/lib/active_record/tasks/sqlite_database_tasks.rb +15 -7
  240. data/lib/active_record/test_databases.rb +1 -1
  241. data/lib/active_record/test_fixtures.rb +117 -96
  242. data/lib/active_record/timestamp.rb +32 -19
  243. data/lib/active_record/token_for.rb +113 -0
  244. data/lib/active_record/touch_later.rb +11 -6
  245. data/lib/active_record/transactions.rb +48 -27
  246. data/lib/active_record/translation.rb +3 -3
  247. data/lib/active_record/type/adapter_specific_registry.rb +32 -14
  248. data/lib/active_record/type/hash_lookup_type_map.rb +34 -1
  249. data/lib/active_record/type/internal/timezone.rb +7 -2
  250. data/lib/active_record/type/serialized.rb +9 -5
  251. data/lib/active_record/type/time.rb +4 -0
  252. data/lib/active_record/type/type_map.rb +17 -20
  253. data/lib/active_record/type.rb +1 -2
  254. data/lib/active_record/validations/absence.rb +1 -1
  255. data/lib/active_record/validations/associated.rb +4 -4
  256. data/lib/active_record/validations/numericality.rb +5 -4
  257. data/lib/active_record/validations/presence.rb +5 -28
  258. data/lib/active_record/validations/uniqueness.rb +51 -6
  259. data/lib/active_record/validations.rb +8 -4
  260. data/lib/active_record/version.rb +1 -1
  261. data/lib/active_record.rb +335 -32
  262. data/lib/arel/attributes/attribute.rb +0 -8
  263. data/lib/arel/crud.rb +28 -22
  264. data/lib/arel/delete_manager.rb +18 -4
  265. data/lib/arel/errors.rb +10 -0
  266. data/lib/arel/factory_methods.rb +4 -0
  267. data/lib/arel/filter_predications.rb +9 -0
  268. data/lib/arel/insert_manager.rb +2 -3
  269. data/lib/arel/nodes/and.rb +4 -0
  270. data/lib/arel/nodes/binary.rb +6 -1
  271. data/lib/arel/nodes/bound_sql_literal.rb +61 -0
  272. data/lib/arel/nodes/casted.rb +1 -1
  273. data/lib/arel/nodes/cte.rb +36 -0
  274. data/lib/arel/nodes/delete_statement.rb +12 -13
  275. data/lib/arel/nodes/filter.rb +10 -0
  276. data/lib/arel/nodes/fragments.rb +35 -0
  277. data/lib/arel/nodes/function.rb +1 -0
  278. data/lib/arel/nodes/homogeneous_in.rb +1 -9
  279. data/lib/arel/nodes/insert_statement.rb +2 -2
  280. data/lib/arel/nodes/leading_join.rb +8 -0
  281. data/lib/arel/nodes/node.rb +111 -2
  282. data/lib/arel/nodes/select_core.rb +2 -2
  283. data/lib/arel/nodes/select_statement.rb +2 -2
  284. data/lib/arel/nodes/sql_literal.rb +6 -0
  285. data/lib/arel/nodes/table_alias.rb +4 -0
  286. data/lib/arel/nodes/update_statement.rb +8 -3
  287. data/lib/arel/nodes.rb +5 -0
  288. data/lib/arel/predications.rb +13 -3
  289. data/lib/arel/select_manager.rb +10 -4
  290. data/lib/arel/table.rb +9 -6
  291. data/lib/arel/tree_manager.rb +5 -13
  292. data/lib/arel/update_manager.rb +18 -4
  293. data/lib/arel/visitors/dot.rb +80 -90
  294. data/lib/arel/visitors/mysql.rb +16 -3
  295. data/lib/arel/visitors/postgresql.rb +0 -10
  296. data/lib/arel/visitors/to_sql.rb +141 -20
  297. data/lib/arel/visitors/visitor.rb +2 -2
  298. data/lib/arel.rb +18 -3
  299. data/lib/rails/generators/active_record/application_record/USAGE +8 -0
  300. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
  301. data/lib/rails/generators/active_record/migration.rb +3 -1
  302. data/lib/rails/generators/active_record/model/USAGE +113 -0
  303. data/lib/rails/generators/active_record/model/model_generator.rb +15 -6
  304. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +1 -1
  305. data/lib/rails/generators/active_record/model/templates/model.rb.tt +1 -1
  306. data/lib/rails/generators/active_record/model/templates/module.rb.tt +2 -2
  307. data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
  308. data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
  309. metadata +96 -16
  310. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +0 -35
  311. data/lib/active_record/null_relation.rb +0 -67
@@ -13,45 +13,234 @@ module ActiveRecord
13
13
  const_get(name)
14
14
  end
15
15
 
16
- V6_1 = Current
16
+ # This file exists to ensure that old migrations run the same way they did before a Rails upgrade.
17
+ # e.g. if you write a migration on Rails 6.1, then upgrade to Rails 7, the migration should do the same thing to your
18
+ # database as it did when you were running Rails 6.1
19
+ #
20
+ # "Current" is an alias for `ActiveRecord::Migration`, it represents the current Rails version.
21
+ # New migration functionality that will never be backward compatible should be added directly to `ActiveRecord::Migration`.
22
+ #
23
+ # There are classes for each prior Rails version. Each class descends from the *next* Rails version, so:
24
+ # 7.0 < 7.1
25
+ # 5.2 < 6.0 < 6.1 < 7.0 < 7.1
26
+ #
27
+ # If you are introducing new migration functionality that should only apply from Rails 7 onward, then you should
28
+ # find the class that immediately precedes it (6.1), and override the relevant migration methods to undo your changes.
29
+ #
30
+ # For example, Rails 6 added a default value for the `precision` option on datetime columns. So in this file, the `V5_2`
31
+ # class sets the value of `precision` to `nil` if it's not explicitly provided. This way, the default value will not apply
32
+ # for migrations written for 5.2, but will for migrations written for 6.0.
33
+ V7_1 = Current
34
+
35
+ class V7_0 < V7_1
36
+ module LegacyIndexName
37
+ private
38
+ def legacy_index_name(table_name, options)
39
+ if Hash === options
40
+ if options[:column]
41
+ "index_#{table_name}_on_#{Array(options[:column]) * '_and_'}"
42
+ elsif options[:name]
43
+ options[:name]
44
+ else
45
+ raise ArgumentError, "You must specify the index name"
46
+ end
47
+ else
48
+ legacy_index_name(table_name, index_name_options(options))
49
+ end
50
+ end
17
51
 
18
- class V6_0 < V6_1
19
- class ReferenceDefinition < ConnectionAdapters::ReferenceDefinition
20
- def index_options(table_name)
21
- as_options(index)
22
- end
52
+ def index_name_options(column_names)
53
+ if expression_column_name?(column_names)
54
+ column_names = column_names.scan(/\w+/).join("_")
55
+ end
56
+
57
+ { column: column_names }
58
+ end
59
+
60
+ def expression_column_name?(column_name)
61
+ column_name.is_a?(String) && /\W/.match?(column_name)
62
+ end
23
63
  end
24
64
 
25
65
  module TableDefinition
66
+ include LegacyIndexName
67
+
68
+ def column(name, type, **options)
69
+ options[:_skip_validate_options] = true
70
+ super
71
+ end
72
+
73
+ def change(name, type, **options)
74
+ options[:_skip_validate_options] = true
75
+ super
76
+ end
77
+
78
+ def index(column_name, **options)
79
+ options[:name] = legacy_index_name(name, column_name) if options[:name].nil?
80
+ super
81
+ end
82
+
26
83
  def references(*args, **options)
27
- options[:_uses_legacy_reference_index_name] = true
84
+ options[:_skip_validate_options] = true
28
85
  super
29
86
  end
30
- alias :belongs_to :references
87
+
88
+ private
89
+ def raise_on_if_exist_options(options)
90
+ end
91
+ end
92
+
93
+ include LegacyIndexName
94
+
95
+ def add_column(table_name, column_name, type, **options)
96
+ options[:_skip_validate_options] = true
97
+ super
98
+ end
99
+
100
+ def add_index(table_name, column_name, **options)
101
+ options[:name] = legacy_index_name(table_name, column_name) if options[:name].nil?
102
+ super
31
103
  end
32
104
 
105
+ def add_reference(table_name, ref_name, **options)
106
+ options[:_skip_validate_options] = true
107
+ super
108
+ end
109
+ alias :add_belongs_to :add_reference
110
+
33
111
  def create_table(table_name, **options)
34
- if block_given?
35
- super { |t| yield compatible_table_definition(t) }
36
- else
112
+ options[:_uses_legacy_table_name] = true
113
+ options[:_skip_validate_options] = true
114
+
115
+ super
116
+ end
117
+
118
+ def rename_table(table_name, new_name, **options)
119
+ options[:_uses_legacy_table_name] = true
120
+ options[:_uses_legacy_index_name] = true
121
+ super
122
+ end
123
+
124
+ def change_column(table_name, column_name, type, **options)
125
+ options[:_skip_validate_options] = true
126
+ if connection.adapter_name == "Mysql2" || connection.adapter_name == "Trilogy"
127
+ options[:collation] ||= :no_collation
128
+ end
129
+ super
130
+ end
131
+
132
+ def change_column_null(table_name, column_name, null, default = nil)
133
+ super(table_name, column_name, !!null, default)
134
+ end
135
+
136
+ def disable_extension(name, **options)
137
+ if connection.adapter_name == "PostgreSQL"
138
+ options[:force] = :cascade
139
+ end
140
+ super
141
+ end
142
+
143
+ def add_foreign_key(from_table, to_table, **options)
144
+ if connection.adapter_name == "PostgreSQL" && options[:deferrable] == true
145
+ options[:deferrable] = :immediate
146
+ end
147
+ super
148
+ end
149
+
150
+ private
151
+ def compatible_table_definition(t)
152
+ class << t
153
+ prepend TableDefinition
154
+ end
37
155
  super
38
156
  end
157
+ end
158
+
159
+ class V6_1 < V7_0
160
+ class PostgreSQLCompat
161
+ def self.compatible_timestamp_type(type, connection)
162
+ if connection.adapter_name == "PostgreSQL"
163
+ # For Rails <= 6.1, :datetime was aliased to :timestamp
164
+ # See: https://github.com/rails/rails/blob/v6.1.3.2/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L108
165
+ # From Rails 7 onwards, you can define what :datetime resolves to (the default is still :timestamp)
166
+ # See `ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type`
167
+ type.to_sym == :datetime ? :timestamp : type
168
+ else
169
+ type
170
+ end
171
+ end
39
172
  end
40
173
 
41
- def change_table(table_name, **options)
42
- if block_given?
43
- super { |t| yield compatible_table_definition(t) }
44
- else
174
+ def add_column(table_name, column_name, type, **options)
175
+ if type == :datetime
176
+ options[:precision] ||= nil
177
+ end
178
+
179
+ type = PostgreSQLCompat.compatible_timestamp_type(type, connection)
180
+ super
181
+ end
182
+
183
+ def change_column(table_name, column_name, type, **options)
184
+ if type == :datetime
185
+ options[:precision] ||= nil
186
+ end
187
+
188
+ type = PostgreSQLCompat.compatible_timestamp_type(type, connection)
189
+ super
190
+ end
191
+
192
+ module TableDefinition
193
+ def new_column_definition(name, type, **options)
194
+ type = PostgreSQLCompat.compatible_timestamp_type(type, @conn)
195
+ super
196
+ end
197
+
198
+ def change(name, type, index: nil, **options)
199
+ options[:precision] ||= nil
45
200
  super
46
201
  end
202
+
203
+ def column(name, type, index: nil, **options)
204
+ options[:precision] ||= nil
205
+ super
206
+ end
207
+
208
+ private
209
+ def raise_on_if_exist_options(options)
210
+ end
47
211
  end
48
212
 
49
- def create_join_table(table_1, table_2, **options)
50
- if block_given?
51
- super { |t| yield compatible_table_definition(t) }
52
- else
213
+ private
214
+ def compatible_table_definition(t)
215
+ class << t
216
+ prepend TableDefinition
217
+ end
218
+ super
219
+ end
220
+ end
221
+
222
+ class V6_0 < V6_1
223
+ class ReferenceDefinition < ConnectionAdapters::ReferenceDefinition
224
+ def index_options(table_name)
225
+ as_options(index)
226
+ end
227
+ end
228
+
229
+ module TableDefinition
230
+ def references(*args, **options)
231
+ options[:_uses_legacy_reference_index_name] = true
232
+ super
233
+ end
234
+ alias :belongs_to :references
235
+
236
+ def column(name, type, index: nil, **options)
237
+ options[:precision] ||= nil
53
238
  super
54
239
  end
240
+
241
+ private
242
+ def raise_on_if_exist_options(options)
243
+ end
55
244
  end
56
245
 
57
246
  def add_reference(table_name, ref_name, **options)
@@ -69,7 +258,7 @@ module ActiveRecord
69
258
  class << t
70
259
  prepend TableDefinition
71
260
  end
72
- t
261
+ super
73
262
  end
74
263
  end
75
264
 
@@ -79,6 +268,18 @@ module ActiveRecord
79
268
  options[:precision] ||= nil
80
269
  super
81
270
  end
271
+
272
+ def column(name, type, index: nil, **options)
273
+ options[:precision] ||= nil
274
+ super
275
+ end
276
+
277
+ private
278
+ def raise_on_if_exist_options(options)
279
+ end
280
+
281
+ def raise_on_duplicate_column(name)
282
+ end
82
283
  end
83
284
 
84
285
  module CommandRecorder
@@ -95,30 +296,6 @@ module ActiveRecord
95
296
  end
96
297
  end
97
298
 
98
- def create_table(table_name, **options)
99
- if block_given?
100
- super { |t| yield compatible_table_definition(t) }
101
- else
102
- super
103
- end
104
- end
105
-
106
- def change_table(table_name, **options)
107
- if block_given?
108
- super { |t| yield compatible_table_definition(t) }
109
- else
110
- super
111
- end
112
- end
113
-
114
- def create_join_table(table_1, table_2, **options)
115
- if block_given?
116
- super { |t| yield compatible_table_definition(t) }
117
- else
118
- super
119
- end
120
- end
121
-
122
299
  def add_timestamps(table_name, **options)
123
300
  options[:precision] ||= nil
124
301
  super
@@ -154,7 +331,7 @@ module ActiveRecord
154
331
  end
155
332
 
156
333
  def create_table(table_name, **options)
157
- if connection.adapter_name == "Mysql2"
334
+ if connection.adapter_name == "Mysql2" || connection.adapter_name == "Trilogy"
158
335
  super(table_name, options: "ENGINE=InnoDB", **options)
159
336
  else
160
337
  super
@@ -173,6 +350,10 @@ module ActiveRecord
173
350
  super(*args, type: :integer, **options)
174
351
  end
175
352
  alias :belongs_to :references
353
+
354
+ private
355
+ def raise_on_if_exist_options(options)
356
+ end
176
357
  end
177
358
 
178
359
  def create_table(table_name, **options)
@@ -182,7 +363,7 @@ module ActiveRecord
182
363
  end
183
364
  end
184
365
 
185
- unless connection.adapter_name == "Mysql2" && options[:id] == :bigint
366
+ unless ["Mysql2", "Trilogy"].include?(connection.adapter_name) && options[:id] == :bigint
186
367
  if [:integer, :bigint].include?(options[:id]) && !options.key?(:default)
187
368
  options[:default] = nil
188
369
  end
@@ -207,6 +388,8 @@ module ActiveRecord
207
388
  if type == :primary_key
208
389
  type = :integer
209
390
  options[:primary_key] = true
391
+ elsif type == :datetime
392
+ options[:precision] ||= nil
210
393
  end
211
394
  super
212
395
  end
@@ -237,6 +420,10 @@ module ActiveRecord
237
420
  options[:null] = true if options[:null].nil?
238
421
  super
239
422
  end
423
+
424
+ private
425
+ def raise_on_if_exist_options(options)
426
+ end
240
427
  end
241
428
 
242
429
  def add_reference(table_name, ref_name, **options)
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ # The default strategy for executing migrations. Delegates method calls
6
+ # to the connection adapter.
7
+ class DefaultStrategy < ExecutionStrategy # :nodoc:
8
+ private
9
+ def method_missing(method, *arguments, &block)
10
+ connection.send(method, *arguments, &block)
11
+ end
12
+ ruby2_keywords(:method_missing)
13
+
14
+ def respond_to_missing?(method, *)
15
+ connection.respond_to?(method) || super
16
+ end
17
+
18
+ def connection
19
+ migration.connection
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ # ExecutionStrategy is used by the migration to respond to any method calls
6
+ # that the migration class does not implement directly. This is the base strategy.
7
+ # All strategies should inherit from this class.
8
+ #
9
+ # The ExecutionStrategy receives the current +migration+ when initialized.
10
+ class ExecutionStrategy # :nodoc:
11
+ def initialize(migration)
12
+ @migration = migration
13
+ end
14
+
15
+ private
16
+ attr_reader :migration
17
+ end
18
+ end
19
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ActiveRecord
4
4
  class Migration
5
- module JoinTable #:nodoc:
5
+ module JoinTable # :nodoc:
6
6
  private
7
7
  def find_join_table_name(table_1, table_2, options = {})
8
8
  options.delete(:table_name) || join_table_name(table_1, table_2)
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ class PendingMigrationConnection # :nodoc:
5
+ def self.establish_temporary_connection(db_config, &block)
6
+ pool = ActiveRecord::Base.connection_handler.establish_connection(db_config, owner_name: self)
7
+
8
+ yield pool.connection
9
+ ensure
10
+ ActiveRecord::Base.connection_handler.remove_connection_pool(self.name)
11
+ end
12
+
13
+ def self.primary_class?
14
+ false
15
+ end
16
+
17
+ def self.current_preventing_writes
18
+ false
19
+ end
20
+ end
21
+ end