diff --git a/parser/parser.y b/parser/parser.y index 0027cadc05..76acd83168 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -746,23 +746,23 @@ Assignment: if err != nil { yylex.(*lexer).errf("Parse Assignment error: %s", $1.(string)) } - $$ = *x + $$ = x } AssignmentList: Assignment { - $$ = []expression.Assignment{$1.(expression.Assignment)} + $$ = []*expression.Assignment{$1.(*expression.Assignment)} } | AssignmentList ',' Assignment { - $$ = append($1.([]expression.Assignment), $3.(expression.Assignment)) + $$ = append($1.([]*expression.Assignment), $3.(*expression.Assignment)) } AssignmentListOpt: /* EMPTY */ { - $$ = []expression.Assignment{} + $$ = []*expression.Assignment{} } | AssignmentList @@ -1727,7 +1727,7 @@ InsertIntoStmt: x.Priority = $2.(int) x.TableIdent = $5.(table.Ident) if $7 != nil { - x.OnDuplicate = $7.([]expression.Assignment) + x.OnDuplicate = $7.([]*expression.Assignment) } $$ = x if yylex.(*lexer).root { @@ -4306,7 +4306,7 @@ UpdateStmt: st := &stmts.UpdateStmt{ LowPriority: $2.(bool), TableRefs: r, - List: $6.([]expression.Assignment), + List: $6.([]*expression.Assignment), } if $7 != nil { st.Where = $7.(expression.Expression) @@ -4328,7 +4328,7 @@ UpdateStmt: st := &stmts.UpdateStmt{ LowPriority: $2.(bool), TableRefs: $4.(*rsets.JoinRset), - List: $6.([]expression.Assignment), + List: $6.([]*expression.Assignment), MultipleTable: true, } if $7 != nil { diff --git a/stmt/stmts/insert.go b/stmt/stmts/insert.go index d9096fa372..c32c7fbdcf 100644 --- a/stmt/stmts/insert.go +++ b/stmt/stmts/insert.go @@ -60,7 +60,7 @@ type InsertValues struct { // See: https://dev.mysql.com/doc/refman/5.7/en/insert.html type InsertIntoStmt struct { InsertValues - OnDuplicate []expression.Assignment + OnDuplicate []*expression.Assignment Text string } @@ -335,7 +335,7 @@ func (s *InsertValues) getRow(ctx context.Context, t table.Table, cols []*column return r, nil } -func execOnDuplicateUpdate(ctx context.Context, t table.Table, row []interface{}, h int64, cols map[int]expression.Assignment) error { +func execOnDuplicateUpdate(ctx context.Context, t table.Table, row []interface{}, h int64, cols map[int]*expression.Assignment) error { // On duplicate key update the duplicate row. // Evaluate the updated value. // TODO: report rows affected and last insert id. @@ -360,8 +360,8 @@ func execOnDuplicateUpdate(ctx context.Context, t table.Table, row []interface{} return nil } -func getOnDuplicateUpdateColumns(assignList []expression.Assignment, t table.Table) (map[int]expression.Assignment, error) { - m := make(map[int]expression.Assignment, len(assignList)) +func getOnDuplicateUpdateColumns(assignList []*expression.Assignment, t table.Table) (map[int]*expression.Assignment, error) { + m := make(map[int]*expression.Assignment, len(assignList)) for _, v := range assignList { c, err := findColumnByName(t, field.JoinQualifiedName("", v.TableName, v.ColName)) diff --git a/stmt/stmts/update.go b/stmt/stmts/update.go index abfd0544e4..56e92484f3 100644 --- a/stmt/stmts/update.go +++ b/stmt/stmts/update.go @@ -44,7 +44,7 @@ var _ stmt.Statement = (*UpdateStmt)(nil) // See: https://dev.mysql.com/doc/refman/5.7/en/update.html type UpdateStmt struct { TableRefs *rsets.JoinRset - List []expression.Assignment + List []*expression.Assignment Where expression.Expression Order *rsets.OrderByRset Limit *rsets.LimitRset @@ -96,8 +96,8 @@ func findColumnByName(t table.Table, name string) (*column.Col, error) { return c, nil } -func getUpdateColumns(assignList []expression.Assignment, fields []*field.ResultField) (map[int]expression.Assignment, error) { - m := make(map[int]expression.Assignment, len(assignList)) +func getUpdateColumns(assignList []*expression.Assignment, fields []*field.ResultField) (map[int]*expression.Assignment, error) { + m := make(map[int]*expression.Assignment, len(assignList)) for _, v := range assignList { name := v.ColName @@ -119,7 +119,7 @@ func getUpdateColumns(assignList []expression.Assignment, fields []*field.Result } func updateRecord(ctx context.Context, h int64, data []interface{}, t table.Table, - updateColumns map[int]expression.Assignment, m map[interface{}]interface{}, + updateColumns map[int]*expression.Assignment, m map[interface{}]interface{}, offset int, onDuplicateUpdate bool) error { if err := t.LockRow(ctx, h, true); err != nil { return errors.Trace(err)