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