diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:18:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:18:09 +0000 |
commit | ebe124eacd7c3faa36ed358e7cc1d7c5b419e5f6 (patch) | |
tree | 48fe9c3270176faa25c7d9fb47326f689be82fe4 /src/backend/commands/statscmds.c | |
parent | Releasing progress-linux version 15.5-0+deb12u1~progress6.99u1. (diff) | |
download | postgresql-15-ebe124eacd7c3faa36ed358e7cc1d7c5b419e5f6.tar.xz postgresql-15-ebe124eacd7c3faa36ed358e7cc1d7c5b419e5f6.zip |
Merging upstream version 15.6.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | src/backend/commands/statscmds.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/backend/commands/statscmds.c b/src/backend/commands/statscmds.c index f442d85..fa7a0c0 100644 --- a/src/backend/commands/statscmds.c +++ b/src/backend/commands/statscmds.c @@ -735,19 +735,12 @@ void RemoveStatisticsById(Oid statsOid) { Relation relation; + Relation rel; HeapTuple tup; Form_pg_statistic_ext statext; Oid relid; /* - * First delete the pg_statistic_ext_data tuples holding the actual - * statistical data. There might be data with/without inheritance, so - * attempt deleting both. - */ - RemoveStatisticsDataById(statsOid, true); - RemoveStatisticsDataById(statsOid, false); - - /* * Delete the pg_statistic_ext tuple. Also send out a cache inval on the * associated table, so that dependent plans will be rebuilt. */ @@ -761,12 +754,26 @@ RemoveStatisticsById(Oid statsOid) statext = (Form_pg_statistic_ext) GETSTRUCT(tup); relid = statext->stxrelid; + /* + * Delete the pg_statistic_ext_data tuples holding the actual statistical + * data. There might be data with/without inheritance, so attempt deleting + * both. We lock the user table first, to prevent other processes (e.g. + * DROP STATISTICS) from removing the row concurrently. + */ + rel = table_open(relid, ShareUpdateExclusiveLock); + + RemoveStatisticsDataById(statsOid, true); + RemoveStatisticsDataById(statsOid, false); + CacheInvalidateRelcacheByRelid(relid); CatalogTupleDelete(relation, &tup->t_self); ReleaseSysCache(tup); + /* Keep lock until the end of the transaction. */ + table_close(rel, NoLock); + table_close(relation, RowExclusiveLock); } |