activerecord 5.0.7.2 → 6.0.6.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 (359) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +844 -1944
  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/advisory_lock_base.rb +18 -0
  8. data/lib/active_record/aggregations.rb +249 -247
  9. data/lib/active_record/association_relation.rb +18 -14
  10. data/lib/active_record/associations/alias_tracker.rb +24 -34
  11. data/lib/active_record/associations/association.rb +113 -55
  12. data/lib/active_record/associations/association_scope.rb +102 -96
  13. data/lib/active_record/associations/belongs_to_association.rb +58 -42
  14. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  15. data/lib/active_record/associations/builder/association.rb +18 -25
  16. data/lib/active_record/associations/builder/belongs_to.rb +43 -54
  17. data/lib/active_record/associations/builder/collection_association.rb +7 -18
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +41 -62
  19. data/lib/active_record/associations/builder/has_many.rb +4 -0
  20. data/lib/active_record/associations/builder/has_one.rb +37 -1
  21. data/lib/active_record/associations/builder/singular_association.rb +4 -0
  22. data/lib/active_record/associations/collection_association.rb +93 -254
  23. data/lib/active_record/associations/collection_proxy.rb +159 -122
  24. data/lib/active_record/associations/foreign_association.rb +9 -0
  25. data/lib/active_record/associations/has_many_association.rb +23 -30
  26. data/lib/active_record/associations/has_many_through_association.rb +58 -44
  27. data/lib/active_record/associations/has_one_association.rb +59 -54
  28. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  29. data/lib/active_record/associations/join_dependency/join_association.rb +43 -85
  30. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  31. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  32. data/lib/active_record/associations/join_dependency.rb +152 -177
  33. data/lib/active_record/associations/preloader/association.rb +101 -97
  34. data/lib/active_record/associations/preloader/through_association.rb +77 -76
  35. data/lib/active_record/associations/preloader.rb +94 -103
  36. data/lib/active_record/associations/singular_association.rb +12 -45
  37. data/lib/active_record/associations/through_association.rb +27 -15
  38. data/lib/active_record/associations.rb +1603 -1592
  39. data/lib/active_record/attribute_assignment.rb +54 -61
  40. data/lib/active_record/attribute_decorators.rb +38 -17
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +12 -8
  42. data/lib/active_record/attribute_methods/dirty.rb +179 -109
  43. data/lib/active_record/attribute_methods/primary_key.rb +85 -92
  44. data/lib/active_record/attribute_methods/query.rb +4 -3
  45. data/lib/active_record/attribute_methods/read.rb +20 -49
  46. data/lib/active_record/attribute_methods/serialization.rb +29 -7
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -66
  48. data/lib/active_record/attribute_methods/write.rb +34 -33
  49. data/lib/active_record/attribute_methods.rb +66 -106
  50. data/lib/active_record/attributes.rb +38 -25
  51. data/lib/active_record/autosave_association.rb +58 -39
  52. data/lib/active_record/base.rb +27 -24
  53. data/lib/active_record/callbacks.rb +64 -35
  54. data/lib/active_record/coders/json.rb +2 -0
  55. data/lib/active_record/coders/yaml_column.rb +34 -13
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +558 -323
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +215 -94
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -35
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +128 -75
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -28
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +233 -147
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +400 -213
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -79
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +373 -202
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -562
  69. data/lib/active_record/connection_adapters/column.rb +41 -13
  70. data/lib/active_record/connection_adapters/connection_specification.rb +172 -139
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
  72. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +137 -49
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +48 -30
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +19 -31
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -54
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +12 -2
  92. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
  94. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
  95. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  97. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
  99. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +8 -4
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +20 -26
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +378 -308
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +383 -275
  117. data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
  119. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
  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 +261 -267
  127. data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
  128. data/lib/active_record/connection_handling.rb +143 -40
  129. data/lib/active_record/core.rb +207 -160
  130. data/lib/active_record/counter_cache.rb +60 -28
  131. data/lib/active_record/database_configurations/database_config.rb +37 -0
  132. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  133. data/lib/active_record/database_configurations/url_config.rb +78 -0
  134. data/lib/active_record/database_configurations.rb +233 -0
  135. data/lib/active_record/define_callbacks.rb +22 -0
  136. data/lib/active_record/dynamic_matchers.rb +87 -87
  137. data/lib/active_record/enum.rb +67 -23
  138. data/lib/active_record/errors.rb +114 -18
  139. data/lib/active_record/explain.rb +4 -4
  140. data/lib/active_record/explain_registry.rb +3 -1
  141. data/lib/active_record/explain_subscriber.rb +9 -4
  142. data/lib/active_record/fixture_set/file.rb +13 -8
  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 +152 -0
  146. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  147. data/lib/active_record/fixtures.rb +194 -504
  148. data/lib/active_record/gem_version.rb +5 -3
  149. data/lib/active_record/inheritance.rb +150 -99
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +116 -25
  152. data/lib/active_record/internal_metadata.rb +16 -19
  153. data/lib/active_record/legacy_yaml_adapter.rb +4 -2
  154. data/lib/active_record/locking/optimistic.rb +85 -86
  155. data/lib/active_record/locking/pessimistic.rb +18 -6
  156. data/lib/active_record/log_subscriber.rb +48 -29
  157. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  158. data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
  159. data/lib/active_record/middleware/database_selector.rb +74 -0
  160. data/lib/active_record/migration/command_recorder.rb +134 -100
  161. data/lib/active_record/migration/compatibility.rb +174 -56
  162. data/lib/active_record/migration/join_table.rb +8 -7
  163. data/lib/active_record/migration.rb +369 -302
  164. data/lib/active_record/model_schema.rb +160 -127
  165. data/lib/active_record/nested_attributes.rb +213 -202
  166. data/lib/active_record/no_touching.rb +12 -3
  167. data/lib/active_record/null_relation.rb +12 -34
  168. data/lib/active_record/persistence.rb +446 -77
  169. data/lib/active_record/query_cache.rb +13 -12
  170. data/lib/active_record/querying.rb +37 -24
  171. data/lib/active_record/railtie.rb +128 -36
  172. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  173. data/lib/active_record/railties/console_sandbox.rb +2 -0
  174. data/lib/active_record/railties/controller_runtime.rb +34 -33
  175. data/lib/active_record/railties/databases.rake +312 -177
  176. data/lib/active_record/readonly_attributes.rb +5 -4
  177. data/lib/active_record/reflection.rb +214 -254
  178. data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
  179. data/lib/active_record/relation/batches.rb +98 -52
  180. data/lib/active_record/relation/calculations.rb +212 -173
  181. data/lib/active_record/relation/delegation.rb +73 -69
  182. data/lib/active_record/relation/finder_methods.rb +207 -247
  183. data/lib/active_record/relation/from_clause.rb +6 -8
  184. data/lib/active_record/relation/merger.rb +82 -61
  185. data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
  186. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  187. data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
  188. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  189. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  190. data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
  191. data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
  192. data/lib/active_record/relation/predicate_builder.rb +83 -105
  193. data/lib/active_record/relation/query_attribute.rb +33 -2
  194. data/lib/active_record/relation/query_methods.rb +488 -332
  195. data/lib/active_record/relation/record_fetch_warning.rb +5 -3
  196. data/lib/active_record/relation/spawn_methods.rb +8 -8
  197. data/lib/active_record/relation/where_clause.rb +111 -96
  198. data/lib/active_record/relation/where_clause_factory.rb +6 -11
  199. data/lib/active_record/relation.rb +443 -318
  200. data/lib/active_record/result.rb +69 -40
  201. data/lib/active_record/runtime_registry.rb +5 -3
  202. data/lib/active_record/sanitization.rb +83 -99
  203. data/lib/active_record/schema.rb +7 -14
  204. data/lib/active_record/schema_dumper.rb +71 -69
  205. data/lib/active_record/schema_migration.rb +16 -6
  206. data/lib/active_record/scoping/default.rb +92 -95
  207. data/lib/active_record/scoping/named.rb +51 -26
  208. data/lib/active_record/scoping.rb +20 -20
  209. data/lib/active_record/secure_token.rb +4 -2
  210. data/lib/active_record/serialization.rb +2 -0
  211. data/lib/active_record/statement_cache.rb +63 -28
  212. data/lib/active_record/store.rb +121 -41
  213. data/lib/active_record/suppressor.rb +6 -3
  214. data/lib/active_record/table_metadata.rb +39 -18
  215. data/lib/active_record/tasks/database_tasks.rb +271 -81
  216. data/lib/active_record/tasks/mysql_database_tasks.rb +54 -91
  217. data/lib/active_record/tasks/postgresql_database_tasks.rb +77 -47
  218. data/lib/active_record/tasks/sqlite_database_tasks.rb +33 -16
  219. data/lib/active_record/test_databases.rb +23 -0
  220. data/lib/active_record/test_fixtures.rb +243 -0
  221. data/lib/active_record/timestamp.rb +70 -36
  222. data/lib/active_record/touch_later.rb +8 -6
  223. data/lib/active_record/transactions.rb +141 -157
  224. data/lib/active_record/translation.rb +3 -1
  225. data/lib/active_record/type/adapter_specific_registry.rb +44 -48
  226. data/lib/active_record/type/date.rb +2 -0
  227. data/lib/active_record/type/date_time.rb +2 -0
  228. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  229. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  230. data/lib/active_record/type/internal/timezone.rb +2 -0
  231. data/lib/active_record/type/json.rb +30 -0
  232. data/lib/active_record/type/serialized.rb +16 -9
  233. data/lib/active_record/type/text.rb +11 -0
  234. data/lib/active_record/type/time.rb +12 -1
  235. data/lib/active_record/type/type_map.rb +14 -17
  236. data/lib/active_record/type/unsigned_integer.rb +16 -0
  237. data/lib/active_record/type.rb +23 -18
  238. data/lib/active_record/type_caster/connection.rb +17 -12
  239. data/lib/active_record/type_caster/map.rb +5 -4
  240. data/lib/active_record/type_caster.rb +4 -2
  241. data/lib/active_record/validations/absence.rb +2 -0
  242. data/lib/active_record/validations/associated.rb +3 -2
  243. data/lib/active_record/validations/length.rb +2 -0
  244. data/lib/active_record/validations/presence.rb +4 -2
  245. data/lib/active_record/validations/uniqueness.rb +29 -42
  246. data/lib/active_record/validations.rb +7 -5
  247. data/lib/active_record/version.rb +3 -1
  248. data/lib/active_record.rb +37 -22
  249. data/lib/arel/alias_predication.rb +9 -0
  250. data/lib/arel/attributes/attribute.rb +37 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/collectors/bind.rb +24 -0
  253. data/lib/arel/collectors/composite.rb +31 -0
  254. data/lib/arel/collectors/plain_string.rb +20 -0
  255. data/lib/arel/collectors/sql_string.rb +20 -0
  256. data/lib/arel/collectors/substitute_binds.rb +28 -0
  257. data/lib/arel/crud.rb +42 -0
  258. data/lib/arel/delete_manager.rb +18 -0
  259. data/lib/arel/errors.rb +9 -0
  260. data/lib/arel/expressions.rb +29 -0
  261. data/lib/arel/factory_methods.rb +49 -0
  262. data/lib/arel/insert_manager.rb +49 -0
  263. data/lib/arel/math.rb +45 -0
  264. data/lib/arel/nodes/and.rb +32 -0
  265. data/lib/arel/nodes/ascending.rb +23 -0
  266. data/lib/arel/nodes/binary.rb +52 -0
  267. data/lib/arel/nodes/bind_param.rb +36 -0
  268. data/lib/arel/nodes/case.rb +55 -0
  269. data/lib/arel/nodes/casted.rb +50 -0
  270. data/lib/arel/nodes/comment.rb +29 -0
  271. data/lib/arel/nodes/count.rb +12 -0
  272. data/lib/arel/nodes/delete_statement.rb +45 -0
  273. data/lib/arel/nodes/descending.rb +23 -0
  274. data/lib/arel/nodes/equality.rb +18 -0
  275. data/lib/arel/nodes/extract.rb +24 -0
  276. data/lib/arel/nodes/false.rb +16 -0
  277. data/lib/arel/nodes/full_outer_join.rb +8 -0
  278. data/lib/arel/nodes/function.rb +44 -0
  279. data/lib/arel/nodes/grouping.rb +8 -0
  280. data/lib/arel/nodes/in.rb +8 -0
  281. data/lib/arel/nodes/infix_operation.rb +80 -0
  282. data/lib/arel/nodes/inner_join.rb +8 -0
  283. data/lib/arel/nodes/insert_statement.rb +37 -0
  284. data/lib/arel/nodes/join_source.rb +20 -0
  285. data/lib/arel/nodes/matches.rb +18 -0
  286. data/lib/arel/nodes/named_function.rb +23 -0
  287. data/lib/arel/nodes/node.rb +50 -0
  288. data/lib/arel/nodes/node_expression.rb +13 -0
  289. data/lib/arel/nodes/outer_join.rb +8 -0
  290. data/lib/arel/nodes/over.rb +15 -0
  291. data/lib/arel/nodes/regexp.rb +16 -0
  292. data/lib/arel/nodes/right_outer_join.rb +8 -0
  293. data/lib/arel/nodes/select_core.rb +67 -0
  294. data/lib/arel/nodes/select_statement.rb +41 -0
  295. data/lib/arel/nodes/sql_literal.rb +16 -0
  296. data/lib/arel/nodes/string_join.rb +11 -0
  297. data/lib/arel/nodes/table_alias.rb +27 -0
  298. data/lib/arel/nodes/terminal.rb +16 -0
  299. data/lib/arel/nodes/true.rb +16 -0
  300. data/lib/arel/nodes/unary.rb +45 -0
  301. data/lib/arel/nodes/unary_operation.rb +20 -0
  302. data/lib/arel/nodes/unqualified_column.rb +22 -0
  303. data/lib/arel/nodes/update_statement.rb +41 -0
  304. data/lib/arel/nodes/values_list.rb +9 -0
  305. data/lib/arel/nodes/window.rb +126 -0
  306. data/lib/arel/nodes/with.rb +11 -0
  307. data/lib/arel/nodes.rb +68 -0
  308. data/lib/arel/order_predications.rb +13 -0
  309. data/lib/arel/predications.rb +256 -0
  310. data/lib/arel/select_manager.rb +271 -0
  311. data/lib/arel/table.rb +110 -0
  312. data/lib/arel/tree_manager.rb +72 -0
  313. data/lib/arel/update_manager.rb +34 -0
  314. data/lib/arel/visitors/depth_first.rb +203 -0
  315. data/lib/arel/visitors/dot.rb +296 -0
  316. data/lib/arel/visitors/ibm_db.rb +34 -0
  317. data/lib/arel/visitors/informix.rb +62 -0
  318. data/lib/arel/visitors/mssql.rb +156 -0
  319. data/lib/arel/visitors/mysql.rb +83 -0
  320. data/lib/arel/visitors/oracle.rb +158 -0
  321. data/lib/arel/visitors/oracle12.rb +65 -0
  322. data/lib/arel/visitors/postgresql.rb +109 -0
  323. data/lib/arel/visitors/sqlite.rb +38 -0
  324. data/lib/arel/visitors/to_sql.rb +888 -0
  325. data/lib/arel/visitors/visitor.rb +45 -0
  326. data/lib/arel/visitors/where_sql.rb +22 -0
  327. data/lib/arel/visitors.rb +20 -0
  328. data/lib/arel/window_predications.rb +9 -0
  329. data/lib/arel.rb +62 -0
  330. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -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 -3
  335. data/lib/rails/generators/active_record/model/model_generator.rb +9 -30
  336. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  337. data/lib/rails/generators/active_record.rb +7 -5
  338. metadata +138 -52
  339. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  340. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  341. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  342. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  343. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  344. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  345. data/lib/active_record/associations/preloader/singular_association.rb +0 -20
  346. data/lib/active_record/attribute/user_provided_default.rb +0 -28
  347. data/lib/active_record/attribute.rb +0 -213
  348. data/lib/active_record/attribute_mutation_tracker.rb +0 -70
  349. data/lib/active_record/attribute_set/builder.rb +0 -132
  350. data/lib/active_record/attribute_set.rb +0 -110
  351. data/lib/active_record/collection_cache_key.rb +0 -50
  352. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  353. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  354. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  355. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  356. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  357. data/lib/active_record/type/internal/abstract_json.rb +0 -33
  358. /data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  359. /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,11 +1,17 @@
1
- require 'active_record/type'
2
- require 'active_record/connection_adapters/determine_if_preparable_visitor'
3
- require 'active_record/connection_adapters/schema_cache'
4
- require 'active_record/connection_adapters/sql_type_metadata'
5
- require 'active_record/connection_adapters/abstract/schema_dumper'
6
- require 'active_record/connection_adapters/abstract/schema_creation'
7
- require 'arel/collectors/bind'
8
- require 'arel/collectors/sql_string'
1
+ # frozen_string_literal: true
2
+
3
+ require "set"
4
+ require "active_record/connection_adapters/determine_if_preparable_visitor"
5
+ require "active_record/connection_adapters/schema_cache"
6
+ require "active_record/connection_adapters/sql_type_metadata"
7
+ require "active_record/connection_adapters/abstract/schema_dumper"
8
+ require "active_record/connection_adapters/abstract/schema_creation"
9
+ require "active_support/concurrency/load_interlock_aware_monitor"
10
+ require "active_support/deprecation"
11
+ require "arel/collectors/bind"
12
+ require "arel/collectors/composite"
13
+ require "arel/collectors/sql_string"
14
+ require "arel/collectors/substitute_binds"
9
15
 
10
16
  module ActiveRecord
11
17
  module ConnectionAdapters # :nodoc:
@@ -14,7 +20,7 @@ module ActiveRecord
14
20
  autoload :Column
15
21
  autoload :ConnectionSpecification
16
22
 
17
- autoload_at 'active_record/connection_adapters/abstract/schema_definitions' do
23
+ autoload_at "active_record/connection_adapters/abstract/schema_definitions" do
18
24
  autoload :IndexDefinition
19
25
  autoload :ColumnDefinition
20
26
  autoload :ChangeColumnDefinition
@@ -25,11 +31,11 @@ module ActiveRecord
25
31
  autoload :ReferenceDefinition
26
32
  end
27
33
 
28
- autoload_at 'active_record/connection_adapters/abstract/connection_pool' do
34
+ autoload_at "active_record/connection_adapters/abstract/connection_pool" do
29
35
  autoload :ConnectionHandler
30
36
  end
31
37
 
32
- autoload_under 'abstract' do
38
+ autoload_under "abstract" do
33
39
  autoload :SchemaStatements
34
40
  autoload :DatabaseStatements
35
41
  autoload :DatabaseLimits
@@ -39,7 +45,7 @@ module ActiveRecord
39
45
  autoload :Savepoints
40
46
  end
41
47
 
42
- autoload_at 'active_record/connection_adapters/abstract/transaction' do
48
+ autoload_at "active_record/connection_adapters/abstract/transaction" do
43
49
  autoload :TransactionManager
44
50
  autoload :NullTransaction
45
51
  autoload :RealTransaction
@@ -61,24 +67,28 @@ module ActiveRecord
61
67
  # Most of the methods in the adapter are useful during migrations. Most
62
68
  # notably, the instance methods provided by SchemaStatements are very useful.
63
69
  class AbstractAdapter
64
- ADAPTER_NAME = "Abstract".freeze
70
+ ADAPTER_NAME = "Abstract"
65
71
  include ActiveSupport::Callbacks
66
72
  define_callbacks :checkout, :checkin
67
73
 
68
74
  include Quoting, DatabaseStatements, SchemaStatements
69
75
  include DatabaseLimits
70
76
  include QueryCache
71
- include ColumnDumper
72
77
  include Savepoints
73
78
 
74
79
  SIMPLE_INT = /\A\d+\z/
80
+ COMMENT_REGEX = %r{/\*(?:[^\*]|\*[^/])*\*/}m
75
81
 
76
- attr_accessor :visitor, :pool
77
- attr_reader :schema_cache, :owner, :logger
82
+ attr_accessor :pool
83
+ attr_reader :visitor, :owner, :logger, :lock
78
84
  alias :in_use? :owner
79
85
 
86
+ set_callback :checkin, :after, :enable_lazy_transactions!
87
+
80
88
  def self.type_cast_config_to_integer(config)
81
- if config =~ SIMPLE_INT
89
+ if config.is_a?(Integer)
90
+ config
91
+ elsif SIMPLE_INT.match?(config)
82
92
  config.to_i
83
93
  else
84
94
  config
@@ -93,7 +103,22 @@ module ActiveRecord
93
103
  end
94
104
  end
95
105
 
96
- attr_reader :prepared_statements
106
+ DEFAULT_READ_QUERY = [:begin, :commit, :explain, :release, :rollback, :savepoint, :select, :with] # :nodoc:
107
+ private_constant :DEFAULT_READ_QUERY
108
+
109
+ def self.build_read_query_regexp(*parts) # :nodoc:
110
+ parts += DEFAULT_READ_QUERY
111
+ parts = parts.map { |part| /#{part}/i }
112
+ /\A(?:[\(\s]|#{COMMENT_REGEX})*#{Regexp.union(*parts)}/
113
+ end
114
+
115
+ def self.quoted_column_names # :nodoc:
116
+ @quoted_column_names ||= {}
117
+ end
118
+
119
+ def self.quoted_table_names # :nodoc:
120
+ @quoted_table_names ||= {}
121
+ end
97
122
 
98
123
  def initialize(connection, logger = nil, config = {}) # :nodoc:
99
124
  super()
@@ -103,10 +128,11 @@ module ActiveRecord
103
128
  @instrumenter = ActiveSupport::Notifications.instrumenter
104
129
  @logger = logger
105
130
  @config = config
106
- @pool = nil
107
- @schema_cache = SchemaCache.new self
108
- @quoted_column_names, @quoted_table_names = {}, {}
109
- @visitor = arel_visitor
131
+ @pool = ActiveRecord::ConnectionAdapters::NullPool.new
132
+ @idle_since = Concurrent.monotonic_time
133
+ @visitor = arel_visitor
134
+ @statements = build_statement_pool
135
+ @lock = ActiveSupport::Concurrency::LoadInterlockAwareMonitor.new
110
136
 
111
137
  if self.class.type_cast_config_to_boolean(config.fetch(:prepared_statements) { true })
112
138
  @prepared_statements = true
@@ -114,61 +140,88 @@ module ActiveRecord
114
140
  else
115
141
  @prepared_statements = false
116
142
  end
143
+
144
+ @advisory_locks_enabled = self.class.type_cast_config_to_boolean(
145
+ config.fetch(:advisory_locks, true)
146
+ )
117
147
  end
118
148
 
119
- class Version
120
- include Comparable
149
+ def replica?
150
+ @config[:replica] || false
151
+ end
121
152
 
122
- def initialize(version_string)
123
- @version = version_string.split('.').map(&:to_i)
124
- end
153
+ # Determines whether writes are currently being prevents.
154
+ #
155
+ # Returns true if the connection is a replica, or if +prevent_writes+
156
+ # is set to true.
157
+ def preventing_writes?
158
+ replica? || ActiveRecord::Base.connection_handler.prevent_writes
159
+ end
125
160
 
126
- def <=>(version_string)
127
- @version <=> version_string.split('.').map(&:to_i)
128
- end
161
+ def migrations_paths # :nodoc:
162
+ @config[:migrations_paths] || Migrator.migrations_paths
129
163
  end
130
164
 
131
- class BindCollector < Arel::Collectors::Bind
132
- def compile(bvs, conn)
133
- casted_binds = conn.prepare_binds_for_database(bvs)
134
- super(casted_binds.map { |value| conn.quote(value) })
135
- end
165
+ def migration_context # :nodoc:
166
+ MigrationContext.new(migrations_paths, schema_migration)
136
167
  end
137
168
 
138
- class SQLString < Arel::Collectors::SQLString
139
- def compile(bvs, conn)
140
- super(bvs)
141
- end
169
+ def schema_migration # :nodoc:
170
+ @schema_migration ||= begin
171
+ conn = self
172
+ spec_name = conn.pool.spec.name
173
+ name = "#{spec_name}::SchemaMigration"
174
+
175
+ return ActiveRecord::SchemaMigration if spec_name == "primary"
176
+
177
+ Class.new(ActiveRecord::SchemaMigration) do
178
+ define_singleton_method(:name) { name }
179
+ define_singleton_method(:to_s) { name }
180
+
181
+ self.connection_specification_name = spec_name
182
+ end
183
+ end
142
184
  end
143
185
 
144
- def collector
145
- if prepared_statements
146
- SQLString.new
147
- else
148
- BindCollector.new
149
- end
186
+ def prepared_statements
187
+ @prepared_statements && !prepared_statements_disabled_cache.include?(object_id)
150
188
  end
151
189
 
152
- def arel_visitor # :nodoc:
153
- Arel::Visitors::ToSql.new(self)
190
+ def prepared_statements_disabled_cache # :nodoc:
191
+ Thread.current[:ar_prepared_statements_disabled_cache] ||= Set.new
154
192
  end
155
193
 
156
- def valid_type?(type)
157
- false
194
+ class Version
195
+ include Comparable
196
+
197
+ attr_reader :full_version_string
198
+
199
+ def initialize(version_string, full_version_string = nil)
200
+ @version = version_string.split(".").map(&:to_i)
201
+ @full_version_string = full_version_string
202
+ end
203
+
204
+ def <=>(version_string)
205
+ @version <=> version_string.split(".").map(&:to_i)
206
+ end
207
+
208
+ def to_s
209
+ @version.join(".")
210
+ end
158
211
  end
159
212
 
160
- def schema_creation
161
- SchemaCreation.new self
213
+ def valid_type?(type) # :nodoc:
214
+ !native_database_types[type].nil?
162
215
  end
163
216
 
164
217
  # this method must only be called while holding connection pool's mutex
165
218
  def lease
166
219
  if in_use?
167
- msg = 'Cannot lease connection, '
220
+ msg = +"Cannot lease connection, "
168
221
  if @owner == Thread.current
169
- msg << 'it is already leased by the current thread.'
222
+ msg << "it is already leased by the current thread."
170
223
  else
171
- msg << "it is already in use by a different thread: #{@owner}. " <<
224
+ msg << "it is already in use by a different thread: #{@owner}. " \
172
225
  "Current thread: #{Thread.current}."
173
226
  end
174
227
  raise ActiveRecordError, msg
@@ -177,23 +230,28 @@ module ActiveRecord
177
230
  @owner = Thread.current
178
231
  end
179
232
 
233
+ def schema_cache
234
+ @pool.get_schema_cache(self)
235
+ end
236
+
180
237
  def schema_cache=(cache)
181
238
  cache.connection = self
182
- @schema_cache = cache
239
+ @pool.set_schema_cache(cache)
183
240
  end
184
241
 
185
242
  # this method must only be called while holding connection pool's mutex
186
243
  def expire
187
244
  if in_use?
188
245
  if @owner != Thread.current
189
- raise ActiveRecordError, "Cannot expire connection, " <<
190
- "it is owned by a different thread: #{@owner}. " <<
246
+ raise ActiveRecordError, "Cannot expire connection, " \
247
+ "it is owned by a different thread: #{@owner}. " \
191
248
  "Current thread: #{Thread.current}."
192
249
  end
193
250
 
251
+ @idle_since = Concurrent.monotonic_time
194
252
  @owner = nil
195
253
  else
196
- raise ActiveRecordError, 'Cannot expire connection, it is not currently leased.'
254
+ raise ActiveRecordError, "Cannot expire connection, it is not currently leased."
197
255
  end
198
256
  end
199
257
 
@@ -206,15 +264,21 @@ module ActiveRecord
206
264
  @owner = Thread.current
207
265
  end
208
266
  else
209
- raise ActiveRecordError, 'Cannot steal connection, it is not currently leased.'
267
+ raise ActiveRecordError, "Cannot steal connection, it is not currently leased."
210
268
  end
211
269
  end
212
270
 
271
+ # Seconds since this connection was returned to the pool
272
+ def seconds_idle # :nodoc:
273
+ return 0 if in_use?
274
+ Concurrent.monotonic_time - @idle_since
275
+ end
276
+
213
277
  def unprepared_statement
214
- old_prepared_statements, @prepared_statements = @prepared_statements, false
278
+ cache = prepared_statements_disabled_cache.add(object_id) if @prepared_statements
215
279
  yield
216
280
  ensure
217
- @prepared_statements = old_prepared_statements
281
+ cache&.delete(object_id)
218
282
  end
219
283
 
220
284
  # Returns the human-readable name of the adapter. Use mixed case - one
@@ -223,15 +287,9 @@ module ActiveRecord
223
287
  self.class::ADAPTER_NAME
224
288
  end
225
289
 
226
- # Does this adapter support migrations?
227
- def supports_migrations?
228
- false
229
- end
230
-
231
- # Can this adapter determine the primary key for tables not attached
232
- # to an Active Record class, such as join tables?
233
- def supports_primary_key?
234
- false
290
+ # Does the database for this adapter exist?
291
+ def self.database_exists?(config)
292
+ raise NotImplementedError
235
293
  end
236
294
 
237
295
  # Does this adapter support DDL rollbacks in transactions? That is, would
@@ -261,6 +319,10 @@ module ActiveRecord
261
319
  false
262
320
  end
263
321
 
322
+ def supports_partitioned_indexes?
323
+ false
324
+ end
325
+
264
326
  # Does this adapter support index sort order?
265
327
  def supports_index_sort_order?
266
328
  false
@@ -302,11 +364,28 @@ module ActiveRecord
302
364
  false
303
365
  end
304
366
 
367
+ # Does this adapter support creating invalid constraints?
368
+ def supports_validate_constraints?
369
+ false
370
+ end
371
+
372
+ # Does this adapter support creating foreign key constraints
373
+ # in the same statement as creating the table?
374
+ def supports_foreign_keys_in_create?
375
+ supports_foreign_keys?
376
+ end
377
+ deprecate :supports_foreign_keys_in_create?
378
+
305
379
  # Does this adapter support views?
306
380
  def supports_views?
307
381
  false
308
382
  end
309
383
 
384
+ # Does this adapter support materialized views?
385
+ def supports_materialized_views?
386
+ false
387
+ end
388
+
310
389
  # Does this adapter support datetime with precision?
311
390
  def supports_datetime_with_precision?
312
391
  false
@@ -331,6 +410,46 @@ module ActiveRecord
331
410
  def supports_multi_insert?
332
411
  true
333
412
  end
413
+ deprecate :supports_multi_insert?
414
+
415
+ # Does this adapter support virtual columns?
416
+ def supports_virtual_columns?
417
+ false
418
+ end
419
+
420
+ # Does this adapter support foreign/external tables?
421
+ def supports_foreign_tables?
422
+ false
423
+ end
424
+
425
+ # Does this adapter support optimizer hints?
426
+ def supports_optimizer_hints?
427
+ false
428
+ end
429
+
430
+ def supports_common_table_expressions?
431
+ false
432
+ end
433
+
434
+ def supports_lazy_transactions?
435
+ false
436
+ end
437
+
438
+ def supports_insert_returning?
439
+ false
440
+ end
441
+
442
+ def supports_insert_on_duplicate_skip?
443
+ false
444
+ end
445
+
446
+ def supports_insert_on_duplicate_update?
447
+ false
448
+ end
449
+
450
+ def supports_insert_conflict_target?
451
+ false
452
+ end
334
453
 
335
454
  # This is meant to be implemented by the adapters that support extensions
336
455
  def disable_extension(name)
@@ -340,6 +459,10 @@ module ActiveRecord
340
459
  def enable_extension(name)
341
460
  end
342
461
 
462
+ def advisory_locks_enabled? # :nodoc:
463
+ supports_advisory_locks? && @advisory_locks_enabled
464
+ end
465
+
343
466
  # This is meant to be implemented by the adapters that support advisory
344
467
  # locks
345
468
  #
@@ -394,6 +517,22 @@ module ActiveRecord
394
517
  reset_transaction
395
518
  end
396
519
 
520
+ # Immediately forget this connection ever existed. Unlike disconnect!,
521
+ # this will not communicate with the server.
522
+ #
523
+ # After calling this method, the behavior of all other methods becomes
524
+ # undefined. This is called internally just before a forked process gets
525
+ # rid of a connection that belonged to its parent.
526
+ def discard!
527
+ # This should be overridden by concrete adapters.
528
+ #
529
+ # Prevent @connection's finalizer from touching the socket, or
530
+ # otherwise communicating with its server, when it is collected.
531
+ if schema_cache.connection == self
532
+ schema_cache.connection = nil
533
+ end
534
+ end
535
+
397
536
  # Reset the state of this connection, directing the DBMS to clear
398
537
  # transactions and other connection-related server-side state. Usually a
399
538
  # database-dependent operation.
@@ -404,11 +543,9 @@ module ActiveRecord
404
543
  # this should be overridden by concrete adapters
405
544
  end
406
545
 
407
- ###
408
- # Clear any caching the database adapter may be doing, for example
409
- # clearing the prepared statement cache. This is database specific.
546
+ # Clear any caching the database adapter may be doing.
410
547
  def clear_cache!
411
- # this should be overridden by concrete adapters
548
+ @lock.synchronize { @statements.clear } if @statements
412
549
  end
413
550
 
414
551
  # Returns true if its required to reload the connection between requests for development mode.
@@ -419,7 +556,7 @@ module ActiveRecord
419
556
  # Checks whether the connection to the database is still active (i.e. not stale).
420
557
  # This is done under the hood by calling #active?. If the connection
421
558
  # is no longer active, then this method will reconnect to the database.
422
- def verify!(*ignored)
559
+ def verify!
423
560
  reconnect! unless active?
424
561
  end
425
562
 
@@ -430,22 +567,25 @@ module ActiveRecord
430
567
  # This is useful for when you need to call a proprietary method such as
431
568
  # PostgreSQL's lo_* methods.
432
569
  def raw_connection
570
+ disable_lazy_transactions!
433
571
  @connection
434
572
  end
435
573
 
436
- def case_sensitive_comparison(table, attribute, column, value)
437
- if value.nil?
438
- table[attribute].eq(value)
439
- else
440
- table[attribute].eq(Arel::Nodes::BindParam.new)
441
- end
574
+ def default_uniqueness_comparison(attribute, value, klass) # :nodoc:
575
+ attribute.eq(value)
442
576
  end
443
577
 
444
- def case_insensitive_comparison(table, attribute, column, value)
578
+ def case_sensitive_comparison(attribute, value) # :nodoc:
579
+ attribute.eq(value)
580
+ end
581
+
582
+ def case_insensitive_comparison(attribute, value) # :nodoc:
583
+ column = column_for_attribute(attribute)
584
+
445
585
  if can_perform_case_insensitive_comparison_for?(column)
446
- table[attribute].lower.eq(table.lower(Arel::Nodes::BindParam.new))
586
+ attribute.lower.eq(attribute.relation.lower(value))
447
587
  else
448
- table[attribute].eq(Arel::Nodes::BindParam.new)
588
+ attribute.eq(value)
449
589
  end
450
590
  end
451
591
 
@@ -459,153 +599,184 @@ module ActiveRecord
459
599
  pool.checkin self
460
600
  end
461
601
 
462
- def type_map # :nodoc:
463
- @type_map ||= Type::TypeMap.new.tap do |mapping|
464
- initialize_type_map(mapping)
602
+ def column_name_for_operation(operation, node) # :nodoc:
603
+ visitor.compile(node)
604
+ end
605
+
606
+ def default_index_type?(index) # :nodoc:
607
+ index.using.nil?
608
+ end
609
+
610
+ # Called by ActiveRecord::InsertAll,
611
+ # Passed an instance of ActiveRecord::InsertAll::Builder,
612
+ # This method implements standard bulk inserts for all databases, but
613
+ # should be overridden by adapters to implement common features with
614
+ # non-standard syntax like handling duplicates or returning values.
615
+ def build_insert_sql(insert) # :nodoc:
616
+ if insert.skip_duplicates? || insert.update_duplicates?
617
+ raise NotImplementedError, "#{self.class} should define `build_insert_sql` to implement adapter-specific logic for handling duplicates during INSERT"
465
618
  end
619
+
620
+ "INSERT #{insert.into} #{insert.values_list}"
466
621
  end
467
622
 
468
- def new_column(name, default, sql_type_metadata, null, table_name, default_function = nil, collation = nil) # :nodoc:
469
- Column.new(name, default, sql_type_metadata, null, table_name, default_function, collation)
623
+ def get_database_version # :nodoc:
470
624
  end
471
625
 
472
- def lookup_cast_type(sql_type) # :nodoc:
473
- type_map.lookup(sql_type)
626
+ def database_version # :nodoc:
627
+ schema_cache.database_version
474
628
  end
475
629
 
476
- def column_name_for_operation(operation, node) # :nodoc:
477
- visitor.accept(node, collector).value
478
- end
479
-
480
- def combine_bind_parameters(
481
- from_clause: [],
482
- join_clause: [],
483
- where_clause: [],
484
- having_clause: [],
485
- limit: nil,
486
- offset: nil
487
- ) # :nodoc:
488
- result = from_clause + join_clause + where_clause + having_clause
489
- if limit
490
- result << limit
491
- end
492
- if offset
493
- result << offset
630
+ def check_version # :nodoc:
631
+ end
632
+
633
+ private
634
+ def type_map
635
+ @type_map ||= Type::TypeMap.new.tap do |mapping|
636
+ initialize_type_map(mapping)
637
+ end
494
638
  end
495
- result
496
- end
497
-
498
- protected
499
-
500
- def initialize_type_map(m) # :nodoc:
501
- register_class_with_limit m, %r(boolean)i, Type::Boolean
502
- register_class_with_limit m, %r(char)i, Type::String
503
- register_class_with_limit m, %r(binary)i, Type::Binary
504
- register_class_with_limit m, %r(text)i, Type::Text
505
- register_class_with_precision m, %r(date)i, Type::Date
506
- register_class_with_precision m, %r(time)i, Type::Time
507
- register_class_with_precision m, %r(datetime)i, Type::DateTime
508
- register_class_with_limit m, %r(float)i, Type::Float
509
- register_class_with_limit m, %r(int)i, Type::Integer
510
-
511
- m.alias_type %r(blob)i, 'binary'
512
- m.alias_type %r(clob)i, 'text'
513
- m.alias_type %r(timestamp)i, 'datetime'
514
- m.alias_type %r(numeric)i, 'decimal'
515
- m.alias_type %r(number)i, 'decimal'
516
- m.alias_type %r(double)i, 'float'
517
-
518
- m.register_type(%r(decimal)i) do |sql_type|
519
- scale = extract_scale(sql_type)
520
- precision = extract_precision(sql_type)
521
-
522
- if scale == 0
523
- # FIXME: Remove this class as well
524
- Type::DecimalWithoutScale.new(precision: precision)
525
- else
526
- Type::Decimal.new(precision: precision, scale: scale)
639
+
640
+ def initialize_type_map(m = type_map)
641
+ register_class_with_limit m, %r(boolean)i, Type::Boolean
642
+ register_class_with_limit m, %r(char)i, Type::String
643
+ register_class_with_limit m, %r(binary)i, Type::Binary
644
+ register_class_with_limit m, %r(text)i, Type::Text
645
+ register_class_with_precision m, %r(date)i, Type::Date
646
+ register_class_with_precision m, %r(time)i, Type::Time
647
+ register_class_with_precision m, %r(datetime)i, Type::DateTime
648
+ register_class_with_limit m, %r(float)i, Type::Float
649
+ register_class_with_limit m, %r(int)i, Type::Integer
650
+
651
+ m.alias_type %r(blob)i, "binary"
652
+ m.alias_type %r(clob)i, "text"
653
+ m.alias_type %r(timestamp)i, "datetime"
654
+ m.alias_type %r(numeric)i, "decimal"
655
+ m.alias_type %r(number)i, "decimal"
656
+ m.alias_type %r(double)i, "float"
657
+
658
+ m.register_type %r(^json)i, Type::Json.new
659
+
660
+ m.register_type(%r(decimal)i) do |sql_type|
661
+ scale = extract_scale(sql_type)
662
+ precision = extract_precision(sql_type)
663
+
664
+ if scale == 0
665
+ # FIXME: Remove this class as well
666
+ Type::DecimalWithoutScale.new(precision: precision)
667
+ else
668
+ Type::Decimal.new(precision: precision, scale: scale)
669
+ end
527
670
  end
528
671
  end
529
- end
530
672
 
531
- def reload_type_map # :nodoc:
532
- type_map.clear
533
- initialize_type_map(type_map)
534
- end
673
+ def reload_type_map
674
+ type_map.clear
675
+ initialize_type_map
676
+ end
535
677
 
536
- def register_class_with_limit(mapping, key, klass) # :nodoc:
537
- mapping.register_type(key) do |*args|
538
- limit = extract_limit(args.last)
539
- klass.new(limit: limit)
678
+ def register_class_with_limit(mapping, key, klass)
679
+ mapping.register_type(key) do |*args|
680
+ limit = extract_limit(args.last)
681
+ klass.new(limit: limit)
682
+ end
540
683
  end
541
- end
542
684
 
543
- def register_class_with_precision(mapping, key, klass) # :nodoc:
544
- mapping.register_type(key) do |*args|
545
- precision = extract_precision(args.last)
546
- klass.new(precision: precision)
685
+ def register_class_with_precision(mapping, key, klass)
686
+ mapping.register_type(key) do |*args|
687
+ precision = extract_precision(args.last)
688
+ klass.new(precision: precision)
689
+ end
547
690
  end
548
- end
549
691
 
550
- def extract_scale(sql_type) # :nodoc:
551
- case sql_type
692
+ def extract_scale(sql_type)
693
+ case sql_type
552
694
  when /\((\d+)\)/ then 0
553
695
  when /\((\d+)(,(\d+))\)/ then $3.to_i
696
+ end
554
697
  end
555
- end
556
698
 
557
- def extract_precision(sql_type) # :nodoc:
558
- $1.to_i if sql_type =~ /\((\d+)(,\d+)?\)/
559
- end
699
+ def extract_precision(sql_type)
700
+ $1.to_i if sql_type =~ /\((\d+)(,\d+)?\)/
701
+ end
560
702
 
561
- def extract_limit(sql_type) # :nodoc:
562
- case sql_type
563
- when /^bigint/i
564
- 8
565
- when /\((.*)\)/
566
- $1.to_i
703
+ def extract_limit(sql_type)
704
+ $1.to_i if sql_type =~ /\((.*)\)/
567
705
  end
568
- end
569
706
 
570
- def translate_exception_class(e, sql)
571
- begin
572
- message = "#{e.class.name}: #{e.message}: #{sql}"
573
- rescue Encoding::CompatibilityError
574
- message = "#{e.class.name}: #{e.message.force_encoding sql.encoding}: #{sql}"
707
+ def translate_exception_class(e, sql, binds)
708
+ message = "#{e.class.name}: #{e.message}"
709
+
710
+ exception = translate_exception(
711
+ e, message: message, sql: sql, binds: binds
712
+ )
713
+ exception.set_backtrace e.backtrace
714
+ exception
575
715
  end
576
716
 
577
- exception = translate_exception(e, message)
578
- exception.set_backtrace e.backtrace
579
- exception
580
- end
717
+ def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil) # :doc:
718
+ @instrumenter.instrument(
719
+ "sql.active_record",
720
+ sql: sql,
721
+ name: name,
722
+ binds: binds,
723
+ type_casted_binds: type_casted_binds,
724
+ statement_name: statement_name,
725
+ connection_id: object_id,
726
+ connection: self) do
727
+ @lock.synchronize do
728
+ yield
729
+ end
730
+ rescue => e
731
+ raise translate_exception_class(e, sql, binds)
732
+ end
733
+ end
581
734
 
582
- def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil)
583
- @instrumenter.instrument(
584
- "sql.active_record",
585
- sql: sql,
586
- name: name,
587
- binds: binds,
588
- type_casted_binds: type_casted_binds,
589
- statement_name: statement_name,
590
- connection_id: object_id) { yield }
591
- rescue => e
592
- raise translate_exception_class(e, sql)
593
- end
735
+ def translate_exception(exception, message:, sql:, binds:)
736
+ # override in derived class
737
+ case exception
738
+ when RuntimeError
739
+ exception
740
+ else
741
+ ActiveRecord::StatementInvalid.new(message, sql: sql, binds: binds)
742
+ end
743
+ end
594
744
 
595
- def translate_exception(exception, message)
596
- # override in derived class
597
- ActiveRecord::StatementInvalid.new(message)
598
- end
745
+ def without_prepared_statement?(binds)
746
+ !prepared_statements || binds.empty?
747
+ end
599
748
 
600
- def without_prepared_statement?(binds)
601
- !prepared_statements || binds.empty?
602
- end
749
+ def column_for(table_name, column_name)
750
+ column_name = column_name.to_s
751
+ columns(table_name).detect { |c| c.name == column_name } ||
752
+ raise(ActiveRecordError, "No such column: #{table_name}.#{column_name}")
753
+ end
603
754
 
604
- def column_for(table_name, column_name) # :nodoc:
605
- column_name = column_name.to_s
606
- columns(table_name).detect { |c| c.name == column_name } ||
607
- raise(ActiveRecordError, "No such column: #{table_name}.#{column_name}")
608
- end
755
+ def column_for_attribute(attribute)
756
+ table_name = attribute.relation.name
757
+ schema_cache.columns_hash(table_name)[attribute.name.to_s]
758
+ end
759
+
760
+ def collector
761
+ if prepared_statements
762
+ Arel::Collectors::Composite.new(
763
+ Arel::Collectors::SQLString.new,
764
+ Arel::Collectors::Bind.new,
765
+ )
766
+ else
767
+ Arel::Collectors::SubstituteBinds.new(
768
+ self,
769
+ Arel::Collectors::SQLString.new,
770
+ )
771
+ end
772
+ end
773
+
774
+ def arel_visitor
775
+ Arel::Visitors::ToSql.new(self)
776
+ end
777
+
778
+ def build_statement_pool
779
+ end
609
780
  end
610
781
  end
611
782
  end