activerecord 6.1.7 → 7.2.2

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 (333) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +616 -1290
  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 +17 -14
  7. data/lib/active_record/association_relation.rb +2 -12
  8. data/lib/active_record/associations/alias_tracker.rb +25 -19
  9. data/lib/active_record/associations/association.rb +60 -21
  10. data/lib/active_record/associations/association_scope.rb +17 -12
  11. data/lib/active_record/associations/belongs_to_association.rb +37 -11
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -4
  13. data/lib/active_record/associations/builder/association.rb +11 -5
  14. data/lib/active_record/associations/builder/belongs_to.rb +41 -14
  15. data/lib/active_record/associations/builder/collection_association.rb +10 -3
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -7
  17. data/lib/active_record/associations/builder/has_many.rb +4 -4
  18. data/lib/active_record/associations/builder/has_one.rb +4 -4
  19. data/lib/active_record/associations/builder/singular_association.rb +6 -2
  20. data/lib/active_record/associations/collection_association.rb +46 -36
  21. data/lib/active_record/associations/collection_proxy.rb +44 -16
  22. data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
  23. data/lib/active_record/associations/errors.rb +265 -0
  24. data/lib/active_record/associations/foreign_association.rb +10 -3
  25. data/lib/active_record/associations/has_many_association.rb +29 -19
  26. data/lib/active_record/associations/has_many_through_association.rb +19 -8
  27. data/lib/active_record/associations/has_one_association.rb +20 -10
  28. data/lib/active_record/associations/has_one_through_association.rb +1 -1
  29. data/lib/active_record/associations/join_dependency/join_association.rb +30 -27
  30. data/lib/active_record/associations/join_dependency.rb +28 -20
  31. data/lib/active_record/associations/nested_error.rb +47 -0
  32. data/lib/active_record/associations/preloader/association.rb +212 -53
  33. data/lib/active_record/associations/preloader/batch.rb +48 -0
  34. data/lib/active_record/associations/preloader/branch.rb +153 -0
  35. data/lib/active_record/associations/preloader/through_association.rb +50 -16
  36. data/lib/active_record/associations/preloader.rb +50 -121
  37. data/lib/active_record/associations/singular_association.rb +15 -3
  38. data/lib/active_record/associations/through_association.rb +25 -14
  39. data/lib/active_record/associations.rb +429 -522
  40. data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
  41. data/lib/active_record/attribute_assignment.rb +1 -5
  42. data/lib/active_record/attribute_methods/before_type_cast.rb +24 -2
  43. data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
  44. data/lib/active_record/attribute_methods/dirty.rb +73 -22
  45. data/lib/active_record/attribute_methods/primary_key.rb +47 -27
  46. data/lib/active_record/attribute_methods/query.rb +31 -19
  47. data/lib/active_record/attribute_methods/read.rb +14 -11
  48. data/lib/active_record/attribute_methods/serialization.rb +174 -37
  49. data/lib/active_record/attribute_methods/time_zone_conversion.rb +15 -9
  50. data/lib/active_record/attribute_methods/write.rb +12 -15
  51. data/lib/active_record/attribute_methods.rb +164 -52
  52. data/lib/active_record/attributes.rb +57 -54
  53. data/lib/active_record/autosave_association.rb +74 -57
  54. data/lib/active_record/base.rb +27 -5
  55. data/lib/active_record/callbacks.rb +19 -35
  56. data/lib/active_record/coders/column_serializer.rb +61 -0
  57. data/lib/active_record/coders/json.rb +1 -1
  58. data/lib/active_record/coders/yaml_column.rb +70 -46
  59. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +284 -0
  60. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +211 -0
  61. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +79 -0
  62. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +325 -604
  63. data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -17
  64. data/lib/active_record/connection_adapters/abstract/database_statements.rb +199 -60
  65. data/lib/active_record/connection_adapters/abstract/query_cache.rb +230 -64
  66. data/lib/active_record/connection_adapters/abstract/quoting.rb +119 -131
  67. data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
  68. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +21 -20
  69. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +186 -31
  70. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +14 -1
  71. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +378 -143
  72. data/lib/active_record/connection_adapters/abstract/transaction.rb +361 -76
  73. data/lib/active_record/connection_adapters/abstract_adapter.rb +624 -163
  74. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +348 -165
  75. data/lib/active_record/connection_adapters/column.rb +13 -0
  76. data/lib/active_record/connection_adapters/mysql/column.rb +1 -0
  77. data/lib/active_record/connection_adapters/mysql/database_statements.rb +29 -130
  78. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -55
  79. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +9 -0
  80. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +10 -1
  81. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +8 -2
  82. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +45 -14
  83. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +152 -0
  84. data/lib/active_record/connection_adapters/mysql2_adapter.rb +107 -68
  85. data/lib/active_record/connection_adapters/pool_config.rb +26 -16
  86. data/lib/active_record/connection_adapters/pool_manager.rb +19 -9
  87. data/lib/active_record/connection_adapters/postgresql/column.rb +30 -1
  88. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +114 -54
  89. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
  90. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +8 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +5 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +53 -14
  94. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +1 -1
  95. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -2
  96. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +12 -3
  97. data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +18 -6
  100. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +14 -4
  101. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  102. data/lib/active_record/connection_adapters/postgresql/quoting.rb +137 -104
  103. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +28 -0
  104. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +92 -2
  105. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +173 -3
  106. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +78 -0
  107. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +403 -77
  108. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -10
  109. data/lib/active_record/connection_adapters/postgresql_adapter.rb +520 -253
  110. data/lib/active_record/connection_adapters/schema_cache.rb +326 -102
  111. data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
  112. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +78 -55
  113. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +68 -54
  114. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
  115. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +20 -0
  116. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +16 -0
  117. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +66 -22
  118. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +372 -130
  119. data/lib/active_record/connection_adapters/statement_pool.rb +7 -0
  120. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +99 -0
  121. data/lib/active_record/connection_adapters/trilogy_adapter.rb +229 -0
  122. data/lib/active_record/connection_adapters.rb +130 -6
  123. data/lib/active_record/connection_handling.rb +132 -146
  124. data/lib/active_record/core.rb +310 -253
  125. data/lib/active_record/counter_cache.rb +68 -34
  126. data/lib/active_record/database_configurations/connection_url_resolver.rb +10 -4
  127. data/lib/active_record/database_configurations/database_config.rb +34 -10
  128. data/lib/active_record/database_configurations/hash_config.rb +107 -31
  129. data/lib/active_record/database_configurations/url_config.rb +38 -13
  130. data/lib/active_record/database_configurations.rb +96 -60
  131. data/lib/active_record/delegated_type.rb +90 -20
  132. data/lib/active_record/deprecator.rb +7 -0
  133. data/lib/active_record/destroy_association_async_job.rb +4 -2
  134. data/lib/active_record/disable_joins_association_relation.rb +39 -0
  135. data/lib/active_record/dynamic_matchers.rb +3 -3
  136. data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
  137. data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
  138. data/lib/active_record/encryption/cipher.rb +53 -0
  139. data/lib/active_record/encryption/config.rb +68 -0
  140. data/lib/active_record/encryption/configurable.rb +60 -0
  141. data/lib/active_record/encryption/context.rb +42 -0
  142. data/lib/active_record/encryption/contexts.rb +76 -0
  143. data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
  144. data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
  145. data/lib/active_record/encryption/encryptable_record.rb +230 -0
  146. data/lib/active_record/encryption/encrypted_attribute_type.rb +175 -0
  147. data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
  148. data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
  149. data/lib/active_record/encryption/encryptor.rb +170 -0
  150. data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
  151. data/lib/active_record/encryption/errors.rb +15 -0
  152. data/lib/active_record/encryption/extended_deterministic_queries.rb +157 -0
  153. data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
  154. data/lib/active_record/encryption/key.rb +28 -0
  155. data/lib/active_record/encryption/key_generator.rb +53 -0
  156. data/lib/active_record/encryption/key_provider.rb +46 -0
  157. data/lib/active_record/encryption/message.rb +33 -0
  158. data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
  159. data/lib/active_record/encryption/message_serializer.rb +96 -0
  160. data/lib/active_record/encryption/null_encryptor.rb +25 -0
  161. data/lib/active_record/encryption/properties.rb +76 -0
  162. data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
  163. data/lib/active_record/encryption/scheme.rb +100 -0
  164. data/lib/active_record/encryption.rb +58 -0
  165. data/lib/active_record/enum.rb +170 -62
  166. data/lib/active_record/errors.rb +210 -27
  167. data/lib/active_record/explain.rb +21 -12
  168. data/lib/active_record/explain_registry.rb +11 -6
  169. data/lib/active_record/explain_subscriber.rb +1 -1
  170. data/lib/active_record/fixture_set/file.rb +15 -1
  171. data/lib/active_record/fixture_set/model_metadata.rb +14 -4
  172. data/lib/active_record/fixture_set/render_context.rb +2 -0
  173. data/lib/active_record/fixture_set/table_row.rb +70 -14
  174. data/lib/active_record/fixture_set/table_rows.rb +4 -4
  175. data/lib/active_record/fixtures.rb +179 -112
  176. data/lib/active_record/future_result.rb +178 -0
  177. data/lib/active_record/gem_version.rb +4 -4
  178. data/lib/active_record/inheritance.rb +85 -31
  179. data/lib/active_record/insert_all.rb +148 -32
  180. data/lib/active_record/integration.rb +14 -10
  181. data/lib/active_record/internal_metadata.rb +123 -23
  182. data/lib/active_record/legacy_yaml_adapter.rb +2 -39
  183. data/lib/active_record/locking/optimistic.rb +43 -27
  184. data/lib/active_record/locking/pessimistic.rb +15 -6
  185. data/lib/active_record/log_subscriber.rb +41 -29
  186. data/lib/active_record/marshalling.rb +59 -0
  187. data/lib/active_record/message_pack.rb +124 -0
  188. data/lib/active_record/middleware/database_selector/resolver.rb +10 -10
  189. data/lib/active_record/middleware/database_selector.rb +23 -13
  190. data/lib/active_record/middleware/shard_selector.rb +62 -0
  191. data/lib/active_record/migration/command_recorder.rb +113 -16
  192. data/lib/active_record/migration/compatibility.rb +235 -46
  193. data/lib/active_record/migration/default_strategy.rb +22 -0
  194. data/lib/active_record/migration/execution_strategy.rb +19 -0
  195. data/lib/active_record/migration/join_table.rb +1 -1
  196. data/lib/active_record/migration/pending_migration_connection.rb +21 -0
  197. data/lib/active_record/migration.rb +374 -177
  198. data/lib/active_record/model_schema.rb +145 -158
  199. data/lib/active_record/nested_attributes.rb +61 -23
  200. data/lib/active_record/no_touching.rb +3 -3
  201. data/lib/active_record/normalization.rb +163 -0
  202. data/lib/active_record/persistence.rb +282 -283
  203. data/lib/active_record/promise.rb +84 -0
  204. data/lib/active_record/query_cache.rb +18 -25
  205. data/lib/active_record/query_logs.rb +189 -0
  206. data/lib/active_record/query_logs_formatter.rb +41 -0
  207. data/lib/active_record/querying.rb +44 -9
  208. data/lib/active_record/railtie.rb +229 -71
  209. data/lib/active_record/railties/controller_runtime.rb +25 -11
  210. data/lib/active_record/railties/databases.rake +189 -256
  211. data/lib/active_record/railties/job_runtime.rb +23 -0
  212. data/lib/active_record/readonly_attributes.rb +41 -3
  213. data/lib/active_record/reflection.rb +332 -103
  214. data/lib/active_record/relation/batches/batch_enumerator.rb +38 -9
  215. data/lib/active_record/relation/batches.rb +200 -65
  216. data/lib/active_record/relation/calculations.rb +301 -112
  217. data/lib/active_record/relation/delegation.rb +33 -22
  218. data/lib/active_record/relation/finder_methods.rb +123 -52
  219. data/lib/active_record/relation/merger.rb +26 -19
  220. data/lib/active_record/relation/predicate_builder/array_handler.rb +2 -2
  221. data/lib/active_record/relation/predicate_builder/association_query_value.rb +38 -4
  222. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +10 -7
  223. data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
  224. data/lib/active_record/relation/predicate_builder.rb +29 -22
  225. data/lib/active_record/relation/query_attribute.rb +30 -12
  226. data/lib/active_record/relation/query_methods.rb +870 -163
  227. data/lib/active_record/relation/record_fetch_warning.rb +10 -9
  228. data/lib/active_record/relation/spawn_methods.rb +7 -6
  229. data/lib/active_record/relation/where_clause.rb +15 -36
  230. data/lib/active_record/relation.rb +736 -145
  231. data/lib/active_record/result.rb +67 -54
  232. data/lib/active_record/runtime_registry.rb +71 -13
  233. data/lib/active_record/sanitization.rb +84 -34
  234. data/lib/active_record/schema.rb +39 -23
  235. data/lib/active_record/schema_dumper.rb +90 -31
  236. data/lib/active_record/schema_migration.rb +74 -23
  237. data/lib/active_record/scoping/default.rb +72 -15
  238. data/lib/active_record/scoping/named.rb +6 -13
  239. data/lib/active_record/scoping.rb +65 -34
  240. data/lib/active_record/secure_password.rb +60 -0
  241. data/lib/active_record/secure_token.rb +21 -3
  242. data/lib/active_record/serialization.rb +6 -1
  243. data/lib/active_record/signed_id.rb +30 -9
  244. data/lib/active_record/statement_cache.rb +7 -7
  245. data/lib/active_record/store.rb +10 -10
  246. data/lib/active_record/suppressor.rb +13 -15
  247. data/lib/active_record/table_metadata.rb +7 -3
  248. data/lib/active_record/tasks/database_tasks.rb +288 -149
  249. data/lib/active_record/tasks/mysql_database_tasks.rb +16 -7
  250. data/lib/active_record/tasks/postgresql_database_tasks.rb +35 -26
  251. data/lib/active_record/tasks/sqlite_database_tasks.rb +16 -7
  252. data/lib/active_record/test_databases.rb +1 -1
  253. data/lib/active_record/test_fixtures.rb +173 -155
  254. data/lib/active_record/testing/query_assertions.rb +121 -0
  255. data/lib/active_record/timestamp.rb +32 -19
  256. data/lib/active_record/token_for.rb +123 -0
  257. data/lib/active_record/touch_later.rb +12 -7
  258. data/lib/active_record/transaction.rb +132 -0
  259. data/lib/active_record/transactions.rb +118 -41
  260. data/lib/active_record/translation.rb +3 -5
  261. data/lib/active_record/type/adapter_specific_registry.rb +32 -14
  262. data/lib/active_record/type/hash_lookup_type_map.rb +34 -1
  263. data/lib/active_record/type/internal/timezone.rb +7 -2
  264. data/lib/active_record/type/serialized.rb +9 -7
  265. data/lib/active_record/type/time.rb +4 -0
  266. data/lib/active_record/type/type_map.rb +17 -20
  267. data/lib/active_record/type.rb +1 -2
  268. data/lib/active_record/type_caster/connection.rb +4 -4
  269. data/lib/active_record/validations/absence.rb +1 -1
  270. data/lib/active_record/validations/associated.rb +13 -7
  271. data/lib/active_record/validations/numericality.rb +5 -4
  272. data/lib/active_record/validations/presence.rb +5 -28
  273. data/lib/active_record/validations/uniqueness.rb +65 -15
  274. data/lib/active_record/validations.rb +12 -5
  275. data/lib/active_record/version.rb +1 -1
  276. data/lib/active_record.rb +444 -32
  277. data/lib/arel/alias_predication.rb +1 -1
  278. data/lib/arel/attributes/attribute.rb +0 -8
  279. data/lib/arel/collectors/bind.rb +2 -0
  280. data/lib/arel/collectors/composite.rb +7 -0
  281. data/lib/arel/collectors/sql_string.rb +1 -1
  282. data/lib/arel/collectors/substitute_binds.rb +1 -1
  283. data/lib/arel/crud.rb +28 -22
  284. data/lib/arel/delete_manager.rb +18 -4
  285. data/lib/arel/errors.rb +10 -0
  286. data/lib/arel/factory_methods.rb +4 -0
  287. data/lib/arel/filter_predications.rb +9 -0
  288. data/lib/arel/insert_manager.rb +2 -3
  289. data/lib/arel/nodes/binary.rb +6 -7
  290. data/lib/arel/nodes/bound_sql_literal.rb +65 -0
  291. data/lib/arel/nodes/casted.rb +1 -1
  292. data/lib/arel/nodes/cte.rb +36 -0
  293. data/lib/arel/nodes/delete_statement.rb +12 -13
  294. data/lib/arel/nodes/filter.rb +10 -0
  295. data/lib/arel/nodes/fragments.rb +35 -0
  296. data/lib/arel/nodes/function.rb +1 -0
  297. data/lib/arel/nodes/homogeneous_in.rb +1 -9
  298. data/lib/arel/nodes/insert_statement.rb +2 -2
  299. data/lib/arel/nodes/leading_join.rb +8 -0
  300. data/lib/arel/nodes/{and.rb → nary.rb} +9 -2
  301. data/lib/arel/nodes/node.rb +115 -5
  302. data/lib/arel/nodes/select_core.rb +2 -2
  303. data/lib/arel/nodes/select_statement.rb +2 -2
  304. data/lib/arel/nodes/sql_literal.rb +13 -0
  305. data/lib/arel/nodes/table_alias.rb +4 -0
  306. data/lib/arel/nodes/update_statement.rb +8 -3
  307. data/lib/arel/nodes.rb +7 -2
  308. data/lib/arel/predications.rb +14 -4
  309. data/lib/arel/select_manager.rb +11 -5
  310. data/lib/arel/table.rb +9 -6
  311. data/lib/arel/tree_manager.rb +8 -15
  312. data/lib/arel/update_manager.rb +20 -5
  313. data/lib/arel/visitors/dot.rb +81 -90
  314. data/lib/arel/visitors/mysql.rb +23 -5
  315. data/lib/arel/visitors/postgresql.rb +1 -22
  316. data/lib/arel/visitors/sqlite.rb +25 -0
  317. data/lib/arel/visitors/to_sql.rb +170 -36
  318. data/lib/arel/visitors/visitor.rb +2 -2
  319. data/lib/arel.rb +23 -4
  320. data/lib/rails/generators/active_record/application_record/USAGE +8 -0
  321. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
  322. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +4 -1
  323. data/lib/rails/generators/active_record/migration.rb +3 -1
  324. data/lib/rails/generators/active_record/model/USAGE +113 -0
  325. data/lib/rails/generators/active_record/model/model_generator.rb +15 -6
  326. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +1 -1
  327. data/lib/rails/generators/active_record/model/templates/model.rb.tt +1 -1
  328. data/lib/rails/generators/active_record/model/templates/module.rb.tt +2 -2
  329. data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
  330. data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
  331. metadata +103 -17
  332. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +0 -35
  333. data/lib/active_record/null_relation.rb +0 -67
data/lib/active_record.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # Copyright (c) 2004-2022 David Heinemeier Hansson
4
+ # Copyright (c) David Heinemeier Hansson
5
5
  #
6
6
  # Permission is hereby granted, free of charge, to any person obtaining
7
7
  # a copy of this software and associated documentation files (the
@@ -25,37 +25,46 @@
25
25
 
26
26
  require "active_support"
27
27
  require "active_support/rails"
28
+ require "active_support/ordered_options"
28
29
  require "active_model"
29
30
  require "arel"
30
31
  require "yaml"
31
32
 
32
33
  require "active_record/version"
34
+ require "active_record/deprecator"
33
35
  require "active_model/attribute_set"
34
36
  require "active_record/errors"
35
37
 
38
+ # :include: ../README.rdoc
36
39
  module ActiveRecord
37
40
  extend ActiveSupport::Autoload
38
41
 
39
42
  autoload :Base
40
43
  autoload :Callbacks
41
- autoload :Core
42
44
  autoload :ConnectionHandling
45
+ autoload :Core
43
46
  autoload :CounterCache
44
- autoload :DynamicMatchers
45
47
  autoload :DelegatedType
48
+ autoload :DestroyAssociationAsyncJob
49
+ autoload :DynamicMatchers
50
+ autoload :Encryption
46
51
  autoload :Enum
47
- autoload :InternalMetadata
48
52
  autoload :Explain
53
+ autoload :FixtureSet, "active_record/fixtures"
49
54
  autoload :Inheritance
50
55
  autoload :Integration
56
+ autoload :InternalMetadata
57
+ autoload :LogSubscriber
58
+ autoload :Marshalling
51
59
  autoload :Migration
52
60
  autoload :Migrator, "active_record/migration"
53
61
  autoload :ModelSchema
54
62
  autoload :NestedAttributes
55
63
  autoload :NoTouching
56
- autoload :TouchLater
64
+ autoload :Normalization
57
65
  autoload :Persistence
58
66
  autoload :QueryCache
67
+ autoload :QueryLogs
59
68
  autoload :Querying
60
69
  autoload :ReadonlyAttributes
61
70
  autoload :RecordInvalid, "active_record/validations"
@@ -66,65 +75,72 @@ module ActiveRecord
66
75
  autoload :SchemaDumper
67
76
  autoload :SchemaMigration
68
77
  autoload :Scoping
78
+ autoload :SecurePassword
79
+ autoload :SecureToken
69
80
  autoload :Serialization
70
- autoload :StatementCache
71
- autoload :Store
72
81
  autoload :SignedId
82
+ autoload :Store
73
83
  autoload :Suppressor
84
+ autoload :TestDatabases
85
+ autoload :TestFixtures, "active_record/fixtures"
74
86
  autoload :Timestamp
87
+ autoload :TokenFor
88
+ autoload :TouchLater
89
+ autoload :Transaction
75
90
  autoload :Transactions
76
91
  autoload :Translation
77
92
  autoload :Validations
78
- autoload :SecureToken
79
- autoload :DestroyAssociationAsyncJob
80
93
 
81
94
  eager_autoload do
82
- autoload :ConnectionAdapters
83
-
84
95
  autoload :Aggregations
96
+ autoload :AssociationRelation
85
97
  autoload :Associations
98
+ autoload :AsynchronousQueriesTracker
86
99
  autoload :AttributeAssignment
87
100
  autoload :AttributeMethods
88
101
  autoload :AutosaveAssociation
89
-
102
+ autoload :ConnectionAdapters
103
+ autoload :DisableJoinsAssociationRelation
104
+ autoload :FutureResult
90
105
  autoload :LegacyYamlAdapter
91
-
106
+ autoload :Promise
92
107
  autoload :Relation
93
- autoload :AssociationRelation
94
- autoload :NullRelation
108
+ autoload :Result
109
+ autoload :StatementCache
110
+ autoload :TableMetadata
111
+ autoload :Type
95
112
 
96
113
  autoload_under "relation" do
97
- autoload :QueryMethods
98
- autoload :FinderMethods
114
+ autoload :Batches
99
115
  autoload :Calculations
116
+ autoload :Delegation
117
+ autoload :FinderMethods
100
118
  autoload :PredicateBuilder
119
+ autoload :QueryMethods
101
120
  autoload :SpawnMethods
102
- autoload :Batches
103
- autoload :Delegation
104
121
  end
105
-
106
- autoload :Result
107
- autoload :TableMetadata
108
- autoload :Type
109
122
  end
110
123
 
111
124
  module Coders
112
- autoload :YAMLColumn, "active_record/coders/yaml_column"
125
+ autoload :ColumnSerializer, "active_record/coders/column_serializer"
113
126
  autoload :JSON, "active_record/coders/json"
127
+ autoload :YAMLColumn, "active_record/coders/yaml_column"
114
128
  end
115
129
 
116
130
  module AttributeMethods
117
131
  extend ActiveSupport::Autoload
118
132
 
133
+ autoload :CompositePrimaryKey
134
+
119
135
  eager_autoload do
120
136
  autoload :BeforeTypeCast
121
137
  autoload :Dirty
122
138
  autoload :PrimaryKey
123
139
  autoload :Query
124
140
  autoload :Read
141
+ autoload :Serialization
125
142
  autoload :TimeZoneConversion
126
143
  autoload :Write
127
- autoload :Serialization
128
144
  end
129
145
  end
130
146
 
@@ -141,29 +157,374 @@ module ActiveRecord
141
157
  extend ActiveSupport::Autoload
142
158
 
143
159
  eager_autoload do
144
- autoload :Named
145
160
  autoload :Default
161
+ autoload :Named
146
162
  end
147
163
  end
148
164
 
149
165
  module Middleware
150
166
  extend ActiveSupport::Autoload
151
167
 
152
- autoload :DatabaseSelector, "active_record/middleware/database_selector"
168
+ autoload :DatabaseSelector
169
+ autoload :ShardSelector
153
170
  end
154
171
 
155
172
  module Tasks
156
173
  extend ActiveSupport::Autoload
157
174
 
158
175
  autoload :DatabaseTasks
159
- autoload :SQLiteDatabaseTasks, "active_record/tasks/sqlite_database_tasks"
160
176
  autoload :MySQLDatabaseTasks, "active_record/tasks/mysql_database_tasks"
161
- autoload :PostgreSQLDatabaseTasks,
162
- "active_record/tasks/postgresql_database_tasks"
177
+ autoload :PostgreSQLDatabaseTasks, "active_record/tasks/postgresql_database_tasks"
178
+ autoload :SQLiteDatabaseTasks, "active_record/tasks/sqlite_database_tasks"
163
179
  end
164
180
 
165
- autoload :TestDatabases, "active_record/test_databases"
166
- autoload :TestFixtures, "active_record/fixtures"
181
+ singleton_class.attr_accessor :disable_prepared_statements
182
+ self.disable_prepared_statements = false
183
+
184
+ ##
185
+ # :singleton-method: lazily_load_schema_cache
186
+ # Lazily load the schema cache. This option will load the schema cache
187
+ # when a connection is established rather than on boot.
188
+ singleton_class.attr_accessor :lazily_load_schema_cache
189
+ self.lazily_load_schema_cache = false
190
+
191
+ ##
192
+ # :singleton-method: schema_cache_ignored_tables
193
+ # A list of tables or regex's to match tables to ignore when
194
+ # dumping the schema cache. For example if this is set to +[/^_/]+
195
+ # the schema cache will not dump tables named with an underscore.
196
+ singleton_class.attr_accessor :schema_cache_ignored_tables
197
+ self.schema_cache_ignored_tables = []
198
+
199
+ singleton_class.attr_reader :default_timezone
200
+
201
+ # Determines whether to use Time.utc (using :utc) or Time.local (using :local) when pulling
202
+ # dates and times from the database. This is set to :utc by default.
203
+ def self.default_timezone=(default_timezone)
204
+ unless %i(local utc).include?(default_timezone)
205
+ raise ArgumentError, "default_timezone must be either :utc (default) or :local."
206
+ end
207
+
208
+ @default_timezone = default_timezone
209
+ end
210
+
211
+ self.default_timezone = :utc
212
+
213
+ ##
214
+ # :singleton-method: db_warnings_action
215
+ # The action to take when database query produces warning.
216
+ # Must be one of :ignore, :log, :raise, :report, or a custom proc.
217
+ # The default is :ignore.
218
+ singleton_class.attr_reader :db_warnings_action
219
+
220
+ def self.db_warnings_action=(action)
221
+ @db_warnings_action =
222
+ case action
223
+ when :ignore
224
+ nil
225
+ when :log
226
+ ->(warning) do
227
+ warning_message = "[#{warning.class}] #{warning.message}"
228
+ warning_message += " (#{warning.code})" if warning.code
229
+ ActiveRecord::Base.logger.warn(warning_message)
230
+ end
231
+ when :raise
232
+ ->(warning) { raise warning }
233
+ when :report
234
+ ->(warning) { Rails.error.report(warning, handled: true) }
235
+ when Proc
236
+ action
237
+ else
238
+ raise ArgumentError, "db_warnings_action must be one of :ignore, :log, :raise, :report, or a custom proc."
239
+ end
240
+ end
241
+
242
+ self.db_warnings_action = :ignore
243
+
244
+ ##
245
+ # :singleton-method: db_warnings_ignore
246
+ # Specify allowlist of database warnings.
247
+ singleton_class.attr_accessor :db_warnings_ignore
248
+ self.db_warnings_ignore = []
249
+
250
+ singleton_class.attr_accessor :writing_role
251
+ self.writing_role = :writing
252
+
253
+ singleton_class.attr_accessor :reading_role
254
+ self.reading_role = :reading
255
+
256
+ def self.legacy_connection_handling=(_)
257
+ raise ArgumentError, <<~MSG.squish
258
+ The `legacy_connection_handling` setter was deprecated in 7.0 and removed in 7.1,
259
+ but is still defined in your configuration. Please remove this call as it no longer
260
+ has any effect."
261
+ MSG
262
+ end
263
+
264
+ ##
265
+ # :singleton-method: async_query_executor
266
+ # Sets the async_query_executor for an application. By default the thread pool executor
267
+ # set to +nil+ which will not run queries in the background. Applications must configure
268
+ # a thread pool executor to use this feature. Options are:
269
+ #
270
+ # * nil - Does not initialize a thread pool executor. Any async calls will be
271
+ # run in the foreground.
272
+ # * :global_thread_pool - Initializes a single +Concurrent::ThreadPoolExecutor+
273
+ # that uses the +async_query_concurrency+ for the +max_threads+ value.
274
+ # * :multi_thread_pool - Initializes a +Concurrent::ThreadPoolExecutor+ for each
275
+ # database connection. The initializer values are defined in the configuration hash.
276
+ singleton_class.attr_accessor :async_query_executor
277
+ self.async_query_executor = nil
278
+
279
+ def self.global_thread_pool_async_query_executor # :nodoc:
280
+ concurrency = global_executor_concurrency || 4
281
+ @global_thread_pool_async_query_executor ||= Concurrent::ThreadPoolExecutor.new(
282
+ min_threads: 0,
283
+ max_threads: concurrency,
284
+ max_queue: concurrency * 4,
285
+ fallback_policy: :caller_runs
286
+ )
287
+ end
288
+
289
+ # Set the +global_executor_concurrency+. This configuration value can only be used
290
+ # with the global thread pool async query executor.
291
+ def self.global_executor_concurrency=(global_executor_concurrency)
292
+ if self.async_query_executor.nil? || self.async_query_executor == :multi_thread_pool
293
+ raise ArgumentError, "`global_executor_concurrency` cannot be set when the executor is nil or set to `:multi_thread_pool`. For multiple thread pools, please set the concurrency in your database configuration."
294
+ end
295
+
296
+ @global_executor_concurrency = global_executor_concurrency
297
+ end
298
+
299
+ def self.global_executor_concurrency # :nodoc:
300
+ @global_executor_concurrency ||= nil
301
+ end
302
+
303
+ @permanent_connection_checkout = true
304
+ singleton_class.attr_reader :permanent_connection_checkout
305
+
306
+ # Defines whether +ActiveRecord::Base.connection+ is allowed, deprecated, or entirely disallowed.
307
+ def self.permanent_connection_checkout=(value)
308
+ unless [true, :deprecated, :disallowed].include?(value)
309
+ raise ArgumentError, "permanent_connection_checkout must be one of: `true`, `:deprecated` or `:disallowed`"
310
+ end
311
+ @permanent_connection_checkout = value
312
+ end
313
+
314
+ singleton_class.attr_accessor :index_nested_attribute_errors
315
+ self.index_nested_attribute_errors = false
316
+
317
+ ##
318
+ # :singleton-method: verbose_query_logs
319
+ #
320
+ # Specifies if the methods calling database queries should be logged below
321
+ # their relevant queries. Defaults to false.
322
+ singleton_class.attr_accessor :verbose_query_logs
323
+ self.verbose_query_logs = false
324
+
325
+ ##
326
+ # :singleton-method: queues
327
+ #
328
+ # Specifies the names of the queues used by background jobs.
329
+ singleton_class.attr_accessor :queues
330
+ self.queues = {}
331
+
332
+ singleton_class.attr_accessor :maintain_test_schema
333
+ self.maintain_test_schema = nil
334
+
335
+ singleton_class.attr_accessor :raise_on_assign_to_attr_readonly
336
+ self.raise_on_assign_to_attr_readonly = false
337
+
338
+ singleton_class.attr_accessor :belongs_to_required_validates_foreign_key
339
+ self.belongs_to_required_validates_foreign_key = true
340
+
341
+ singleton_class.attr_accessor :before_committed_on_all_records
342
+ self.before_committed_on_all_records = false
343
+
344
+ singleton_class.attr_accessor :run_after_transaction_callbacks_in_order_defined
345
+ self.run_after_transaction_callbacks_in_order_defined = false
346
+
347
+ def self.commit_transaction_on_non_local_return
348
+ ActiveRecord.deprecator.warn <<-WARNING.squish
349
+ `Rails.application.config.active_record.commit_transaction_on_non_local_return`
350
+ is deprecated and will be removed in Rails 8.0.
351
+ WARNING
352
+ end
353
+
354
+ def self.commit_transaction_on_non_local_return=(value)
355
+ ActiveRecord.deprecator.warn <<-WARNING.squish
356
+ `Rails.application.config.active_record.commit_transaction_on_non_local_return`
357
+ is deprecated and will be removed in Rails 8.0.
358
+ WARNING
359
+ end
360
+
361
+ ##
362
+ # :singleton-method: warn_on_records_fetched_greater_than
363
+ # Specify a threshold for the size of query result sets. If the number of
364
+ # records in the set exceeds the threshold, a warning is logged. This can
365
+ # be used to identify queries which load thousands of records and
366
+ # potentially cause memory bloat.
367
+ singleton_class.attr_accessor :warn_on_records_fetched_greater_than
368
+ self.warn_on_records_fetched_greater_than = false
369
+
370
+ singleton_class.attr_accessor :application_record_class
371
+ self.application_record_class = nil
372
+
373
+ ##
374
+ # :singleton-method: action_on_strict_loading_violation
375
+ # Set the application to log or raise when an association violates strict loading.
376
+ # Defaults to :raise.
377
+ singleton_class.attr_accessor :action_on_strict_loading_violation
378
+ self.action_on_strict_loading_violation = :raise
379
+
380
+ ##
381
+ # :singleton-method: schema_format
382
+ # Specifies the format to use when dumping the database schema with Rails'
383
+ # Rakefile. If :sql, the schema is dumped as (potentially database-
384
+ # specific) SQL statements. If :ruby, the schema is dumped as an
385
+ # ActiveRecord::Schema file which can be loaded into any database that
386
+ # supports migrations. Use :ruby if you want to have different database
387
+ # adapters for, e.g., your development and test environments.
388
+ singleton_class.attr_accessor :schema_format
389
+ self.schema_format = :ruby
390
+
391
+ ##
392
+ # :singleton-method: error_on_ignored_order
393
+ # Specifies if an error should be raised if the query has an order being
394
+ # ignored when doing batch queries. Useful in applications where the
395
+ # scope being ignored is error-worthy, rather than a warning.
396
+ singleton_class.attr_accessor :error_on_ignored_order
397
+ self.error_on_ignored_order = false
398
+
399
+ ##
400
+ # :singleton-method: timestamped_migrations
401
+ # Specify whether or not to use timestamps for migration versions
402
+ singleton_class.attr_accessor :timestamped_migrations
403
+ self.timestamped_migrations = true
404
+
405
+ ##
406
+ # :singleton-method: validate_migration_timestamps
407
+ # Specify whether or not to validate migration timestamps. When set, an error
408
+ # will be raised if a timestamp is more than a day ahead of the timestamp
409
+ # associated with the current time. +timestamped_migrations+ must be set to true.
410
+ singleton_class.attr_accessor :validate_migration_timestamps
411
+ self.validate_migration_timestamps = false
412
+
413
+ ##
414
+ # :singleton-method: migration_strategy
415
+ # Specify strategy to use for executing migrations.
416
+ singleton_class.attr_accessor :migration_strategy
417
+ self.migration_strategy = Migration::DefaultStrategy
418
+
419
+ ##
420
+ # :singleton-method: dump_schema_after_migration
421
+ # Specify whether schema dump should happen at the end of the
422
+ # bin/rails db:migrate command. This is true by default, which is useful for the
423
+ # development environment. This should ideally be false in the production
424
+ # environment where dumping schema is rarely needed.
425
+ singleton_class.attr_accessor :dump_schema_after_migration
426
+ self.dump_schema_after_migration = true
427
+
428
+ ##
429
+ # :singleton-method: dump_schemas
430
+ # Specifies which database schemas to dump when calling db:schema:dump.
431
+ # If the value is :schema_search_path (the default), any schemas listed in
432
+ # schema_search_path are dumped. Use :all to dump all schemas regardless
433
+ # of schema_search_path, or a string of comma separated schemas for a
434
+ # custom list.
435
+ singleton_class.attr_accessor :dump_schemas
436
+ self.dump_schemas = :schema_search_path
437
+
438
+ ##
439
+ # :singleton-method: verify_foreign_keys_for_fixtures
440
+ # If true, Rails will verify all foreign keys in the database after loading fixtures.
441
+ # An error will be raised if there are any foreign key violations, indicating incorrectly
442
+ # written fixtures.
443
+ # Supported by PostgreSQL and SQLite.
444
+ singleton_class.attr_accessor :verify_foreign_keys_for_fixtures
445
+ self.verify_foreign_keys_for_fixtures = false
446
+
447
+ def self.allow_deprecated_singular_associations_name
448
+ ActiveRecord.deprecator.warn <<-WARNING.squish
449
+ `Rails.application.config.active_record.allow_deprecated_singular_associations_name`
450
+ is deprecated and will be removed in Rails 8.0.
451
+ WARNING
452
+ end
453
+
454
+ def self.allow_deprecated_singular_associations_name=(value)
455
+ ActiveRecord.deprecator.warn <<-WARNING.squish
456
+ `Rails.application.config.active_record.allow_deprecated_singular_associations_name`
457
+ is deprecated and will be removed in Rails 8.0.
458
+ WARNING
459
+ end
460
+
461
+ singleton_class.attr_accessor :query_transformers
462
+ self.query_transformers = []
463
+
464
+ ##
465
+ # :singleton-method: use_yaml_unsafe_load
466
+ # Application configurable boolean that instructs the YAML Coder to use
467
+ # an unsafe load if set to true.
468
+ singleton_class.attr_accessor :use_yaml_unsafe_load
469
+ self.use_yaml_unsafe_load = false
470
+
471
+ ##
472
+ # :singleton-method: raise_int_wider_than_64bit
473
+ # Application configurable boolean that denotes whether or not to raise
474
+ # an exception when the PostgreSQLAdapter is provided with an integer that
475
+ # is wider than signed 64bit representation
476
+ singleton_class.attr_accessor :raise_int_wider_than_64bit
477
+ self.raise_int_wider_than_64bit = true
478
+
479
+ ##
480
+ # :singleton-method: yaml_column_permitted_classes
481
+ # Application configurable array that provides additional permitted classes
482
+ # to Psych safe_load in the YAML Coder
483
+ singleton_class.attr_accessor :yaml_column_permitted_classes
484
+ self.yaml_column_permitted_classes = [Symbol]
485
+
486
+ ##
487
+ # :singleton-method: generate_secure_token_on
488
+ # Controls when to generate a value for <tt>has_secure_token</tt>
489
+ # declarations. Defaults to <tt>:create</tt>.
490
+ singleton_class.attr_accessor :generate_secure_token_on
491
+ self.generate_secure_token_on = :create
492
+
493
+ def self.marshalling_format_version
494
+ Marshalling.format_version
495
+ end
496
+
497
+ def self.marshalling_format_version=(value)
498
+ Marshalling.format_version = value
499
+ end
500
+
501
+ ##
502
+ # :singleton-method: protocol_adapters
503
+ # Provides a mapping between database protocols/DBMSs and the
504
+ # underlying database adapter to be used. This is used only by the
505
+ # <tt>DATABASE_URL</tt> environment variable.
506
+ #
507
+ # == Example
508
+ #
509
+ # DATABASE_URL="mysql://myuser:mypass@localhost/somedatabase"
510
+ #
511
+ # The above URL specifies that MySQL is the desired protocol/DBMS, and the
512
+ # application configuration can then decide which adapter to use. For this example
513
+ # the default mapping is from <tt>mysql</tt> to <tt>mysql2</tt>, but <tt>:trilogy</tt>
514
+ # is also supported.
515
+ #
516
+ # ActiveRecord.protocol_adapters.mysql = "mysql2"
517
+ #
518
+ # The protocols names are arbitrary, and external database adapters can be
519
+ # registered and set here.
520
+ singleton_class.attr_accessor :protocol_adapters
521
+ self.protocol_adapters = ActiveSupport::InheritableOptions.new(
522
+ {
523
+ sqlite: "sqlite3",
524
+ mysql: "mysql2",
525
+ postgres: "postgresql",
526
+ }
527
+ )
167
528
 
168
529
  def self.eager_load!
169
530
  super
@@ -172,6 +533,57 @@ module ActiveRecord
172
533
  ActiveRecord::Associations.eager_load!
173
534
  ActiveRecord::AttributeMethods.eager_load!
174
535
  ActiveRecord::ConnectionAdapters.eager_load!
536
+ ActiveRecord::Encryption.eager_load!
537
+ end
538
+
539
+ # Explicitly closes all database connections in all pools.
540
+ def self.disconnect_all!
541
+ ConnectionAdapters::PoolConfig.disconnect_all!
542
+ end
543
+
544
+ # Registers a block to be called after all the current transactions have been
545
+ # committed.
546
+ #
547
+ # If there is no currently open transaction, the block is called immediately.
548
+ #
549
+ # If there are multiple nested transactions, the block is called after the outermost one
550
+ # has been committed,
551
+ #
552
+ # If any of the currently open transactions is rolled back, the block is never called.
553
+ #
554
+ # If multiple transactions are open across multiple databases, the block will be invoked
555
+ # if and once all of them have been committed. But note that nesting transactions across
556
+ # two distinct databases is a sharding anti-pattern that comes with a world of hurts.
557
+ def self.after_all_transactions_commit(&block)
558
+ open_transactions = all_open_transactions
559
+
560
+ if open_transactions.empty?
561
+ yield
562
+ elsif open_transactions.size == 1
563
+ open_transactions.first.after_commit(&block)
564
+ else
565
+ count = open_transactions.size
566
+ callback = -> do
567
+ count -= 1
568
+ block.call if count.zero?
569
+ end
570
+ open_transactions.each do |t|
571
+ t.after_commit(&callback)
572
+ end
573
+ open_transactions = nil # rubocop:disable Lint/UselessAssignment avoid holding it in the closure
574
+ end
575
+ end
576
+
577
+ def self.all_open_transactions # :nodoc:
578
+ open_transactions = []
579
+ Base.connection_handler.each_connection_pool do |pool|
580
+ if active_connection = pool.active_connection
581
+ if active_connection.current_transaction.open? && active_connection.current_transaction.joinable?
582
+ open_transactions << active_connection.current_transaction
583
+ end
584
+ end
585
+ end
586
+ open_transactions
175
587
  end
176
588
  end
177
589
 
@@ -3,7 +3,7 @@
3
3
  module Arel # :nodoc: all
4
4
  module AliasPredication
5
5
  def as(other)
6
- Nodes::As.new self, Nodes::SqlLiteral.new(other)
6
+ Nodes::As.new self, Nodes::SqlLiteral.new(other, retryable: true)
7
7
  end
8
8
  end
9
9
  end
@@ -27,14 +27,6 @@ module Arel # :nodoc: all
27
27
  relation.able_to_type_cast?
28
28
  end
29
29
  end
30
-
31
- class String < Attribute; end
32
- class Time < Attribute; end
33
- class Boolean < Attribute; end
34
- class Decimal < Attribute; end
35
- class Float < Attribute; end
36
- class Integer < Attribute; end
37
- class Undefined < Attribute; end
38
30
  end
39
31
 
40
32
  Attribute = Attributes::Attribute
@@ -3,6 +3,8 @@
3
3
  module Arel # :nodoc: all
4
4
  module Collectors
5
5
  class Bind
6
+ attr_accessor :retryable
7
+
6
8
  def initialize
7
9
  @binds = []
8
10
  end
@@ -4,12 +4,19 @@ module Arel # :nodoc: all
4
4
  module Collectors
5
5
  class Composite
6
6
  attr_accessor :preparable
7
+ attr_reader :retryable
7
8
 
8
9
  def initialize(left, right)
9
10
  @left = left
10
11
  @right = right
11
12
  end
12
13
 
14
+ def retryable=(retryable)
15
+ left.retryable = retryable
16
+ right.retryable = retryable
17
+ @retryable = retryable
18
+ end
19
+
13
20
  def <<(str)
14
21
  left << str
15
22
  right << str
@@ -5,7 +5,7 @@ require "arel/collectors/plain_string"
5
5
  module Arel # :nodoc: all
6
6
  module Collectors
7
7
  class SQLString < PlainString
8
- attr_accessor :preparable
8
+ attr_accessor :preparable, :retryable
9
9
 
10
10
  def initialize(*)
11
11
  super
@@ -3,7 +3,7 @@
3
3
  module Arel # :nodoc: all
4
4
  module Collectors
5
5
  class SubstituteBinds
6
- attr_accessor :preparable
6
+ attr_accessor :preparable, :retryable
7
7
 
8
8
  def initialize(quoter, delegate_collector)
9
9
  @quoter = quoter