activerecord 5.0.6 → 6.0.1

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 (358) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +638 -2023
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +8 -6
  5. data/examples/performance.rb +31 -29
  6. data/examples/simple.rb +5 -3
  7. data/lib/active_record/aggregations.rb +249 -246
  8. data/lib/active_record/association_relation.rb +24 -13
  9. data/lib/active_record/associations/alias_tracker.rb +24 -33
  10. data/lib/active_record/associations/association.rb +119 -56
  11. data/lib/active_record/associations/association_scope.rb +94 -94
  12. data/lib/active_record/associations/belongs_to_association.rb +58 -42
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  14. data/lib/active_record/associations/builder/association.rb +18 -25
  15. data/lib/active_record/associations/builder/belongs_to.rb +43 -54
  16. data/lib/active_record/associations/builder/collection_association.rb +7 -18
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +42 -61
  18. data/lib/active_record/associations/builder/has_many.rb +4 -0
  19. data/lib/active_record/associations/builder/has_one.rb +37 -1
  20. data/lib/active_record/associations/builder/singular_association.rb +4 -0
  21. data/lib/active_record/associations/collection_association.rb +80 -252
  22. data/lib/active_record/associations/collection_proxy.rb +158 -121
  23. data/lib/active_record/associations/foreign_association.rb +9 -0
  24. data/lib/active_record/associations/has_many_association.rb +23 -29
  25. data/lib/active_record/associations/has_many_through_association.rb +58 -44
  26. data/lib/active_record/associations/has_one_association.rb +59 -54
  27. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  28. data/lib/active_record/associations/join_dependency/join_association.rb +38 -90
  29. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  30. data/lib/active_record/associations/join_dependency/join_part.rb +12 -12
  31. data/lib/active_record/associations/join_dependency.rb +134 -176
  32. data/lib/active_record/associations/preloader/association.rb +84 -125
  33. data/lib/active_record/associations/preloader/through_association.rb +82 -75
  34. data/lib/active_record/associations/preloader.rb +90 -102
  35. data/lib/active_record/associations/singular_association.rb +12 -45
  36. data/lib/active_record/associations/through_association.rb +26 -14
  37. data/lib/active_record/associations.rb +1603 -1592
  38. data/lib/active_record/attribute_assignment.rb +54 -60
  39. data/lib/active_record/attribute_decorators.rb +38 -15
  40. data/lib/active_record/attribute_methods/before_type_cast.rb +12 -7
  41. data/lib/active_record/attribute_methods/dirty.rb +179 -109
  42. data/lib/active_record/attribute_methods/primary_key.rb +86 -91
  43. data/lib/active_record/attribute_methods/query.rb +4 -3
  44. data/lib/active_record/attribute_methods/read.rb +21 -49
  45. data/lib/active_record/attribute_methods/serialization.rb +30 -7
  46. data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -64
  47. data/lib/active_record/attribute_methods/write.rb +35 -33
  48. data/lib/active_record/attribute_methods.rb +66 -106
  49. data/lib/active_record/attributes.rb +38 -24
  50. data/lib/active_record/autosave_association.rb +53 -32
  51. data/lib/active_record/base.rb +27 -24
  52. data/lib/active_record/callbacks.rb +63 -33
  53. data/lib/active_record/coders/json.rb +2 -0
  54. data/lib/active_record/coders/yaml_column.rb +11 -11
  55. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +553 -321
  56. data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
  57. data/lib/active_record/connection_adapters/abstract/database_statements.rb +213 -94
  58. data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -28
  59. data/lib/active_record/connection_adapters/abstract/quoting.rb +119 -75
  60. data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
  61. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -27
  62. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +207 -126
  63. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  64. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +369 -199
  65. data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -78
  66. data/lib/active_record/connection_adapters/abstract_adapter.rb +363 -202
  67. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +405 -551
  68. data/lib/active_record/connection_adapters/column.rb +41 -13
  69. data/lib/active_record/connection_adapters/connection_specification.rb +172 -138
  70. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
  71. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  72. data/lib/active_record/connection_adapters/mysql/database_statements.rb +143 -49
  73. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -22
  74. data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
  75. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +50 -45
  76. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
  77. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
  78. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  79. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
  80. data/lib/active_record/connection_adapters/mysql2_adapter.rb +49 -30
  81. data/lib/active_record/connection_adapters/postgresql/column.rb +22 -7
  82. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +60 -54
  83. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  84. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -10
  85. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
  89. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +4 -2
  91. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -3
  93. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -17
  94. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  96. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
  98. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  99. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +31 -9
  100. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +34 -30
  101. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  102. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  103. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +9 -4
  104. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
  107. data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
  108. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +19 -25
  109. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  111. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +35 -32
  112. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +380 -300
  113. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
  114. data/lib/active_record/connection_adapters/postgresql/utils.rb +10 -6
  115. data/lib/active_record/connection_adapters/postgresql_adapter.rb +382 -275
  116. data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
  117. data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
  118. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +120 -0
  119. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
  120. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +74 -19
  121. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
  122. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  125. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +254 -262
  126. data/lib/active_record/connection_adapters/statement_pool.rb +9 -7
  127. data/lib/active_record/connection_handling.rb +159 -40
  128. data/lib/active_record/core.rb +202 -162
  129. data/lib/active_record/counter_cache.rb +57 -28
  130. data/lib/active_record/database_configurations/database_config.rb +37 -0
  131. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  132. data/lib/active_record/database_configurations/url_config.rb +79 -0
  133. data/lib/active_record/database_configurations.rb +233 -0
  134. data/lib/active_record/define_callbacks.rb +22 -0
  135. data/lib/active_record/dynamic_matchers.rb +87 -86
  136. data/lib/active_record/enum.rb +60 -23
  137. data/lib/active_record/errors.rb +114 -18
  138. data/lib/active_record/explain.rb +4 -3
  139. data/lib/active_record/explain_registry.rb +3 -1
  140. data/lib/active_record/explain_subscriber.rb +9 -4
  141. data/lib/active_record/fixture_set/file.rb +13 -8
  142. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  143. data/lib/active_record/fixture_set/render_context.rb +17 -0
  144. data/lib/active_record/fixture_set/table_row.rb +153 -0
  145. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  146. data/lib/active_record/fixtures.rb +195 -502
  147. data/lib/active_record/gem_version.rb +4 -2
  148. data/lib/active_record/inheritance.rb +151 -97
  149. data/lib/active_record/insert_all.rb +179 -0
  150. data/lib/active_record/integration.rb +116 -25
  151. data/lib/active_record/internal_metadata.rb +15 -18
  152. data/lib/active_record/legacy_yaml_adapter.rb +4 -2
  153. data/lib/active_record/locking/optimistic.rb +78 -87
  154. data/lib/active_record/locking/pessimistic.rb +18 -6
  155. data/lib/active_record/log_subscriber.rb +48 -29
  156. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  157. data/lib/active_record/middleware/database_selector/resolver.rb +88 -0
  158. data/lib/active_record/middleware/database_selector.rb +75 -0
  159. data/lib/active_record/migration/command_recorder.rb +143 -97
  160. data/lib/active_record/migration/compatibility.rb +174 -56
  161. data/lib/active_record/migration/join_table.rb +8 -6
  162. data/lib/active_record/migration.rb +367 -300
  163. data/lib/active_record/model_schema.rb +145 -139
  164. data/lib/active_record/nested_attributes.rb +214 -201
  165. data/lib/active_record/no_touching.rb +10 -1
  166. data/lib/active_record/null_relation.rb +13 -34
  167. data/lib/active_record/persistence.rb +442 -72
  168. data/lib/active_record/query_cache.rb +15 -14
  169. data/lib/active_record/querying.rb +36 -23
  170. data/lib/active_record/railtie.rb +128 -36
  171. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  172. data/lib/active_record/railties/console_sandbox.rb +2 -0
  173. data/lib/active_record/railties/controller_runtime.rb +34 -33
  174. data/lib/active_record/railties/databases.rake +309 -177
  175. data/lib/active_record/readonly_attributes.rb +5 -4
  176. data/lib/active_record/reflection.rb +211 -249
  177. data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
  178. data/lib/active_record/relation/batches.rb +99 -52
  179. data/lib/active_record/relation/calculations.rb +211 -172
  180. data/lib/active_record/relation/delegation.rb +67 -65
  181. data/lib/active_record/relation/finder_methods.rb +208 -247
  182. data/lib/active_record/relation/from_clause.rb +2 -8
  183. data/lib/active_record/relation/merger.rb +78 -61
  184. data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
  185. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  186. data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
  187. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  188. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  189. data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
  190. data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
  191. data/lib/active_record/relation/predicate_builder.rb +86 -104
  192. data/lib/active_record/relation/query_attribute.rb +33 -2
  193. data/lib/active_record/relation/query_methods.rb +458 -329
  194. data/lib/active_record/relation/record_fetch_warning.rb +5 -3
  195. data/lib/active_record/relation/spawn_methods.rb +8 -7
  196. data/lib/active_record/relation/where_clause.rb +111 -95
  197. data/lib/active_record/relation/where_clause_factory.rb +6 -11
  198. data/lib/active_record/relation.rb +429 -318
  199. data/lib/active_record/result.rb +69 -39
  200. data/lib/active_record/runtime_registry.rb +5 -3
  201. data/lib/active_record/sanitization.rb +83 -99
  202. data/lib/active_record/schema.rb +7 -14
  203. data/lib/active_record/schema_dumper.rb +71 -69
  204. data/lib/active_record/schema_migration.rb +15 -5
  205. data/lib/active_record/scoping/default.rb +93 -95
  206. data/lib/active_record/scoping/named.rb +45 -25
  207. data/lib/active_record/scoping.rb +20 -19
  208. data/lib/active_record/secure_token.rb +4 -2
  209. data/lib/active_record/serialization.rb +2 -0
  210. data/lib/active_record/statement_cache.rb +63 -28
  211. data/lib/active_record/store.rb +121 -41
  212. data/lib/active_record/suppressor.rb +4 -1
  213. data/lib/active_record/table_metadata.rb +26 -20
  214. data/lib/active_record/tasks/database_tasks.rb +276 -85
  215. data/lib/active_record/tasks/mysql_database_tasks.rb +54 -90
  216. data/lib/active_record/tasks/postgresql_database_tasks.rb +78 -47
  217. data/lib/active_record/tasks/sqlite_database_tasks.rb +34 -16
  218. data/lib/active_record/test_databases.rb +23 -0
  219. data/lib/active_record/test_fixtures.rb +224 -0
  220. data/lib/active_record/timestamp.rb +70 -35
  221. data/lib/active_record/touch_later.rb +7 -4
  222. data/lib/active_record/transactions.rb +133 -149
  223. data/lib/active_record/translation.rb +3 -1
  224. data/lib/active_record/type/adapter_specific_registry.rb +44 -45
  225. data/lib/active_record/type/date.rb +2 -0
  226. data/lib/active_record/type/date_time.rb +2 -0
  227. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  228. data/lib/active_record/type/hash_lookup_type_map.rb +5 -3
  229. data/lib/active_record/type/internal/timezone.rb +2 -0
  230. data/lib/active_record/type/json.rb +30 -0
  231. data/lib/active_record/type/serialized.rb +16 -8
  232. data/lib/active_record/type/text.rb +11 -0
  233. data/lib/active_record/type/time.rb +2 -1
  234. data/lib/active_record/type/type_map.rb +13 -15
  235. data/lib/active_record/type/unsigned_integer.rb +17 -0
  236. data/lib/active_record/type.rb +23 -17
  237. data/lib/active_record/type_caster/connection.rb +17 -12
  238. data/lib/active_record/type_caster/map.rb +5 -4
  239. data/lib/active_record/type_caster.rb +4 -2
  240. data/lib/active_record/validations/absence.rb +2 -0
  241. data/lib/active_record/validations/associated.rb +3 -1
  242. data/lib/active_record/validations/length.rb +2 -0
  243. data/lib/active_record/validations/presence.rb +4 -2
  244. data/lib/active_record/validations/uniqueness.rb +29 -42
  245. data/lib/active_record/validations.rb +7 -4
  246. data/lib/active_record/version.rb +3 -1
  247. data/lib/active_record.rb +36 -22
  248. data/lib/arel/alias_predication.rb +9 -0
  249. data/lib/arel/attributes/attribute.rb +37 -0
  250. data/lib/arel/attributes.rb +22 -0
  251. data/lib/arel/collectors/bind.rb +24 -0
  252. data/lib/arel/collectors/composite.rb +31 -0
  253. data/lib/arel/collectors/plain_string.rb +20 -0
  254. data/lib/arel/collectors/sql_string.rb +20 -0
  255. data/lib/arel/collectors/substitute_binds.rb +28 -0
  256. data/lib/arel/crud.rb +42 -0
  257. data/lib/arel/delete_manager.rb +18 -0
  258. data/lib/arel/errors.rb +9 -0
  259. data/lib/arel/expressions.rb +29 -0
  260. data/lib/arel/factory_methods.rb +49 -0
  261. data/lib/arel/insert_manager.rb +49 -0
  262. data/lib/arel/math.rb +45 -0
  263. data/lib/arel/nodes/and.rb +32 -0
  264. data/lib/arel/nodes/ascending.rb +23 -0
  265. data/lib/arel/nodes/binary.rb +52 -0
  266. data/lib/arel/nodes/bind_param.rb +36 -0
  267. data/lib/arel/nodes/case.rb +55 -0
  268. data/lib/arel/nodes/casted.rb +50 -0
  269. data/lib/arel/nodes/comment.rb +29 -0
  270. data/lib/arel/nodes/count.rb +12 -0
  271. data/lib/arel/nodes/delete_statement.rb +45 -0
  272. data/lib/arel/nodes/descending.rb +23 -0
  273. data/lib/arel/nodes/equality.rb +18 -0
  274. data/lib/arel/nodes/extract.rb +24 -0
  275. data/lib/arel/nodes/false.rb +16 -0
  276. data/lib/arel/nodes/full_outer_join.rb +8 -0
  277. data/lib/arel/nodes/function.rb +44 -0
  278. data/lib/arel/nodes/grouping.rb +8 -0
  279. data/lib/arel/nodes/in.rb +8 -0
  280. data/lib/arel/nodes/infix_operation.rb +80 -0
  281. data/lib/arel/nodes/inner_join.rb +8 -0
  282. data/lib/arel/nodes/insert_statement.rb +37 -0
  283. data/lib/arel/nodes/join_source.rb +20 -0
  284. data/lib/arel/nodes/matches.rb +18 -0
  285. data/lib/arel/nodes/named_function.rb +23 -0
  286. data/lib/arel/nodes/node.rb +50 -0
  287. data/lib/arel/nodes/node_expression.rb +13 -0
  288. data/lib/arel/nodes/outer_join.rb +8 -0
  289. data/lib/arel/nodes/over.rb +15 -0
  290. data/lib/arel/nodes/regexp.rb +16 -0
  291. data/lib/arel/nodes/right_outer_join.rb +8 -0
  292. data/lib/arel/nodes/select_core.rb +67 -0
  293. data/lib/arel/nodes/select_statement.rb +41 -0
  294. data/lib/arel/nodes/sql_literal.rb +16 -0
  295. data/lib/arel/nodes/string_join.rb +11 -0
  296. data/lib/arel/nodes/table_alias.rb +27 -0
  297. data/lib/arel/nodes/terminal.rb +16 -0
  298. data/lib/arel/nodes/true.rb +16 -0
  299. data/lib/arel/nodes/unary.rb +45 -0
  300. data/lib/arel/nodes/unary_operation.rb +20 -0
  301. data/lib/arel/nodes/unqualified_column.rb +22 -0
  302. data/lib/arel/nodes/update_statement.rb +41 -0
  303. data/lib/arel/nodes/values_list.rb +9 -0
  304. data/lib/arel/nodes/window.rb +126 -0
  305. data/lib/arel/nodes/with.rb +11 -0
  306. data/lib/arel/nodes.rb +68 -0
  307. data/lib/arel/order_predications.rb +13 -0
  308. data/lib/arel/predications.rb +257 -0
  309. data/lib/arel/select_manager.rb +271 -0
  310. data/lib/arel/table.rb +110 -0
  311. data/lib/arel/tree_manager.rb +72 -0
  312. data/lib/arel/update_manager.rb +34 -0
  313. data/lib/arel/visitors/depth_first.rb +204 -0
  314. data/lib/arel/visitors/dot.rb +297 -0
  315. data/lib/arel/visitors/ibm_db.rb +34 -0
  316. data/lib/arel/visitors/informix.rb +62 -0
  317. data/lib/arel/visitors/mssql.rb +157 -0
  318. data/lib/arel/visitors/mysql.rb +83 -0
  319. data/lib/arel/visitors/oracle.rb +159 -0
  320. data/lib/arel/visitors/oracle12.rb +66 -0
  321. data/lib/arel/visitors/postgresql.rb +110 -0
  322. data/lib/arel/visitors/sqlite.rb +39 -0
  323. data/lib/arel/visitors/to_sql.rb +889 -0
  324. data/lib/arel/visitors/visitor.rb +46 -0
  325. data/lib/arel/visitors/where_sql.rb +23 -0
  326. data/lib/arel/visitors.rb +20 -0
  327. data/lib/arel/window_predications.rb +9 -0
  328. data/lib/arel.rb +58 -0
  329. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  330. data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  331. data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
  332. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
  333. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
  334. data/lib/rails/generators/active_record/migration.rb +17 -2
  335. data/lib/rails/generators/active_record/model/model_generator.rb +9 -29
  336. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  337. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  338. data/lib/rails/generators/active_record.rb +7 -5
  339. metadata +133 -50
  340. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  341. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  342. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  343. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  344. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  345. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  346. data/lib/active_record/associations/preloader/singular_association.rb +0 -20
  347. data/lib/active_record/attribute/user_provided_default.rb +0 -28
  348. data/lib/active_record/attribute.rb +0 -213
  349. data/lib/active_record/attribute_mutation_tracker.rb +0 -70
  350. data/lib/active_record/attribute_set/builder.rb +0 -130
  351. data/lib/active_record/attribute_set.rb +0 -110
  352. data/lib/active_record/collection_cache_key.rb +0 -50
  353. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  354. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  355. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  356. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  357. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  358. data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -0,0 +1,297 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Visitors
5
+ class Dot < Arel::Visitors::Visitor
6
+ class Node # :nodoc:
7
+ attr_accessor :name, :id, :fields
8
+
9
+ def initialize(name, id, fields = [])
10
+ @name = name
11
+ @id = id
12
+ @fields = fields
13
+ end
14
+ end
15
+
16
+ class Edge < Struct.new :name, :from, :to # :nodoc:
17
+ end
18
+
19
+ def initialize
20
+ super()
21
+ @nodes = []
22
+ @edges = []
23
+ @node_stack = []
24
+ @edge_stack = []
25
+ @seen = {}
26
+ end
27
+
28
+ def accept(object, collector)
29
+ visit object
30
+ collector << to_dot
31
+ end
32
+
33
+ private
34
+
35
+ def visit_Arel_Nodes_Ordering(o)
36
+ visit_edge o, "expr"
37
+ end
38
+
39
+ def visit_Arel_Nodes_TableAlias(o)
40
+ visit_edge o, "name"
41
+ visit_edge o, "relation"
42
+ end
43
+
44
+ def visit_Arel_Nodes_Count(o)
45
+ visit_edge o, "expressions"
46
+ visit_edge o, "distinct"
47
+ end
48
+
49
+ def visit_Arel_Nodes_ValuesList(o)
50
+ visit_edge o, "rows"
51
+ end
52
+
53
+ def visit_Arel_Nodes_StringJoin(o)
54
+ visit_edge o, "left"
55
+ end
56
+
57
+ def visit_Arel_Nodes_InnerJoin(o)
58
+ visit_edge o, "left"
59
+ visit_edge o, "right"
60
+ end
61
+ alias :visit_Arel_Nodes_FullOuterJoin :visit_Arel_Nodes_InnerJoin
62
+ alias :visit_Arel_Nodes_OuterJoin :visit_Arel_Nodes_InnerJoin
63
+ alias :visit_Arel_Nodes_RightOuterJoin :visit_Arel_Nodes_InnerJoin
64
+
65
+ def visit_Arel_Nodes_DeleteStatement(o)
66
+ visit_edge o, "relation"
67
+ visit_edge o, "wheres"
68
+ end
69
+
70
+ def unary(o)
71
+ visit_edge o, "expr"
72
+ end
73
+ alias :visit_Arel_Nodes_Group :unary
74
+ alias :visit_Arel_Nodes_Cube :unary
75
+ alias :visit_Arel_Nodes_RollUp :unary
76
+ alias :visit_Arel_Nodes_GroupingSet :unary
77
+ alias :visit_Arel_Nodes_GroupingElement :unary
78
+ alias :visit_Arel_Nodes_Grouping :unary
79
+ alias :visit_Arel_Nodes_Having :unary
80
+ alias :visit_Arel_Nodes_Limit :unary
81
+ alias :visit_Arel_Nodes_Not :unary
82
+ alias :visit_Arel_Nodes_Offset :unary
83
+ alias :visit_Arel_Nodes_On :unary
84
+ alias :visit_Arel_Nodes_UnqualifiedColumn :unary
85
+ alias :visit_Arel_Nodes_OptimizerHints :unary
86
+ alias :visit_Arel_Nodes_Preceding :unary
87
+ alias :visit_Arel_Nodes_Following :unary
88
+ alias :visit_Arel_Nodes_Rows :unary
89
+ alias :visit_Arel_Nodes_Range :unary
90
+
91
+ def window(o)
92
+ visit_edge o, "partitions"
93
+ visit_edge o, "orders"
94
+ visit_edge o, "framing"
95
+ end
96
+ alias :visit_Arel_Nodes_Window :window
97
+
98
+ def named_window(o)
99
+ visit_edge o, "partitions"
100
+ visit_edge o, "orders"
101
+ visit_edge o, "framing"
102
+ visit_edge o, "name"
103
+ end
104
+ alias :visit_Arel_Nodes_NamedWindow :named_window
105
+
106
+ def function(o)
107
+ visit_edge o, "expressions"
108
+ visit_edge o, "distinct"
109
+ visit_edge o, "alias"
110
+ end
111
+ alias :visit_Arel_Nodes_Exists :function
112
+ alias :visit_Arel_Nodes_Min :function
113
+ alias :visit_Arel_Nodes_Max :function
114
+ alias :visit_Arel_Nodes_Avg :function
115
+ alias :visit_Arel_Nodes_Sum :function
116
+
117
+ def extract(o)
118
+ visit_edge o, "expressions"
119
+ visit_edge o, "alias"
120
+ end
121
+ alias :visit_Arel_Nodes_Extract :extract
122
+
123
+ def visit_Arel_Nodes_NamedFunction(o)
124
+ visit_edge o, "name"
125
+ visit_edge o, "expressions"
126
+ visit_edge o, "distinct"
127
+ visit_edge o, "alias"
128
+ end
129
+
130
+ def visit_Arel_Nodes_InsertStatement(o)
131
+ visit_edge o, "relation"
132
+ visit_edge o, "columns"
133
+ visit_edge o, "values"
134
+ end
135
+
136
+ def visit_Arel_Nodes_SelectCore(o)
137
+ visit_edge o, "source"
138
+ visit_edge o, "projections"
139
+ visit_edge o, "wheres"
140
+ visit_edge o, "windows"
141
+ end
142
+
143
+ def visit_Arel_Nodes_SelectStatement(o)
144
+ visit_edge o, "cores"
145
+ visit_edge o, "limit"
146
+ visit_edge o, "orders"
147
+ visit_edge o, "offset"
148
+ end
149
+
150
+ def visit_Arel_Nodes_UpdateStatement(o)
151
+ visit_edge o, "relation"
152
+ visit_edge o, "wheres"
153
+ visit_edge o, "values"
154
+ end
155
+
156
+ def visit_Arel_Table(o)
157
+ visit_edge o, "name"
158
+ end
159
+
160
+ def visit_Arel_Nodes_Casted(o)
161
+ visit_edge o, "val"
162
+ visit_edge o, "attribute"
163
+ end
164
+
165
+ def visit_Arel_Attribute(o)
166
+ visit_edge o, "relation"
167
+ visit_edge o, "name"
168
+ end
169
+ alias :visit_Arel_Attributes_Integer :visit_Arel_Attribute
170
+ alias :visit_Arel_Attributes_Float :visit_Arel_Attribute
171
+ alias :visit_Arel_Attributes_String :visit_Arel_Attribute
172
+ alias :visit_Arel_Attributes_Time :visit_Arel_Attribute
173
+ alias :visit_Arel_Attributes_Boolean :visit_Arel_Attribute
174
+ alias :visit_Arel_Attributes_Attribute :visit_Arel_Attribute
175
+
176
+ def nary(o)
177
+ o.children.each_with_index do |x, i|
178
+ edge(i) { visit x }
179
+ end
180
+ end
181
+ alias :visit_Arel_Nodes_And :nary
182
+
183
+ def binary(o)
184
+ visit_edge o, "left"
185
+ visit_edge o, "right"
186
+ end
187
+ alias :visit_Arel_Nodes_As :binary
188
+ alias :visit_Arel_Nodes_Assignment :binary
189
+ alias :visit_Arel_Nodes_Between :binary
190
+ alias :visit_Arel_Nodes_Concat :binary
191
+ alias :visit_Arel_Nodes_DoesNotMatch :binary
192
+ alias :visit_Arel_Nodes_Equality :binary
193
+ alias :visit_Arel_Nodes_GreaterThan :binary
194
+ alias :visit_Arel_Nodes_GreaterThanOrEqual :binary
195
+ alias :visit_Arel_Nodes_In :binary
196
+ alias :visit_Arel_Nodes_JoinSource :binary
197
+ alias :visit_Arel_Nodes_LessThan :binary
198
+ alias :visit_Arel_Nodes_LessThanOrEqual :binary
199
+ alias :visit_Arel_Nodes_IsNotDistinctFrom :binary
200
+ alias :visit_Arel_Nodes_IsDistinctFrom :binary
201
+ alias :visit_Arel_Nodes_Matches :binary
202
+ alias :visit_Arel_Nodes_NotEqual :binary
203
+ alias :visit_Arel_Nodes_NotIn :binary
204
+ alias :visit_Arel_Nodes_Or :binary
205
+ alias :visit_Arel_Nodes_Over :binary
206
+
207
+ def visit_String(o)
208
+ @node_stack.last.fields << o
209
+ end
210
+ alias :visit_Time :visit_String
211
+ alias :visit_Date :visit_String
212
+ alias :visit_DateTime :visit_String
213
+ alias :visit_NilClass :visit_String
214
+ alias :visit_TrueClass :visit_String
215
+ alias :visit_FalseClass :visit_String
216
+ alias :visit_Integer :visit_String
217
+ alias :visit_BigDecimal :visit_String
218
+ alias :visit_Float :visit_String
219
+ alias :visit_Symbol :visit_String
220
+ alias :visit_Arel_Nodes_SqlLiteral :visit_String
221
+
222
+ def visit_Arel_Nodes_BindParam(o); end
223
+
224
+ def visit_Hash(o)
225
+ o.each_with_index do |pair, i|
226
+ edge("pair_#{i}") { visit pair }
227
+ end
228
+ end
229
+
230
+ def visit_Array(o)
231
+ o.each_with_index do |x, i|
232
+ edge(i) { visit x }
233
+ end
234
+ end
235
+ alias :visit_Set :visit_Array
236
+
237
+ def visit_Arel_Nodes_Comment(o)
238
+ visit_edge(o, "values")
239
+ end
240
+
241
+ def visit_edge(o, method)
242
+ edge(method) { visit o.send(method) }
243
+ end
244
+
245
+ def visit(o)
246
+ if node = @seen[o.object_id]
247
+ @edge_stack.last.to = node
248
+ return
249
+ end
250
+
251
+ node = Node.new(o.class.name, o.object_id)
252
+ @seen[node.id] = node
253
+ @nodes << node
254
+ with_node node do
255
+ super
256
+ end
257
+ end
258
+
259
+ def edge(name)
260
+ edge = Edge.new(name, @node_stack.last)
261
+ @edge_stack.push edge
262
+ @edges << edge
263
+ yield
264
+ @edge_stack.pop
265
+ end
266
+
267
+ def with_node(node)
268
+ if edge = @edge_stack.last
269
+ edge.to = node
270
+ end
271
+
272
+ @node_stack.push node
273
+ yield
274
+ @node_stack.pop
275
+ end
276
+
277
+ def quote(string)
278
+ string.to_s.gsub('"', '\"')
279
+ end
280
+
281
+ def to_dot
282
+ "digraph \"Arel\" {\nnode [width=0.375,height=0.25,shape=record];\n" +
283
+ @nodes.map { |node|
284
+ label = "<f0>#{node.name}"
285
+
286
+ node.fields.each_with_index do |field, i|
287
+ label += "|<f#{i + 1}>#{quote field}"
288
+ end
289
+
290
+ "#{node.id} [label=\"#{label}\"];"
291
+ }.join("\n") + "\n" + @edges.map { |edge|
292
+ "#{edge.from.id} -> #{edge.to.id} [label=\"#{edge.name}\"];"
293
+ }.join("\n") + "\n}"
294
+ end
295
+ end
296
+ end
297
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Visitors
5
+ class IBM_DB < Arel::Visitors::ToSql
6
+ private
7
+ def visit_Arel_Nodes_SelectCore(o, collector)
8
+ collector = super
9
+ maybe_visit o.optimizer_hints, collector
10
+ end
11
+
12
+ def visit_Arel_Nodes_OptimizerHints(o, collector)
13
+ hints = o.expr.map { |v| sanitize_as_sql_comment(v) }.join
14
+ collector << "/* <OPTGUIDELINES>#{hints}</OPTGUIDELINES> */"
15
+ end
16
+
17
+ def visit_Arel_Nodes_Limit(o, collector)
18
+ collector << "FETCH FIRST "
19
+ collector = visit o.expr, collector
20
+ collector << " ROWS ONLY"
21
+ end
22
+
23
+ def is_distinct_from(o, collector)
24
+ collector << "DECODE("
25
+ collector = visit [o.left, o.right, 0, 1], collector
26
+ collector << ")"
27
+ end
28
+
29
+ def collect_optimizer_hints(o, collector)
30
+ collector
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Visitors
5
+ class Informix < Arel::Visitors::ToSql
6
+ private
7
+ def visit_Arel_Nodes_SelectStatement(o, collector)
8
+ collector << "SELECT "
9
+ collector = maybe_visit o.offset, collector
10
+ collector = maybe_visit o.limit, collector
11
+ collector = o.cores.inject(collector) { |c, x|
12
+ visit_Arel_Nodes_SelectCore x, c
13
+ }
14
+ if o.orders.any?
15
+ collector << "ORDER BY "
16
+ collector = inject_join o.orders, collector, ", "
17
+ end
18
+ maybe_visit o.lock, collector
19
+ end
20
+
21
+ def visit_Arel_Nodes_SelectCore(o, collector)
22
+ collector = inject_join o.projections, collector, ", "
23
+ if o.source && !o.source.empty?
24
+ collector << " FROM "
25
+ collector = visit o.source, collector
26
+ end
27
+
28
+ if o.wheres.any?
29
+ collector << " WHERE "
30
+ collector = inject_join o.wheres, collector, " AND "
31
+ end
32
+
33
+ if o.groups.any?
34
+ collector << "GROUP BY "
35
+ collector = inject_join o.groups, collector, ", "
36
+ end
37
+
38
+ if o.havings.any?
39
+ collector << " HAVING "
40
+ collector = inject_join o.havings, collector, " AND "
41
+ end
42
+ collector
43
+ end
44
+
45
+ def visit_Arel_Nodes_OptimizerHints(o, collector)
46
+ hints = o.expr.map { |v| sanitize_as_sql_comment(v) }.join(", ")
47
+ collector << "/*+ #{hints} */"
48
+ end
49
+
50
+ def visit_Arel_Nodes_Offset(o, collector)
51
+ collector << "SKIP "
52
+ visit o.expr, collector
53
+ end
54
+
55
+ def visit_Arel_Nodes_Limit(o, collector)
56
+ collector << "FIRST "
57
+ visit o.expr, collector
58
+ collector << " "
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Visitors
5
+ class MSSQL < Arel::Visitors::ToSql
6
+ RowNumber = Struct.new :children
7
+
8
+ def initialize(*)
9
+ @primary_keys = {}
10
+ super
11
+ end
12
+
13
+ private
14
+
15
+ def visit_Arel_Nodes_IsNotDistinctFrom(o, collector)
16
+ right = o.right
17
+
18
+ if right.nil?
19
+ collector = visit o.left, collector
20
+ collector << " IS NULL"
21
+ else
22
+ collector << "EXISTS (VALUES ("
23
+ collector = visit o.left, collector
24
+ collector << ") INTERSECT VALUES ("
25
+ collector = visit right, collector
26
+ collector << "))"
27
+ end
28
+ end
29
+
30
+ def visit_Arel_Nodes_IsDistinctFrom(o, collector)
31
+ if o.right.nil?
32
+ collector = visit o.left, collector
33
+ collector << " IS NOT NULL"
34
+ else
35
+ collector << "NOT "
36
+ visit_Arel_Nodes_IsNotDistinctFrom o, collector
37
+ end
38
+ end
39
+
40
+ def visit_Arel_Visitors_MSSQL_RowNumber(o, collector)
41
+ collector << "ROW_NUMBER() OVER (ORDER BY "
42
+ inject_join(o.children, collector, ", ") << ") as _row_num"
43
+ end
44
+
45
+ def visit_Arel_Nodes_SelectStatement(o, collector)
46
+ if !o.limit && !o.offset
47
+ return super
48
+ end
49
+
50
+ is_select_count = false
51
+ o.cores.each { |x|
52
+ core_order_by = row_num_literal determine_order_by(o.orders, x)
53
+ if select_count? x
54
+ x.projections = [core_order_by]
55
+ is_select_count = true
56
+ else
57
+ x.projections << core_order_by
58
+ end
59
+ }
60
+
61
+ if is_select_count
62
+ # fixme count distinct wouldn't work with limit or offset
63
+ collector << "SELECT COUNT(1) as count_id FROM ("
64
+ end
65
+
66
+ collector << "SELECT _t.* FROM ("
67
+ collector = o.cores.inject(collector) { |c, x|
68
+ visit_Arel_Nodes_SelectCore x, c
69
+ }
70
+ collector << ") as _t WHERE #{get_offset_limit_clause(o)}"
71
+
72
+ if is_select_count
73
+ collector << ") AS subquery"
74
+ else
75
+ collector
76
+ end
77
+ end
78
+
79
+ def visit_Arel_Nodes_SelectCore(o, collector)
80
+ collector = super
81
+ maybe_visit o.optimizer_hints, collector
82
+ end
83
+
84
+ def visit_Arel_Nodes_OptimizerHints(o, collector)
85
+ hints = o.expr.map { |v| sanitize_as_sql_comment(v) }.join(", ")
86
+ collector << "OPTION (#{hints})"
87
+ end
88
+
89
+ def get_offset_limit_clause(o)
90
+ first_row = o.offset ? o.offset.expr.to_i + 1 : 1
91
+ last_row = o.limit ? o.limit.expr.to_i - 1 + first_row : nil
92
+ if last_row
93
+ " _row_num BETWEEN #{first_row} AND #{last_row}"
94
+ else
95
+ " _row_num >= #{first_row}"
96
+ end
97
+ end
98
+
99
+ def visit_Arel_Nodes_DeleteStatement(o, collector)
100
+ collector << "DELETE "
101
+ if o.limit
102
+ collector << "TOP ("
103
+ visit o.limit.expr, collector
104
+ collector << ") "
105
+ end
106
+ collector << "FROM "
107
+ collector = visit o.relation, collector
108
+ if o.wheres.any?
109
+ collector << " WHERE "
110
+ inject_join o.wheres, collector, " AND "
111
+ else
112
+ collector
113
+ end
114
+ end
115
+
116
+ def collect_optimizer_hints(o, collector)
117
+ collector
118
+ end
119
+
120
+ def determine_order_by(orders, x)
121
+ if orders.any?
122
+ orders
123
+ elsif x.groups.any?
124
+ x.groups
125
+ else
126
+ pk = find_left_table_pk(x.froms)
127
+ pk ? [pk] : []
128
+ end
129
+ end
130
+
131
+ def row_num_literal(order_by)
132
+ RowNumber.new order_by
133
+ end
134
+
135
+ def select_count?(x)
136
+ x.projections.length == 1 && Arel::Nodes::Count === x.projections.first
137
+ end
138
+
139
+ # FIXME raise exception of there is no pk?
140
+ def find_left_table_pk(o)
141
+ if o.kind_of?(Arel::Nodes::Join)
142
+ find_left_table_pk(o.left)
143
+ elsif o.instance_of?(Arel::Table)
144
+ find_primary_key(o)
145
+ end
146
+ end
147
+
148
+ def find_primary_key(o)
149
+ @primary_keys[o.name] ||= begin
150
+ primary_key_name = @connection.primary_key(o.name)
151
+ # some tables might be without primary key
152
+ primary_key_name && o[primary_key_name]
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Visitors
5
+ class MySQL < Arel::Visitors::ToSql
6
+ private
7
+ def visit_Arel_Nodes_Bin(o, collector)
8
+ collector << "BINARY "
9
+ visit o.expr, collector
10
+ end
11
+
12
+ def visit_Arel_Nodes_UnqualifiedColumn(o, collector)
13
+ visit o.expr, collector
14
+ end
15
+
16
+ ###
17
+ # :'(
18
+ # http://dev.mysql.com/doc/refman/5.0/en/select.html#id3482214
19
+ def visit_Arel_Nodes_SelectStatement(o, collector)
20
+ if o.offset && !o.limit
21
+ o.limit = Arel::Nodes::Limit.new(18446744073709551615)
22
+ end
23
+ super
24
+ end
25
+
26
+ def visit_Arel_Nodes_SelectCore(o, collector)
27
+ o.froms ||= Arel.sql("DUAL")
28
+ super
29
+ end
30
+
31
+ def visit_Arel_Nodes_Concat(o, collector)
32
+ collector << " CONCAT("
33
+ visit o.left, collector
34
+ collector << ", "
35
+ visit o.right, collector
36
+ collector << ") "
37
+ collector
38
+ end
39
+
40
+ def visit_Arel_Nodes_IsNotDistinctFrom(o, collector)
41
+ collector = visit o.left, collector
42
+ collector << " <=> "
43
+ visit o.right, collector
44
+ end
45
+
46
+ def visit_Arel_Nodes_IsDistinctFrom(o, collector)
47
+ collector << "NOT "
48
+ visit_Arel_Nodes_IsNotDistinctFrom o, collector
49
+ end
50
+
51
+ # In the simple case, MySQL allows us to place JOINs directly into the UPDATE
52
+ # query. However, this does not allow for LIMIT, OFFSET and ORDER. To support
53
+ # these, we must use a subquery.
54
+ def prepare_update_statement(o)
55
+ if o.offset || has_join_sources?(o) && has_limit_or_offset_or_orders?(o)
56
+ super
57
+ else
58
+ o
59
+ end
60
+ end
61
+ alias :prepare_delete_statement :prepare_update_statement
62
+
63
+ # MySQL is too stupid to create a temporary table for use subquery, so we have
64
+ # to give it some prompting in the form of a subsubquery.
65
+ def build_subselect(key, o)
66
+ subselect = super
67
+
68
+ # Materialize subquery by adding distinct
69
+ # to work with MySQL 5.7.6 which sets optimizer_switch='derived_merge=on'
70
+ unless has_limit_or_offset_or_orders?(subselect)
71
+ core = subselect.cores.last
72
+ core.set_quantifier = Arel::Nodes::Distinct.new
73
+ end
74
+
75
+ Nodes::SelectStatement.new.tap do |stmt|
76
+ core = stmt.cores.last
77
+ core.froms = Nodes::Grouping.new(subselect).as("__active_record_temp")
78
+ core.projections = [Arel.sql(quote_column_name(key.name))]
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end