feat: QuoteTo accept clause.Expr

This commit is contained in:
riverchu 2021-08-18 21:55:57 +08:00
parent 2b2f6e77af
commit 7973af40d4
2 changed files with 44 additions and 0 deletions

View File

@ -129,6 +129,8 @@ func (stmt *Statement) QuoteTo(writer clause.Writer, field interface{}) {
stmt.QuoteTo(writer, d) stmt.QuoteTo(writer, d)
} }
writer.WriteByte(')') writer.WriteByte(')')
case clause.Expr:
v.Build(stmt)
case string: case string:
stmt.DB.Dialector.QuoteTo(writer, v) stmt.DB.Dialector.QuoteTo(writer, v)
case []string: case []string:

View File

@ -3,9 +3,12 @@ package gorm
import ( import (
"fmt" "fmt"
"reflect" "reflect"
"strings"
"testing" "testing"
"gorm.io/gorm/clause" "gorm.io/gorm/clause"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
) )
func TestWhereCloneCorruption(t *testing.T) { func TestWhereCloneCorruption(t *testing.T) {
@ -34,3 +37,42 @@ func TestWhereCloneCorruption(t *testing.T) {
}) })
} }
} }
var _ Dialector = new(dummyDialector)
type dummyDialector struct{}
func (dummyDialector) Name() string { return "dummy" }
func (dummyDialector) Initialize(*DB) error { return nil }
func (dummyDialector) DefaultValueOf(field *schema.Field) clause.Expression {
return clause.Expr{SQL: "DEFAULT"}
}
func (dummyDialector) Migrator(*DB) Migrator { return nil }
func (dummyDialector) BindVarTo(writer clause.Writer, stmt *Statement, v interface{}) {
writer.WriteByte('?')
}
func (dummyDialector) QuoteTo(writer clause.Writer, str string) { writer.WriteString("`" + str + "`") }
func (dummyDialector) Explain(sql string, vars ...interface{}) string {
return logger.ExplainSQL(sql, nil, `"`, vars...)
}
func (dummyDialector) DataTypeOf(*schema.Field) string { return "" }
var db, _ = Open(dummyDialector{})
func TestStatement_WriteQuoted(t *testing.T) {
s := Statement{DB: db}
testdata := map[string]clause.Expression{
"SUM(`users`.`id`)": clause.Expr{SQL: "SUM(?)", Vars: []interface{}{clause.Column{Table: "users", Name: "id"}}},
}
for result, expr := range testdata {
s.WriteQuoted(expr)
if s.SQL.String() != result {
t.Errorf("WriteQuoted test fail, expected: %s, got %s", result, s.SQL.String())
}
s.SQL = strings.Builder{}
s.Vars = []interface{}{}
}
}