fix setexpr missing big quotes (#1431)

* fix setexpr missing big quotes

* fix tests

* fix tests
This commit is contained in:
Lunny Xiao 2019-09-24 12:58:25 +08:00 committed by GitHub
parent 6d11913765
commit 2fbb9cd8de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 5 deletions

View File

@ -7,21 +7,38 @@ package xorm
import ( import (
"testing" "testing"
"xorm.io/core"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"xorm.io/builder"
"xorm.io/core"
) )
func TestSetExpr(t *testing.T) { func TestSetExpr(t *testing.T) {
assert.NoError(t, prepareEngine()) assert.NoError(t, prepareEngine())
type UserExprIssue struct {
Id int64
Title string
}
assert.NoError(t, testEngine.Sync2(new(UserExprIssue)))
var issue = UserExprIssue{
Title: "my issue",
}
cnt, err := testEngine.Insert(&issue)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
assert.EqualValues(t, 1, issue.Id)
type UserExpr struct { type UserExpr struct {
Id int64 Id int64
IssueId int64 `xorm:"index"`
Show bool Show bool
} }
assert.NoError(t, testEngine.Sync2(new(UserExpr))) assert.NoError(t, testEngine.Sync2(new(UserExpr)))
cnt, err := testEngine.Insert(&UserExpr{ cnt, err = testEngine.Insert(&UserExpr{
Show: true, Show: true,
}) })
assert.NoError(t, err) assert.NoError(t, err)
@ -34,6 +51,16 @@ func TestSetExpr(t *testing.T) {
cnt, err = testEngine.SetExpr("show", not+" `show`").ID(1).Update(new(UserExpr)) cnt, err = testEngine.SetExpr("show", not+" `show`").ID(1).Update(new(UserExpr))
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, cnt) assert.EqualValues(t, 1, cnt)
tableName := testEngine.TableName(new(UserExprIssue), true)
cnt, err = testEngine.SetExpr("issue_id",
builder.Select("id").
From(tableName).
Where(builder.Eq{"id": issue.Id})).
ID(1).
Update(new(UserExpr))
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
} }
func TestCols(t *testing.T) { func TestCols(t *testing.T) {

View File

@ -245,7 +245,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
if err != nil { if err != nil {
return 0, err return 0, err
} }
colNames = append(colNames, session.engine.Quote(colName)+" = "+subQuery) colNames = append(colNames, session.engine.Quote(colName)+" = ("+subQuery+")")
args = append(args, subArgs...) args = append(args, subArgs...)
} }
} }

View File

@ -17,9 +17,15 @@ func writeArg(w *builder.BytesWriter, arg interface{}) error {
return err return err
} }
case *builder.Builder: case *builder.Builder:
if _, err := w.WriteString("("); err != nil {
return err
}
if err := argv.WriteTo(w); err != nil { if err := argv.WriteTo(w); err != nil {
return err return err
} }
if _, err := w.WriteString(")"); err != nil {
return err
}
default: default:
if _, err := w.WriteString(fmt.Sprintf("%v", argv)); err != nil { if _, err := w.WriteString(fmt.Sprintf("%v", argv)); err != nil {
return err return err

View File

@ -60,9 +60,15 @@ func (exprs *exprParams) writeArgs(w *builder.BytesWriter) error {
for _, expr := range exprs.args { for _, expr := range exprs.args {
switch arg := expr.(type) { switch arg := expr.(type) {
case *builder.Builder: case *builder.Builder:
if _, err := w.WriteString("("); err != nil {
return err
}
if err := arg.WriteTo(w); err != nil { if err := arg.WriteTo(w); err != nil {
return err return err
} }
if _, err := w.WriteString(")"); err != nil {
return err
}
default: default:
if _, err := w.WriteString(fmt.Sprintf("%v", arg)); err != nil { if _, err := w.WriteString(fmt.Sprintf("%v", arg)); err != nil {
return err return err
@ -83,9 +89,15 @@ func (exprs *exprParams) writeNameArgs(w *builder.BytesWriter) error {
switch arg := exprs.args[i].(type) { switch arg := exprs.args[i].(type) {
case *builder.Builder: case *builder.Builder:
if _, err := w.WriteString("("); err != nil {
return err
}
if err := arg.WriteTo(w); err != nil { if err := arg.WriteTo(w); err != nil {
return err return err
} }
if _, err := w.WriteString("("); err != nil {
return err
}
default: default:
w.Append(exprs.args[i]) w.Append(exprs.args[i])
} }