use traditional positional parameters on insert into select

This commit is contained in:
Lunny Xiao 2019-09-28 16:18:22 +08:00
parent 1706dae164
commit ecda83fa14
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
2 changed files with 29 additions and 6 deletions

View File

@ -943,6 +943,20 @@ func TestInsertWhere(t *testing.T) {
assert.EqualValues(t, 5, j5.Index) assert.EqualValues(t, 5, j5.Index)
} }
func TestInsertSelectPositionalParameter(t *testing.T) {
assert.NoError(t, prepareEngine())
type InsertSelect struct {
Id int64
Name string
}
assertSync(t, new(InsertSelect))
_, err := testEngine.Exec("INSERT INTO insert_select (name) SELECT ?", "xlw")
assert.NoError(t, err)
}
type NightlyRate struct { type NightlyRate struct {
ID int64 `xorm:"'id' not null pk BIGINT(20)" json:"id"` ID int64 `xorm:"'id' not null pk BIGINT(20)" json:"id"`
} }

View File

@ -75,6 +75,8 @@ func convertArg(arg interface{}, convertFunc func(string) string) string {
return fmt.Sprintf("%v", arg) return fmt.Sprintf("%v", arg)
} }
const insertSelectPlaceHolder = true
func (statement *Statement) writeArg(w *builder.BytesWriter, arg interface{}) error { func (statement *Statement) writeArg(w *builder.BytesWriter, arg interface{}) error {
switch argv := arg.(type) { switch argv := arg.(type) {
case bool: case bool:
@ -110,12 +112,19 @@ func (statement *Statement) writeArg(w *builder.BytesWriter, arg interface{}) er
return err return err
} }
default: default:
var convertFunc = convertStringSingleQuote if insertSelectPlaceHolder {
if statement.Engine.dialect.DBType() == core.MYSQL { if err := w.WriteByte('?'); err != nil {
convertFunc = convertString return err
} }
if _, err := w.WriteString(convertArg(arg, convertFunc)); err != nil { w.Append(arg)
return err } else {
var convertFunc = convertStringSingleQuote
if statement.Engine.dialect.DBType() == core.MYSQL {
convertFunc = convertString
}
if _, err := w.WriteString(convertArg(arg, convertFunc)); err != nil {
return err
}
} }
} }
return nil return nil