diff --git a/statement.go b/statement.go index 8b682c84..93b78c12 100644 --- a/statement.go +++ b/statement.go @@ -129,6 +129,8 @@ func (stmt *Statement) QuoteTo(writer clause.Writer, field interface{}) { stmt.QuoteTo(writer, d) } writer.WriteByte(')') + case clause.Expr: + v.Build(stmt) case string: stmt.DB.Dialector.QuoteTo(writer, v) case []string: diff --git a/statement_test.go b/statement_test.go index 03ad81dc..0ee57a3f 100644 --- a/statement_test.go +++ b/statement_test.go @@ -3,9 +3,12 @@ package gorm import ( "fmt" "reflect" + "strings" "testing" "gorm.io/gorm/clause" + "gorm.io/gorm/logger" + "gorm.io/gorm/schema" ) 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{}{} + } +}