PostgreSQL 執行Drop Table等命令型SQL的總體流程,postgresqldrop

來源:互聯網
上載者:User

PostgreSQL 執行Drop Table等命令型SQL的總體流程,postgresqldrop

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. */voidRemoveObjects(DropStmt *stmt)/* * Dispatch function for DropStmt */static voidExecDropStmt(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. */voidstandard_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. */voidProcessUtility(Node *parsetree,   const char *queryString,   ProcessUtilityContext context,   ParamListInfo params,   DestReceiver *dest,   char *completionTag)


詳細調用棧如下:

#0  ExecDropStmt (stmt=0x17e9b40, isTopLevel=1 '\001') 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, queryString=0x17e90b0 "drop table t1;", context=PROCESS_UTILITY_TOPLEVEL, params=0x0,     dest=0x17e9ea0, completionTag=0x7fff06aee670 "") at utility.c:792#3  0x0000000000757c88 in ProcessUtility (parsetree=0x17e9b40, queryString=0x17e90b0 "drop table t1;", context=PROCESS_UTILITY_TOPLEVEL, params=0x0, dest=0x17e9ea0,     completionTag=0x7fff06aee670 "") at utility.c:310#4  0x0000000000756e92 in PortalRunUtility (portal=0x1822d70, utilityStmt=0x17e9b40, isTopLevel=1 '\001', dest=0x17e9ea0, completionTag=0x7fff06aee670 "")    at pquery.c:1187#5  0x0000000000757048 in PortalRunMulti (portal=0x1822d70, isTopLevel=1 '\001', dest=0x17e9ea0, altdest=0x17e9ea0, completionTag=0x7fff06aee670 "") at pquery.c:1318#6  0x000000000075661c in PortalRun (portal=0x1822d70, count=9223372036854775807, isTopLevel=1 '\001', dest=0x17e9ea0, altdest=0x17e9ea0,     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



相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.