PostgreSQL源码学习–执行器#9「建议收藏」

PostgreSQL源码学习–执行器#9「建议收藏」本节介绍ExecutePlan函数 相关数据结构 typedef enum ScanDirection { BackwardScanDirection = -1, NoMovementScanDir…

PostgreSQL源码学习--执行器#9

本节介绍ExecutePlan函数

相关数据结构

typedef enum ScanDirection
{
	BackwardScanDirection = -1,
	NoMovementScanDirection = 0,
	ForwardScanDirection = 1
} ScanDirection;

代码100分

ExecutePlan函数

代码100分static void
ExecutePlan(EState *estate,
			PlanState *planstate,
			bool use_parallel_mode,
			CmdType operation,
			bool sendTuples,
			uint64 numberTuples,
			ScanDirection direction,
			DestReceiver *dest,
			bool execute_once);

执行查询计划,直到获取到numberTuples个元组,并且处理时朝direction方向移动。

//src/backend/executor/execMain.c

/* 初始化本地变量 */
current_tuple_count = 0;

/* 设置扫描移动方向 */
estate->es_direction = direction;

/* 如果计划可能被多次执行,那么它不可以并行执行,因为处理可能提前退出 */
if (!execute_once)
	use_parallel_mode = false;

estate->es_use_parallel_mode = use_parallel_mode;
if (use_parallel_mode)
	EnterParallelMode();

/* 循环,直到我们从计划中处理了适当数量的元组。*/
for (;;)
{
	/* 重置每个输出元组的expr上下文 */
	ResetPerTupleExprContext(estate);
	
	/* 执行计划并获取一个元组 */
	slot = ExecProcNode(planstate);
	
	/* 如果没有元组了,那么假定就是执行完成了,所以跳出循环 */
	if (TupIsNull(slot))
	{
		/* 如果不需要倒退那直接在这里释放资源就行 */
		if (!(estate->es_top_eflags & EXEC_FLAG_BACKWARD))
			(void) ExecShutdownNode(planstate);
		break;
	}
	
	/* 有需要的话,对元组进行“垃圾属性”过滤“ */
	if (estate->es_junkFilter != NULL)
		slot = ExecFilterJunk(estate->es_junkFilter, slot);
	
	/* 有需要的话,发送元组到某处 */
	if (sendTuples)
	{
		/* 若发送失败,那么假定是目标被关闭了,所以结束循环 */
		if (!dest->receiveSlot(slot, dest))
			break;
	}
	
	/* 如果是SELECT操作,统计处理的元组数量 */
	if (operation == CMD_SELECT)
		(estate->es_processed)++;
	
	/* 检查处理的元组数量,如果已经够了,那么退出。
	 * 如果numberTuples是0的话,表示没有限制 */
	current_tuple_count++;
	if (numberTuples && numberTuples == current_tuple_count)
	{
		/* 如果不需要倒退那直接在这里释放资源就行 */
		if (!(estate->es_top_eflags & EXEC_FLAG_BACKWARD))
			(void) ExecShutdownNode(planstate);
		break;
	}
}

if (use_parallel_mode)
	ExitParallelMode();

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

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

相关推荐

  • 详解数仓的锁相关参数及视图[通俗易懂]

    详解数仓的锁相关参数及视图[通俗易懂]摘要:GaussDB(DWS) 中锁等待可以设置等待超时相关参数,一旦等锁的时间超过参数配置值会抛错。 本文分享自华为云社区《GaussDB(DWS) 锁相关参数及视图详解》,作者: yd_22052

    2023-06-09
    128
  • 深入python垃圾回收机制:理解gc模块

    深入python垃圾回收机制:理解gc模块Python是一门非常受欢迎的编程语言,而Python的垃圾回收机制则是Python执行效果显著的重要因素之一。如果我们要写出高效并且节省运行时间的Python代码,深入理解Python的垃圾回收机制是非常必要的。本文将深入探讨Python的垃圾回收机制,重点讲解gc模块的相关知识,帮助读者深入理解Python的垃圾回收机制,写出更高效的Python代码。

    2024-05-21
    63
  • mybatis (mysql)根据日期(相等)查不出来数据「建议收藏」

    mybatis (mysql)根据日期(相等)查不出来数据「建议收藏」背景,写这篇博客的时候还是挺开心的,因为把困扰我的问题解决了(上班时间,搞了几个小时),中间有人提醒了下,没有领会呵呵 1.情况说明 根据时间: Parameters: 2020-03-04 00:…

    2023-02-03
    155
  • 如何把sql语句结果输出到excel

    如何把sql语句结果输出到excel如果SQL语句的结果太大,通过plsql developer无法显示所有的结果,这个时候,我们可以通过一段代码来完成,下面是一个例子: 把 select last_name, salary, dep…

    2022-12-27
    138
  • 使用Python的sin x⁵函数进行数学计算和数据分析

    使用Python的sin x⁵函数进行数学计算和数据分析sin x⁵函数是一个五次方的正弦函数,公式为y=sin(x)⁵。

    2024-03-11
    75
  • sql server无法连接到本地服务器_sql server连接到服务器

    sql server无法连接到本地服务器_sql server连接到服务器当连接sql server本地服务器 报一下错误: 标题: 连接到服务器 无法连接到 localhost。 。。。。。 打开windows服务管理界面(win+R键,) 接着找到 再次连接即可

    2022-12-26
    142
  • Python中if和elseif语句的区别

    Python中if和elseif语句的区别在Python中,if和elseif是两种常用的条件语句。它们可以根据不同的条件执行不同的代码块。具体来说,if语句是用来判断一个条件是否成立,如果成立就执行对应的代码块;如果不成立,可以选择执行其他代码或者什么也不做。而elseif语句则是可以在if语句执行不成立时继续判断下一个条件是否成立,如果成立就执行对应的代码块。

    2024-07-10
    45
  • kibana elasticsearch.hosts_Elastic

    kibana elasticsearch.hosts_ElasticElasticSearch目前最新版是7.7.0,其中部署的细节和之前的6.x有很多的不同,所以这里单独拉出来写一下,希望对用7.x的童鞋有一些帮助,然后部署完ES后配套的kibana也是7.7.0,

    2023-03-07
    172

发表回复

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