From 298bdd379552148f6043b4595374a7a6fbdd13c3 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Wed, 3 Jun 2026 11:33:35 +0300 Subject: [PATCH] pg_dump: scope indAttNames per index in getIndexes() getIndexes() declared indAttNames and nindAttNames in the outer per-table loop, so the names collected for an index on expressions were carried over to the next plain index in the same table. This is an internal inconsistency rather than a user-facing bug. dumpRelationStats_dumper() only walks indexes that have pg_statistic rows, and ANALYZE only creates those for indexes with expressions, so the second index in the affected pair is not visited and the stale array is never consulted. Fix by moving the two variables into the inner per-index loop so each iteration starts with a clean slate. Author: Maksim Melnikov Reviewed-by: Alexander Korotkov Discussion: https://postgr.es/m/be5fc489-587e-421f-bbb8-adb43cfd50f4@postgrespro.ru Backpatch-through: 17 --- src/bin/pg_dump/pg_dump.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index d56dcc701ce..a0f7f8e2168 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -8161,8 +8161,6 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) { Oid indrelid = atooid(PQgetvalue(res, j, i_indrelid)); TableInfo *tbinfo = NULL; - char **indAttNames = NULL; - int nindAttNames = 0; int numinds; /* Count rows for this table */ @@ -8196,6 +8194,8 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) { char contype; char indexkind; + char **indAttNames = NULL; + int nindAttNames = 0; RelStatsInfo *relstats; int32 relpages = atoi(PQgetvalue(res, j, i_relpages)); int32 relallvisible = atoi(PQgetvalue(res, j, i_relallvisible));