func (e *Evaluator) patternIn(n *ast.PatternInExpr) bool { lhs := n.Expr.GetValue() if types.IsNil(lhs) { n.SetValue(nil) return true } hasNull := false for _, v := range n.List { if types.IsNil(v.GetValue()) { hasNull = true continue } r, err := types.Compare(n.Expr.GetValue(), v.GetValue()) if err != nil { e.err = errors.Trace(err) return false } if r == 0 { n.SetValue(boolToInt64(!n.Not)) return true } } if hasNull { // if no matched but we got null in In, return null // e.g 1 in (null, 2, 3) returns null n.SetValue(nil) return true } n.SetValue(boolToInt64(n.Not)) return true }
func (e *Evaluator) patternIn(n *ast.PatternInExpr) bool { lhs := n.Expr.GetValue() if types.IsNil(lhs) { n.SetValue(nil) return true } if n.Sel == nil { values := make([]interface{}, 0, len(n.List)) for _, ei := range n.List { values = append(values, ei.GetValue()) } x := e.checkInList(n.Not, lhs, values) if e.err != nil { return false } n.SetValue(x) return true } se := n.Sel.(*ast.SubqueryExpr) sel := se.SubqueryExec res := sel.GetValue().([]interface{}) x := e.checkInList(n.Not, lhs, res) if e.err != nil { return false } n.SetValue(x) return true }