PostgreSQL源码学习执行器#10,11

database

本节介绍standard_ExecutorRun和ExecutorRun函数。

standard_ExecutorRun函数

//src/include/execurot/executor.h

extern void standard_ExecutorRun(QueryDesc *queryDesc,

ScanDirection direction, uint64 count, bool execute_once);

//src/backend/executor/execMain.c

Assert(queryDesc != NULL);

estate = queryDesc->estate;

Assert(estate != NULL);

Assert(!(estate->es_top_eflags & EXEC_FLAG_EXPLAIN_ONLY));

/* 切换为每个查询对应的内存上下文 */

oldcontext = MemoryContextSwitchTo(estate->es_query_cxt);

/* 视情况开始执行器运行时间统计 */

if (queryDesc->totaltime)

InstrStartNode(queryDesc->totaltime);

operation = queryDesc->operation;

dest = queryDesc->dest;

/* 若要发送元组,启动元组接收器 */

estate->es_processed = 0;

sendTuples = (operation == CMD_SELECT ||

queryDesc->plannedstmt->hasReturning);

if (sendTuples)

dest->rStartup(dest, operation, queryDesc->tupDesc);

/* 执行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);

}

/* 关闭元组接收器 */

if (sendTuples)

dest->rShutdown(dest);

/* 结束执行器计时 */

if (queryDesc->totaltime)

InstrStopNode(queryDesc->totaltime, estate->es_processed);

/* 切回内存上下文 */

MemoryContextSwitchTo(oldcontext);

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);

}

以上是 PostgreSQL源码学习执行器#10,11 的全部内容, 来源链接: utcz.com/z/534156.html

回到顶部