fix-call-in-atomic-context-draft.patch
text/x-diff
Filename: fix-call-in-atomic-context-draft.patch
Type: text/x-diff
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/executor/spi.c | 10 | 5 |
| src/pl/plpgsql/src/pl_exec.c | 2 | 2 |
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index a97a7e3bd4..c93b6c192f 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -2425,12 +2425,17 @@ _SPI_execute_plan(SPIPlanPtr plan, const SPIExecuteOptions *options, * snapshot != InvalidSnapshot, read_only = false: use the given snapshot, * modified by advancing its command ID before each querytree. * - * snapshot == InvalidSnapshot, read_only = true: use the entry-time - * ActiveSnapshot, if any (if there isn't one, we run with no snapshot). + * snapshot == InvalidSnapshot, read_only = true: do nothing for queries + * that require no snapshot. For those that do, ensure that a Portal + * snapshot exists; then use that, or use the entry-time ActiveSnapshot if + * that exists and is different. * - * snapshot == InvalidSnapshot, read_only = false: take a full new - * snapshot for each user command, and advance its command ID before each - * querytree within the command. + * snapshot == InvalidSnapshot, read_only = false: do nothing for queries + * that require no snapshot. For those that do, ensure that a Portal + * snapshot exists; then, in atomic execution (!allow_nonatomic) take a + * full new snapshot for each user command, and advance its command ID + * before each querytree within the command. In allow_nonatomic mode we + * just use the Portal snapshot unmodified. * * In the first two cases, we can just push the snap onto the stack once * for the whole plan list. diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 6947575b94..54ede9d85e 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -2218,12 +2218,12 @@ exec_stmt_call(PLpgSQL_execstate *estate, PLpgSQL_stmt_call *stmt) * for the plan. This avoids refcount leakage complaints if the called * procedure ends the current transaction. * - * Also, tell SPI to allow non-atomic execution. + * Also, tell SPI to allow non-atomic execution if appropriate. */ memset(&options, 0, sizeof(options)); options.params = paramLI; options.read_only = estate->readonly_func; - options.allow_nonatomic = true; + options.allow_nonatomic = !estate->atomic; options.owner = estate->procedure_resowner; rc = SPI_execute_plan_extended(expr->plan, &options);