pgsql: Simplify code by getting rid of SPI_push, SPI_pop, SPI_restore_c

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Simplify code by getting rid of SPI_push, SPI_pop, SPI_restore_c
Date: 2016-11-08 22:40:08
Message-ID: E1c4F3o-00057I-VF@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Simplify code by getting rid of SPI_push, SPI_pop, SPI_restore_connection.

The idea behind SPI_push was to allow transitioning back into an
"unconnected" state when a SPI-using procedure calls unrelated code that
might or might not invoke SPI. That sounds good, but in practice the only
thing it does for us is to catch cases where a called SPI-using function
forgets to call SPI_connect --- which is a highly improbable failure mode,
since it would be exposed immediately by direct testing of said function.
As against that, we've had multiple bugs induced by forgetting to call
SPI_push/SPI_pop around code that might invoke SPI-using functions; these
are much harder to catch and indeed have gone undetected for years in some
cases. And we've had to band-aid around some problems of this ilk by
introducing conditional push/pop pairs in some places, which really kind
of defeats the purpose altogether; if we can't draw bright lines between
connected and unconnected code, what's the point?

Hence, get rid of SPI_push[_conditional], SPI_pop[_conditional], and the
underlying state variable _SPI_curid. It turns out SPI_restore_connection
can go away too, which is a nice side benefit since it was never more than
a kluge. Provide no-op macros for the deleted functions so as to avoid an
API break for external modules.

A side effect of this removal is that SPI_palloc and allied functions no
longer permit being called when unconnected; they'll throw an error
instead. The apparent usefulness of the previous behavior was a mirage
as well, because it was depended on by only a few places (which I fixed in
preceding commits), and it posed a risk of allocations being unexpectedly
long-lived if someone forgot a SPI_push call.

Discussion: <20808(dot)1478481403(at)sss(dot)pgh(dot)pa(dot)us>

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/1833f1a1c3b0e12b3ea40d49bf11898eedae5248

Modified Files
--------------
doc/src/sgml/spi.sgml | 180 ++++++++-----------------------
src/backend/executor/spi.c | 200 +++++++++--------------------------
src/backend/utils/adt/xml.c | 6 --
src/backend/utils/cache/plancache.c | 13 ---
src/backend/utils/fmgr/fmgr.c | 48 +--------
src/include/executor/spi.h | 12 ++-
src/pl/plperl/plperl.c | 78 --------------
src/pl/plpgsql/src/pl_exec.c | 21 ----
src/pl/plpython/plpy_exec.c | 2 -
src/pl/plpython/plpy_spi.c | 13 ---
src/pl/plpython/plpy_subxactobject.c | 7 --
src/pl/tcl/pltcl.c | 18 ----
12 files changed, 105 insertions(+), 493 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Peter Eisentraut 2016-11-09 20:01:53 pgsql: doc: Improve whitespace use in XSL
Previous Message Robert Haas 2016-11-08 21:31:50 pgsql: psql: Tab completion for renaming enum values.