广告
返回顶部
首页 > 资讯 > 数据库 >PostgreSQL源码学习--调度器#14
  • 947
分享到

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

PostgreSQL源码学习--调度器#14 2019-04-29 19:04:49 947人浏览 无得
摘要

本节介绍PortalRun函数。 PortalRun函数 //src/include/tcop/pquery.h extern bool PortalRun(Portal portal, long count, bool isTopLev

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;
您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL源码学习--调度器#14

本文链接: https://www.lsjlt.com/news/6685.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作