activerecord 6.0.0 → 6.1.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (270) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1178 -600
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/lib/active_record/aggregations.rb +5 -6
  6. data/lib/active_record/association_relation.rb +30 -10
  7. data/lib/active_record/associations/alias_tracker.rb +19 -16
  8. data/lib/active_record/associations/association.rb +55 -29
  9. data/lib/active_record/associations/association_scope.rb +19 -15
  10. data/lib/active_record/associations/belongs_to_association.rb +23 -10
  11. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -3
  12. data/lib/active_record/associations/builder/association.rb +32 -5
  13. data/lib/active_record/associations/builder/belongs_to.rb +10 -7
  14. data/lib/active_record/associations/builder/collection_association.rb +5 -4
  15. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +0 -3
  16. data/lib/active_record/associations/builder/has_many.rb +6 -2
  17. data/lib/active_record/associations/builder/has_one.rb +11 -14
  18. data/lib/active_record/associations/builder/singular_association.rb +1 -1
  19. data/lib/active_record/associations/collection_association.rb +25 -8
  20. data/lib/active_record/associations/collection_proxy.rb +14 -7
  21. data/lib/active_record/associations/foreign_association.rb +13 -0
  22. data/lib/active_record/associations/has_many_association.rb +24 -3
  23. data/lib/active_record/associations/has_many_through_association.rb +10 -4
  24. data/lib/active_record/associations/has_one_association.rb +15 -1
  25. data/lib/active_record/associations/join_dependency/join_association.rb +39 -16
  26. data/lib/active_record/associations/join_dependency/join_part.rb +3 -3
  27. data/lib/active_record/associations/join_dependency.rb +77 -42
  28. data/lib/active_record/associations/preloader/association.rb +51 -25
  29. data/lib/active_record/associations/preloader/through_association.rb +2 -2
  30. data/lib/active_record/associations/preloader.rb +13 -8
  31. data/lib/active_record/associations/singular_association.rb +1 -1
  32. data/lib/active_record/associations/through_association.rb +1 -1
  33. data/lib/active_record/associations.rb +120 -13
  34. data/lib/active_record/attribute_assignment.rb +10 -9
  35. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -10
  36. data/lib/active_record/attribute_methods/dirty.rb +3 -13
  37. data/lib/active_record/attribute_methods/primary_key.rb +6 -4
  38. data/lib/active_record/attribute_methods/query.rb +3 -6
  39. data/lib/active_record/attribute_methods/read.rb +8 -12
  40. data/lib/active_record/attribute_methods/serialization.rb +11 -6
  41. data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -15
  42. data/lib/active_record/attribute_methods/write.rb +12 -21
  43. data/lib/active_record/attribute_methods.rb +64 -54
  44. data/lib/active_record/attributes.rb +33 -9
  45. data/lib/active_record/autosave_association.rb +63 -44
  46. data/lib/active_record/base.rb +2 -14
  47. data/lib/active_record/callbacks.rb +153 -24
  48. data/lib/active_record/coders/yaml_column.rb +12 -3
  49. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +202 -138
  50. data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -44
  51. data/lib/active_record/connection_adapters/abstract/database_statements.rb +87 -38
  52. data/lib/active_record/connection_adapters/abstract/query_cache.rb +5 -10
  53. data/lib/active_record/connection_adapters/abstract/quoting.rb +34 -34
  54. data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
  55. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +152 -116
  56. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +141 -52
  57. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +3 -3
  58. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +267 -105
  59. data/lib/active_record/connection_adapters/abstract/transaction.rb +94 -36
  60. data/lib/active_record/connection_adapters/abstract_adapter.rb +76 -79
  61. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +149 -115
  62. data/lib/active_record/connection_adapters/column.rb +15 -1
  63. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  64. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +35 -0
  65. data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
  66. data/lib/active_record/connection_adapters/mysql/database_statements.rb +30 -36
  67. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
  68. data/lib/active_record/connection_adapters/mysql/quoting.rb +18 -3
  69. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +32 -7
  70. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +8 -0
  71. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +5 -2
  72. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +17 -13
  73. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
  74. data/lib/active_record/connection_adapters/mysql2_adapter.rb +31 -13
  75. data/lib/active_record/connection_adapters/pool_config.rb +73 -0
  76. data/lib/active_record/connection_adapters/pool_manager.rb +47 -0
  77. data/lib/active_record/connection_adapters/postgresql/column.rb +24 -1
  78. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +21 -56
  79. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +0 -1
  80. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
  81. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
  82. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +10 -2
  83. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
  84. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +0 -1
  85. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -3
  87. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
  90. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -3
  91. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +24 -6
  92. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +11 -2
  94. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  95. data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
  96. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +2 -2
  97. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +7 -3
  98. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +1 -1
  99. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
  100. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +72 -54
  101. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
  102. data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
  103. data/lib/active_record/connection_adapters/postgresql_adapter.rb +83 -65
  104. data/lib/active_record/connection_adapters/schema_cache.rb +106 -15
  105. data/lib/active_record/connection_adapters/sql_type_metadata.rb +8 -0
  106. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +38 -12
  107. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +1 -2
  108. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
  109. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +38 -5
  110. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +61 -57
  111. data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
  112. data/lib/active_record/connection_adapters.rb +52 -0
  113. data/lib/active_record/connection_handling.rb +219 -81
  114. data/lib/active_record/core.rb +268 -71
  115. data/lib/active_record/counter_cache.rb +4 -1
  116. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  117. data/lib/active_record/database_configurations/database_config.rb +52 -9
  118. data/lib/active_record/database_configurations/hash_config.rb +54 -8
  119. data/lib/active_record/database_configurations/url_config.rb +15 -41
  120. data/lib/active_record/database_configurations.rb +124 -85
  121. data/lib/active_record/delegated_type.rb +209 -0
  122. data/lib/active_record/destroy_association_async_job.rb +36 -0
  123. data/lib/active_record/dynamic_matchers.rb +2 -3
  124. data/lib/active_record/enum.rb +80 -38
  125. data/lib/active_record/errors.rb +47 -12
  126. data/lib/active_record/explain.rb +9 -5
  127. data/lib/active_record/explain_subscriber.rb +1 -1
  128. data/lib/active_record/fixture_set/file.rb +10 -17
  129. data/lib/active_record/fixture_set/model_metadata.rb +1 -2
  130. data/lib/active_record/fixture_set/render_context.rb +1 -1
  131. data/lib/active_record/fixture_set/table_row.rb +2 -3
  132. data/lib/active_record/fixture_set/table_rows.rb +0 -1
  133. data/lib/active_record/fixtures.rb +58 -12
  134. data/lib/active_record/gem_version.rb +2 -2
  135. data/lib/active_record/inheritance.rb +40 -21
  136. data/lib/active_record/insert_all.rb +43 -10
  137. data/lib/active_record/integration.rb +3 -5
  138. data/lib/active_record/internal_metadata.rb +16 -7
  139. data/lib/active_record/legacy_yaml_adapter.rb +7 -3
  140. data/lib/active_record/locking/optimistic.rb +33 -18
  141. data/lib/active_record/locking/pessimistic.rb +6 -2
  142. data/lib/active_record/log_subscriber.rb +28 -9
  143. data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
  144. data/lib/active_record/middleware/database_selector/resolver.rb +14 -14
  145. data/lib/active_record/middleware/database_selector.rb +4 -2
  146. data/lib/active_record/migration/command_recorder.rb +53 -45
  147. data/lib/active_record/migration/compatibility.rb +71 -20
  148. data/lib/active_record/migration/join_table.rb +0 -1
  149. data/lib/active_record/migration.rb +115 -85
  150. data/lib/active_record/model_schema.rb +120 -15
  151. data/lib/active_record/nested_attributes.rb +2 -5
  152. data/lib/active_record/no_touching.rb +1 -1
  153. data/lib/active_record/null_relation.rb +0 -1
  154. data/lib/active_record/persistence.rb +50 -46
  155. data/lib/active_record/query_cache.rb +15 -5
  156. data/lib/active_record/querying.rb +12 -7
  157. data/lib/active_record/railtie.rb +65 -45
  158. data/lib/active_record/railties/console_sandbox.rb +2 -4
  159. data/lib/active_record/railties/databases.rake +280 -99
  160. data/lib/active_record/readonly_attributes.rb +4 -0
  161. data/lib/active_record/reflection.rb +77 -63
  162. data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
  163. data/lib/active_record/relation/batches.rb +38 -32
  164. data/lib/active_record/relation/calculations.rb +106 -45
  165. data/lib/active_record/relation/delegation.rb +9 -7
  166. data/lib/active_record/relation/finder_methods.rb +55 -17
  167. data/lib/active_record/relation/from_clause.rb +5 -1
  168. data/lib/active_record/relation/merger.rb +27 -26
  169. data/lib/active_record/relation/predicate_builder/array_handler.rb +8 -9
  170. data/lib/active_record/relation/predicate_builder/association_query_value.rb +4 -5
  171. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +10 -6
  172. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  173. data/lib/active_record/relation/predicate_builder.rb +59 -40
  174. data/lib/active_record/relation/query_methods.rb +344 -181
  175. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  176. data/lib/active_record/relation/spawn_methods.rb +8 -8
  177. data/lib/active_record/relation/where_clause.rb +111 -62
  178. data/lib/active_record/relation.rb +116 -82
  179. data/lib/active_record/result.rb +41 -34
  180. data/lib/active_record/runtime_registry.rb +2 -2
  181. data/lib/active_record/sanitization.rb +6 -17
  182. data/lib/active_record/schema_dumper.rb +34 -4
  183. data/lib/active_record/schema_migration.rb +2 -8
  184. data/lib/active_record/scoping/default.rb +1 -4
  185. data/lib/active_record/scoping/named.rb +7 -18
  186. data/lib/active_record/scoping.rb +0 -1
  187. data/lib/active_record/secure_token.rb +16 -8
  188. data/lib/active_record/serialization.rb +5 -3
  189. data/lib/active_record/signed_id.rb +116 -0
  190. data/lib/active_record/statement_cache.rb +20 -4
  191. data/lib/active_record/store.rb +3 -3
  192. data/lib/active_record/suppressor.rb +2 -2
  193. data/lib/active_record/table_metadata.rb +42 -36
  194. data/lib/active_record/tasks/database_tasks.rb +140 -113
  195. data/lib/active_record/tasks/mysql_database_tasks.rb +34 -36
  196. data/lib/active_record/tasks/postgresql_database_tasks.rb +24 -27
  197. data/lib/active_record/tasks/sqlite_database_tasks.rb +13 -10
  198. data/lib/active_record/test_databases.rb +5 -4
  199. data/lib/active_record/test_fixtures.rb +79 -16
  200. data/lib/active_record/timestamp.rb +4 -7
  201. data/lib/active_record/touch_later.rb +20 -21
  202. data/lib/active_record/transactions.rb +26 -73
  203. data/lib/active_record/type/adapter_specific_registry.rb +2 -5
  204. data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
  205. data/lib/active_record/type/serialized.rb +6 -3
  206. data/lib/active_record/type/time.rb +10 -0
  207. data/lib/active_record/type/type_map.rb +0 -1
  208. data/lib/active_record/type/unsigned_integer.rb +0 -1
  209. data/lib/active_record/type.rb +8 -2
  210. data/lib/active_record/type_caster/connection.rb +0 -1
  211. data/lib/active_record/type_caster/map.rb +8 -5
  212. data/lib/active_record/validations/associated.rb +1 -2
  213. data/lib/active_record/validations/numericality.rb +35 -0
  214. data/lib/active_record/validations/uniqueness.rb +24 -4
  215. data/lib/active_record/validations.rb +3 -3
  216. data/lib/active_record.rb +7 -13
  217. data/lib/arel/attributes/attribute.rb +4 -0
  218. data/lib/arel/collectors/bind.rb +5 -0
  219. data/lib/arel/collectors/composite.rb +8 -0
  220. data/lib/arel/collectors/sql_string.rb +7 -0
  221. data/lib/arel/collectors/substitute_binds.rb +7 -0
  222. data/lib/arel/nodes/binary.rb +82 -8
  223. data/lib/arel/nodes/bind_param.rb +8 -0
  224. data/lib/arel/nodes/casted.rb +21 -9
  225. data/lib/arel/nodes/equality.rb +6 -9
  226. data/lib/arel/nodes/grouping.rb +3 -0
  227. data/lib/arel/nodes/homogeneous_in.rb +76 -0
  228. data/lib/arel/nodes/in.rb +8 -1
  229. data/lib/arel/nodes/infix_operation.rb +13 -1
  230. data/lib/arel/nodes/join_source.rb +1 -1
  231. data/lib/arel/nodes/node.rb +7 -6
  232. data/lib/arel/nodes/ordering.rb +27 -0
  233. data/lib/arel/nodes/sql_literal.rb +3 -0
  234. data/lib/arel/nodes/table_alias.rb +7 -3
  235. data/lib/arel/nodes/unary.rb +0 -1
  236. data/lib/arel/nodes.rb +3 -1
  237. data/lib/arel/predications.rb +17 -24
  238. data/lib/arel/select_manager.rb +1 -2
  239. data/lib/arel/table.rb +13 -5
  240. data/lib/arel/visitors/dot.rb +14 -3
  241. data/lib/arel/visitors/mysql.rb +11 -1
  242. data/lib/arel/visitors/postgresql.rb +15 -5
  243. data/lib/arel/visitors/sqlite.rb +0 -1
  244. data/lib/arel/visitors/to_sql.rb +89 -79
  245. data/lib/arel/visitors/visitor.rb +0 -1
  246. data/lib/arel/visitors.rb +0 -7
  247. data/lib/arel.rb +15 -12
  248. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
  249. data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
  250. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +2 -0
  251. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +4 -4
  252. data/lib/rails/generators/active_record/migration.rb +6 -2
  253. data/lib/rails/generators/active_record/model/model_generator.rb +38 -2
  254. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  255. metadata +27 -24
  256. data/lib/active_record/attribute_decorators.rb +0 -90
  257. data/lib/active_record/connection_adapters/connection_specification.rb +0 -297
  258. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
  259. data/lib/active_record/define_callbacks.rb +0 -22
  260. data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
  261. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
  262. data/lib/active_record/relation/where_clause_factory.rb +0 -33
  263. data/lib/arel/attributes.rb +0 -22
  264. data/lib/arel/visitors/depth_first.rb +0 -204
  265. data/lib/arel/visitors/ibm_db.rb +0 -34
  266. data/lib/arel/visitors/informix.rb +0 -62
  267. data/lib/arel/visitors/mssql.rb +0 -157
  268. data/lib/arel/visitors/oracle.rb +0 -159
  269. data/lib/arel/visitors/oracle12.rb +0 -66
  270. data/lib/arel/visitors/where_sql.rb +0 -23
@@ -26,7 +26,7 @@ module ActiveRecord
26
26
  # Allow database path relative to Rails.root, but only if the database
27
27
  # path is not the special path that tells sqlite to build a database only
28
28
  # in memory.
29
- if ":memory:" != config[:database]
29
+ if ":memory:" != config[:database] && !config[:database].to_s.start_with?("file:")
30
30
  config[:database] = File.expand_path(config[:database], Rails.root) if defined?(Rails.root)
31
31
  dirname = File.dirname(config[:database])
32
32
  Dir.mkdir(dirname) unless File.directory?(dirname)
@@ -48,8 +48,8 @@ module ActiveRecord
48
48
  end
49
49
 
50
50
  module ConnectionAdapters #:nodoc:
51
- # The SQLite3 adapter works SQLite 3.6.16 or newer
52
- # with the sqlite3-ruby drivers (available as gem from https://rubygems.org/gems/sqlite3).
51
+ # The SQLite3 adapter works with the sqlite3-ruby drivers
52
+ # (available as gem from https://rubygems.org/gems/sqlite3).
53
53
  #
54
54
  # Options:
55
55
  #
@@ -76,16 +76,6 @@ module ActiveRecord
76
76
  json: { name: "json" },
77
77
  }
78
78
 
79
- def self.represent_boolean_as_integer=(value) # :nodoc:
80
- if value == false
81
- raise "`.represent_boolean_as_integer=` is now always true, so make sure your application can work with it and remove this settings."
82
- end
83
-
84
- ActiveSupport::Deprecation.warn(
85
- "`.represent_boolean_as_integer=` is now always true, so setting this is deprecated and will be removed in Rails 6.1."
86
- )
87
- end
88
-
89
79
  class StatementPool < ConnectionAdapters::StatementPool # :nodoc:
90
80
  private
91
81
  def dealloc(stmt)
@@ -101,7 +91,7 @@ module ActiveRecord
101
91
  def self.database_exists?(config)
102
92
  config = config.symbolize_keys
103
93
  if config[:database] == ":memory:"
104
- return true
94
+ true
105
95
  else
106
96
  database_file = defined?(Rails.root) ? File.expand_path(config[:database], Rails.root) : config[:database]
107
97
  File.exist?(database_file)
@@ -116,6 +106,10 @@ module ActiveRecord
116
106
  true
117
107
  end
118
108
 
109
+ def supports_transaction_isolation?
110
+ true
111
+ end
112
+
119
113
  def supports_partial_index?
120
114
  true
121
115
  end
@@ -132,6 +126,10 @@ module ActiveRecord
132
126
  true
133
127
  end
134
128
 
129
+ def supports_check_constraints?
130
+ true
131
+ end
132
+
135
133
  def supports_views?
136
134
  true
137
135
  end
@@ -144,6 +142,10 @@ module ActiveRecord
144
142
  true
145
143
  end
146
144
 
145
+ def supports_common_table_expressions?
146
+ database_version >= "3.8.3"
147
+ end
148
+
147
149
  def supports_insert_on_conflict?
148
150
  database_version >= "3.24.0"
149
151
  end
@@ -171,13 +173,6 @@ module ActiveRecord
171
173
  true
172
174
  end
173
175
 
174
- # Returns 62. SQLite supports index names up to 64
175
- # characters. The rest is used by Rails internally to perform
176
- # temporary rename operations
177
- def allowed_index_name_length
178
- index_name_length - 2
179
- end
180
-
181
176
  def native_database_types #:nodoc:
182
177
  NATIVE_DATABASE_TYPES
183
178
  end
@@ -211,14 +206,6 @@ module ActiveRecord
211
206
  end
212
207
  end
213
208
 
214
- #--
215
- # DATABASE STATEMENTS ======================================
216
- #++
217
- def explain(arel, binds = [])
218
- sql = "EXPLAIN QUERY PLAN #{to_sql(arel, binds)}"
219
- SQLite3::ExplainPrettyPrinter.new.pp(exec_query(sql, "EXPLAIN", []))
220
- end
221
-
222
209
  # SCHEMA STATEMENTS ========================================
223
210
 
224
211
  def primary_keys(table_name) # :nodoc:
@@ -226,8 +213,11 @@ module ActiveRecord
226
213
  pks.sort_by { |f| f["pk"] }.map { |f| f["name"] }
227
214
  end
228
215
 
229
- def remove_index(table_name, options = {}) #:nodoc:
230
- index_name = index_name_for_remove(table_name, options)
216
+ def remove_index(table_name, column_name = nil, **options) # :nodoc:
217
+ return if options[:if_exists] && !index_exists?(table_name, column_name, **options)
218
+
219
+ index_name = index_name_for_remove(table_name, column_name, options)
220
+
231
221
  exec_query "DROP INDEX #{quote_column_name(index_name)}"
232
222
  end
233
223
 
@@ -236,21 +226,23 @@ module ActiveRecord
236
226
  # Example:
237
227
  # rename_table('octopuses', 'octopi')
238
228
  def rename_table(table_name, new_name)
229
+ schema_cache.clear_data_source_cache!(table_name.to_s)
230
+ schema_cache.clear_data_source_cache!(new_name.to_s)
239
231
  exec_query "ALTER TABLE #{quote_table_name(table_name)} RENAME TO #{quote_table_name(new_name)}"
240
232
  rename_table_indexes(table_name, new_name)
241
233
  end
242
234
 
243
- def add_column(table_name, column_name, type, options = {}) #:nodoc:
235
+ def add_column(table_name, column_name, type, **options) #:nodoc:
244
236
  if invalid_alter_table_type?(type, options)
245
237
  alter_table(table_name) do |definition|
246
- definition.column(column_name, type, options)
238
+ definition.column(column_name, type, **options)
247
239
  end
248
240
  else
249
241
  super
250
242
  end
251
243
  end
252
244
 
253
- def remove_column(table_name, column_name, type = nil, options = {}) #:nodoc:
245
+ def remove_column(table_name, column_name, type = nil, **options) #:nodoc:
254
246
  alter_table(table_name) do |definition|
255
247
  definition.remove_column column_name
256
248
  definition.foreign_keys.delete_if do |_, fk_options|
@@ -276,16 +268,11 @@ module ActiveRecord
276
268
  end
277
269
  end
278
270
 
279
- def change_column(table_name, column_name, type, options = {}) #:nodoc:
271
+ def change_column(table_name, column_name, type, **options) #:nodoc:
280
272
  alter_table(table_name) do |definition|
281
273
  definition[column_name].instance_eval do
282
- self.type = type
283
- self.limit = options[:limit] if options.include?(:limit)
284
- self.default = options[:default] if options.include?(:default)
285
- self.null = options[:null] if options.include?(:null)
286
- self.precision = options[:precision] if options.include?(:precision)
287
- self.scale = options[:scale] if options.include?(:scale)
288
- self.collation = options[:collation] if options.include?(:collation)
274
+ self.type = aliased_types(type.to_s, type)
275
+ self.options.merge!(options)
289
276
  end
290
277
  end
291
278
  end
@@ -321,12 +308,17 @@ module ActiveRecord
321
308
  sql << " ON CONFLICT #{insert.conflict_target} DO NOTHING"
322
309
  elsif insert.update_duplicates?
323
310
  sql << " ON CONFLICT #{insert.conflict_target} DO UPDATE SET "
311
+ sql << insert.touch_model_timestamps_unless { |column| "#{column} IS excluded.#{column}" }
324
312
  sql << insert.updatable_columns.map { |column| "#{column}=excluded.#{column}" }.join(",")
325
313
  end
326
314
 
327
315
  sql
328
316
  end
329
317
 
318
+ def shared_cache? # :nodoc:
319
+ @config.fetch(:flags, 0).anybits?(::SQLite3::Constants::Open::SHAREDCACHE)
320
+ end
321
+
330
322
  def get_database_version # :nodoc:
331
323
  SQLite3Adapter::Version.new(query_value("SELECT sqlite_version(*)"))
332
324
  end
@@ -359,10 +351,16 @@ module ActiveRecord
359
351
  # See: https://www.sqlite.org/lang_altertable.html
360
352
  # SQLite has an additional restriction on the ALTER TABLE statement
361
353
  def invalid_alter_table_type?(type, options)
362
- type.to_sym == :primary_key || options[:primary_key]
354
+ type.to_sym == :primary_key || options[:primary_key] ||
355
+ options[:null] == false && options[:default].nil?
363
356
  end
364
357
 
365
- def alter_table(table_name, foreign_keys = foreign_keys(table_name), **options)
358
+ def alter_table(
359
+ table_name,
360
+ foreign_keys = foreign_keys(table_name),
361
+ check_constraints = check_constraints(table_name),
362
+ **options
363
+ )
366
364
  altered_table_name = "a#{table_name}"
367
365
 
368
366
  caller = lambda do |definition|
@@ -372,7 +370,11 @@ module ActiveRecord
372
370
  fk.options[:column] = column
373
371
  end
374
372
  to_table = strip_table_name_prefix_and_suffix(fk.to_table)
375
- definition.foreign_key(to_table, fk.options)
373
+ definition.foreign_key(to_table, **fk.options)
374
+ end
375
+
376
+ check_constraints.each do |chk|
377
+ definition.check_constraint(chk.expression, **chk.options)
376
378
  end
377
379
 
378
380
  yield definition if block_given?
@@ -394,11 +396,12 @@ module ActiveRecord
394
396
  def copy_table(from, to, options = {})
395
397
  from_primary_key = primary_key(from)
396
398
  options[:id] = false
397
- create_table(to, options) do |definition|
399
+ create_table(to, **options) do |definition|
398
400
  @definition = definition
399
401
  if from_primary_key.is_a?(Array)
400
402
  @definition.primary_keys from_primary_key
401
403
  end
404
+
402
405
  columns(from).each do |column|
403
406
  column_name = options[:rename] ?
404
407
  (options[:rename][column.name] ||
@@ -440,10 +443,10 @@ module ActiveRecord
440
443
 
441
444
  unless columns.empty?
442
445
  # index name can't be the same
443
- opts = { name: name.gsub(/(^|_)(#{from})_/, "\\1#{to}_"), internal: true }
444
- opts[:unique] = true if index.unique
445
- opts[:where] = index.where if index.where
446
- add_index(to, columns, opts)
446
+ options = { name: name.gsub(/(^|_)(#{from})_/, "\\1#{to}_"), internal: true }
447
+ options[:unique] = true if index.unique
448
+ options[:where] = index.where if index.where
449
+ add_index(to, columns, **options)
447
450
  end
448
451
  end
449
452
  end
@@ -462,17 +465,18 @@ module ActiveRecord
462
465
  end
463
466
 
464
467
  def translate_exception(exception, message:, sql:, binds:)
465
- case exception.message
466
468
  # SQLite 3.8.2 returns a newly formatted error message:
467
469
  # UNIQUE constraint failed: *table_name*.*column_name*
468
470
  # Older versions of SQLite return:
469
471
  # column *column_name* is not unique
470
- when /column(s)? .* (is|are) not unique/, /UNIQUE constraint failed: .*/
472
+ if exception.message.match?(/(column(s)? .* (is|are) not unique|UNIQUE constraint failed: .*)/i)
471
473
  RecordNotUnique.new(message, sql: sql, binds: binds)
472
- when /.* may not be NULL/, /NOT NULL constraint failed: .*/
474
+ elsif exception.message.match?(/(.* may not be NULL|NOT NULL constraint failed: .*)/i)
473
475
  NotNullViolation.new(message, sql: sql, binds: binds)
474
- when /FOREIGN KEY constraint failed/i
476
+ elsif exception.message.match?(/FOREIGN KEY constraint failed/i)
475
477
  InvalidForeignKey.new(message, sql: sql, binds: binds)
478
+ elsif exception.message.match?(/called on a closed database/i)
479
+ ConnectionNotEstablished.new(exception)
476
480
  else
477
481
  super
478
482
  end
@@ -492,12 +496,12 @@ module ActiveRecord
492
496
  # Result will have following sample string
493
497
  # CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
494
498
  # "password_digest" varchar COLLATE "NOCASE");
495
- result = exec_query(sql, "SCHEMA").first
499
+ result = query_value(sql, "SCHEMA")
496
500
 
497
501
  if result
498
502
  # Splitting with left parentheses and discarding the first part will return all
499
503
  # columns separated with comma(,).
500
- columns_string = result["sql"].split("(", 2).last
504
+ columns_string = result.split("(", 2).last
501
505
 
502
506
  columns_string.split(",").each do |column_string|
503
507
  # This regex will match the column name and collation type and will save
@@ -505,7 +509,7 @@ module ActiveRecord
505
509
  collation_hash[$1] = $2 if COLLATE_REGEX =~ column_string
506
510
  end
507
511
 
508
- basic_structure.map! do |column|
512
+ basic_structure.map do |column|
509
513
  column_name = column["name"]
510
514
 
511
515
  if collation_hash.has_key? column_name
@@ -48,7 +48,6 @@ module ActiveRecord
48
48
  end
49
49
 
50
50
  private
51
-
52
51
  def cache
53
52
  @cache[Process.pid]
54
53
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ extend ActiveSupport::Autoload
6
+
7
+ eager_autoload do
8
+ autoload :AbstractAdapter
9
+ end
10
+
11
+ autoload :Column
12
+ autoload :PoolConfig
13
+ autoload :PoolManager
14
+ autoload :LegacyPoolManager
15
+ autoload :SchemaCache
16
+ autoload :Deduplicable
17
+
18
+ autoload_at "active_record/connection_adapters/abstract/schema_definitions" do
19
+ autoload :IndexDefinition
20
+ autoload :ColumnDefinition
21
+ autoload :ChangeColumnDefinition
22
+ autoload :ForeignKeyDefinition
23
+ autoload :CheckConstraintDefinition
24
+ autoload :TableDefinition
25
+ autoload :Table
26
+ autoload :AlterTable
27
+ autoload :ReferenceDefinition
28
+ end
29
+
30
+ autoload_at "active_record/connection_adapters/abstract/connection_pool" do
31
+ autoload :ConnectionHandler
32
+ end
33
+
34
+ autoload_under "abstract" do
35
+ autoload :SchemaStatements
36
+ autoload :DatabaseStatements
37
+ autoload :DatabaseLimits
38
+ autoload :Quoting
39
+ autoload :ConnectionPool
40
+ autoload :QueryCache
41
+ autoload :Savepoints
42
+ end
43
+
44
+ autoload_at "active_record/connection_adapters/abstract/transaction" do
45
+ autoload :TransactionManager
46
+ autoload :NullTransaction
47
+ autoload :RealTransaction
48
+ autoload :SavepointTransaction
49
+ autoload :TransactionState
50
+ end
51
+ end
52
+ end