PostgreSQL 11中ALTER TABLE多父表继承及Apache AGE C函数问题
PostgreSQL 11 中 ALTER TABLE 多父表继承的实现问题
1. 是否支持 ALTER TABLE 单次添加多父表?
PostgreSQL 11 不支持通过单次 ALTER TABLE 命令添加多个父表。官方语法定义中,ALTER TABLE ... INHERIT parent_table 子句仅允许指定单个父表。若要实现多父表继承,需多次执行该命令,每次为目标表添加一个父表,示例语法如下:
ALTER TABLE child_table INHERIT parent_table1; ALTER TABLE child_table INHERIT parent_table2;
2. 你的C函数崩溃原因及修复
代码崩溃的核心问题是:AT_AddInherit 类型的 AlterTableCmd 中,def 字段要求指向单个 RangeVar 节点,而非 List 类型的父表列表。直接传入列表会导致类型不匹配,触发内存访问错误。
修复后的代码需遍历父表列表,为每个父表创建独立的 AlterTableCmd,再将所有命令批量传入 AlterTable:
static void alter_table_inherit(char *graph_name, char *label_name, char *schema_name, char *seq_name, Oid relid, List* parents) { ParseState *pstate; AlterTableStmt *tbl_stmt; RangeVar *rv; ListCell *lc; /* RangeVar represents the table being altered */ rv = makeRangeVar(schema_name, label_name, -1); pstate = make_parsestate(NULL); pstate->p_sourcetext = "(generated ALTER TABLE command)"; tbl_stmt = makeNode(AlterTableStmt); tbl_stmt->relation = rv; tbl_stmt->missing_ok = false; tbl_stmt->cmds = NIL; // 初始化命令列表为空 // 遍历父表列表,为每个父表创建单独的继承命令 foreach(lc, parents) { AlterTableCmd *tbl_cmd = makeNode(AlterTableCmd); tbl_cmd->subtype = AT_AddInherit; tbl_cmd->def = (Node *) lfirst(lc); // 每个命令对应单个父表的RangeVar tbl_stmt->cmds = lappend(tbl_stmt->cmds, tbl_cmd); } AlterTable(relid, AccessExclusiveLock, tbl_stmt); CommandCounterIncrement(); }
关键修复点:
- 初始化
tbl_stmt->cmds为NIL,避免未初始化列表的操作异常 - 通过
foreach遍历父表列表,为每个父表生成独立的AlterTableCmd - 每个
tbl_cmd->def赋值为单个父表的RangeVar,而非整个父表列表
PostgreSQL 会在同一事务中批量执行所有传入的 AlterTableCmd,无需多次调用 AlterTable 函数。
内容的提问来源于stack exchange,提问作者Marco Souza
相关产品推荐
相关产品推荐

