openGauss 内核分析(九):数据库表的创建过程
openGauss 内核分析(九):数据库表的创建过程
除了 DML 之外的所有查询都通过 ProcessUtility 模块来执行,包括了各类 DDL 语句、事务相关语句、游标相关语句等。上层调用函数为 exec_simple_query 函数,其中 PortalStart 函数和 PortalDrop 函数部分较为简单。核心函数是 PortalRun 函数下层调用的 standard_ProcessUtility 函数,该函数通过 switch case 语句处理了各种类型的查询语句,包括事务相关查询、游标相关查询、schema 相关操作、表空间相关操作、表定义相关操作等。
standard_ProcessUtility 函数会根据 nodeTag(parsetree)的值来确定 sql 的操作类型,create table 一般都是进入 T_CreateStmt 分支,调用 CreateCommand 函数。
CreateCommand 函数先解析 parse_tree 获取 stmt,如果 stmt 为空则表明表已经存在。如果 stmt 不为空对 stmts 进行遍历,如果是 CreateStmt 就调用 DefineRelation。AlterTableCreateToastTable 判断是否需要创建 toast 表并创建,AlterCStoreCreateTables 判断是否需要创建列存表并创建。
DefineRelation 函数获取到表名 relname、名字空间 relnamespace、表空间 reltablespace、表类型 relkind 和 relpersistence 等信息后调用 heap_create_with_catalog 创建 relation。
其中 heap_create 内部首先调用了 RelationBuildLocalRelation 创建 RelationData,并加入到 relCache,RelationData 表示一个表的元信息,这些信息都可以由系统表元组中的信息构造得到。然后根据这些信息通过调用 RelalionCreateStorage 函数创建物理文件。heap_create_with_catalog 主要完成表物理文件的创建和表元信息注册到系统表中,涉及系统包包括 pg_class,pg_attribute,pg_depend,pg_object,pg_type,pg_index 和 pg_partition。
附:创建表 create table 的函数调用栈
评论