Skip to content

Commit fe5157b

Browse files
authored
Fix composite PK insert return value handling
1 parent edc072c commit fe5157b

2 files changed

Lines changed: 38 additions & 0 deletions

File tree

lib/active_record/connection_adapters/sqlserver/database_statements.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ def cast_result(result)
4444
result
4545
end
4646

47+
def returning_column_values(result)
48+
result.rows.first
49+
end
50+
4751
# Returns the affected rows from results.
4852
def affected_rows(raw_result)
4953
column_name = lowercase_schema_reflection ? "affectedrows" : "AffectedRows"

test/cases/primary_keys_test_sqlserver.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,40 @@ class PrimaryKeyIntegerTest < ActiveRecord::TestCase
4646
class Barcode < ActiveRecord::Base
4747
end
4848

49+
class CompositePrimaryKeyAutoGeneratedValuesTest < ActiveRecord::TestCase
50+
self.use_transactional_tests = false
51+
52+
class CompositePkAutoValue < ActiveRecord::Base
53+
self.table_name = :composite_pk_auto_values
54+
self.primary_key = %i[id guid]
55+
end
56+
57+
setup do
58+
@connection = ActiveRecord::Base.lease_connection
59+
@connection.execute "DROP TABLE composite_pk_auto_values" if @connection.table_exists?(:composite_pk_auto_values)
60+
@connection.execute <<~SQL
61+
CREATE TABLE composite_pk_auto_values (
62+
id bigint IDENTITY(1,1) NOT NULL,
63+
guid uniqueidentifier DEFAULT NEWID() NOT NULL,
64+
CONSTRAINT PK_composite_pk_auto_values PRIMARY KEY (id, guid)
65+
)
66+
SQL
67+
end
68+
69+
teardown do
70+
@connection.execute "DROP TABLE composite_pk_auto_values" if @connection.table_exists?(:composite_pk_auto_values)
71+
end
72+
73+
test "assigns all returned values when composite primary key columns are database generated" do
74+
record = CompositePkAutoValue.create!
75+
persisted = CompositePkAutoValue.last
76+
77+
assert_equal persisted.id, record.id
78+
assert_equal persisted.guid, record.guid
79+
assert_not_nil record.guid
80+
end
81+
end
82+
4983
class Widget < ActiveRecord::Base
5084
end
5185

0 commit comments

Comments
 (0)