在 PostgreSQL 中,如何根据 C 函数中的类型 Oid 识别类型是复合类型?

Posted

技术标签:

【中文标题】在 PostgreSQL 中,如何根据 C 函数中的类型 Oid 识别类型是复合类型?【英文标题】:In PostgreSQL, How can I identify a type is composite based on its type Oid in C function? 【发布时间】:2018-05-14 07:42:08 【问题描述】:

我正在用 PostgreSQL 中的 C 编写一个触发器,它需要根据 pg_type 中的 Oid 来识别类型是否为复合类型。

它是少数不包含在 FormData_pg_attribute 结构中的信息之一。

有人可以帮忙吗?非常感谢。

【问题讨论】:

【参考方案1】:

你可以这样继续(未经测试):

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

bool is_composite(Oid typoid)

    HeapTuple   tup;
    Form_pg_type typtup;
    bool result;

    tup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typoid));
    if (!HeapTupleIsValid(tup))
        elog(ERROR, "cache lookup failed for type %u", basetypoid);
    typtup = (Form_pg_type) GETSTRUCT(tup);

    result = (typtup->typtype == TYPTYPE_COMPOSITE);

    ReleaseSysCache(tup);

    return result;

【讨论】:

以上是关于在 PostgreSQL 中,如何根据 C 函数中的类型 Oid 识别类型是复合类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 postgresql 函数中将数组插入表中?

如何让 PostgreSQL 加载依赖 DLL 的 C 模块?

PostgreSQL函数如何返回数据集 [转]

在 PostgreSQL 函数中基于 JSON 更新表

如何在postgresql中识别函数是不是正在执行

如何在 PostgreSQL 中默认撤销函数的执行权限