From 2489be134cc3e9146a9d7dea86186d692efab771 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 28 Sep 2019 14:15:33 +0800 Subject: [PATCH] fix bugs --- go.mod | 2 +- go.sum | 2 ++ session_insert_test.go | 1 + statement_args.go | 27 ++++++++++++++++++++++++--- statement_exprparam.go | 7 ++++++- 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index c30d6df5..1ab39831 100644 --- a/go.mod +++ b/go.mod @@ -16,5 +16,5 @@ require ( github.com/stretchr/testify v1.4.0 github.com/ziutek/mymysql v1.5.4 xorm.io/builder v0.3.6 - xorm.io/core v0.7.1 + xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb ) diff --git a/go.sum b/go.sum index 19dd9d3b..cf637a8e 100644 --- a/go.sum +++ b/go.sum @@ -168,3 +168,5 @@ xorm.io/core v0.7.0 h1:hKxuOKWZNeiFQsSuGet/KV8HZ788hclvAl+7azx3tkM= xorm.io/core v0.7.0/go.mod h1:TuOJjIVa7e3w/rN8tDcAvuLBMtwzdHPbyOzE6Gk1EUI= xorm.io/core v0.7.1 h1:I6x6Q6dYb67aDEoYFWr2t8UcKIYjJPyCHS+aXuj5V0Y= xorm.io/core v0.7.1/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM= +xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb h1:msX3zG3BPl8Ti+LDzP33/9K7BzO/WqFXk610K1kYKfo= +xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM= diff --git a/session_insert_test.go b/session_insert_test.go index 631bb6cc..2785401d 100644 --- a/session_insert_test.go +++ b/session_insert_test.go @@ -896,6 +896,7 @@ func TestInsertWhere(t *testing.T) { inserted, err = testEngine.Table(new(InsertWhere)).Where("repo_id=?", 1). SetExpr("`index`", "coalesce(MAX(`index`),0)+1"). + SetExpr("repo_id", "1"). Insert(map[string]string{ "name": "trest3", }) diff --git a/statement_args.go b/statement_args.go index 49f8c1af..e3cc6b32 100644 --- a/statement_args.go +++ b/statement_args.go @@ -49,10 +49,27 @@ func quoteNeeded(a interface{}) bool { return true } -func convertArg(arg interface{}) string { +func convertStringSingleQuote(arg string) string { + return "'" + strings.Replace(arg, "'", "''", -1) + "'" +} + +func convertString(arg string) string { + var buf strings.Builder + buf.WriteRune('\'') + for _, c := range arg { + if c == '\\' || c == '\'' { + buf.WriteRune('\\') + } + buf.WriteRune(c) + } + buf.WriteRune('\'') + return buf.String() +} + +func convertArg(arg interface{}, convertFunc func(string) string) string { if quoteNeeded(arg) { argv := fmt.Sprintf("%v", arg) - return "'" + strings.Replace(strings.Replace(argv, `\`, `\\`, -1), `'`, `\'`, -1) + "'" + return convertFunc(argv) } return fmt.Sprintf("%v", arg) @@ -93,7 +110,11 @@ func (statement *Statement) writeArg(w *builder.BytesWriter, arg interface{}) er return err } default: - if _, err := w.WriteString(convertArg(arg)); err != nil { + var convertFunc = convertString + if statement.Engine.dialect.DBType() == core.SQLITE { + convertFunc = convertStringSingleQuote + } + if _, err := w.WriteString(convertArg(arg, convertFunc)); err != nil { return err } } diff --git a/statement_exprparam.go b/statement_exprparam.go index 0cddca02..4da4f1ea 100644 --- a/statement_exprparam.go +++ b/statement_exprparam.go @@ -57,7 +57,7 @@ func (exprs *exprParams) getByName(colName string) (exprParam, bool) { } func (exprs *exprParams) writeArgs(w *builder.BytesWriter) error { - for _, expr := range exprs.args { + for i, expr := range exprs.args { switch arg := expr.(type) { case *builder.Builder: if _, err := w.WriteString("("); err != nil { @@ -74,6 +74,11 @@ func (exprs *exprParams) writeArgs(w *builder.BytesWriter) error { return err } } + if i != len(exprs.args)-1 { + if _, err := w.WriteString(","); err != nil { + return err + } + } } return nil }