サーバはメモリコンテキスト内でメモリの割り当てを行ないます。ある メモリコンテキストで割り当てられたメモリは、そのコンテキストを破 壊することによって、他のコンテキストで割り当てられたメモリに影響 を与えることなく開放できます。( palloc などによ り)割り当てられたメモリは全て、現在のコンテキストとして選ばれた コンテキスト内に作成されています。現在のコンテキストの外部に割り 当てられたメモリを開放(または、再割り当て)を行なおうとした場合、 予期できない結果を得ることになります。
メモリコンテキストの生成と切替えは SPI マネージャのもつメモリ管理 機能によって行なわれます。
SPI プロシージャは2つのメモリコンテキストを扱います。上位エグゼキュ ータのメモリコンテキストと(接続済みの場合)プロシージャメモリコン テキストです。
SPI マネージャにプロシージャが接続されるまでは、現在のメモリコンテキ ストは上位エグゼキュータコンテキストになっています。ですので、プロシ ージャ自体が palloc、 repalloc 、または、SPI ユーティリティ関数を使っ て生成する割り当てメモリはこのコンテキストに作成されます。
SPI_connect が呼び出されると、現在のコンテキス トはプロシージャのコンテキストになります。 palloc、 repalloc、または ( SPI_copytuple、 SPI_modifytuple、SPI_palloc、 SPI_repalloc を除く)SPI ユーティリティ関数を使 って生成した割り当てメモリはこのコンテキストに作成されます。
プロシージャが( SPI_finish を使って)SPI マネー ジャーから切断されると、現在のコンテキストは上位エグゼキュータのコンテ キストに戻され、プロシージャメモリコンテキストに作成された割り当てメモ リは開放され、二度と使えなくなります。
上位エグゼキュータに何かを返したい場合、そのためのメモリを上位コンテ キストに割り当てなければなりません!
SPI は上位エグゼキュータに割り当てたメモリを自動的に開放する機能を 持ちません!
問い合わせが完了すると、SPI は問い合わせ実行中に割り当てたメモリを 自動的に開放します!