Skip to content

Commit 89adf24

Browse files
authored
Merge pull request rails#51325 from gabriel-amaral/old-upsert-for-on-duplicate-raw-sql
Do not try to alias on key update when raw SQL is supplied
2 parents 4bb7323 + ee483b6 commit 89adf24

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -650,10 +650,10 @@ def build_insert_sql(insert) # :nodoc:
650650
if insert.skip_duplicates?
651651
sql << " ON DUPLICATE KEY UPDATE #{no_op_column}=#{values_alias}.#{no_op_column}"
652652
elsif insert.update_duplicates?
653-
sql << " ON DUPLICATE KEY UPDATE "
654653
if insert.raw_update_sql?
655-
sql << insert.raw_update_sql
654+
sql = +"INSERT #{insert.into} #{insert.values_list} ON DUPLICATE KEY UPDATE #{insert.raw_update_sql}"
656655
else
656+
sql << " ON DUPLICATE KEY UPDATE "
657657
sql << insert.touch_model_timestamps_unless { |column| "#{insert.model.quoted_table_name}.#{column}<=>#{values_alias}.#{column}" }
658658
sql << insert.updatable_columns.map { |column| "#{column}=#{values_alias}.#{column}" }.join(",")
659659
end

activerecord/test/cases/insert_all_test.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,26 @@ def test_upsert_all_updates_using_provided_sql
768768
assert_equal "written", Book.find(2).status
769769
end
770770

771+
if current_adapter?(:Mysql2Adapter) || current_adapter?(:TrilogyAdapter)
772+
def test_upsert_all_updates_using_values_function_on_duplicate_raw_sql
773+
skip unless supports_insert_on_duplicate_update?
774+
775+
b1 = Book.create!(name: "Name")
776+
b2 = Book.create!(name: nil)
777+
778+
Book.upsert_all(
779+
[{ id: b1.id, name: "No Name" }, { id: b2.id, name: "No Name" }],
780+
on_duplicate: Arel.sql("name = IFNULL(name, values(name))")
781+
)
782+
783+
b1.reload
784+
b2.reload
785+
786+
assert_equal "Name", b1.name
787+
assert_equal "No Name", b2.name
788+
end
789+
end
790+
771791
def test_upsert_all_updates_using_provided_sql_and_unique_by
772792
skip unless supports_insert_on_duplicate_update? && supports_insert_conflict_target?
773793

0 commit comments

Comments
 (0)