This patch refactors execTuples.c in two ways:
(1) ExecInitXXXResultTupleSlot() used a macro to avoid some
duplicated code, whereas calling ExecInitExtraTupleSlot() would
make the code more clear.
(2) ExecTypeFromTL() and ExecCleanTypeFromTL() duplicated a bunch
of code; I added a new function ExecTypeFromTLInternal() and
re-implemented these functions in terms of calls to it.
As a result, ExecInitScanTupleSlot(), ExecInitResultTupleSlot(),
ExecTypeFromTL(), and ExecCleanTypeFromTL() are now all trivial
(1 line) functions. I could have replaced these with macros, but I
didn't: does anyone thinks that would be worth doing?
-Neil
Index: src/backend/executor/execTuples.c
===================================================================
RCS file: /var/lib/cvs/pgsql-server/src/backend/executor/execTuples.c,v
retrieving revision 1.72
diff -c -r1.72 execTuples.c
*** src/backend/executor/execTuples.c 29 Sep 2003 18:22:48 -0000 1.72
--- src/backend/executor/execTuples.c 20 Nov 2003 02:42:17 -0000
***************
*** 112,117 ****
--- 112,119 ----
#include "executor/executor.h"
#include "utils/lsyscache.h"
+ static TupleDesc ExecTypeFromTLInternal(List *targetList,
+ bool hasoid, bool skipjunk);
/* ----------------------------------------------------------------
* tuple table create/delete functions
***************
*** 469,481 ****
* 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
--- 471,476 ----
***************
*** 484,492 ****
void
ExecInitResultTupleSlot(EState *estate, PlanState *planstate)
{
! INIT_SLOT_DEFS;
! INIT_SLOT_ALLOC;
! planstate->ps_ResultTupleSlot = slot;
}
/* ----------------
--- 479,485 ----
void
ExecInitResultTupleSlot(EState *estate, PlanState *planstate)
{
! planstate->ps_ResultTupleSlot = ExecInitExtraTupleSlot(estate);
}
/* ----------------
***************
*** 496,504 ****
void
ExecInitScanTupleSlot(EState *estate, ScanState *scanstate)
{
! INIT_SLOT_DEFS;
! INIT_SLOT_ALLOC;
! scanstate->ss_ScanTupleSlot = slot;
}
/* ----------------
--- 489,495 ----
void
ExecInitScanTupleSlot(EState *estate, ScanState *scanstate)
{
! scanstate->ss_ScanTupleSlot = ExecInitExtraTupleSlot(estate);
}
/* ----------------
***************
*** 508,516 ****
TupleTableSlot *
ExecInitExtraTupleSlot(EState *estate)
{
! INIT_SLOT_DEFS;
! INIT_SLOT_ALLOC;
! return slot;
}
/* ----------------
--- 499,505 ----
TupleTableSlot *
ExecInitExtraTupleSlot(EState *estate)
{
! return ExecAllocTableSlot(estate->es_tupleTable);
}
/* ----------------
***************
*** 560,593 ****
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;
}
/* ----------------------------------------------------------------
--- 549,555 ----
TupleDesc
ExecTypeFromTL(List *targetList, bool hasoid)
{
! return ExecTypeFromTLInternal(targetList, hasoid, false);
}
/* ----------------------------------------------------------------
***************
*** 599,628 ****
TupleDesc
ExecCleanTypeFromTL(List *targetList, bool hasoid)
{
! TupleDesc typeInfo;
! List *tlitem;
! int len;
! int cleanresno;
! /*
! * allocate a new typeInfo
! */
! len = ExecCleanTargetListLength(targetList);
typeInfo = CreateTemplateTupleDesc(len, hasoid);
! /*
! * scan list, generate type info for each entry
! */
! cleanresno = 1;
! foreach(tlitem, targetList)
{
! TargetEntry *tle = lfirst(tlitem);
! Resdom *resdom = tle->resdom;
! if (resdom->resjunk)
continue;
TupleDescInitEntry(typeInfo,
! cleanresno++,
resdom->resname,
resdom->restype,
resdom->restypmod,
--- 561,592 ----
TupleDesc
ExecCleanTypeFromTL(List *targetList, bool hasoid)
{
! return ExecTypeFromTLInternal(targetList, hasoid, true);
! }
! 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);
! foreach(l, targetList)
{
! TargetEntry *tle = lfirst(l);
! Resdom *resdom = tle->resdom;
! if (skipjunk && resdom->resjunk)
continue;
TupleDescInitEntry(typeInfo,
! cur_resno++,
resdom->resname,
resdom->restype,
resdom->restypmod,
---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?
http://archives.postgresql.org