From e64bb65aff3f53b4f56b4a1ee549930b568cec99 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 6 Oct 2008 15:15:22 +0000 Subject: Fix GetCTEForRTE() to deal with the possibility that the RTE it's given came from a query level above the current ParseState. --- src/backend/parser/parse_target.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'src/backend/parser/parse_target.c') diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index ed54abe7039..d83caab7e8c 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.166 2008/10/05 22:20:16 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_target.c,v 1.167 2008/10/06 15:15:22 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -308,7 +308,7 @@ markTargetListOrigin(ParseState *pstate, TargetEntry *tle, */ if (attnum != InvalidAttrNumber && !rte->self_reference) { - CommonTableExpr *cte = GetCTEForRTE(pstate, rte); + CommonTableExpr *cte = GetCTEForRTE(pstate, rte, netlevelsup); TargetEntry *ste; /* should be analyzed by now */ @@ -1206,7 +1206,7 @@ expandRecordVariable(ParseState *pstate, Var *var, int levelsup) /* CTE reference: examine subquery's output expr */ if (!rte->self_reference) { - CommonTableExpr *cte = GetCTEForRTE(pstate, rte); + CommonTableExpr *cte = GetCTEForRTE(pstate, rte, netlevelsup); TargetEntry *ste; /* should be analyzed by now */ @@ -1230,7 +1230,9 @@ expandRecordVariable(ParseState *pstate, Var *var, int levelsup) MemSet(&mypstate, 0, sizeof(mypstate)); /* this loop must work, since GetCTEForRTE did */ - for (levelsup = 0; levelsup < rte->ctelevelsup; levelsup++) + for (levelsup = 0; + levelsup < rte->ctelevelsup + netlevelsup; + levelsup++) pstate = pstate->parentParseState; mypstate.parentParseState = pstate; mypstate.p_rtable = ((Query *) cte->ctequery)->rtable; -- cgit v1.2.3