activerecord 6.0.0 → 7.2.3

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 (376) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +996 -594
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +34 -34
  5. data/examples/performance.rb +2 -2
  6. data/lib/active_record/aggregations.rb +22 -20
  7. data/lib/active_record/association_relation.rb +22 -12
  8. data/lib/active_record/associations/alias_tracker.rb +41 -30
  9. data/lib/active_record/associations/association.rb +106 -41
  10. data/lib/active_record/associations/association_scope.rb +30 -21
  11. data/lib/active_record/associations/belongs_to_association.rb +69 -14
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +20 -6
  13. data/lib/active_record/associations/builder/association.rb +39 -6
  14. data/lib/active_record/associations/builder/belongs_to.rb +47 -17
  15. data/lib/active_record/associations/builder/collection_association.rb +14 -6
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -10
  17. data/lib/active_record/associations/builder/has_many.rb +7 -3
  18. data/lib/active_record/associations/builder/has_one.rb +13 -16
  19. data/lib/active_record/associations/builder/singular_association.rb +7 -3
  20. data/lib/active_record/associations/collection_association.rb +90 -53
  21. data/lib/active_record/associations/collection_proxy.rb +54 -19
  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 +21 -1
  25. data/lib/active_record/associations/has_many_association.rb +41 -10
  26. data/lib/active_record/associations/has_many_through_association.rb +29 -12
  27. data/lib/active_record/associations/has_one_association.rb +33 -9
  28. data/lib/active_record/associations/has_one_through_association.rb +1 -1
  29. data/lib/active_record/associations/join_dependency/join_association.rb +41 -17
  30. data/lib/active_record/associations/join_dependency/join_part.rb +3 -3
  31. data/lib/active_record/associations/join_dependency.rb +97 -54
  32. data/lib/active_record/associations/nested_error.rb +47 -0
  33. data/lib/active_record/associations/preloader/association.rb +237 -54
  34. data/lib/active_record/associations/preloader/batch.rb +48 -0
  35. data/lib/active_record/associations/preloader/branch.rb +153 -0
  36. data/lib/active_record/associations/preloader/through_association.rb +51 -17
  37. data/lib/active_record/associations/preloader.rb +55 -121
  38. data/lib/active_record/associations/singular_association.rb +16 -4
  39. data/lib/active_record/associations/through_association.rb +26 -15
  40. data/lib/active_record/associations.rb +454 -440
  41. data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
  42. data/lib/active_record/attribute_assignment.rb +11 -14
  43. data/lib/active_record/attribute_methods/before_type_cast.rb +36 -11
  44. data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
  45. data/lib/active_record/attribute_methods/dirty.rb +75 -34
  46. data/lib/active_record/attribute_methods/primary_key.rb +53 -31
  47. data/lib/active_record/attribute_methods/query.rb +31 -22
  48. data/lib/active_record/attribute_methods/read.rb +16 -17
  49. data/lib/active_record/attribute_methods/serialization.rb +177 -35
  50. data/lib/active_record/attribute_methods/time_zone_conversion.rb +18 -15
  51. data/lib/active_record/attribute_methods/write.rb +16 -28
  52. data/lib/active_record/attribute_methods.rb +227 -100
  53. data/lib/active_record/attributes.rb +94 -56
  54. data/lib/active_record/autosave_association.rb +119 -73
  55. data/lib/active_record/base.rb +31 -21
  56. data/lib/active_record/callbacks.rb +168 -55
  57. data/lib/active_record/coders/column_serializer.rb +61 -0
  58. data/lib/active_record/coders/json.rb +1 -1
  59. data/lib/active_record/coders/yaml_column.rb +70 -25
  60. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +284 -0
  61. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +211 -0
  62. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +79 -0
  63. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +367 -565
  64. data/lib/active_record/connection_adapters/abstract/database_limits.rb +3 -57
  65. data/lib/active_record/connection_adapters/abstract/database_statements.rb +277 -89
  66. data/lib/active_record/connection_adapters/abstract/query_cache.rb +241 -69
  67. data/lib/active_record/connection_adapters/abstract/quoting.rb +122 -134
  68. data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -3
  69. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -116
  70. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +324 -72
  71. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +17 -4
  72. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +611 -211
  73. data/lib/active_record/connection_adapters/abstract/transaction.rb +425 -82
  74. data/lib/active_record/connection_adapters/abstract_adapter.rb +698 -211
  75. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +464 -239
  76. data/lib/active_record/connection_adapters/column.rb +28 -1
  77. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  78. data/lib/active_record/connection_adapters/mysql/column.rb +2 -1
  79. data/lib/active_record/connection_adapters/mysql/database_statements.rb +32 -137
  80. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
  81. data/lib/active_record/connection_adapters/mysql/quoting.rb +90 -43
  82. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +41 -7
  83. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +18 -1
  84. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +13 -4
  85. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +53 -15
  86. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
  87. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +152 -0
  88. data/lib/active_record/connection_adapters/mysql2_adapter.rb +127 -63
  89. data/lib/active_record/connection_adapters/pool_config.rb +83 -0
  90. data/lib/active_record/connection_adapters/pool_manager.rb +57 -0
  91. data/lib/active_record/connection_adapters/postgresql/column.rb +54 -2
  92. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +127 -100
  93. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -2
  94. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +9 -5
  95. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +10 -2
  96. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +15 -2
  97. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
  98. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +53 -15
  99. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -3
  101. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +5 -4
  103. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
  104. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -3
  105. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +35 -8
  106. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
  108. data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
  109. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +18 -6
  110. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +23 -4
  111. data/lib/active_record/connection_adapters/postgresql/oid.rb +4 -0
  112. data/lib/active_record/connection_adapters/postgresql/quoting.rb +139 -106
  113. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +30 -2
  114. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +98 -4
  115. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +176 -4
  116. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +78 -1
  117. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +462 -118
  118. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
  119. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -11
  120. data/lib/active_record/connection_adapters/postgresql_adapter.rb +585 -295
  121. data/lib/active_record/connection_adapters/schema_cache.rb +399 -60
  122. data/lib/active_record/connection_adapters/sql_type_metadata.rb +8 -0
  123. data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
  124. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +99 -48
  125. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +80 -54
  126. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +27 -1
  127. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +20 -0
  128. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +16 -0
  129. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +102 -24
  130. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +425 -174
  131. data/lib/active_record/connection_adapters/statement_pool.rb +7 -1
  132. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +99 -0
  133. data/lib/active_record/connection_adapters/trilogy_adapter.rb +229 -0
  134. data/lib/active_record/connection_adapters.rb +176 -0
  135. data/lib/active_record/connection_handling.rb +243 -115
  136. data/lib/active_record/core.rb +481 -199
  137. data/lib/active_record/counter_cache.rb +69 -32
  138. data/lib/active_record/database_configurations/connection_url_resolver.rb +107 -0
  139. data/lib/active_record/database_configurations/database_config.rb +77 -10
  140. data/lib/active_record/database_configurations/hash_config.rb +148 -26
  141. data/lib/active_record/database_configurations/url_config.rb +44 -45
  142. data/lib/active_record/database_configurations.rb +190 -114
  143. data/lib/active_record/delegated_type.rb +279 -0
  144. data/lib/active_record/deprecator.rb +7 -0
  145. data/lib/active_record/destroy_association_async_job.rb +38 -0
  146. data/lib/active_record/disable_joins_association_relation.rb +39 -0
  147. data/lib/active_record/dynamic_matchers.rb +5 -6
  148. data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
  149. data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
  150. data/lib/active_record/encryption/cipher.rb +53 -0
  151. data/lib/active_record/encryption/config.rb +68 -0
  152. data/lib/active_record/encryption/configurable.rb +60 -0
  153. data/lib/active_record/encryption/context.rb +42 -0
  154. data/lib/active_record/encryption/contexts.rb +76 -0
  155. data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
  156. data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
  157. data/lib/active_record/encryption/encryptable_record.rb +230 -0
  158. data/lib/active_record/encryption/encrypted_attribute_type.rb +175 -0
  159. data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
  160. data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
  161. data/lib/active_record/encryption/encryptor.rb +171 -0
  162. data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
  163. data/lib/active_record/encryption/errors.rb +15 -0
  164. data/lib/active_record/encryption/extended_deterministic_queries.rb +157 -0
  165. data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
  166. data/lib/active_record/encryption/key.rb +28 -0
  167. data/lib/active_record/encryption/key_generator.rb +53 -0
  168. data/lib/active_record/encryption/key_provider.rb +46 -0
  169. data/lib/active_record/encryption/message.rb +33 -0
  170. data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
  171. data/lib/active_record/encryption/message_serializer.rb +96 -0
  172. data/lib/active_record/encryption/null_encryptor.rb +25 -0
  173. data/lib/active_record/encryption/properties.rb +76 -0
  174. data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
  175. data/lib/active_record/encryption/scheme.rb +100 -0
  176. data/lib/active_record/encryption.rb +58 -0
  177. data/lib/active_record/enum.rb +224 -73
  178. data/lib/active_record/errors.rb +254 -36
  179. data/lib/active_record/explain.rb +30 -17
  180. data/lib/active_record/explain_registry.rb +11 -6
  181. data/lib/active_record/explain_subscriber.rb +2 -2
  182. data/lib/active_record/fixture_set/file.rb +22 -15
  183. data/lib/active_record/fixture_set/model_metadata.rb +15 -6
  184. data/lib/active_record/fixture_set/render_context.rb +3 -1
  185. data/lib/active_record/fixture_set/table_row.rb +88 -16
  186. data/lib/active_record/fixture_set/table_rows.rb +4 -5
  187. data/lib/active_record/fixtures.rb +229 -116
  188. data/lib/active_record/future_result.rb +178 -0
  189. data/lib/active_record/gem_version.rb +4 -4
  190. data/lib/active_record/inheritance.rb +121 -48
  191. data/lib/active_record/insert_all.rb +178 -29
  192. data/lib/active_record/integration.rb +16 -14
  193. data/lib/active_record/internal_metadata.rb +132 -21
  194. data/lib/active_record/legacy_yaml_adapter.rb +3 -36
  195. data/lib/active_record/locking/optimistic.rb +64 -33
  196. data/lib/active_record/locking/pessimistic.rb +21 -8
  197. data/lib/active_record/log_subscriber.rb +61 -30
  198. data/lib/active_record/marshalling.rb +59 -0
  199. data/lib/active_record/message_pack.rb +124 -0
  200. data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
  201. data/lib/active_record/middleware/database_selector/resolver.rb +19 -19
  202. data/lib/active_record/middleware/database_selector.rb +25 -13
  203. data/lib/active_record/middleware/shard_selector.rb +62 -0
  204. data/lib/active_record/migration/command_recorder.rb +160 -55
  205. data/lib/active_record/migration/compatibility.rb +286 -43
  206. data/lib/active_record/migration/default_strategy.rb +22 -0
  207. data/lib/active_record/migration/execution_strategy.rb +19 -0
  208. data/lib/active_record/migration/join_table.rb +1 -2
  209. data/lib/active_record/migration/pending_migration_connection.rb +21 -0
  210. data/lib/active_record/migration.rb +421 -193
  211. data/lib/active_record/model_schema.rb +217 -125
  212. data/lib/active_record/nested_attributes.rb +62 -27
  213. data/lib/active_record/no_touching.rb +4 -4
  214. data/lib/active_record/normalization.rb +163 -0
  215. data/lib/active_record/persistence.rb +322 -319
  216. data/lib/active_record/promise.rb +84 -0
  217. data/lib/active_record/query_cache.rb +18 -15
  218. data/lib/active_record/query_logs.rb +193 -0
  219. data/lib/active_record/query_logs_formatter.rb +41 -0
  220. data/lib/active_record/querying.rb +54 -14
  221. data/lib/active_record/railtie.rb +250 -72
  222. data/lib/active_record/railties/console_sandbox.rb +2 -4
  223. data/lib/active_record/railties/controller_runtime.rb +25 -11
  224. data/lib/active_record/railties/databases.rake +312 -197
  225. data/lib/active_record/railties/job_runtime.rb +23 -0
  226. data/lib/active_record/readonly_attributes.rb +45 -3
  227. data/lib/active_record/reflection.rb +389 -146
  228. data/lib/active_record/relation/batches/batch_enumerator.rb +61 -16
  229. data/lib/active_record/relation/batches.rb +214 -73
  230. data/lib/active_record/relation/calculations.rb +379 -124
  231. data/lib/active_record/relation/delegation.rb +36 -23
  232. data/lib/active_record/relation/finder_methods.rb +159 -49
  233. data/lib/active_record/relation/from_clause.rb +5 -1
  234. data/lib/active_record/relation/merger.rb +41 -33
  235. data/lib/active_record/relation/predicate_builder/array_handler.rb +10 -11
  236. data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -7
  237. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +20 -13
  238. data/lib/active_record/relation/predicate_builder/relation_handler.rb +5 -1
  239. data/lib/active_record/relation/predicate_builder.rb +79 -53
  240. data/lib/active_record/relation/query_attribute.rb +30 -12
  241. data/lib/active_record/relation/query_methods.rb +1156 -279
  242. data/lib/active_record/relation/record_fetch_warning.rb +12 -11
  243. data/lib/active_record/relation/spawn_methods.rb +10 -9
  244. data/lib/active_record/relation/where_clause.rb +100 -66
  245. data/lib/active_record/relation.rb +829 -194
  246. data/lib/active_record/result.rb +76 -56
  247. data/lib/active_record/runtime_registry.rb +71 -13
  248. data/lib/active_record/sanitization.rb +86 -47
  249. data/lib/active_record/schema.rb +39 -23
  250. data/lib/active_record/schema_dumper.rb +140 -33
  251. data/lib/active_record/schema_migration.rb +74 -29
  252. data/lib/active_record/scoping/default.rb +73 -19
  253. data/lib/active_record/scoping/named.rb +10 -28
  254. data/lib/active_record/scoping.rb +65 -35
  255. data/lib/active_record/secure_password.rb +60 -0
  256. data/lib/active_record/secure_token.rb +34 -8
  257. data/lib/active_record/serialization.rb +11 -4
  258. data/lib/active_record/signed_id.rb +138 -0
  259. data/lib/active_record/statement_cache.rb +26 -10
  260. data/lib/active_record/store.rb +19 -14
  261. data/lib/active_record/suppressor.rb +15 -17
  262. data/lib/active_record/table_metadata.rb +46 -36
  263. data/lib/active_record/tasks/database_tasks.rb +371 -205
  264. data/lib/active_record/tasks/mysql_database_tasks.rb +43 -36
  265. data/lib/active_record/tasks/postgresql_database_tasks.rb +54 -41
  266. data/lib/active_record/tasks/sqlite_database_tasks.rb +25 -13
  267. data/lib/active_record/test_databases.rb +5 -4
  268. data/lib/active_record/test_fixtures.rb +189 -104
  269. data/lib/active_record/testing/query_assertions.rb +121 -0
  270. data/lib/active_record/timestamp.rb +35 -25
  271. data/lib/active_record/token_for.rb +123 -0
  272. data/lib/active_record/touch_later.rb +31 -27
  273. data/lib/active_record/transaction.rb +132 -0
  274. data/lib/active_record/transactions.rb +131 -99
  275. data/lib/active_record/translation.rb +3 -5
  276. data/lib/active_record/type/adapter_specific_registry.rb +33 -18
  277. data/lib/active_record/type/hash_lookup_type_map.rb +34 -2
  278. data/lib/active_record/type/internal/timezone.rb +7 -2
  279. data/lib/active_record/type/serialized.rb +11 -6
  280. data/lib/active_record/type/time.rb +14 -0
  281. data/lib/active_record/type/type_map.rb +17 -21
  282. data/lib/active_record/type/unsigned_integer.rb +0 -1
  283. data/lib/active_record/type.rb +7 -2
  284. data/lib/active_record/type_caster/connection.rb +4 -5
  285. data/lib/active_record/type_caster/map.rb +8 -5
  286. data/lib/active_record/validations/absence.rb +1 -1
  287. data/lib/active_record/validations/associated.rb +13 -8
  288. data/lib/active_record/validations/numericality.rb +36 -0
  289. data/lib/active_record/validations/presence.rb +5 -28
  290. data/lib/active_record/validations/uniqueness.rb +88 -18
  291. data/lib/active_record/validations.rb +15 -8
  292. data/lib/active_record/version.rb +1 -1
  293. data/lib/active_record.rb +446 -40
  294. data/lib/arel/alias_predication.rb +1 -1
  295. data/lib/arel/attributes/attribute.rb +4 -8
  296. data/lib/arel/collectors/bind.rb +8 -1
  297. data/lib/arel/collectors/composite.rb +15 -0
  298. data/lib/arel/collectors/sql_string.rb +7 -0
  299. data/lib/arel/collectors/substitute_binds.rb +7 -0
  300. data/lib/arel/crud.rb +30 -22
  301. data/lib/arel/delete_manager.rb +23 -4
  302. data/lib/arel/errors.rb +10 -0
  303. data/lib/arel/factory_methods.rb +4 -0
  304. data/lib/arel/filter_predications.rb +9 -0
  305. data/lib/arel/insert_manager.rb +2 -3
  306. data/lib/arel/nodes/binary.rb +82 -9
  307. data/lib/arel/nodes/bind_param.rb +8 -0
  308. data/lib/arel/nodes/bound_sql_literal.rb +65 -0
  309. data/lib/arel/nodes/casted.rb +22 -10
  310. data/lib/arel/nodes/cte.rb +36 -0
  311. data/lib/arel/nodes/delete_statement.rb +14 -13
  312. data/lib/arel/nodes/equality.rb +6 -9
  313. data/lib/arel/nodes/filter.rb +10 -0
  314. data/lib/arel/nodes/fragments.rb +35 -0
  315. data/lib/arel/nodes/function.rb +1 -0
  316. data/lib/arel/nodes/grouping.rb +3 -0
  317. data/lib/arel/nodes/homogeneous_in.rb +68 -0
  318. data/lib/arel/nodes/in.rb +8 -1
  319. data/lib/arel/nodes/infix_operation.rb +13 -1
  320. data/lib/arel/nodes/insert_statement.rb +2 -2
  321. data/lib/arel/nodes/join_source.rb +1 -1
  322. data/lib/arel/nodes/leading_join.rb +8 -0
  323. data/lib/arel/nodes/{and.rb → nary.rb} +9 -2
  324. data/lib/arel/nodes/node.rb +122 -11
  325. data/lib/arel/nodes/ordering.rb +27 -0
  326. data/lib/arel/nodes/select_core.rb +2 -2
  327. data/lib/arel/nodes/select_statement.rb +2 -2
  328. data/lib/arel/nodes/sql_literal.rb +16 -0
  329. data/lib/arel/nodes/table_alias.rb +11 -3
  330. data/lib/arel/nodes/unary.rb +0 -1
  331. data/lib/arel/nodes/update_statement.rb +11 -4
  332. data/lib/arel/nodes.rb +10 -3
  333. data/lib/arel/predications.rb +31 -28
  334. data/lib/arel/select_manager.rb +18 -9
  335. data/lib/arel/table.rb +21 -10
  336. data/lib/arel/tree_manager.rb +8 -15
  337. data/lib/arel/update_manager.rb +25 -5
  338. data/lib/arel/visitors/dot.rb +94 -90
  339. data/lib/arel/visitors/mysql.rb +34 -6
  340. data/lib/arel/visitors/postgresql.rb +5 -16
  341. data/lib/arel/visitors/sqlite.rb +25 -1
  342. data/lib/arel/visitors/to_sql.rb +227 -81
  343. data/lib/arel/visitors/visitor.rb +2 -3
  344. data/lib/arel/visitors.rb +0 -7
  345. data/lib/arel.rb +37 -15
  346. data/lib/rails/generators/active_record/application_record/USAGE +8 -0
  347. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
  348. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
  349. data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
  350. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +6 -1
  351. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +4 -4
  352. data/lib/rails/generators/active_record/migration.rb +9 -3
  353. data/lib/rails/generators/active_record/model/USAGE +113 -0
  354. data/lib/rails/generators/active_record/model/model_generator.rb +49 -4
  355. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  356. data/lib/rails/generators/active_record/model/templates/model.rb.tt +1 -1
  357. data/lib/rails/generators/active_record/model/templates/module.rb.tt +2 -2
  358. data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
  359. data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
  360. metadata +117 -30
  361. data/lib/active_record/attribute_decorators.rb +0 -90
  362. data/lib/active_record/connection_adapters/connection_specification.rb +0 -297
  363. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
  364. data/lib/active_record/define_callbacks.rb +0 -22
  365. data/lib/active_record/null_relation.rb +0 -68
  366. data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
  367. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
  368. data/lib/active_record/relation/where_clause_factory.rb +0 -33
  369. data/lib/arel/attributes.rb +0 -22
  370. data/lib/arel/visitors/depth_first.rb +0 -204
  371. data/lib/arel/visitors/ibm_db.rb +0 -34
  372. data/lib/arel/visitors/informix.rb +0 -62
  373. data/lib/arel/visitors/mssql.rb +0 -157
  374. data/lib/arel/visitors/oracle.rb +0 -159
  375. data/lib/arel/visitors/oracle12.rb +0 -66
  376. data/lib/arel/visitors/where_sql.rb +0 -23
data/lib/active_record.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # Copyright (c) 2004-2019 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,35 +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"
36
+ require "active_record/errors"
34
37
 
38
+ # :include: ../README.rdoc
35
39
  module ActiveRecord
36
40
  extend ActiveSupport::Autoload
37
41
 
38
42
  autoload :Base
39
43
  autoload :Callbacks
40
- autoload :Core
41
44
  autoload :ConnectionHandling
45
+ autoload :Core
42
46
  autoload :CounterCache
47
+ autoload :DelegatedType
48
+ autoload :DestroyAssociationAsyncJob
43
49
  autoload :DynamicMatchers
50
+ autoload :Encryption
44
51
  autoload :Enum
45
- autoload :InternalMetadata
46
52
  autoload :Explain
53
+ autoload :FixtureSet, "active_record/fixtures"
47
54
  autoload :Inheritance
48
55
  autoload :Integration
56
+ autoload :InternalMetadata
57
+ autoload :LogSubscriber
58
+ autoload :Marshalling
49
59
  autoload :Migration
50
60
  autoload :Migrator, "active_record/migration"
51
61
  autoload :ModelSchema
52
62
  autoload :NestedAttributes
53
63
  autoload :NoTouching
54
- autoload :TouchLater
64
+ autoload :Normalization
55
65
  autoload :Persistence
56
66
  autoload :QueryCache
67
+ autoload :QueryLogs
57
68
  autoload :Querying
58
69
  autoload :ReadonlyAttributes
59
70
  autoload :RecordInvalid, "active_record/validations"
@@ -64,66 +75,72 @@ module ActiveRecord
64
75
  autoload :SchemaDumper
65
76
  autoload :SchemaMigration
66
77
  autoload :Scoping
78
+ autoload :SecurePassword
79
+ autoload :SecureToken
67
80
  autoload :Serialization
68
- autoload :StatementCache
81
+ autoload :SignedId
69
82
  autoload :Store
70
83
  autoload :Suppressor
84
+ autoload :TestDatabases
85
+ autoload :TestFixtures, "active_record/fixtures"
71
86
  autoload :Timestamp
87
+ autoload :TokenFor
88
+ autoload :TouchLater
72
89
  autoload :Transactions
73
90
  autoload :Translation
74
91
  autoload :Validations
75
- autoload :SecureToken
76
- autoload :DatabaseSelector, "active_record/middleware/database_selector"
77
92
 
78
93
  eager_autoload do
79
- autoload :ActiveRecordError, "active_record/errors"
80
- autoload :ConnectionNotEstablished, "active_record/errors"
81
- autoload :ConnectionAdapters, "active_record/connection_adapters/abstract_adapter"
82
-
83
94
  autoload :Aggregations
95
+ autoload :AssociationRelation
84
96
  autoload :Associations
97
+ autoload :AsynchronousQueriesTracker
85
98
  autoload :AttributeAssignment
86
99
  autoload :AttributeMethods
87
100
  autoload :AutosaveAssociation
88
-
101
+ autoload :ConnectionAdapters
102
+ autoload :DisableJoinsAssociationRelation
103
+ autoload :FutureResult
89
104
  autoload :LegacyYamlAdapter
90
-
105
+ autoload :Promise
91
106
  autoload :Relation
92
- autoload :AssociationRelation
93
- autoload :NullRelation
107
+ autoload :Result
108
+ autoload :StatementCache
109
+ autoload :TableMetadata
110
+ autoload :Transaction
111
+ autoload :Type
94
112
 
95
113
  autoload_under "relation" do
96
- autoload :QueryMethods
97
- autoload :FinderMethods
114
+ autoload :Batches
98
115
  autoload :Calculations
116
+ autoload :Delegation
117
+ autoload :FinderMethods
99
118
  autoload :PredicateBuilder
119
+ autoload :QueryMethods
100
120
  autoload :SpawnMethods
101
- autoload :Batches
102
- autoload :Delegation
103
121
  end
104
-
105
- autoload :Result
106
- autoload :TableMetadata
107
- autoload :Type
108
122
  end
109
123
 
110
124
  module Coders
111
- autoload :YAMLColumn, "active_record/coders/yaml_column"
125
+ autoload :ColumnSerializer, "active_record/coders/column_serializer"
112
126
  autoload :JSON, "active_record/coders/json"
127
+ autoload :YAMLColumn, "active_record/coders/yaml_column"
113
128
  end
114
129
 
115
130
  module AttributeMethods
116
131
  extend ActiveSupport::Autoload
117
132
 
133
+ autoload :CompositePrimaryKey
134
+
118
135
  eager_autoload do
119
136
  autoload :BeforeTypeCast
120
137
  autoload :Dirty
121
138
  autoload :PrimaryKey
122
139
  autoload :Query
123
140
  autoload :Read
141
+ autoload :Serialization
124
142
  autoload :TimeZoneConversion
125
143
  autoload :Write
126
- autoload :Serialization
127
144
  end
128
145
  end
129
146
 
@@ -136,41 +153,378 @@ module ActiveRecord
136
153
  end
137
154
  end
138
155
 
139
- module ConnectionAdapters
140
- extend ActiveSupport::Autoload
141
-
142
- eager_autoload do
143
- autoload :AbstractAdapter
144
- end
145
- end
146
-
147
156
  module Scoping
148
157
  extend ActiveSupport::Autoload
149
158
 
150
159
  eager_autoload do
151
- autoload :Named
152
160
  autoload :Default
161
+ autoload :Named
153
162
  end
154
163
  end
155
164
 
156
165
  module Middleware
157
166
  extend ActiveSupport::Autoload
158
167
 
159
- autoload :DatabaseSelector, "active_record/middleware/database_selector"
168
+ autoload :DatabaseSelector
169
+ autoload :ShardSelector
160
170
  end
161
171
 
162
172
  module Tasks
163
173
  extend ActiveSupport::Autoload
164
174
 
165
175
  autoload :DatabaseTasks
166
- autoload :SQLiteDatabaseTasks, "active_record/tasks/sqlite_database_tasks"
167
176
  autoload :MySQLDatabaseTasks, "active_record/tasks/mysql_database_tasks"
168
- autoload :PostgreSQLDatabaseTasks,
169
- "active_record/tasks/postgresql_database_tasks"
177
+ autoload :PostgreSQLDatabaseTasks, "active_record/tasks/postgresql_database_tasks"
178
+ autoload :SQLiteDatabaseTasks, "active_record/tasks/sqlite_database_tasks"
170
179
  end
171
180
 
172
- autoload :TestDatabases, "active_record/test_databases"
173
- 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
+ )
174
528
 
175
529
  def self.eager_load!
176
530
  super
@@ -179,6 +533,57 @@ module ActiveRecord
179
533
  ActiveRecord::Associations.eager_load!
180
534
  ActiveRecord::AttributeMethods.eager_load!
181
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
182
587
  end
183
588
  end
184
589
 
@@ -193,3 +598,4 @@ end
193
598
  YAML.load_tags["!ruby/object:ActiveRecord::AttributeSet"] = "ActiveModel::AttributeSet"
194
599
  YAML.load_tags["!ruby/object:ActiveRecord::Attribute::FromDatabase"] = "ActiveModel::Attribute::FromDatabase"
195
600
  YAML.load_tags["!ruby/object:ActiveRecord::LazyAttributeHash"] = "ActiveModel::LazyAttributeHash"
601
+ YAML.load_tags["!ruby/object:ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString"] = "ActiveRecord::Type::String"
@@ -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
@@ -9,6 +9,10 @@ module Arel # :nodoc: all
9
9
  include Arel::OrderPredications
10
10
  include Arel::Math
11
11
 
12
+ def type_caster
13
+ relation.type_for_attribute(name)
14
+ end
15
+
12
16
  ###
13
17
  # Create a node for lowering this attribute
14
18
  def lower
@@ -23,14 +27,6 @@ module Arel # :nodoc: all
23
27
  relation.able_to_type_cast?
24
28
  end
25
29
  end
26
-
27
- class String < Attribute; end
28
- class Time < Attribute; end
29
- class Boolean < Attribute; end
30
- class Decimal < Attribute; end
31
- class Float < Attribute; end
32
- class Integer < Attribute; end
33
- class Undefined < Attribute; end
34
30
  end
35
31
 
36
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
@@ -11,11 +13,16 @@ module Arel # :nodoc: all
11
13
  self
12
14
  end
13
15
 
14
- def add_bind(bind)
16
+ def add_bind(bind, &block)
15
17
  @binds << bind
16
18
  self
17
19
  end
18
20
 
21
+ def add_binds(binds, proc_for_binds = nil)
22
+ @binds.concat proc_for_binds ? binds.map(&proc_for_binds) : binds
23
+ self
24
+ end
25
+
19
26
  def value
20
27
  @binds
21
28
  end
@@ -3,11 +3,20 @@
3
3
  module Arel # :nodoc: all
4
4
  module Collectors
5
5
  class Composite
6
+ attr_accessor :preparable
7
+ attr_reader :retryable
8
+
6
9
  def initialize(left, right)
7
10
  @left = left
8
11
  @right = right
9
12
  end
10
13
 
14
+ def retryable=(retryable)
15
+ left.retryable = retryable
16
+ right.retryable = retryable
17
+ @retryable = retryable
18
+ end
19
+
11
20
  def <<(str)
12
21
  left << str
13
22
  right << str
@@ -20,6 +29,12 @@ module Arel # :nodoc: all
20
29
  self
21
30
  end
22
31
 
32
+ def add_binds(binds, proc_for_binds = nil, &block)
33
+ left.add_binds(binds, proc_for_binds, &block)
34
+ right.add_binds(binds, proc_for_binds, &block)
35
+ self
36
+ end
37
+
23
38
  def value
24
39
  [left.value, right.value]
25
40
  end