階層を解決するために自分自身を呼び出す関数があります。ボラティリティ宣言がないと、望ましい結果が得られます(つまり、再帰が終了します)。パフォーマンスの最適化として、関数をSTABLE
として宣言し、再度実行しました。現在は常に上記のエラーで中止され、max_stack_depth
無限の再帰のように思えます。
ここで何が起きてるの?
VOLATILE
であるかどうかに応じて、関数はデータベースの同じ状態を表示しない場合があります。ステートメント自体または別の理由により、呼び出されたSQLステートメントの実行中にこの状態が変化します。分離レベルがRead Committedの場合のトランザクション。
これは https://www.postgresql.org/docs/current/xfunc-volatility.html に記載されています
SQLまたは任意の標準手続き言語で記述された関数の場合、ボラティリティカテゴリによって決定される2番目の重要なプロパティがあります。つまり、関数を呼び出しているSQLコマンドによって行われたデータ変更の可視性です。 VOLATILE関数はこのような変更を認識しますが、STABLEまたはIMMUTABLE関数は認識しません。この動作は、MVCCのスナップショット動作を使用して実装されます(第13章を参照):STABLE関数とIMMUTABLE関数は、呼び出し元のクエリの開始時に確立されたスナップショットを使用しますが、VOLATILE関数は、実行する各クエリの開始時に新しいスナップショットを取得します。
関数がデータベースを読み取り、読み取る内容に応じて異なるパスをたどる場合、VOLATILEではない場合に限り、無限再帰になる可能性があります。コードを見ると明らかになるかもしれません。