func analyzeBoolean(node sqlparser.BoolExpr) (conditions []sqlparser.BoolExpr) { switch node := node.(type) { case *sqlparser.AndExpr: left := analyzeBoolean(node.Left) right := analyzeBoolean(node.Right) if left == nil || right == nil { return nil } if sqlparser.HasINClause(left) && sqlparser.HasINClause(right) { return nil } return append(left, right...) case *sqlparser.ParenBoolExpr: return analyzeBoolean(node.Expr) case *sqlparser.ComparisonExpr: switch { case sqlparser.StringIn( node.Operator, sqlparser.AST_EQ, sqlparser.AST_LT, sqlparser.AST_GT, sqlparser.AST_LE, sqlparser.AST_GE, sqlparser.AST_NSE, sqlparser.AST_LIKE): if sqlparser.IsColName(node.Left) && sqlparser.IsValue(node.Right) { return []sqlparser.BoolExpr{node} } case node.Operator == sqlparser.AST_IN: if sqlparser.IsColName(node.Left) && sqlparser.IsSimpleTuple(node.Right) { return []sqlparser.BoolExpr{node} } } case *sqlparser.RangeCond: if node.Operator != sqlparser.AST_BETWEEN { return nil } if sqlparser.IsColName(node.Left) && sqlparser.IsValue(node.From) && sqlparser.IsValue(node.To) { return []sqlparser.BoolExpr{node} } } return nil }
func getMatch(node sqlparser.BoolExpr, col string) (planID PlanID, values interface{}) { switch node := node.(type) { case *sqlparser.AndExpr: if planID, values = getMatch(node.Left, col); planID != SelectScatter { return planID, values } if planID, values = getMatch(node.Right, col); planID != SelectScatter { return planID, values } case *sqlparser.ParenBoolExpr: return getMatch(node.Expr, col) case *sqlparser.ComparisonExpr: switch node.Operator { case "=": if !nameMatch(node.Left, col) { return SelectScatter, nil } if !sqlparser.IsValue(node.Right) { return SelectScatter, nil } val, err := asInterface(node.Right) if err != nil { return SelectScatter, nil } return SelectEqual, val case "in": if !nameMatch(node.Left, col) { return SelectScatter, nil } if !sqlparser.IsSimpleTuple(node.Right) { return SelectScatter, nil } val, err := asInterface(node.Right) if err != nil { return SelectScatter, nil } node.Right = sqlparser.ListArg("::_vals") return SelectIN, val } } return SelectScatter, nil }