SPI_execute ou uma função semelhante
O PostgreSQL aloca memória dentro de
contextos de memória, que fornecem um método
conveniente de gerenciar alocações feitas em muitos locais diferentes
que precisam permanecer por diferentes intervalos de tempo.
Destruir o contexto libera toda a memória alocada nele.
Assim, não é necessário controlar objetos individuais para evitar
vazamentos de memória; em vez disso, apenas um número relativamente
pequeno de contextos precisa ser gerido.
A função palloc e funções relacionadas alocam
memória no contexto “corrente”.
A função SPI_connect cria um novo contexto de
memória e o torna o corrente.
A função SPI_finish restaura o contexto de
memória corrente anterior, e destrói o contexto criado por
SPI_connect.
Estas ações garantem que as alocações transitórias de memória feitas
em uma função C sejam recuperadas na saída
da função C, evitando vazamento de memória.
Entretanto, se a função C precisar retornar um
objeto na memória alocada (como o valor de um tipo de dados passado
por referência), não se pode alocar esta memória usando a função
palloc, pelo menos não enquanto estiver
conectado à SPI.
Se for tentado, o objeto será desalocado por
SPI_finish e a função C
não funcionará de maneira confiável.
Para resolver este problema, deve ser usada a função
SPI_palloc para alocar memória para o objeto
retornado.
A função SPI_palloc aloca memória no
“contexto do executor superior”, ou seja, o contexto
de memória corrente quando a função SPI_connect
foi chamada, que é precisamente o contexto certo para um valor
retornado pela função C.
Várias outras funções utilitárias descritas nesta seção também
retornam objetos criados no contexto do executor superior.
Quando a função SPI_connect é chamada,
o contexto privado da função C, criado por
SPI_connect, torna-se o contexto corrente.
Todas as alocações feitas pelas funções palloc,
repalloc, ou funções utilitárias da
SPI (exceto conforme descrito nesta seção)
são feitas neste contexto.
Quando uma função C se desconecta do gerenciador
da SPI (via SPI_finish)
o contexto corrente é restaurado para o contexto do executor superior,
e todas as alocações feitas no contexto de memória da função
C são liberadas não podendo mais ser usadas.