pgsql: Fix assert in nested SQL procedure call
От | Peter Eisentraut |
---|---|
Тема | pgsql: Fix assert in nested SQL procedure call |
Дата | |
Msg-id | E1fbYQs-0001Nd-Bg@gemulon.postgresql.org обсуждение исходный текст |
Список | pgsql-committers |
Fix assert in nested SQL procedure call When executing CALL in PL/pgSQL, we need to set a snapshot before invoking the to-be-called procedure. Otherwise, the to-be-called procedure might end up running without a snapshot. For LANGUAGE SQL procedures, this would result in an assertion failure. (For most other languages, this is usually not a problem, because those use SPI and SPI sets snapshots in most cases.) Setting the snapshot restores the behavior of how CALL worked when it was handled as a generic SQL statement in PL/pgSQL (exec_stmt_execsql()). This change revealed another problem: In SPI_commit(), we popped the active snapshot before committing the transaction, to avoid "snapshot %p still active" errors. However, there is no particular reason why only at most one snapshot should be on the stack. So change this to pop all active snapshots instead of only one. Branch ------ REL_11_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/d89348976c51952293ffe35845c372ffa7e93b47 Modified Files -------------- src/backend/executor/spi.c | 7 ++++- .../plpgsql/src/expected/plpgsql_transaction.out | 19 +++++++++++++ src/pl/plpgsql/src/pl_exec.c | 32 ++++++++++++++++++---- src/pl/plpgsql/src/sql/plpgsql_transaction.sql | 20 ++++++++++++++ 4 files changed, 72 insertions(+), 6 deletions(-)
В списке pgsql-committers по дате отправления: