-
PostgresMain
- exec_simple_query
- pg_parse_query
- pg_analyze_and_rewrite
- pg_plan_queries
- CreatePortal
- PortalDefineQuery
- PortalStart
- PortalRun
- PortalRunSelect
- ExecutorRun
- standard_ExecutorRun
- ExecutePlan
- ExecutePlan里面有for循环,不断调用slot=ExecProcNode(Node)
- ExecProcNode
- 这个函数里面最重要的一句话是return node->ExecProcNode(node);
- ExecutePlan
- standard_ExecutorRun
- ExecutorRun
- PortalRunSelect
- PortalDrop
- exec_simple_query
-
PostgresMain
- exec_simple_query
- pg_parse_query
- pg_analyze_and_rewrite
- pg_plan_queries
- CreatePortal
- PortalDefineQuery
- PortalStart
- PortalRun
- PortalRunSelect
- ExecutorRun
- standard_ExecutorRun
- ExecutePlan
- ExecProcNode
- ExecSort
- ExecProcNode
- ExecutePlan
- standard_ExecutorRun
- ExecutorRun
- PortalRunSelect
- PortalDrop
- exec_simple_query
PostgresMain
- 这个函数是主函数
- 里面重要的函数是exec_simple_query(query_string);
exec_simple_query
- pg_parse_query
- pg_analyze_and_rewrite
- pg_plan_queries
- PortalRun
PortalRun
根据portal->strategy来执行那些函数哦!!
- PortalRunSelect
PortalRunSelect
- ExecutorRun
ExecutorRun
- standard_ExecutorRun
/* ----------------------------------------------------------------
* ExecutorRun
*
* This is the main routine of the executor module. It accepts
* the query descriptor from the traffic cop and executes the
* query plan.
*
* ExecutorStart must have been called already.
*
* If direction is NoMovementScanDirection then nothing is done
* except to start up/shut down the destination. Otherwise,
* we retrieve up to 'count' tuples in the specified direction.
*
* Note: count = 0 is interpreted as no portal limit, i.e., run to
* completion. Also note that the count limit is only applied to
* retrieved tuples, not for instance to those inserted/updated/deleted
* by a ModifyTable plan node.
*
* 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().
*
* ----------------------------------------------------------------
*/
void
ExecutorRun(QueryDesc *queryDesc,
ScanDirection direction, uint64 count,
bool execute_once)
{
if (ExecutorRun_hook)
(*ExecutorRun_hook) (queryDesc, direction, count, execute_once);
else
standard_ExecutorRun(queryDesc, direction, count, execute_once);
}
standard_ExecutorRun
- ExecutePlan
void
standard_ExecutorRun(QueryDesc *queryDesc,
ScanDirection direction, uint64 count, bool execute_once)
{
EState *estate;
CmdType operation;
DestReceiver *dest;
bool sendTuples;
MemoryContext oldcontext;
/* sanity checks */
Assert(queryDesc != NULL);
estate = queryDesc->estate;
Assert(estate != NULL);
Assert(!(estate->es_top_eflags & EXEC_FLAG_EXPLAIN_ONLY));
/*
* Switch into per-query memory context
*/
oldcontext = MemoryContextSwitchTo(estate->es_query_cxt);
/* Allow instrumentation of Executor overall runtime */
if (queryDesc->totaltime)
InstrStartNode(queryDesc->totaltime);
/*
* extract information from the query descriptor and the query feature.
*/
operation = queryDesc->operation;
dest = queryDesc->dest;
/*
* startup tuple receiver, if we will be emitting tuples
*/
estate->es_processed = 0;
estate->es_lastoid = InvalidOid;
sendTuples = (operation == CMD_SELECT ||
queryDesc->plannedstmt->hasReturning);
if (sendTuples)
dest->rStartup(dest, operation, queryDesc->tupDesc);
/*
* run plan
*/
if (!ScanDirectionIsNoMovement(direction))
{
if (execute_once && queryDesc->already_executed)
elog(ERROR, "can't re-execute query flagged for single execution");
queryDesc->already_executed = true;
ExecutePlan(estate,
queryDesc->planstate,
queryDesc->plannedstmt->parallelModeNeeded,
operation,
sendTuples,
count,
direction,
dest,
execute_once);
}
/*
* shutdown tuple receiver, if we started it
*/
if (sendTuples)
dest->rShutdown(dest);
if (queryDesc->totaltime)
InstrStopNode(queryDesc->totaltime, estate->es_processed);
MemoryContextSwitchTo(oldcontext);
}