From 153985c631c2b25ef6b78875b8c9dac8b7896844 Mon Sep 17 00:00:00 2001 From: Andy Pfister Date: Fri, 21 Mar 2025 20:45:39 +0100 Subject: [PATCH 1/2] Reverse order of values when upserting I contributed two tests to Rails because I was not sure how `insert_all` and `upsert_all` should behave with duplicate identifiers. For `insert_all`, all DBMS only insert the first value. For `upsert_all`, PostgreSQL throws an error in this scenario, but with sqlite and MySQL, the last entry ends up in the database. For now, I do not have a smarter idea than reversing the `inserts`, which ultimately provide the `values_list`. Adding `MAX` would be another, but I fear the SQL query would get much more complicated. --- .../connection_adapters/sqlserver/database_statements.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index 92e91665d..addc593d3 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -169,6 +169,8 @@ def build_insert_sql(insert) # :nodoc: end 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 3a6ee3f8eda5ae3cb37df80e08f439a0b0a2e917 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Sun, 23 Mar 2025 09:37:46 +0000 Subject: [PATCH 2/2] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48a4daac0..fabc1048a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - [#1301](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1301) Add support for INDEX INCLUDE. - [#1312](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1312) Add support for `insert_all` and `upsert_all` +- [#1317](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1317) Reverse order of values when upserting #### Changed