Skip to content

Commit 2c3fc2d

Browse files
authored
Fix: Where clauses with named arguments may cause generation of unintended queries (#4937)
1 parent 24026bf commit 2c3fc2d

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

clause/where.go

+3
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ func buildExprs(exprs []Expression, builder Builder, joinCond string) {
6060
case Expr:
6161
sql := strings.ToLower(v.SQL)
6262
wrapInParentheses = strings.Contains(sql, "and") || strings.Contains(sql, "or")
63+
case NamedExpr:
64+
sql := strings.ToLower(v.SQL)
65+
wrapInParentheses = strings.Contains(sql, "and") || strings.Contains(sql, "or")
6366
}
6467
}
6568

tests/named_argument_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package tests_test
22

33
import (
44
"database/sql"
5+
"errors"
56
"testing"
67

78
"gorm.io/gorm"
@@ -66,4 +67,16 @@ func TestNamedArg(t *testing.T) {
6667
}
6768

6869
AssertEqual(t, result6, namedUser)
70+
71+
var result7 NamedUser
72+
if err := DB.Where("name1 = @name OR name2 = @name", sql.Named("name", "jinzhu-new")).Where("name3 = 'jinzhu-new3'").First(&result7).Error; err == nil || !errors.Is(err, gorm.ErrRecordNotFound) {
73+
t.Errorf("should return record not found error, but got %v", err)
74+
}
75+
76+
DB.Delete(&namedUser)
77+
78+
var result8 NamedUser
79+
if err := DB.Where("name1 = @name OR name2 = @name", map[string]interface{}{"name": "jinzhu-new"}).First(&result8).Error; err == nil || !errors.Is(err, gorm.ErrRecordNotFound) {
80+
t.Errorf("should return record not found error, but got %v", err)
81+
}
6982
}

0 commit comments

Comments
 (0)