diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c
index 887e5ce82a0b9011627450fdd1046d5529beb110..8f0b5979ba589a1e3aa10405671d4c0793361c5e 100644
*** a/src/backend/executor/execQual.c
--- b/src/backend/executor/execQual.c
*************** ExecInitExpr(Expr *node, PlanState *pare
*** 4627,4633 ****
  				if (rowexpr->row_typeid == RECORDOID)
  				{
  					/* generic record, use runtime type assignment */
! 					rstate->tupdesc = ExecTypeFromExprList(rowexpr->args);
  					BlessTupleDesc(rstate->tupdesc);
  					/* we won't need to redo this at runtime */
  				}
--- 4627,4634 ----
  				if (rowexpr->row_typeid == RECORDOID)
  				{
  					/* generic record, use runtime type assignment */
! 					rstate->tupdesc = ExecTypeFromExprList(rowexpr->args,
! 														   rowexpr->colnames);
  					BlessTupleDesc(rstate->tupdesc);
  					/* we won't need to redo this at runtime */
  				}
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 3f44ef0186ace8434ceaaf2ef37c14ca0fec632d..3ed90da7a52e2d0e982cfe0ef29022ac1ce1a4a5 100644
*** a/src/backend/executor/execTuples.c
--- b/src/backend/executor/execTuples.c
*************** ExecTypeFromTLInternal(List *targetList,
*** 954,980 ****
  /*
   * ExecTypeFromExprList - build a tuple descriptor from a list of Exprs
   *
!  * Here we must make up an arbitrary set of field names.
   */
  TupleDesc
! ExecTypeFromExprList(List *exprList)
  {
  	TupleDesc	typeInfo;
! 	ListCell   *l;
  	int			cur_resno = 1;
! 	char		fldname[NAMEDATALEN];
  
  	typeInfo = CreateTemplateTupleDesc(list_length(exprList), false);
  
! 	foreach(l, exprList)
  	{
! 		Node	   *e = lfirst(l);
! 
! 		sprintf(fldname, "f%d", cur_resno);
  
  		TupleDescInitEntry(typeInfo,
  						   cur_resno,
! 						   fldname,
  						   exprType(e),
  						   exprTypmod(e),
  						   0);
--- 954,981 ----
  /*
   * ExecTypeFromExprList - build a tuple descriptor from a list of Exprs
   *
!  * Caller must also supply a list of field names (String nodes).
   */
  TupleDesc
! ExecTypeFromExprList(List *exprList, List *namesList)
  {
  	TupleDesc	typeInfo;
! 	ListCell   *le;
! 	ListCell   *ln;
  	int			cur_resno = 1;
! 
! 	Assert(list_length(exprList) == list_length(namesList));
  
  	typeInfo = CreateTemplateTupleDesc(list_length(exprList), false);
  
! 	forboth(le, exprList, ln, namesList)
  	{
! 		Node	   *e = lfirst(le);
! 		char	   *n = strVal(lfirst(ln));
  
  		TupleDescInitEntry(typeInfo,
  						   cur_resno,
! 						   n,
  						   exprType(e),
  						   exprTypmod(e),
  						   0);
diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c
index d5260e40b32abe5dc5ff437cda8e037f6cdbe12a..0089e501fa2e43c10a1d530110d1fa5f38144cd9 100644
*** a/src/backend/executor/nodeValuesscan.c
--- b/src/backend/executor/nodeValuesscan.c
***************
*** 25,30 ****
--- 25,31 ----
  
  #include "executor/executor.h"
  #include "executor/nodeValuesscan.h"
+ #include "parser/parsetree.h"
  
  
  static TupleTableSlot *ValuesNext(ValuesScanState *node);
*************** ValuesScanState *
*** 188,193 ****
--- 189,196 ----
  ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags)
  {
  	ValuesScanState *scanstate;
+ 	RangeTblEntry *rte = rt_fetch(node->scan.scanrelid,
+ 								  estate->es_range_table);
  	TupleDesc	tupdesc;
  	ListCell   *vtl;
  	int			i;
*************** ExecInitValuesScan(ValuesScan *node, ESt
*** 239,245 ****
  	/*
  	 * get info about values list
  	 */
! 	tupdesc = ExecTypeFromExprList((List *) linitial(node->values_lists));
  
  	ExecAssignScanType(&scanstate->ss, tupdesc);
  
--- 242,249 ----
  	/*
  	 * get info about values list
  	 */
! 	tupdesc = ExecTypeFromExprList((List *) linitial(node->values_lists),
! 								   rte->eref->colnames);
  
  	ExecAssignScanType(&scanstate->ss, tupdesc);
  
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index bdd499bea662d405fc6522c036c53955c0a2e3f9..0d69a34e12bd224396019c37b20cdcac85d73339 100644
*** a/src/include/executor/executor.h
--- b/src/include/executor/executor.h
*************** extern TupleTableSlot *ExecInitNullTuple
*** 256,262 ****
  					  TupleDesc tupType);
  extern TupleDesc ExecTypeFromTL(List *targetList, bool hasoid);
  extern TupleDesc ExecCleanTypeFromTL(List *targetList, bool hasoid);
! extern TupleDesc ExecTypeFromExprList(List *exprList);
  extern void UpdateChangedParamSet(PlanState *node, Bitmapset *newchg);
  
  typedef struct TupOutputState
--- 256,262 ----
  					  TupleDesc tupType);
  extern TupleDesc ExecTypeFromTL(List *targetList, bool hasoid);
  extern TupleDesc ExecCleanTypeFromTL(List *targetList, bool hasoid);
! extern TupleDesc ExecTypeFromExprList(List *exprList, List *namesList);
  extern void UpdateChangedParamSet(PlanState *node, Bitmapset *newchg);
  
  typedef struct TupOutputState
