From fe5157bce02fd73d0e4eb9baf76317f2acbcf6dc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 7 Jun 2026 11:48:32 +0000 Subject: [PATCH] Fix composite PK insert return value handling --- .../sqlserver/database_statements.rb | 4 +++ test/cases/primary_keys_test_sqlserver.rb | 34 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index a3fbe0126..ffc6b604e 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -44,6 +44,10 @@ def cast_result(result) result end + def returning_column_values(result) + result.rows.first + end + # Returns the affected rows from results. def affected_rows(raw_result) column_name = lowercase_schema_reflection ? "affectedrows" : "AffectedRows" diff --git a/test/cases/primary_keys_test_sqlserver.rb b/test/cases/primary_keys_test_sqlserver.rb index 1de09790d..997f1231f 100644 --- a/test/cases/primary_keys_test_sqlserver.rb +++ b/test/cases/primary_keys_test_sqlserver.rb @@ -46,6 +46,40 @@ class PrimaryKeyIntegerTest < ActiveRecord::TestCase class Barcode < ActiveRecord::Base end + class CompositePrimaryKeyAutoGeneratedValuesTest < ActiveRecord::TestCase + self.use_transactional_tests = false + + class CompositePkAutoValue < ActiveRecord::Base + self.table_name = :composite_pk_auto_values + self.primary_key = %i[id guid] + end + + setup do + @connection = ActiveRecord::Base.lease_connection + @connection.execute "DROP TABLE composite_pk_auto_values" if @connection.table_exists?(:composite_pk_auto_values) + @connection.execute <<~SQL + CREATE TABLE composite_pk_auto_values ( + id bigint IDENTITY(1,1) NOT NULL, + guid uniqueidentifier DEFAULT NEWID() NOT NULL, + CONSTRAINT PK_composite_pk_auto_values PRIMARY KEY (id, guid) + ) + SQL + end + + teardown do + @connection.execute "DROP TABLE composite_pk_auto_values" if @connection.table_exists?(:composite_pk_auto_values) + end + + test "assigns all returned values when composite primary key columns are database generated" do + record = CompositePkAutoValue.create! + persisted = CompositePkAutoValue.last + + assert_equal persisted.id, record.id + assert_equal persisted.guid, record.guid + assert_not_nil record.guid + end + end + class Widget < ActiveRecord::Base end