aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execMain.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2008-10-31 21:07:55 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2008-10-31 21:07:55 +0000
commitdf5a99612d2d4ba7ed080eb4dd02ce7e09a45f9b (patch)
tree19e8899cc33e133d97e52ec29d66b91b4402e789 /src/backend/executor/execMain.c
parente9816533e39be464227b748ee5eeb3d9f688cd76 (diff)
downloadpostgresql-df5a99612d2d4ba7ed080eb4dd02ce7e09a45f9b.tar.gz
postgresql-df5a99612d2d4ba7ed080eb4dd02ce7e09a45f9b.zip
Simplify ExecutorRun's API and save some trivial number of cycles by having
it just return void instead of sometimes returning a TupleTableSlot. SQL functions don't need that anymore, and noplace else does either. Eliminating the return value also means one less hassle for the ExecutorRun hook functions that will be supported beginning in 8.4.
Diffstat (limited to 'src/backend/executor/execMain.c')
-rw-r--r--src/backend/executor/execMain.c74
1 files changed, 25 insertions, 49 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 49fa4156de4..47840d42ebc 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -26,7 +26,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.313 2008/08/25 22:42:32 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.314 2008/10/31 21:07:54 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -76,7 +76,7 @@ typedef struct evalPlanQual
static void InitPlan(QueryDesc *queryDesc, int eflags);
static void ExecCheckPlanOutput(Relation resultRel, List *targetList);
static void ExecEndPlan(PlanState *planstate, EState *estate);
-static TupleTableSlot *ExecutePlan(EState *estate, PlanState *planstate,
+static void ExecutePlan(EState *estate, PlanState *planstate,
CmdType operation,
long numberTuples,
ScanDirection direction,
@@ -220,26 +220,28 @@ ExecutorStart(QueryDesc *queryDesc, int eflags)
* Note: count = 0 is interpreted as no portal limit, i.e., run to
* completion.
*
+ * There is no return value, but output tuples (if any) are sent to
+ * the destination receiver specified in the QueryDesc; and the number
+ * of tuples processed at the top level can be found in
+ * estate->es_processed.
+ *
* We provide a function hook variable that lets loadable plugins
* get control when ExecutorRun is called. Such a plugin would
* normally call standard_ExecutorRun().
*
* ----------------------------------------------------------------
*/
-TupleTableSlot *
+void
ExecutorRun(QueryDesc *queryDesc,
ScanDirection direction, long count)
{
- TupleTableSlot *result;
-
if (ExecutorRun_hook)
- result = (*ExecutorRun_hook) (queryDesc, direction, count);
+ (*ExecutorRun_hook) (queryDesc, direction, count);
else
- result = standard_ExecutorRun(queryDesc, direction, count);
- return result;
+ standard_ExecutorRun(queryDesc, direction, count);
}
-TupleTableSlot *
+void
standard_ExecutorRun(QueryDesc *queryDesc,
ScanDirection direction, long count)
{
@@ -247,7 +249,6 @@ standard_ExecutorRun(QueryDesc *queryDesc,
CmdType operation;
DestReceiver *dest;
bool sendTuples;
- TupleTableSlot *result;
MemoryContext oldcontext;
/* sanity checks */
@@ -283,15 +284,13 @@ standard_ExecutorRun(QueryDesc *queryDesc,
/*
* run plan
*/
- if (ScanDirectionIsNoMovement(direction))
- result = NULL;
- else
- result = ExecutePlan(estate,
- queryDesc->planstate,
- operation,
- count,
- direction,
- dest);
+ if (!ScanDirectionIsNoMovement(direction))
+ ExecutePlan(estate,
+ queryDesc->planstate,
+ operation,
+ count,
+ direction,
+ dest);
/*
* shutdown tuple receiver, if we started it
@@ -300,8 +299,6 @@ standard_ExecutorRun(QueryDesc *queryDesc,
(*dest->rShutdown) (dest);
MemoryContextSwitchTo(oldcontext);
-
- return result;
}
/* ----------------------------------------------------------------
@@ -1271,19 +1268,16 @@ ExecEndPlan(PlanState *planstate, EState *estate)
/* ----------------------------------------------------------------
* ExecutePlan
*
- * processes the query plan to retrieve 'numberTuples' tuples in the
- * direction specified.
- *
- * Retrieves all tuples if numberTuples is 0
+ * Processes the query plan until we have processed 'numberTuples' tuples,
+ * moving in the specified direction.
*
- * result is either a slot containing the last tuple in the case
- * of a SELECT or NULL otherwise.
+ * Runs to completion if numberTuples is 0
*
* Note: the ctid attribute is a 'junk' attribute that is removed before the
* user can see it
* ----------------------------------------------------------------
*/
-static TupleTableSlot *
+static void
ExecutePlan(EState *estate,
PlanState *planstate,
CmdType operation,
@@ -1297,13 +1291,11 @@ ExecutePlan(EState *estate,
ItemPointer tupleid = NULL;
ItemPointerData tuple_ctid;
long current_tuple_count;
- TupleTableSlot *result;
/*
* initialize local variables
*/
current_tuple_count = 0;
- result = NULL;
/*
* Set the direction.
@@ -1332,7 +1324,6 @@ ExecutePlan(EState *estate,
/*
* Loop until we've processed the proper number of tuples from the plan.
*/
-
for (;;)
{
/* Reset the per-output-tuple exprcontext */
@@ -1353,13 +1344,10 @@ lnext: ;
/*
* if the tuple is null, then we assume there is nothing more to
- * process so we just return null...
+ * process so we just end the loop...
*/
if (TupIsNull(planSlot))
- {
- result = NULL;
break;
- }
slot = planSlot;
/*
@@ -1453,7 +1441,6 @@ lnext: ;
default:
elog(ERROR, "unrecognized heap_lock_tuple status: %u",
test);
- return NULL;
}
}
}
@@ -1488,35 +1475,30 @@ lnext: ;
/*
* now that we have a tuple, do the appropriate thing with it.. either
- * return it to the user, add it to a relation someplace, delete it
- * from a relation, or modify some of its attributes.
+ * send it to the output destination, add it to a relation someplace,
+ * delete it from a relation, or modify some of its attributes.
*/
switch (operation)
{
case CMD_SELECT:
ExecSelect(slot, dest, estate);
- result = slot;
break;
case CMD_INSERT:
ExecInsert(slot, tupleid, planSlot, dest, estate);
- result = NULL;
break;
case CMD_DELETE:
ExecDelete(tupleid, planSlot, dest, estate);
- result = NULL;
break;
case CMD_UPDATE:
ExecUpdate(slot, tupleid, planSlot, dest, estate);
- result = NULL;
break;
default:
elog(ERROR, "unrecognized operation code: %d",
(int) operation);
- result = NULL;
break;
}
@@ -1548,12 +1530,6 @@ lnext: ;
/* do nothing */
break;
}
-
- /*
- * here, result is either a slot containing a tuple in the case of a
- * SELECT or NULL otherwise.
- */
- return result;
}
/* ----------------------------------------------------------------