*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/executor/execTuples.c,v 1.73 2003/11/29 19:51:48 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/executor/execTuples.c,v 1.74 2003/12/01 23:09:02 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#include "executor/executor.h"
#include "utils/lsyscache.h"
+static TupleDesc ExecTypeFromTLInternal(List *targetList,
+ bool hasoid, bool skipjunk);
/* ----------------------------------------------------------------
* tuple table create/delete functions
* is used for initializing special-purpose slots.
* --------------------------------
*/
-#define INIT_SLOT_DEFS \
- TupleTable tupleTable; \
- TupleTableSlot* slot
-
-#define INIT_SLOT_ALLOC \
- tupleTable = (TupleTable) estate->es_tupleTable; \
- slot = ExecAllocTableSlot(tupleTable);
/* ----------------
* ExecInitResultTupleSlot
void
ExecInitResultTupleSlot(EState *estate, PlanState *planstate)
{
- INIT_SLOT_DEFS;
- INIT_SLOT_ALLOC;
- planstate->ps_ResultTupleSlot = slot;
+ planstate->ps_ResultTupleSlot = ExecAllocTableSlot(estate->es_tupleTable);
}
/* ----------------
void
ExecInitScanTupleSlot(EState *estate, ScanState *scanstate)
{
- INIT_SLOT_DEFS;
- INIT_SLOT_ALLOC;
- scanstate->ss_ScanTupleSlot = slot;
+ scanstate->ss_ScanTupleSlot = ExecAllocTableSlot(estate->es_tupleTable);
}
/* ----------------
TupleTableSlot *
ExecInitExtraTupleSlot(EState *estate)
{
- INIT_SLOT_DEFS;
- INIT_SLOT_ALLOC;
- return slot;
+ return ExecAllocTableSlot(estate->es_tupleTable);
}
/* ----------------
TupleDesc
ExecTypeFromTL(List *targetList, bool hasoid)
{
- TupleDesc typeInfo;
- List *tlitem;
- int len;
-
- /*
- * allocate a new typeInfo
- */
- len = ExecTargetListLength(targetList);
- typeInfo = CreateTemplateTupleDesc(len, hasoid);
-
- /*
- * scan list, generate type info for each entry
- */
- foreach(tlitem, targetList)
- {
- TargetEntry *tle = lfirst(tlitem);
- Resdom *resdom = tle->resdom;
-
- TupleDescInitEntry(typeInfo,
- resdom->resno,
- resdom->resname,
- resdom->restype,
- resdom->restypmod,
- 0,
- false);
- }
-
- return typeInfo;
+ return ExecTypeFromTLInternal(targetList, hasoid, false);
}
/* ----------------------------------------------------------------
TupleDesc
ExecCleanTypeFromTL(List *targetList, bool hasoid)
{
- TupleDesc typeInfo;
- List *tlitem;
- int len;
- int cleanresno;
+ return ExecTypeFromTLInternal(targetList, hasoid, true);
+}
- /*
- * allocate a new typeInfo
- */
- len = ExecCleanTargetListLength(targetList);
+static TupleDesc
+ExecTypeFromTLInternal(List *targetList, bool hasoid, bool skipjunk)
+{
+ TupleDesc typeInfo;
+ List *l;
+ int len;
+ int cur_resno = 1;
+
+ if (skipjunk)
+ len = ExecCleanTargetListLength(targetList);
+ else
+ len = ExecTargetListLength(targetList);
typeInfo = CreateTemplateTupleDesc(len, hasoid);
- /*
- * scan list, generate type info for each entry
- */
- cleanresno = 1;
- foreach(tlitem, targetList)
+ foreach(l, targetList)
{
- TargetEntry *tle = lfirst(tlitem);
- Resdom *resdom = tle->resdom;
+ TargetEntry *tle = lfirst(l);
+ Resdom *resdom = tle->resdom;
- if (resdom->resjunk)
+ if (skipjunk && resdom->resjunk)
continue;
TupleDescInitEntry(typeInfo,
- cleanresno++,
+ cur_resno++,
resdom->resname,
resdom->restype,
resdom->restypmod,