|
|
|
|
@ -26,7 +26,7 @@ |
|
|
|
|
* |
|
|
|
|
* |
|
|
|
|
* IDENTIFICATION |
|
|
|
|
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.67 1999/01/29 10:15:09 vadim Exp $ |
|
|
|
|
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.68 1999/01/29 11:56:00 vadim Exp $ |
|
|
|
|
* |
|
|
|
|
*------------------------------------------------------------------------- |
|
|
|
|
*/ |
|
|
|
|
@ -66,7 +66,7 @@ static void EndPlan(Plan *plan, EState *estate); |
|
|
|
|
static TupleTableSlot *ExecutePlan(EState *estate, Plan *plan, |
|
|
|
|
CmdType operation, int numberTuples, ScanDirection direction, |
|
|
|
|
DestReceiver *destfunc); |
|
|
|
|
static void ExecRetrieve(TupleTableSlot *slot,
|
|
|
|
|
static void ExecRetrieve(TupleTableSlot *slot, |
|
|
|
|
DestReceiver *destfunc, |
|
|
|
|
EState *estate); |
|
|
|
|
static void ExecAppend(TupleTableSlot *slot, ItemPointer tupleid, |
|
|
|
|
@ -170,11 +170,11 @@ ExecutorStart(QueryDesc *queryDesc, EState *estate) |
|
|
|
|
TupleTableSlot * |
|
|
|
|
ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count) |
|
|
|
|
{ |
|
|
|
|
CmdType operation; |
|
|
|
|
Plan *plan; |
|
|
|
|
CmdType operation; |
|
|
|
|
Plan *plan; |
|
|
|
|
TupleTableSlot *result; |
|
|
|
|
CommandDest dest; |
|
|
|
|
void (*destination) (); |
|
|
|
|
CommandDest dest; |
|
|
|
|
DestReceiver *destfunc; |
|
|
|
|
|
|
|
|
|
/******************
|
|
|
|
|
* sanity checks |
|
|
|
|
@ -190,10 +190,19 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count) |
|
|
|
|
operation = queryDesc->operation; |
|
|
|
|
plan = queryDesc->plantree; |
|
|
|
|
dest = queryDesc->dest; |
|
|
|
|
destination = (void (*) ()) DestToFunction(dest); |
|
|
|
|
destfunc = DestToFunction(dest); |
|
|
|
|
estate->es_processed = 0; |
|
|
|
|
estate->es_lastoid = InvalidOid; |
|
|
|
|
|
|
|
|
|
/******************
|
|
|
|
|
* FIXME: the dest setup function ought to be handed the tuple desc |
|
|
|
|
* for the tuples to be output, but I'm not quite sure how to get that |
|
|
|
|
* info at this point. For now, passing NULL is OK because no existing |
|
|
|
|
* dest setup function actually uses the pointer. |
|
|
|
|
****************** |
|
|
|
|
*/ |
|
|
|
|
(*destfunc->setup) (destfunc, (TupleDesc) NULL); |
|
|
|
|
|
|
|
|
|
switch (feature) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
@ -203,7 +212,7 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count) |
|
|
|
|
operation, |
|
|
|
|
ALL_TUPLES, |
|
|
|
|
ForwardScanDirection, |
|
|
|
|
destination); |
|
|
|
|
destfunc); |
|
|
|
|
break; |
|
|
|
|
case EXEC_FOR: |
|
|
|
|
result = ExecutePlan(estate, |
|
|
|
|
@ -211,7 +220,7 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count) |
|
|
|
|
operation, |
|
|
|
|
count, |
|
|
|
|
ForwardScanDirection, |
|
|
|
|
destination); |
|
|
|
|
destfunc); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
/******************
|
|
|
|
|
@ -224,7 +233,7 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count) |
|
|
|
|
operation, |
|
|
|
|
count, |
|
|
|
|
BackwardScanDirection, |
|
|
|
|
destination); |
|
|
|
|
destfunc); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
/******************
|
|
|
|
|
@ -238,7 +247,7 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count) |
|
|
|
|
operation, |
|
|
|
|
ONE_TUPLE, |
|
|
|
|
ForwardScanDirection, |
|
|
|
|
destination); |
|
|
|
|
destfunc); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
result = NULL; |
|
|
|
|
@ -246,6 +255,8 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
(*destfunc->cleanup) (destfunc); |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -756,7 +767,7 @@ ExecutePlan(EState *estate, |
|
|
|
|
CmdType operation, |
|
|
|
|
int numberTuples, |
|
|
|
|
ScanDirection direction, |
|
|
|
|
DestReceiver *destfunc) |
|
|
|
|
DestReceiver* destfunc) |
|
|
|
|
{ |
|
|
|
|
JunkFilter *junkfilter; |
|
|
|
|
|
|
|
|
|
@ -941,7 +952,7 @@ lmark:; |
|
|
|
|
{ |
|
|
|
|
case CMD_SELECT: |
|
|
|
|
ExecRetrieve(slot, /* slot containing tuple */ |
|
|
|
|
destfunc, /* print function */ |
|
|
|
|
destfunc, /* destination's tuple-receiver obj */ |
|
|
|
|
estate); /* */ |
|
|
|
|
result = slot; |
|
|
|
|
break; |
|
|
|
|
@ -1024,7 +1035,7 @@ ExecRetrieve(TupleTableSlot *slot, |
|
|
|
|
* send the tuple to the front end (or the screen) |
|
|
|
|
****************** |
|
|
|
|
*/ |
|
|
|
|
(*printfunc) (tuple, attrtype); |
|
|
|
|
(*destfunc->receiveTuple) (tuple, attrtype, destfunc); |
|
|
|
|
IncrRetrieved(); |
|
|
|
|
(estate->es_processed)++; |
|
|
|
|
} |
|
|
|
|
|