在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的变化而变化。
我在这里错过了什么吗?
答案 0 :(得分:1)
您在数据库中创建的任何对象(包括类型)的Oid由系统分配,如果您转储数据库并将其还原到另一个数据库,则会更改。
要从其名称和模式的Oid中找出C函数中类型的Oid,您可以执行以下操作:
typoid = GetSysCacheOid2(TYPENAMENSP,
CStringGetDatum(typeName),
ObjectIdGetDatum(typeNamespace));