2016-10-05 13 views
1

PostgreSQL 9.5のC関数で書いたARR_ELEMTYPE(PG_GETARG_ARRAYTYPE_P(0))ここで(0)は複合型の配列(つまりCREATE TYPEで定義されています)が返され、28642010が返されます。この番号はソースコードには記載されておらず、文書化されていません。PostgreSQLの複合型の配列の正しいOIDは何ですか?

今日、私はPG 9.6にアップグレードし、私のC関数はエラーを投げました。 elemtypeは16396として報告されるようになりました。これはソースコードには表示されません。

私は、wikiとソースの両方で10進数と16進数の両方の数字を検索しました。

a)ソースコードにOIDが定義されておらず、b)PGが変更されて番号が変更されていることがわかりません。

ここに何か不足していますか?

+1

'typname =」pg_typeシステムカタログからOIDを選択し... 「? –

+0

うん、それは新しい番号、16396を与える。 – IamIC

+0

私はそれを考え出したと思う。そのOIDは、9.6の変更のためにDBを再作成する必要があったために異なります。これは、Cで一貫性を持たせることを非常に面白くするでしょう。 – IamIC

答えて

1

タイプを含むデータベースに作成するオブジェクトのOIDは、システムによって割り当てられ、データベースをダンプして別のオブジェクトに復元すると変更されます。その名前とそのスキーマのOID。からC関数にタイプのOIDが把握する

、あなたはこのような何か行うことができます。

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

ありがとうございます。それはSPIを使ってそれを照会するよりもはるかにエレガントです。 – IamIC

+0

私は今、このコードでこれを試しています。私は、最初のパラメータをどの値に設定するかについてはっきりしていません。例を挙げてください。 – IamIC

+0

私はソースを調べ、最初のパラメータを "cacheId"とします。私はそれが何であるか分かりません。また、この関数はtypeNamespaceを必要とするため、これに似た関数を使用することを確認する必要があります。 – IamIC

関連する問題