キャストは本当のキャストではありません。便利な構文を(ab)使用しているだけです。 ラージオブジェクト(LO) 個別に保存されているバックグラウンドで作成され、それを参照するOIDが返されます。
返されるOIDは、基本的にシステムテーブルのPKへのFKです pg_largeobject
。
CREATE TABLE 機能や疑似キャストから完全に独立しています。
CREATE TABLE bytea_to_lo (
largeObj lo
);
これは、上記で作成した割り当てキャストの典型的な使用例であり、引用するのを忘れた次の行から明らかになります。
INSERT INTO bytea_to_lo VALUES (DECODE('00AB','hex'));
ここで何が起こりますか?
データ型lo 基本タイプoid上のドメインです 、追加モジュール loによって作成されます
(GraceBatumbyaのブログエンティティ
)。 ドキュメントごと:
関数decode()
byteaを返します 。 INSERT ステートメントはbyteaを割り当てます 列largeObjの値 、タイプloへの割り当てキャストをトリガーします 、そしてそれが上記のキャストの出番です。
警告/修正/更新
ブログエントリはずさんで、今では時代遅れです。
-
わざわざ言及しないでください(ドキュメントごと ):
事実上、あなたはスーパーユーザーでなければなりません。
-
CREATE TABLEのタイプミス :列名とタイプが逆になっています。 -
関数の定義は冗長で非効率的です。これはより良いでしょう(Postgres 9.3 の場合) 以上):
CREATE OR REPLACE FUNCTION blob_write(bytea) RETURNS oid AS $func$ DECLARE loid oid := lo_create(0); lfd int := lo_open(loid,131072); -- = 2^17 = x2000 -- symbolic constant defined in the header file libpq/libpq-fs.h -- #define INV_WRITE 0x00020000 BEGIN PERFORM lowrite(lfd, $1); PERFORM lo_close(lfd); RETURN loid; END $func$ LANGUAGE plpgsql VOLATILE STRICT;
ビルトインがあります機能 これについてはPostgres9.4 。代わりにそれを使用してください:
lo_from_bytea(loid oid, string bytea)
リリースノート から :
CREATE CASTの場合 (ドキュメントごと
):
byteaのみのオーバーロードされたバリアントをお勧めします パラメータ:
CREATE OR REPLACE FUNCTION lo_from_bytea(bytea)
RETURNS oid LANGUAGE sql AS
'SELECT lo_from_bytea(0, $1)';
CREATE CAST (bytea AS oid) WITH FUNCTION lo_from_bytea(bytea) AS ASSIGNMENT;
疑似キャストにはかなり大きな副作用があるので、それをASSIGNMENTにすることは確信できません。 キャスト。私はおそらく明示的のみから始めるでしょう: