diff --git a/internal/statements/cond.go b/internal/statements/cond.go index 30eb5b4f..4cf7aafd 100644 --- a/internal/statements/cond.go +++ b/internal/statements/cond.go @@ -4,7 +4,27 @@ package statements -import "xorm.io/builder" +import ( + "xorm.io/builder" + "xorm.io/xorm/schemas" +) + +type QuoteReplacer struct { + *builder.BytesWriter + quoter schemas.Quoter +} + +func (q *QuoteReplacer) Write(p []byte) (n int, err error) { + c := q.quoter.Replace(string(p)) + return q.BytesWriter.Builder.WriteString(c) +} + +func (statement *Statement) quoteReplacer(w *builder.BytesWriter) *QuoteReplacer { + return &QuoteReplacer{ + BytesWriter: w, + quoter: statement.dialect.Quoter(), + } +} // Where add Where statement func (statement *Statement) Where(query interface{}, args ...interface{}) *Statement { @@ -15,7 +35,7 @@ func (statement *Statement) Where(query interface{}, args ...interface{}) *State func (statement *Statement) And(query interface{}, args ...interface{}) *Statement { switch qr := query.(type) { case string: - cond := builder.Expr(qr, args...) + cond := builder.Expr(statement.ReplaceQuote(qr), args...) statement.cond = statement.cond.And(cond) case map[string]interface{}: cond := make(builder.Eq) diff --git a/internal/statements/query.go b/internal/statements/query.go index a9d1a075..fa643154 100644 --- a/internal/statements/query.go +++ b/internal/statements/query.go @@ -231,7 +231,7 @@ func (statement *Statement) genSelectSQL(columnStr string, needLimit, needOrderB } condWriter := builder.NewWriter() - if err := statement.cond.WriteTo(condWriter); err != nil { + if err := statement.cond.WriteTo(statement.quoteReplacer(condWriter)); err != nil { return "", nil, err } @@ -282,7 +282,7 @@ func (statement *Statement) genSelectSQL(columnStr string, needLimit, needOrderB if _, err := fmt.Fprint(mssqlCondi, whereStr); err != nil { return "", nil, err } - if err := utils.WriteBuilder(mssqlCondi, condWriter); err != nil { + if err := utils.WriteBuilder(mssqlCondi, statement.quoteReplacer(condWriter)); err != nil { return "", nil, err } } @@ -311,7 +311,7 @@ func (statement *Statement) genSelectSQL(columnStr string, needLimit, needOrderB if _, err := fmt.Fprint(buf, whereStr); err != nil { return "", nil, err } - if err := utils.WriteBuilder(buf, condWriter); err != nil { + if err := utils.WriteBuilder(buf, statement.quoteReplacer(condWriter)); err != nil { return "", nil, err } } diff --git a/internal/utils/builder.go b/internal/utils/builder.go index 73bbf87a..bc97526f 100644 --- a/internal/utils/builder.go +++ b/internal/utils/builder.go @@ -10,8 +10,13 @@ import ( "xorm.io/builder" ) +type BuildReader interface { + String() string + Args() []interface{} +} + // WriteBuilder writes writers to one -func WriteBuilder(w *builder.BytesWriter, inputs ...*builder.BytesWriter) error { +func WriteBuilder(w *builder.BytesWriter, inputs ...BuildReader) error { for _, input := range inputs { if _, err := fmt.Fprint(w, input.String()); err != nil { return err