[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 メーリングリストの案内