func checkEquivExpr(a, b parser.Expr, qvals qvalMap) 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. zero := parser.DInt(0) for _, v := range []parser.Datum{zero, zero + 1, zero + 2, zero + 3, parser.DNull} { for _, q := range qvals { q.datum = v } da, err := a.Eval(parser.EvalContext{}) if err != nil { return fmt.Errorf("%s: %v", a, err) } db, err := b.Eval(parser.EvalContext{}) 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.DBool(true)) != (db == parser.DBool(true)) { return fmt.Errorf("%s: %s: expected %s, but found %s", a, v, da, db) } } return nil }
// runFilter runs a filter expression and returs whether the filter passes. func runFilter(filter parser.Expr, 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 }