存储器管理

服务器在存储器环境按这样的方法分配存储器:在某个环境分配的存储器可以被环境析构器释放而不会影响其他环境中分配的存储器.所有存储器分配(通过 palloc 等)都被当作在当前环境的区域中分配存储器.如果你试图释放(或再分配)不在当前环境的存储器,你将得到不可预料的结果.

创建存储器环境和切换存储器环境是 SPI 管理器中存储器管理器的任务.

SPI 过程处理两种存储器环境:上层执行器存储器环境和过程存储器环境(如果已联接).

在一个过程与 SPI 管理器联接之前,当前存储器环境是上层执行器环境,所以所有由过程自身通过 palloc/repalloc 或通过 SPI 工具函数在联接到 SPI 管理器之前分配的存储器都在这个环境里.

在进行 SPI_connect 调用之后,当前环境是过程自身所有的.通过 palloc/repalloc 或通过 SPI 应用函数分配的存储器(除了 SPI_copytuple,SPI_modifytuple,SPI_pallocSPI_repalloc 以外)都在这个环境中分配.

当进程与 SPI 管理器断开(通过调用 SPI_finish)后,当前环境恢复为上层执行器环境并且所有在过程存储器环境分配的存储器都被释放,并且不可继续使用!

如果你想返回一些东西给上层执行器,那么你必须为此在上层环境分配一片存储器!

SPI 不能自动释放在上层执行器环境里分配的存储器!

SPI 在查询完成后自动释放查询执行期间分配的存储器!