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)
}
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 {
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)
}
const insertSelectPlaceHolder = true
func (statement *Statement) writeArg(w *builder.BytesWriter, arg interface{}) error {
switch argv := arg.(type) {
case bool:
@ -110,12 +112,19 @@ func (statement *Statement) writeArg(w *builder.BytesWriter, arg interface{}) er
return err
}
default:
var convertFunc = convertStringSingleQuote
if statement.Engine.dialect.DBType() == core.MYSQL {
convertFunc = convertString
}
if _, err := w.WriteString(convertArg(arg, convertFunc)); err != nil {
return err
if insertSelectPlaceHolder {
if err := w.WriteByte('?'); err != nil {
return err
}
w.Append(arg)
} 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