func buildIndexPlan(ins *sqlparser.Insert, tablename string, colVindex *ColVindex, plan *Plan) error { pos := -1 for i, column := range ins.Columns { if colVindex.Col == sqlparser.GetColName(column.(*sqlparser.NonStarExpr).Expr) { pos = i break } } if pos == -1 { pos = len(ins.Columns) ins.Columns = append(ins.Columns, &sqlparser.NonStarExpr{Expr: &sqlparser.ColName{Name: []byte(colVindex.Col)}}) ins.Rows.(sqlparser.Values)[0] = append(ins.Rows.(sqlparser.Values)[0].(sqlparser.ValTuple), &sqlparser.NullVal{}) } row := ins.Rows.(sqlparser.Values)[0].(sqlparser.ValTuple) val, err := asInterface(row[pos]) if err != nil { return fmt.Errorf("could not convert val: %s, pos: %d", row[pos], pos) } plan.Values = append(plan.Values.([]interface{}), val) row[pos] = sqlparser.ValArg([]byte(fmt.Sprintf(":_%s", colVindex.Col))) return nil }
// license that can be found in the LICENSE file. package planbuilder import ( "errors" "fmt" log "github.com/golang/glog" "github.com/henryanand/vitess/go/vt/schema" "github.com/henryanand/vitess/go/vt/sqlparser" ) var ( TooComplex = errors.New("Complex") execLimit = &sqlparser.Limit{Rowcount: sqlparser.ValArg(":#maxLimit")} ) // ExecPlan is built for selects and DMLs. // PK Values values within ExecPlan can be: // sqltypes.Value: sourced form the query, or // string: bind variable name starting with ':', or // nil if no value was specified type ExecPlan struct { PlanId PlanType Reason ReasonType TableName string // FieldQuery is used to fetch field info FieldQuery *sqlparser.ParsedQuery