我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

本节介绍PortalRun函数。

PortalRun函数

//class="lazy" data-src/include/tcop/pquery.h

extern bool PortalRun(Portal portal, long count, bool isTopLevel,
				  bool run_once, DestReceiver *dest, DestReceiver *altdest,
				  char *completionTag);
//class="lazy" data-src/backend/tcop/pquery.c

AssertArg(PortalIsValid(portal));


TRACE_POSTGRESQL_QUERY_EXECUTE_START();


if (completionTag)
	completionTag[0] = "";


if (log_executor_stats && portal->strategy != PORTAL_MULTI_QUERY)
{
	elog(DEBUG3, "PortalRun");
	ResetUsage();
}


MarkPortalActive(portal);


Assert(!portal->run_once || run_once);
portal->run_once = run_once;


saveTopTransactionResourceOwner = TopTransactionResourceOwner;
saveTopTransactionContext = TopTransactionContext;
saveActivePortal = ActivePortal;
saveResourceOwner = CurrentResourceOwner;
savePortalContext = PortalContext;
saveMemoryContext = CurrentMemoryContext;
PG_TRY();
{
	ActivePortal = portal;
	if (portal->resowner)
		CurrentResourceOwner = portal->resowner;
	PortalContext = portal->portalContext;
	
	
	MemoryContextSwitchTo(PortalContext);
	
	switch (portal->strategy)
	{
		case PORTAL_ONE_SELECT:
		case PORTAL_ONE_RETURNING:
		case PORTAL_ONE_MOD_WITH:
		case PORTAL_UTIL_SELECT:
			
			
			if (portal->strategy != PORTAL_ONE_SELECT && !portal->holdStore)
				FillPortalStore(portal, isTopLevel);
			
			
			nprocessed = PortalRunSelect(portal, true, count, dest);
			
			
			if (completionTag && portal->commandTag)
			{
				if (strcmp(portal->commandTag, "SELECT") == 0)
					snprintf(completionTag, COMPLETION_TAG_BUFSIZE,
							 "SELECT " UINT64_FORMAT, nprocessed);
				else
					strcpy(completionTag, portal->commandTag);
			}
			
			
			portal->status = PORTAL_READY;
			
			
			result = portal->atEnd;
			break;
			
		
		case PORTAL_MULTI_QUERY:
			PortalRunMulti(portal, isTopLevel, false,
						   dest, altdest, completionTag);
			
			
			MarkPortalDone(portal);
			
			
			result = true;
			break;
			
		default:
			elog(ERROR, "unrecognized portal strategy: %d",
				 (int) portal->strategy);
			result = false; 
			break;
	}
}
PG_CATCH();
{
	
	MarkPortalFailed(portal);
	
	
	if (saveMemoryContext == saveTopTransactionContext)
		MemoryContextSwitchTo(TopTransactionContext);
	else
		MemoryContextSwitchTo(saveMemoryContext);
	ActivePortal = saveActivePortal;
	if (saveResourceOwner == saveTopTransactionResourceOwner)
		CurrentResourceOwner = TopTransactionResourceOwner;
	else
		CurrentResourceOwner = saveResourceOwner;
	PortalContext = savePortalContext;

	PG_RE_THROW();
}
PG_END_TRY();


if (saveMemoryContext == saveTopTransactionContext)
	MemoryContextSwitchTo(TopTransactionContext);
else
	MemoryContextSwitchTo(saveMemoryContext);
ActivePortal = saveActivePortal;
if (saveResourceOwner == saveTopTransactionResourceOwner)
	CurrentResourceOwner = TopTransactionResourceOwner;
else
	CurrentResourceOwner = saveResourceOwner;
PortalContext = savePortalContext;


if (log_executor_stats && portal->strategy != PORTAL_MULTI_QUERY)
	ShowUsage("EXECUTOR STATISTICS");


TRACE_POSTGRESQL_QUERY_EXECUTE_DONE();

return result;

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

本节介绍PortalRun函数。PortalRun函数//src/include/tcop/pquery.hextern bool PortalRun(Portal portal, long count, bool isTopLevel, bool run_
PostgreSQL源码学习--调度器#14
2019-04-29

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

本节介绍ProcessQuery函数。相关数据结构//src/include/executor/execdesc.htypedef struct QueryDesc{/* These fields are provided by CreateQueryDesc
PostgreSQL源码学习--调度器#12
2016-10-26

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

本节介绍PortalRunMulti函数。PortalRunMulti函数static voidPortalRunMulti(Portal portal, bool isTopLevel, bool setHoldSnapshot, DestRecei
PostgreSQL源码学习--调度器#13
2017-12-22

PostgreSQL源码学习--执行器#7,8

本节介绍ExecProcNodeFirst函数和ExecProcNode函数。ExecProcNodeFirst函数//src/backend/executor/execProcnode.cstatic T
PostgreSQL源码学习--执行器#7,8
2016-08-14

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

本节介绍ExecutePlan函数相关数据结构typedef enum ScanDirection{BackwardScanDirection = -1,NoMovementScanDirection = 0,ForwardScanDirection = 1}
PostgreSQL源码学习--执行器#9
2018-01-07

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

本节介绍standard_ExecutorRun和ExecutorRun函数。standard_ExecutorRun函数//src/include/execurot/executor.hextern void standard_ExecutorRun(Que
PostgreSQL源码学习--执行器#10,11
2021-08-04

PostgreSQL源码学习(1)Page页

The Internals of PostgreSQL中对于存储的描述http://www.interdb.jp/pg/pgsql01.html#_1.2.每个表或索引都作为一个page数组存储于物理数据文件中(page大小默认为8k,编译时可以指定),单个的
PostgreSQL源码学习(1)Page页
2015-11-20

PostgreSQL源码学习--插入数据#6

本节介绍ExecModifyTable函数。相关数据结构typedef struct ModifyTableState{PlanStateps;CmdTypeoperation;/* INSERT
PostgreSQL源码学习--插入数据#6
2020-08-14

PostgreSQL源码学习--更新数据#3

本节介绍ExecUpdate函数。ExecUpdate函数static TupleTableSlot *ExecUpdate(ModifyTableState *mtstate, ItemPointer tupleid, HeapTuple oldtu
PostgreSQL源码学习--更新数据#3
2016-11-30

PostgreSQL源码学习--删除数据#0

以一条delete from test where a = 123;的SQL语句为例,跟踪删除数据的代码逻辑。(PG版本为12.2)删除数据主要的函数是heap_delete。查看调用栈:#0 heap_delete (relation=0x7f67ac24
PostgreSQL源码学习--删除数据#0
2015-03-25

PostgreSQL源码学习--更新数据#1,2

本节介绍heapam_tuple_update和table_tuple_update函数。heapam_tuple_update函数//src/backend/access/heap/heapam_handler.cstatic TM_Resultheapam
PostgreSQL源码学习--更新数据#1,2
2018-03-29

PostgreSQL源码学习--更新数据#0

以一条update test set b = "bcd" where a = 123;的SQL语句为例,跟踪更新数据的代码逻辑。(PG版本为12.2)删除数据主要的函数是heap_update。查看调用栈:#0 heap_update (relation=0
PostgreSQL源码学习--更新数据#0
2017-05-20

PostgreSQL源码学习--插入数据#4,5

本节介绍table_tuple_insert和ExecInsert函数。相关数据结构//src/include/utils/rel.htypedef struct RelationData{TupleDescrd_att;/* tupl
PostgreSQL源码学习--插入数据#4,5
2016-01-11

PostgreSQL源码学习--插入数据#2

本节介绍heap_insert函数的代码流程本节前置toast机制:https://www.postgresql.org/docs/12/storage-toast.html可见性映射表:https://www.postgresql.org/docs/12/s
PostgreSQL源码学习--插入数据#2
2020-02-11

PostgreSQL源码学习--插入数据#3

本节介绍heapam_tuple_insert函数的代码流程相关数据结构结构体中有些成员可能目前难以理解,暂时先列出来,先把当前用到的成员能搞明白就可以。// src/include/executor/tuptable.htypedef struct Tupl
PostgreSQL源码学习--插入数据#3
2014-10-19

PostgreSQL源码学习--删除数据#1,2

本节介绍heapam_tuple_delete和table_tuple_delete函数。heapam_tuple_delete函数//src/backend/access/heap/heapam_handler.cstatic TM_Resultheapam
PostgreSQL源码学习--删除数据#1,2
2020-08-27

PostgreSQL源码学习--删除数据#3

本节介绍ExecDelete函数。从表中删除时,tupleid标识要删除的元组,oldtuple为空;从视图中删除时,oldtuple传递给INSTEAD OF触发器标识要删除的内容,tupleid无效;从外部表中删除时,tupleid无效,fdw使用plan
PostgreSQL源码学习--删除数据#3
2020-01-09

PostgreSQL源码学习(2)插入数据#0

插入数据主要的实现在bufpage.c中,主要的函数是PageAddItemExtended。查看调用栈:#0 PageAddItemExtended (page=0x7fddcac3cd00 "", item=0x141f540 "34701",
PostgreSQL源码学习(2)插入数据#0
2019-10-17

PostgreSQL源码学习(3)插入数据#1

相关数据结构//src/interfaces/ecpg/preproc/type.htypedef int Buffer;HeapTupleData的结构已在前面
PostgreSQL源码学习(3)插入数据#1
2015-01-16

Go调度器学习之goroutine调度怎么创建

今天小编给大家分享一下Go调度器学习之goroutine调度怎么创建的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 协程
2023-07-05

编程热搜

目录