PostgreSQL源码学习–调度器#12「建议收藏」

PostgreSQL源码学习–调度器#12「建议收藏」本节介绍ProcessQuery函数。 相关数据结构 //src/include/executor/execdesc.h typedef struct QueryDesc { /* These fi…

PostgreSQL源码学习--调度器#12

本节介绍ProcessQuery函数。

相关数据结构

//src/include/executor/execdesc.h

typedef struct QueryDesc
{
	/* These fields are provided by CreateQueryDesc */
	CmdType		operation;		/* CMD_SELECT, CMD_UPDATE, etc. */
	PlannedStmt *plannedstmt;	/* planner"s output (could be utility, too) */
	const char *sourceText;		/* source text of the query */
	Snapshot	snapshot;		/* snapshot to use for query */
	Snapshot	crosscheck_snapshot;	/* crosscheck for RI update/delete */
	DestReceiver *dest;			/* the destination for tuple output */
	ParamListInfo params;		/* param values being passed in */
	QueryEnvironment *queryEnv; /* query environment passed in */
	int			instrument_options; /* OR of InstrumentOption flags */

	/* These fields are set by ExecutorStart */
	TupleDesc	tupDesc;		/* descriptor for result tuples */
	EState	   *estate;			/* executor"s query-wide state */
	PlanState  *planstate;		/* tree of per-plan-node state */

	/* This field is set by ExecutorRun */
	bool		already_executed;	/* true if previously executed */

	/* This is always set NULL by the core system, but plugins can change it */
	struct Instrumentation *totaltime;	/* total time spent in ExecutorRun */
} QueryDesc;

代码100分

ProcessQuery函数

代码100分static void
ProcessQuery(PlannedStmt *plan,
			 const char *sourceText,
			 ParamListInfo params,
			 QueryEnvironment *queryEnv,
			 DestReceiver *dest,
			 char *completionTag);
//src/backend/tcop/pquery.c

/* 创建queryDesc */
queryDesc = CreateQueryDesc(plan, sourceText,
				GetActiveSnapshot(), InvalidSnapshot,
				dest, params, queryEnv, 0);

/* 做一些准备工作 */
ExecutorStart(queryDesc, 0);

/* 完成plan */
ExecutorRun(queryDesc, ForwardScanDirection, 0L, true);

/* 有需要的话,构建命令完成状态的字符串 */
if (completionTag)
{
	switch (queryDesc->operation)
	{
		case CMD_SELECT:
			snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
					 "SELECT " UINT64_FORMAT,
					 queryDesc->estate->es_processed);
			break;
		case CMD_INSERT:
			/* lastoid doesn"t exist anymore */
			lastOid = InvalidOid;
			snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
					 "INSERT %u " UINT64_FORMAT,
					 lastOid, queryDesc->estate->es_processed);
			break;
		case CMD_UPDATE:
			snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
					 "UPDATE " UINT64_FORMAT,
					 queryDesc->estate->es_processed);
			break;
		case CMD_DELETE:
			snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
					 "DELETE " UINT64_FORMAT,
					 queryDesc->estate->es_processed);
			break;
		default:
			strcpy(completionTag, "???");
			break;
	}
}

/* 做一些收尾工作,然后结束,释放资源 */
ExecutorFinish(queryDesc);
ExecutorEnd(queryDesc);

FreeQueryDesc(queryDesc);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7854.html

(0)
上一篇 2023-03-12
下一篇 2023-03-12

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注