*** a/src/backend/nodes/makefuncs.c
--- b/src/backend/nodes/makefuncs.c
***************
*** 262,267 **** makeRelabelType(Expr *arg, Oid rtype, int32 rtypmod, CoercionForm rformat)
--- 262,281 ----
  }
  
  /*
+  * makeRangeTblEntry
+  *	  creates a RangeTblEntry node
+  */
+ RangeTblEntry *
+ makeRangeTblEntry(RTEKind rtekind)
+ {
+ 	RangeTblEntry  *r = makeNode(RangeTblEntry);
+ 
+ 	r->rtekind = rtekind;
+ 
+ 	return r;
+ }
+ 
+ /*
   * makeRangeVar -
   *	  creates a RangeVar node (rather oversimplified case)
   */
*** a/src/backend/parser/parse_relation.c
--- b/src/backend/parser/parse_relation.c
***************
*** 877,888 **** addRangeTableEntry(ParseState *pstate,
  				   bool inh,
  				   bool inFromCl)
  {
! 	RangeTblEntry *rte = makeNode(RangeTblEntry);
  	char	   *refname = alias ? alias->aliasname : relation->relname;
  	LOCKMODE	lockmode;
  	Relation	rel;
  
- 	rte->rtekind = RTE_RELATION;
  	rte->alias = alias;
  
  	/*
--- 877,887 ----
  				   bool inh,
  				   bool inFromCl)
  {
! 	RangeTblEntry *rte = makeRangeTblEntry(RTE_RELATION);
  	char	   *refname = alias ? alias->aliasname : relation->relname;
  	LOCKMODE	lockmode;
  	Relation	rel;
  
  	rte->alias = alias;
  
  	/*
***************
*** 950,959 **** addRangeTableEntryForRelation(ParseState *pstate,
  							  bool inh,
  							  bool inFromCl)
  {
! 	RangeTblEntry *rte = makeNode(RangeTblEntry);
  	char	   *refname = alias ? alias->aliasname : RelationGetRelationName(rel);
  
- 	rte->rtekind = RTE_RELATION;
  	rte->alias = alias;
  	rte->relid = RelationGetRelid(rel);
  
--- 949,957 ----
  							  bool inh,
  							  bool inFromCl)
  {
! 	RangeTblEntry *rte = makeRangeTblEntry(RTE_RELATION);
  	char	   *refname = alias ? alias->aliasname : RelationGetRelationName(rel);
  
  	rte->alias = alias;
  	rte->relid = RelationGetRelid(rel);
  
***************
*** 1004,1017 **** addRangeTableEntryForSubquery(ParseState *pstate,
  							  Alias *alias,
  							  bool inFromCl)
  {
! 	RangeTblEntry *rte = makeNode(RangeTblEntry);
  	char	   *refname = alias->aliasname;
  	Alias	   *eref;
  	int			numaliases;
  	int			varattno;
  	ListCell   *tlistitem;
  
- 	rte->rtekind = RTE_SUBQUERY;
  	rte->relid = InvalidOid;
  	rte->subquery = subquery;
  	rte->alias = alias;
--- 1002,1014 ----
  							  Alias *alias,
  							  bool inFromCl)
  {
! 	RangeTblEntry *rte = makeRangeTblEntry(RTE_SUBQUERY);
  	char	   *refname = alias->aliasname;
  	Alias	   *eref;
  	int			numaliases;
  	int			varattno;
  	ListCell   *tlistitem;
  
  	rte->relid = InvalidOid;
  	rte->subquery = subquery;
  	rte->alias = alias;
***************
*** 1084,1090 **** addRangeTableEntryForFunction(ParseState *pstate,
  							  RangeFunction *rangefunc,
  							  bool inFromCl)
  {
! 	RangeTblEntry *rte = makeNode(RangeTblEntry);
  	TypeFuncClass functypclass;
  	Oid			funcrettype;
  	TupleDesc	tupdesc;
--- 1081,1087 ----
  							  RangeFunction *rangefunc,
  							  bool inFromCl)
  {
! 	RangeTblEntry *rte = makeRangeTblEntry(RTE_FUNCTION);
  	TypeFuncClass functypclass;
  	Oid			funcrettype;
  	TupleDesc	tupdesc;
***************
*** 1092,1098 **** addRangeTableEntryForFunction(ParseState *pstate,
  	List	   *coldeflist = rangefunc->coldeflist;
  	Alias	   *eref;
  
- 	rte->rtekind = RTE_FUNCTION;
  	rte->relid = InvalidOid;
  	rte->subquery = NULL;
  	rte->funcexpr = funcexpr;
--- 1089,1094 ----
***************
*** 1217,1229 **** addRangeTableEntryForValues(ParseState *pstate,
  							Alias *alias,
  							bool inFromCl)
  {
! 	RangeTblEntry *rte = makeNode(RangeTblEntry);
  	char	   *refname = alias ? alias->aliasname : pstrdup("*VALUES*");
  	Alias	   *eref;
  	int			numaliases;
  	int			numcolumns;
  
- 	rte->rtekind = RTE_VALUES;
  	rte->relid = InvalidOid;
  	rte->subquery = NULL;
  	rte->values_lists = exprs;
--- 1213,1224 ----
  							Alias *alias,
  							bool inFromCl)
  {
! 	RangeTblEntry *rte = makeRangeTblEntry(RTE_VALUES);
  	char	   *refname = alias ? alias->aliasname : pstrdup("*VALUES*");
  	Alias	   *eref;
  	int			numaliases;
  	int			numcolumns;
  
  	rte->relid = InvalidOid;
  	rte->subquery = NULL;
  	rte->values_lists = exprs;
***************
*** 1291,1297 **** addRangeTableEntryForJoin(ParseState *pstate,
  						  Alias *alias,
  						  bool inFromCl)
  {
! 	RangeTblEntry *rte = makeNode(RangeTblEntry);
  	Alias	   *eref;
  	int			numaliases;
  
--- 1286,1292 ----
  						  Alias *alias,
  						  bool inFromCl)
  {
! 	RangeTblEntry *rte = makeRangeTblEntry(RTE_JOIN);
  	Alias	   *eref;
  	int			numaliases;
  
***************
*** 1305,1311 **** addRangeTableEntryForJoin(ParseState *pstate,
  				 errmsg("joins can have at most %d columns",
  						MaxAttrNumber)));
  
- 	rte->rtekind = RTE_JOIN;
  	rte->relid = InvalidOid;
  	rte->subquery = NULL;
  	rte->jointype = jointype;
--- 1300,1305 ----
***************
*** 1361,1374 **** addRangeTableEntryForCTE(ParseState *pstate,
  						 Alias *alias,
  						 bool inFromCl)
  {
! 	RangeTblEntry *rte = makeNode(RangeTblEntry);
  	char	   *refname = alias ? alias->aliasname : cte->ctename;
  	Alias	   *eref;
  	int			numaliases;
  	int			varattno;
  	ListCell   *lc;
  
- 	rte->rtekind = RTE_CTE;
  	rte->ctename = cte->ctename;
  	rte->ctelevelsup = levelsup;
  
--- 1355,1367 ----
  						 Alias *alias,
  						 bool inFromCl)
  {
! 	RangeTblEntry *rte = makeRangeTblEntry(RTE_CTE);
  	char	   *refname = alias ? alias->aliasname : cte->ctename;
  	Alias	   *eref;
  	int			numaliases;
  	int			varattno;
  	ListCell   *lc;
  
  	rte->ctename = cte->ctename;
  	rte->ctelevelsup = levelsup;
  
*** a/src/include/nodes/makefuncs.h
--- b/src/include/nodes/makefuncs.h
***************
*** 56,61 **** extern Alias *makeAlias(const char *aliasname, List *colnames);
--- 56,62 ----
  extern RelabelType *makeRelabelType(Expr *arg, Oid rtype, int32 rtypmod,
  				CoercionForm rformat);
  
+ extern RangeTblEntry *makeRangeTblEntry(RTEKind rtekind);
  extern RangeVar *makeRangeVar(char *schemaname, char *relname, int location);
  
  extern TypeName *makeTypeName(char *typnam);
