func checkEquivExpr(a, b parser.TypedExpr, 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. for _, v := range []parser.Datum{ parser.NewDInt(0), parser.NewDInt(1), parser.NewDInt(2), parser.NewDInt(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.DBoolTrue) != (db == parser.DBoolTrue) { return fmt.Errorf("%s: %s: expected %s, but found %s", a, v, da, db) } } return nil }
func sameTypeExprs(left, right parser.TypedExpr) bool { leftType := left.ReturnType() if leftType == parser.DNull { return true } rightType := right.ReturnType() if rightType == parser.DNull { return true } return leftType.TypeEqual(rightType) }
// 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 }