On Fri, 2024-10-18 at 15:14 -0400, Tom Lane wrote:
> If we are going to put data into reltuples but not relpages,
> I think I agree with setting relpages to -1 to signify
> "unknown" (analogously to -1 for reltuples).  Otherwise it
> looks like the table has infinite tuple density, which is
> likely to bollix something somewhere.

That's a good point.

I attached a patch that creates partitioned tables with relpages=-1,
and updates the docs.

It's awkward to cast back and forth between BlockNumber and int32, so I
updated the signature of vac_update_relstats() as well.

Regards,
        Jeff Davis

From 34241c8a9e18c0e945dd38a2858676d52facc898 Mon Sep 17 00:00:00 2001
From: Jeff Davis <j...@j-davis.com>
Date: Tue, 22 Oct 2024 10:04:11 -0700
Subject: [PATCH v1] Be more consistent about relpages for partitioned tables.

Use -1 for relpages, and document it.

Discussion: https://postgr.es/m/924396.1729278...@sss.pgh.pa.us
---
 doc/src/sgml/catalogs.sgml    | 3 ++-
 src/backend/catalog/heap.c    | 5 ++++-
 src/backend/commands/vacuum.c | 9 +++++----
 src/include/commands/vacuum.h | 2 +-
 4 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 964c819a02..19b7bbd4a8 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -2033,7 +2033,8 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
        <symbol>BLCKSZ</symbol>).  This is only an estimate used by the
        planner.  It is updated by <link linkend="sql-vacuum"><command>VACUUM</command></link>,
        <link linkend="sql-analyze"><command>ANALYZE</command></link>, and a few DDL commands such as
-       <link linkend="sql-createindex"><command>CREATE INDEX</command></link>.
+       <link linkend="sql-createindex"><command>CREATE INDEX</command></link>. For partitioned
+       tables, <structfield>relpages</structfield> is <literal>-1</literal>.
       </para></entry>
      </row>
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 0078a12f26..d21bf0b7da 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -987,7 +987,10 @@ AddNewRelationTuple(Relation pg_class_desc,
 	new_rel_reltup = new_rel_desc->rd_rel;
 
 	/* The relation is empty */
-	new_rel_reltup->relpages = 0;
+	if (relkind == RELKIND_PARTITIONED_TABLE)
+		new_rel_reltup->relpages = -1;
+	else
+		new_rel_reltup->relpages = 0;
 	new_rel_reltup->reltuples = -1;
 	new_rel_reltup->relallvisible = 0;
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index ac8f5d9c25..eff65b7714 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -1402,13 +1402,14 @@ vac_estimate_reltuples(Relation relation,
  *		always allowable.
  *
  *		Note: num_tuples should count only *live* tuples, since
- *		pg_class.reltuples is defined that way.
+ *		pg_class.reltuples is defined that way. Also, num_pages is signed,
+ *		because partitioned tables have relpages of -1.
  *
  *		This routine is shared by VACUUM and ANALYZE.
  */
 void
 vac_update_relstats(Relation relation,
-					BlockNumber num_pages, double num_tuples,
+					int32 num_pages, double num_tuples,
 					BlockNumber num_all_visible_pages,
 					bool hasindex, TransactionId frozenxid,
 					MultiXactId minmulti,
@@ -1444,9 +1445,9 @@ vac_update_relstats(Relation relation,
 	/* Apply statistical updates, if any, to copied tuple */
 
 	dirty = false;
-	if (pgcform->relpages != (int32) num_pages)
+	if (pgcform->relpages != num_pages)
 	{
-		pgcform->relpages = (int32) num_pages;
+		pgcform->relpages = num_pages;
 		dirty = true;
 	}
 	if (pgcform->reltuples != (float4) num_tuples)
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 759f9a87d3..ee3522ef8b 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -326,7 +326,7 @@ extern double vac_estimate_reltuples(Relation relation,
 									 BlockNumber scanned_pages,
 									 double scanned_tuples);
 extern void vac_update_relstats(Relation relation,
-								BlockNumber num_pages,
+								int32 num_pages,
 								double num_tuples,
 								BlockNumber num_all_visible_pages,
 								bool hasindex,
-- 
2.34.1

Reply via email to