SPI(や他の任意のC関数)を使用する関数内のデータの可視性は、以下の規則に従います。
SQLコマンドの実行中、そのコマンドで行われたデータ変更はそのコマンドからは不可視です。 例えば、
INSERT INTO a SELECT * FROM a;
では、挿入された行はSELECT
部からは不可視です。
コマンドCで行われた変更は、Cの後に開始された全てのコマンドからは可視です。 Cの内側(処理中)に開始したかCの処理後に開始したかは関係ありません。
SQLコマンドによって呼び出される関数(普通の関数やトリガ関数)の内側で、SPIを使用して実行されるコマンドは、SPIに渡される読み書きフラグに応じて上の規則のいくつかに従います。 読み取りのみモードで実行されるコマンドは、呼び出し中のコマンドの変更は不可視であるという最初の規則に従います。 読み書きモードで実行されるコマンドは、今までに行われた変更はすべて可視であるという2番目の規則に従います。
標準の手続き言語は全て、関数の変動属性に応じてSPI読み書きモードを設定します。
STABLE
およびIMMUTABLE
関数のコマンドは、読み取りのみモードで行われ、VOLATILE
関数のコマンドは読み書きモードで行われます。
C言語関数の作者はこの規約を無視することができますが、それはほとんどの場合勧められません。
次節には、これら規則の適用についてを示す例があります。