From bc93ac12c2544b6b3a68b6cb0282e0828fa14a34 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 11 Mar 2015 15:26:43 -0400 Subject: [PATCH] Require non-NULL pstate for all addRangeTableEntryFor* functions. Per discussion, it's better to have a consistent coding rule here. Michael Paquier, per a node from Greg Stark referencing an old post from Tom Lane. --- src/backend/commands/view.c | 8 +++++-- src/backend/optimizer/plan/subselect.c | 6 +++++- src/backend/parser/parse_relation.c | 30 +++++++++++++++----------- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/backend/commands/view.c b/src/backend/commands/view.c index 6f2a749756..efa4be1732 100644 --- a/src/backend/commands/view.c +++ b/src/backend/commands/view.c @@ -345,6 +345,7 @@ UpdateRangeTableOfViewParse(Oid viewOid, Query *viewParse) List *new_rt; RangeTblEntry *rt_entry1, *rt_entry2; + ParseState *pstate; /* * Make a copy of the given parsetree. It's not so much that we don't @@ -356,6 +357,9 @@ UpdateRangeTableOfViewParse(Oid viewOid, Query *viewParse) */ viewParse = (Query *) copyObject(viewParse); + /* Create a dummy ParseState for addRangeTableEntryForRelation */ + pstate = make_parsestate(NULL); + /* need to open the rel for addRangeTableEntryForRelation */ viewRel = relation_open(viewOid, AccessShareLock); @@ -363,10 +367,10 @@ UpdateRangeTableOfViewParse(Oid viewOid, Query *viewParse) * Create the 2 new range table entries and form the new range table... * OLD first, then NEW.... */ - rt_entry1 = addRangeTableEntryForRelation(NULL, viewRel, + rt_entry1 = addRangeTableEntryForRelation(pstate, viewRel, makeAlias("old", NIL), false, false); - rt_entry2 = addRangeTableEntryForRelation(NULL, viewRel, + rt_entry2 = addRangeTableEntryForRelation(pstate, viewRel, makeAlias("new", NIL), false, false); /* Must override addRangeTableEntry's default access-check flags */ diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index 5a1d539e8d..acfd0bcfbe 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -1233,6 +1233,7 @@ convert_ANY_sublink_to_join(PlannerInfo *root, SubLink *sublink, RangeTblRef *rtr; List *subquery_vars; Node *quals; + ParseState *pstate; Assert(sublink->subLinkType == ANY_SUBLINK); @@ -1264,6 +1265,9 @@ convert_ANY_sublink_to_join(PlannerInfo *root, SubLink *sublink, if (contain_volatile_functions(sublink->testexpr)) return NULL; + /* Create a dummy ParseState for addRangeTableEntryForSubquery */ + pstate = make_parsestate(NULL); + /* * Okay, pull up the sub-select into upper range table. * @@ -1272,7 +1276,7 @@ convert_ANY_sublink_to_join(PlannerInfo *root, SubLink *sublink, * below). Therefore this is a lot easier than what pull_up_subqueries has * to go through. */ - rte = addRangeTableEntryForSubquery(NULL, + rte = addRangeTableEntryForSubquery(pstate, subselect, makeAlias("ANY_subquery", NIL), false, diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 80daeb9dc4..ca560ccee1 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -1245,6 +1245,8 @@ addRangeTableEntryForRelation(ParseState *pstate, RangeTblEntry *rte = makeNode(RangeTblEntry); char *refname = alias ? alias->aliasname : RelationGetRelationName(rel); + Assert(pstate != NULL); + rte->rtekind = RTE_RELATION; rte->alias = alias; rte->relid = RelationGetRelid(rel); @@ -1276,8 +1278,7 @@ addRangeTableEntryForRelation(ParseState *pstate, * Add completed RTE to pstate's range table list, but not to join list * nor namespace --- caller must do that if appropriate. */ - if (pstate != NULL) - pstate->p_rtable = lappend(pstate->p_rtable, rte); + pstate->p_rtable = lappend(pstate->p_rtable, rte); return rte; } @@ -1302,6 +1303,8 @@ addRangeTableEntryForSubquery(ParseState *pstate, int varattno; ListCell *tlistitem; + Assert(pstate != NULL); + rte->rtekind = RTE_SUBQUERY; rte->relid = InvalidOid; rte->subquery = subquery; @@ -1354,8 +1357,7 @@ addRangeTableEntryForSubquery(ParseState *pstate, * Add completed RTE to pstate's range table list, but not to join list * nor namespace --- caller must do that if appropriate. */ - if (pstate != NULL) - pstate->p_rtable = lappend(pstate->p_rtable, rte); + pstate->p_rtable = lappend(pstate->p_rtable, rte); return rte; } @@ -1391,6 +1393,8 @@ addRangeTableEntryForFunction(ParseState *pstate, int natts, totalatts; + Assert(pstate != NULL); + rte->rtekind = RTE_FUNCTION; rte->relid = InvalidOid; rte->subquery = NULL; @@ -1608,8 +1612,7 @@ addRangeTableEntryForFunction(ParseState *pstate, * Add completed RTE to pstate's range table list, but not to join list * nor namespace --- caller must do that if appropriate. */ - if (pstate != NULL) - pstate->p_rtable = lappend(pstate->p_rtable, rte); + pstate->p_rtable = lappend(pstate->p_rtable, rte); return rte; } @@ -1633,6 +1636,8 @@ addRangeTableEntryForValues(ParseState *pstate, int numaliases; int numcolumns; + Assert(pstate != NULL); + rte->rtekind = RTE_VALUES; rte->relid = InvalidOid; rte->subquery = NULL; @@ -1680,8 +1685,7 @@ addRangeTableEntryForValues(ParseState *pstate, * Add completed RTE to pstate's range table list, but not to join list * nor namespace --- caller must do that if appropriate. */ - if (pstate != NULL) - pstate->p_rtable = lappend(pstate->p_rtable, rte); + pstate->p_rtable = lappend(pstate->p_rtable, rte); return rte; } @@ -1703,6 +1707,8 @@ addRangeTableEntryForJoin(ParseState *pstate, Alias *eref; int numaliases; + Assert(pstate != NULL); + /* * Fail if join has too many columns --- we must be able to reference any * of the columns with an AttrNumber. @@ -1748,8 +1754,7 @@ addRangeTableEntryForJoin(ParseState *pstate, * Add completed RTE to pstate's range table list, but not to join list * nor namespace --- caller must do that if appropriate. */ - if (pstate != NULL) - pstate->p_rtable = lappend(pstate->p_rtable, rte); + pstate->p_rtable = lappend(pstate->p_rtable, rte); return rte; } @@ -1774,6 +1779,8 @@ addRangeTableEntryForCTE(ParseState *pstate, int varattno; ListCell *lc; + Assert(pstate != NULL); + rte->rtekind = RTE_CTE; rte->ctename = cte->ctename; rte->ctelevelsup = levelsup; @@ -1848,8 +1855,7 @@ addRangeTableEntryForCTE(ParseState *pstate, * Add completed RTE to pstate's range table list, but not to join list * nor namespace --- caller must do that if appropriate. */ - if (pstate != NULL) - pstate->p_rtable = lappend(pstate->p_rtable, rte); + pstate->p_rtable = lappend(pstate->p_rtable, rte); return rte; }