3

CでPostgreSQLの拡張機能を作成していますが、UDFでhstoreを使用する必要があります。(pgxcを使用して)エラーなしでビルドできますが、SQLクエリで関数を使用できません。

試しましPG_LIBS=hstoreたが、ライブラリの読み込み中に未定義の参照エラーが発生しました。

次の試みはSHLIB_LINK=-L/usr/lib/postgresql/9.1/lib -lhstore(libhstore.soはシステムに存在せず、hstore.soのみであるため、symとハードリンクで試しました)、

psql:libname.sql:69: ERROR:  could not load library
"/usr/lib/postgresql/9.1/lib/libname.so": libhstore.so: cannot open shared 
object file: No such file or directory
4

1 に答える 1

5

メモリから、hstoreCAPIの多くを公開しません。サーバープログラミングインターフェイス(SPI)を介して、C拡張機能を介してSQLレベルのインターフェイスを使用して使用する必要があります。更新:または、Tom Laneがメーリングリストで指摘しているようにfmgr、SPIを使用して完全なSQLステートメントを実行するのではなく、を使用して公開するSQL関数を呼び出します。UPDATE2:もう1つのオプションはload_external_function("extension", "symbol")、C関数を直接使用することです。を参照してくださいfmgr.h

使用しようとしている関数のほとんどはhstore宣言されstaticます(したがって、それらはhstoreモジュールに対してローカルです)。これが、おそらく未定義の参照を取得する理由です。hstore.hマクロまたはextern関数として宣言されているもののみを使用できます。hstore_io.c直接Cリンケージを介して(たとえば)で見つけた関数を呼び出すことはできません。

PG_LIBSリンクする共有ライブラリを指定できますが、hstore.soコンパイル中にリンクすることを目的とした一般的な共有ライブラリではありません。dlopen()これは、サーバーによって編集されることを目的としたPostgreSQL拡張モジュールです。別の拡張モジュールにリンクしている拡張モジュールが実際にサポートされているとは思いません。つまり、externかなりのハッキングなしでは、おそらく関数を使用することさえできないということです。

SPI、、、fmgrまたはを使用しload_external_functionます。

使用しload_external_functionている場合は、メモリコンテキストやその他の呼び出しコンテキストを管理する必要があります。その使用例を見つけてください。

見る:

于 2012-11-09T05:47:06.213 に答える