Skip to content
This repository was archived by the owner on Sep 7, 2021. It is now read-only.
This repository is currently being migrated. It's locked while the migration is in progress.

Commit d6963b7

Browse files
authored
fix arg conversion (#1441)
* fix arg conversion * fix bugs * fix bug on postgres * use traditional positional parameters on insert into select * remove unnecessary tests
1 parent 9872e13 commit d6963b7

File tree

5 files changed

+70
-6
lines changed

5 files changed

+70
-6
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@ require (
1616
github.com/stretchr/testify v1.4.0
1717
github.com/ziutek/mymysql v1.5.4
1818
xorm.io/builder v0.3.6
19-
xorm.io/core v0.7.1
19+
xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb
2020
)

go.sum

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,14 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
8989
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
9090
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
9191
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
92+
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
9293
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
9394
github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
9495
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
9596
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
9697
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
9798
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
99+
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI=
98100
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
99101
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 h1:58fnuSXlxZmFdJyvtTFVmVhcMLU6v5fEb/ok4wyqtNU=
100102
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -155,6 +157,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8
155157
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
156158
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
157159
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
160+
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
158161
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
159162
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
160163
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -165,3 +168,5 @@ xorm.io/core v0.7.0 h1:hKxuOKWZNeiFQsSuGet/KV8HZ788hclvAl+7azx3tkM=
165168
xorm.io/core v0.7.0/go.mod h1:TuOJjIVa7e3w/rN8tDcAvuLBMtwzdHPbyOzE6Gk1EUI=
166169
xorm.io/core v0.7.1 h1:I6x6Q6dYb67aDEoYFWr2t8UcKIYjJPyCHS+aXuj5V0Y=
167170
xorm.io/core v0.7.1/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM=
171+
xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb h1:msX3zG3BPl8Ti+LDzP33/9K7BzO/WqFXk610K1kYKfo=
172+
xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM=

session_insert_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,7 @@ func TestInsertWhere(t *testing.T) {
896896

897897
inserted, err = testEngine.Table(new(InsertWhere)).Where("repo_id=?", 1).
898898
SetExpr("`index`", "coalesce(MAX(`index`),0)+1").
899+
SetExpr("repo_id", "1").
899900
Insert(map[string]string{
900901
"name": "trest3",
901902
})
@@ -917,6 +918,29 @@ func TestInsertWhere(t *testing.T) {
917918
})
918919
assert.NoError(t, err)
919920
assert.EqualValues(t, 1, inserted)
921+
922+
var j4 InsertWhere
923+
has, err = testEngine.ID(4).Get(&j4)
924+
assert.NoError(t, err)
925+
assert.True(t, has)
926+
assert.EqualValues(t, "10';delete * from insert_where; --", j4.Name)
927+
assert.EqualValues(t, 4, j4.Index)
928+
929+
inserted, err = testEngine.Table(new(InsertWhere)).Where("repo_id=?", 1).
930+
SetExpr("`index`", "coalesce(MAX(`index`),0)+1").
931+
Insert(map[string]interface{}{
932+
"repo_id": 1,
933+
"name": "10\\';delete * from insert_where; --",
934+
})
935+
assert.NoError(t, err)
936+
assert.EqualValues(t, 1, inserted)
937+
938+
var j5 InsertWhere
939+
has, err = testEngine.ID(5).Get(&j5)
940+
assert.NoError(t, err)
941+
assert.True(t, has)
942+
assert.EqualValues(t, "10\\';delete * from insert_where; --", j5.Name)
943+
assert.EqualValues(t, 5, j5.Index)
920944
}
921945

922946
type NightlyRate struct {

statement_args.go

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,34 @@ func quoteNeeded(a interface{}) bool {
4949
return true
5050
}
5151

52-
func convertArg(arg interface{}) string {
52+
func convertStringSingleQuote(arg string) string {
53+
return "'" + strings.Replace(arg, "'", "''", -1) + "'"
54+
}
55+
56+
func convertString(arg string) string {
57+
var buf strings.Builder
58+
buf.WriteRune('\'')
59+
for _, c := range arg {
60+
if c == '\\' || c == '\'' {
61+
buf.WriteRune('\\')
62+
}
63+
buf.WriteRune(c)
64+
}
65+
buf.WriteRune('\'')
66+
return buf.String()
67+
}
68+
69+
func convertArg(arg interface{}, convertFunc func(string) string) string {
5370
if quoteNeeded(arg) {
5471
argv := fmt.Sprintf("%v", arg)
55-
return "'" + strings.Replace(argv, "'", "''", -1) + "'"
72+
return convertFunc(argv)
5673
}
5774

5875
return fmt.Sprintf("%v", arg)
5976
}
6077

78+
const insertSelectPlaceHolder = true
79+
6180
func (statement *Statement) writeArg(w *builder.BytesWriter, arg interface{}) error {
6281
switch argv := arg.(type) {
6382
case bool:
@@ -93,8 +112,19 @@ func (statement *Statement) writeArg(w *builder.BytesWriter, arg interface{}) er
93112
return err
94113
}
95114
default:
96-
if _, err := w.WriteString(convertArg(arg)); err != nil {
97-
return err
115+
if insertSelectPlaceHolder {
116+
if err := w.WriteByte('?'); err != nil {
117+
return err
118+
}
119+
w.Append(arg)
120+
} else {
121+
var convertFunc = convertStringSingleQuote
122+
if statement.Engine.dialect.DBType() == core.MYSQL {
123+
convertFunc = convertString
124+
}
125+
if _, err := w.WriteString(convertArg(arg, convertFunc)); err != nil {
126+
return err
127+
}
98128
}
99129
}
100130
return nil

statement_exprparam.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func (exprs *exprParams) getByName(colName string) (exprParam, bool) {
5757
}
5858

5959
func (exprs *exprParams) writeArgs(w *builder.BytesWriter) error {
60-
for _, expr := range exprs.args {
60+
for i, expr := range exprs.args {
6161
switch arg := expr.(type) {
6262
case *builder.Builder:
6363
if _, err := w.WriteString("("); err != nil {
@@ -74,6 +74,11 @@ func (exprs *exprParams) writeArgs(w *builder.BytesWriter) error {
7474
return err
7575
}
7676
}
77+
if i != len(exprs.args)-1 {
78+
if _, err := w.WriteString(","); err != nil {
79+
return err
80+
}
81+
}
7782
}
7883
return nil
7984
}

0 commit comments

Comments
 (0)