LoginSignup
1
0

More than 5 years have passed since last update.

postgresqlのpg_node_treeという型を解釈したい。した。

Last updated at Posted at 2017-02-17
a.sql
-- Function: get_config(text)

-- DROP FUNCTION config(text);

CREATE OR REPLACE FUNCTION config(k text DEFAULT 'test'::text)
  RETURNS text AS
$BODY$
    DECLARE v text;

    BEGIN
        --
            EXECUTE 'SELECT val FROM config WHERE key = $1;'
            USING   k
            INTO    v;
        --
            return v;
    END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION config(text)
  OWNER TO todanano;

こんな関数を作る。引数はデフォルト値が設定されている。

pg_procをselectして、このデフォルト値を確認すると、以下の内容が得られる。

"({CONST :consttype 25 :consttypmod -1 :constlen -1 :constbyval false :constisnull false :location 118 :constvalue 8 [ 32 0 0 0 116 101 115 116 ]})"

これの読み解き方が分からない・・・。

最終的に欲しい内容は、この訳の分からないpg_node_treeという型のデータから、
DEFAULT ~の部分を作りたいだけ、、、。

うーん・・・。

と、悩んでいましたが、調べていたら自己解決しました。

上記内容を手作業で読み解くのは、かなり難しい(というか全然分からない)が、
以下の関数に対して、pg_procのoidを渡せば、勝手に解釈した内容を渡してくれる。

pg_get_function_arguments(pg_proc.oid);

以下の内容を得る。

"k text DEFAULT 'test'::text"

:)

psqlの\dとかではなくて、select文で関数の一覧を取得して、
それぞれのcreate文を得たい、というのが最終目的だったが、
以下の関数で、割とあっさり出てしまった・・・。うーむ。

pg_get_functiondef(pg_proc.oid);

ただ、これで得られる内容だけだと、なぜかコストの設定とか、言語何使うの?とか
出力してくれないので、pg_procテーブルを結局見ながら、そのあたりを追加する必要がある。
(そのまま実行できるクエリ吐いてくれぇ・・・・)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0