diff options
author | Jeremy Daer <jeremydaer@gmail.com> | 2016-04-22 15:33:59 -0700 |
---|---|---|
committer | Jeremy Daer <jeremydaer@gmail.com> | 2016-04-22 15:33:59 -0700 |
commit | a14c811026573f859ec9d82c4f74bb3ae8518fe5 (patch) | |
tree | 5f1f0fdc71ddd926b3522e91b51c6d17becbf562 /activerecord/lib/active_record | |
parent | 1ca6f7f7676c5933cc5c6bff5aeabf362aa1ba59 (diff) | |
parent | 6e098284e97250eaed6f30f5c7c362d87da986b0 (diff) | |
download | rails-a14c811026573f859ec9d82c4f74bb3ae8518fe5.tar.gz rails-a14c811026573f859ec9d82c4f74bb3ae8518fe5.tar.bz2 rails-a14c811026573f859ec9d82c4f74bb3ae8518fe5.zip |
Merge pull request #24685 from vipulnsward/sqlite-compat-for-multi-insert
Gracefully fallback on version migrations for sqlite < 3.7.11
Diffstat (limited to 'activerecord/lib/active_record')
3 files changed, 25 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb index 104ca54793..aadac5e7ee 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb @@ -985,11 +985,23 @@ module ActiveRecord end def dump_schema_information #:nodoc: + versions = ActiveRecord::SchemaMigration.order('version').pluck(:version) + insert_versions_sql(versions) + end + + def insert_versions_sql(versions) sm_table = ActiveRecord::Migrator.schema_migrations_table_name - sql = "INSERT INTO #{sm_table} (version) VALUES " - sql << ActiveRecord::SchemaMigration.order('version').pluck(:version).map {|v| "('#{v}')" }.join(', ') - sql << ";\n\n" + if supports_multi_insert? + sql = "INSERT INTO #{sm_table} (version) VALUES " + sql << versions.map {|v| "('#{v}')" }.join(', ') + sql << ";\n\n" + sql + else + versions.map { |version| + "INSERT INTO #{sm_table} (version) VALUES ('#{version}');" + }.join "\n\n" + end end # Should not be called normally, but this operation is non-destructive. @@ -1026,7 +1038,7 @@ module ActiveRecord if (duplicate = inserting.detect {|v| inserting.count(v) > 1}) raise "Duplicate migration #{duplicate}. Please renumber your migrations to resolve the conflict." end - execute "INSERT INTO #{sm_table} (version) VALUES #{inserting.map {|v| "('#{v}')"}.join(', ') }" + execute insert_versions_sql(versions) end end diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index 20cc205b0d..2e18226a10 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -298,6 +298,11 @@ module ActiveRecord false end + # Does this adapter support multi-value insert + def supports_multi_insert? + true + end + # This is meant to be implemented by the adapters that support extensions def disable_extension(name) end diff --git a/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb b/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb index 985cc06aa0..bf73d647c0 100644 --- a/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb @@ -130,6 +130,10 @@ module ActiveRecord true end + def supports_multi_insert? + sqlite_version >= '3.7.11' + end + def active? @active != false end |