加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL 执行Drop Table等命令型SQL的总体流程

发布时间:2020-12-13 17:22:15 所属栏目:百科 来源:网络整理
导读:DROP命令(Commands)实现: /* * Drop one or more objects. * * We don't currently handle all object types here. Relations,for example,* require special handling,because (for example) indexes have additional * locking requirements. * * We lo

DROP命令(Commands)实现:

/*
 * Drop one or more objects.
 *
 * We don't currently handle all object types here.  Relations,for example,* require special handling,because (for example) indexes have additional
 * locking requirements.
 *
 * We look up all the objects first,and then delete them in a single
 * performMultipleDeletions() call.  This avoids unnecessary DROP RESTRICT
 * errors if there are dependencies between them.
 */
void
RemoveObjects(DropStmt *stmt)




/*
 * Dispatch function for DropStmt
 */
static void
ExecDropStmt(DropStmt *stmt,bool isTopLevel)
{
	switch (stmt->removeType)
	{
		case OBJECT_INDEX:
			if (stmt->concurrent)
				PreventTransactionChain(isTopLevel,"DROP INDEX CONCURRENTLY");
			/* fall through */


		case OBJECT_TABLE:
		case OBJECT_SEQUENCE:
		case OBJECT_VIEW:
		case OBJECT_MATVIEW:
		case OBJECT_FOREIGN_TABLE:
			RemoveRelations(stmt);
			break;
		default:
			RemoveObjects(stmt);
			break;
	}
}


/*
 * standard_ProcessUtility itself deals only with utility commands for
 * which we do not provide event trigger support.  Commands that do have
 * such support are passed down to ProcessUtilitySlow,which contains the
 * necessary infrastructure for such triggers.
 *
 * This division is not just for performance: it's critical that the
 * event trigger code not be invoked when doing START TRANSACTION for
 * example,because we might need to refresh the event trigger cache,* which requires being in a valid transaction.
 */
void
standard_ProcessUtility(Node *parsetree,const char *queryString,ProcessUtilityContext context,ParamListInfo params,DestReceiver *dest,char *completionTag)
/*
 * ProcessUtility
 *		general utility function invoker
 *
 *	parsetree: the parse tree for the utility statement
 *	queryString: original source text of command
 *	context: identifies source of statement (toplevel client command,*		non-toplevel client command,subcommand of a larger utility command)
 *	params: parameters to use during execution
 *	dest: where to send results
 *	completionTag: points to a buffer of size COMPLETION_TAG_BUFSIZE
 *		in which to store a command completion status string.
 *
 * Notes: as of PG 8.4,caller MUST supply a queryString; it is not
 * allowed anymore to pass NULL.  (If you really don't have source text,* you can pass a constant string,perhaps "(query not available)".)
 *
 * completionTag is only set nonempty if we want to return a nondefault status.
 *
 * completionTag may be NULL if caller doesn't want a status string.
 */
void
ProcessUtility(Node *parsetree,char *completionTag)


详细调用栈如下:

#0  ExecDropStmt (stmt=0x17e9b40,isTopLevel=1 '01') at utility.c:1349
#1  0x0000000000759457 in ProcessUtilitySlow (parsetree=0x17e9b40,queryString=0x17e90b0 "drop table t1;",context=PROCESS_UTILITY_TOPLEVEL,params=0x0,dest=0x17e9ea0,completionTag=0x7fff06aee670 "") at utility.c:1296
#2  0x0000000000758849 in standard_ProcessUtility (parsetree=0x17e9b40,completionTag=0x7fff06aee670 "") at utility.c:792
#3  0x0000000000757c88 in ProcessUtility (parsetree=0x17e9b40,completionTag=0x7fff06aee670 "") at utility.c:310
#4  0x0000000000756e92 in PortalRunUtility (portal=0x1822d70,utilityStmt=0x17e9b40,isTopLevel=1 '01',completionTag=0x7fff06aee670 "")
    at pquery.c:1187
#5  0x0000000000757048 in PortalRunMulti (portal=0x1822d70,altdest=0x17e9ea0,completionTag=0x7fff06aee670 "") at pquery.c:1318
#6  0x000000000075661c in PortalRun (portal=0x1822d70,count=9223372036854775807,completionTag=0x7fff06aee670 "") at pquery.c:816
#7  0x0000000000750944 in exec_simple_query (query_string=0x17e90b0 "drop table t1;") at postgres.c:1045
#8  0x0000000000754967 in PostgresMain (argc=1,argv=0x1784148,dbname=0x1784130 "wzy",username=0x1784110 "xiaochu.yh") at postgres.c:4004
#9  0x00000000006e80ba in BackendRun (port=0x17a3e00) at postmaster.c:4117
#10 0x00000000006e77fd in BackendStartup (port=0x17a3e00) at postmaster.c:3791
#11 0x00000000006e41b2 in ServerLoop () at postmaster.c:1570
#12 0x00000000006e392e in PostmasterMain (argc=3,argv=0x1783380) at postmaster.c:1223
#13 0x000000000064d3d3 in main (argc=3,argv=0x1783380) at main.c:225

Portal,入口的意思。Postgre中,Portal是个抽象概念,它表示一个正在运行或可运行Query的执行状态。


对于可以生成执行计划的SQL语句(planable SQL),都通过ProcessQuery来处理;对于不能生成执行计划的SQL语句,取名为命令型SQL(Command SQL),都通过PortalRunUtility来处理。



参考:

1. gdb使用http://blog.chinaunix.net/uid-20788636-id-1841301.html

2. postgre编译安装启动http://blog.chinaunix.net/uid-11161675-id-2903295.html

3. postgre官方文档http://www.postgresql.org/docs/current/static/index.html

4. 如何做postgre源码分析http://blog.csdn.net/anzelin_ruc/article/details/8622770

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读