mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-06 11:09:20 +02:00
Fix race condition in statext_store().
Must hold some lock on the pg_statistic_ext_data catalog *before* we look up the tuple we aim to replace. Otherwise a concurrent VACUUM FULL or similar operation could move it to a different TID, leaving us trying to replace the wrong tuple. Back-patch to v12 where this got broken. Credit goes to Dean Rasheed; I'm just doing the clerical work. Discussion: https://postgr.es/m/CAEZATCU0zHMDiQV0g8P2U+YSP9C1idUPrn79DajsbonwkN0xvQ@mail.gmail.com
This commit is contained in:
parent
1fd0eee66f
commit
6c426cd437
@ -322,12 +322,14 @@ statext_store(Oid statOid,
|
|||||||
MVNDistinct *ndistinct, MVDependencies *dependencies,
|
MVNDistinct *ndistinct, MVDependencies *dependencies,
|
||||||
MCVList *mcv, VacAttrStats **stats)
|
MCVList *mcv, VacAttrStats **stats)
|
||||||
{
|
{
|
||||||
|
Relation pg_stextdata;
|
||||||
HeapTuple stup,
|
HeapTuple stup,
|
||||||
oldtup;
|
oldtup;
|
||||||
Datum values[Natts_pg_statistic_ext_data];
|
Datum values[Natts_pg_statistic_ext_data];
|
||||||
bool nulls[Natts_pg_statistic_ext_data];
|
bool nulls[Natts_pg_statistic_ext_data];
|
||||||
bool replaces[Natts_pg_statistic_ext_data];
|
bool replaces[Natts_pg_statistic_ext_data];
|
||||||
Relation pg_stextdata;
|
|
||||||
|
pg_stextdata = table_open(StatisticExtDataRelationId, RowExclusiveLock);
|
||||||
|
|
||||||
memset(nulls, true, sizeof(nulls));
|
memset(nulls, true, sizeof(nulls));
|
||||||
memset(replaces, false, sizeof(replaces));
|
memset(replaces, false, sizeof(replaces));
|
||||||
@ -371,8 +373,6 @@ statext_store(Oid statOid,
|
|||||||
elog(ERROR, "cache lookup failed for statistics object %u", statOid);
|
elog(ERROR, "cache lookup failed for statistics object %u", statOid);
|
||||||
|
|
||||||
/* replace it */
|
/* replace it */
|
||||||
pg_stextdata = table_open(StatisticExtDataRelationId, RowExclusiveLock);
|
|
||||||
|
|
||||||
stup = heap_modify_tuple(oldtup,
|
stup = heap_modify_tuple(oldtup,
|
||||||
RelationGetDescr(pg_stextdata),
|
RelationGetDescr(pg_stextdata),
|
||||||
values,
|
values,
|
||||||
|
Loading…
Reference in New Issue
Block a user