服务器在存储器环境里按这样的方法分配存储器: 在某个环境分配的存储器可以被环境析构器释放 而不会影响其他环境中分配的存储器.所有存储器分配(通过 palloc等) 都被当作在当前环境的区域中分配存储器.如果你试图释放(或 再分配)不在当前环境的存储器,你将得到不可预料的结果.
创建存储器环境和切换存储器环境是 SPI 管理器中存储器管理器的任务.
SPI 过程处理两种存储器环境: 上层执行器存储器环境和过程存储器环境(如果已联接).
在一个过程与 SPI 管理器联接之前,当前存储器环境是上层执行器环境, 所以所有由过程自身通过 palloc/repalloc 或通过 SPI 工具函数在联接到 SPI 管理器之前分配的存储器都在这个环境里.
在进行 SPI_connect 调用之后, 当前环境是过程自身所有的. 通过 palloc/repalloc 或通过 SPI 应用函数分配 的存储器(除了 SPI_copytuple,SPI_modifytuple, SPI_palloc和 SPI_repalloc以外) 都在这个环境中分配.
当过程与 SPI 管理器断开(通过调用 SPI_finish)后, 当前环境恢复为上层执行器环境并且所有在过程存储器环境 分配的存储器都被释放,并且不可继续使用!
如果你想返回一些东西给上层执行器, 那么你必须为此在上层环境分配一片存储器!
SPI 不能自动释放在上层执行器环境里分配的存储器!
SPI 在查询完成后自动释放查询执行期间分配的存储器!