ltgtt_create_temp_table 实现逻辑分析
本文主要分析 lightdb 全局临时表实现时使用到的函数 ltgtt_create_temp_table
.
- 通过
makeNode
函数创建TableLikeClause
和CreateStmt
.
TableLikeClause 对应上面的create table lt_gtt_schema_123456_6.g_foo (like public.g_foo);
(like public.g_foo)
; CreateStmt 对应上面整个 sql 语句。 - 创建上面的 schema 名字并赋权。类似执行:
上面的两条 sql 语句,在 lightdb/postgresql 内部,可以通过函数create schema lt_gtt_schema_123456_6; GRANT ALL ON SCHEMA lt_gtt_schema_123456_6 TO public;
NamespaceCreate
和ProcessUtility
函数实现。这两个函数分别在 ltgtt_create_user_temp_schema 和 ltgtt_grant_user_temp_schema 中被调用。 - 关联一些数据结构字段
lt_gtt_schema_123456_6.g_foo
用一个RangeVar
结构体变量 a 记录;
public.g_foo
用另一个RangeVar
结构体变量 b 记录;
like public.g_foo
用TableLikeClause.relation = b
记录;
将 a 变量绑定到CreateStmt
的 relation 字段上;
将 TableLikeClause 变量绑定到 CreateStmt 的 tableElts 字段上;
将 CreateStmt->relation->relpersistence 的值设置为RELPERSISTENCE_UNLOGGED
.
等等。。。 - 接下来,代码中还使用了
transformCreateStmt
处理CreateStmt
. 该函数待以后研究。 - 遍历第 4 步生成的一组 CreateStmt,对于每一个 CreateStmt,根据创建类型调用 PostgreSQL 内部不同的函数处理。
- 如果是
create table
语句,就调用DefineRelation
建表; - 如果是
create index
语句,就调用DefineIndex
建索引; - 如果是 TableLikeClause,则调用
expandTableLikeClause
获取更多的CreateStmt
- ...
- 如果是
第 4, 5 步骤中涉及到的更底层的 PostgreSQL 的函数,如:transformCreateStmt, DefineRelation 函数将在后续文章介绍。
posted on 2023-06-25 20:51 winter-loo 阅读(20) 评论(0) 编辑 收藏 举报