drop-statistics-lock-fix.patch
text/x-patch
Filename: drop-statistics-lock-fix.patch
Type: text/x-patch
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/commands/statscmds.c | 14 | 8 |
diff --git a/src/backend/commands/statscmds.c b/src/backend/commands/statscmds.c
index 36bc8c33ba..dae0fd6b4f 100644
--- a/src/backend/commands/statscmds.c
+++ b/src/backend/commands/statscmds.c
@@ -734,18 +734,11 @@ 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.
@@ -760,12 +753,25 @@ RemoveStatisticsById(Oid statsOid)
statext = (Form_pg_statistic_ext) GETSTRUCT(tup);
relid = statext->stxrelid;
+ rel = table_open(relid, AccessExclusiveLock);
+
+ /*
+ * 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);
+
CacheInvalidateRelcacheByRelid(relid);
CatalogTupleDelete(relation, &tup->t_self);
ReleaseSysCache(tup);
+ /* Keep lock on the rel until end of xact */
+ table_close(rel, NoLock);
+
table_close(relation, RowExclusiveLock);
}