activerecord 5.0.7.2 → 6.0.3.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (359) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +708 -2040
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +9 -7
  5. data/examples/performance.rb +31 -29
  6. data/examples/simple.rb +5 -3
  7. data/lib/active_record.rb +37 -22
  8. data/lib/active_record/advisory_lock_base.rb +18 -0
  9. data/lib/active_record/aggregations.rb +249 -247
  10. data/lib/active_record/association_relation.rb +18 -14
  11. data/lib/active_record/associations.rb +1603 -1592
  12. data/lib/active_record/associations/alias_tracker.rb +24 -34
  13. data/lib/active_record/associations/association.rb +114 -55
  14. data/lib/active_record/associations/association_scope.rb +94 -94
  15. data/lib/active_record/associations/belongs_to_association.rb +58 -42
  16. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  17. data/lib/active_record/associations/builder/association.rb +18 -25
  18. data/lib/active_record/associations/builder/belongs_to.rb +43 -54
  19. data/lib/active_record/associations/builder/collection_association.rb +7 -18
  20. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +41 -62
  21. data/lib/active_record/associations/builder/has_many.rb +4 -0
  22. data/lib/active_record/associations/builder/has_one.rb +37 -1
  23. data/lib/active_record/associations/builder/singular_association.rb +4 -0
  24. data/lib/active_record/associations/collection_association.rb +86 -254
  25. data/lib/active_record/associations/collection_proxy.rb +158 -122
  26. data/lib/active_record/associations/foreign_association.rb +9 -0
  27. data/lib/active_record/associations/has_many_association.rb +23 -30
  28. data/lib/active_record/associations/has_many_through_association.rb +58 -44
  29. data/lib/active_record/associations/has_one_association.rb +59 -54
  30. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  31. data/lib/active_record/associations/join_dependency.rb +143 -176
  32. data/lib/active_record/associations/join_dependency/join_association.rb +38 -87
  33. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  34. data/lib/active_record/associations/join_dependency/join_part.rb +12 -12
  35. data/lib/active_record/associations/preloader.rb +90 -103
  36. data/lib/active_record/associations/preloader/association.rb +86 -100
  37. data/lib/active_record/associations/preloader/through_association.rb +77 -76
  38. data/lib/active_record/associations/singular_association.rb +12 -45
  39. data/lib/active_record/associations/through_association.rb +26 -14
  40. data/lib/active_record/attribute_assignment.rb +54 -61
  41. data/lib/active_record/attribute_decorators.rb +38 -17
  42. data/lib/active_record/attribute_methods.rb +66 -106
  43. data/lib/active_record/attribute_methods/before_type_cast.rb +12 -8
  44. data/lib/active_record/attribute_methods/dirty.rb +179 -109
  45. data/lib/active_record/attribute_methods/primary_key.rb +85 -92
  46. data/lib/active_record/attribute_methods/query.rb +4 -3
  47. data/lib/active_record/attribute_methods/read.rb +20 -49
  48. data/lib/active_record/attribute_methods/serialization.rb +29 -7
  49. data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -66
  50. data/lib/active_record/attribute_methods/write.rb +34 -33
  51. data/lib/active_record/attributes.rb +38 -25
  52. data/lib/active_record/autosave_association.rb +54 -35
  53. data/lib/active_record/base.rb +27 -24
  54. data/lib/active_record/callbacks.rb +64 -35
  55. data/lib/active_record/coders/json.rb +2 -0
  56. data/lib/active_record/coders/yaml_column.rb +11 -12
  57. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +552 -323
  58. data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
  59. data/lib/active_record/connection_adapters/abstract/database_statements.rb +215 -94
  60. data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -35
  61. data/lib/active_record/connection_adapters/abstract/quoting.rb +119 -75
  62. data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
  63. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -28
  64. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +228 -147
  65. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  66. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +400 -213
  67. data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -79
  68. data/lib/active_record/connection_adapters/abstract_adapter.rb +367 -202
  69. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +396 -562
  70. data/lib/active_record/connection_adapters/column.rb +41 -13
  71. data/lib/active_record/connection_adapters/connection_specification.rb +172 -139
  72. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
  73. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  74. data/lib/active_record/connection_adapters/mysql/database_statements.rb +137 -49
  75. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
  76. data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
  77. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
  78. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
  79. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
  80. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  81. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
  82. data/lib/active_record/connection_adapters/mysql2_adapter.rb +48 -30
  83. data/lib/active_record/connection_adapters/postgresql/column.rb +19 -31
  84. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -54
  85. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  86. data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
  87. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
  88. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  89. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +4 -2
  94. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  95. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
  96. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
  97. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  99. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
  101. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  102. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
  103. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +34 -31
  104. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  105. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  106. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +8 -4
  107. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  108. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  109. data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
  110. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +20 -26
  111. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  112. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  113. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
  114. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +378 -308
  115. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
  116. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
  117. data/lib/active_record/connection_adapters/postgresql_adapter.rb +383 -275
  118. data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
  119. data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
  120. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
  121. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
  122. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
  123. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
  124. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  126. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  127. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +259 -266
  128. data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
  129. data/lib/active_record/connection_handling.rb +143 -40
  130. data/lib/active_record/core.rb +201 -163
  131. data/lib/active_record/counter_cache.rb +60 -28
  132. data/lib/active_record/database_configurations.rb +233 -0
  133. data/lib/active_record/database_configurations/database_config.rb +37 -0
  134. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  135. data/lib/active_record/database_configurations/url_config.rb +78 -0
  136. data/lib/active_record/define_callbacks.rb +22 -0
  137. data/lib/active_record/dynamic_matchers.rb +87 -87
  138. data/lib/active_record/enum.rb +60 -23
  139. data/lib/active_record/errors.rb +114 -18
  140. data/lib/active_record/explain.rb +4 -4
  141. data/lib/active_record/explain_registry.rb +3 -1
  142. data/lib/active_record/explain_subscriber.rb +9 -4
  143. data/lib/active_record/fixture_set/file.rb +13 -8
  144. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  145. data/lib/active_record/fixture_set/render_context.rb +17 -0
  146. data/lib/active_record/fixture_set/table_row.rb +152 -0
  147. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  148. data/lib/active_record/fixtures.rb +194 -504
  149. data/lib/active_record/gem_version.rb +5 -3
  150. data/lib/active_record/inheritance.rb +150 -99
  151. data/lib/active_record/insert_all.rb +179 -0
  152. data/lib/active_record/integration.rb +116 -25
  153. data/lib/active_record/internal_metadata.rb +16 -19
  154. data/lib/active_record/legacy_yaml_adapter.rb +4 -2
  155. data/lib/active_record/locking/optimistic.rb +77 -87
  156. data/lib/active_record/locking/pessimistic.rb +18 -6
  157. data/lib/active_record/log_subscriber.rb +48 -29
  158. data/lib/active_record/middleware/database_selector.rb +74 -0
  159. data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
  160. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  161. data/lib/active_record/migration.rb +369 -302
  162. data/lib/active_record/migration/command_recorder.rb +134 -100
  163. data/lib/active_record/migration/compatibility.rb +174 -56
  164. data/lib/active_record/migration/join_table.rb +8 -7
  165. data/lib/active_record/model_schema.rb +131 -127
  166. data/lib/active_record/nested_attributes.rb +213 -202
  167. data/lib/active_record/no_touching.rb +12 -3
  168. data/lib/active_record/null_relation.rb +12 -34
  169. data/lib/active_record/persistence.rb +446 -77
  170. data/lib/active_record/query_cache.rb +13 -12
  171. data/lib/active_record/querying.rb +37 -24
  172. data/lib/active_record/railtie.rb +128 -36
  173. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  174. data/lib/active_record/railties/console_sandbox.rb +2 -0
  175. data/lib/active_record/railties/controller_runtime.rb +34 -33
  176. data/lib/active_record/railties/databases.rake +312 -177
  177. data/lib/active_record/readonly_attributes.rb +5 -4
  178. data/lib/active_record/reflection.rb +214 -252
  179. data/lib/active_record/relation.rb +440 -318
  180. data/lib/active_record/relation/batches.rb +98 -52
  181. data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
  182. data/lib/active_record/relation/calculations.rb +212 -173
  183. data/lib/active_record/relation/delegation.rb +72 -69
  184. data/lib/active_record/relation/finder_methods.rb +207 -247
  185. data/lib/active_record/relation/from_clause.rb +6 -8
  186. data/lib/active_record/relation/merger.rb +78 -62
  187. data/lib/active_record/relation/predicate_builder.rb +83 -105
  188. data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
  189. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  190. data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
  191. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  192. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  193. data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
  194. data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
  195. data/lib/active_record/relation/query_attribute.rb +33 -2
  196. data/lib/active_record/relation/query_methods.rb +476 -334
  197. data/lib/active_record/relation/record_fetch_warning.rb +5 -3
  198. data/lib/active_record/relation/spawn_methods.rb +8 -8
  199. data/lib/active_record/relation/where_clause.rb +111 -96
  200. data/lib/active_record/relation/where_clause_factory.rb +6 -11
  201. data/lib/active_record/result.rb +69 -40
  202. data/lib/active_record/runtime_registry.rb +5 -3
  203. data/lib/active_record/sanitization.rb +83 -99
  204. data/lib/active_record/schema.rb +7 -14
  205. data/lib/active_record/schema_dumper.rb +71 -69
  206. data/lib/active_record/schema_migration.rb +16 -6
  207. data/lib/active_record/scoping.rb +20 -20
  208. data/lib/active_record/scoping/default.rb +92 -95
  209. data/lib/active_record/scoping/named.rb +47 -27
  210. data/lib/active_record/secure_token.rb +4 -2
  211. data/lib/active_record/serialization.rb +2 -0
  212. data/lib/active_record/statement_cache.rb +63 -28
  213. data/lib/active_record/store.rb +121 -41
  214. data/lib/active_record/suppressor.rb +6 -3
  215. data/lib/active_record/table_metadata.rb +39 -18
  216. data/lib/active_record/tasks/database_tasks.rb +271 -81
  217. data/lib/active_record/tasks/mysql_database_tasks.rb +54 -91
  218. data/lib/active_record/tasks/postgresql_database_tasks.rb +77 -47
  219. data/lib/active_record/tasks/sqlite_database_tasks.rb +33 -16
  220. data/lib/active_record/test_databases.rb +23 -0
  221. data/lib/active_record/test_fixtures.rb +225 -0
  222. data/lib/active_record/timestamp.rb +70 -36
  223. data/lib/active_record/touch_later.rb +8 -6
  224. data/lib/active_record/transactions.rb +141 -157
  225. data/lib/active_record/translation.rb +3 -1
  226. data/lib/active_record/type.rb +23 -18
  227. data/lib/active_record/type/adapter_specific_registry.rb +44 -48
  228. data/lib/active_record/type/date.rb +2 -0
  229. data/lib/active_record/type/date_time.rb +2 -0
  230. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  231. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  232. data/lib/active_record/type/internal/timezone.rb +2 -0
  233. data/lib/active_record/type/json.rb +30 -0
  234. data/lib/active_record/type/serialized.rb +16 -9
  235. data/lib/active_record/type/text.rb +11 -0
  236. data/lib/active_record/type/time.rb +2 -1
  237. data/lib/active_record/type/type_map.rb +14 -17
  238. data/lib/active_record/type/unsigned_integer.rb +16 -0
  239. data/lib/active_record/type_caster.rb +4 -2
  240. data/lib/active_record/type_caster/connection.rb +17 -12
  241. data/lib/active_record/type_caster/map.rb +5 -4
  242. data/lib/active_record/validations.rb +7 -5
  243. data/lib/active_record/validations/absence.rb +2 -0
  244. data/lib/active_record/validations/associated.rb +4 -3
  245. data/lib/active_record/validations/length.rb +2 -0
  246. data/lib/active_record/validations/presence.rb +4 -2
  247. data/lib/active_record/validations/uniqueness.rb +29 -42
  248. data/lib/active_record/version.rb +3 -1
  249. data/lib/arel.rb +62 -0
  250. data/lib/arel/alias_predication.rb +9 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/attributes/attribute.rb +37 -0
  253. data/lib/arel/collectors/bind.rb +24 -0
  254. data/lib/arel/collectors/composite.rb +31 -0
  255. data/lib/arel/collectors/plain_string.rb +20 -0
  256. data/lib/arel/collectors/sql_string.rb +20 -0
  257. data/lib/arel/collectors/substitute_binds.rb +28 -0
  258. data/lib/arel/crud.rb +42 -0
  259. data/lib/arel/delete_manager.rb +18 -0
  260. data/lib/arel/errors.rb +9 -0
  261. data/lib/arel/expressions.rb +29 -0
  262. data/lib/arel/factory_methods.rb +49 -0
  263. data/lib/arel/insert_manager.rb +49 -0
  264. data/lib/arel/math.rb +45 -0
  265. data/lib/arel/nodes.rb +68 -0
  266. data/lib/arel/nodes/and.rb +32 -0
  267. data/lib/arel/nodes/ascending.rb +23 -0
  268. data/lib/arel/nodes/binary.rb +52 -0
  269. data/lib/arel/nodes/bind_param.rb +36 -0
  270. data/lib/arel/nodes/case.rb +55 -0
  271. data/lib/arel/nodes/casted.rb +50 -0
  272. data/lib/arel/nodes/comment.rb +29 -0
  273. data/lib/arel/nodes/count.rb +12 -0
  274. data/lib/arel/nodes/delete_statement.rb +45 -0
  275. data/lib/arel/nodes/descending.rb +23 -0
  276. data/lib/arel/nodes/equality.rb +18 -0
  277. data/lib/arel/nodes/extract.rb +24 -0
  278. data/lib/arel/nodes/false.rb +16 -0
  279. data/lib/arel/nodes/full_outer_join.rb +8 -0
  280. data/lib/arel/nodes/function.rb +44 -0
  281. data/lib/arel/nodes/grouping.rb +8 -0
  282. data/lib/arel/nodes/in.rb +8 -0
  283. data/lib/arel/nodes/infix_operation.rb +80 -0
  284. data/lib/arel/nodes/inner_join.rb +8 -0
  285. data/lib/arel/nodes/insert_statement.rb +37 -0
  286. data/lib/arel/nodes/join_source.rb +20 -0
  287. data/lib/arel/nodes/matches.rb +18 -0
  288. data/lib/arel/nodes/named_function.rb +23 -0
  289. data/lib/arel/nodes/node.rb +50 -0
  290. data/lib/arel/nodes/node_expression.rb +13 -0
  291. data/lib/arel/nodes/outer_join.rb +8 -0
  292. data/lib/arel/nodes/over.rb +15 -0
  293. data/lib/arel/nodes/regexp.rb +16 -0
  294. data/lib/arel/nodes/right_outer_join.rb +8 -0
  295. data/lib/arel/nodes/select_core.rb +67 -0
  296. data/lib/arel/nodes/select_statement.rb +41 -0
  297. data/lib/arel/nodes/sql_literal.rb +16 -0
  298. data/lib/arel/nodes/string_join.rb +11 -0
  299. data/lib/arel/nodes/table_alias.rb +27 -0
  300. data/lib/arel/nodes/terminal.rb +16 -0
  301. data/lib/arel/nodes/true.rb +16 -0
  302. data/lib/arel/nodes/unary.rb +45 -0
  303. data/lib/arel/nodes/unary_operation.rb +20 -0
  304. data/lib/arel/nodes/unqualified_column.rb +22 -0
  305. data/lib/arel/nodes/update_statement.rb +41 -0
  306. data/lib/arel/nodes/values_list.rb +9 -0
  307. data/lib/arel/nodes/window.rb +126 -0
  308. data/lib/arel/nodes/with.rb +11 -0
  309. data/lib/arel/order_predications.rb +13 -0
  310. data/lib/arel/predications.rb +256 -0
  311. data/lib/arel/select_manager.rb +271 -0
  312. data/lib/arel/table.rb +110 -0
  313. data/lib/arel/tree_manager.rb +72 -0
  314. data/lib/arel/update_manager.rb +34 -0
  315. data/lib/arel/visitors.rb +20 -0
  316. data/lib/arel/visitors/depth_first.rb +203 -0
  317. data/lib/arel/visitors/dot.rb +296 -0
  318. data/lib/arel/visitors/ibm_db.rb +34 -0
  319. data/lib/arel/visitors/informix.rb +62 -0
  320. data/lib/arel/visitors/mssql.rb +156 -0
  321. data/lib/arel/visitors/mysql.rb +83 -0
  322. data/lib/arel/visitors/oracle.rb +158 -0
  323. data/lib/arel/visitors/oracle12.rb +65 -0
  324. data/lib/arel/visitors/postgresql.rb +109 -0
  325. data/lib/arel/visitors/sqlite.rb +38 -0
  326. data/lib/arel/visitors/to_sql.rb +888 -0
  327. data/lib/arel/visitors/visitor.rb +45 -0
  328. data/lib/arel/visitors/where_sql.rb +22 -0
  329. data/lib/arel/window_predications.rb +9 -0
  330. data/lib/rails/generators/active_record.rb +7 -5
  331. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  332. data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  333. data/lib/rails/generators/active_record/migration.rb +17 -3
  334. data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
  335. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
  336. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
  337. data/lib/rails/generators/active_record/model/model_generator.rb +9 -30
  338. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  339. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  340. metadata +137 -52
  341. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  342. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  343. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  344. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  345. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  346. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  347. data/lib/active_record/associations/preloader/singular_association.rb +0 -20
  348. data/lib/active_record/attribute.rb +0 -213
  349. data/lib/active_record/attribute/user_provided_default.rb +0 -28
  350. data/lib/active_record/attribute_mutation_tracker.rb +0 -70
  351. data/lib/active_record/attribute_set.rb +0 -110
  352. data/lib/active_record/attribute_set/builder.rb +0 -132
  353. data/lib/active_record/collection_cache_key.rb +0 -50
  354. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  355. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  356. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  357. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  358. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  359. data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -1,21 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  # :stopdoc:
3
5
  module ConnectionAdapters
4
6
  # An abstract definition of a column in a table.
5
7
  class Column
6
- attr_reader :name, :default, :sql_type_metadata, :null, :table_name, :default_function, :collation, :comment
8
+ attr_reader :name, :default, :sql_type_metadata, :null, :default_function, :collation, :comment
7
9
 
8
10
  delegate :precision, :scale, :limit, :type, :sql_type, to: :sql_type_metadata, allow_nil: true
9
11
 
10
12
  # Instantiates a new column in the table.
11
13
  #
12
- # +name+ is the column's name, such as <tt>supplier_id</tt> in <tt>supplier_id int</tt>.
14
+ # +name+ is the column's name, such as <tt>supplier_id</tt> in <tt>supplier_id bigint</tt>.
13
15
  # +default+ is the type-casted default value, such as +new+ in <tt>sales_stage varchar(20) default 'new'</tt>.
14
16
  # +sql_type_metadata+ is various information about the type of the column
15
17
  # +null+ determines if this column allows +NULL+ values.
16
- def initialize(name, default, sql_type_metadata = nil, null = true, table_name = nil, default_function = nil, collation = nil, comment: nil, **)
18
+ def initialize(name, default, sql_type_metadata = nil, null = true, default_function = nil, collation: nil, comment: nil, **)
17
19
  @name = name.freeze
18
- @table_name = table_name
19
20
  @sql_type_metadata = sql_type_metadata
20
21
  @null = null
21
22
  @default = default
@@ -29,7 +30,7 @@ module ActiveRecord
29
30
  end
30
31
 
31
32
  def bigint?
32
- /\Abigint\b/ === sql_type
33
+ /\Abigint\b/.match?(sql_type)
33
34
  end
34
35
 
35
36
  # Returns the human name of the column name.
@@ -40,20 +41,47 @@ module ActiveRecord
40
41
  Base.human_attribute_name(@name)
41
42
  end
42
43
 
44
+ def init_with(coder)
45
+ @name = coder["name"]
46
+ @sql_type_metadata = coder["sql_type_metadata"]
47
+ @null = coder["null"]
48
+ @default = coder["default"]
49
+ @default_function = coder["default_function"]
50
+ @collation = coder["collation"]
51
+ @comment = coder["comment"]
52
+ end
53
+
54
+ def encode_with(coder)
55
+ coder["name"] = @name
56
+ coder["sql_type_metadata"] = @sql_type_metadata
57
+ coder["null"] = @null
58
+ coder["default"] = @default
59
+ coder["default_function"] = @default_function
60
+ coder["collation"] = @collation
61
+ coder["comment"] = @comment
62
+ end
63
+
43
64
  def ==(other)
44
65
  other.is_a?(Column) &&
45
- attributes_for_hash == other.attributes_for_hash
66
+ name == other.name &&
67
+ default == other.default &&
68
+ sql_type_metadata == other.sql_type_metadata &&
69
+ null == other.null &&
70
+ default_function == other.default_function &&
71
+ collation == other.collation &&
72
+ comment == other.comment
46
73
  end
47
74
  alias :eql? :==
48
75
 
49
76
  def hash
50
- attributes_for_hash.hash
51
- end
52
-
53
- protected
54
-
55
- def attributes_for_hash
56
- [self.class, name, default, sql_type_metadata, null, table_name, default_function, collation]
77
+ Column.hash ^
78
+ name.hash ^
79
+ default.hash ^
80
+ sql_type_metadata.hash ^
81
+ null.hash ^
82
+ default_function.hash ^
83
+ collation.hash ^
84
+ comment.hash
57
85
  end
58
86
  end
59
87
 
@@ -1,4 +1,6 @@
1
- require 'uri'
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
2
4
 
3
5
  module ActiveRecord
4
6
  module ConnectionAdapters
@@ -13,9 +15,12 @@ module ActiveRecord
13
15
  @config = original.config.dup
14
16
  end
15
17
 
18
+ def to_hash
19
+ @config.merge(name: @name)
20
+ end
21
+
16
22
  # Expands a connection string into a hash.
17
23
  class ConnectionUrlResolver # :nodoc:
18
-
19
24
  # == Example
20
25
  #
21
26
  # url = "postgresql://foo:bar@localhost:9000/foo_test?pool=5&timeout=3000"
@@ -33,11 +38,11 @@ module ActiveRecord
33
38
  def initialize(url)
34
39
  raise "Database URL cannot be empty" if url.blank?
35
40
  @uri = uri_parser.parse(url)
36
- @adapter = @uri.scheme && @uri.scheme.tr('-', '_')
41
+ @adapter = @uri.scheme && @uri.scheme.tr("-", "_")
37
42
  @adapter = "postgresql" if @adapter == "postgres"
38
43
 
39
44
  if @uri.opaque
40
- @uri.opaque, @query = @uri.opaque.split('?', 2)
45
+ @uri.opaque, @query = @uri.opaque.split("?", 2)
41
46
  else
42
47
  @query = @uri.query
43
48
  end
@@ -45,65 +50,62 @@ module ActiveRecord
45
50
 
46
51
  # Converts the given URL to a full connection hash.
47
52
  def to_hash
48
- config = raw_config.reject { |_,value| value.blank? }
49
- config.map { |key,value| config[key] = uri_parser.unescape(value) if value.is_a? String }
53
+ config = raw_config.reject { |_, value| value.blank? }
54
+ config.map { |key, value| config[key] = uri_parser.unescape(value) if value.is_a? String }
50
55
  config
51
56
  end
52
57
 
53
58
  private
59
+ attr_reader :uri
54
60
 
55
- def uri
56
- @uri
57
- end
58
-
59
- def uri_parser
60
- @uri_parser ||= URI::Parser.new
61
- end
61
+ def uri_parser
62
+ @uri_parser ||= URI::Parser.new
63
+ end
62
64
 
63
- # Converts the query parameters of the URI into a hash.
64
- #
65
- # "localhost?pool=5&reaping_frequency=2"
66
- # # => { "pool" => "5", "reaping_frequency" => "2" }
67
- #
68
- # returns empty hash if no query present.
69
- #
70
- # "localhost"
71
- # # => {}
72
- def query_hash
73
- Hash[(@query || '').split("&").map { |pair| pair.split("=") }]
74
- end
65
+ # Converts the query parameters of the URI into a hash.
66
+ #
67
+ # "localhost?pool=5&reaping_frequency=2"
68
+ # # => { "pool" => "5", "reaping_frequency" => "2" }
69
+ #
70
+ # returns empty hash if no query present.
71
+ #
72
+ # "localhost"
73
+ # # => {}
74
+ def query_hash
75
+ Hash[(@query || "").split("&").map { |pair| pair.split("=", 2) }]
76
+ end
75
77
 
76
- def raw_config
77
- if uri.opaque
78
- query_hash.merge({
79
- "adapter" => @adapter,
80
- "database" => uri.opaque })
81
- else
82
- query_hash.merge({
83
- "adapter" => @adapter,
84
- "username" => uri.user,
85
- "password" => uri.password,
86
- "port" => uri.port,
87
- "database" => database_from_path,
88
- "host" => uri.hostname })
78
+ def raw_config
79
+ if uri.opaque
80
+ query_hash.merge(
81
+ "adapter" => @adapter,
82
+ "database" => uri.opaque)
83
+ else
84
+ query_hash.merge(
85
+ "adapter" => @adapter,
86
+ "username" => uri.user,
87
+ "password" => uri.password,
88
+ "port" => uri.port,
89
+ "database" => database_from_path,
90
+ "host" => uri.hostname)
91
+ end
89
92
  end
90
- end
91
93
 
92
- # Returns name of the database.
93
- def database_from_path
94
- if @adapter == 'sqlite3'
95
- # 'sqlite3:/foo' is absolute, because that makes sense. The
96
- # corresponding relative version, 'sqlite3:foo', is handled
97
- # elsewhere, as an "opaque".
94
+ # Returns name of the database.
95
+ def database_from_path
96
+ if @adapter == "sqlite3"
97
+ # 'sqlite3:/foo' is absolute, because that makes sense. The
98
+ # corresponding relative version, 'sqlite3:foo', is handled
99
+ # elsewhere, as an "opaque".
98
100
 
99
- uri.path
100
- else
101
- # Only SQLite uses a filename as the "database" name; for
102
- # anything else, a leading slash would be silly.
101
+ uri.path
102
+ else
103
+ # Only SQLite uses a filename as the "database" name; for
104
+ # anything else, a leading slash would be silly.
103
105
 
104
- uri.path.sub(%r{^/}, "")
106
+ uri.path.sub(%r{^/}, "")
107
+ end
105
108
  end
106
- end
107
109
  end
108
110
 
109
111
  ##
@@ -111,8 +113,7 @@ module ActiveRecord
111
113
  class Resolver # :nodoc:
112
114
  attr_reader :configurations
113
115
 
114
- # Accepts a hash two layers deep, keys on the first layer represent
115
- # environments such as "production". Keys must be strings.
116
+ # Accepts a list of db config objects.
116
117
  def initialize(configurations)
117
118
  @configurations = configurations
118
119
  end
@@ -133,25 +134,14 @@ module ActiveRecord
133
134
  # Resolver.new(configurations).resolve(:production)
134
135
  # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
135
136
  #
136
- def resolve(config)
137
- if config
138
- resolve_connection config
139
- elsif env = ActiveRecord::ConnectionHandling::RAILS_ENV.call
140
- resolve_symbol_connection env.to_sym
137
+ def resolve(config_or_env, pool_name = nil)
138
+ if config_or_env
139
+ resolve_connection config_or_env, pool_name
141
140
  else
142
141
  raise AdapterNotSpecified
143
142
  end
144
143
  end
145
144
 
146
- # Expands each key in @configurations hash into fully resolved hash
147
- def resolve_all
148
- config = configurations.dup
149
- config.each do |key, value|
150
- config[key] = resolve(value) if value
151
- end
152
- config
153
- end
154
-
155
145
  # Returns an instance of ConnectionSpecification for a given adapter.
156
146
  # Accepts a hash one layer deep that contains all connection information.
157
147
  #
@@ -164,99 +154,142 @@ module ActiveRecord
164
154
  # spec.config
165
155
  # # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" }
166
156
  #
167
- def spec(config, name = nil)
168
- spec = resolve(config).symbolize_keys
157
+ def spec(config)
158
+ pool_name = config if config.is_a?(Symbol)
159
+
160
+ spec = resolve(config, pool_name).symbolize_keys
169
161
 
170
162
  raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)
171
163
 
164
+ # Require the adapter itself and give useful feedback about
165
+ # 1. Missing adapter gems and
166
+ # 2. Adapter gems' missing dependencies.
172
167
  path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter"
173
168
  begin
174
169
  require path_to_adapter
175
- rescue Gem::LoadError => e
176
- raise Gem::LoadError, "Specified '#{spec[:adapter]}' for database adapter, but the gem is not loaded. Add `gem '#{e.name}'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord)."
177
170
  rescue LoadError => e
178
- raise LoadError, "Could not load '#{path_to_adapter}'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile.", e.backtrace
171
+ # We couldn't require the adapter itself. Raise an exception that
172
+ # points out config typos and missing gems.
173
+ if e.path == path_to_adapter
174
+ # We can assume that a non-builtin adapter was specified, so it's
175
+ # either misspelled or missing from Gemfile.
176
+ raise LoadError, "Could not load the '#{spec[:adapter]}' Active Record adapter. Ensure that the adapter is spelled correctly in config/database.yml and that you've added the necessary adapter gem to your Gemfile.", e.backtrace
177
+
178
+ # Bubbled up from the adapter require. Prefix the exception message
179
+ # with some guidance about how to address it and reraise.
180
+ else
181
+ raise LoadError, "Error loading the '#{spec[:adapter]}' Active Record adapter. Missing a gem it depends on? #{e.message}", e.backtrace
182
+ end
179
183
  end
180
184
 
181
185
  adapter_method = "#{spec[:adapter]}_connection"
182
186
 
183
- name ||=
184
- if config.is_a?(Symbol)
185
- config.to_s
186
- else
187
- "primary"
188
- end
189
- ConnectionSpecification.new(name, spec, adapter_method)
187
+ unless ActiveRecord::Base.respond_to?(adapter_method)
188
+ raise AdapterNotFound, "database configuration specifies nonexistent #{spec[:adapter]} adapter"
189
+ end
190
+
191
+ ConnectionSpecification.new(spec.delete(:name) || "primary", spec, adapter_method)
190
192
  end
191
193
 
192
194
  private
195
+ # Returns fully resolved connection, accepts hash, string or symbol.
196
+ # Always returns a hash.
197
+ #
198
+ # == Examples
199
+ #
200
+ # Symbol representing current environment.
201
+ #
202
+ # Resolver.new("production" => {}).resolve_connection(:production)
203
+ # # => {}
204
+ #
205
+ # One layer deep hash of connection values.
206
+ #
207
+ # Resolver.new({}).resolve_connection("adapter" => "sqlite3")
208
+ # # => { "adapter" => "sqlite3" }
209
+ #
210
+ # Connection URL.
211
+ #
212
+ # Resolver.new({}).resolve_connection("postgresql://localhost/foo")
213
+ # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
214
+ #
215
+ def resolve_connection(config_or_env, pool_name = nil)
216
+ case config_or_env
217
+ when Symbol
218
+ resolve_symbol_connection config_or_env, pool_name
219
+ when String
220
+ resolve_url_connection config_or_env
221
+ when Hash
222
+ resolve_hash_connection config_or_env
223
+ else
224
+ raise TypeError, "Invalid type for configuration. Expected Symbol, String, or Hash. Got #{config_or_env.inspect}"
225
+ end
226
+ end
193
227
 
194
- # Returns fully resolved connection, accepts hash, string or symbol.
195
- # Always returns a hash.
196
- #
197
- # == Examples
198
- #
199
- # Symbol representing current environment.
200
- #
201
- # Resolver.new("production" => {}).resolve_connection(:production)
202
- # # => {}
203
- #
204
- # One layer deep hash of connection values.
205
- #
206
- # Resolver.new({}).resolve_connection("adapter" => "sqlite3")
207
- # # => { "adapter" => "sqlite3" }
208
- #
209
- # Connection URL.
210
- #
211
- # Resolver.new({}).resolve_connection("postgresql://localhost/foo")
212
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
213
- #
214
- def resolve_connection(spec)
215
- case spec
216
- when Symbol
217
- resolve_symbol_connection spec
218
- when String
219
- resolve_url_connection spec
220
- when Hash
221
- resolve_hash_connection spec
228
+ # Takes the environment such as +:production+ or +:development+ and a
229
+ # pool name the corresponds to the name given by the connection pool
230
+ # to the connection. That pool name is merged into the hash with the
231
+ # name key.
232
+ #
233
+ # This requires that the @configurations was initialized with a key that
234
+ # matches.
235
+ #
236
+ # configurations = #<ActiveRecord::DatabaseConfigurations:0x00007fd9fdace3e0
237
+ # @configurations=[
238
+ # #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd9fdace250
239
+ # @env_name="production", @spec_name="primary", @config={"database"=>"my_db"}>
240
+ # ]>
241
+ #
242
+ # Resolver.new(configurations).resolve_symbol_connection(:production, "primary")
243
+ # # => { "database" => "my_db" }
244
+ def resolve_symbol_connection(env_name, pool_name)
245
+ db_config = configurations.find_db_config(env_name)
246
+
247
+ if db_config
248
+ resolve_connection(db_config.config).merge("name" => pool_name.to_s)
249
+ else
250
+ raise AdapterNotSpecified, <<~MSG
251
+ The `#{env_name}` database is not configured for the `#{ActiveRecord::ConnectionHandling::DEFAULT_ENV.call}` environment.
252
+
253
+ Available databases configurations are:
254
+
255
+ #{build_configuration_sentence}
256
+ MSG
257
+ end
222
258
  end
223
- end
224
259
 
225
- # Takes the environment such as +:production+ or +:development+.
226
- # This requires that the @configurations was initialized with a key that
227
- # matches.
228
- #
229
- # Resolver.new("production" => {}).resolve_symbol_connection(:production)
230
- # # => {}
231
- #
232
- def resolve_symbol_connection(spec)
233
- if config = configurations[spec.to_s]
234
- resolve_connection(config)
235
- else
236
- raise(AdapterNotSpecified, "'#{spec}' database is not configured. Available: #{configurations.keys.inspect}")
260
+ def build_configuration_sentence # :nodoc:
261
+ configs = configurations.configs_for(include_replicas: true)
262
+
263
+ configs.group_by(&:env_name).map do |env, config|
264
+ namespaces = config.map(&:spec_name)
265
+ if namespaces.size > 1
266
+ "#{env}: #{namespaces.join(", ")}"
267
+ else
268
+ env
269
+ end
270
+ end.join("\n")
237
271
  end
238
- end
239
272
 
240
- # Accepts a hash. Expands the "url" key that contains a
241
- # URL database connection to a full connection
242
- # hash and merges with the rest of the hash.
243
- # Connection details inside of the "url" key win any merge conflicts
244
- def resolve_hash_connection(spec)
245
- if spec["url"] && spec["url"] !~ /^jdbc:/
246
- connection_hash = resolve_url_connection(spec.delete("url"))
247
- spec.merge!(connection_hash)
273
+ # Accepts a hash. Expands the "url" key that contains a
274
+ # URL database connection to a full connection
275
+ # hash and merges with the rest of the hash.
276
+ # Connection details inside of the "url" key win any merge conflicts
277
+ def resolve_hash_connection(spec)
278
+ if spec["url"] && spec["url"] !~ /^jdbc:/
279
+ connection_hash = resolve_url_connection(spec.delete("url"))
280
+ spec.merge!(connection_hash)
281
+ end
282
+ spec
248
283
  end
249
- spec
250
- end
251
284
 
252
- # Takes a connection URL.
253
- #
254
- # Resolver.new({}).resolve_url_connection("postgresql://localhost/foo")
255
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
256
- #
257
- def resolve_url_connection(url)
258
- ConnectionUrlResolver.new(url).to_hash
259
- end
285
+ # Takes a connection URL.
286
+ #
287
+ # Resolver.new({}).resolve_url_connection("postgresql://localhost/foo")
288
+ # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
289
+ #
290
+ def resolve_url_connection(url)
291
+ ConnectionUrlResolver.new(url).to_hash
292
+ end
260
293
  end
261
294
  end
262
295
  end