文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2019-04-29 19:50

关注

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

本节介绍PortalRun函数。

PortalRun函数

//src/include/tcop/pquery.h

extern bool PortalRun(Portal portal, long count, bool isTopLevel,
				  bool run_once, DestReceiver *dest, DestReceiver *altdest,
				  char *completionTag);
//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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯