PostgreSQL executes the overall process of Executing command-type SQL statements such as Drop Table, postgresqldrop
The DROP command (Commands) Implementation:
/* * 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)
The detailed call stack is as follows:
#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. In Postgre, Portal is an abstract concept, which indicates the execution status of a running or runable Query.
The planable SQL statements that can generate execution plans are all processed through ProcessQuery. For SQL statements that cannot generate execution plans, the Command SQL statement is called ), all are handled through PortalRunUtility.
Refer:
1. gdb uses http://blog.chinaunix.net/uid-20788636-id-1841301.html
2. postgre compilation installation start http://blog.chinaunix.net/uid-11161675-id-2903295.html
3. postgre official document http://www.postgresql.org/docs/current/static/index.html
4. How to do postgre source code analysis http://blog.csdn.net/anzelin_ruc/article/details/8622770