Skip to content

Add tests for named arguments #9

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 18, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 139 additions & 0 deletions tests/named_argument_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,3 +118,142 @@ func TestNamedArg(t *testing.T) {
t.Errorf("should return record not found error, but got %v", err)
}
}

func TestNamedArgMultipleSameParamRefs(t *testing.T) {
type NamedUser struct {
gorm.Model
Name1 string
}
DB.Migrator().DropTable(&NamedUser{})
DB.AutoMigrate(&NamedUser{})

user := NamedUser{Name1: "multi-ref"}
DB.Create(&user)

var result NamedUser
if err := DB.Raw(`SELECT * FROM "named_users" WHERE @name = @name AND "name1" = @name`,
sql.Named("name", "multi-ref")).Scan(&result).Error; err != nil {
t.Errorf("failed with multiple same param refs: %v", err)
}
tests.AssertEqual(t, result, user)
}

func TestNamedArgNullValues(t *testing.T) {
type NamedUser struct {
gorm.Model
Name1 *string
}
DB.Migrator().DropTable(&NamedUser{})
DB.AutoMigrate(&NamedUser{})

DB.Create(&NamedUser{Name1: nil})

var count int64
if err := DB.Raw(`SELECT count(*) FROM "named_users" WHERE (:name IS NULL AND "name1" IS NULL)`,
sql.Named("name", nil)).Scan(&count).Error; err != nil {
t.Errorf("failed null param test: %v", err)
}
if count != 1 {
t.Errorf("expected 1 null record, got %d", count)
}
}

func TestNamedArgMixedNamedAndMapParams(t *testing.T) {
type NamedUser struct {
gorm.Model
Name1 string
Name2 string
}
DB.Migrator().DropTable(&NamedUser{})
DB.AutoMigrate(&NamedUser{})

user := NamedUser{Name1: "n1", Name2: "n2"}
DB.Create(&user)

var result NamedUser
if err := DB.Raw(`SELECT * FROM "named_users" WHERE "name1" = @name1 AND "name2" = @name2`,
sql.Named("name1", "n1"), map[string]interface{}{"name2": "n2"}).Scan(&result).Error; err != nil {
t.Errorf("failed mixed param test: %v", err)
}
tests.AssertEqual(t, result, user)
}

func TestNamedArgUnusedParameter(t *testing.T) {
type NamedUser struct {
gorm.Model
Name1 string
}
DB.Migrator().DropTable(&NamedUser{})
DB.AutoMigrate(&NamedUser{})

user := NamedUser{Name1: "unused"}
DB.Create(&user)

var result NamedUser
if err := DB.Raw(`SELECT * FROM "named_users" WHERE "name1" = @name1`,
sql.Named("name1", "unused"), sql.Named("extra", "notused")).Scan(&result).Error; err != nil {
t.Errorf("failed unused param test: %v", err)
}
tests.AssertEqual(t, result, user)
}

func TestNamedArgCaseSensitivity(t *testing.T) {
type NamedUser struct {
gorm.Model
Name1 string
}
DB.Migrator().DropTable(&NamedUser{})
DB.AutoMigrate(&NamedUser{})

user := NamedUser{Name1: "CaseTest"}
DB.Create(&user)

var result NamedUser
if err := DB.Raw(`SELECT * FROM "named_users" WHERE "name1" = @Name`,
sql.Named("Name", "CaseTest")).Scan(&result).Error; err != nil {
t.Errorf("failed case sensitivity test: %v", err)
}
tests.AssertEqual(t, result, user)
}

func TestNamedArgInClause(t *testing.T) {
type NamedUser struct {
gorm.Model
Name1 string
}
DB.Migrator().DropTable(&NamedUser{})
DB.AutoMigrate(&NamedUser{})

user1 := NamedUser{Name1: "in1"}
user2 := NamedUser{Name1: "in2"}
DB.Create(&user1)
DB.Create(&user2)

var results []NamedUser
if err := DB.Raw(`SELECT * FROM "named_users" WHERE "name1" IN (@n1, @n2)`,
sql.Named("n1", "in1"), sql.Named("n2", "in2")).Scan(&results).Error; err != nil {
t.Errorf("failed IN clause test: %v", err)
}
if len(results) != 2 {
t.Errorf("expected 2 results, got %d", len(results))
}
}

func TestNamedArgReservedWordParam(t *testing.T) {
type NamedUser struct {
gorm.Model
Name1 string
}
DB.Migrator().DropTable(&NamedUser{})
DB.AutoMigrate(&NamedUser{})

user := NamedUser{Name1: "reserved"}
DB.Create(&user)

var result NamedUser
if err := DB.Raw(`SELECT * FROM "named_users" WHERE "name1" = @order`,
sql.Named("order", "reserved")).Scan(&result).Error; err != nil {
t.Errorf("failed reserved word param test: %v", err)
}
tests.AssertEqual(t, result, user)
}
7 changes: 7 additions & 0 deletions tests/passed-tests.txt
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,13 @@ TestMigrateExistingBoolColumnPG
#TestManyToManyWithCustomizedForeignKeys2
#TestCompositePrimaryKeysAssociations
TestNamedArg
TestNamedArgMultipleSameParamRefs
TestNamedArgNullValues
TestNamedArgMixedNamedAndMapParams
TestNamedArgUnusedParameter
TestNamedArgCaseSensitivity
TestNamedArgInClause
TestNamedArgReservedWordParam
TestNamedPolymorphic
TestNonStdPrimaryKeyAndDefaultValues
TestNestedPreload1
Expand Down
Loading