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,19 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module DetermineIfPreparableVisitor
4
- attr_reader :preparable
6
+ attr_accessor :preparable
5
7
 
6
- def accept(*)
8
+ def accept(object, collector)
7
9
  @preparable = true
8
10
  super
9
11
  end
10
12
 
11
- def visit_Arel_Nodes_In(*)
13
+ def visit_Arel_Nodes_In(o, collector)
14
+ @preparable = false
15
+ super
16
+ end
17
+
18
+ def visit_Arel_Nodes_NotIn(o, collector)
12
19
  @preparable = false
13
20
  super
14
21
  end
15
22
 
16
- def visit_Arel_Nodes_SqlLiteral(*)
23
+ def visit_Arel_Nodes_SqlLiteral(o, collector)
17
24
  @preparable = false
18
25
  super
19
26
  end
@@ -1,48 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module MySQL
4
6
  class Column < ConnectionAdapters::Column # :nodoc:
5
- delegate :strict, :extra, to: :sql_type_metadata, allow_nil: true
6
-
7
- def initialize(*)
8
- super
9
- assert_valid_default
10
- extract_default
11
- end
12
-
13
- def has_default?
14
- return false if blob_or_text_column? # MySQL forbids defaults on blob and text columns
15
- super
16
- end
17
-
18
- def blob_or_text_column?
19
- /\A(?:tiny|medium|long)?blob\b/ === sql_type || type == :text
20
- end
7
+ delegate :extra, to: :sql_type_metadata, allow_nil: true
21
8
 
22
9
  def unsigned?
23
- /\A(?:enum|set)\b/ !~ sql_type && /\bunsigned\b/ === sql_type
10
+ /\bunsigned(?: zerofill)?\z/.match?(sql_type)
24
11
  end
25
12
 
26
13
  def case_sensitive?
27
- collation && collation !~ /_ci\z/
14
+ collation && !collation.end_with?("_ci")
28
15
  end
29
16
 
30
17
  def auto_increment?
31
- extra == 'auto_increment'
32
- end
33
-
34
- private
35
-
36
- def extract_default
37
- if blob_or_text_column?
38
- @default = null || strict ? nil : ''
39
- end
18
+ extra == "auto_increment"
40
19
  end
41
20
 
42
- def assert_valid_default
43
- if blob_or_text_column? && default.present?
44
- raise ArgumentError, "#{type} columns cannot have a default value: #{default.inspect}"
45
- end
21
+ def virtual?
22
+ /\b(?:VIRTUAL|STORED|PERSISTENT)\b/.match?(extra)
46
23
  end
47
24
  end
48
25
  end
@@ -1,29 +1,39 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module MySQL
4
6
  module DatabaseStatements
5
7
  # Returns an ActiveRecord::Result instance.
6
- def select_all(arel, name = nil, binds = [], preparable: nil)
8
+ def select_all(*, **) # :nodoc:
7
9
  result = if ExplainRegistry.collect? && prepared_statements
8
10
  unprepared_statement { super }
9
11
  else
10
12
  super
11
13
  end
12
- @connection.next_result while @connection.more_results?
14
+ @connection.abandon_results!
13
15
  result
14
16
  end
15
17
 
16
- # Returns an array of arrays containing the field values.
17
- # Order is the same as that returned by +columns+.
18
- def select_rows(sql, name = nil, binds = [])
19
- select_result(sql, name, binds) do |result|
20
- @connection.next_result while @connection.more_results?
21
- result.to_a
22
- end
18
+ def query(sql, name = nil) # :nodoc:
19
+ execute(sql, name).to_a
20
+ end
21
+
22
+ READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(
23
+ :begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback, :describe, :desc, :with
24
+ ) # :nodoc:
25
+ private_constant :READ_QUERY
26
+
27
+ def write_query?(sql) # :nodoc:
28
+ !READ_QUERY.match?(sql)
23
29
  end
24
30
 
25
31
  # Executes the SQL statement in the context of this connection.
26
32
  def execute(sql, name = nil)
33
+ if preventing_writes? && write_query?(sql)
34
+ raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}"
35
+ end
36
+
27
37
  # make sure we carry over any changes to ActiveRecord::Base.default_timezone that have been
28
38
  # made since we established the connection
29
39
  @connection.query_options[:database_timezone] = ActiveRecord::Base.default_timezone
@@ -31,77 +41,155 @@ module ActiveRecord
31
41
  super
32
42
  end
33
43
 
34
- def exec_query(sql, name = 'SQL', binds = [], prepare: false)
44
+ def exec_query(sql, name = "SQL", binds = [], prepare: false)
35
45
  if without_prepared_statement?(binds)
36
46
  execute_and_free(sql, name) do |result|
37
- ActiveRecord::Result.new(result.fields, result.to_a) if result
47
+ if result
48
+ ActiveRecord::Result.new(result.fields, result.to_a)
49
+ else
50
+ ActiveRecord::Result.new([], [])
51
+ end
38
52
  end
39
53
  else
40
54
  exec_stmt_and_free(sql, name, binds, cache_stmt: prepare) do |_, result|
41
- ActiveRecord::Result.new(result.fields, result.to_a) if result
55
+ if result
56
+ ActiveRecord::Result.new(result.fields, result.to_a)
57
+ else
58
+ ActiveRecord::Result.new([], [])
59
+ end
42
60
  end
43
61
  end
44
62
  end
45
63
 
46
- def exec_delete(sql, name, binds)
64
+ def exec_delete(sql, name = nil, binds = [])
47
65
  if without_prepared_statement?(binds)
48
- execute_and_free(sql, name) { @connection.affected_rows }
66
+ @lock.synchronize do
67
+ execute_and_free(sql, name) { @connection.affected_rows }
68
+ end
49
69
  else
50
70
  exec_stmt_and_free(sql, name, binds) { |stmt| stmt.affected_rows }
51
71
  end
52
72
  end
53
73
  alias :exec_update :exec_delete
54
74
 
55
- protected
75
+ private
76
+ def execute_batch(statements, name = nil)
77
+ combine_multi_statements(statements).each do |statement|
78
+ execute(statement, name)
79
+ end
80
+ @connection.abandon_results!
81
+ end
56
82
 
57
- def last_inserted_id(result)
58
- @connection.last_id
59
- end
83
+ def default_insert_value(column)
84
+ super unless column.auto_increment?
85
+ end
60
86
 
61
- private
87
+ def last_inserted_id(result)
88
+ @connection.last_id
89
+ end
62
90
 
63
- def select_result(sql, name = nil, binds = [])
64
- if without_prepared_statement?(binds)
65
- execute_and_free(sql, name) { |result| yield result }
66
- else
67
- exec_stmt_and_free(sql, name, binds, cache_stmt: true) { |_, result| yield result }
91
+ def supports_set_server_option?
92
+ @connection.respond_to?(:set_server_option)
68
93
  end
69
- end
70
94
 
71
- def exec_stmt_and_free(sql, name, binds, cache_stmt: false)
72
- # make sure we carry over any changes to ActiveRecord::Base.default_timezone that have been
73
- # made since we established the connection
74
- @connection.query_options[:database_timezone] = ActiveRecord::Base.default_timezone
95
+ def multi_statements_enabled?(flags)
96
+ if flags.is_a?(Array)
97
+ flags.include?("MULTI_STATEMENTS")
98
+ else
99
+ (flags & Mysql2::Client::MULTI_STATEMENTS) != 0
100
+ end
101
+ end
75
102
 
76
- type_casted_binds = type_casted_binds(binds)
103
+ def with_multi_statements
104
+ previous_flags = @config[:flags]
77
105
 
78
- log(sql, name, binds, type_casted_binds) do
79
- if cache_stmt
80
- cache = @statements[sql] ||= {
81
- stmt: @connection.prepare(sql)
82
- }
83
- stmt = cache[:stmt]
106
+ unless multi_statements_enabled?(previous_flags)
107
+ if supports_set_server_option?
108
+ @connection.set_server_option(Mysql2::Client::OPTION_MULTI_STATEMENTS_ON)
109
+ else
110
+ @config[:flags] = Mysql2::Client::MULTI_STATEMENTS
111
+ reconnect!
112
+ end
113
+ end
114
+
115
+ yield
116
+ ensure
117
+ unless multi_statements_enabled?(previous_flags)
118
+ if supports_set_server_option?
119
+ @connection.set_server_option(Mysql2::Client::OPTION_MULTI_STATEMENTS_OFF)
120
+ else
121
+ @config[:flags] = previous_flags
122
+ reconnect!
123
+ end
124
+ end
125
+ end
126
+
127
+ def combine_multi_statements(total_sql)
128
+ total_sql.each_with_object([]) do |sql, total_sql_chunks|
129
+ previous_packet = total_sql_chunks.last
130
+ if max_allowed_packet_reached?(sql, previous_packet)
131
+ total_sql_chunks << +sql
132
+ else
133
+ previous_packet << ";\n"
134
+ previous_packet << sql
135
+ end
136
+ end
137
+ end
138
+
139
+ def max_allowed_packet_reached?(current_packet, previous_packet)
140
+ if current_packet.bytesize > max_allowed_packet
141
+ raise ActiveRecordError,
142
+ "Fixtures set is too large #{current_packet.bytesize}. Consider increasing the max_allowed_packet variable."
143
+ elsif previous_packet.nil?
144
+ true
84
145
  else
85
- stmt = @connection.prepare(sql)
146
+ (current_packet.bytesize + previous_packet.bytesize + 2) > max_allowed_packet
86
147
  end
148
+ end
149
+
150
+ def max_allowed_packet
151
+ @max_allowed_packet ||= show_variable("max_allowed_packet")
152
+ end
153
+
154
+ def exec_stmt_and_free(sql, name, binds, cache_stmt: false)
155
+ if preventing_writes? && write_query?(sql)
156
+ raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}"
157
+ end
158
+
159
+ materialize_transactions
160
+
161
+ # make sure we carry over any changes to ActiveRecord::Base.default_timezone that have been
162
+ # made since we established the connection
163
+ @connection.query_options[:database_timezone] = ActiveRecord::Base.default_timezone
87
164
 
88
- begin
89
- result = stmt.execute(*type_casted_binds)
90
- rescue Mysql2::Error => e
165
+ type_casted_binds = type_casted_binds(binds)
166
+
167
+ log(sql, name, binds, type_casted_binds) do
91
168
  if cache_stmt
92
- @statements.delete(sql)
169
+ stmt = @statements[sql] ||= @connection.prepare(sql)
93
170
  else
94
- stmt.close
171
+ stmt = @connection.prepare(sql)
172
+ end
173
+
174
+ begin
175
+ result = ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
176
+ stmt.execute(*type_casted_binds)
177
+ end
178
+ rescue Mysql2::Error => e
179
+ if cache_stmt
180
+ @statements.delete(sql)
181
+ else
182
+ stmt.close
183
+ end
184
+ raise e
95
185
  end
96
- raise e
97
- end
98
186
 
99
- ret = yield stmt, result
100
- result.free if result
101
- stmt.close unless cache_stmt
102
- ret
187
+ ret = yield stmt, result
188
+ result.free if result
189
+ stmt.close unless cache_stmt
190
+ ret
191
+ end
103
192
  end
104
- end
105
193
  end
106
194
  end
107
195
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module MySQL
@@ -35,35 +37,34 @@ module ActiveRecord
35
37
  end
36
38
 
37
39
  private
38
-
39
- def compute_column_widths(result)
40
- [].tap do |widths|
41
- result.columns.each_with_index do |column, i|
42
- cells_in_column = [column] + result.rows.map {|r| r[i].nil? ? 'NULL' : r[i].to_s}
43
- widths << cells_in_column.map(&:length).max
40
+ def compute_column_widths(result)
41
+ [].tap do |widths|
42
+ result.columns.each_with_index do |column, i|
43
+ cells_in_column = [column] + result.rows.map { |r| r[i].nil? ? "NULL" : r[i].to_s }
44
+ widths << cells_in_column.map(&:length).max
45
+ end
44
46
  end
45
47
  end
46
- end
47
48
 
48
- def build_separator(widths)
49
- padding = 1
50
- '+' + widths.map {|w| '-' * (w + (padding*2))}.join('+') + '+'
51
- end
49
+ def build_separator(widths)
50
+ padding = 1
51
+ "+" + widths.map { |w| "-" * (w + (padding * 2)) }.join("+") + "+"
52
+ end
52
53
 
53
- def build_cells(items, widths)
54
- cells = []
55
- items.each_with_index do |item, i|
56
- item = 'NULL' if item.nil?
57
- justifier = item.is_a?(Numeric) ? 'rjust' : 'ljust'
58
- cells << item.to_s.send(justifier, widths[i])
54
+ def build_cells(items, widths)
55
+ cells = []
56
+ items.each_with_index do |item, i|
57
+ item = "NULL" if item.nil?
58
+ justifier = item.is_a?(Numeric) ? "rjust" : "ljust"
59
+ cells << item.to_s.send(justifier, widths[i])
60
+ end
61
+ "| " + cells.join(" | ") + " |"
59
62
  end
60
- '| ' + cells.join(' | ') + ' |'
61
- end
62
63
 
63
- def build_footer(nrows, elapsed)
64
- rows_label = nrows == 1 ? 'row' : 'rows'
65
- "#{nrows} #{rows_label} in set (%.2f sec)" % elapsed
66
- end
64
+ def build_footer(nrows, elapsed)
65
+ rows_label = nrows == 1 ? "row" : "rows"
66
+ "#{nrows} #{rows_label} in set (%.2f sec)" % elapsed
67
+ end
67
68
  end
68
69
  end
69
70
  end
@@ -1,29 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module ConnectionAdapters
3
5
  module MySQL
4
6
  module Quoting # :nodoc:
5
- QUOTED_TRUE, QUOTED_FALSE = '1'.freeze, '0'.freeze
6
-
7
7
  def quote_column_name(name)
8
- @quoted_column_names[name] ||= "`#{super.gsub('`', '``')}`"
8
+ self.class.quoted_column_names[name] ||= "`#{super.gsub('`', '``')}`"
9
9
  end
10
10
 
11
11
  def quote_table_name(name)
12
- @quoted_table_names[name] ||= super.gsub('.', '`.`')
13
- end
14
-
15
- def quoted_true
16
- QUOTED_TRUE
12
+ self.class.quoted_table_names[name] ||= super.gsub(".", "`.`").freeze
17
13
  end
18
14
 
19
15
  def unquoted_true
20
16
  1
21
17
  end
22
18
 
23
- def quoted_false
24
- QUOTED_FALSE
25
- end
26
-
27
19
  def unquoted_false
28
20
  0
29
21
  end
@@ -32,19 +24,57 @@ module ActiveRecord
32
24
  if supports_datetime_with_precision?
33
25
  super
34
26
  else
35
- super.sub(/\.\d{6}\z/, '')
27
+ super.sub(/\.\d{6}\z/, "")
36
28
  end
37
29
  end
38
30
 
39
- private
31
+ def quoted_binary(value)
32
+ "x'#{value.hex}'"
33
+ end
40
34
 
41
- def _quote(value)
42
- if value.is_a?(Type::Binary::Data)
43
- "x'#{value.hex}'"
44
- else
45
- super
46
- end
35
+ def column_name_matcher
36
+ COLUMN_NAME
37
+ end
38
+
39
+ def column_name_with_order_matcher
40
+ COLUMN_NAME_WITH_ORDER
47
41
  end
42
+
43
+ COLUMN_NAME = /
44
+ \A
45
+ (
46
+ (?:
47
+ # `table_name`.`column_name` | function(one or no argument)
48
+ ((?:\w+\.|`\w+`\.)?(?:\w+|`\w+`)) | \w+\((?:|\g<2>)\)
49
+ )
50
+ (?:\s+AS\s+(?:\w+|`\w+`))?
51
+ )
52
+ (?:\s*,\s*\g<1>)*
53
+ \z
54
+ /ix
55
+
56
+ COLUMN_NAME_WITH_ORDER = /
57
+ \A
58
+ (
59
+ (?:
60
+ # `table_name`.`column_name` | function(one or no argument)
61
+ ((?:\w+\.|`\w+`\.)?(?:\w+|`\w+`)) | \w+\((?:|\g<2>)\)
62
+ )
63
+ (?:\s+ASC|\s+DESC)?
64
+ )
65
+ (?:\s*,\s*\g<1>)*
66
+ \z
67
+ /ix
68
+
69
+ private_constant :COLUMN_NAME, :COLUMN_NAME_WITH_ORDER
70
+
71
+ private
72
+ def _type_cast(value)
73
+ case value
74
+ when Date, Time then value
75
+ else super
76
+ end
77
+ end
48
78
  end
49
79
  end
50
80
  end