activerecord 4.2.11.1 → 6.0.3

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 (373) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +711 -1547
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +14 -13
  5. data/examples/performance.rb +33 -32
  6. data/examples/simple.rb +5 -4
  7. data/lib/active_record/advisory_lock_base.rb +18 -0
  8. data/lib/active_record/aggregations.rb +266 -251
  9. data/lib/active_record/association_relation.rb +20 -13
  10. data/lib/active_record/associations/alias_tracker.rb +29 -36
  11. data/lib/active_record/associations/association.rb +128 -57
  12. data/lib/active_record/associations/association_scope.rb +103 -132
  13. data/lib/active_record/associations/belongs_to_association.rb +65 -60
  14. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  15. data/lib/active_record/associations/builder/association.rb +27 -40
  16. data/lib/active_record/associations/builder/belongs_to.rb +69 -55
  17. data/lib/active_record/associations/builder/collection_association.rb +10 -33
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +50 -66
  19. data/lib/active_record/associations/builder/has_many.rb +8 -4
  20. data/lib/active_record/associations/builder/has_one.rb +46 -5
  21. data/lib/active_record/associations/builder/singular_association.rb +16 -10
  22. data/lib/active_record/associations/collection_association.rb +136 -288
  23. data/lib/active_record/associations/collection_proxy.rb +241 -147
  24. data/lib/active_record/associations/foreign_association.rb +10 -1
  25. data/lib/active_record/associations/has_many_association.rb +34 -98
  26. data/lib/active_record/associations/has_many_through_association.rb +60 -87
  27. data/lib/active_record/associations/has_one_association.rb +61 -49
  28. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  29. data/lib/active_record/associations/join_dependency/join_association.rb +38 -86
  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 +149 -166
  33. data/lib/active_record/associations/preloader/association.rb +90 -123
  34. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  35. data/lib/active_record/associations/preloader.rb +90 -93
  36. data/lib/active_record/associations/singular_association.rb +18 -39
  37. data/lib/active_record/associations/through_association.rb +38 -18
  38. data/lib/active_record/associations.rb +1737 -1597
  39. data/lib/active_record/attribute_assignment.rb +57 -185
  40. data/lib/active_record/attribute_decorators.rb +39 -17
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -9
  42. data/lib/active_record/attribute_methods/dirty.rb +174 -144
  43. data/lib/active_record/attribute_methods/primary_key.rb +90 -84
  44. data/lib/active_record/attribute_methods/query.rb +6 -5
  45. data/lib/active_record/attribute_methods/read.rb +20 -77
  46. data/lib/active_record/attribute_methods/serialization.rb +40 -21
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +57 -37
  48. data/lib/active_record/attribute_methods/write.rb +32 -55
  49. data/lib/active_record/attribute_methods.rb +120 -135
  50. data/lib/active_record/attributes.rb +213 -82
  51. data/lib/active_record/autosave_association.rb +97 -41
  52. data/lib/active_record/base.rb +57 -45
  53. data/lib/active_record/callbacks.rb +101 -76
  54. data/lib/active_record/coders/json.rb +3 -1
  55. data/lib/active_record/coders/yaml_column.rb +23 -12
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +804 -297
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +240 -115
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +83 -24
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +170 -53
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -47
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +371 -242
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +694 -256
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +190 -83
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +473 -202
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +507 -639
  69. data/lib/active_record/connection_adapters/column.rb +56 -43
  70. data/lib/active_record/connection_adapters/connection_specification.rb +174 -153
  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 +196 -0
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +71 -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 +58 -181
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -114
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +49 -58
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
  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 +4 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +9 -22
  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 +31 -20
  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 -9
  99. data/lib/active_record/connection_adapters/postgresql/oid/{infinity.rb → oid.rb} +5 -3
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +32 -11
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +51 -34
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -5
  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 +9 -5
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +23 -25
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +144 -47
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +49 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +462 -296
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +558 -356
  117. data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  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 +21 -0
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +102 -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 +299 -349
  127. data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
  128. data/lib/active_record/connection_handling.rb +167 -41
  129. data/lib/active_record/core.rb +252 -230
  130. data/lib/active_record/counter_cache.rb +70 -49
  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 -106
  137. data/lib/active_record/enum.rb +163 -86
  138. data/lib/active_record/errors.rb +188 -53
  139. data/lib/active_record/explain.rb +22 -11
  140. data/lib/active_record/explain_registry.rb +4 -2
  141. data/lib/active_record/explain_subscriber.rb +10 -5
  142. data/lib/active_record/fixture_set/file.rb +35 -9
  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 +227 -501
  148. data/lib/active_record/gem_version.rb +6 -4
  149. data/lib/active_record/inheritance.rb +158 -115
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +123 -29
  152. data/lib/active_record/internal_metadata.rb +53 -0
  153. data/lib/active_record/legacy_yaml_adapter.rb +21 -3
  154. data/lib/active_record/locale/en.yml +3 -2
  155. data/lib/active_record/locking/optimistic.rb +86 -96
  156. data/lib/active_record/locking/pessimistic.rb +18 -6
  157. data/lib/active_record/log_subscriber.rb +76 -33
  158. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  159. data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
  160. data/lib/active_record/middleware/database_selector.rb +74 -0
  161. data/lib/active_record/migration/command_recorder.rb +166 -91
  162. data/lib/active_record/migration/compatibility.rb +244 -0
  163. data/lib/active_record/migration/join_table.rb +8 -7
  164. data/lib/active_record/migration.rb +623 -305
  165. data/lib/active_record/model_schema.rb +313 -112
  166. data/lib/active_record/nested_attributes.rb +263 -223
  167. data/lib/active_record/no_touching.rb +15 -2
  168. data/lib/active_record/null_relation.rb +24 -38
  169. data/lib/active_record/persistence.rb +557 -126
  170. data/lib/active_record/query_cache.rb +19 -23
  171. data/lib/active_record/querying.rb +44 -30
  172. data/lib/active_record/railtie.rb +143 -44
  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 +331 -185
  177. data/lib/active_record/readonly_attributes.rb +5 -4
  178. data/lib/active_record/reflection.rb +430 -281
  179. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  180. data/lib/active_record/relation/batches.rb +206 -55
  181. data/lib/active_record/relation/calculations.rb +268 -254
  182. data/lib/active_record/relation/delegation.rb +75 -84
  183. data/lib/active_record/relation/finder_methods.rb +285 -241
  184. data/lib/active_record/relation/from_clause.rb +30 -0
  185. data/lib/active_record/relation/merger.rb +78 -88
  186. data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -26
  187. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  188. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  189. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  190. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  191. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  192. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  193. data/lib/active_record/relation/predicate_builder.rb +110 -119
  194. data/lib/active_record/relation/query_attribute.rb +50 -0
  195. data/lib/active_record/relation/query_methods.rb +603 -397
  196. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  197. data/lib/active_record/relation/spawn_methods.rb +11 -14
  198. data/lib/active_record/relation/where_clause.rb +189 -0
  199. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  200. data/lib/active_record/relation.rb +530 -341
  201. data/lib/active_record/result.rb +79 -43
  202. data/lib/active_record/runtime_registry.rb +6 -4
  203. data/lib/active_record/sanitization.rb +144 -121
  204. data/lib/active_record/schema.rb +21 -24
  205. data/lib/active_record/schema_dumper.rb +112 -93
  206. data/lib/active_record/schema_migration.rb +24 -17
  207. data/lib/active_record/scoping/default.rb +98 -83
  208. data/lib/active_record/scoping/named.rb +86 -33
  209. data/lib/active_record/scoping.rb +45 -27
  210. data/lib/active_record/secure_token.rb +40 -0
  211. data/lib/active_record/serialization.rb +5 -5
  212. data/lib/active_record/statement_cache.rb +73 -36
  213. data/lib/active_record/store.rb +127 -42
  214. data/lib/active_record/suppressor.rb +61 -0
  215. data/lib/active_record/table_metadata.rb +90 -0
  216. data/lib/active_record/tasks/database_tasks.rb +307 -100
  217. data/lib/active_record/tasks/mysql_database_tasks.rb +55 -100
  218. data/lib/active_record/tasks/postgresql_database_tasks.rb +80 -41
  219. data/lib/active_record/tasks/sqlite_database_tasks.rb +37 -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 +86 -41
  223. data/lib/active_record/touch_later.rb +65 -0
  224. data/lib/active_record/transactions.rb +223 -157
  225. data/lib/active_record/translation.rb +3 -1
  226. data/lib/active_record/type/adapter_specific_registry.rb +126 -0
  227. data/lib/active_record/type/date.rb +4 -45
  228. data/lib/active_record/type/date_time.rb +4 -49
  229. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  230. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  231. data/lib/active_record/type/internal/timezone.rb +17 -0
  232. data/lib/active_record/type/json.rb +30 -0
  233. data/lib/active_record/type/serialized.rb +23 -15
  234. data/lib/active_record/type/text.rb +2 -2
  235. data/lib/active_record/type/time.rb +11 -16
  236. data/lib/active_record/type/type_map.rb +16 -19
  237. data/lib/active_record/type/unsigned_integer.rb +9 -8
  238. data/lib/active_record/type.rb +77 -23
  239. data/lib/active_record/type_caster/connection.rb +34 -0
  240. data/lib/active_record/type_caster/map.rb +20 -0
  241. data/lib/active_record/type_caster.rb +9 -0
  242. data/lib/active_record/validations/absence.rb +25 -0
  243. data/lib/active_record/validations/associated.rb +12 -4
  244. data/lib/active_record/validations/length.rb +26 -0
  245. data/lib/active_record/validations/presence.rb +14 -13
  246. data/lib/active_record/validations/uniqueness.rb +42 -55
  247. data/lib/active_record/validations.rb +38 -35
  248. data/lib/active_record/version.rb +3 -1
  249. data/lib/active_record.rb +42 -22
  250. data/lib/arel/alias_predication.rb +9 -0
  251. data/lib/arel/attributes/attribute.rb +37 -0
  252. data/lib/arel/attributes.rb +22 -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/and.rb +32 -0
  266. data/lib/arel/nodes/ascending.rb +23 -0
  267. data/lib/arel/nodes/binary.rb +52 -0
  268. data/lib/arel/nodes/bind_param.rb +36 -0
  269. data/lib/arel/nodes/case.rb +55 -0
  270. data/lib/arel/nodes/casted.rb +50 -0
  271. data/lib/arel/nodes/comment.rb +29 -0
  272. data/lib/arel/nodes/count.rb +12 -0
  273. data/lib/arel/nodes/delete_statement.rb +45 -0
  274. data/lib/arel/nodes/descending.rb +23 -0
  275. data/lib/arel/nodes/equality.rb +18 -0
  276. data/lib/arel/nodes/extract.rb +24 -0
  277. data/lib/arel/nodes/false.rb +16 -0
  278. data/lib/arel/nodes/full_outer_join.rb +8 -0
  279. data/lib/arel/nodes/function.rb +44 -0
  280. data/lib/arel/nodes/grouping.rb +8 -0
  281. data/lib/arel/nodes/in.rb +8 -0
  282. data/lib/arel/nodes/infix_operation.rb +80 -0
  283. data/lib/arel/nodes/inner_join.rb +8 -0
  284. data/lib/arel/nodes/insert_statement.rb +37 -0
  285. data/lib/arel/nodes/join_source.rb +20 -0
  286. data/lib/arel/nodes/matches.rb +18 -0
  287. data/lib/arel/nodes/named_function.rb +23 -0
  288. data/lib/arel/nodes/node.rb +50 -0
  289. data/lib/arel/nodes/node_expression.rb +13 -0
  290. data/lib/arel/nodes/outer_join.rb +8 -0
  291. data/lib/arel/nodes/over.rb +15 -0
  292. data/lib/arel/nodes/regexp.rb +16 -0
  293. data/lib/arel/nodes/right_outer_join.rb +8 -0
  294. data/lib/arel/nodes/select_core.rb +67 -0
  295. data/lib/arel/nodes/select_statement.rb +41 -0
  296. data/lib/arel/nodes/sql_literal.rb +16 -0
  297. data/lib/arel/nodes/string_join.rb +11 -0
  298. data/lib/arel/nodes/table_alias.rb +27 -0
  299. data/lib/arel/nodes/terminal.rb +16 -0
  300. data/lib/arel/nodes/true.rb +16 -0
  301. data/lib/arel/nodes/unary.rb +45 -0
  302. data/lib/arel/nodes/unary_operation.rb +20 -0
  303. data/lib/arel/nodes/unqualified_column.rb +22 -0
  304. data/lib/arel/nodes/update_statement.rb +41 -0
  305. data/lib/arel/nodes/values_list.rb +9 -0
  306. data/lib/arel/nodes/window.rb +126 -0
  307. data/lib/arel/nodes/with.rb +11 -0
  308. data/lib/arel/nodes.rb +68 -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/depth_first.rb +203 -0
  316. data/lib/arel/visitors/dot.rb +296 -0
  317. data/lib/arel/visitors/ibm_db.rb +34 -0
  318. data/lib/arel/visitors/informix.rb +62 -0
  319. data/lib/arel/visitors/mssql.rb +156 -0
  320. data/lib/arel/visitors/mysql.rb +83 -0
  321. data/lib/arel/visitors/oracle.rb +158 -0
  322. data/lib/arel/visitors/oracle12.rb +65 -0
  323. data/lib/arel/visitors/postgresql.rb +109 -0
  324. data/lib/arel/visitors/sqlite.rb +38 -0
  325. data/lib/arel/visitors/to_sql.rb +888 -0
  326. data/lib/arel/visitors/visitor.rb +45 -0
  327. data/lib/arel/visitors/where_sql.rb +22 -0
  328. data/lib/arel/visitors.rb +20 -0
  329. data/lib/arel/window_predications.rb +9 -0
  330. data/lib/arel.rb +62 -0
  331. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -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/migration_generator.rb +42 -37
  334. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  335. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +11 -2
  336. data/lib/rails/generators/active_record/migration.rb +30 -1
  337. data/lib/rails/generators/active_record/model/model_generator.rb +18 -22
  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 → module.rb.tt} +0 -0
  340. data/lib/rails/generators/active_record.rb +7 -5
  341. metadata +168 -59
  342. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  343. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  344. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  345. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  346. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  347. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  348. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  349. data/lib/active_record/attribute.rb +0 -163
  350. data/lib/active_record/attribute_set/builder.rb +0 -106
  351. data/lib/active_record/attribute_set.rb +0 -81
  352. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -498
  353. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  354. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  355. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
  356. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  357. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  358. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  359. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  360. data/lib/active_record/type/big_integer.rb +0 -13
  361. data/lib/active_record/type/binary.rb +0 -50
  362. data/lib/active_record/type/boolean.rb +0 -31
  363. data/lib/active_record/type/decimal.rb +0 -64
  364. data/lib/active_record/type/decorator.rb +0 -14
  365. data/lib/active_record/type/float.rb +0 -19
  366. data/lib/active_record/type/integer.rb +0 -59
  367. data/lib/active_record/type/mutable.rb +0 -16
  368. data/lib/active_record/type/numeric.rb +0 -36
  369. data/lib/active_record/type/string.rb +0 -40
  370. data/lib/active_record/type/time_value.rb +0 -38
  371. data/lib/active_record/type/value.rb +0 -110
  372. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
  373. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -1,46 +1,36 @@
1
- require 'set'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecord
4
4
  # :stopdoc:
5
5
  module ConnectionAdapters
6
6
  # An abstract definition of a column in a table.
7
7
  class Column
8
- TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE', 'on', 'ON'].to_set
9
- FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE', 'off', 'OFF'].to_set
8
+ attr_reader :name, :default, :sql_type_metadata, :null, :default_function, :collation, :comment
10
9
 
11
- module Format
12
- ISO_DATE = /\A(\d{4})-(\d\d)-(\d\d)\z/
13
- ISO_DATETIME = /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)(\.\d+)?\z/
14
- end
15
-
16
- attr_reader :name, :cast_type, :null, :sql_type, :default, :default_function
17
-
18
- delegate :type, :precision, :scale, :limit, :klass, :accessor,
19
- :text?, :number?, :binary?, :changed?,
20
- :type_cast_from_user, :type_cast_from_database, :type_cast_for_database,
21
- :type_cast_for_schema,
22
- to: :cast_type
10
+ delegate :precision, :scale, :limit, :type, :sql_type, to: :sql_type_metadata, allow_nil: true
23
11
 
24
12
  # Instantiates a new column in the table.
25
13
  #
26
- # +name+ is the column's name, such as <tt>supplier_id</tt> in <tt>supplier_id int(11)</tt>.
14
+ # +name+ is the column's name, such as <tt>supplier_id</tt> in <tt>supplier_id bigint</tt>.
27
15
  # +default+ is the type-casted default value, such as +new+ in <tt>sales_stage varchar(20) default 'new'</tt>.
28
- # +cast_type+ is the object used for type casting and type information.
29
- # +sql_type+ is used to extract the column's length, if necessary. For example +60+ in
30
- # <tt>company_name varchar(60)</tt>.
31
- # It will be mapped to one of the standard Rails SQL types in the <tt>type</tt> attribute.
16
+ # +sql_type_metadata+ is various information about the type of the column
32
17
  # +null+ determines if this column allows +NULL+ values.
33
- def initialize(name, default, cast_type, sql_type = nil, null = true)
34
- @name = name.freeze
35
- @cast_type = cast_type
36
- @sql_type = sql_type
37
- @null = null
38
- @default = default
39
- @default_function = nil
18
+ def initialize(name, default, sql_type_metadata = nil, null = true, default_function = nil, collation: nil, comment: nil, **)
19
+ @name = name.freeze
20
+ @sql_type_metadata = sql_type_metadata
21
+ @null = null
22
+ @default = default
23
+ @default_function = default_function
24
+ @collation = collation
25
+ @comment = comment
40
26
  end
41
27
 
42
28
  def has_default?
43
- !default.nil?
29
+ !default.nil? || default_function
30
+ end
31
+
32
+ def bigint?
33
+ /\Abigint\b/.match?(sql_type)
44
34
  end
45
35
 
46
36
  # Returns the human name of the column name.
@@ -51,30 +41,53 @@ module ActiveRecord
51
41
  Base.human_attribute_name(@name)
52
42
  end
53
43
 
54
- def with_type(type)
55
- dup.tap do |clone|
56
- clone.instance_variable_set('@cast_type', type)
57
- end
44
+ def init_with(coder)
45
+ @name = coder["name"]
46
+ @sql_type_metadata = coder["sql_type_metadata"]
47
+ @null = coder["null"]
48
+ @default = coder["default"]
49
+ @default_function = coder["default_function"]
50
+ @collation = coder["collation"]
51
+ @comment = coder["comment"]
52
+ end
53
+
54
+ def encode_with(coder)
55
+ coder["name"] = @name
56
+ coder["sql_type_metadata"] = @sql_type_metadata
57
+ coder["null"] = @null
58
+ coder["default"] = @default
59
+ coder["default_function"] = @default_function
60
+ coder["collation"] = @collation
61
+ coder["comment"] = @comment
58
62
  end
59
63
 
60
64
  def ==(other)
61
- other.name == name &&
62
- other.default == default &&
63
- other.cast_type == cast_type &&
64
- other.sql_type == sql_type &&
65
- other.null == null &&
66
- other.default_function == default_function
65
+ other.is_a?(Column) &&
66
+ name == other.name &&
67
+ default == other.default &&
68
+ sql_type_metadata == other.sql_type_metadata &&
69
+ null == other.null &&
70
+ default_function == other.default_function &&
71
+ collation == other.collation &&
72
+ comment == other.comment
67
73
  end
68
74
  alias :eql? :==
69
75
 
70
76
  def hash
71
- attributes_for_hash.hash
77
+ Column.hash ^
78
+ name.hash ^
79
+ default.hash ^
80
+ sql_type_metadata.hash ^
81
+ null.hash ^
82
+ default_function.hash ^
83
+ collation.hash ^
84
+ comment.hash
72
85
  end
86
+ end
73
87
 
74
- private
75
-
76
- def attributes_for_hash
77
- [self.class, name, default, cast_type, sql_type, null, default_function]
88
+ class NullColumn < Column
89
+ def initialize(name)
90
+ super(name, nil)
78
91
  end
79
92
  end
80
93
  end
@@ -1,22 +1,26 @@
1
- require 'uri'
2
- require 'active_support/core_ext/string/filters'
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
3
4
 
4
5
  module ActiveRecord
5
6
  module ConnectionAdapters
6
7
  class ConnectionSpecification #:nodoc:
7
- attr_reader :config, :adapter_method
8
+ attr_reader :name, :config, :adapter_method
8
9
 
9
- def initialize(config, adapter_method)
10
- @config, @adapter_method = config, adapter_method
10
+ def initialize(name, config, adapter_method)
11
+ @name, @config, @adapter_method = name, config, adapter_method
11
12
  end
12
13
 
13
14
  def initialize_dup(original)
14
15
  @config = original.config.dup
15
16
  end
16
17
 
18
+ def to_hash
19
+ @config.merge(name: @name)
20
+ end
21
+
17
22
  # Expands a connection string into a hash.
18
23
  class ConnectionUrlResolver # :nodoc:
19
-
20
24
  # == Example
21
25
  #
22
26
  # url = "postgresql://foo:bar@localhost:9000/foo_test?pool=5&timeout=3000"
@@ -34,11 +38,11 @@ module ActiveRecord
34
38
  def initialize(url)
35
39
  raise "Database URL cannot be empty" if url.blank?
36
40
  @uri = uri_parser.parse(url)
37
- @adapter = @uri.scheme.tr('-', '_')
41
+ @adapter = @uri.scheme && @uri.scheme.tr("-", "_")
38
42
  @adapter = "postgresql" if @adapter == "postgres"
39
43
 
40
44
  if @uri.opaque
41
- @uri.opaque, @query = @uri.opaque.split('?', 2)
45
+ @uri.opaque, @query = @uri.opaque.split("?", 2)
42
46
  else
43
47
  @query = @uri.query
44
48
  end
@@ -46,65 +50,62 @@ module ActiveRecord
46
50
 
47
51
  # Converts the given URL to a full connection hash.
48
52
  def to_hash
49
- config = raw_config.reject { |_,value| value.blank? }
50
- config.map { |key,value| config[key] = uri_parser.unescape(value) if value.is_a? String }
53
+ config = raw_config.reject { |_, value| value.blank? }
54
+ config.map { |key, value| config[key] = uri_parser.unescape(value) if value.is_a? String }
51
55
  config
52
56
  end
53
57
 
54
58
  private
59
+ attr_reader :uri
55
60
 
56
- def uri
57
- @uri
58
- end
59
-
60
- def uri_parser
61
- @uri_parser ||= URI::Parser.new
62
- end
61
+ def uri_parser
62
+ @uri_parser ||= URI::Parser.new
63
+ end
63
64
 
64
- # Converts the query parameters of the URI into a hash.
65
- #
66
- # "localhost?pool=5&reaping_frequency=2"
67
- # # => { "pool" => "5", "reaping_frequency" => "2" }
68
- #
69
- # returns empty hash if no query present.
70
- #
71
- # "localhost"
72
- # # => {}
73
- def query_hash
74
- Hash[(@query || '').split("&").map { |pair| pair.split("=") }]
75
- end
65
+ # Converts the query parameters of the URI into a hash.
66
+ #
67
+ # "localhost?pool=5&reaping_frequency=2"
68
+ # # => { "pool" => "5", "reaping_frequency" => "2" }
69
+ #
70
+ # returns empty hash if no query present.
71
+ #
72
+ # "localhost"
73
+ # # => {}
74
+ def query_hash
75
+ Hash[(@query || "").split("&").map { |pair| pair.split("=", 2) }]
76
+ end
76
77
 
77
- def raw_config
78
- if uri.opaque
79
- query_hash.merge({
80
- "adapter" => @adapter,
81
- "database" => uri.opaque })
82
- else
83
- query_hash.merge({
84
- "adapter" => @adapter,
85
- "username" => uri.user,
86
- "password" => uri.password,
87
- "port" => uri.port,
88
- "database" => database_from_path,
89
- "host" => uri.hostname })
78
+ def raw_config
79
+ if uri.opaque
80
+ query_hash.merge(
81
+ "adapter" => @adapter,
82
+ "database" => uri.opaque)
83
+ else
84
+ query_hash.merge(
85
+ "adapter" => @adapter,
86
+ "username" => uri.user,
87
+ "password" => uri.password,
88
+ "port" => uri.port,
89
+ "database" => database_from_path,
90
+ "host" => uri.hostname)
91
+ end
90
92
  end
91
- end
92
93
 
93
- # Returns name of the database.
94
- def database_from_path
95
- if @adapter == 'sqlite3'
96
- # 'sqlite3:/foo' is absolute, because that makes sense. The
97
- # corresponding relative version, 'sqlite3:foo', is handled
98
- # elsewhere, as an "opaque".
94
+ # Returns name of the database.
95
+ def database_from_path
96
+ if @adapter == "sqlite3"
97
+ # 'sqlite3:/foo' is absolute, because that makes sense. The
98
+ # corresponding relative version, 'sqlite3:foo', is handled
99
+ # elsewhere, as an "opaque".
99
100
 
100
- uri.path
101
- else
102
- # Only SQLite uses a filename as the "database" name; for
103
- # anything else, a leading slash would be silly.
101
+ uri.path
102
+ else
103
+ # Only SQLite uses a filename as the "database" name; for
104
+ # anything else, a leading slash would be silly.
104
105
 
105
- uri.path.sub(%r{^/}, "")
106
+ uri.path.sub(%r{^/}, "")
107
+ end
106
108
  end
107
- end
108
109
  end
109
110
 
110
111
  ##
@@ -112,8 +113,7 @@ module ActiveRecord
112
113
  class Resolver # :nodoc:
113
114
  attr_reader :configurations
114
115
 
115
- # Accepts a hash two layers deep, keys on the first layer represent
116
- # environments such as "production". Keys must be strings.
116
+ # Accepts a list of db config objects.
117
117
  def initialize(configurations)
118
118
  @configurations = configurations
119
119
  end
@@ -134,25 +134,14 @@ module ActiveRecord
134
134
  # Resolver.new(configurations).resolve(:production)
135
135
  # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
136
136
  #
137
- def resolve(config)
138
- if config
139
- resolve_connection config
140
- elsif env = ActiveRecord::ConnectionHandling::RAILS_ENV.call
141
- resolve_symbol_connection env.to_sym
137
+ def resolve(config_or_env, pool_name = nil)
138
+ if config_or_env
139
+ resolve_connection config_or_env, pool_name
142
140
  else
143
141
  raise AdapterNotSpecified
144
142
  end
145
143
  end
146
144
 
147
- # Expands each key in @configurations hash into fully resolved hash
148
- def resolve_all
149
- config = configurations.dup
150
- config.each do |key, value|
151
- config[key] = resolve(value) if value
152
- end
153
- config
154
- end
155
-
156
145
  # Returns an instance of ConnectionSpecification for a given adapter.
157
146
  # Accepts a hash one layer deep that contains all connection information.
158
147
  #
@@ -166,109 +155,141 @@ module ActiveRecord
166
155
  # # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" }
167
156
  #
168
157
  def spec(config)
169
- spec = resolve(config).symbolize_keys
158
+ pool_name = config if config.is_a?(Symbol)
159
+
160
+ spec = resolve(config, pool_name).symbolize_keys
170
161
 
171
162
  raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)
172
163
 
164
+ # Require the adapter itself and give useful feedback about
165
+ # 1. Missing adapter gems and
166
+ # 2. Adapter gems' missing dependencies.
173
167
  path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter"
174
168
  begin
175
169
  require path_to_adapter
176
- rescue Gem::LoadError => e
177
- raise Gem::LoadError, "Specified '#{spec[:adapter]}' for database adapter, but the gem is not loaded. Add `gem '#{e.name}'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord)."
178
170
  rescue LoadError => e
179
- raise LoadError, "Could not load '#{path_to_adapter}'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile.", e.backtrace
171
+ # We couldn't require the adapter itself. Raise an exception that
172
+ # points out config typos and missing gems.
173
+ if e.path == path_to_adapter
174
+ # We can assume that a non-builtin adapter was specified, so it's
175
+ # either misspelled or missing from Gemfile.
176
+ raise LoadError, "Could not load the '#{spec[:adapter]}' Active Record adapter. Ensure that the adapter is spelled correctly in config/database.yml and that you've added the necessary adapter gem to your Gemfile.", e.backtrace
177
+
178
+ # Bubbled up from the adapter require. Prefix the exception message
179
+ # with some guidance about how to address it and reraise.
180
+ else
181
+ raise LoadError, "Error loading the '#{spec[:adapter]}' Active Record adapter. Missing a gem it depends on? #{e.message}", e.backtrace
182
+ end
180
183
  end
181
184
 
182
185
  adapter_method = "#{spec[:adapter]}_connection"
183
- ConnectionSpecification.new(spec, adapter_method)
186
+
187
+ unless ActiveRecord::Base.respond_to?(adapter_method)
188
+ raise AdapterNotFound, "database configuration specifies nonexistent #{spec[:adapter]} adapter"
189
+ end
190
+
191
+ ConnectionSpecification.new(spec.delete(:name) || "primary", spec, adapter_method)
184
192
  end
185
193
 
186
194
  private
187
-
188
- # Returns fully resolved connection, accepts hash, string or symbol.
189
- # Always returns a hash.
190
- #
191
- # == Examples
192
- #
193
- # Symbol representing current environment.
194
- #
195
- # Resolver.new("production" => {}).resolve_connection(:production)
196
- # # => {}
197
- #
198
- # One layer deep hash of connection values.
199
- #
200
- # Resolver.new({}).resolve_connection("adapter" => "sqlite3")
201
- # # => { "adapter" => "sqlite3" }
202
- #
203
- # Connection URL.
204
- #
205
- # Resolver.new({}).resolve_connection("postgresql://localhost/foo")
206
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
207
- #
208
- def resolve_connection(spec)
209
- case spec
210
- when Symbol
211
- resolve_symbol_connection spec
212
- when String
213
- resolve_string_connection spec
214
- when Hash
215
- resolve_hash_connection spec
195
+ # Returns fully resolved connection, accepts hash, string or symbol.
196
+ # Always returns a hash.
197
+ #
198
+ # == Examples
199
+ #
200
+ # Symbol representing current environment.
201
+ #
202
+ # Resolver.new("production" => {}).resolve_connection(:production)
203
+ # # => {}
204
+ #
205
+ # One layer deep hash of connection values.
206
+ #
207
+ # Resolver.new({}).resolve_connection("adapter" => "sqlite3")
208
+ # # => { "adapter" => "sqlite3" }
209
+ #
210
+ # Connection URL.
211
+ #
212
+ # Resolver.new({}).resolve_connection("postgresql://localhost/foo")
213
+ # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
214
+ #
215
+ def resolve_connection(config_or_env, pool_name = nil)
216
+ case config_or_env
217
+ when Symbol
218
+ resolve_symbol_connection config_or_env, pool_name
219
+ when String
220
+ resolve_url_connection config_or_env
221
+ when Hash
222
+ resolve_hash_connection config_or_env
223
+ else
224
+ raise TypeError, "Invalid type for configuration. Expected Symbol, String, or Hash. Got #{config_or_env.inspect}"
225
+ end
216
226
  end
217
- end
218
227
 
219
- def resolve_string_connection(spec)
220
- # Rails has historically accepted a string to mean either
221
- # an environment key or a URL spec, so we have deprecated
222
- # this ambiguous behaviour and in the future this function
223
- # can be removed in favor of resolve_url_connection.
224
- if configurations.key?(spec) || spec !~ /:/
225
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
226
- Passing a string to ActiveRecord::Base.establish_connection for a
227
- configuration lookup is deprecated, please pass a symbol
228
- (#{spec.to_sym.inspect}) instead.
229
- MSG
230
-
231
- resolve_symbol_connection(spec)
232
- else
233
- resolve_url_connection(spec)
228
+ # Takes the environment such as +:production+ or +:development+ and a
229
+ # pool name the corresponds to the name given by the connection pool
230
+ # to the connection. That pool name is merged into the hash with the
231
+ # name key.
232
+ #
233
+ # This requires that the @configurations was initialized with a key that
234
+ # matches.
235
+ #
236
+ # configurations = #<ActiveRecord::DatabaseConfigurations:0x00007fd9fdace3e0
237
+ # @configurations=[
238
+ # #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd9fdace250
239
+ # @env_name="production", @spec_name="primary", @config={"database"=>"my_db"}>
240
+ # ]>
241
+ #
242
+ # Resolver.new(configurations).resolve_symbol_connection(:production, "primary")
243
+ # # => { "database" => "my_db" }
244
+ def resolve_symbol_connection(env_name, pool_name)
245
+ db_config = configurations.find_db_config(env_name)
246
+
247
+ if db_config
248
+ resolve_connection(db_config.config).merge("name" => pool_name.to_s)
249
+ else
250
+ raise AdapterNotSpecified, <<~MSG
251
+ The `#{env_name}` database is not configured for the `#{ActiveRecord::ConnectionHandling::DEFAULT_ENV.call}` environment.
252
+
253
+ Available databases configurations are:
254
+
255
+ #{build_configuration_sentence}
256
+ MSG
257
+ end
234
258
  end
235
- end
236
259
 
237
- # Takes the environment such as +:production+ or +:development+.
238
- # This requires that the @configurations was initialized with a key that
239
- # matches.
240
- #
241
- # Resolver.new("production" => {}).resolve_symbol_connection(:production)
242
- # # => {}
243
- #
244
- def resolve_symbol_connection(spec)
245
- if config = configurations[spec.to_s]
246
- resolve_connection(config)
247
- else
248
- raise(AdapterNotSpecified, "'#{spec}' database is not configured. Available: #{configurations.keys.inspect}")
260
+ def build_configuration_sentence # :nodoc:
261
+ configs = configurations.configs_for(include_replicas: true)
262
+
263
+ configs.group_by(&:env_name).map do |env, config|
264
+ namespaces = config.map(&:spec_name)
265
+ if namespaces.size > 1
266
+ "#{env}: #{namespaces.join(", ")}"
267
+ else
268
+ env
269
+ end
270
+ end.join("\n")
249
271
  end
250
- end
251
272
 
252
- # Accepts a hash. Expands the "url" key that contains a
253
- # URL database connection to a full connection
254
- # hash and merges with the rest of the hash.
255
- # Connection details inside of the "url" key win any merge conflicts
256
- def resolve_hash_connection(spec)
257
- if spec["url"] && spec["url"] !~ /^jdbc:/
258
- connection_hash = resolve_url_connection(spec.delete("url"))
259
- spec.merge!(connection_hash)
273
+ # Accepts a hash. Expands the "url" key that contains a
274
+ # URL database connection to a full connection
275
+ # hash and merges with the rest of the hash.
276
+ # Connection details inside of the "url" key win any merge conflicts
277
+ def resolve_hash_connection(spec)
278
+ if spec["url"] && spec["url"] !~ /^jdbc:/
279
+ connection_hash = resolve_url_connection(spec.delete("url"))
280
+ spec.merge!(connection_hash)
281
+ end
282
+ spec
260
283
  end
261
- spec
262
- end
263
284
 
264
- # Takes a connection URL.
265
- #
266
- # Resolver.new({}).resolve_url_connection("postgresql://localhost/foo")
267
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
268
- #
269
- def resolve_url_connection(url)
270
- ConnectionUrlResolver.new(url).to_hash
271
- end
285
+ # Takes a connection URL.
286
+ #
287
+ # Resolver.new({}).resolve_url_connection("postgresql://localhost/foo")
288
+ # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
289
+ #
290
+ def resolve_url_connection(url)
291
+ ConnectionUrlResolver.new(url).to_hash
292
+ end
272
293
  end
273
294
  end
274
295
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ module DetermineIfPreparableVisitor
6
+ attr_accessor :preparable
7
+
8
+ def accept(object, collector)
9
+ @preparable = true
10
+ super
11
+ end
12
+
13
+ def visit_Arel_Nodes_In(o, collector)
14
+ @preparable = false
15
+ super
16
+ end
17
+
18
+ def visit_Arel_Nodes_NotIn(o, collector)
19
+ @preparable = false
20
+ super
21
+ end
22
+
23
+ def visit_Arel_Nodes_SqlLiteral(o, collector)
24
+ @preparable = false
25
+ super
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ module MySQL
6
+ class Column < ConnectionAdapters::Column # :nodoc:
7
+ delegate :extra, to: :sql_type_metadata, allow_nil: true
8
+
9
+ def unsigned?
10
+ /\bunsigned(?: zerofill)?\z/.match?(sql_type)
11
+ end
12
+
13
+ def case_sensitive?
14
+ collation && !collation.end_with?("_ci")
15
+ end
16
+
17
+ def auto_increment?
18
+ extra == "auto_increment"
19
+ end
20
+
21
+ def virtual?
22
+ /\b(?:VIRTUAL|STORED|PERSISTENT)\b/.match?(extra)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end