2016-10-05 2 views
1

В PostgreSQL 9.5 в C-функции я написал: ARR_ELEMTYPE(PG_GETARG_ARRAYTYPE_P(0)) где (0) - это массив составного типа (т. Е. Определенный CREATE TYPE), возвращенный 28642010. Это число не отображается в исходном коде и недокументировано.Каков правильный OID для массива композитного типа в PostgreSQL?

Сегодня я обновился до PG 9.6, а функция C сменила ошибку. Элемент теперь объявлен как 16396. Это также не отображается в исходном коде.

Я искал оба числа в десятичной и шестнадцатеричной форме как в вики, так и в источнике.

Я не вижу, как a) OID не определен в исходном коде и b) число изменяется с изменением PG.

Я что-то упустил?

+1

'выберите подъязычная из pg_type где typname =» .. .''? –

+0

Yup, что дает новый номер, 16396. – IamIC

+0

Думаю, я понял. Это OID меняется, потому что БД пришлось воссоздать из-за изменений в 9.6. Это сделало бы очень интересным сделать это последовательным в C. – IamIC

ответ

1

Oid любого объекта, созданного в базе данных, включая тип, присваивается системой и будет изменяться, если вы сбросите базу данных и восстановите ее на другую.

Чтобы выяснить OID для типа в функции C от его имени и OID его схемы, вы можете сделать что-то вроде этого:

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

Спасибо. Это гораздо более элегантно, если использовать SPI для его запроса. – IamIC

+0

Я просто пытаюсь сделать это в коде. Я не понимаю, какое значение нужно поставить для первого параметра. Не могли бы вы привести пример, пожалуйста? – IamIC

+0

Я смотрю в источнике, и он дает первый параметр как «cacheId». Я не уверен, что это. Кроме того, поскольку для этой функции требуется пространство имен типов, наверняка мне нужно будет посмотреть, как использовать эту функцию? – IamIC

Смежные вопросы