pgsql: Fix order of operations in ExecEvalFieldStoreDeForm().

Поиск
Список
Период
Сортировка
От Tom Lane
Тема pgsql: Fix order of operations in ExecEvalFieldStoreDeForm().
Дата
Msg-id E1qEsVH-001274-HG@gemulon.postgresql.org
обсуждение исходный текст
Список pgsql-committers
Fix order of operations in ExecEvalFieldStoreDeForm().

If the given composite datum is toasted out-of-line,
DatumGetHeapTupleHeader will perform database accesses to detoast it.
That can invalidate the result of get_cached_rowtype, as documented
(perhaps not plainly enough) in that function's API spec; which leads
to strange errors or crashes when we try to use the TupleDesc to read
the tuple.  In short then, trying to update a field of a composite
column could fail intermittently if the overall column value is wide
enough to require toasting.

We can fix the bug at no cost by just changing the order of
operations, since we don't need the TupleDesc until after detoasting.
(Other callers of get_cached_rowtype appear to get this right already,
so there's only one bug.)

Note that the added regression test case reveals this bug reliably
only with debug_discard_caches/CLOBBER_CACHE_ALWAYS.

Per bug #17994 from Alexander Lakhin.  Sadly, this patch does not fix
the missing-values issue revealed in the bug discussion; we'll need
some more work to cover that.

Discussion: https://postgr.es/m/17994-5c7100b51b4790e9@postgresql.org

Branch
------
REL_11_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/7f11b7a9cf1882b3d1ce5ac73018127baf93b2d3

Modified Files
--------------
src/backend/executor/execExprInterp.c  | 29 +++++++++++++++++------------
src/test/regress/expected/rowtypes.out |  9 +++++++++
src/test/regress/sql/rowtypes.sql      |  5 +++++
3 files changed, 31 insertions(+), 12 deletions(-)


В списке pgsql-committers по дате отправления:

Предыдущее
От: Daniel Gustafsson
Дата:
Сообщение: Re: pgsql: ci: Change macOS builds from Intel to ARM.
Следующее
От: Tom Lane
Дата:
Сообщение: pgsql: Defend against bogus parameterization of join input paths.