Postgres は view およびいずれとも解釈される view update の仕様 を決定する強力な rule システムを支援しています。当初から Postgres の rule システムは二つの実装から なっていました。
初めの実装はタプル レベルの処理を用いて稼働され エクゼキュータ の深い所に実装されました。この rule システムは個別のタプルがアクセスされた時は常に呼び出されました。この実装 は Postgres プロジェクトの最後の公開が Postgres95 に引き継がれた 1995 年に削除され ました。
rule システムの第二の実装は問合せ書き換え と呼ばれる技術です。書き換えシステムは パーサステージ と プランナ/オプティマイザの中間に位置するモジュール です。この技術は今でも実装されています。
Postgres の構文と rule 作成に関しては The PostgreSQL User's Guide を参照して 下さい。
問合せ書き換えシステムはパーサステージと プランナ/オプティマイザの間に位置するモジュールです。このモジュールは (ユーザの問合せを表す)パーサレベルによって返されるツリーの処理を行い、 その問合せに適用されるべき rule が存在する場合、そのツリーを別の形式に 書き換えます。
ここで問合せ書き換えシステムのアルゴリズムの概略を見てみることに します。よりわかりやすく図示するための例として rule を用いた view の実装を示します。
下記の rule が与えられたと仮定します。
create rule view_rule as on select to test_view do instead select s.sname, p.pname from supplier s, sells se, part p where s.sno = se.sno and p.pno = se.pno;
与えられた rule はリレーション test_view に対する select が検出されたとき起動されます。 test_view からタプルを select するのではなく、rule の アクション部 で与えられた select 文が実行されます。
下記の test_view に対するユーザ問合せが与えられたと 仮定します。
select sname from test_view where sname <> 'Smith';
ここに test_view に対するユーザ問合せがあった時に 問合せ書き換えシステムが行う一連の作業を示します。(下記のリストは 基本的な理解のためのもの便宜的アルゴリズムです。詳細については Stonebraker et al, 1989 を参照して下さい。
test_view 書き換え
rule の アクション部で与えられた問合せの取得
ユーザ問合せで与えられた属性の数値と優先度に見合うターゲット リストの適用
ユーザ問合せの where 句による条件の rule のアクション 部で与えられる問合せの条件への追加
上記で与えられた rule の定義により、ユーザ問い合わせは以下の形式 に書き換えられます。(書き換えはパーサステージによって引き渡される ユーザ問合せの内部表現として行われますが、派生した新規のデータ構造 は以下の問合せとなります。)
select s.sname from supplier s, sells se, part p where s.sno = se.sno and p.pno = se.pno and s.sname <> 'Smith';