1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-13 07:41:39 +03:00

Split QTW_EXAMINE_RTES flag into QTW_EXAMINE_RTES_BEFORE/_AFTER.

This change allows callers of query_tree_walker() to choose whether
to visit an RTE before or after visiting the contents of the RTE
(i.e., prefix or postfix tree order).  All existing users of
QTW_EXAMINE_RTES want the QTW_EXAMINE_RTES_BEFORE behavior, but
an upcoming patch will want QTW_EXAMINE_RTES_AFTER, and it seems
like a potentially useful change on its own.

Andreas Karlsson (extracted from CTE inlining patch)

Discussion: https://postgr.es/m/8810.1542402910@sss.pgh.pa.us
This commit is contained in:
Tom Lane
2019-01-25 17:09:45 -05:00
parent ff750ce2d8
commit 18c0da88a5
4 changed files with 21 additions and 10 deletions

View File

@ -2255,7 +2255,7 @@ expression_tree_walker(Node *node,
* Some callers want to suppress visitation of certain items in the sub-Query,
* typically because they need to process them specially, or don't actually
* want to recurse into subqueries. This is supported by the flags argument,
* which is the bitwise OR of flag values to suppress visitation of
* which is the bitwise OR of flag values to add or suppress visitation of
* indicated items. (More flag bits may be added as needed.)
*/
bool
@ -2314,8 +2314,12 @@ range_table_walker(List *rtable,
{
RangeTblEntry *rte = (RangeTblEntry *) lfirst(rt);
/* For historical reasons, visiting RTEs is not the default */
if (flags & QTW_EXAMINE_RTES)
/*
* Walkers might need to examine the RTE node itself either before or
* after visiting its contents (or, conceivably, both). Note that if
* you specify neither flag, the walker won't visit the RTE at all.
*/
if (flags & QTW_EXAMINE_RTES_BEFORE)
if (walker(rte, context))
return true;
@ -2355,6 +2359,10 @@ range_table_walker(List *rtable,
if (walker(rte->securityQuals, context))
return true;
if (flags & QTW_EXAMINE_RTES_AFTER)
if (walker(rte, context))
return true;
}
return false;
}