PostgreSQL には、ビューと理解のしかたでどうとも取れるビューの更新の仕様に対応する強力なルールシステムがあります。もともと PostgreSQLのルールシステムは 2 つの実装で構成されていました。
初めの 1 つはタプルレベルの処理を使って行われ、エクゼキュータの内部に実装されていました。個別のタプルがアクセスされるたびにルールシステムが呼ばれていました。この実装は 1995 年、最後のPostgreSQLプロジェクトの公式リリースが Postgres95 へ移行する時に取り除かれました。
ルールシステムの 2 つ目の実装は問い合わせ書き換えと呼ばれる手法です。リライトシステムは構文解析過程とプランナ/オプティマイザの間にあるモジュールです。この手法は現在でも実装されています。
PostgreSQL システムの構文やルールの作成に関する情報については ユーザガイドを参照してください。
問い合わせ書き換えシステムは、構文解析過程とプランナ/オプティマイザの間にあるモジュールです。このシステムは構文解析過程から返された(ユーザーの問い合わせを示す)ツリーを処理し、問い合わせに適用されるべきルールがあった場合はツリーをそれに合わせて書き直します。
ここでは問い合わせ書き換えシステムのアルゴリズムを紹介します。よりわかりやすくするために、ルールを使ってビューを実装する方法を例として使います。
つぎのルールがあったとします。
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;
ルールは、リレーションtest_viewに対する SELECT が検知されると起動がかかります。test_view からタプルを SELECT する代わりにルールのアクションパートにある SELECT 文が実行されます。
test_viewに対してつぎのようなユーザー問い合わせがあったとします。
select sname from test_view where sname <> 'Smith';
以下に、test_viewに対するユーザー問い合わせがあるたびに問い合わせ書き換えシステムが実行する過程を示します。(このリストは、基礎的な理解をうながすためのアルゴリズムを、非常に簡略したかたちで書いたものです。詳しい説明については A commentary on the POSTGRES rules system を参照してください。)
test_view 書き換え
ルールのアクション部分で与えられた問い合わせを受け取ります。
ユーザー問い合わせで与えられた属性の数字と順番が合うようにターゲットリストを調整します。
ユーザー問い合わせの where 句で与えられる制限を、ルールのアクション部分で与えられる問い合わせの制限に追加します。
上記のようにルールが定義されると、ユーザーの問い合わせは次のような形に書き換えられます(書き換えは構文解析過程から返されたユーザー問い合わせの内部表現に適用されますが、新しく作られたデータ構造は次の問い合わせを表現していることに注意してください)。
select s.sname from supplier s, sells se, part p where s.sno = se.sno and p.pno = se.pno and s.sname <> 'Smith';