activerecord 6.0.1 → 6.1.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +843 -626
- data/MIT-LICENSE +1 -1
- data/README.rdoc +3 -3
- data/lib/active_record/aggregations.rb +1 -2
- data/lib/active_record/association_relation.rb +18 -17
- data/lib/active_record/associations/alias_tracker.rb +19 -16
- data/lib/active_record/associations/association.rb +49 -37
- data/lib/active_record/associations/association_scope.rb +17 -15
- data/lib/active_record/associations/belongs_to_association.rb +15 -5
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -1
- data/lib/active_record/associations/builder/association.rb +9 -3
- data/lib/active_record/associations/builder/belongs_to.rb +10 -7
- data/lib/active_record/associations/builder/collection_association.rb +5 -4
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +0 -3
- data/lib/active_record/associations/builder/has_many.rb +6 -2
- data/lib/active_record/associations/builder/has_one.rb +11 -14
- data/lib/active_record/associations/builder/singular_association.rb +1 -1
- data/lib/active_record/associations/collection_association.rb +25 -8
- data/lib/active_record/associations/collection_proxy.rb +14 -7
- data/lib/active_record/associations/foreign_association.rb +13 -0
- data/lib/active_record/associations/has_many_association.rb +24 -3
- data/lib/active_record/associations/has_many_through_association.rb +10 -4
- data/lib/active_record/associations/has_one_association.rb +15 -1
- data/lib/active_record/associations/join_dependency/join_association.rb +36 -14
- data/lib/active_record/associations/join_dependency/join_part.rb +3 -3
- data/lib/active_record/associations/join_dependency.rb +73 -42
- data/lib/active_record/associations/preloader/association.rb +51 -25
- data/lib/active_record/associations/preloader/through_association.rb +2 -2
- data/lib/active_record/associations/preloader.rb +12 -7
- data/lib/active_record/associations/singular_association.rb +1 -1
- data/lib/active_record/associations/through_association.rb +1 -1
- data/lib/active_record/associations.rb +115 -12
- data/lib/active_record/attribute_assignment.rb +10 -9
- data/lib/active_record/attribute_methods/before_type_cast.rb +13 -10
- data/lib/active_record/attribute_methods/dirty.rb +3 -13
- data/lib/active_record/attribute_methods/primary_key.rb +6 -4
- data/lib/active_record/attribute_methods/query.rb +3 -6
- data/lib/active_record/attribute_methods/read.rb +8 -12
- data/lib/active_record/attribute_methods/serialization.rb +11 -6
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -15
- data/lib/active_record/attribute_methods/write.rb +12 -21
- data/lib/active_record/attribute_methods.rb +64 -54
- data/lib/active_record/attributes.rb +32 -8
- data/lib/active_record/autosave_association.rb +56 -41
- data/lib/active_record/base.rb +2 -14
- data/lib/active_record/callbacks.rb +153 -24
- data/lib/active_record/coders/yaml_column.rb +1 -2
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +190 -136
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -44
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +82 -37
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -8
- data/lib/active_record/connection_adapters/abstract/quoting.rb +34 -34
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +152 -116
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +137 -52
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +263 -107
- data/lib/active_record/connection_adapters/abstract/transaction.rb +82 -35
- data/lib/active_record/connection_adapters/abstract_adapter.rb +60 -73
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +136 -111
- data/lib/active_record/connection_adapters/column.rb +15 -1
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +28 -36
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
- data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +32 -7
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +8 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +17 -13
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +31 -13
- data/lib/active_record/connection_adapters/pool_config.rb +63 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +24 -1
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +19 -56
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +10 -2
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -3
- data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -3
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +24 -6
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +11 -2
- data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +7 -3
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +72 -54
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +77 -57
- data/lib/active_record/connection_adapters/schema_cache.rb +98 -15
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +10 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +36 -12
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +1 -2
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +38 -5
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +57 -57
- data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
- data/lib/active_record/connection_adapters.rb +50 -0
- data/lib/active_record/connection_handling.rb +210 -87
- data/lib/active_record/core.rb +229 -65
- data/lib/active_record/counter_cache.rb +4 -1
- data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
- data/lib/active_record/database_configurations/database_config.rb +52 -9
- data/lib/active_record/database_configurations/hash_config.rb +54 -8
- data/lib/active_record/database_configurations/url_config.rb +15 -41
- data/lib/active_record/database_configurations.rb +124 -85
- data/lib/active_record/delegated_type.rb +209 -0
- data/lib/active_record/destroy_association_async_job.rb +36 -0
- data/lib/active_record/dynamic_matchers.rb +2 -3
- data/lib/active_record/enum.rb +40 -16
- data/lib/active_record/errors.rb +47 -12
- data/lib/active_record/explain.rb +9 -5
- data/lib/active_record/explain_subscriber.rb +1 -1
- data/lib/active_record/fixture_set/file.rb +10 -17
- data/lib/active_record/fixture_set/model_metadata.rb +1 -2
- data/lib/active_record/fixture_set/render_context.rb +1 -1
- data/lib/active_record/fixture_set/table_row.rb +2 -3
- data/lib/active_record/fixture_set/table_rows.rb +0 -1
- data/lib/active_record/fixtures.rb +54 -11
- data/lib/active_record/gem_version.rb +2 -2
- data/lib/active_record/inheritance.rb +40 -21
- data/lib/active_record/insert_all.rb +38 -9
- data/lib/active_record/integration.rb +3 -5
- data/lib/active_record/internal_metadata.rb +16 -7
- data/lib/active_record/legacy_yaml_adapter.rb +7 -3
- data/lib/active_record/locking/optimistic.rb +22 -17
- data/lib/active_record/locking/pessimistic.rb +6 -2
- data/lib/active_record/log_subscriber.rb +27 -9
- data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +6 -2
- data/lib/active_record/middleware/database_selector.rb +4 -2
- data/lib/active_record/migration/command_recorder.rb +53 -45
- data/lib/active_record/migration/compatibility.rb +70 -20
- data/lib/active_record/migration/join_table.rb +0 -1
- data/lib/active_record/migration.rb +114 -84
- data/lib/active_record/model_schema.rb +117 -15
- data/lib/active_record/nested_attributes.rb +2 -5
- data/lib/active_record/no_touching.rb +1 -1
- data/lib/active_record/null_relation.rb +0 -1
- data/lib/active_record/persistence.rb +50 -46
- data/lib/active_record/query_cache.rb +15 -5
- data/lib/active_record/querying.rb +12 -7
- data/lib/active_record/railtie.rb +65 -45
- data/lib/active_record/railties/databases.rake +267 -93
- data/lib/active_record/readonly_attributes.rb +4 -0
- data/lib/active_record/reflection.rb +77 -63
- data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
- data/lib/active_record/relation/batches.rb +38 -32
- data/lib/active_record/relation/calculations.rb +102 -45
- data/lib/active_record/relation/delegation.rb +9 -7
- data/lib/active_record/relation/finder_methods.rb +45 -16
- data/lib/active_record/relation/from_clause.rb +5 -1
- data/lib/active_record/relation/merger.rb +27 -26
- data/lib/active_record/relation/predicate_builder/array_handler.rb +8 -9
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +4 -5
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +3 -3
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
- data/lib/active_record/relation/predicate_builder.rb +55 -35
- data/lib/active_record/relation/query_methods.rb +335 -187
- data/lib/active_record/relation/record_fetch_warning.rb +3 -3
- data/lib/active_record/relation/spawn_methods.rb +8 -8
- data/lib/active_record/relation/where_clause.rb +104 -58
- data/lib/active_record/relation.rb +108 -68
- data/lib/active_record/result.rb +41 -34
- data/lib/active_record/runtime_registry.rb +2 -2
- data/lib/active_record/sanitization.rb +6 -17
- data/lib/active_record/schema_dumper.rb +34 -4
- data/lib/active_record/schema_migration.rb +2 -8
- data/lib/active_record/scoping/default.rb +0 -1
- data/lib/active_record/scoping/named.rb +7 -18
- data/lib/active_record/scoping.rb +0 -1
- data/lib/active_record/secure_token.rb +16 -8
- data/lib/active_record/serialization.rb +5 -3
- data/lib/active_record/signed_id.rb +116 -0
- data/lib/active_record/statement_cache.rb +20 -4
- data/lib/active_record/store.rb +3 -3
- data/lib/active_record/suppressor.rb +2 -2
- data/lib/active_record/table_metadata.rb +39 -36
- data/lib/active_record/tasks/database_tasks.rb +139 -113
- data/lib/active_record/tasks/mysql_database_tasks.rb +34 -36
- data/lib/active_record/tasks/postgresql_database_tasks.rb +24 -27
- data/lib/active_record/tasks/sqlite_database_tasks.rb +13 -10
- data/lib/active_record/test_databases.rb +5 -4
- data/lib/active_record/test_fixtures.rb +38 -16
- data/lib/active_record/timestamp.rb +4 -7
- data/lib/active_record/touch_later.rb +20 -21
- data/lib/active_record/transactions.rb +21 -70
- data/lib/active_record/type/adapter_specific_registry.rb +2 -5
- data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
- data/lib/active_record/type/serialized.rb +6 -3
- data/lib/active_record/type/time.rb +10 -0
- data/lib/active_record/type/type_map.rb +0 -1
- data/lib/active_record/type/unsigned_integer.rb +0 -1
- data/lib/active_record/type.rb +8 -2
- data/lib/active_record/type_caster/connection.rb +0 -1
- data/lib/active_record/type_caster/map.rb +8 -5
- data/lib/active_record/validations/associated.rb +1 -2
- data/lib/active_record/validations/numericality.rb +35 -0
- data/lib/active_record/validations/uniqueness.rb +24 -4
- data/lib/active_record/validations.rb +3 -3
- data/lib/active_record.rb +7 -13
- data/lib/arel/attributes/attribute.rb +4 -0
- data/lib/arel/collectors/bind.rb +5 -0
- data/lib/arel/collectors/composite.rb +8 -0
- data/lib/arel/collectors/sql_string.rb +7 -0
- data/lib/arel/collectors/substitute_binds.rb +7 -0
- data/lib/arel/nodes/binary.rb +82 -8
- data/lib/arel/nodes/bind_param.rb +8 -0
- data/lib/arel/nodes/casted.rb +21 -9
- data/lib/arel/nodes/equality.rb +6 -9
- data/lib/arel/nodes/grouping.rb +3 -0
- data/lib/arel/nodes/homogeneous_in.rb +72 -0
- data/lib/arel/nodes/in.rb +8 -1
- data/lib/arel/nodes/infix_operation.rb +13 -1
- data/lib/arel/nodes/join_source.rb +1 -1
- data/lib/arel/nodes/node.rb +7 -6
- data/lib/arel/nodes/ordering.rb +27 -0
- data/lib/arel/nodes/sql_literal.rb +3 -0
- data/lib/arel/nodes/table_alias.rb +7 -3
- data/lib/arel/nodes/unary.rb +0 -1
- data/lib/arel/nodes.rb +3 -1
- data/lib/arel/predications.rb +17 -24
- data/lib/arel/select_manager.rb +1 -2
- data/lib/arel/table.rb +13 -5
- data/lib/arel/visitors/dot.rb +14 -3
- data/lib/arel/visitors/mysql.rb +11 -1
- data/lib/arel/visitors/postgresql.rb +15 -5
- data/lib/arel/visitors/sqlite.rb +0 -1
- data/lib/arel/visitors/to_sql.rb +89 -79
- data/lib/arel/visitors/visitor.rb +0 -1
- data/lib/arel/visitors.rb +0 -7
- data/lib/arel.rb +5 -9
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
- data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +2 -0
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +4 -4
- data/lib/rails/generators/active_record/migration.rb +6 -2
- data/lib/rails/generators/active_record/model/model_generator.rb +38 -2
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
- metadata +26 -26
- data/lib/active_record/attribute_decorators.rb +0 -90
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -297
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
- data/lib/active_record/define_callbacks.rb +0 -22
- data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
- data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
- data/lib/active_record/relation/where_clause_factory.rb +0 -33
- data/lib/arel/attributes.rb +0 -22
- data/lib/arel/visitors/depth_first.rb +0 -204
- data/lib/arel/visitors/ibm_db.rb +0 -34
- data/lib/arel/visitors/informix.rb +0 -62
- data/lib/arel/visitors/mssql.rb +0 -157
- data/lib/arel/visitors/oracle.rb +0 -159
- data/lib/arel/visitors/oracle12.rb +0 -66
- 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
|
52
|
-
#
|
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
|
-
|
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
|
@@ -175,13 +173,6 @@ module ActiveRecord
|
|
175
173
|
true
|
176
174
|
end
|
177
175
|
|
178
|
-
# Returns 62. SQLite supports index names up to 64
|
179
|
-
# characters. The rest is used by Rails internally to perform
|
180
|
-
# temporary rename operations
|
181
|
-
def allowed_index_name_length
|
182
|
-
index_name_length - 2
|
183
|
-
end
|
184
|
-
|
185
176
|
def native_database_types #:nodoc:
|
186
177
|
NATIVE_DATABASE_TYPES
|
187
178
|
end
|
@@ -215,14 +206,6 @@ module ActiveRecord
|
|
215
206
|
end
|
216
207
|
end
|
217
208
|
|
218
|
-
#--
|
219
|
-
# DATABASE STATEMENTS ======================================
|
220
|
-
#++
|
221
|
-
def explain(arel, binds = [])
|
222
|
-
sql = "EXPLAIN QUERY PLAN #{to_sql(arel, binds)}"
|
223
|
-
SQLite3::ExplainPrettyPrinter.new.pp(exec_query(sql, "EXPLAIN", []))
|
224
|
-
end
|
225
|
-
|
226
209
|
# SCHEMA STATEMENTS ========================================
|
227
210
|
|
228
211
|
def primary_keys(table_name) # :nodoc:
|
@@ -230,8 +213,11 @@ module ActiveRecord
|
|
230
213
|
pks.sort_by { |f| f["pk"] }.map { |f| f["name"] }
|
231
214
|
end
|
232
215
|
|
233
|
-
def remove_index(table_name,
|
234
|
-
|
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
|
+
|
235
221
|
exec_query "DROP INDEX #{quote_column_name(index_name)}"
|
236
222
|
end
|
237
223
|
|
@@ -240,21 +226,23 @@ module ActiveRecord
|
|
240
226
|
# Example:
|
241
227
|
# rename_table('octopuses', 'octopi')
|
242
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)
|
243
231
|
exec_query "ALTER TABLE #{quote_table_name(table_name)} RENAME TO #{quote_table_name(new_name)}"
|
244
232
|
rename_table_indexes(table_name, new_name)
|
245
233
|
end
|
246
234
|
|
247
|
-
def add_column(table_name, column_name, type, options
|
235
|
+
def add_column(table_name, column_name, type, **options) #:nodoc:
|
248
236
|
if invalid_alter_table_type?(type, options)
|
249
237
|
alter_table(table_name) do |definition|
|
250
|
-
definition.column(column_name, type, options)
|
238
|
+
definition.column(column_name, type, **options)
|
251
239
|
end
|
252
240
|
else
|
253
241
|
super
|
254
242
|
end
|
255
243
|
end
|
256
244
|
|
257
|
-
def remove_column(table_name, column_name, type = nil, options
|
245
|
+
def remove_column(table_name, column_name, type = nil, **options) #:nodoc:
|
258
246
|
alter_table(table_name) do |definition|
|
259
247
|
definition.remove_column column_name
|
260
248
|
definition.foreign_keys.delete_if do |_, fk_options|
|
@@ -280,16 +268,11 @@ module ActiveRecord
|
|
280
268
|
end
|
281
269
|
end
|
282
270
|
|
283
|
-
def change_column(table_name, column_name, type, options
|
271
|
+
def change_column(table_name, column_name, type, **options) #:nodoc:
|
284
272
|
alter_table(table_name) do |definition|
|
285
273
|
definition[column_name].instance_eval do
|
286
|
-
self.type
|
287
|
-
self.
|
288
|
-
self.default = options[:default] if options.include?(:default)
|
289
|
-
self.null = options[:null] if options.include?(:null)
|
290
|
-
self.precision = options[:precision] if options.include?(:precision)
|
291
|
-
self.scale = options[:scale] if options.include?(:scale)
|
292
|
-
self.collation = options[:collation] if options.include?(:collation)
|
274
|
+
self.type = type
|
275
|
+
self.options.merge!(options)
|
293
276
|
end
|
294
277
|
end
|
295
278
|
end
|
@@ -325,12 +308,17 @@ module ActiveRecord
|
|
325
308
|
sql << " ON CONFLICT #{insert.conflict_target} DO NOTHING"
|
326
309
|
elsif insert.update_duplicates?
|
327
310
|
sql << " ON CONFLICT #{insert.conflict_target} DO UPDATE SET "
|
311
|
+
sql << insert.touch_model_timestamps_unless { |column| "#{column} IS excluded.#{column}" }
|
328
312
|
sql << insert.updatable_columns.map { |column| "#{column}=excluded.#{column}" }.join(",")
|
329
313
|
end
|
330
314
|
|
331
315
|
sql
|
332
316
|
end
|
333
317
|
|
318
|
+
def shared_cache? # :nodoc:
|
319
|
+
@config.fetch(:flags, 0).anybits?(::SQLite3::Constants::Open::SHAREDCACHE)
|
320
|
+
end
|
321
|
+
|
334
322
|
def get_database_version # :nodoc:
|
335
323
|
SQLite3Adapter::Version.new(query_value("SELECT sqlite_version(*)"))
|
336
324
|
end
|
@@ -363,10 +351,16 @@ module ActiveRecord
|
|
363
351
|
# See: https://www.sqlite.org/lang_altertable.html
|
364
352
|
# SQLite has an additional restriction on the ALTER TABLE statement
|
365
353
|
def invalid_alter_table_type?(type, options)
|
366
|
-
type.to_sym == :primary_key || options[:primary_key]
|
354
|
+
type.to_sym == :primary_key || options[:primary_key] ||
|
355
|
+
options[:null] == false && options[:default].nil?
|
367
356
|
end
|
368
357
|
|
369
|
-
def alter_table(
|
358
|
+
def alter_table(
|
359
|
+
table_name,
|
360
|
+
foreign_keys = foreign_keys(table_name),
|
361
|
+
check_constraints = check_constraints(table_name),
|
362
|
+
**options
|
363
|
+
)
|
370
364
|
altered_table_name = "a#{table_name}"
|
371
365
|
|
372
366
|
caller = lambda do |definition|
|
@@ -376,7 +370,11 @@ module ActiveRecord
|
|
376
370
|
fk.options[:column] = column
|
377
371
|
end
|
378
372
|
to_table = strip_table_name_prefix_and_suffix(fk.to_table)
|
379
|
-
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)
|
380
378
|
end
|
381
379
|
|
382
380
|
yield definition if block_given?
|
@@ -398,11 +396,12 @@ module ActiveRecord
|
|
398
396
|
def copy_table(from, to, options = {})
|
399
397
|
from_primary_key = primary_key(from)
|
400
398
|
options[:id] = false
|
401
|
-
create_table(to, options) do |definition|
|
399
|
+
create_table(to, **options) do |definition|
|
402
400
|
@definition = definition
|
403
401
|
if from_primary_key.is_a?(Array)
|
404
402
|
@definition.primary_keys from_primary_key
|
405
403
|
end
|
404
|
+
|
406
405
|
columns(from).each do |column|
|
407
406
|
column_name = options[:rename] ?
|
408
407
|
(options[:rename][column.name] ||
|
@@ -444,10 +443,10 @@ module ActiveRecord
|
|
444
443
|
|
445
444
|
unless columns.empty?
|
446
445
|
# index name can't be the same
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
add_index(to, columns,
|
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)
|
451
450
|
end
|
452
451
|
end
|
453
452
|
end
|
@@ -466,17 +465,18 @@ module ActiveRecord
|
|
466
465
|
end
|
467
466
|
|
468
467
|
def translate_exception(exception, message:, sql:, binds:)
|
469
|
-
case exception.message
|
470
468
|
# SQLite 3.8.2 returns a newly formatted error message:
|
471
469
|
# UNIQUE constraint failed: *table_name*.*column_name*
|
472
470
|
# Older versions of SQLite return:
|
473
471
|
# column *column_name* is not unique
|
474
|
-
|
472
|
+
if exception.message.match?(/(column(s)? .* (is|are) not unique|UNIQUE constraint failed: .*)/i)
|
475
473
|
RecordNotUnique.new(message, sql: sql, binds: binds)
|
476
|
-
|
474
|
+
elsif exception.message.match?(/(.* may not be NULL|NOT NULL constraint failed: .*)/i)
|
477
475
|
NotNullViolation.new(message, sql: sql, binds: binds)
|
478
|
-
|
476
|
+
elsif exception.message.match?(/FOREIGN KEY constraint failed/i)
|
479
477
|
InvalidForeignKey.new(message, sql: sql, binds: binds)
|
478
|
+
elsif exception.message.match?(/called on a closed database/i)
|
479
|
+
ConnectionNotEstablished.new(exception)
|
480
480
|
else
|
481
481
|
super
|
482
482
|
end
|
@@ -496,12 +496,12 @@ module ActiveRecord
|
|
496
496
|
# Result will have following sample string
|
497
497
|
# CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
498
498
|
# "password_digest" varchar COLLATE "NOCASE");
|
499
|
-
result =
|
499
|
+
result = query_value(sql, "SCHEMA")
|
500
500
|
|
501
501
|
if result
|
502
502
|
# Splitting with left parentheses and discarding the first part will return all
|
503
503
|
# columns separated with comma(,).
|
504
|
-
columns_string = result
|
504
|
+
columns_string = result.split("(", 2).last
|
505
505
|
|
506
506
|
columns_string.split(",").each do |column_string|
|
507
507
|
# This regex will match the column name and collation type and will save
|
@@ -509,7 +509,7 @@ module ActiveRecord
|
|
509
509
|
collation_hash[$1] = $2 if COLLATE_REGEX =~ column_string
|
510
510
|
end
|
511
511
|
|
512
|
-
basic_structure.map
|
512
|
+
basic_structure.map do |column|
|
513
513
|
column_name = column["name"]
|
514
514
|
|
515
515
|
if collation_hash.has_key? column_name
|
@@ -0,0 +1,50 @@
|
|
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
|
+
|
16
|
+
autoload_at "active_record/connection_adapters/abstract/schema_definitions" do
|
17
|
+
autoload :IndexDefinition
|
18
|
+
autoload :ColumnDefinition
|
19
|
+
autoload :ChangeColumnDefinition
|
20
|
+
autoload :ForeignKeyDefinition
|
21
|
+
autoload :CheckConstraintDefinition
|
22
|
+
autoload :TableDefinition
|
23
|
+
autoload :Table
|
24
|
+
autoload :AlterTable
|
25
|
+
autoload :ReferenceDefinition
|
26
|
+
end
|
27
|
+
|
28
|
+
autoload_at "active_record/connection_adapters/abstract/connection_pool" do
|
29
|
+
autoload :ConnectionHandler
|
30
|
+
end
|
31
|
+
|
32
|
+
autoload_under "abstract" do
|
33
|
+
autoload :SchemaStatements
|
34
|
+
autoload :DatabaseStatements
|
35
|
+
autoload :DatabaseLimits
|
36
|
+
autoload :Quoting
|
37
|
+
autoload :ConnectionPool
|
38
|
+
autoload :QueryCache
|
39
|
+
autoload :Savepoints
|
40
|
+
end
|
41
|
+
|
42
|
+
autoload_at "active_record/connection_adapters/abstract/transaction" do
|
43
|
+
autoload :TransactionManager
|
44
|
+
autoload :NullTransaction
|
45
|
+
autoload :RealTransaction
|
46
|
+
autoload :SavepointTransaction
|
47
|
+
autoload :TransactionState
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|