mirror of
https://github.com/postgres/postgres.git
synced 2025-11-06 07:49:08 +03:00
Teach query_tree_walker, query_tree_mutator, and SS_finalize_plan to
process function RTE expressions, which they were previously missing. This allows outer-Var references and subselects to work correctly in the arguments of a function RTE. Install check to prevent function RTEs from cross-referencing Vars of sibling FROM-items, which doesn't make any sense (if you want to join, write a JOIN or WHERE clause).
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.99 2002/05/12 23:43:03 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.100 2002/05/18 18:49:41 tgl Exp $
|
||||
*
|
||||
* HISTORY
|
||||
* AUTHOR DATE MAJOR EVENT
|
||||
@@ -1915,7 +1915,6 @@ query_tree_walker(Query *query,
|
||||
{
|
||||
case RTE_RELATION:
|
||||
case RTE_SPECIAL:
|
||||
case RTE_FUNCTION:
|
||||
/* nothing to do */
|
||||
break;
|
||||
case RTE_SUBQUERY:
|
||||
@@ -1927,6 +1926,10 @@ query_tree_walker(Query *query,
|
||||
if (walker(rte->joinaliasvars, context))
|
||||
return true;
|
||||
break;
|
||||
case RTE_FUNCTION:
|
||||
if (walker(rte->funcexpr, context))
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
@@ -2293,7 +2296,6 @@ query_tree_mutator(Query *query,
|
||||
{
|
||||
case RTE_RELATION:
|
||||
case RTE_SPECIAL:
|
||||
case RTE_FUNCTION:
|
||||
/* nothing to do, don't bother to make a copy */
|
||||
break;
|
||||
case RTE_SUBQUERY:
|
||||
@@ -2310,6 +2312,11 @@ query_tree_mutator(Query *query,
|
||||
MUTATE(newrte->joinaliasvars, rte->joinaliasvars, List *);
|
||||
rte = newrte;
|
||||
break;
|
||||
case RTE_FUNCTION:
|
||||
FLATCOPY(newrte, rte, RangeTblEntry);
|
||||
MUTATE(newrte->funcexpr, rte->funcexpr, Node *);
|
||||
rte = newrte;
|
||||
break;
|
||||
}
|
||||
newrt = lappend(newrt, rte);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user