activerecord 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 (340) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1086 -0
  3. data/MIT-LICENSE +22 -0
  4. data/README.rdoc +219 -0
  5. data/examples/performance.rb +185 -0
  6. data/examples/simple.rb +15 -0
  7. data/lib/active_record.rb +195 -0
  8. data/lib/active_record/aggregations.rb +285 -0
  9. data/lib/active_record/association_relation.rb +49 -0
  10. data/lib/active_record/associations.rb +1865 -0
  11. data/lib/active_record/associations/alias_tracker.rb +81 -0
  12. data/lib/active_record/associations/association.rb +340 -0
  13. data/lib/active_record/associations/association_scope.rb +166 -0
  14. data/lib/active_record/associations/belongs_to_association.rb +124 -0
  15. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +36 -0
  16. data/lib/active_record/associations/builder/association.rb +136 -0
  17. data/lib/active_record/associations/builder/belongs_to.rb +130 -0
  18. data/lib/active_record/associations/builder/collection_association.rb +72 -0
  19. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +114 -0
  20. data/lib/active_record/associations/builder/has_many.rb +19 -0
  21. data/lib/active_record/associations/builder/has_one.rb +64 -0
  22. data/lib/active_record/associations/builder/singular_association.rb +44 -0
  23. data/lib/active_record/associations/collection_association.rb +498 -0
  24. data/lib/active_record/associations/collection_proxy.rb +1128 -0
  25. data/lib/active_record/associations/foreign_association.rb +20 -0
  26. data/lib/active_record/associations/has_many_association.rb +136 -0
  27. data/lib/active_record/associations/has_many_through_association.rb +220 -0
  28. data/lib/active_record/associations/has_one_association.rb +118 -0
  29. data/lib/active_record/associations/has_one_through_association.rb +45 -0
  30. data/lib/active_record/associations/join_dependency.rb +262 -0
  31. data/lib/active_record/associations/join_dependency/join_association.rb +80 -0
  32. data/lib/active_record/associations/join_dependency/join_base.rb +23 -0
  33. data/lib/active_record/associations/join_dependency/join_part.rb +71 -0
  34. data/lib/active_record/associations/preloader.rb +201 -0
  35. data/lib/active_record/associations/preloader/association.rb +133 -0
  36. data/lib/active_record/associations/preloader/through_association.rb +116 -0
  37. data/lib/active_record/associations/singular_association.rb +59 -0
  38. data/lib/active_record/associations/through_association.rb +121 -0
  39. data/lib/active_record/attribute_assignment.rb +85 -0
  40. data/lib/active_record/attribute_decorators.rb +90 -0
  41. data/lib/active_record/attribute_methods.rb +420 -0
  42. data/lib/active_record/attribute_methods/before_type_cast.rb +81 -0
  43. data/lib/active_record/attribute_methods/dirty.rb +221 -0
  44. data/lib/active_record/attribute_methods/primary_key.rb +136 -0
  45. data/lib/active_record/attribute_methods/query.rb +41 -0
  46. data/lib/active_record/attribute_methods/read.rb +47 -0
  47. data/lib/active_record/attribute_methods/serialization.rb +90 -0
  48. data/lib/active_record/attribute_methods/time_zone_conversion.rb +91 -0
  49. data/lib/active_record/attribute_methods/write.rb +61 -0
  50. data/lib/active_record/attributes.rb +279 -0
  51. data/lib/active_record/autosave_association.rb +512 -0
  52. data/lib/active_record/base.rb +328 -0
  53. data/lib/active_record/callbacks.rb +339 -0
  54. data/lib/active_record/coders/json.rb +15 -0
  55. data/lib/active_record/coders/yaml_column.rb +50 -0
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +1175 -0
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +85 -0
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +516 -0
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +155 -0
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +251 -0
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +23 -0
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -0
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +713 -0
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +93 -0
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1475 -0
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +323 -0
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +772 -0
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +830 -0
  69. data/lib/active_record/connection_adapters/column.rb +95 -0
  70. data/lib/active_record/connection_adapters/connection_specification.rb +297 -0
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +202 -0
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +72 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +146 -0
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +30 -0
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +184 -0
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid.rb +34 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +92 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +50 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +23 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +21 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +71 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +41 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +65 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +97 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
  104. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +113 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +26 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +205 -0
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +43 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +222 -0
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +776 -0
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +81 -0
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +953 -0
  117. data/lib/active_record/connection_adapters/schema_cache.rb +141 -0
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  119. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +120 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +103 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  126. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +561 -0
  127. data/lib/active_record/connection_adapters/statement_pool.rb +61 -0
  128. data/lib/active_record/connection_handling.rb +274 -0
  129. data/lib/active_record/core.rb +603 -0
  130. data/lib/active_record/counter_cache.rb +193 -0
  131. data/lib/active_record/database_configurations.rb +233 -0
  132. data/lib/active_record/database_configurations/database_config.rb +37 -0
  133. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  134. data/lib/active_record/database_configurations/url_config.rb +79 -0
  135. data/lib/active_record/define_callbacks.rb +22 -0
  136. data/lib/active_record/dynamic_matchers.rb +122 -0
  137. data/lib/active_record/enum.rb +274 -0
  138. data/lib/active_record/errors.rb +388 -0
  139. data/lib/active_record/explain.rb +50 -0
  140. data/lib/active_record/explain_registry.rb +32 -0
  141. data/lib/active_record/explain_subscriber.rb +34 -0
  142. data/lib/active_record/fixture_set/file.rb +82 -0
  143. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  144. data/lib/active_record/fixture_set/render_context.rb +17 -0
  145. data/lib/active_record/fixture_set/table_row.rb +153 -0
  146. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  147. data/lib/active_record/fixtures.rb +738 -0
  148. data/lib/active_record/gem_version.rb +17 -0
  149. data/lib/active_record/inheritance.rb +293 -0
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +207 -0
  152. data/lib/active_record/internal_metadata.rb +53 -0
  153. data/lib/active_record/legacy_yaml_adapter.rb +48 -0
  154. data/lib/active_record/locale/en.yml +48 -0
  155. data/lib/active_record/locking/optimistic.rb +197 -0
  156. data/lib/active_record/locking/pessimistic.rb +89 -0
  157. data/lib/active_record/log_subscriber.rb +118 -0
  158. data/lib/active_record/middleware/database_selector.rb +75 -0
  159. data/lib/active_record/middleware/database_selector/resolver.rb +88 -0
  160. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  161. data/lib/active_record/migration.rb +1397 -0
  162. data/lib/active_record/migration/command_recorder.rb +284 -0
  163. data/lib/active_record/migration/compatibility.rb +244 -0
  164. data/lib/active_record/migration/join_table.rb +17 -0
  165. data/lib/active_record/model_schema.rb +545 -0
  166. data/lib/active_record/nested_attributes.rb +600 -0
  167. data/lib/active_record/no_touching.rb +65 -0
  168. data/lib/active_record/null_relation.rb +68 -0
  169. data/lib/active_record/persistence.rb +967 -0
  170. data/lib/active_record/query_cache.rb +52 -0
  171. data/lib/active_record/querying.rb +82 -0
  172. data/lib/active_record/railtie.rb +263 -0
  173. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  174. data/lib/active_record/railties/console_sandbox.rb +7 -0
  175. data/lib/active_record/railties/controller_runtime.rb +51 -0
  176. data/lib/active_record/railties/databases.rake +527 -0
  177. data/lib/active_record/readonly_attributes.rb +24 -0
  178. data/lib/active_record/reflection.rb +1042 -0
  179. data/lib/active_record/relation.rb +860 -0
  180. data/lib/active_record/relation/batches.rb +290 -0
  181. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  182. data/lib/active_record/relation/calculations.rb +424 -0
  183. data/lib/active_record/relation/delegation.rb +130 -0
  184. data/lib/active_record/relation/finder_methods.rb +561 -0
  185. data/lib/active_record/relation/from_clause.rb +26 -0
  186. data/lib/active_record/relation/merger.rb +184 -0
  187. data/lib/active_record/relation/predicate_builder.rb +150 -0
  188. data/lib/active_record/relation/predicate_builder/array_handler.rb +49 -0
  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 +18 -0
  191. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  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 +22 -0
  194. data/lib/active_record/relation/predicate_builder/relation_handler.rb +19 -0
  195. data/lib/active_record/relation/query_attribute.rb +50 -0
  196. data/lib/active_record/relation/query_methods.rb +1371 -0
  197. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  198. data/lib/active_record/relation/spawn_methods.rb +77 -0
  199. data/lib/active_record/relation/where_clause.rb +190 -0
  200. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  201. data/lib/active_record/result.rb +168 -0
  202. data/lib/active_record/runtime_registry.rb +24 -0
  203. data/lib/active_record/sanitization.rb +214 -0
  204. data/lib/active_record/schema.rb +61 -0
  205. data/lib/active_record/schema_dumper.rb +270 -0
  206. data/lib/active_record/schema_migration.rb +60 -0
  207. data/lib/active_record/scoping.rb +106 -0
  208. data/lib/active_record/scoping/default.rb +151 -0
  209. data/lib/active_record/scoping/named.rb +217 -0
  210. data/lib/active_record/secure_token.rb +40 -0
  211. data/lib/active_record/serialization.rb +22 -0
  212. data/lib/active_record/statement_cache.rb +148 -0
  213. data/lib/active_record/store.rb +290 -0
  214. data/lib/active_record/suppressor.rb +61 -0
  215. data/lib/active_record/table_metadata.rb +75 -0
  216. data/lib/active_record/tasks/database_tasks.rb +506 -0
  217. data/lib/active_record/tasks/mysql_database_tasks.rb +115 -0
  218. data/lib/active_record/tasks/postgresql_database_tasks.rb +141 -0
  219. data/lib/active_record/tasks/sqlite_database_tasks.rb +77 -0
  220. data/lib/active_record/test_databases.rb +23 -0
  221. data/lib/active_record/test_fixtures.rb +224 -0
  222. data/lib/active_record/timestamp.rb +167 -0
  223. data/lib/active_record/touch_later.rb +66 -0
  224. data/lib/active_record/transactions.rb +493 -0
  225. data/lib/active_record/translation.rb +24 -0
  226. data/lib/active_record/type.rb +78 -0
  227. data/lib/active_record/type/adapter_specific_registry.rb +129 -0
  228. data/lib/active_record/type/date.rb +9 -0
  229. data/lib/active_record/type/date_time.rb +9 -0
  230. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  231. data/lib/active_record/type/hash_lookup_type_map.rb +25 -0
  232. data/lib/active_record/type/internal/timezone.rb +17 -0
  233. data/lib/active_record/type/json.rb +30 -0
  234. data/lib/active_record/type/serialized.rb +71 -0
  235. data/lib/active_record/type/text.rb +11 -0
  236. data/lib/active_record/type/time.rb +21 -0
  237. data/lib/active_record/type/type_map.rb +62 -0
  238. data/lib/active_record/type/unsigned_integer.rb +17 -0
  239. data/lib/active_record/type_caster.rb +9 -0
  240. data/lib/active_record/type_caster/connection.rb +34 -0
  241. data/lib/active_record/type_caster/map.rb +20 -0
  242. data/lib/active_record/validations.rb +94 -0
  243. data/lib/active_record/validations/absence.rb +25 -0
  244. data/lib/active_record/validations/associated.rb +60 -0
  245. data/lib/active_record/validations/length.rb +26 -0
  246. data/lib/active_record/validations/presence.rb +68 -0
  247. data/lib/active_record/validations/uniqueness.rb +226 -0
  248. data/lib/active_record/version.rb +10 -0
  249. data/lib/arel.rb +58 -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 +257 -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 +204 -0
  317. data/lib/arel/visitors/dot.rb +297 -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 +157 -0
  321. data/lib/arel/visitors/mysql.rb +83 -0
  322. data/lib/arel/visitors/oracle.rb +159 -0
  323. data/lib/arel/visitors/oracle12.rb +66 -0
  324. data/lib/arel/visitors/postgresql.rb +110 -0
  325. data/lib/arel/visitors/sqlite.rb +39 -0
  326. data/lib/arel/visitors/to_sql.rb +889 -0
  327. data/lib/arel/visitors/visitor.rb +46 -0
  328. data/lib/arel/visitors/where_sql.rb +23 -0
  329. data/lib/arel/window_predications.rb +9 -0
  330. data/lib/rails/generators/active_record.rb +19 -0
  331. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  332. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  333. data/lib/rails/generators/active_record/migration.rb +48 -0
  334. data/lib/rails/generators/active_record/migration/migration_generator.rb +75 -0
  335. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  336. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
  337. data/lib/rails/generators/active_record/model/model_generator.rb +49 -0
  338. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  339. data/lib/rails/generators/active_record/model/templates/module.rb.tt +7 -0
  340. metadata +418 -0
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/deprecation"
4
+
5
+ module ActiveRecord
6
+ module ConnectionAdapters # :nodoc:
7
+ module DatabaseLimits
8
+ def max_identifier_length # :nodoc:
9
+ 64
10
+ end
11
+
12
+ # Returns the maximum length of a table alias.
13
+ def table_alias_length
14
+ max_identifier_length
15
+ end
16
+
17
+ # Returns the maximum length of a column name.
18
+ def column_name_length
19
+ max_identifier_length
20
+ end
21
+ deprecate :column_name_length
22
+
23
+ # Returns the maximum length of a table name.
24
+ def table_name_length
25
+ max_identifier_length
26
+ end
27
+ deprecate :table_name_length
28
+
29
+ # Returns the maximum allowed length for an index name. This
30
+ # limit is enforced by \Rails and is less than or equal to
31
+ # #index_name_length. The gap between
32
+ # #index_name_length is to allow internal \Rails
33
+ # operations to use prefixes in temporary operations.
34
+ def allowed_index_name_length
35
+ index_name_length
36
+ end
37
+
38
+ # Returns the maximum length of an index name.
39
+ def index_name_length
40
+ max_identifier_length
41
+ end
42
+
43
+ # Returns the maximum number of columns per table.
44
+ def columns_per_table
45
+ 1024
46
+ end
47
+ deprecate :columns_per_table
48
+
49
+ # Returns the maximum number of indexes per table.
50
+ def indexes_per_table
51
+ 16
52
+ end
53
+ deprecate :indexes_per_table
54
+
55
+ # Returns the maximum number of columns in a multicolumn index.
56
+ def columns_per_multicolumn_index
57
+ 16
58
+ end
59
+ deprecate :columns_per_multicolumn_index
60
+
61
+ # Returns the maximum number of elements in an IN (x,y,z) clause.
62
+ # +nil+ means no limit.
63
+ def in_clause_length
64
+ nil
65
+ end
66
+
67
+ # Returns the maximum length of an SQL query.
68
+ def sql_query_length
69
+ 1048575
70
+ end
71
+ deprecate :sql_query_length
72
+
73
+ # Returns maximum number of joins in a single query.
74
+ def joins_per_query
75
+ 256
76
+ end
77
+ deprecate :joins_per_query
78
+
79
+ private
80
+ def bind_params_length
81
+ 65535
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,516 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module ConnectionAdapters # :nodoc:
5
+ module DatabaseStatements
6
+ def initialize
7
+ super
8
+ reset_transaction
9
+ end
10
+
11
+ # Converts an arel AST to SQL
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]
37
+ else
38
+ visitor.preparable = false if prepared_statements
39
+ [arel_or_sql_string.dup.freeze, binds]
40
+ end
41
+ end
42
+ private :to_sql_and_binds
43
+
44
+ # This is used in the StatementCache object. It returns an object that
45
+ # can be used to query the database repeatedly.
46
+ def cacheable_query(klass, arel) # :nodoc:
47
+ if prepared_statements
48
+ sql, binds = visitor.compile(arel.ast, collector)
49
+ query = klass.query(sql)
50
+ else
51
+ collector = klass.partial_query_collector
52
+ parts, binds = visitor.compile(arel.ast, collector)
53
+ query = klass.partial_query(parts)
54
+ end
55
+ [query, binds]
56
+ end
57
+
58
+ # Returns an ActiveRecord::Result instance.
59
+ def select_all(arel, name = nil, binds = [], preparable: nil)
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
65
+ end
66
+
67
+ if prepared_statements && preparable
68
+ select_prepared(sql, name, binds)
69
+ else
70
+ select(sql, name, binds)
71
+ end
72
+ end
73
+
74
+ # Returns a record hash with the column names as keys and column values
75
+ # as values.
76
+ def select_one(arel, name = nil, binds = [])
77
+ select_all(arel, name, binds).first
78
+ end
79
+
80
+ # Returns a single value from a record
81
+ def select_value(arel, name = nil, binds = [])
82
+ single_value_from_rows(select_rows(arel, name, binds))
83
+ end
84
+
85
+ # Returns an array of the values of the first column in a select:
86
+ # select_values("SELECT id FROM companies LIMIT 3") => [1,2,3]
87
+ def select_values(arel, name = nil, binds = [])
88
+ select_rows(arel, name, binds).map(&:first)
89
+ end
90
+
91
+ # Returns an array of arrays containing the field values.
92
+ # Order is the same as that returned by +columns+.
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
112
+ end
113
+
114
+ # Executes the SQL statement in the context of this connection and returns
115
+ # the raw result from the connection adapter.
116
+ # Note: depending on your database connector, the result returned by this
117
+ # method may be manually memory managed. Consider using the exec_query
118
+ # wrapper instead.
119
+ def execute(sql, name = nil)
120
+ raise NotImplementedError
121
+ end
122
+
123
+ # Executes +sql+ statement in the context of this connection using
124
+ # +binds+ as the bind substitutes. +name+ is logged along with
125
+ # the executed +sql+ statement.
126
+ def exec_query(sql, name = "SQL", binds = [], prepare: false)
127
+ raise NotImplementedError
128
+ end
129
+
130
+ # Executes insert +sql+ statement in the context of this connection using
131
+ # +binds+ as the bind substitutes. +name+ is logged along with
132
+ # the executed +sql+ statement.
133
+ def exec_insert(sql, name = nil, binds = [], pk = nil, sequence_name = nil)
134
+ sql, binds = sql_for_insert(sql, pk, binds)
135
+ exec_query(sql, name, binds)
136
+ end
137
+
138
+ # Executes delete +sql+ statement in the context of this connection using
139
+ # +binds+ as the bind substitutes. +name+ is logged along with
140
+ # the executed +sql+ statement.
141
+ def exec_delete(sql, name = nil, binds = [])
142
+ exec_query(sql, name, binds)
143
+ end
144
+
145
+ # Executes update +sql+ statement in the context of this connection using
146
+ # +binds+ as the bind substitutes. +name+ is logged along with
147
+ # the executed +sql+ statement.
148
+ def exec_update(sql, name = nil, binds = [])
149
+ exec_query(sql, name, binds)
150
+ end
151
+
152
+ def exec_insert_all(sql, name) # :nodoc:
153
+ exec_query(sql, name)
154
+ end
155
+
156
+ # Executes an INSERT query and returns the new record's ID
157
+ #
158
+ # +id_value+ will be returned unless the value is +nil+, in
159
+ # which case the database will attempt to calculate the last inserted
160
+ # id and return that value.
161
+ #
162
+ # If the next id was calculated in advance (as in Oracle), it should be
163
+ # passed in as +id_value+.
164
+ def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
165
+ sql, binds = to_sql_and_binds(arel, binds)
166
+ value = exec_insert(sql, name, binds, pk, sequence_name)
167
+ id_value || last_inserted_id(value)
168
+ end
169
+ alias create insert
170
+
171
+ # Executes the update statement and returns the number of rows affected.
172
+ def update(arel, name = nil, binds = [])
173
+ sql, binds = to_sql_and_binds(arel, binds)
174
+ exec_update(sql, name, binds)
175
+ end
176
+
177
+ # Executes the delete statement and returns the number of rows affected.
178
+ def delete(arel, name = nil, 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_statements(table_name), name)
186
+ end
187
+
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
+ Array(build_truncate_statements(*table_names)).each do |sql|
194
+ execute_batch(sql, "Truncate Tables")
195
+ end
196
+ end
197
+ end
198
+ end
199
+
200
+ # Runs the given block in a database transaction, and returns the result
201
+ # of the block.
202
+ #
203
+ # == Nested transactions support
204
+ #
205
+ # Most databases don't support true nested transactions. At the time of
206
+ # writing, the only database that supports true nested transactions that
207
+ # we're aware of, is MS-SQL.
208
+ #
209
+ # In order to get around this problem, #transaction will emulate the effect
210
+ # of nested transactions, by using savepoints:
211
+ # https://dev.mysql.com/doc/refman/5.7/en/savepoint.html
212
+ # Savepoints are supported by MySQL and PostgreSQL. SQLite3 version >= '3.6.8'
213
+ # supports savepoints.
214
+ #
215
+ # It is safe to call this method if a database transaction is already open,
216
+ # i.e. if #transaction is called within another #transaction block. In case
217
+ # of a nested call, #transaction will behave as follows:
218
+ #
219
+ # - The block will be run without doing anything. All database statements
220
+ # that happen within the block are effectively appended to the already
221
+ # open database transaction.
222
+ # - However, if +:requires_new+ is set, the block will be wrapped in a
223
+ # database savepoint acting as a sub-transaction.
224
+ #
225
+ # === Caveats
226
+ #
227
+ # MySQL doesn't support DDL transactions. If you perform a DDL operation,
228
+ # then any created savepoints will be automatically released. For example,
229
+ # if you've created a savepoint, then you execute a CREATE TABLE statement,
230
+ # then the savepoint that was created will be automatically released.
231
+ #
232
+ # This means that, on MySQL, you shouldn't execute DDL operations inside
233
+ # a #transaction call that you know might create a savepoint. Otherwise,
234
+ # #transaction will raise exceptions when it tries to release the
235
+ # already-automatically-released savepoints:
236
+ #
237
+ # Model.connection.transaction do # BEGIN
238
+ # Model.connection.transaction(requires_new: true) do # CREATE SAVEPOINT active_record_1
239
+ # Model.connection.create_table(...)
240
+ # # active_record_1 now automatically released
241
+ # end # RELEASE SAVEPOINT active_record_1 <--- BOOM! database error!
242
+ # end
243
+ #
244
+ # == Transaction isolation
245
+ #
246
+ # If your database supports setting the isolation level for a transaction, you can set
247
+ # it like so:
248
+ #
249
+ # Post.transaction(isolation: :serializable) do
250
+ # # ...
251
+ # end
252
+ #
253
+ # Valid isolation levels are:
254
+ #
255
+ # * <tt>:read_uncommitted</tt>
256
+ # * <tt>:read_committed</tt>
257
+ # * <tt>:repeatable_read</tt>
258
+ # * <tt>:serializable</tt>
259
+ #
260
+ # You should consult the documentation for your database to understand the
261
+ # semantics of these different levels:
262
+ #
263
+ # * https://www.postgresql.org/docs/current/static/transaction-iso.html
264
+ # * https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html
265
+ #
266
+ # An ActiveRecord::TransactionIsolationError will be raised if:
267
+ #
268
+ # * The adapter does not support setting the isolation level
269
+ # * You are joining an existing open transaction
270
+ # * You are creating a nested (savepoint) transaction
271
+ #
272
+ # The mysql2 and postgresql adapters support setting the transaction
273
+ # isolation level.
274
+ def transaction(requires_new: nil, isolation: nil, joinable: true)
275
+ if !requires_new && current_transaction.joinable?
276
+ if isolation
277
+ raise ActiveRecord::TransactionIsolationError, "cannot set isolation when joining a transaction"
278
+ end
279
+ yield
280
+ else
281
+ transaction_manager.within_new_transaction(isolation: isolation, joinable: joinable) { yield }
282
+ end
283
+ rescue ActiveRecord::Rollback
284
+ # rollbacks are silently swallowed
285
+ end
286
+
287
+ attr_reader :transaction_manager #:nodoc:
288
+
289
+ delegate :within_new_transaction, :open_transactions, :current_transaction, :begin_transaction,
290
+ :commit_transaction, :rollback_transaction, :materialize_transactions,
291
+ :disable_lazy_transactions!, :enable_lazy_transactions!, to: :transaction_manager
292
+
293
+ def transaction_open?
294
+ current_transaction.open?
295
+ end
296
+
297
+ def reset_transaction #:nodoc:
298
+ @transaction_manager = ConnectionAdapters::TransactionManager.new(self)
299
+ end
300
+
301
+ # Register a record with the current transaction so that its after_commit and after_rollback callbacks
302
+ # can be called.
303
+ def add_transaction_record(record)
304
+ current_transaction.add_record(record)
305
+ end
306
+
307
+ def transaction_state
308
+ current_transaction.state
309
+ end
310
+
311
+ # Begins the transaction (and turns off auto-committing).
312
+ def begin_db_transaction() end
313
+
314
+ def transaction_isolation_levels
315
+ {
316
+ read_uncommitted: "READ UNCOMMITTED",
317
+ read_committed: "READ COMMITTED",
318
+ repeatable_read: "REPEATABLE READ",
319
+ serializable: "SERIALIZABLE"
320
+ }
321
+ end
322
+
323
+ # Begins the transaction with the isolation level set. Raises an error by
324
+ # default; adapters that support setting the isolation level should implement
325
+ # this method.
326
+ def begin_isolated_db_transaction(isolation)
327
+ raise ActiveRecord::TransactionIsolationError, "adapter does not support setting transaction isolation"
328
+ end
329
+
330
+ # Commits the transaction (and turns on auto-committing).
331
+ def commit_db_transaction() end
332
+
333
+ # Rolls back the transaction (and turns on auto-committing). Must be
334
+ # done if the transaction block raises an exception or returns false.
335
+ def rollback_db_transaction
336
+ exec_rollback_db_transaction
337
+ end
338
+
339
+ def exec_rollback_db_transaction() end #:nodoc:
340
+
341
+ def rollback_to_savepoint(name = nil)
342
+ exec_rollback_to_savepoint(name)
343
+ end
344
+
345
+ def default_sequence_name(table, column)
346
+ nil
347
+ end
348
+
349
+ # Set the sequence to the max value of the table's column.
350
+ def reset_sequence!(table, column, sequence = nil)
351
+ # Do nothing by default. Implement for PostgreSQL, Oracle, ...
352
+ end
353
+
354
+ # Inserts the given fixture into the table. Overridden in adapters that require
355
+ # something beyond a simple insert (eg. Oracle).
356
+ # Most of adapters should implement `insert_fixtures_set` that leverages bulk SQL insert.
357
+ # We keep this method to provide fallback
358
+ # for databases like sqlite that do not support bulk inserts.
359
+ def insert_fixture(fixture, table_name)
360
+ execute(build_fixture_sql(Array.wrap(fixture), table_name), "Fixture Insert")
361
+ end
362
+
363
+ def insert_fixtures_set(fixture_set, tables_to_delete = [])
364
+ fixture_inserts = build_fixture_statements(fixture_set)
365
+ table_deletes = tables_to_delete.map { |table| "DELETE FROM #{quote_table_name(table)}" }
366
+ total_sql = Array(combine_multi_statements(table_deletes + fixture_inserts))
367
+
368
+ with_multi_statements do
369
+ disable_referential_integrity do
370
+ transaction(requires_new: true) do
371
+ total_sql.each do |sql|
372
+ execute_batch(sql, "Fixtures Load")
373
+ end
374
+ end
375
+ end
376
+ end
377
+ end
378
+
379
+ def empty_insert_statement_value(primary_key = nil)
380
+ "DEFAULT VALUES"
381
+ end
382
+
383
+ # Sanitizes the given LIMIT parameter in order to prevent SQL injection.
384
+ #
385
+ # The +limit+ may be anything that can evaluate to a string via #to_s. It
386
+ # should look like an integer, or an Arel SQL literal.
387
+ #
388
+ # Returns Integer and Arel::Nodes::SqlLiteral limits as is.
389
+ def sanitize_limit(limit)
390
+ if limit.is_a?(Integer) || limit.is_a?(Arel::Nodes::SqlLiteral)
391
+ limit
392
+ else
393
+ Integer(limit)
394
+ end
395
+ end
396
+
397
+ # Fixture value is quoted by Arel, however scalar values
398
+ # are not quotable. In this case we want to convert
399
+ # the column value to YAML.
400
+ def with_yaml_fallback(value) # :nodoc:
401
+ if value.is_a?(Hash) || value.is_a?(Array)
402
+ YAML.dump(value)
403
+ else
404
+ value
405
+ end
406
+ end
407
+
408
+ private
409
+ def execute_batch(sql, name = nil)
410
+ execute(sql, name)
411
+ end
412
+
413
+ DEFAULT_INSERT_VALUE = Arel.sql("DEFAULT").freeze
414
+ private_constant :DEFAULT_INSERT_VALUE
415
+
416
+ def default_insert_value(column)
417
+ DEFAULT_INSERT_VALUE
418
+ end
419
+
420
+ def build_fixture_sql(fixtures, table_name)
421
+ columns = schema_cache.columns_hash(table_name)
422
+
423
+ values_list = fixtures.map do |fixture|
424
+ fixture = fixture.stringify_keys
425
+
426
+ unknown_columns = fixture.keys - columns.keys
427
+ if unknown_columns.any?
428
+ raise Fixture::FixtureError, %(table "#{table_name}" has no columns named #{unknown_columns.map(&:inspect).join(', ')}.)
429
+ end
430
+
431
+ columns.map do |name, column|
432
+ if fixture.key?(name)
433
+ type = lookup_cast_type_from_column(column)
434
+ with_yaml_fallback(type.serialize(fixture[name]))
435
+ else
436
+ default_insert_value(column)
437
+ end
438
+ end
439
+ end
440
+
441
+ table = Arel::Table.new(table_name)
442
+ manager = Arel::InsertManager.new
443
+ manager.into(table)
444
+
445
+ if values_list.size == 1
446
+ values = values_list.shift
447
+ new_values = []
448
+ columns.each_key.with_index { |column, i|
449
+ unless values[i].equal?(DEFAULT_INSERT_VALUE)
450
+ new_values << values[i]
451
+ manager.columns << table[column]
452
+ end
453
+ }
454
+ values_list << new_values
455
+ else
456
+ columns.each_key { |column| manager.columns << table[column] }
457
+ end
458
+
459
+ manager.values = manager.create_values_list(values_list)
460
+ manager.to_sql
461
+ end
462
+
463
+ def build_fixture_statements(fixture_set)
464
+ fixture_set.map do |table_name, fixtures|
465
+ next if fixtures.empty?
466
+ build_fixture_sql(fixtures, table_name)
467
+ end.compact
468
+ end
469
+
470
+ def build_truncate_statements(*table_names)
471
+ truncate_tables = table_names.map do |table_name|
472
+ "TRUNCATE TABLE #{quote_table_name(table_name)}"
473
+ end
474
+ combine_multi_statements(truncate_tables)
475
+ end
476
+
477
+ def with_multi_statements
478
+ yield
479
+ end
480
+
481
+ def combine_multi_statements(total_sql)
482
+ total_sql.join(";\n")
483
+ end
484
+
485
+ # Returns an ActiveRecord::Result instance.
486
+ def select(sql, name = nil, binds = [])
487
+ exec_query(sql, name, binds, prepare: false)
488
+ end
489
+
490
+ def select_prepared(sql, name = nil, binds = [])
491
+ exec_query(sql, name, binds, prepare: true)
492
+ end
493
+
494
+ def sql_for_insert(sql, pk, binds)
495
+ [sql, binds]
496
+ end
497
+
498
+ def last_inserted_id(result)
499
+ single_value_from_rows(result.rows)
500
+ end
501
+
502
+ def single_value_from_rows(rows)
503
+ row = rows.first
504
+ row && row.first
505
+ end
506
+
507
+ def arel_from_relation(relation)
508
+ if relation.is_a?(Relation)
509
+ relation.arel
510
+ else
511
+ relation
512
+ end
513
+ end
514
+ end
515
+ end
516
+ end