PREPARE/EXECUTE文

PostgreSQLではPREPARE/EXECUTE文の組み合わせで、効率的でセキュアなSQL処理を可能にしている。
通常、クライアントからSQL文が渡されると
1.字句解析
2.意味解析
3.リライター
4.オプティマイザ
5.エグゼキュータ
6.結果セットの返却
という処理手順を経て、データベースの検索結果をユーザに返す。

PREPARE/EXECUTE文は、1-4の処理(PREPARE文)と5-6の処理(EXECUTE文)を分離するためのもので、これにより構文解析オプティマイズのための処理を一回で済ませることができる。

しかし、SE-PostgreSQLの観点からはやや面倒。
なぜなら、SE-PostgreSQLはリライターの後で入力SQL文をチェックするが、PREPARE文を用いた場合には、オプティマイズ済みのSQL文をいったん格納しておき、後のEXECUTE文がで使われるのを待つから。

この場合、チェックしたユーザ権限と、実際にクエリを実行する場合のユーザ権限が異なる場合がある。例えばTrusted-Procedureとして定義されたSQL関数があり、その内部でEXECUTE文を用いている場合など。
なので、PREPARE/EXECUTE文の場合にはオプティマイズ済みの構文木をチェックしないと駄目。
斜め読みした感じ、オプティマイザを通ることで全くの別物になっているとかそういうことは無いみたいだが、どの様にデータ構造を変換しているのか要チェック。

また、CREATE TABLE <tblname> AS EXECUTE <sql_name>; 文を使った場合には、暗黙的/明示的なラベリングが発生する可能性があるので、これもチェックする必要がある。