aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Vondra <tomas.vondra@postgresql.org>2022-01-23 02:49:41 +0100
committerTomas Vondra <tomas.vondra@postgresql.org>2022-01-23 03:18:02 +0100
commita192243c75be0f142f829b3e73548bc7cbd3b90d (patch)
tree5b568be216742afcc9a8ddf2509659f220d5746e
parent3839e29c58b44639bb6800f3415af87f4d1fb655 (diff)
downloadpostgresql-a192243c75be0f142f829b3e73548bc7cbd3b90d.tar.gz
postgresql-a192243c75be0f142f829b3e73548bc7cbd3b90d.zip
Check syscache result in AlterStatistics
The syscache lookup may return NULL even for valid OID, for example due to a concurrent DROP STATISTICS, so a HeapTupleIsValid is necessary. Without it, it may fail with a segfault. Reported by Alexander Lakhin, patch by me. Backpatch to 13, where ALTER STATISTICS ... SET STATISTICS was introduced. Backpatch-through: 13 Discussion: https://postgr.es/m/17372-bf3b6e947e35ae77%40postgresql.org
-rw-r--r--src/backend/commands/statscmds.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/backend/commands/statscmds.c b/src/backend/commands/statscmds.c
index edc4c481043..59e531b55d8 100644
--- a/src/backend/commands/statscmds.c
+++ b/src/backend/commands/statscmds.c
@@ -677,6 +677,8 @@ AlterStatistics(AlterStatsStmt *stmt)
rel = table_open(StatisticExtRelationId, RowExclusiveLock);
oldtup = SearchSysCache1(STATEXTOID, ObjectIdGetDatum(stxoid));
+ if (!HeapTupleIsValid(oldtup))
+ elog(ERROR, "cache lookup failed for extended statistics object %u", stxoid);
/* Must be owner of the existing statistics object */
if (!pg_statistics_object_ownercheck(stxoid, GetUserId()))