postgresql/src/include/utils
Tom Lane d18ee6f92d Restore the portal-level snapshot after procedure COMMIT/ROLLBACK.
COMMIT/ROLLBACK necessarily destroys all snapshots within the session.
The original implementation of intra-procedure transactions just
cavalierly did that, ignoring the fact that this left us executing in
a rather different environment than normal.  In particular, it turns
out that handling of toasted datums depends rather critically on there
being an outer ActiveSnapshot: otherwise, when SPI or the core
executor pop whatever snapshot they used and return, it's unsafe to
dereference any toasted datums that may appear in the query result.
It's possible to demonstrate "no known snapshots" and "missing chunk
number N for toast value" errors as a result of this oversight.

Historically this outer snapshot has been held by the Portal code,
and that seems like a good plan to preserve.  So add infrastructure
to pquery.c to allow re-establishing the Portal-owned snapshot if it's
not there anymore, and add enough bookkeeping support that we can tell
whether it is or not.

We can't, however, just re-establish the Portal snapshot as part of
COMMIT/ROLLBACK.  As in normal transaction start, acquiring the first
snapshot should wait until after SET and LOCK commands.  Hence, teach
spi.c about doing this at the right time.  (Note that this patch
doesn't fix the problem for any PLs that try to run intra-procedure
transactions without using SPI to execute SQL commands.)

This makes SPI's no_snapshots parameter rather a misnomer, so in HEAD,
rename that to allow_nonatomic.

replication/logical/worker.c also needs some fixes, because it wasn't
careful to hold a snapshot open around AFTER trigger execution.
That code doesn't use a Portal, which I suspect someday we're gonna
have to fix.  But for now, just rearrange the order of operations.
This includes back-patching the recent addition of finish_estate()
to centralize the cleanup logic there.

This also back-patches commit 2ecfeda3e into v13, to improve the
test coverage for worker.c (it was that test that exposed that
worker.c's snapshot management is wrong).

Per bug #15990 from Andreas Wicht.  Back-patch to v11 where
intra-procedure COMMIT was added.

Discussion: https://postgr.es/m/15990-eee2ac466b11293d@postgresql.org
2021-05-21 14:03:53 -04:00
..
.gitignore Revert "Add gitignore entries for jsonpath_gram.h" 2019-03-23 00:19:34 +01:00
acl.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
aclchk_internal.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
array.h Prevent integer overflows in array subscripting calculations. 2021-05-10 10:44:38 -04:00
arrayaccess.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
ascii.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
attoptcache.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
builtins.h Add missing extern keyword for a couple of numutils functions 2020-06-13 11:28:12 +12:00
bytea.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
cash.h Phase 2 of pgindent updates. 2017-06-21 15:19:25 -04:00
catcache.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
combocid.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
date.h Prevent internal overflows in date-vs-timestamp and related comparisons. 2020-10-07 17:10:26 -04:00
datetime.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
datum.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
dsa.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
dynahash.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
elog.h Go back to returning int from ereport auxiliary functions. 2020-03-25 11:57:36 -04:00
evtcache.h Fix up recent breakage of headerscheck and cpluspluscheck. 2020-03-21 18:28:44 -04:00
expandeddatum.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
expandedrecord.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
float.h Avoid a performance regression in float overflow/underflow detection. 2020-02-13 13:37:43 -05:00
fmgrtab.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
formatting.h Allow to_date/to_timestamp to recognize non-English month/day names. 2020-03-03 11:06:47 -05:00
freepage.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
geo_decls.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
guc.h Improve user control over truncation of logged bind-parameter values. 2020-04-02 15:04:51 -04:00
guc_tables.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
help_config.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
hsearch.h Put all the prototypes for hashfn.c into the same header file. 2020-02-24 17:22:45 +05:30
index_selfuncs.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
inet.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
int8.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
inval.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
json.h Adjust src/include/utils/jsonapi.h so it's not backend-only. 2020-01-24 09:58:37 -08:00
jsonb.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
jsonfuncs.h Move jsonapi.c and jsonapi.h to src/common. 2020-01-29 10:22:51 -05:00
jsonpath.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
logtape.h logtape.c: do not preallocate for tapes when sorting 2020-09-11 17:21:00 -07:00
lsyscache.h Preserve pg_attribute.attstattarget across REINDEX CONCURRENTLY 2021-02-10 13:09:09 +09:00
memdebug.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
memutils.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
numeric.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
palloc.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
partcache.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
pg_crc.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
pg_locale.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
pg_lsn.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
pg_rusage.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
pidfile.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
plancache.h Rearrange validity checks for plpgsql "simple" expressions. 2020-03-27 14:47:34 -04:00
portal.h Restore the portal-level snapshot after procedure COMMIT/ROLLBACK. 2021-05-21 14:03:53 -04:00
ps_status.h Refactor ps_status.c API 2020-03-11 16:38:31 +01:00
queryenvironment.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
rangetypes.h Initial pgindent and pgperltidy run for v13. 2020-05-14 13:06:50 -04:00
regproc.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
rel.h Skip WAL for new relfilenodes, under wal_level=minimal. 2020-04-04 12:25:34 -07:00
relcache.h Skip WAL for new relfilenodes, under wal_level=minimal. 2020-04-04 12:25:34 -07:00
relfilenodemap.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
relmapper.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
relptr.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
reltrigger.h Enable BEFORE row-level triggers for partitioned tables 2020-03-18 18:58:05 -03:00
resowner.h Improve performance of "simple expressions" in PL/pgSQL. 2020-03-26 18:58:57 -04:00
resowner_private.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
rls.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
ruleutils.h Implement operator class parameters 2020-03-30 19:17:23 +03:00
sampling.h Report progress of ANALYZE commands 2020-01-15 11:14:39 -03:00
selfuncs.h Improve ineq_histogram_selectivity's behavior for non-default orderings. 2020-06-05 16:55:27 -04:00
sharedtuplestore.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
snapmgr.h Revive "snapshot too old" with wal_level=minimal and SET TABLESPACE. 2021-01-30 00:13:58 -08:00
snapshot.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
sortsupport.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
spccache.h Introduce a maintenance_io_concurrency setting. 2020-03-16 17:14:26 +13:00
syscache.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
timeout.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
timestamp.h Fix and simplify some usages of TimestampDifference(). 2020-11-10 22:51:55 -05:00
tuplesort.h Use int64 instead of long in incremental sort code 2020-08-02 14:23:57 +12:00
tuplestore.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
typcache.h Allow ALTER TYPE to change some properties of a base type. 2020-03-06 12:19:29 -05:00
tzparser.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
uuid.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
varbit.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
varlena.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00
xid8.h Add SQL type xid8 to expose FullTransactionId to users. 2020-04-07 12:03:59 +12:00
xml.h Update copyrights for 2020 2020-01-01 12:21:45 -05:00