use traditional positional parameters on insert into select
This commit is contained in:
parent
1706dae164
commit
ecda83fa14
|
@ -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"`
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue