postgresql/src/include/utils
Tom Lane 9e9b310d8b Fix subtransaction cleanup after an outer-subtransaction portal fails.
Formerly, we treated only portals created in the current subtransaction as
having failed during subtransaction abort.  However, if the error occurred
while running a portal created in an outer subtransaction (ie, a cursor
declared before the last savepoint), that has to be considered broken too.

To allow reliable detection of which ones those are, add a bookkeeping
field to struct Portal that tracks the innermost subtransaction in which
each portal has actually been executed.  (Without this, we'd end up
failing portals containing functions that had called the subtransaction,
thereby breaking plpgsql exception blocks completely.)

In addition, when we fail an outer-subtransaction Portal, transfer its
resources into the subtransaction's resource owner, so that they're
released early in cleanup of the subxact.  This fixes a problem reported by
Jim Nasby in which a function executed in an outer-subtransaction cursor
could cause an Assert failure or crash by referencing a relation created
within the inner subtransaction.

The proximate cause of the Assert failure is that AtEOSubXact_RelationCache
assumed it could blow away a relcache entry without first checking that the
entry had zero refcount.  That was a bad idea on its own terms, so add such
a check there, and to the similar coding in AtEOXact_RelationCache.  This
provides an independent safety measure in case there are still ways to
provoke the situation despite the Portal-level changes.

This has been broken since subtransactions were invented, so back-patch
to all supported branches.

Tom Lane and Michael Paquier
2015-09-04 13:36:50 -04:00
..
.gitignore Avoid maintaining three separate copies of the error codes list. 2011-02-03 22:32:49 -05:00
acl.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
array.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
ascii.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
attoptcache.h Fix include-guard 2013-07-07 13:38:27 +02:00
builtins.h Improve performance of EXPLAIN with large range tables. 2015-01-15 13:18:19 -05:00
bytea.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
cash.h Add casts from int4 and int8 to numeric. 2011-04-05 09:35:43 -04:00
catcache.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
combocid.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
date.h Clean up references to SQL92 2013-04-20 11:04:41 -04:00
datetime.h Support timezone abbreviations that sometimes change. 2014-10-16 15:22:17 -04:00
datum.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
dynahash.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
dynamic_loader.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
elog.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
evtcache.h pgindent run for release 9.3 2013-05-29 16:58:43 -04:00
fmgrtab.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
formatting.h Fix to_char() to use ASCII-only case-folding rules where appropriate. 2013-03-05 13:02:30 -05:00
geo_decls.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
guc.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
guc_tables.h pgindent run for release 9.3 2013-05-29 16:58:43 -04:00
help_config.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
hsearch.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
inet.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
int8.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
inval.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
json.h Add new JSON processing functions and parser API. 2013-03-29 14:12:13 -04:00
jsonapi.h Fix hstore_to_json_loose's detection of valid JSON number values. 2014-12-01 11:44:48 -05:00
logtape.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
lsyscache.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
memutils.h Fix bogus "out of memory" reports in tuplestore.c. 2015-08-04 18:18:46 -04:00
nabstime.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
numeric.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
palloc.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
pg_crc.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
pg_crc_tables.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
pg_locale.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
pg_lzcompress.h Remove cvs keywords from all files. 2010-09-20 22:08:53 +02:00
pg_rusage.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
plancache.h Explicitly support the case that a plancache's raw_parse_tree is NULL. 2014-11-12 15:58:44 -05:00
portal.h Fix subtransaction cleanup after an outer-subtransaction portal fails. 2015-09-04 13:36:50 -04:00
ps_status.h Remove cvs keywords from all files. 2010-09-20 22:08:53 +02:00
rangetypes.h SP-GiST support of the range adjacent operator -|- 2013-03-08 15:03:19 +02:00
rbtree.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
rel.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
relcache.h Fix the logic for putting relations into the relcache init file. 2015-06-25 14:39:05 -04:00
relmapper.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
reltrigger.h pgindent run for release 9.3 2013-05-29 16:58:43 -04:00
resowner.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
resowner_private.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
selfuncs.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
snapmgr.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
snapshot.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
sortsupport.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
spccache.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
syscache.h Use a safer method for determining whether relcache init file is stale. 2015-06-07 15:32:09 -04:00
timeout.h Fix assorted race conditions in the new timeout infrastructure. 2013-11-29 16:41:03 -05:00
timestamp.h Clean up references to SQL92 2013-04-20 11:04:41 -04:00
tqual.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
tuplesort.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
tuplestore.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
typcache.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
tzparser.h Support timezone abbreviations that sometimes change. 2014-10-16 15:22:17 -04:00
uuid.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
varbit.h Predict integer overflow to avoid buffer overruns. 2014-02-17 09:33:32 -05:00
xml.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00