From ecda83fa14e943558d746f27086e056fdfc733cb Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 28 Sep 2019 16:18:22 +0800 Subject: [PATCH] use traditional positional parameters on insert into select --- session_insert_test.go | 14 ++++++++++++++ statement_args.go | 21 +++++++++++++++------ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/session_insert_test.go b/session_insert_test.go index 2785401d..fd74db75 100644 --- a/session_insert_test.go +++ b/session_insert_test.go @@ -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"` } diff --git a/statement_args.go b/statement_args.go index 7a7e3a6d..310f24d6 100644 --- a/statement_args.go +++ b/statement_args.go @@ -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