23. large object の auto-delete を考える2 - PostgreSQL のソースコードを読む
独自の組み込み型定義
hige=# insert into person values(4); ERROR: column "social_no" is of type higeid but expression is of type integer HINT: You will need to rewrite or cast the expression. hige=# insert into person values(oid(4)); ERROR: column "social_no" is of type higeid but expression is of type oid HINT: You will need to rewrite or cast the expression.
higeid は oid と互換にしたいので cast 手続きを書く必要があるっぽい。
pg_cast かな。うわ pg_cast カタログのデータをマクロでそのまま定義している。うーん。定数は oid なんだろうけどせめてマクロで書いて欲しい。
それはともかく int(oid 23) -> higeid(oid 90) のデータを定義する。
DATA(insert ( 23 90 0 i ));
ビルドし直し。
hige=# select typname from pg_type where typname like 'hige%'; typname --------- higeid (1 row) hige=# hige=# CREATE TABLE person (social_no higeid); CREATE TABLE hige=# insert into person values(3); INSERT 0 1
できた。
create table に hook
create table はどこで処理される?
/src/backend/commands/tablecmds.c で処理される。
DefineRelation(CreateStmt *stmt, char relkind) の最後あたりで schema に特定の型が存在したら trigger を作る。
ってので良さそうだなあ。
typeid は 0 なので typename->names の方を見るべし。
foreach(listptr, schema)
{
ColumnDef *colDef = lfirst(listptr);
fprintf(stderr, "==== typied=%d\n", colDef->typename->typeid);
if (colDef->typename->typeid == 90) {
printf("higeid found in create table\n");
}
foreach(ptr, colDef->typename->names)
{
Value *value = lfirst(ptr);
fprintf(stderr, "==== typied=%s\n", value->val.str);
}
}
次の1手
- 組み込み triggerと
- pg_trigger への登録