Hi there,

the attached trivial patch adds handling of RestrictInfo nodes into expression_tree_walker(). This is needed for example when calling pull_varnos or (or other functions using the expression walker) in clausesel.c, for example. An example of a query causing errors with pull_varnos is

select * from t where (a >= 10 and a <= 20) or (b >= 15 and b <= 20);

which gets translated into an expression tree like this:

    BoolExpr [OR_EXPR]
        BoolExpr [AND_EXPR]
            RestrictInfo
                OpExpr [Var >= Const]
            RestrictInfo
                OpExpr [Var <= Const]
        BoolExpr [AND_EXPR]
            RestrictInfo
                OpExpr [Var >= Const]
            RestrictInfo
                OpExpr [Var <= Const]

and the nested RestrictInfo nodes make the walker fail because of unrecognized node.

It's possible that expression walker is not supposed to know about RestrictInfo, but I don't really see why would that be the case.

regards

--
Tomas Vondra                  http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c
index d6f1f5b..843f06d 100644
--- a/src/backend/nodes/nodeFuncs.c
+++ b/src/backend/nodes/nodeFuncs.c
@@ -1933,6 +1933,8 @@ expression_tree_walker(Node *node,
 			return walker(((PlaceHolderInfo *) node)->ph_var, context);
 		case T_RangeTblFunction:
 			return walker(((RangeTblFunction *) node)->funcexpr, context);
+		case T_RestrictInfo:
+			return walker(((RestrictInfo *) node)->clause, context);
 		default:
 			elog(ERROR, "unrecognized node type: %d",
 				 (int) nodeTag(node));
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to