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 阅读(50) 评论(0) 收藏 举报
浙公网安备 33010602011771号