From 445debab9b2e71ff71a53148cd908c44e33b3752 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Sun, 23 Mar 2025 09:40:41 +0000 Subject: [PATCH 1/3] Reverse order of values when upserting --- CHANGELOG.md | 6 ++++++ .../connection_adapters/sqlserver/database_statements.rb | 2 ++ 2 files changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a4dbcc1c..513faf867 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## Unreleased + +#### Fixed + +- [#1317](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1317) Reverse order of values when upserting + ## v8.0.5 #### Added diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index a7751c39b..b1cacc3e4 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -159,6 +159,8 @@ def build_insert_sql(insert) # :nodoc: def build_sql_for_merge_insert(insert:, insert_all:, columns_with_uniqueness_constraints:) # :nodoc: + insert_all.inserts.reverse! if insert.update_duplicates? + sql = <<~SQL MERGE INTO #{insert.model.quoted_table_name} WITH (UPDLOCK, HOLDLOCK) AS target USING ( From ccccf60ffe244e1ffd3ef1076ed0995ff9db724f Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Sun, 23 Mar 2025 11:10:18 +0000 Subject: [PATCH 2/3] Included test for backport --- test/cases/insert_all_test_sqlserver.rb | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 test/cases/insert_all_test_sqlserver.rb diff --git a/test/cases/insert_all_test_sqlserver.rb b/test/cases/insert_all_test_sqlserver.rb new file mode 100644 index 000000000..c48dbeae6 --- /dev/null +++ b/test/cases/insert_all_test_sqlserver.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require "cases/helper_sqlserver" +require "models/book" + +class InsertAllTestSQLServer < ActiveRecord::TestCase + # Test ported from the Rails `main` branch that is not on the `8-0-stable` branch. + def test_insert_all_only_applies_last_value_when_given_duplicate_identifiers + skip unless supports_insert_on_duplicate_skip? + + Book.insert_all [ + { id: 111, name: "expected_new_name" }, + { id: 111, name: "unexpected_new_name" } + ] + assert_equal "expected_new_name", Book.find(111).name + end + + # Test ported from the Rails `main` branch that is not on the `8-0-stable` branch. + def test_upsert_all_only_applies_last_value_when_given_duplicate_identifiers + skip unless supports_insert_on_duplicate_update? && !current_adapter?(:PostgreSQLAdapter) + + Book.create!(id: 112, name: "original_name") + + Book.upsert_all [ + { id: 112, name: "unexpected_new_name" }, + { id: 112, name: "expected_new_name" } + ] + assert_equal "expected_new_name", Book.find(112).name + end +end From 174e982b9bce69b34f3b4a94a0ceae161c333414 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Sun, 23 Mar 2025 11:10:57 +0000 Subject: [PATCH 3/3] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 513faf867..63173aedb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ #### Fixed -- [#1317](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1317) Reverse order of values when upserting +- [#1318](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1318) Reverse order of values when upserting ## v8.0.5