キャストは本当のキャストではありません。便利な構文を(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
にすることは確信できません。 キャスト。私はおそらく明示的のみから始めるでしょう: