PostgreSQL中复合类型数组的正确OID是什么?

时间:2016-10-05 09:37:36

标签: postgresql postgresql-9.5 postgresql-9.6

在PostgreSQL 9.5下,在我编写的C函数中,ARR_ELEMTYPE(PG_GETARG_ARRAYTYPE_P(0))其中(0)是一个复合类型的数组(即由CREATE TYPE定义),返回28642010.这个数字没有出现在源代码并且没有记录。

今天,我升级到PG 9.6,我的C函数出现了错误。 elemtype现在报告为16396.这也没有出现在源代码中。

我在wiki和源代码中搜索了十进制和十六进制的数字。

我看不出如何a)源代码中没有定义OID,b)数量随PG的变化而变化。

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

您在数据库中创建的任何对象(包括类型)的Oid由系统分配,如果您转储数据库并将其还原到另一个数据库,则会更改。

要从其名称和模式的Oid中找出C函数中类型的Oid,您可以执行以下操作:

typoid = GetSysCacheOid2(TYPENAMENSP,
                         CStringGetDatum(typeName),
                         ObjectIdGetDatum(typeNamespace));