Skip to content

Commit

Permalink
*: Support InsertStmt in new plan.
Browse files Browse the repository at this point in the history
  • Loading branch information
shenli committed Feb 16, 2016
1 parent 8c7d7d2 commit 5461e62
Show file tree
Hide file tree
Showing 16 changed files with 535 additions and 44 deletions.
2 changes: 1 addition & 1 deletion ast/dml.go
Original file line number Diff line number Diff line change
Expand Up @@ -605,7 +605,7 @@ const (
type InsertStmt struct {
dmlNode

Replace bool
IsReplace bool
Table *TableRefsClause
Columns []*ColumnName
Lists [][]ExprNode
Expand Down
4 changes: 2 additions & 2 deletions ast/expressions.go
Original file line number Diff line number Diff line change
Expand Up @@ -706,7 +706,7 @@ func (n *UnaryOperationExpr) Accept(v Visitor) (Node, bool) {
type ValuesExpr struct {
exprNode
// model.CIStr is column name.
Column *ColumnName
Column *ColumnNameExpr
}

// Accept implements Node Accept interface.
Expand All @@ -720,7 +720,7 @@ func (n *ValuesExpr) Accept(v Visitor) (Node, bool) {
if !ok {
return n, false
}
n.Column = node.(*ColumnName)
n.Column = node.(*ColumnNameExpr)
return v.Leave(n)
}

Expand Down
39 changes: 39 additions & 0 deletions executor/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package executor
import (
"math"

"github.com/juju/errors"
"github.com/pingcap/tidb/ast"
"github.com/pingcap/tidb/column"
"github.com/pingcap/tidb/context"
Expand Down Expand Up @@ -64,6 +65,8 @@ func (b *executorBuilder) build(p plan.Plan) Executor {
return b.buildHaving(v)
case *plan.IndexScan:
return b.buildIndexScan(v)
case *plan.Insert:
return b.buildInsert(v)
case *plan.JoinInner:
return b.buildJoinInner(v)
case *plan.JoinOuter:
Expand Down Expand Up @@ -333,3 +336,39 @@ func (b *executorBuilder) buildDelete(v *plan.Delete) Executor {
func (b *executorBuilder) buildSimple(v *plan.Simple) Executor {
return &SimpleExec{Statement: v.Statement, ctx: b.ctx}
}

func (b *executorBuilder) buildInsert(v *plan.Insert) Executor {
insert := &InsertExec{
ctx: b.ctx,
Columns: v.Columns,
Lists: v.Lists,
Setlist: v.Setlist,
OnDuplicate: v.OnDuplicate,
IsReplace: v.IsReplace,
Priority: v.Priority,
}
if v.SelectPlan != nil {
insert.SelectExec = b.build(v.SelectPlan)
}
// Get Table
ts, ok := v.Table.TableRefs.Left.(*ast.TableSource)
if !ok {
b.err = errors.New("Can not get table")
return nil
}
// fields is used to evaluate values expr.
insert.fields = ts.GetResultFields()
tn, ok := ts.Source.(*ast.TableName)
if !ok {
b.err = errors.New("Can not get table")
return nil
}
tableInfo := tn.TableInfo
tbl, ok := b.is.TableByID(tableInfo.ID)
if !ok {
b.err = errors.Errorf("Can not get table %d", tableInfo.ID)
return nil
}
insert.Table = tbl
return insert
}
2 changes: 1 addition & 1 deletion executor/converter/convert_expr.go
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ func (c *expressionConverter) unaryOperation(v *ast.UnaryOperationExpr) {
}

func (c *expressionConverter) values(v *ast.ValuesExpr) {
nameStr := joinColumnName(v.Column)
nameStr := joinColumnName(v.Column.Name)
c.exprMap[v] = &expression.Values{CIStr: model.NewCIStr(nameStr)}
}

Expand Down
2 changes: 1 addition & 1 deletion executor/converter/convert_stmt.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func convertInsert(converter *expressionConverter, v *ast.InsertStmt) (stmt.Stat
return nil, errors.Trace(err)
}
}
if v.Replace {
if v.IsReplace {
return &stmts.ReplaceIntoStmt{
InsertValues: insertValues,
Text: v.Text(),
Expand Down
Loading

0 comments on commit 5461e62

Please sign in to comment.