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

What's the correct OID for an array of composite type in PostgreSQL?

在 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 的变化而变化。

我是不是漏掉了什么?

您在数据库中创建的任何对象的 Oid,包括类型,都是由系统分配的,如果您转储数据库并将其恢复到另一个数据库,它会发生变化。

要从名称和模式的 Oid 中找出 C 函数中类型的 Oid,您可以这样做:

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