You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PostgreSQL的C函数中如何通过类型Oid判断是否为复合类型

判断PostgreSQL类型Oid是否为复合类型的C语言实现方案

嘿,刚好做过类似的需求,给你两个靠谱的解决办法,直接在触发器里就能用:

方法一:直接读取pg_type系统表(底层实现)

PostgreSQL的复合类型在pg_type表中对应的typtype字段值是'c'(对应宏TYPTYPE_COMPOSITE)。你可以通过类型Oid获取pg_type的元组,然后解析这个字段:

#include "catalog/pg_type.h"
#include "utils/syscache.h"

// 假设你已经拿到了要检查的类型Oid:attr_oid
HeapTuple type_tuple = get_type_tuple(attr_oid);
if (!HeapTupleIsValid(type_tuple)) {
    elog(ERROR, "无法找到OID为%u的类型", attr_oid);
}

// 解析pg_type元组的结构
FormData_pg_type *type_form = (FormData_pg_type *)GETSTRUCT(type_tuple);

// 判断是否为复合类型
if (type_form->typtype == TYPTYPE_COMPOSITE) {
    // 这里写复合类型的处理逻辑
    elog(LOG, "OID %u对应的是复合类型", attr_oid);
} else {
    elog(LOG, "OID %u不是复合类型", attr_oid);
}

// 记得释放系统缓存的元组
ReleaseSysCache(type_tuple);

方法二:用封装好的工具函数(更简便)

PostgreSQL已经提供了现成的工具函数is_composite_type(),直接调用就能得到结果,不用自己操作元组,代码更简洁:

#include "utils/lsyscache.h"

// 假设attr_oid是你要检查的类型Oid
if (is_composite_type(attr_oid)) {
    // 复合类型处理逻辑
    elog(LOG, "OID %u是复合类型", attr_oid);
} else {
    elog(LOG, "OID %u不是复合类型", attr_oid);
}

这个函数内部已经封装了读取pg_type、检查typtype的逻辑,还帮你处理了缓存管理,推荐优先用这个。

注意事项

  • 确保你的代码包含了对应的头文件(上面示例里已经列出来了);
  • 在触发器函数中调用这些函数时,要注意上下文的合法性,比如类型OID必须是有效的;
  • 如果是自定义复合类型,只要它正确注册到pg_type里,这两种方法都能识别到。

内容的提问来源于stack exchange,提问作者Shore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:30:47