0001-Use-dependency-based-matching-for-STATISTICS-DATA-in.patch

text/plain

Filename: 0001-Use-dependency-based-matching-for-STATISTICS-DATA-in.patch
Type: text/plain
Part: 0
Message: Re: pg_restore handles extended statistics inconsistently with statistics data

Patch

Format: format-patch
Series: patch 0001
Subject: Use dependency-based matching for STATISTICS DATA in selTypes
File+
src/bin/pg_dump/pg_backup_archiver.c 29 10
From f0021e89b087b9b12930a6a02a803f1e3c35a554 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Tue, 16 Jun 2026 12:22:40 +0900
Subject: [PATCH] Use dependency-based matching for STATISTICS DATA in selTypes

The previous approach was weaker in terms of name matching, as an
--index=foo could match with a table with the same name but from a
different schema, pulling in more data than necessary.
---
 src/bin/pg_dump/pg_backup_archiver.c | 39 +++++++++++++++++++++-------
 1 file changed, 29 insertions(+), 10 deletions(-)

diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index 4fa6cc1c566a..4ec43f29622e 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -3250,17 +3250,36 @@ _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH)
 				bool		dumpthis = false;
 
 				/*
-				 * Statistics data can be assigned for tables or indexes, so
-				 * check both.
+				 * Statistics data entries can be for tables or indexes. Check
+				 * the parent dependency to determine which type this entry
+				 * belongs to, then apply the appropriate name filter.
 				 */
-				if (ropt->selTable &&
-					(ropt->tableNames.head == NULL ||
-					 simple_string_list_member(&ropt->tableNames, te->tag)))
-					dumpthis = true;
-				if (ropt->selIndex &&
-					(ropt->indexNames.head == NULL ||
-					 simple_string_list_member(&ropt->indexNames, te->tag)))
-					dumpthis = true;
+				for (int i = 0; i < te->nDeps; i++)
+				{
+					TocEntry   *pte = getTocEntryByDumpId(AH, te->dependencies[i]);
+
+					if (!pte)
+						continue;
+
+					if (ropt->selTable &&
+						(strcmp(pte->desc, "TABLE") == 0 ||
+						 strcmp(pte->desc, "VIEW") == 0 ||
+						 strcmp(pte->desc, "FOREIGN TABLE") == 0 ||
+						 strcmp(pte->desc, "MATERIALIZED VIEW") == 0))
+					{
+						if (ropt->tableNames.head == NULL ||
+							simple_string_list_member(&ropt->tableNames, pte->tag))
+							dumpthis = true;
+					}
+
+					if (ropt->selIndex &&
+						strcmp(pte->desc, "INDEX") == 0)
+					{
+						if (ropt->indexNames.head == NULL ||
+							simple_string_list_member(&ropt->indexNames, pte->tag))
+							dumpthis = true;
+					}
+				}
 				if (!dumpthis)
 					return 0;
 			}
-- 
2.54.0