func getPKValues(conditions []*sqlparser.ComparisonExpr, pkIndex *schema.Index) []interface{} { pkValues := make([]interface{}, len(pkIndex.Columns)) inClauseSeen := false for _, condition := range conditions { if condition.Operator == sqlparser.InStr { if inClauseSeen { return nil } inClauseSeen = true } index := pkIndex.FindColumn(condition.Left.(*sqlparser.ColName).Name.Original()) if index == -1 { return nil } if pkValues[index] != nil { return nil } var err error pkValues[index], err = sqlparser.AsInterface(condition.Right) if err != nil { return nil } } for _, v := range pkValues { if v == nil { return nil } } return pkValues }
func (node *Node) execAnalyzeUpdateExpressions(pkIndex *schema.Index) (pkValues []interface{}, ok bool) { for i := 0; i < node.Len(); i++ { columnName := string(node.At(i).At(0).Value) index := pkIndex.FindColumn(columnName) if index == -1 { continue } value := node.At(i).At(1).execAnalyzeValue() if value == nil { log.Warningf("expression is too complex %v", node.At(i).At(0)) return nil, false } if pkValues == nil { pkValues = make([]interface{}, len(pkIndex.Columns)) } pkValues[index] = asInterface(value) } return pkValues, true }
func analyzeUpdateExpressions(exprs sqlparser.UpdateExprs, pkIndex *schema.Index) (pkValues []interface{}, err error) { for _, expr := range exprs { index := pkIndex.FindColumn(expr.Name.Original()) if index == -1 { continue } if !sqlparser.IsValue(expr.Expr) { return nil, ErrTooComplex } if pkValues == nil { pkValues = make([]interface{}, len(pkIndex.Columns)) } var err error pkValues[index], err = sqlparser.AsInterface(expr.Expr) if err != nil { return nil, err } } return pkValues, nil }
func analyzeUpdateExpressions(exprs sqlparser.UpdateExprs, pkIndex *schema.Index) (pkValues []interface{}, err error) { for _, expr := range exprs { index := pkIndex.FindColumn(sqlparser.GetColName(expr.Name)) if index == -1 { continue } if !sqlparser.IsValue(expr.Expr) { log.Warningf("expression is too complex %v", expr) return nil, TooComplex } if pkValues == nil { pkValues = make([]interface{}, len(pkIndex.Columns)) } var err error pkValues[index], err = sqlparser.AsInterface(expr.Expr) if err != nil { return nil, err } } return pkValues, nil }