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,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/deprecation"
4
+
1
5
  module ActiveRecord
2
6
  module ConnectionAdapters # :nodoc:
3
7
  module DatabaseLimits
8
+ def max_identifier_length # :nodoc:
9
+ 64
10
+ end
4
11
 
5
12
  # Returns the maximum length of a table alias.
6
13
  def table_alias_length
7
- 255
14
+ max_identifier_length
8
15
  end
9
16
 
10
17
  # Returns the maximum length of a column name.
11
18
  def column_name_length
12
- 64
19
+ max_identifier_length
13
20
  end
21
+ deprecate :column_name_length
14
22
 
15
23
  # Returns the maximum length of a table name.
16
24
  def table_name_length
17
- 64
25
+ max_identifier_length
18
26
  end
27
+ deprecate :table_name_length
19
28
 
20
29
  # Returns the maximum allowed length for an index name. This
21
30
  # limit is enforced by \Rails and is less than or equal to
@@ -28,26 +37,29 @@ module ActiveRecord
28
37
 
29
38
  # Returns the maximum length of an index name.
30
39
  def index_name_length
31
- 64
40
+ max_identifier_length
32
41
  end
33
42
 
34
43
  # Returns the maximum number of columns per table.
35
44
  def columns_per_table
36
45
  1024
37
46
  end
47
+ deprecate :columns_per_table
38
48
 
39
49
  # Returns the maximum number of indexes per table.
40
50
  def indexes_per_table
41
51
  16
42
52
  end
53
+ deprecate :indexes_per_table
43
54
 
44
55
  # Returns the maximum number of columns in a multicolumn index.
45
56
  def columns_per_multicolumn_index
46
57
  16
47
58
  end
59
+ deprecate :columns_per_multicolumn_index
48
60
 
49
61
  # Returns the maximum number of elements in an IN (x,y,z) clause.
50
- # nil means no limit.
62
+ # +nil+ means no limit.
51
63
  def in_clause_length
52
64
  nil
53
65
  end
@@ -56,12 +68,18 @@ module ActiveRecord
56
68
  def sql_query_length
57
69
  1048575
58
70
  end
71
+ deprecate :sql_query_length
59
72
 
60
73
  # Returns maximum number of joins in a single query.
61
74
  def joins_per_query
62
75
  256
63
76
  end
77
+ deprecate :joins_per_query
64
78
 
79
+ private
80
+ def bind_params_length
81
+ 65535
82
+ end
65
83
  end
66
84
  end
67
85
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters # :nodoc:
3
5
  module DatabaseStatements
@@ -7,34 +9,61 @@ module ActiveRecord
7
9
  end
8
10
 
9
11
  # Converts an arel AST to SQL
10
- def to_sql(arel, binds = [])
11
- if arel.respond_to?(:ast)
12
- collected = visitor.accept(arel.ast, collector)
13
- collected.compile(binds.dup, self)
12
+ def to_sql(arel_or_sql_string, binds = [])
13
+ sql, _ = to_sql_and_binds(arel_or_sql_string, binds)
14
+ sql
15
+ end
16
+
17
+ def to_sql_and_binds(arel_or_sql_string, binds = []) # :nodoc:
18
+ if arel_or_sql_string.respond_to?(:ast)
19
+ unless binds.empty?
20
+ raise "Passing bind parameters with an arel AST is forbidden. " \
21
+ "The values must be stored on the AST directly"
22
+ end
23
+
24
+ if prepared_statements
25
+ sql, binds = visitor.compile(arel_or_sql_string.ast, collector)
26
+
27
+ if binds.length > bind_params_length
28
+ unprepared_statement do
29
+ sql, binds = to_sql_and_binds(arel_or_sql_string)
30
+ visitor.preparable = false
31
+ end
32
+ end
33
+ else
34
+ sql = visitor.compile(arel_or_sql_string.ast, collector)
35
+ end
36
+ [sql.freeze, binds]
14
37
  else
15
- arel
38
+ visitor.preparable = false if prepared_statements
39
+ [arel_or_sql_string.dup.freeze, binds]
16
40
  end
17
41
  end
42
+ private :to_sql_and_binds
18
43
 
19
44
  # This is used in the StatementCache object. It returns an object that
20
45
  # can be used to query the database repeatedly.
21
- def cacheable_query(arel) # :nodoc:
46
+ def cacheable_query(klass, arel) # :nodoc:
22
47
  if prepared_statements
23
- ActiveRecord::StatementCache.query visitor, arel.ast
48
+ sql, binds = visitor.compile(arel.ast, collector)
49
+ query = klass.query(sql)
24
50
  else
25
- ActiveRecord::StatementCache.partial_query visitor, arel.ast, collector
51
+ collector = klass.partial_query_collector
52
+ parts, binds = visitor.compile(arel.ast, collector)
53
+ query = klass.partial_query(parts)
26
54
  end
55
+ [query, binds]
27
56
  end
28
57
 
29
58
  # Returns an ActiveRecord::Result instance.
30
59
  def select_all(arel, name = nil, binds = [], preparable: nil)
31
- arel, binds = binds_from_relation arel, binds
32
- sql = to_sql(arel, binds)
33
- if !prepared_statements || (arel.is_a?(String) && preparable.nil?)
34
- preparable = false
35
- else
36
- preparable = visitor.preparable
60
+ arel = arel_from_relation(arel)
61
+ sql, binds = to_sql_and_binds(arel, binds)
62
+
63
+ if preparable.nil?
64
+ preparable = prepared_statements ? visitor.preparable : false
37
65
  end
66
+
38
67
  if prepared_statements && preparable
39
68
  select_prepared(sql, name, binds)
40
69
  else
@@ -50,23 +79,36 @@ module ActiveRecord
50
79
 
51
80
  # Returns a single value from a record
52
81
  def select_value(arel, name = nil, binds = [])
53
- arel, binds = binds_from_relation arel, binds
54
- if result = select_rows(to_sql(arel, binds), name, binds).first
55
- result.first
56
- end
82
+ single_value_from_rows(select_rows(arel, name, binds))
57
83
  end
58
84
 
59
85
  # Returns an array of the values of the first column in a select:
60
86
  # select_values("SELECT id FROM companies LIMIT 3") => [1,2,3]
61
87
  def select_values(arel, name = nil, binds = [])
62
- arel, binds = binds_from_relation arel, binds
63
- select_rows(to_sql(arel, binds), name, binds).map(&:first)
88
+ select_rows(arel, name, binds).map(&:first)
64
89
  end
65
90
 
66
91
  # Returns an array of arrays containing the field values.
67
92
  # Order is the same as that returned by +columns+.
68
- def select_rows(sql, name = nil, binds = [])
69
- exec_query(sql, name, binds).rows
93
+ def select_rows(arel, name = nil, binds = [])
94
+ select_all(arel, name, binds).rows
95
+ end
96
+
97
+ def query_value(sql, name = nil) # :nodoc:
98
+ single_value_from_rows(query(sql, name))
99
+ end
100
+
101
+ def query_values(sql, name = nil) # :nodoc:
102
+ query(sql, name).map(&:first)
103
+ end
104
+
105
+ def query(sql, name = nil) # :nodoc:
106
+ exec_query(sql, name).rows
107
+ end
108
+
109
+ # Determines whether the SQL statement is a write query.
110
+ def write_query?(sql)
111
+ raise NotImplementedError
70
112
  end
71
113
 
72
114
  # Executes the SQL statement in the context of this connection and returns
@@ -81,71 +123,77 @@ module ActiveRecord
81
123
  # Executes +sql+ statement in the context of this connection using
82
124
  # +binds+ as the bind substitutes. +name+ is logged along with
83
125
  # the executed +sql+ statement.
84
- def exec_query(sql, name = 'SQL', binds = [], prepare: false)
126
+ def exec_query(sql, name = "SQL", binds = [], prepare: false)
85
127
  raise NotImplementedError
86
128
  end
87
129
 
88
130
  # Executes insert +sql+ statement in the context of this connection using
89
131
  # +binds+ as the bind substitutes. +name+ is logged along with
90
132
  # the executed +sql+ statement.
91
- def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
133
+ def exec_insert(sql, name = nil, binds = [], pk = nil, sequence_name = nil)
134
+ sql, binds = sql_for_insert(sql, pk, binds)
92
135
  exec_query(sql, name, binds)
93
136
  end
94
137
 
95
138
  # Executes delete +sql+ statement in the context of this connection using
96
139
  # +binds+ as the bind substitutes. +name+ is logged along with
97
140
  # the executed +sql+ statement.
98
- def exec_delete(sql, name, binds)
141
+ def exec_delete(sql, name = nil, binds = [])
99
142
  exec_query(sql, name, binds)
100
143
  end
101
144
 
102
- # Executes the truncate statement.
103
- def truncate(table_name, name = nil)
104
- raise NotImplementedError
105
- end
106
-
107
145
  # Executes update +sql+ statement in the context of this connection using
108
146
  # +binds+ as the bind substitutes. +name+ is logged along with
109
147
  # the executed +sql+ statement.
110
- def exec_update(sql, name, binds)
148
+ def exec_update(sql, name = nil, binds = [])
111
149
  exec_query(sql, name, binds)
112
150
  end
113
151
 
152
+ def exec_insert_all(sql, name) # :nodoc:
153
+ exec_query(sql, name)
154
+ end
155
+
114
156
  # Executes an INSERT query and returns the new record's ID
115
157
  #
116
- # +id_value+ will be returned unless the value is nil, in
158
+ # +id_value+ will be returned unless the value is +nil+, in
117
159
  # which case the database will attempt to calculate the last inserted
118
160
  # id and return that value.
119
161
  #
120
162
  # If the next id was calculated in advance (as in Oracle), it should be
121
163
  # passed in as +id_value+.
122
164
  def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
123
- sql, binds, pk, sequence_name = sql_for_insert(to_sql(arel, binds), pk, id_value, sequence_name, binds)
165
+ sql, binds = to_sql_and_binds(arel, binds)
124
166
  value = exec_insert(sql, name, binds, pk, sequence_name)
125
167
  id_value || last_inserted_id(value)
126
168
  end
127
169
  alias create insert
128
- alias insert_sql insert
129
- deprecate insert_sql: :insert
130
170
 
131
171
  # Executes the update statement and returns the number of rows affected.
132
172
  def update(arel, name = nil, binds = [])
133
- exec_update(to_sql(arel, binds), name, binds)
173
+ sql, binds = to_sql_and_binds(arel, binds)
174
+ exec_update(sql, name, binds)
134
175
  end
135
- alias update_sql update
136
- deprecate update_sql: :update
137
176
 
138
177
  # Executes the delete statement and returns the number of rows affected.
139
178
  def delete(arel, name = nil, binds = [])
140
- exec_delete(to_sql(arel, binds), name, binds)
179
+ sql, binds = to_sql_and_binds(arel, binds)
180
+ exec_delete(sql, name, binds)
181
+ end
182
+
183
+ # Executes the truncate statement.
184
+ def truncate(table_name, name = nil)
185
+ execute(build_truncate_statement(table_name), name)
141
186
  end
142
- alias delete_sql delete
143
- deprecate delete_sql: :delete
144
187
 
145
- # Returns +true+ when the connection adapter supports prepared statement
146
- # caching, otherwise returns +false+
147
- def supports_statement_cache?
148
- false
188
+ def truncate_tables(*table_names) # :nodoc:
189
+ return if table_names.empty?
190
+
191
+ with_multi_statements do
192
+ disable_referential_integrity do
193
+ statements = build_truncate_statements(table_names)
194
+ execute_batch(statements, "Truncate Tables")
195
+ end
196
+ end
149
197
  end
150
198
 
151
199
  # Runs the given block in a database transaction, and returns the result
@@ -159,7 +207,7 @@ module ActiveRecord
159
207
  #
160
208
  # In order to get around this problem, #transaction will emulate the effect
161
209
  # of nested transactions, by using savepoints:
162
- # http://dev.mysql.com/doc/refman/5.7/en/savepoint.html
210
+ # https://dev.mysql.com/doc/refman/5.7/en/savepoint.html
163
211
  # Savepoints are supported by MySQL and PostgreSQL. SQLite3 version >= '3.6.8'
164
212
  # supports savepoints.
165
213
  #
@@ -211,7 +259,7 @@ module ActiveRecord
211
259
  # You should consult the documentation for your database to understand the
212
260
  # semantics of these different levels:
213
261
  #
214
- # * http://www.postgresql.org/docs/current/static/transaction-iso.html
262
+ # * https://www.postgresql.org/docs/current/static/transaction-iso.html
215
263
  # * https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html
216
264
  #
217
265
  # An ActiveRecord::TransactionIsolationError will be raised if:
@@ -237,7 +285,9 @@ module ActiveRecord
237
285
 
238
286
  attr_reader :transaction_manager #:nodoc:
239
287
 
240
- delegate :within_new_transaction, :open_transactions, :current_transaction, :begin_transaction, :commit_transaction, :rollback_transaction, to: :transaction_manager
288
+ delegate :within_new_transaction, :open_transactions, :current_transaction, :begin_transaction,
289
+ :commit_transaction, :rollback_transaction, :materialize_transactions,
290
+ :disable_lazy_transactions!, :enable_lazy_transactions!, to: :transaction_manager
241
291
 
242
292
  def transaction_open?
243
293
  current_transaction.open?
@@ -302,70 +352,136 @@ module ActiveRecord
302
352
 
303
353
  # Inserts the given fixture into the table. Overridden in adapters that require
304
354
  # something beyond a simple insert (eg. Oracle).
355
+ # Most of adapters should implement `insert_fixtures_set` that leverages bulk SQL insert.
356
+ # We keep this method to provide fallback
357
+ # for databases like sqlite that do not support bulk inserts.
305
358
  def insert_fixture(fixture, table_name)
306
- fixture = fixture.stringify_keys
359
+ execute(build_fixture_sql(Array.wrap(fixture), table_name), "Fixture Insert")
360
+ end
307
361
 
308
- columns = schema_cache.columns_hash(table_name)
309
- binds = fixture.map do |name, value|
310
- if column = columns[name]
311
- type = lookup_cast_type_from_column(column)
312
- Relation::QueryAttribute.new(name, value, type)
313
- else
314
- raise Fixture::FixtureError, %(table "#{table_name}" has no column named #{name.inspect}.)
315
- end
316
- end
317
- key_list = fixture.keys.map { |name| quote_column_name(name) }
318
- value_list = prepare_binds_for_database(binds).map do |value|
319
- begin
320
- quote(value)
321
- rescue TypeError
322
- quote(YAML.dump(value))
362
+ def insert_fixtures_set(fixture_set, tables_to_delete = [])
363
+ fixture_inserts = build_fixture_statements(fixture_set)
364
+ table_deletes = tables_to_delete.map { |table| "DELETE FROM #{quote_table_name(table)}" }
365
+ statements = table_deletes + fixture_inserts
366
+
367
+ with_multi_statements do
368
+ disable_referential_integrity do
369
+ transaction(requires_new: true) do
370
+ execute_batch(statements, "Fixtures Load")
371
+ end
323
372
  end
324
373
  end
325
-
326
- execute "INSERT INTO #{quote_table_name(table_name)} (#{key_list.join(', ')}) VALUES (#{value_list.join(', ')})", 'Fixture Insert'
327
374
  end
328
375
 
329
- def empty_insert_statement_value
376
+ def empty_insert_statement_value(primary_key = nil)
330
377
  "DEFAULT VALUES"
331
378
  end
332
379
 
333
380
  # Sanitizes the given LIMIT parameter in order to prevent SQL injection.
334
381
  #
335
382
  # The +limit+ may be anything that can evaluate to a string via #to_s. It
336
- # should look like an integer, or a comma-delimited list of integers, or
337
- # an Arel SQL literal.
383
+ # should look like an integer, or an Arel SQL literal.
338
384
  #
339
385
  # Returns Integer and Arel::Nodes::SqlLiteral limits as is.
340
- # Returns the sanitized limit parameter, either as an integer, or as a
341
- # string which contains a comma-delimited list of integers.
342
386
  def sanitize_limit(limit)
343
387
  if limit.is_a?(Integer) || limit.is_a?(Arel::Nodes::SqlLiteral)
344
388
  limit
345
- elsif limit.to_s.include?(',')
346
- Arel.sql limit.to_s.split(',').map{ |i| Integer(i) }.join(',')
347
389
  else
348
390
  Integer(limit)
349
391
  end
350
392
  end
351
393
 
352
- # The default strategy for an UPDATE with joins is to use a subquery. This doesn't work
353
- # on MySQL (even when aliasing the tables), but MySQL allows using JOIN directly in
354
- # an UPDATE statement, so in the MySQL adapters we redefine this to do that.
355
- def join_to_update(update, select, key) # :nodoc:
356
- subselect = subquery_for(key, select)
357
-
358
- update.where key.in(subselect)
394
+ # Fixture value is quoted by Arel, however scalar values
395
+ # are not quotable. In this case we want to convert
396
+ # the column value to YAML.
397
+ def with_yaml_fallback(value) # :nodoc:
398
+ if value.is_a?(Hash) || value.is_a?(Array)
399
+ YAML.dump(value)
400
+ else
401
+ value
402
+ end
359
403
  end
360
- alias join_to_delete join_to_update
361
404
 
362
- protected
405
+ private
406
+ def execute_batch(statements, name = nil)
407
+ statements.each do |statement|
408
+ execute(statement, name)
409
+ end
410
+ end
411
+
412
+ DEFAULT_INSERT_VALUE = Arel.sql("DEFAULT").freeze
413
+ private_constant :DEFAULT_INSERT_VALUE
414
+
415
+ def default_insert_value(column)
416
+ DEFAULT_INSERT_VALUE
417
+ end
418
+
419
+ def build_fixture_sql(fixtures, table_name)
420
+ columns = schema_cache.columns_hash(table_name)
421
+
422
+ values_list = fixtures.map do |fixture|
423
+ fixture = fixture.stringify_keys
424
+
425
+ unknown_columns = fixture.keys - columns.keys
426
+ if unknown_columns.any?
427
+ raise Fixture::FixtureError, %(table "#{table_name}" has no columns named #{unknown_columns.map(&:inspect).join(', ')}.)
428
+ end
429
+
430
+ columns.map do |name, column|
431
+ if fixture.key?(name)
432
+ type = lookup_cast_type_from_column(column)
433
+ with_yaml_fallback(type.serialize(fixture[name]))
434
+ else
435
+ default_insert_value(column)
436
+ end
437
+ end
438
+ end
439
+
440
+ table = Arel::Table.new(table_name)
441
+ manager = Arel::InsertManager.new
442
+ manager.into(table)
443
+
444
+ if values_list.size == 1
445
+ values = values_list.shift
446
+ new_values = []
447
+ columns.each_key.with_index { |column, i|
448
+ unless values[i].equal?(DEFAULT_INSERT_VALUE)
449
+ new_values << values[i]
450
+ manager.columns << table[column]
451
+ end
452
+ }
453
+ values_list << new_values
454
+ else
455
+ columns.each_key { |column| manager.columns << table[column] }
456
+ end
363
457
 
364
- # Returns a subquery for the given key using the join information.
365
- def subquery_for(key, select)
366
- subselect = select.clone
367
- subselect.projections = [key]
368
- subselect
458
+ manager.values = manager.create_values_list(values_list)
459
+ visitor.compile(manager.ast)
460
+ end
461
+
462
+ def build_fixture_statements(fixture_set)
463
+ fixture_set.map do |table_name, fixtures|
464
+ next if fixtures.empty?
465
+ build_fixture_sql(fixtures, table_name)
466
+ end.compact
467
+ end
468
+
469
+ def build_truncate_statement(table_name)
470
+ "TRUNCATE TABLE #{quote_table_name(table_name)}"
471
+ end
472
+
473
+ def build_truncate_statements(table_names)
474
+ table_names.map do |table_name|
475
+ build_truncate_statement(table_name)
476
+ end
477
+ end
478
+
479
+ def with_multi_statements
480
+ yield
481
+ end
482
+
483
+ def combine_multi_statements(total_sql)
484
+ total_sql.join(";\n")
369
485
  end
370
486
 
371
487
  # Returns an ActiveRecord::Result instance.
@@ -377,20 +493,25 @@ module ActiveRecord
377
493
  exec_query(sql, name, binds, prepare: true)
378
494
  end
379
495
 
380
- def sql_for_insert(sql, pk, id_value, sequence_name, binds)
381
- [sql, binds, pk, sequence_name]
496
+ def sql_for_insert(sql, pk, binds)
497
+ [sql, binds]
382
498
  end
383
499
 
384
500
  def last_inserted_id(result)
385
- row = result.rows.first
501
+ single_value_from_rows(result.rows)
502
+ end
503
+
504
+ def single_value_from_rows(rows)
505
+ row = rows.first
386
506
  row && row.first
387
507
  end
388
508
 
389
- def binds_from_relation(relation, binds)
390
- if relation.is_a?(Relation) && binds.empty?
391
- relation, binds = relation.arel, relation.bound_attributes
509
+ def arel_from_relation(relation)
510
+ if relation.is_a?(Relation)
511
+ relation.arel
512
+ else
513
+ relation
392
514
  end
393
- [relation, binds]
394
515
  end
395
516
  end
396
517
  end