From 7f200d80e248deb1919fd8f815ae9f4e2879a489 Mon Sep 17 00:00:00 2001 From: Alaena Hapin Date: Tue, 28 Jul 2026 16:44:21 -0400 Subject: [PATCH 1/2] test: add regression test for schema-qualified identity insert --- create_test.go | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 create_test.go diff --git a/create_test.go b/create_test.go new file mode 100644 index 0000000..bf28793 --- /dev/null +++ b/create_test.go @@ -0,0 +1,92 @@ +package sqlserver_test + +import ( + "testing" + + "gorm.io/driver/sqlserver" + "gorm.io/gorm" +) + +type testSchemaUser struct { + ID int64 `gorm:"primaryKey"` + Name string +} + +func (testSchemaUser) TableName() string { + return "users" +} + +func setupSchemaTable(t *testing.T, db *gorm.DB) { + t.Helper() + + if err := db.Exec("CREATE SCHEMA testschema").Error; err != nil { + t.Fatal(err) + } + + t.Cleanup(func() { + if err := db.Exec("DROP TABLE IF EXISTS testschema.users").Error; err != nil { + t.Error(err) + } + if err := db.Exec("DROP SCHEMA IF EXISTS testschema").Error; err != nil { + t.Error(err) + } + }) + + if err := db.Exec(` + CREATE TABLE testschema.users ( + id BIGINT IDENTITY(1,1) PRIMARY KEY, + name NVARCHAR(100) + ) + `).Error; err != nil { + t.Fatal(err) + } +} + +func assertUser(t *testing.T, db *gorm.DB, id int64, name string) { + t.Helper() + + var got testSchemaUser + if err := db.Table("testschema.users").First(&got, id).Error; err != nil { + t.Fatal(err) + } + + if got.Name != name { + t.Fatalf("expected %q, got %q", name, got.Name) + } +} + +func TestCreateWithSchemaTable(t *testing.T) { + db, err := gorm.Open(sqlserver.Open(sqlserverDSN)) + if err != nil { + t.Fatal(err) + } + + setupSchemaTable(t, db) + + if err := db.Table("testschema.users").Create(&testSchemaUser{ + ID: 1, + Name: "gorm", + }).Error; err != nil { + t.Fatal(err) + } + + assertUser(t, db, 1, "gorm") +} + +func TestSaveWithSchemaTable(t *testing.T) { + db, err := gorm.Open(sqlserver.Open(sqlserverDSN)) + if err != nil { + t.Fatal(err) + } + + setupSchemaTable(t, db) + + if err := db.Table("testschema.users").Save(&testSchemaUser{ + ID: 1, + Name: "gorm", + }).Error; err != nil { + t.Fatal(err) + } + + assertUser(t, db, 1, "gorm") +} From 9a56415f6a2039323b8ab515dd689dd3960176e6 Mon Sep 17 00:00:00 2001 From: Alaena Hapin Date: Tue, 28 Jul 2026 16:44:40 -0400 Subject: [PATCH 2/2] fix(sqlserver): honor TableExpr for schema-qualified tables Use clause.CurrentTable instead of Statement.Table when generating IDENTITY_INSERT and MERGE statements. This allows GORM's core Statement.QuoteTo logic to honor Statement.TableExpr for schema-qualified tables created via db.Table("schema.table"). --- create.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/create.go b/create.go index 86a8892..f5e9cf7 100644 --- a/create.go +++ b/create.go @@ -68,7 +68,7 @@ func Create(db *gorm.DB) { if setIdentityInsert { db.Statement.WriteString("SET IDENTITY_INSERT ") - db.Statement.WriteQuoted(db.Statement.Table) + db.Statement.WriteQuoted(clause.Table{Name: clause.CurrentTable}) db.Statement.WriteString(" ON;") } } @@ -112,7 +112,7 @@ func Create(db *gorm.DB) { if setIdentityInsert { db.Statement.WriteString("SET IDENTITY_INSERT ") - db.Statement.WriteQuoted(db.Statement.Table) + db.Statement.WriteQuoted(clause.Table{Name: clause.CurrentTable}) db.Statement.WriteString(" OFF;") } } @@ -143,7 +143,7 @@ func Create(db *gorm.DB) { func MergeCreate(db *gorm.DB, onConflict clause.OnConflict, values clause.Values) bool { db.Statement.WriteString("MERGE INTO ") - db.Statement.WriteQuoted(db.Statement.Table) + db.Statement.WriteQuoted(clause.Table{Name: clause.CurrentTable}) db.Statement.WriteString(" USING (VALUES") for idx, value := range values.Values { if idx > 0 {