[pgsql-jp: 29159] Re: pg_type - typinput の中に何が入っているの?
HOTTA Michihide
hotta @ net-newbie.com
2003年 2月 20日 (木) 12:04:20 JST
堀田@諫早市です。
On 20 Feb 2003 11:42:34 +0900
Subject: [pgsql-jp: 29154] pg_type - typinput の中に何が入っているの?
kinoshitawataru <kinoshitawataru @ mail.goo.ne.jp> wrote:
> システムカタログ:pg_typeを調べているのですが、
> その中のフィールド(例えば)typinputの中に何が入
> っているのかが良くわかりません。
> 型は、regproc で定義されているのですが、regproc型は、
> データ長4で定義されています。
http://search.net-newbie.com/
で typinput を検索して一発目に出る
http://search.net-newbie.com/pgsql/catalog-pg-type.html
によると、typinput は regproc 型で、「入力関数」だということが
わかります。
> しかし、libpq.dllを使用してデータを取得すると、(おそらく)
> 関数名と思われる文字列が格納されていることが確認できました。
>
> 関数名(pg_procのproname)として定義されるのはname型なので
> 32バイトを要するはずです。
> どうしてデータ長4のフィールドにデータ長32のデータが
> 格納されているのかがわかりません。
>
> つまり、regproc型は、どうしてデータ長4なのか?
> という疑問です。
ソースをほどいてヘッダファイルを grep してみると、
hotta @ vm_seed ~/rpm/BUILD/postgresql-7.3.1/src/include$ grep regproc *
c.h: * regproc is the type name used in the include/catalog headers, but
c.h:typedef Oid regproc;
c.h:typedef regproc RegProcedure;
regproc は 内部的には oid らしいということがわかります。
Oid を grep すると、
postgres_ext.h:typedef unsigned int Oid;
なので、Oid は符号なし整数(IA32マシンなら4バイト)ということが
わかります。ついでに include/catalog 配下を grep してみると、
catalog/pg_type.h: regproc typinput;
catalog/pg_type.h: regproc typoutput;
catalog/pg_type.h:DATA(insert OID = 24 (
regproc PGNSP PGUID 4 t b t \054 0 0 regprocin regprocout
i p f 0 -1 0 _null_ _null_ ));
なんてのがたくさん見つかります。
このへんから攻めてゆけばよいかと思います。
要するに、関数を oid で管理しているのではないかと想像します。
--
堀田 倫英 <hotta @ net-newbie.com> <http://www.net-newbie.com>
pgsql-jp メーリングリストの案内