在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
相关产品推荐
相关产品推荐

