diff options
author | Edouard CHIN <edouard.chin@shopify.com> | 2018-01-22 12:51:59 -0500 |
---|---|---|
committer | Edouard CHIN <edouard.chin@shopify.com> | 2018-01-22 13:03:16 -0500 |
commit | 9a5b1fad630e4d35b64bb62b92c00e6cc79046d4 (patch) | |
tree | 7c7f967a81933751c7d8387a144067dec614e274 /activerecord | |
parent | 22a26d249f78d650752057d0a5d82f34a312d041 (diff) | |
download | rails-9a5b1fad630e4d35b64bb62b92c00e6cc79046d4.tar.gz rails-9a5b1fad630e4d35b64bb62b92c00e6cc79046d4.tar.bz2 rails-9a5b1fad630e4d35b64bb62b92c00e6cc79046d4.zip |
Combine delete and insert statements in the same query
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb | 11 | ||||
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb | 12 |
2 files changed, 10 insertions, 13 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb b/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb index abda16b342..d663b59444 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb @@ -372,12 +372,13 @@ module ActiveRecord build_fixture_sql(fixtures, table_name) end.compact - total_sql = Array.wrap(combine_multi_statements(fixture_inserts, tables_to_delete)) + table_deletes = tables_to_delete.map { |table| "DELETE FROM #{quote_table_name table}".dup } + total_sql = Array.wrap(combine_multi_statements(table_deletes + fixture_inserts)) disable_referential_integrity do transaction(requires_new: true) do total_sql.each do |sql| - execute sql, "Fixtures Insert" + execute sql, "Fixtures Load" yield if block_given? end end @@ -445,10 +446,8 @@ module ActiveRecord manager.to_sql end - def combine_multi_statements(fixture_inserts, tables_to_delete) - tables_to_delete.each { |table| delete "DELETE FROM #{quote_table_name(table)}", "Fixture Delete" } - - fixture_inserts.join(";\n") + def combine_multi_statements(total_sql) + total_sql.join(";\n") end # Returns a subquery for the given key using the join information. diff --git a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb index 4537d6455d..5e6ab1c16d 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb @@ -545,14 +545,12 @@ module ActiveRecord private - def combine_multi_statements(fixture_inserts, tables_to_delete) - super - - fixture_inserts.each_with_object([]) do |sql, total_sql| - previous_packet = total_sql.last + def combine_multi_statements(total_sql) + total_sql.each_with_object([]) do |sql, total_sql_chunks| + previous_packet = total_sql_chunks.last sql << ";\n" - if max_allowed_packet_reached?(sql, previous_packet) || total_sql.empty? - total_sql << sql + if max_allowed_packet_reached?(sql, previous_packet) || total_sql_chunks.empty? + total_sql_chunks << sql else previous_packet << sql end |