OUTER JOIN
LEFT/RIGHT OUTER JOINの挙動について。
定義によると、LEFT OUTER JOINの場合は左側テーブルの全てのタプルに対して、結合条件に対応する右側タプルが存在しない場合には、右側テーブルに対応する部分をNULLで埋めた結果セットを返却する。
つまり、ON〜句で左側タプルを絞り込む条件を設定しても意味がなく、無条件で出力されてしまう。
従来、SE-PostgreSQLの構文書き換えシステムは以下のような処理を行っていた。
SELECT * FROM t1 LEFT OUTER JOIN t2; ↓ SELECT * FROM t1 LEFT OUTER JOIN t2 <strong>ON sepgsql_tuple_perms(t1, ...) and sepgsql_tuple_perms(t2, ...)</strong>;
しかし、この場合左側テーブルである t1 に含まれるタプルの絞り込み条件が効かない。
そのため、実際には以下のようにサブクエリに書き換える必要がある。
SELECT * FROM t1 LEFT OUTER JOIN t2; ↓ SELECT * FROM <strong>(SELECT * FROM t1 WHERE sepgsql_tuple_perms(t1, ...)) AS t1</strong> LEFT OUTER JOIN t2 <strong>ON sepgsql_tuple_perms(t2, ...)</strong>
これによって、絞込み済みの左側テーブルと、ONによって絞り込まれる右側テーブル間のLEFT OUTER JOINという処理になる。
RIGHT OUTER JOINの場合は左右が逆、FULL OUTER JOINの場合はこれを両側に適用することとなる。
昨日の未踏ソフト中間報告会で、ウェラブルコンピューティングみたいな華のあるソフトに比べると、SELinuxは話が堅いよね〜と言われたが、硬くて結構。モノがモノなんだから。