Fix extra 'AND' when len(values) == 0 ON IN.NegationBuild()

This commit is contained in:
SkyingzZ 2021-08-16 19:34:41 +08:00
parent 2b2f6e77af
commit f21efdc42b
2 changed files with 7 additions and 2 deletions

View File

@ -210,11 +210,12 @@ func (in IN) Build(builder Builder) {
} }
func (in IN) NegationBuild(builder Builder) { func (in IN) NegationBuild(builder Builder) {
builder.WriteQuoted(in.Column)
switch len(in.Values) { switch len(in.Values) {
case 0: case 0:
builder.WriteString(" IS NOT NULL")
case 1: case 1:
if _, ok := in.Values[0].([]interface{}); !ok { if _, ok := in.Values[0].([]interface{}); !ok {
builder.WriteQuoted(in.Column)
builder.WriteString(" <> ") builder.WriteString(" <> ")
builder.AddVar(builder, in.Values[0]) builder.AddVar(builder, in.Values[0])
break break
@ -222,7 +223,6 @@ func (in IN) NegationBuild(builder Builder) {
fallthrough fallthrough
default: default:
builder.WriteQuoted(in.Column)
builder.WriteString(" NOT IN (") builder.WriteString(" NOT IN (")
builder.AddVar(builder, in.Values...) builder.AddVar(builder, in.Values...)
builder.WriteByte(')') builder.WriteByte(')')

View File

@ -436,6 +436,11 @@ func TestNot(t *testing.T) {
t.Fatalf("Build NOT condition, but got %v", result.Statement.SQL.String()) t.Fatalf("Build NOT condition, but got %v", result.Statement.SQL.String())
} }
result = dryDB.Not(map[string]interface{}{"name": []string{}}).Find(&User{})
if !regexp.MustCompile("SELECT \\* FROM .*users.* WHERE .*name.* IS NOT NULL").MatchString(result.Statement.SQL.String()) {
t.Fatalf("Build NOT condition, but got %v", result.Statement.SQL.String())
}
result = dryDB.Not(map[string]interface{}{"name": []string{"jinzhu", "jinzhu 2"}}).Find(&User{}) result = dryDB.Not(map[string]interface{}{"name": []string{"jinzhu", "jinzhu 2"}}).Find(&User{})
if !regexp.MustCompile("SELECT \\* FROM .*users.* WHERE .*name.* NOT IN \\(.+,.+\\)").MatchString(result.Statement.SQL.String()) { if !regexp.MustCompile("SELECT \\* FROM .*users.* WHERE .*name.* NOT IN \\(.+,.+\\)").MatchString(result.Statement.SQL.String()) {
t.Fatalf("Build NOT condition, but got %v", result.Statement.SQL.String()) t.Fatalf("Build NOT condition, but got %v", result.Statement.SQL.String())