diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index 08f6f67a15..56249d688a 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -90,6 +90,7 @@ int SPI_connect_ext(int options) { int newdepth; + bool atomic = (options & SPI_OPT_NONATOMIC) == 0; /* Enlarge stack if necessary */ if (_SPI_stack == NULL) @@ -98,7 +99,8 @@ SPI_connect_ext(int options) elog(ERROR, "SPI stack corrupted"); newdepth = 16; _SPI_stack = (_SPI_connection *) - MemoryContextAlloc(TopMemoryContext, + MemoryContextAlloc(atomic ? + TopTransactionContext : TopMemoryContext, newdepth * sizeof(_SPI_connection)); _SPI_stack_depth = newdepth; } @@ -130,7 +132,7 @@ SPI_connect_ext(int options) _SPI_current->execCxt = NULL; _SPI_current->connectSubid = GetCurrentSubTransactionId(); _SPI_current->queryEnv = NULL; - _SPI_current->atomic = (options & SPI_OPT_NONATOMIC ? false : true); + _SPI_current->atomic = atomic; _SPI_current->internal_xact = false; /* @@ -283,6 +285,12 @@ AtEOXact_SPI(bool isCommit) errmsg("transaction left non-empty SPI stack"), errhint("Check for missing \"SPI_finish\" calls."))); + if (_SPI_current != NULL && !_SPI_current->atomic && _SPI_stack != NULL) + ereport(WARNING, + (errcode(ERRCODE_WARNING), + errmsg("non-atomic transaction left non-empty SPI stack"), + errhint("Check after non-atomic \"SPI_connect_ext\" calls."))); + _SPI_current = _SPI_stack = NULL; _SPI_stack_depth = 0; _SPI_connected = -1;