首页 > 数据库 > 国内数据库 > 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_with_catalog 主要完成表物理文件的创建和表元信息注册到系统表中,涉及系统包包括pg_class ,pg_attribute ,pg_depend ,pg_object ,pg_type ,pg_index 和pg_partition 。

其中heap_create 内部首先调用了RelationBuildLocalRelation 创建RelationData ,并加入到relCache ,RelationData 表示一个表的元信息,这些信息都可以由系统表元组中的信息构造得到。然后根据这些信息通过调用RelalionCreateStorage 函数创建物理文件。
附 :创建表create table 的函数调用栈

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70019768/viewspace-2922707/ ,如需转载,请注明出处,否则将追究法律责任。