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:
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user