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

相关推荐

  • Docker安装Mysql5.7[通俗易懂]

    Docker安装Mysql5.7[通俗易懂]Docker安装 系统版本:CentOS Linux release 7.5.1804 (Core) 如果之前有装过docker可以先卸载旧版本再安装,没有则跳过。 yum remove docker

    2023-02-03
    133
  • awr保留时间_快照备份

    awr保留时间_快照备份例如改为7天(7*24*60),每小时收集一次,默认情况下当前系统的保留时间为8天,1小时采样一次。 1、查看当前的快照保留时间和采集周期: SQL> select * from dba_hist_…

    2023-01-28
    184
  • Python函数返回多个值

    Python函数返回多个值Python是一种高级编程语言,具有强大的功能和广泛的应用场景。在Python编程中,函数是一种重要的概念,可以帮助我们编写可重用的代码,并在程序中实现一系列的功能。在Python中,函数可以返回多个值,这是Python中一个非常有用的特性。

    2024-06-14
    51
  • Python中dict.fromkeys的使用方法

    Python中dict.fromkeys的使用方法codedict.fromkeys(keys[, value])/code是Python字典(dict)类中的一个静态方法,用于创建并返回一个新的字典,其中包含指定键序列(keys)中所有键的键值,默认的键值是None。

    2024-04-04
    86
  • Python实现删除指定元素

    Python实现删除指定元素 Python语言简单易学,语法简洁,运行效率高,拥有丰富的第三方库。Python可以应用于多种场景,包括自动化脚本、数据分析、机器学习、Web开发等等。本文将重点讲解在Python中如何删除指定元素。

    2024-06-13
    57
  • sql视图和存储过程_oracle存储过程详解

    sql视图和存储过程_oracle存储过程详解1.视图 1.1 什么是视图? 视图实际上是一张虚拟表,其本身不存储数据。 相当于一张表或多张表的数据结果集 数据表复杂的情况下,可以把查询结果放在虚拟表中,提升效率 1.2如何创建、更新、删除视图…

    2023-04-06
    139
  • [20191127]表 full Hash Value的计算.txt「建议收藏」

    [20191127]表 full Hash Value的计算.txt「建议收藏」[20191127]表 full Hash Value的计算.txt–//曾经做过表full Hash Value的计算,当时我是通过建立简单的schema以及表名的形式,使用hashcat激活成功教程or

    2022-12-22
    134
  • Python实战:decoded和编码基础知识展示

    Python实战:decoded和编码基础知识展示在Python编程中,解码和编码是非常重要的基础知识。解码是将字节转换为字符串,而编码是将字符串转换为字节。在本文中,我们将讨论Python中的解码和编码技术,并通过示例代码进行解释。

    2024-02-01
    107

发表回复

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