Skip to content

Commit

Permalink
Merge pull request rails#51325 from gabriel-amaral/old-upsert-for-on-…
Browse files Browse the repository at this point in the history
…duplicate-raw-sql

Do not try to alias on key update when raw SQL is supplied
  • Loading branch information
byroot committed Mar 14, 2024
2 parents 4bb7323 + ee483b6 commit 89adf24
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 2 deletions.
Expand Up @@ -650,10 +650,10 @@ def build_insert_sql(insert) # :nodoc:
if insert.skip_duplicates?
sql << " ON DUPLICATE KEY UPDATE #{no_op_column}=#{values_alias}.#{no_op_column}"
elsif insert.update_duplicates?
sql << " ON DUPLICATE KEY UPDATE "
if insert.raw_update_sql?
sql << insert.raw_update_sql
sql = +"INSERT #{insert.into} #{insert.values_list} ON DUPLICATE KEY UPDATE #{insert.raw_update_sql}"
else
sql << " ON DUPLICATE KEY UPDATE "
sql << insert.touch_model_timestamps_unless { |column| "#{insert.model.quoted_table_name}.#{column}<=>#{values_alias}.#{column}" }
sql << insert.updatable_columns.map { |column| "#{column}=#{values_alias}.#{column}" }.join(",")
end
Expand Down
20 changes: 20 additions & 0 deletions activerecord/test/cases/insert_all_test.rb
Expand Up @@ -768,6 +768,26 @@ def test_upsert_all_updates_using_provided_sql
assert_equal "written", Book.find(2).status
end

if current_adapter?(:Mysql2Adapter) || current_adapter?(:TrilogyAdapter)
def test_upsert_all_updates_using_values_function_on_duplicate_raw_sql
skip unless supports_insert_on_duplicate_update?

b1 = Book.create!(name: "Name")
b2 = Book.create!(name: nil)

Book.upsert_all(
[{ id: b1.id, name: "No Name" }, { id: b2.id, name: "No Name" }],
on_duplicate: Arel.sql("name = IFNULL(name, values(name))")
)

b1.reload
b2.reload

assert_equal "Name", b1.name
assert_equal "No Name", b2.name
end
end

def test_upsert_all_updates_using_provided_sql_and_unique_by
skip unless supports_insert_on_duplicate_update? && supports_insert_conflict_target?

Expand Down

0 comments on commit 89adf24

Please sign in to comment.