postgresql/src/include
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
..
access Fix handling of all-zero pages in SP-GiST vacuum. 2015-07-27 12:32:30 +03:00
bootstrap Fix off-by-one loop count in MapArrayTypeName, and get rid of static array. 2014-12-16 15:35:40 -05:00
catalog Fix assorted oversights in range selectivity estimation. 2015-01-30 12:30:43 -05:00
commands Improve performance of EXPLAIN with large range tables. 2015-01-15 13:18:19 -05:00
common Add pg_string_endswith as the start of a string helper library in src/common. 2015-01-03 20:54:13 +01:00
datatype Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
executor Ensure that whole-row Vars produce nonempty column names. 2014-11-10 15:21:20 -05:00
foreign Improve updatability checking for views and foreign tables. 2013-06-12 17:53:33 -04:00
lib Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
libpq Fix incorrect order of lock file removal and failure to close() sockets. 2015-08-02 14:54:44 -04:00
mb Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
nodes Fix planner's cost estimation for SEMI/ANTI joins with inner indexscans. 2015-06-03 11:58:47 -04:00
optimizer Fix eclass_useful_for_merging to give valid results for appendrel children. 2015-08-06 20:14:37 -04:00
parser Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
port Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
portability Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
postmaster Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
regex Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
replication Make SyncRepWakeQueue to a static function 2015-03-26 10:39:18 +09:00
rewrite Avoid getting more than AccessShareLock when deparsing a query. 2014-03-06 19:31:09 -05:00
snowball Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
storage Fix s_lock.h PPC assembly code to be compatible with native AIX assembler. 2015-08-29 16:09:25 -04:00
tcop Be more careful to not lose sync in the FE/BE protocol. 2015-02-02 17:09:40 +02:00
tsearch Predict integer overflow to avoid buffer overruns. 2014-02-17 09:33:32 -05:00
utils Fix subtransaction cleanup after an outer-subtransaction portal fails. 2015-09-04 13:36:50 -04:00
.gitignore Autoconfiscate selection of 64-bit int type for 64-bit large object API. 2012-10-07 21:52:43 -04:00
c.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
fmgr.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
funcapi.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
getaddrinfo.h Fix assorted issues in client host name lookup. 2014-04-02 17:11:27 -04:00
getopt_long.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
Makefile Install headers from the new src/include/common subdirectory. 2013-02-26 15:27:30 -05:00
miscadmin.h Be more careful to not lose sync in the FE/BE protocol. 2015-02-02 17:09:40 +02:00
pg_config.h.in On Darwin, detect and report a multithreaded postmaster. 2015-01-07 22:40:40 -05:00
pg_config.h.win32 Stamp 9.3.9. 2015-06-09 15:31:32 -04:00
pg_config_ext.h.in Autoconfiscate selection of 64-bit int type for 64-bit large object API. 2012-10-07 21:52:43 -04:00
pg_config_ext.h.win32 Autoconfiscate selection of 64-bit int type for 64-bit large object API. 2012-10-07 21:52:43 -04:00
pg_config_manual.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
pg_trace.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
pgstat.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
pgtar.h Move tar function headers to pgtar.h 2013-01-02 20:34:08 +01:00
pgtime.h Support timezone abbreviations that sometimes change. 2014-10-16 15:22:17 -04:00
port.h Revert error-throwing wrappers for the printf family of functions. 2015-05-19 18:16:58 -04:00
postgres.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
postgres_ext.h Remove tabs after spaces in C comments 2014-05-06 11:26:28 -04:00
postgres_fe.h Create libpgcommon, and move pg_malloc et al to it 2013-02-12 11:21:05 -03:00
rusagestub.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00
windowapi.h Update copyrights for 2013 2013-01-01 17:15:01 -05:00