func checkEquivExpr(a, b parser.TypedExpr, sel *selectNode) error { // The expressions above only use the values 1 and 2. Verify that the // simplified expressions evaluate to the same value as the original // expression for interesting values. for _, v := range []parser.Datum{ parser.NewDInt(0), parser.NewDInt(1), parser.NewDInt(2), parser.NewDInt(3), parser.DNull, } { for i := range sel.curSourceRow { sel.curSourceRow[i] = v } ctx := &parser.EvalContext{} da, err := a.Eval(ctx) if err != nil { return fmt.Errorf("%s: %v", a, err) } db, err := b.Eval(ctx) if err != nil { return fmt.Errorf("%s: %v", b, err) } // This is tricky: we don't require the expressions to produce identical // results, but to either both return true or both return not true (either // false or NULL). if (da == parser.DBoolTrue) != (db == parser.DBoolTrue) { return fmt.Errorf("%s: %s: expected %s, but found %s", a, v, da, db) } } return nil }
// RunFilter runs a filter expression and returns whether the filter passes. func RunFilter(filter parser.TypedExpr, evalCtx *parser.EvalContext) (bool, error) { if filter == nil { return true, nil } d, err := filter.Eval(evalCtx) if err != nil { return false, err } return d != parser.DNull && bool(*d.(*parser.DBool)), nil }