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

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

PostgreSQL源码学习--调度器#13 2017-12-22 01:12:39 921人浏览 猪猪侠
摘要

本节介绍PortalRunMulti函数。 PortalRunMulti函数 static void PortalRunMulti(Portal portal, bool isTopLevel, bool setHoldSnaps

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

本节介绍PortalRunMulti函数。

PortalRunMulti函数

static void
PortalRunMulti(Portal portal,
		   bool isTopLevel, bool setHoldSnapshot,
		   DestReceiver *dest, DestReceiver *altdest,
		   char *completionTag);
//src/backend/tcop/pquery.c


if (dest->mydest == DestRemoteExecute)
	dest = None_Receiver;
if (altdest->mydest == DestRemoteExecute)
	altdest = None_Receiver;


foreach(stmtlist_item, portal->stmts)
{
	PlannedStmt *pstmt = lfirst_node(PlannedStmt, stmtlist_item);
	
	
	CHECK_FOR_INTERRUPTS();
	
	
	if (pstmt->utilityStmt == NULL)
	{
		
		TRACE_POSTGRESQL_QUERY_EXECUTE_START();
		
		
		if (log_executor_stats)
			ResetUsage();
		
		
		if (!active_snapshot_set)
		{
			Snapshot	snapshot = GetTransactionSnapshot();
			
			
			if (setHoldSnapshot)
			{
				snapshot = RegisterSnapshot(snapshot);
				portal->holdSnapshot = snapshot;
			}
			
			
			PushCopiedSnapshot(snapshot);
			active_snapshot_set = true;
		}
		UpdateActiveSnapshotCommandId();
		
		
		if (pstmt->canSetTag)
		{
			
			ProcessQuery(pstmt,
					 portal->sourceText,
					 portal->portalParams,
					 portal->queryEnv,
					 dest, completionTag);
		}
		else
		{
			
			ProcessQuery(pstmt,
					 portal->sourceText,
					 portal->portalParams,
					 portal->queryEnv,
					 altdest, NULL);
		}
		
		
		if (log_executor_stats)
			ShowUsage("EXECUTOR STATISTICS");

		
		TRACE_POSTGRESQL_QUERY_EXECUTE_DONE();
	}
	
	else
	{
		if (pstmt->canSetTag)
		{
			Assert(!active_snapshot_set);
			
			PortalRunUtility(portal, pstmt, isTopLevel, false,
							 dest, completionTag);
		}
		else
		{
			Assert(IsA(pstmt->utilityStmt, NotifyStmt));
			
			PortalRunUtility(portal, pstmt, isTopLevel, false,
							 altdest, NULL);
		}
	}
	
	
	if (lnext(stmtlist_item) != NULL)
		CommandCounterIncrement();
	
	
	Assert(portal->portalContext == CurrentMemoryContext);

	MemoryContextDeleteChildren(portal->portalContext);
}


if (active_snapshot_set)
	PopActiveSnapshot();


if (completionTag && completionTag[0] == "")
{
	if (portal->commandTag)
		strcpy(completionTag, portal->commandTag);
	if (strcmp(completionTag, "SELECT") == 0)
		sprintf(completionTag, "SELECT 0 0");
	else if (strcmp(completionTag, "INSERT") == 0)
		strcpy(completionTag, "INSERT 0 0");
	else if (strcmp(completionTag, "UPDATE") == 0)
		strcpy(completionTag, "UPDATE 0");
	else if (strcmp(completionTag, "DELETE") == 0)
		strcpy(completionTag, "DELETE 0");
}
您可能感兴趣的文档:

--结束END--

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

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

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

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

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

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

  • 微信公众号

  • 商务合作