postgres源码解析40 表创建执行全流程梳理--4
在PostgreSQL中,表的创建是一个多步骤的过程,涉及到解析SQL语句、语法分析、语义分析、执行等环节。以下是表创建的核心函数和流程:
/* 核心函数:处理表创建的SQL命令 */
void
ProcessUtilitySlow(PlannedStmt *pstmt, const char *queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, char *completionTag)
{
/* ... 省略其他代码 ... */
switch (nodeTag(parsetree))
{
case T_CreateStmt:
ExecuteCreateStmt((CreateStmt *) parsetree, queryString, params, dest, completionTag);
break;
/* ... 省略其他命令处理 ... */
}
/* ... 省略其他代码 ... */
}
/* 执行CREATE TABLE命令 */
static void
ExecuteCreateStmt(CreateStmt *stmt, const char *queryString, ParamListInfo params, DestReceiver *dest, char *completionTag)
{
/* ... 省略参数处理和权限检查代码 ... */
/* 真正执行表创建的函数 */
ProcessUtility(parsetree, queryString, PROCESS_UTILITY_SUBCOMMAND, params, NULL, None_Receiver, NULL);
/* ... 省略其他代码 ... */
}
/* 分析和执行SQL命令 */
void
ProcessUtility(PlannedStmt *pstmt, const char *queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, char *completionTag)
{
/* ... 省略参数处理和语法分析代码 ... */
/* 执行命令 */
standard_ProcessUtility(pstmt, queryString, context, params, queryEnv, dest, completionTag);
/* ... 省略其他代码 ... */
}
/* 标准的处理函数,实际执行命令 */
static void
standard_ProcessUtility(PlannedStmt *pstmt, const char *queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, char *completionTag)
{
/* ... 省略参数处理和语法分析代码 ... */
/* 执行命令 */
if (IsA(pstmt->utilityStmt, CreateStmt))
{
CreateCommand((CreateStmt *) pstmt->utilityStmt, dest);
}
/* ... 省略其他命令处理 ... */
}
/* 创建表的函数 */
void
CreateCommand(CreateStmt *stmt, DestReceiver *dest)
{
/* ... 省略参数处理和语法分析代码 ... */
/* 执行表创建 */
PerformCreateTable(stmt, queryString, oncommit, tableSpaceId, dest);
/* ... 省略其他代码 ... */
}
/* 执行表的创建 */
static void
PerformCreateTable(CreateStmt *stm, char *queryString, Oid oncommit, Oid tableSpaceId, DestReceiver *dest)
{
/* ... 省略参数处理和语法分析代码 ... */
/* 创建表 */
relid = heap_create_with_catalog(relname,
评论已关闭