Fix insert where with bool bug on mssql #1432

Merged
lunny merged 1 commits from lunny/fix_mssql into master 2019-09-24 08:05:35 +00:00
4 changed files with 31 additions and 7 deletions

View File

@ -382,7 +382,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) {
return 0, err
}
if err := writeArgs(buf, args); err != nil {
if err := session.statement.writeArgs(buf, args); err != nil {
return 0, err
}
@ -739,7 +739,7 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err
return 0, err
}
if err := writeArgs(w, args); err != nil {
if err := session.statement.writeArgs(w, args); err != nil {
return 0, err
}
@ -825,7 +825,7 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) {
return 0, err
}
if err := writeArgs(w, args); err != nil {
if err := session.statement.writeArgs(w, args); err != nil {
return 0, err
}

View File

@ -846,6 +846,7 @@ func TestInsertWhere(t *testing.T) {
Width uint32
Height uint32
Name string
IsTrue bool
}
assert.NoError(t, prepareEngine())

View File

@ -8,14 +8,37 @@ import (
"fmt"
"xorm.io/builder"
"xorm.io/core"
)
func writeArg(w *builder.BytesWriter, arg interface{}) error {
func (statement *Statement) writeArg(w *builder.BytesWriter, arg interface{}) error {
switch argv := arg.(type) {
case string:
if _, err := w.WriteString("'" + argv + "'"); err != nil {
return err
}
case bool:
if statement.Engine.dialect.DBType() == core.MSSQL {
if argv {
if _, err := w.WriteString("1"); err != nil {
return err
}
} else {
if _, err := w.WriteString("0"); err != nil {
return err
}
}
} else {
if argv {
if _, err := w.WriteString("true"); err != nil {
return err
}
} else {
if _, err := w.WriteString("false"); err != nil {
return err
}
}
}
case *builder.Builder:
if _, err := w.WriteString("("); err != nil {
return err
@ -34,9 +57,9 @@ func writeArg(w *builder.BytesWriter, arg interface{}) error {
return nil
}
func writeArgs(w *builder.BytesWriter, args []interface{}) error {
func (statement *Statement) writeArgs(w *builder.BytesWriter, args []interface{}) error {
for i, arg := range args {
if err := writeArg(w, arg); err != nil {
if err := statement.writeArg(w, arg); err != nil {
return err
}

View File

@ -1 +1 @@
go test -db=mssql -conn_str="server=localhost;user id=sa;password=yourStrong(!)Password;database=xorm_test"
go test -db=mssql -conn_str="server=localhost;user id=sa;password=MwantsaSecurePassword1;database=xorm_test"