activerecord 7.0.0 → 7.2.1

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 (289) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +515 -1268
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +31 -31
  5. data/examples/performance.rb +2 -2
  6. data/lib/active_record/aggregations.rb +16 -13
  7. data/lib/active_record/association_relation.rb +2 -2
  8. data/lib/active_record/associations/alias_tracker.rb +25 -19
  9. data/lib/active_record/associations/association.rb +35 -12
  10. data/lib/active_record/associations/association_scope.rb +16 -9
  11. data/lib/active_record/associations/belongs_to_association.rb +23 -8
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +3 -2
  13. data/lib/active_record/associations/builder/association.rb +3 -3
  14. data/lib/active_record/associations/builder/belongs_to.rb +22 -8
  15. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -7
  16. data/lib/active_record/associations/builder/has_many.rb +3 -4
  17. data/lib/active_record/associations/builder/has_one.rb +3 -4
  18. data/lib/active_record/associations/builder/singular_association.rb +4 -0
  19. data/lib/active_record/associations/collection_association.rb +28 -17
  20. data/lib/active_record/associations/collection_proxy.rb +36 -13
  21. data/lib/active_record/associations/errors.rb +265 -0
  22. data/lib/active_record/associations/foreign_association.rb +10 -3
  23. data/lib/active_record/associations/has_many_association.rb +28 -18
  24. data/lib/active_record/associations/has_many_through_association.rb +10 -6
  25. data/lib/active_record/associations/has_one_association.rb +10 -3
  26. data/lib/active_record/associations/join_dependency/join_association.rb +27 -25
  27. data/lib/active_record/associations/join_dependency.rb +18 -14
  28. data/lib/active_record/associations/nested_error.rb +47 -0
  29. data/lib/active_record/associations/preloader/association.rb +33 -8
  30. data/lib/active_record/associations/preloader/branch.rb +7 -1
  31. data/lib/active_record/associations/preloader/through_association.rb +2 -4
  32. data/lib/active_record/associations/preloader.rb +13 -10
  33. data/lib/active_record/associations/singular_association.rb +7 -1
  34. data/lib/active_record/associations/through_association.rb +22 -11
  35. data/lib/active_record/associations.rb +378 -491
  36. data/lib/active_record/attribute_assignment.rb +1 -13
  37. data/lib/active_record/attribute_methods/before_type_cast.rb +17 -0
  38. data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
  39. data/lib/active_record/attribute_methods/dirty.rb +53 -35
  40. data/lib/active_record/attribute_methods/primary_key.rb +45 -25
  41. data/lib/active_record/attribute_methods/query.rb +28 -16
  42. data/lib/active_record/attribute_methods/read.rb +8 -7
  43. data/lib/active_record/attribute_methods/serialization.rb +153 -70
  44. data/lib/active_record/attribute_methods/time_zone_conversion.rb +7 -6
  45. data/lib/active_record/attribute_methods/write.rb +6 -6
  46. data/lib/active_record/attribute_methods.rb +153 -40
  47. data/lib/active_record/attributes.rb +63 -48
  48. data/lib/active_record/autosave_association.rb +70 -38
  49. data/lib/active_record/base.rb +12 -8
  50. data/lib/active_record/callbacks.rb +16 -32
  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 -34
  54. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +124 -132
  55. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +2 -0
  56. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +4 -1
  57. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +297 -88
  58. data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -0
  59. data/lib/active_record/connection_adapters/abstract/database_statements.rb +160 -45
  60. data/lib/active_record/connection_adapters/abstract/query_cache.rb +215 -63
  61. data/lib/active_record/connection_adapters/abstract/quoting.rb +83 -65
  62. data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
  63. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +18 -4
  64. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +163 -29
  65. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +14 -1
  66. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +319 -135
  67. data/lib/active_record/connection_adapters/abstract/transaction.rb +367 -75
  68. data/lib/active_record/connection_adapters/abstract_adapter.rb +512 -126
  69. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +282 -119
  70. data/lib/active_record/connection_adapters/column.rb +9 -0
  71. data/lib/active_record/connection_adapters/mysql/column.rb +1 -0
  72. data/lib/active_record/connection_adapters/mysql/database_statements.rb +27 -140
  73. data/lib/active_record/connection_adapters/mysql/quoting.rb +64 -52
  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 +45 -14
  78. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +152 -0
  79. data/lib/active_record/connection_adapters/mysql2_adapter.rb +101 -68
  80. data/lib/active_record/connection_adapters/pool_config.rb +20 -10
  81. data/lib/active_record/connection_adapters/pool_manager.rb +19 -9
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +16 -3
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +101 -48
  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/hstore.rb +2 -2
  87. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +1 -1
  88. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +11 -2
  90. data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +4 -2
  91. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +14 -4
  92. data/lib/active_record/connection_adapters/postgresql/quoting.rb +94 -61
  93. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +6 -10
  94. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -6
  95. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +151 -2
  96. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +53 -0
  97. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +379 -66
  98. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -10
  99. data/lib/active_record/connection_adapters/postgresql_adapter.rb +370 -203
  100. data/lib/active_record/connection_adapters/schema_cache.rb +302 -79
  101. data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
  102. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +60 -43
  103. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +61 -46
  104. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
  105. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +20 -0
  106. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +16 -0
  107. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +64 -22
  108. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +321 -110
  109. data/lib/active_record/connection_adapters/statement_pool.rb +7 -0
  110. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +99 -0
  111. data/lib/active_record/connection_adapters/trilogy_adapter.rb +229 -0
  112. data/lib/active_record/connection_adapters.rb +124 -1
  113. data/lib/active_record/connection_handling.rb +98 -106
  114. data/lib/active_record/core.rb +220 -177
  115. data/lib/active_record/counter_cache.rb +68 -34
  116. data/lib/active_record/database_configurations/connection_url_resolver.rb +8 -2
  117. data/lib/active_record/database_configurations/database_config.rb +26 -5
  118. data/lib/active_record/database_configurations/hash_config.rb +52 -34
  119. data/lib/active_record/database_configurations/url_config.rb +37 -12
  120. data/lib/active_record/database_configurations.rb +88 -35
  121. data/lib/active_record/delegated_type.rb +40 -11
  122. data/lib/active_record/deprecator.rb +7 -0
  123. data/lib/active_record/destroy_association_async_job.rb +3 -1
  124. data/lib/active_record/disable_joins_association_relation.rb +1 -1
  125. data/lib/active_record/dynamic_matchers.rb +2 -2
  126. data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
  127. data/lib/active_record/encryption/cipher/aes256_gcm.rb +4 -1
  128. data/lib/active_record/encryption/config.rb +25 -1
  129. data/lib/active_record/encryption/configurable.rb +13 -14
  130. data/lib/active_record/encryption/context.rb +10 -3
  131. data/lib/active_record/encryption/contexts.rb +8 -4
  132. data/lib/active_record/encryption/derived_secret_key_provider.rb +9 -3
  133. data/lib/active_record/encryption/deterministic_key_provider.rb +1 -1
  134. data/lib/active_record/encryption/encryptable_record.rb +47 -25
  135. data/lib/active_record/encryption/encrypted_attribute_type.rb +49 -14
  136. data/lib/active_record/encryption/encryptor.rb +25 -10
  137. data/lib/active_record/encryption/envelope_encryption_key_provider.rb +3 -3
  138. data/lib/active_record/encryption/extended_deterministic_queries.rb +83 -86
  139. data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +3 -3
  140. data/lib/active_record/encryption/key_generator.rb +12 -1
  141. data/lib/active_record/encryption/message.rb +1 -1
  142. data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
  143. data/lib/active_record/encryption/message_serializer.rb +6 -0
  144. data/lib/active_record/encryption/null_encryptor.rb +4 -0
  145. data/lib/active_record/encryption/properties.rb +4 -4
  146. data/lib/active_record/encryption/read_only_null_encryptor.rb +4 -0
  147. data/lib/active_record/encryption/scheme.rb +23 -22
  148. data/lib/active_record/encryption.rb +1 -0
  149. data/lib/active_record/enum.rb +131 -27
  150. data/lib/active_record/errors.rb +151 -31
  151. data/lib/active_record/explain.rb +21 -12
  152. data/lib/active_record/explain_subscriber.rb +1 -1
  153. data/lib/active_record/fixture_set/model_metadata.rb +14 -4
  154. data/lib/active_record/fixture_set/render_context.rb +2 -0
  155. data/lib/active_record/fixture_set/table_row.rb +29 -8
  156. data/lib/active_record/fixtures.rb +169 -99
  157. data/lib/active_record/future_result.rb +47 -8
  158. data/lib/active_record/gem_version.rb +3 -3
  159. data/lib/active_record/inheritance.rb +34 -18
  160. data/lib/active_record/insert_all.rb +72 -22
  161. data/lib/active_record/integration.rb +13 -10
  162. data/lib/active_record/internal_metadata.rb +124 -20
  163. data/lib/active_record/locking/optimistic.rb +39 -24
  164. data/lib/active_record/locking/pessimistic.rb +8 -5
  165. data/lib/active_record/log_subscriber.rb +28 -27
  166. data/lib/active_record/marshalling.rb +56 -0
  167. data/lib/active_record/message_pack.rb +124 -0
  168. data/lib/active_record/middleware/database_selector/resolver.rb +4 -0
  169. data/lib/active_record/middleware/database_selector.rb +18 -13
  170. data/lib/active_record/middleware/shard_selector.rb +7 -5
  171. data/lib/active_record/migration/command_recorder.rb +110 -13
  172. data/lib/active_record/migration/compatibility.rb +174 -64
  173. data/lib/active_record/migration/default_strategy.rb +22 -0
  174. data/lib/active_record/migration/execution_strategy.rb +19 -0
  175. data/lib/active_record/migration/pending_migration_connection.rb +21 -0
  176. data/lib/active_record/migration.rb +292 -125
  177. data/lib/active_record/model_schema.rb +113 -112
  178. data/lib/active_record/nested_attributes.rb +35 -9
  179. data/lib/active_record/normalization.rb +163 -0
  180. data/lib/active_record/persistence.rb +177 -345
  181. data/lib/active_record/promise.rb +84 -0
  182. data/lib/active_record/query_cache.rb +19 -25
  183. data/lib/active_record/query_logs.rb +102 -51
  184. data/lib/active_record/query_logs_formatter.rb +41 -0
  185. data/lib/active_record/querying.rb +34 -9
  186. data/lib/active_record/railtie.rb +153 -100
  187. data/lib/active_record/railties/controller_runtime.rb +24 -10
  188. data/lib/active_record/railties/databases.rake +148 -152
  189. data/lib/active_record/railties/job_runtime.rb +23 -0
  190. data/lib/active_record/readonly_attributes.rb +32 -5
  191. data/lib/active_record/reflection.rb +278 -69
  192. data/lib/active_record/relation/batches/batch_enumerator.rb +20 -5
  193. data/lib/active_record/relation/batches.rb +198 -63
  194. data/lib/active_record/relation/calculations.rb +293 -108
  195. data/lib/active_record/relation/delegation.rb +31 -20
  196. data/lib/active_record/relation/finder_methods.rb +93 -18
  197. data/lib/active_record/relation/merger.rb +6 -6
  198. data/lib/active_record/relation/predicate_builder/array_handler.rb +2 -2
  199. data/lib/active_record/relation/predicate_builder/association_query_value.rb +38 -4
  200. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +10 -7
  201. data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
  202. data/lib/active_record/relation/predicate_builder.rb +28 -16
  203. data/lib/active_record/relation/query_attribute.rb +25 -1
  204. data/lib/active_record/relation/query_methods.rb +625 -107
  205. data/lib/active_record/relation/record_fetch_warning.rb +3 -0
  206. data/lib/active_record/relation/spawn_methods.rb +5 -4
  207. data/lib/active_record/relation/where_clause.rb +7 -19
  208. data/lib/active_record/relation.rb +602 -96
  209. data/lib/active_record/result.rb +55 -52
  210. data/lib/active_record/runtime_registry.rb +63 -1
  211. data/lib/active_record/sanitization.rb +76 -30
  212. data/lib/active_record/schema.rb +39 -23
  213. data/lib/active_record/schema_dumper.rb +82 -30
  214. data/lib/active_record/schema_migration.rb +75 -24
  215. data/lib/active_record/scoping/default.rb +20 -12
  216. data/lib/active_record/scoping/named.rb +3 -2
  217. data/lib/active_record/scoping.rb +2 -1
  218. data/lib/active_record/secure_password.rb +60 -0
  219. data/lib/active_record/secure_token.rb +21 -3
  220. data/lib/active_record/serialization.rb +5 -0
  221. data/lib/active_record/signed_id.rb +29 -8
  222. data/lib/active_record/statement_cache.rb +7 -7
  223. data/lib/active_record/store.rb +16 -11
  224. data/lib/active_record/suppressor.rb +3 -1
  225. data/lib/active_record/table_metadata.rb +7 -3
  226. data/lib/active_record/tasks/database_tasks.rb +191 -121
  227. data/lib/active_record/tasks/mysql_database_tasks.rb +15 -6
  228. data/lib/active_record/tasks/postgresql_database_tasks.rb +17 -15
  229. data/lib/active_record/tasks/sqlite_database_tasks.rb +16 -7
  230. data/lib/active_record/test_fixtures.rb +174 -152
  231. data/lib/active_record/testing/query_assertions.rb +121 -0
  232. data/lib/active_record/timestamp.rb +31 -17
  233. data/lib/active_record/token_for.rb +123 -0
  234. data/lib/active_record/touch_later.rb +12 -7
  235. data/lib/active_record/transaction.rb +132 -0
  236. data/lib/active_record/transactions.rb +109 -27
  237. data/lib/active_record/translation.rb +1 -3
  238. data/lib/active_record/type/adapter_specific_registry.rb +1 -8
  239. data/lib/active_record/type/internal/timezone.rb +7 -2
  240. data/lib/active_record/type/serialized.rb +9 -7
  241. data/lib/active_record/type/time.rb +4 -0
  242. data/lib/active_record/type_caster/connection.rb +4 -4
  243. data/lib/active_record/validations/absence.rb +1 -1
  244. data/lib/active_record/validations/associated.rb +12 -6
  245. data/lib/active_record/validations/numericality.rb +5 -4
  246. data/lib/active_record/validations/presence.rb +5 -28
  247. data/lib/active_record/validations/uniqueness.rb +63 -14
  248. data/lib/active_record/validations.rb +12 -5
  249. data/lib/active_record/version.rb +1 -1
  250. data/lib/active_record.rb +266 -30
  251. data/lib/arel/alias_predication.rb +1 -1
  252. data/lib/arel/collectors/bind.rb +2 -0
  253. data/lib/arel/collectors/composite.rb +7 -0
  254. data/lib/arel/collectors/sql_string.rb +1 -1
  255. data/lib/arel/collectors/substitute_binds.rb +1 -1
  256. data/lib/arel/errors.rb +10 -0
  257. data/lib/arel/factory_methods.rb +4 -0
  258. data/lib/arel/filter_predications.rb +1 -1
  259. data/lib/arel/nodes/binary.rb +6 -7
  260. data/lib/arel/nodes/bound_sql_literal.rb +65 -0
  261. data/lib/arel/nodes/cte.rb +36 -0
  262. data/lib/arel/nodes/filter.rb +1 -1
  263. data/lib/arel/nodes/fragments.rb +35 -0
  264. data/lib/arel/nodes/homogeneous_in.rb +1 -9
  265. data/lib/arel/nodes/leading_join.rb +8 -0
  266. data/lib/arel/nodes/{and.rb → nary.rb} +9 -2
  267. data/lib/arel/nodes/node.rb +115 -5
  268. data/lib/arel/nodes/sql_literal.rb +13 -0
  269. data/lib/arel/nodes/table_alias.rb +4 -0
  270. data/lib/arel/nodes.rb +6 -2
  271. data/lib/arel/predications.rb +3 -1
  272. data/lib/arel/select_manager.rb +1 -1
  273. data/lib/arel/table.rb +9 -5
  274. data/lib/arel/tree_manager.rb +8 -3
  275. data/lib/arel/update_manager.rb +2 -1
  276. data/lib/arel/visitors/dot.rb +1 -0
  277. data/lib/arel/visitors/mysql.rb +17 -5
  278. data/lib/arel/visitors/postgresql.rb +1 -12
  279. data/lib/arel/visitors/to_sql.rb +112 -34
  280. data/lib/arel/visitors/visitor.rb +2 -2
  281. data/lib/arel.rb +21 -3
  282. data/lib/rails/generators/active_record/application_record/USAGE +8 -0
  283. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +4 -1
  284. data/lib/rails/generators/active_record/migration.rb +3 -1
  285. data/lib/rails/generators/active_record/model/USAGE +113 -0
  286. data/lib/rails/generators/active_record/model/model_generator.rb +15 -6
  287. metadata +59 -17
  288. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +0 -35
  289. data/lib/active_record/null_relation.rb +0 -63
@@ -21,8 +21,7 @@ module ActiveRecord
21
21
  # New migration functionality that will never be backward compatible should be added directly to `ActiveRecord::Migration`.
22
22
  #
23
23
  # There are classes for each prior Rails version. Each class descends from the *next* Rails version, so:
24
- # 6.1 < 7.0
25
- # 5.2 < 6.0 < 6.1 < 7.0
24
+ # 5.2 < 6.0 < 6.1 < 7.0 < 7.1 < 7.2
26
25
  #
27
26
  # If you are introducing new migration functionality that should only apply from Rails 7 onward, then you should
28
27
  # find the class that immediately precedes it (6.1), and override the relevant migration methods to undo your changes.
@@ -30,7 +29,134 @@ module ActiveRecord
30
29
  # For example, Rails 6 added a default value for the `precision` option on datetime columns. So in this file, the `V5_2`
31
30
  # class sets the value of `precision` to `nil` if it's not explicitly provided. This way, the default value will not apply
32
31
  # for migrations written for 5.2, but will for migrations written for 6.0.
33
- V7_0 = Current
32
+ V7_2 = Current
33
+
34
+ class V7_1 < V7_2
35
+ end
36
+
37
+ class V7_0 < V7_1
38
+ module LegacyIndexName
39
+ private
40
+ def legacy_index_name(table_name, options)
41
+ if Hash === options
42
+ if options[:column]
43
+ "index_#{table_name}_on_#{Array(options[:column]) * '_and_'}"
44
+ elsif options[:name]
45
+ options[:name]
46
+ else
47
+ raise ArgumentError, "You must specify the index name"
48
+ end
49
+ else
50
+ legacy_index_name(table_name, index_name_options(options))
51
+ end
52
+ end
53
+
54
+ def index_name_options(column_names)
55
+ if expression_column_name?(column_names)
56
+ column_names = column_names.scan(/\w+/).join("_")
57
+ end
58
+
59
+ { column: column_names }
60
+ end
61
+
62
+ def expression_column_name?(column_name)
63
+ column_name.is_a?(String) && /\W/.match?(column_name)
64
+ end
65
+ end
66
+
67
+ module TableDefinition
68
+ include LegacyIndexName
69
+
70
+ def column(name, type, **options)
71
+ options[:_skip_validate_options] = true
72
+ super
73
+ end
74
+
75
+ def change(name, type, **options)
76
+ options[:_skip_validate_options] = true
77
+ super
78
+ end
79
+
80
+ def index(column_name, **options)
81
+ options[:name] = legacy_index_name(name, column_name) if options[:name].nil?
82
+ super
83
+ end
84
+
85
+ def references(*args, **options)
86
+ options[:_skip_validate_options] = true
87
+ super
88
+ end
89
+
90
+ private
91
+ def raise_on_if_exist_options(options)
92
+ end
93
+ end
94
+
95
+ include LegacyIndexName
96
+
97
+ def add_column(table_name, column_name, type, **options)
98
+ options[:_skip_validate_options] = true
99
+ super
100
+ end
101
+
102
+ def add_index(table_name, column_name, **options)
103
+ options[:name] = legacy_index_name(table_name, column_name) if options[:name].nil?
104
+ super
105
+ end
106
+
107
+ def add_reference(table_name, ref_name, **options)
108
+ options[:_skip_validate_options] = true
109
+ super
110
+ end
111
+ alias :add_belongs_to :add_reference
112
+
113
+ def create_table(table_name, **options)
114
+ options[:_uses_legacy_table_name] = true
115
+ options[:_skip_validate_options] = true
116
+
117
+ super
118
+ end
119
+
120
+ def rename_table(table_name, new_name, **options)
121
+ options[:_uses_legacy_table_name] = true
122
+ options[:_uses_legacy_index_name] = true
123
+ super
124
+ end
125
+
126
+ def change_column(table_name, column_name, type, **options)
127
+ options[:_skip_validate_options] = true
128
+ if connection.adapter_name == "Mysql2" || connection.adapter_name == "Trilogy"
129
+ options[:collation] ||= :no_collation
130
+ end
131
+ super
132
+ end
133
+
134
+ def change_column_null(table_name, column_name, null, default = nil)
135
+ super(table_name, column_name, !!null, default)
136
+ end
137
+
138
+ def disable_extension(name, **options)
139
+ if connection.adapter_name == "PostgreSQL"
140
+ options[:force] = :cascade
141
+ end
142
+ super
143
+ end
144
+
145
+ def add_foreign_key(from_table, to_table, **options)
146
+ if connection.adapter_name == "PostgreSQL" && options[:deferrable] == true
147
+ options[:deferrable] = :immediate
148
+ end
149
+ super
150
+ end
151
+
152
+ private
153
+ def compatible_table_definition(t)
154
+ class << t
155
+ prepend TableDefinition
156
+ end
157
+ super
158
+ end
159
+ end
34
160
 
35
161
  class V6_1 < V7_0
36
162
  class PostgreSQLCompat
@@ -56,12 +182,13 @@ module ActiveRecord
56
182
  super
57
183
  end
58
184
 
59
- def create_table(table_name, **options)
60
- if block_given?
61
- super { |t| yield compatible_table_definition(t) }
62
- else
63
- super
185
+ def change_column(table_name, column_name, type, **options)
186
+ if type == :datetime
187
+ options[:precision] ||= nil
64
188
  end
189
+
190
+ type = PostgreSQLCompat.compatible_timestamp_type(type, connection)
191
+ super
65
192
  end
66
193
 
67
194
  module TableDefinition
@@ -70,10 +197,19 @@ module ActiveRecord
70
197
  super
71
198
  end
72
199
 
200
+ def change(name, type, index: nil, **options)
201
+ options[:precision] ||= nil
202
+ super
203
+ end
204
+
73
205
  def column(name, type, index: nil, **options)
74
206
  options[:precision] ||= nil
75
207
  super
76
208
  end
209
+
210
+ private
211
+ def raise_on_if_exist_options(options)
212
+ end
77
213
  end
78
214
 
79
215
  private
@@ -81,7 +217,7 @@ module ActiveRecord
81
217
  class << t
82
218
  prepend TableDefinition
83
219
  end
84
- t
220
+ super
85
221
  end
86
222
  end
87
223
 
@@ -94,9 +230,8 @@ module ActiveRecord
94
230
 
95
231
  module TableDefinition
96
232
  def references(*args, **options)
97
- args.each do |ref_name|
98
- ReferenceDefinition.new(ref_name, **options).add_to(self)
99
- end
233
+ options[:_uses_legacy_reference_index_name] = true
234
+ super
100
235
  end
101
236
  alias :belongs_to :references
102
237
 
@@ -104,35 +239,19 @@ module ActiveRecord
104
239
  options[:precision] ||= nil
105
240
  super
106
241
  end
107
- end
108
242
 
109
- def create_table(table_name, **options)
110
- if block_given?
111
- super { |t| yield compatible_table_definition(t) }
112
- else
113
- super
114
- end
115
- end
116
-
117
- def change_table(table_name, **options)
118
- if block_given?
119
- super { |t| yield compatible_table_definition(t) }
120
- else
121
- super
122
- end
243
+ private
244
+ def raise_on_if_exist_options(options)
245
+ end
123
246
  end
124
247
 
125
- def create_join_table(table_1, table_2, **options)
126
- if block_given?
127
- super { |t| yield compatible_table_definition(t) }
128
- else
129
- super
248
+ def add_reference(table_name, ref_name, **options)
249
+ if connection.adapter_name == "SQLite"
250
+ options[:type] = :integer
130
251
  end
131
- end
132
252
 
133
- def add_reference(table_name, ref_name, **options)
134
- ReferenceDefinition.new(ref_name, **options)
135
- .add_to(connection.update_table_definition(table_name, self))
253
+ options[:_uses_legacy_reference_index_name] = true
254
+ super
136
255
  end
137
256
  alias :add_belongs_to :add_reference
138
257
 
@@ -141,7 +260,7 @@ module ActiveRecord
141
260
  class << t
142
261
  prepend TableDefinition
143
262
  end
144
- t
263
+ super
145
264
  end
146
265
  end
147
266
 
@@ -156,6 +275,13 @@ module ActiveRecord
156
275
  options[:precision] ||= nil
157
276
  super
158
277
  end
278
+
279
+ private
280
+ def raise_on_if_exist_options(options)
281
+ end
282
+
283
+ def raise_on_duplicate_column(name)
284
+ end
159
285
  end
160
286
 
161
287
  module CommandRecorder
@@ -172,30 +298,6 @@ module ActiveRecord
172
298
  end
173
299
  end
174
300
 
175
- def create_table(table_name, **options)
176
- if block_given?
177
- super { |t| yield compatible_table_definition(t) }
178
- else
179
- super
180
- end
181
- end
182
-
183
- def change_table(table_name, **options)
184
- if block_given?
185
- super { |t| yield compatible_table_definition(t) }
186
- else
187
- super
188
- end
189
- end
190
-
191
- def create_join_table(table_1, table_2, **options)
192
- if block_given?
193
- super { |t| yield compatible_table_definition(t) }
194
- else
195
- super
196
- end
197
- end
198
-
199
301
  def add_timestamps(table_name, **options)
200
302
  options[:precision] ||= nil
201
303
  super
@@ -206,7 +308,7 @@ module ActiveRecord
206
308
  class << t
207
309
  prepend TableDefinition
208
310
  end
209
- t
311
+ super
210
312
  end
211
313
 
212
314
  def command_recorder
@@ -231,7 +333,7 @@ module ActiveRecord
231
333
  end
232
334
 
233
335
  def create_table(table_name, **options)
234
- if connection.adapter_name == "Mysql2"
336
+ if connection.adapter_name == "Mysql2" || connection.adapter_name == "Trilogy"
235
337
  super(table_name, options: "ENGINE=InnoDB", **options)
236
338
  else
237
339
  super
@@ -250,6 +352,10 @@ module ActiveRecord
250
352
  super(*args, type: :integer, **options)
251
353
  end
252
354
  alias :belongs_to :references
355
+
356
+ private
357
+ def raise_on_if_exist_options(options)
358
+ end
253
359
  end
254
360
 
255
361
  def create_table(table_name, **options)
@@ -259,7 +365,7 @@ module ActiveRecord
259
365
  end
260
366
  end
261
367
 
262
- unless connection.adapter_name == "Mysql2" && options[:id] == :bigint
368
+ unless ["Mysql2", "Trilogy"].include?(connection.adapter_name) && options[:id] == :bigint
263
369
  if [:integer, :bigint].include?(options[:id]) && !options.key?(:default)
264
370
  options[:default] = nil
265
371
  end
@@ -316,6 +422,10 @@ module ActiveRecord
316
422
  options[:null] = true if options[:null].nil?
317
423
  super
318
424
  end
425
+
426
+ private
427
+ def raise_on_if_exist_options(options)
428
+ end
319
429
  end
320
430
 
321
431
  def add_reference(table_name, ref_name, **options)
@@ -0,0 +1,22 @@
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, ...)
10
+ connection.send(method, ...)
11
+ end
12
+
13
+ def respond_to_missing?(method, include_private = false)
14
+ connection.respond_to?(method, include_private) || super
15
+ end
16
+
17
+ def connection
18
+ migration.connection
19
+ end
20
+ end
21
+ end
22
+ 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
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ class PendingMigrationConnection # :nodoc:
5
+ def self.with_temporary_pool(db_config, &block)
6
+ pool = ActiveRecord::Base.connection_handler.establish_connection(db_config, owner_name: self)
7
+
8
+ yield pool
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