ltgtt_create_temp_table 实现逻辑分析

本文主要分析 lightdb 全局临时表实现时使用到的函数 ltgtt_create_temp_table.

  1. 通过 makeNode 函数创建 TableLikeClauseCreateStmt.
    create table lt_gtt_schema_123456_6.g_foo (like public.g_foo);
    
    TableLikeClause 对应上面的 (like public.g_foo); CreateStmt 对应上面整个 sql 语句。
  2. 创建上面的 schema 名字并赋权。类似执行:
    create schema lt_gtt_schema_123456_6;
    GRANT ALL ON SCHEMA lt_gtt_schema_123456_6 TO public;
    
    上面的两条 sql 语句,在 lightdb/postgresql 内部,可以通过函数 NamespaceCreateProcessUtility 函数实现。这两个函数分别在 ltgtt_create_user_temp_schema 和 ltgtt_grant_user_temp_schema 中被调用。
  3. 关联一些数据结构字段
    lt_gtt_schema_123456_6.g_foo 用一个 RangeVar 结构体变量 a 记录;
    public.g_foo 用另一个 RangeVar 结构体变量 b 记录;
    like public.g_fooTableLikeClause.relation = b 记录;
    将 a 变量绑定到 CreateStmt 的 relation 字段上;
    将 TableLikeClause 变量绑定到 CreateStmt 的 tableElts 字段上;
    将 CreateStmt->relation->relpersistence 的值设置为 RELPERSISTENCE_UNLOGGED.
    等等。。。
  4. 接下来,代码中还使用了 transformCreateStmt 处理 CreateStmt. 该函数待以后研究。
  5. 遍历第 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编辑  收藏  举报

导航