agora inbox for [email protected]  
help / color / mirror / Atom feed
[PATCH v5 07/12] consistent language: to which
13+ messages / 4 participants
[nested] [flat]

* [PATCH v5 07/12] consistent language: to which
@ 2019-05-21 00:02 Justin Pryzby <[email protected]>
  0 siblings, 0 replies; 13+ messages in thread

From: Justin Pryzby @ 2019-05-21 00:02 UTC (permalink / raw)

XXX: should have trailing period in tables?
---
 doc/src/sgml/monitoring.sgml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index cba36c0..df5df62 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -602,12 +602,12 @@ postgres   27093  0.0  0.0  30096  2752 ?        Ss   11:34   0:00 postgres: ser
     <row>
      <entry><structfield>datid</structfield></entry>
      <entry><type>oid</type></entry>
-     <entry>OID of the database this backend is connected to</entry>
+     <entry>OID of the database to which this backend is connected</entry>
     </row>
     <row>
      <entry><structfield>datname</structfield></entry>
      <entry><type>name</type></entry>
-     <entry>Name of the database this backend is connected to</entry>
+     <entry>Name of the database to which this backend is connected</entry>
     </row>
     <row>
      <entry><structfield>pid</structfield></entry>
@@ -2099,7 +2099,7 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i
      <entry><type>text</type></entry>
      <entry>
       Host of the <productname>PostgreSQL</productname> instance
-      this WAL receiver is connected to. This can be a host name,
+      to which this WAL receiver is connected. This can be a host name,
       an IP address, or a directory path if the connection is via
       Unix socket.  (The path case can be distinguished because it
       will always be an absolute path, beginning with <literal>/</literal>.)
@@ -2110,7 +2110,7 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i
      <entry><type>integer</type></entry>
      <entry>
       Port number of the <productname>PostgreSQL</productname> instance
-      this WAL receiver is connected to.
+      to which this WAL receiver is connected.
      </entry>
     </row>
     <row>
@@ -3375,7 +3375,7 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
      <row>
       <entry><literal><function>pg_stat_get_backend_dbid(integer)</function></literal></entry>
       <entry><type>oid</type></entry>
-      <entry>OID of the database this backend is connected to</entry>
+      <entry>OID of the database to which this backend is connected</entry>
      </row>
 
      <row>
-- 
2.7.4


--FkmkrVfFsRoUs1wW
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
 filename="v5-0008-Consistent-language-contains.patch"



^ permalink  raw  reply  [nested|flat] 13+ messages in thread

* [PATCH v16 1/3] Remember PK oid for partitioned tables even when it's invalid
@ 2023-07-12 16:57 Alvaro Herrera <[email protected]>
  0 siblings, 0 replies; 13+ messages in thread

From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw)

---
 src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 8e28335915..7c3bfde571 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation)
 		result = lappend_oid(result, index->indexrelid);
 
 		/*
-		 * Invalid, non-unique, non-immediate or predicate indexes aren't
-		 * interesting for either oid indexes or replication identity indexes,
-		 * so don't check them.
+		 * Non-unique, non-immediate or predicate indexes aren't interesting
+		 * for either oid indexes or replication identity indexes, so don't
+		 * check them.
 		 */
-		if (!index->indisvalid || !index->indisunique ||
+		if (!index->indisunique ||
 			!index->indimmediate ||
 			!heap_attisnull(htup, Anum_pg_index_indpred, NULL))
 			continue;
 
-		/* remember primary key index if any */
-		if (index->indisprimary)
+		/*
+		 * Remember primary key index, if any.  We do this only if the index
+		 * is valid; but if the table is partitioned, then we do it even if
+		 * it's invalid.
+		 *
+		 * The reason for returning invalid primary keys for foreign tables is
+		 * because of pg_dump of NOT NULL constraints, and the fact that PKs
+		 * remain marked invalid until the partitions' PKs are attached to it.
+		 * If we make rd_pkindex invalid, then the attnotnull flag is reset
+		 * after the PK is created, which causes the ALTER INDEX ATTACH
+		 * PARTITION to fail with 'column ... is not marked NOT NULL'.  With
+		 * this, dropconstraint_internal() will believe that the columns must
+		 * not have attnotnull reset, so the PKs-on-partitions can be attached
+		 * correctly, until finally the PK-on-parent is marked valid.
+		 *
+		 * Also, this doesn't harm anything, because rd_pkindex is not a
+		 * "real" index anyway, but a RELKIND_PARTITIONED_INDEX.
+		 */
+		if (index->indisprimary &&
+			(index->indisvalid ||
+			 relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE))
 			pkeyIndex = index->indexrelid;
 
+		if (!index->indisvalid)
+			continue;
+
 		/* remember explicitly chosen replica index */
 		if (index->indisreplident)
 			candidateIndex = index->indexrelid;
-- 
2.39.2


--arayebouu3vhq6bx
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
	filename="v16-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch"



^ permalink  raw  reply  [nested|flat] 13+ messages in thread

* [PATCH v13 1/2] Remember PK oid for partitioned tables even when it's invalid
@ 2023-07-12 16:57 Alvaro Herrera <[email protected]>
  0 siblings, 0 replies; 13+ messages in thread

From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw)

---
 src/backend/utils/cache/relcache.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 8a08463c2b..b5a99b4edc 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4788,19 +4788,28 @@ RelationGetIndexList(Relation relation)
 		result = lappend_oid(result, index->indexrelid);
 
 		/*
-		 * Invalid, non-unique, non-immediate or predicate indexes aren't
-		 * interesting for either oid indexes or replication identity indexes,
-		 * so don't check them.
+		 * Non-unique, non-immediate or predicate indexes aren't interesting
+		 * for either oid indexes or replication identity indexes, so don't
+		 * check them.
 		 */
-		if (!index->indisvalid || !index->indisunique ||
+		if (!index->indisunique ||
 			!index->indimmediate ||
 			!heap_attisnull(htup, Anum_pg_index_indpred, NULL))
 			continue;
 
-		/* remember primary key index if any */
-		if (index->indisprimary)
+		/*
+		 * Remember primary key index, if any.  We do this only if the index
+		 * is valid; but if the table is partitioned, then we do it even if
+		 * it's invalid.  XXX does this cause other problems?
+		 */
+		if (index->indisprimary &&
+			(index->indisvalid ||
+			 relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE))
 			pkeyIndex = index->indexrelid;
 
+		if (!index->indisvalid)
+			continue;
+
 		/* remember explicitly chosen replica index */
 		if (index->indisreplident)
 			candidateIndex = index->indexrelid;
-- 
2.39.2


--57gotikuhuh4be5c
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
	filename="v13-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch"



^ permalink  raw  reply  [nested|flat] 13+ messages in thread

* [PATCH v17 1/3] Remember PK oid for partitioned tables even when it's invalid
@ 2023-07-12 16:57 Alvaro Herrera <[email protected]>
  0 siblings, 0 replies; 13+ messages in thread

From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw)

---
 src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 8e08ca1c68..7234cb3da6 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation)
 		result = lappend_oid(result, index->indexrelid);
 
 		/*
-		 * Invalid, non-unique, non-immediate or predicate indexes aren't
-		 * interesting for either oid indexes or replication identity indexes,
-		 * so don't check them.
+		 * Non-unique, non-immediate or predicate indexes aren't interesting
+		 * for either oid indexes or replication identity indexes, so don't
+		 * check them.
 		 */
-		if (!index->indisvalid || !index->indisunique ||
+		if (!index->indisunique ||
 			!index->indimmediate ||
 			!heap_attisnull(htup, Anum_pg_index_indpred, NULL))
 			continue;
 
-		/* remember primary key index if any */
-		if (index->indisprimary)
+		/*
+		 * Remember primary key index, if any.  We do this only if the index
+		 * is valid; but if the table is partitioned, then we do it even if
+		 * it's invalid.
+		 *
+		 * The reason for returning invalid primary keys for foreign tables is
+		 * because of pg_dump of NOT NULL constraints, and the fact that PKs
+		 * remain marked invalid until the partitions' PKs are attached to it.
+		 * If we make rd_pkindex invalid, then the attnotnull flag is reset
+		 * after the PK is created, which causes the ALTER INDEX ATTACH
+		 * PARTITION to fail with 'column ... is not marked NOT NULL'.  With
+		 * this, dropconstraint_internal() will believe that the columns must
+		 * not have attnotnull reset, so the PKs-on-partitions can be attached
+		 * correctly, until finally the PK-on-parent is marked valid.
+		 *
+		 * Also, this doesn't harm anything, because rd_pkindex is not a
+		 * "real" index anyway, but a RELKIND_PARTITIONED_INDEX.
+		 */
+		if (index->indisprimary &&
+			(index->indisvalid ||
+			 relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE))
 			pkeyIndex = index->indexrelid;
 
+		if (!index->indisvalid)
+			continue;
+
 		/* remember explicitly chosen replica index */
 		if (index->indisreplident)
 			candidateIndex = index->indexrelid;
-- 
2.39.2


--u5bqxbslpyv5rwih
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
	filename="v17-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch"



^ permalink  raw  reply  [nested|flat] 13+ messages in thread

* [PATCH v17 1/3] Remember PK oid for partitioned tables even when it's invalid
@ 2023-07-12 16:57 Alvaro Herrera <[email protected]>
  0 siblings, 0 replies; 13+ messages in thread

From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw)

---
 src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 8e08ca1c68..7234cb3da6 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation)
 		result = lappend_oid(result, index->indexrelid);
 
 		/*
-		 * Invalid, non-unique, non-immediate or predicate indexes aren't
-		 * interesting for either oid indexes or replication identity indexes,
-		 * so don't check them.
+		 * Non-unique, non-immediate or predicate indexes aren't interesting
+		 * for either oid indexes or replication identity indexes, so don't
+		 * check them.
 		 */
-		if (!index->indisvalid || !index->indisunique ||
+		if (!index->indisunique ||
 			!index->indimmediate ||
 			!heap_attisnull(htup, Anum_pg_index_indpred, NULL))
 			continue;
 
-		/* remember primary key index if any */
-		if (index->indisprimary)
+		/*
+		 * Remember primary key index, if any.  We do this only if the index
+		 * is valid; but if the table is partitioned, then we do it even if
+		 * it's invalid.
+		 *
+		 * The reason for returning invalid primary keys for foreign tables is
+		 * because of pg_dump of NOT NULL constraints, and the fact that PKs
+		 * remain marked invalid until the partitions' PKs are attached to it.
+		 * If we make rd_pkindex invalid, then the attnotnull flag is reset
+		 * after the PK is created, which causes the ALTER INDEX ATTACH
+		 * PARTITION to fail with 'column ... is not marked NOT NULL'.  With
+		 * this, dropconstraint_internal() will believe that the columns must
+		 * not have attnotnull reset, so the PKs-on-partitions can be attached
+		 * correctly, until finally the PK-on-parent is marked valid.
+		 *
+		 * Also, this doesn't harm anything, because rd_pkindex is not a
+		 * "real" index anyway, but a RELKIND_PARTITIONED_INDEX.
+		 */
+		if (index->indisprimary &&
+			(index->indisvalid ||
+			 relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE))
 			pkeyIndex = index->indexrelid;
 
+		if (!index->indisvalid)
+			continue;
+
 		/* remember explicitly chosen replica index */
 		if (index->indisreplident)
 			candidateIndex = index->indexrelid;
-- 
2.39.2


--u5bqxbslpyv5rwih
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
	filename="v17-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch"



^ permalink  raw  reply  [nested|flat] 13+ messages in thread

* [PATCH v14 1/2] Remember PK oid for partitioned tables even when it's invalid
@ 2023-07-12 16:57 Alvaro Herrera <[email protected]>
  0 siblings, 0 replies; 13+ messages in thread

From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw)

---
 src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 8e28335915..7c3bfde571 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation)
 		result = lappend_oid(result, index->indexrelid);
 
 		/*
-		 * Invalid, non-unique, non-immediate or predicate indexes aren't
-		 * interesting for either oid indexes or replication identity indexes,
-		 * so don't check them.
+		 * Non-unique, non-immediate or predicate indexes aren't interesting
+		 * for either oid indexes or replication identity indexes, so don't
+		 * check them.
 		 */
-		if (!index->indisvalid || !index->indisunique ||
+		if (!index->indisunique ||
 			!index->indimmediate ||
 			!heap_attisnull(htup, Anum_pg_index_indpred, NULL))
 			continue;
 
-		/* remember primary key index if any */
-		if (index->indisprimary)
+		/*
+		 * Remember primary key index, if any.  We do this only if the index
+		 * is valid; but if the table is partitioned, then we do it even if
+		 * it's invalid.
+		 *
+		 * The reason for returning invalid primary keys for foreign tables is
+		 * because of pg_dump of NOT NULL constraints, and the fact that PKs
+		 * remain marked invalid until the partitions' PKs are attached to it.
+		 * If we make rd_pkindex invalid, then the attnotnull flag is reset
+		 * after the PK is created, which causes the ALTER INDEX ATTACH
+		 * PARTITION to fail with 'column ... is not marked NOT NULL'.  With
+		 * this, dropconstraint_internal() will believe that the columns must
+		 * not have attnotnull reset, so the PKs-on-partitions can be attached
+		 * correctly, until finally the PK-on-parent is marked valid.
+		 *
+		 * Also, this doesn't harm anything, because rd_pkindex is not a
+		 * "real" index anyway, but a RELKIND_PARTITIONED_INDEX.
+		 */
+		if (index->indisprimary &&
+			(index->indisvalid ||
+			 relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE))
 			pkeyIndex = index->indexrelid;
 
+		if (!index->indisvalid)
+			continue;
+
 		/* remember explicitly chosen replica index */
 		if (index->indisreplident)
 			candidateIndex = index->indexrelid;
-- 
2.39.2


--6opfqulj2xnxqhkn
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
	filename="v14-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch"



^ permalink  raw  reply  [nested|flat] 13+ messages in thread

* [PATCH v17 1/3] Remember PK oid for partitioned tables even when it's invalid
@ 2023-07-12 16:57 Alvaro Herrera <[email protected]>
  0 siblings, 0 replies; 13+ messages in thread

From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw)

---
 src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 8e08ca1c68..7234cb3da6 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation)
 		result = lappend_oid(result, index->indexrelid);
 
 		/*
-		 * Invalid, non-unique, non-immediate or predicate indexes aren't
-		 * interesting for either oid indexes or replication identity indexes,
-		 * so don't check them.
+		 * Non-unique, non-immediate or predicate indexes aren't interesting
+		 * for either oid indexes or replication identity indexes, so don't
+		 * check them.
 		 */
-		if (!index->indisvalid || !index->indisunique ||
+		if (!index->indisunique ||
 			!index->indimmediate ||
 			!heap_attisnull(htup, Anum_pg_index_indpred, NULL))
 			continue;
 
-		/* remember primary key index if any */
-		if (index->indisprimary)
+		/*
+		 * Remember primary key index, if any.  We do this only if the index
+		 * is valid; but if the table is partitioned, then we do it even if
+		 * it's invalid.
+		 *
+		 * The reason for returning invalid primary keys for foreign tables is
+		 * because of pg_dump of NOT NULL constraints, and the fact that PKs
+		 * remain marked invalid until the partitions' PKs are attached to it.
+		 * If we make rd_pkindex invalid, then the attnotnull flag is reset
+		 * after the PK is created, which causes the ALTER INDEX ATTACH
+		 * PARTITION to fail with 'column ... is not marked NOT NULL'.  With
+		 * this, dropconstraint_internal() will believe that the columns must
+		 * not have attnotnull reset, so the PKs-on-partitions can be attached
+		 * correctly, until finally the PK-on-parent is marked valid.
+		 *
+		 * Also, this doesn't harm anything, because rd_pkindex is not a
+		 * "real" index anyway, but a RELKIND_PARTITIONED_INDEX.
+		 */
+		if (index->indisprimary &&
+			(index->indisvalid ||
+			 relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE))
 			pkeyIndex = index->indexrelid;
 
+		if (!index->indisvalid)
+			continue;
+
 		/* remember explicitly chosen replica index */
 		if (index->indisreplident)
 			candidateIndex = index->indexrelid;
-- 
2.39.2


--u5bqxbslpyv5rwih
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
	filename="v17-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch"



^ permalink  raw  reply  [nested|flat] 13+ messages in thread

* [PATCH v15 1/2] Remember PK oid for partitioned tables even when it's invalid
@ 2023-07-12 16:57 Alvaro Herrera <[email protected]>
  0 siblings, 0 replies; 13+ messages in thread

From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw)

---
 src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 8e28335915..7c3bfde571 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation)
 		result = lappend_oid(result, index->indexrelid);
 
 		/*
-		 * Invalid, non-unique, non-immediate or predicate indexes aren't
-		 * interesting for either oid indexes or replication identity indexes,
-		 * so don't check them.
+		 * Non-unique, non-immediate or predicate indexes aren't interesting
+		 * for either oid indexes or replication identity indexes, so don't
+		 * check them.
 		 */
-		if (!index->indisvalid || !index->indisunique ||
+		if (!index->indisunique ||
 			!index->indimmediate ||
 			!heap_attisnull(htup, Anum_pg_index_indpred, NULL))
 			continue;
 
-		/* remember primary key index if any */
-		if (index->indisprimary)
+		/*
+		 * Remember primary key index, if any.  We do this only if the index
+		 * is valid; but if the table is partitioned, then we do it even if
+		 * it's invalid.
+		 *
+		 * The reason for returning invalid primary keys for foreign tables is
+		 * because of pg_dump of NOT NULL constraints, and the fact that PKs
+		 * remain marked invalid until the partitions' PKs are attached to it.
+		 * If we make rd_pkindex invalid, then the attnotnull flag is reset
+		 * after the PK is created, which causes the ALTER INDEX ATTACH
+		 * PARTITION to fail with 'column ... is not marked NOT NULL'.  With
+		 * this, dropconstraint_internal() will believe that the columns must
+		 * not have attnotnull reset, so the PKs-on-partitions can be attached
+		 * correctly, until finally the PK-on-parent is marked valid.
+		 *
+		 * Also, this doesn't harm anything, because rd_pkindex is not a
+		 * "real" index anyway, but a RELKIND_PARTITIONED_INDEX.
+		 */
+		if (index->indisprimary &&
+			(index->indisvalid ||
+			 relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE))
 			pkeyIndex = index->indexrelid;
 
+		if (!index->indisvalid)
+			continue;
+
 		/* remember explicitly chosen replica index */
 		if (index->indisreplident)
 			candidateIndex = index->indexrelid;
-- 
2.39.2


--icqk4nrzalktuh5g
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
	filename="v15-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch"



^ permalink  raw  reply  [nested|flat] 13+ messages in thread

* [PATCH v15 1/2] Remember PK oid for partitioned tables even when it's invalid
@ 2023-07-12 16:57 Alvaro Herrera <[email protected]>
  0 siblings, 0 replies; 13+ messages in thread

From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw)

---
 src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 8e28335915..7c3bfde571 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation)
 		result = lappend_oid(result, index->indexrelid);
 
 		/*
-		 * Invalid, non-unique, non-immediate or predicate indexes aren't
-		 * interesting for either oid indexes or replication identity indexes,
-		 * so don't check them.
+		 * Non-unique, non-immediate or predicate indexes aren't interesting
+		 * for either oid indexes or replication identity indexes, so don't
+		 * check them.
 		 */
-		if (!index->indisvalid || !index->indisunique ||
+		if (!index->indisunique ||
 			!index->indimmediate ||
 			!heap_attisnull(htup, Anum_pg_index_indpred, NULL))
 			continue;
 
-		/* remember primary key index if any */
-		if (index->indisprimary)
+		/*
+		 * Remember primary key index, if any.  We do this only if the index
+		 * is valid; but if the table is partitioned, then we do it even if
+		 * it's invalid.
+		 *
+		 * The reason for returning invalid primary keys for foreign tables is
+		 * because of pg_dump of NOT NULL constraints, and the fact that PKs
+		 * remain marked invalid until the partitions' PKs are attached to it.
+		 * If we make rd_pkindex invalid, then the attnotnull flag is reset
+		 * after the PK is created, which causes the ALTER INDEX ATTACH
+		 * PARTITION to fail with 'column ... is not marked NOT NULL'.  With
+		 * this, dropconstraint_internal() will believe that the columns must
+		 * not have attnotnull reset, so the PKs-on-partitions can be attached
+		 * correctly, until finally the PK-on-parent is marked valid.
+		 *
+		 * Also, this doesn't harm anything, because rd_pkindex is not a
+		 * "real" index anyway, but a RELKIND_PARTITIONED_INDEX.
+		 */
+		if (index->indisprimary &&
+			(index->indisvalid ||
+			 relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE))
 			pkeyIndex = index->indexrelid;
 
+		if (!index->indisvalid)
+			continue;
+
 		/* remember explicitly chosen replica index */
 		if (index->indisreplident)
 			candidateIndex = index->indexrelid;
-- 
2.39.2


--icqk4nrzalktuh5g
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
	filename="v15-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch"



^ permalink  raw  reply  [nested|flat] 13+ messages in thread

* [PATCH v3a] edit comments and stuff
@ 2026-01-05 14:26 Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 13+ messages in thread

From: Álvaro Herrera @ 2026-01-05 14:26 UTC (permalink / raw)

---
 src/backend/utils/sort/tuplesort.c     |   2 +-
 src/include/executor/instrument_node.h | 146 ++++++++++++-------------
 src/include/utils/tuplesort.h          |  15 ---
 3 files changed, 73 insertions(+), 90 deletions(-)

diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c
index 473d31188b8..9e4cd816137 100644
--- a/src/backend/utils/sort/tuplesort.c
+++ b/src/backend/utils/sort/tuplesort.c
@@ -200,7 +200,7 @@ struct Tuplesortstate
 	int64		maxSpace;		/* maximum amount of space occupied among sort
 								 * of groups, either in-memory or on-disk */
 	bool		isMaxSpaceDisk; /* true when maxSpace is value for on-disk
-								 * space, false when its value for in-memory
+								 * space, false when it's value for in-memory
 								 * space */
 	TupSortStatus maxSpaceStatus;	/* sort status when maxSpace was reached */
 	LogicalTapeSet *tapeset;	/* logtape.c object for tapes in a temp file */
diff --git a/src/include/executor/instrument_node.h b/src/include/executor/instrument_node.h
index 75520008c36..49627eb4a27 100644
--- a/src/include/executor/instrument_node.h
+++ b/src/include/executor/instrument_node.h
@@ -1,8 +1,12 @@
 /*-------------------------------------------------------------------------
  *
  * instrument_node.h
- *	  Definitions for node-specific instrumentation
+ *	  Definitions for node-specific support for parallel query instrumentation
  *
+ * These structs purposely contain no pointers because they are copied
+ * across processes during parallel query execution.  Each worker copies its
+ * individual information into the container struct at executor shutdown time,
+ * to allow the leader to display the information in EXPLAIN ANALYZE.
  *
  * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
@@ -15,32 +19,30 @@
 #define INSTRUMENT_NODE_H
 
 
-
 /* ---------------------
- * per-worker aggregate information
+ *	Instrumentation information for aggregate function execution
  * ---------------------
  */
 typedef struct AggregateInstrumentation
 {
-	Size	hash_mem_peak; /* peak hash table memory usage */
-	uint64	hash_disk_used; /*kB of disk space used */
-	int		hash_batches_used; /* batches used during entire execution */
+	Size		hash_mem_peak;	/* peak hash table memory usage */
+	uint64		hash_disk_used; /* kB of disk space used */
+	int			hash_batches_used;	/* batches used during entire execution */
 } AggregateInstrumentation;
 
-/* ----------------
- *    Shared memory container for per-worker aggregate information
- * ----------------
+/*
+ * Shared memory container for per-worker aggregate information
  */
 typedef struct SharedAggInfo
 {
-	int	num_workers;
+	int			num_workers;
 	AggregateInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER];
 } SharedAggInfo;
-/*
- * Struct for statistics maintained by amgettuple and amgetbitmap
- *
- * Note: IndexScanInstrumentation can't contain any pointers, since it is
- * copied into a SharedIndexScanInstrumentation during parallel scans
+
+
+/* ---------------------
+ *	Instrumentation information for indexscans (amgettuple and amgetbitmap)
+ * ---------------------
  */
 typedef struct IndexScanInstrumentation
 {
@@ -49,7 +51,7 @@ typedef struct IndexScanInstrumentation
 } IndexScanInstrumentation;
 
 /*
- * Struct for every worker's IndexScanInstrumentation, stored in shared memory
+ * Shared memory container for per-worker information
  */
 typedef struct SharedIndexScanInstrumentation
 {
@@ -57,11 +59,13 @@ typedef struct SharedIndexScanInstrumentation
 	IndexScanInstrumentation winstrument[FLEXIBLE_ARRAY_MEMBER];
 } SharedIndexScanInstrumentation;
 
-/*
- *	 BitmapHeapScanInstrumentation information
+
+/* ---------------------
+ *	Instrumentation information for bitmap heap scans
  *
  *		exact_pages		   total number of exact pages retrieved
  *		lossy_pages		   total number of lossy pages retrieved
+ * ---------------------
  */
 typedef struct BitmapHeapScanInstrumentation
 {
@@ -70,11 +74,7 @@ typedef struct BitmapHeapScanInstrumentation
 } BitmapHeapScanInstrumentation;
 
 /*
- *	 Instrumentation data for a parallel bitmap heap scan.
- *
- * A shared memory struct that each parallel worker copies its
- * BitmapHeapScanInstrumentation information into at executor shutdown to
- * allow the leader to display the information in EXPLAIN ANALYZE.
+ * Shared memory container for per-worker information
  */
 typedef struct SharedBitmapHeapInstrumentation
 {
@@ -83,25 +83,27 @@ typedef struct SharedBitmapHeapInstrumentation
 } SharedBitmapHeapInstrumentation;
 
 
+/* ---------------------
+ *	Instrumentation information for Memoize
+ * ---------------------
+ */
 typedef struct MemoizeInstrumentation
 {
-	uint64 cache_hits;		/* number of rescans where we've found the
-							 * scan parameters values to be cached */
-	uint64 cache_misses;	/* number of rescans where we've not found the
-							 * scan parameters values to be cached */
-	uint64 cache_evictions;	/* number of cache entries removed due to
-							 * the need to free memory */
-	uint64 cache_overflows;	/* number of times we've had to bypass the
-							 * cache when filling it due to not being
-							 * able to free enough space to store the
-							 * current scan's tuples */
-	uint64	mem_peak;		/* peak memory usage in bytes */
-
+	uint64		cache_hits;		/* number of rescans where we've found the
+								 * scan parameters values to be cached */
+	uint64		cache_misses;	/* number of rescans where we've not found the
+								 * scan parameters values to be cached */
+	uint64		cache_evictions;	/* number of cache entries removed due to
+									 * the need to free memory */
+	uint64		cache_overflows;	/* number of times we've had to bypass the
+									 * cache when filling it due to not being
+									 * able to free enough space to store the
+									 * current scan's tuples */
+	uint64		mem_peak;		/* peak memory usage in bytes */
 } MemoizeInstrumentation;
 
-/* ----------------
- *  Shared memory container for per-worker memoize information
- *  ----------------
+/*
+ * Shared memory container for per-worker memoize information
  */
 typedef struct SharedMemoizeInfo
 {
@@ -110,27 +112,25 @@ typedef struct SharedMemoizeInfo
 } SharedMemoizeInfo;
 
 
-/*
- * Data structures for reporting sort statistics.  Note that
- * TuplesortInstrumentation can't contain any pointers because we
- * sometimes put it in shared memory.
- *
- * The parallel-sort infrastructure relies on having a zero TuplesortMethod
- * to indicate that a worker never did anything, so we assign zero to
- * SORT_TYPE_STILL_IN_PROGRESS.  The other values of this enum can be
- * OR'ed together to represent a situation where different workers used
- * different methods, so we need a separate bit for each one.  Keep the
- * NUM_TUPLESORTMETHODS constant in sync with the number of bits!
+/* ---------------------
+ *	Instrumentation information for Sorts.
+ * ---------------------
  */
 
-#define NUM_TUPLESORTMETHODS 4
-
 typedef enum
 {
 	SORT_SPACE_TYPE_DISK,
 	SORT_SPACE_TYPE_MEMORY,
 } TuplesortSpaceType;
 
+/*
+ * The parallel-sort infrastructure relies on having a zero TuplesortMethod
+ * to indicate that a worker never did anything, so we assign zero to
+ * SORT_TYPE_STILL_IN_PROGRESS.  The other values of this enum can be
+ * OR'ed together to represent a situation where different workers used
+ * different methods, so we need a separate bit for each one.  Keep the
+ * NUM_TUPLESORTMETHODS constant in sync with the number of bits!
+ */
 typedef enum
 {
 	SORT_TYPE_STILL_IN_PROGRESS = 0,
@@ -139,40 +139,40 @@ typedef enum
 	SORT_TYPE_EXTERNAL_SORT = 1 << 2,
 	SORT_TYPE_EXTERNAL_MERGE = 1 << 3
 } TuplesortMethod;
+#define NUM_TUPLESORTMETHODS 4
 
 typedef struct TuplesortInstrumentation
 {
-	TuplesortMethod sortMethod;		/* sort algorithm used */
+	TuplesortMethod sortMethod; /* sort algorithm used */
 	TuplesortSpaceType spaceType;	/* type of space spaceUsed represents */
-	int64       spaceUsed;			/* space consumption, in kB */
+	int64		spaceUsed;		/* space consumption, in kB */
 } TuplesortInstrumentation;
 
-/* ----------------
- *  Shared memory container for per-worker sort information
- *  ----------------
+/*
+ * Shared memory container for per-worker sort information
  */
 typedef struct SharedSortInfo
 {
-	int num_workers;
+	int			num_workers;
 	TuplesortInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER];
 } SharedSortInfo;
 
-/* ----------------
- *   Values displayed by EXPLAIN ANALYZE
- * ----------------
+
+/* ---------------------
+ *   Instrumentation information for nodeHash.c
+ * ---------------------
  */
 typedef struct HashInstrumentation
 {
-	int		nbuckets;			/* number of buckets at end of execution */
-	int		nbuckets_original;	/* planned number of buckets */
-	int		nbatch;				/* number of batches at end of execution */
-	int		nbatch_original;	/* planned number of batches */
-	Size	space_peak;			/* peak memory usage in bytes */
+	int			nbuckets;		/* number of buckets at end of execution */
+	int			nbuckets_original;	/* planned number of buckets */
+	int			nbatch;			/* number of batches at end of execution */
+	int			nbatch_original;	/* planned number of batches */
+	Size		space_peak;		/* peak memory usage in bytes */
 } HashInstrumentation;
 
-/* ----------------
- *   Shared memory container for per-worker hash information
- * ----------------
+/*
+ * Shared memory container for per-worker information
  */
 typedef struct SharedHashInfo
 {
@@ -180,9 +180,10 @@ typedef struct SharedHashInfo
 	HashInstrumentation hinstrument[FLEXIBLE_ARRAY_MEMBER];
 } SharedHashInfo;
 
-/* ----------------
+
+/* ---------------------
  *   Instrumentation information for IncrementalSort
- * ----------------
+ * ---------------------
  */
 typedef struct IncrementalSortGroupInfo
 {
@@ -200,10 +201,7 @@ typedef struct IncrementalSortInfo
 	IncrementalSortGroupInfo prefixsortGroupInfo;
 } IncrementalSortInfo;
 
-/* ----------------
- *   Shared memory container for per-worker incremental sort information
- * ----------------
- */
+/* Shared memory container for per-worker incremental sort information */
 typedef struct SharedIncrementalSortInfo
 {
 	int			num_workers;
diff --git a/src/include/utils/tuplesort.h b/src/include/utils/tuplesort.h
index a7e867f36b8..943a2b7dc93 100644
--- a/src/include/utils/tuplesort.h
+++ b/src/include/utils/tuplesort.h
@@ -62,21 +62,6 @@ typedef struct SortCoordinateData
 
 typedef struct SortCoordinateData *SortCoordinate;
 
-/*
- * Data structures for reporting sort statistics.  Note that
- * TuplesortInstrumentation can't contain any pointers because we
- * sometimes put it in shared memory.
- *
- * The parallel-sort infrastructure relies on having a zero TuplesortMethod
- * to indicate that a worker never did anything, so we assign zero to
- * SORT_TYPE_STILL_IN_PROGRESS.  The other values of this enum can be
- * OR'ed together to represent a situation where different workers used
- * different methods, so we need a separate bit for each one.  Keep the
- * NUM_TUPLESORTMETHODS constant in sync with the number of bits!
- */
-
-#define NUM_TUPLESORTMETHODS 4
-
 /* Bitwise option flags for tuple sorts */
 #define TUPLESORT_NONE					0
 
-- 
2.47.3


--xs5il3t73pzvzpq7--






^ permalink  raw  reply  [nested|flat] 13+ messages in thread

* [PATCH v3a] edit comments and stuff
@ 2026-01-05 14:26 Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 13+ messages in thread

From: Álvaro Herrera @ 2026-01-05 14:26 UTC (permalink / raw)

---
 src/backend/utils/sort/tuplesort.c     |   2 +-
 src/include/executor/instrument_node.h | 146 ++++++++++++-------------
 src/include/utils/tuplesort.h          |  15 ---
 3 files changed, 73 insertions(+), 90 deletions(-)

diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c
index 473d31188b8..9e4cd816137 100644
--- a/src/backend/utils/sort/tuplesort.c
+++ b/src/backend/utils/sort/tuplesort.c
@@ -200,7 +200,7 @@ struct Tuplesortstate
 	int64		maxSpace;		/* maximum amount of space occupied among sort
 								 * of groups, either in-memory or on-disk */
 	bool		isMaxSpaceDisk; /* true when maxSpace is value for on-disk
-								 * space, false when its value for in-memory
+								 * space, false when it's value for in-memory
 								 * space */
 	TupSortStatus maxSpaceStatus;	/* sort status when maxSpace was reached */
 	LogicalTapeSet *tapeset;	/* logtape.c object for tapes in a temp file */
diff --git a/src/include/executor/instrument_node.h b/src/include/executor/instrument_node.h
index 75520008c36..49627eb4a27 100644
--- a/src/include/executor/instrument_node.h
+++ b/src/include/executor/instrument_node.h
@@ -1,8 +1,12 @@
 /*-------------------------------------------------------------------------
  *
  * instrument_node.h
- *	  Definitions for node-specific instrumentation
+ *	  Definitions for node-specific support for parallel query instrumentation
  *
+ * These structs purposely contain no pointers because they are copied
+ * across processes during parallel query execution.  Each worker copies its
+ * individual information into the container struct at executor shutdown time,
+ * to allow the leader to display the information in EXPLAIN ANALYZE.
  *
  * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
@@ -15,32 +19,30 @@
 #define INSTRUMENT_NODE_H
 
 
-
 /* ---------------------
- * per-worker aggregate information
+ *	Instrumentation information for aggregate function execution
  * ---------------------
  */
 typedef struct AggregateInstrumentation
 {
-	Size	hash_mem_peak; /* peak hash table memory usage */
-	uint64	hash_disk_used; /*kB of disk space used */
-	int		hash_batches_used; /* batches used during entire execution */
+	Size		hash_mem_peak;	/* peak hash table memory usage */
+	uint64		hash_disk_used; /* kB of disk space used */
+	int			hash_batches_used;	/* batches used during entire execution */
 } AggregateInstrumentation;
 
-/* ----------------
- *    Shared memory container for per-worker aggregate information
- * ----------------
+/*
+ * Shared memory container for per-worker aggregate information
  */
 typedef struct SharedAggInfo
 {
-	int	num_workers;
+	int			num_workers;
 	AggregateInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER];
 } SharedAggInfo;
-/*
- * Struct for statistics maintained by amgettuple and amgetbitmap
- *
- * Note: IndexScanInstrumentation can't contain any pointers, since it is
- * copied into a SharedIndexScanInstrumentation during parallel scans
+
+
+/* ---------------------
+ *	Instrumentation information for indexscans (amgettuple and amgetbitmap)
+ * ---------------------
  */
 typedef struct IndexScanInstrumentation
 {
@@ -49,7 +51,7 @@ typedef struct IndexScanInstrumentation
 } IndexScanInstrumentation;
 
 /*
- * Struct for every worker's IndexScanInstrumentation, stored in shared memory
+ * Shared memory container for per-worker information
  */
 typedef struct SharedIndexScanInstrumentation
 {
@@ -57,11 +59,13 @@ typedef struct SharedIndexScanInstrumentation
 	IndexScanInstrumentation winstrument[FLEXIBLE_ARRAY_MEMBER];
 } SharedIndexScanInstrumentation;
 
-/*
- *	 BitmapHeapScanInstrumentation information
+
+/* ---------------------
+ *	Instrumentation information for bitmap heap scans
  *
  *		exact_pages		   total number of exact pages retrieved
  *		lossy_pages		   total number of lossy pages retrieved
+ * ---------------------
  */
 typedef struct BitmapHeapScanInstrumentation
 {
@@ -70,11 +74,7 @@ typedef struct BitmapHeapScanInstrumentation
 } BitmapHeapScanInstrumentation;
 
 /*
- *	 Instrumentation data for a parallel bitmap heap scan.
- *
- * A shared memory struct that each parallel worker copies its
- * BitmapHeapScanInstrumentation information into at executor shutdown to
- * allow the leader to display the information in EXPLAIN ANALYZE.
+ * Shared memory container for per-worker information
  */
 typedef struct SharedBitmapHeapInstrumentation
 {
@@ -83,25 +83,27 @@ typedef struct SharedBitmapHeapInstrumentation
 } SharedBitmapHeapInstrumentation;
 
 
+/* ---------------------
+ *	Instrumentation information for Memoize
+ * ---------------------
+ */
 typedef struct MemoizeInstrumentation
 {
-	uint64 cache_hits;		/* number of rescans where we've found the
-							 * scan parameters values to be cached */
-	uint64 cache_misses;	/* number of rescans where we've not found the
-							 * scan parameters values to be cached */
-	uint64 cache_evictions;	/* number of cache entries removed due to
-							 * the need to free memory */
-	uint64 cache_overflows;	/* number of times we've had to bypass the
-							 * cache when filling it due to not being
-							 * able to free enough space to store the
-							 * current scan's tuples */
-	uint64	mem_peak;		/* peak memory usage in bytes */
-
+	uint64		cache_hits;		/* number of rescans where we've found the
+								 * scan parameters values to be cached */
+	uint64		cache_misses;	/* number of rescans where we've not found the
+								 * scan parameters values to be cached */
+	uint64		cache_evictions;	/* number of cache entries removed due to
+									 * the need to free memory */
+	uint64		cache_overflows;	/* number of times we've had to bypass the
+									 * cache when filling it due to not being
+									 * able to free enough space to store the
+									 * current scan's tuples */
+	uint64		mem_peak;		/* peak memory usage in bytes */
 } MemoizeInstrumentation;
 
-/* ----------------
- *  Shared memory container for per-worker memoize information
- *  ----------------
+/*
+ * Shared memory container for per-worker memoize information
  */
 typedef struct SharedMemoizeInfo
 {
@@ -110,27 +112,25 @@ typedef struct SharedMemoizeInfo
 } SharedMemoizeInfo;
 
 
-/*
- * Data structures for reporting sort statistics.  Note that
- * TuplesortInstrumentation can't contain any pointers because we
- * sometimes put it in shared memory.
- *
- * The parallel-sort infrastructure relies on having a zero TuplesortMethod
- * to indicate that a worker never did anything, so we assign zero to
- * SORT_TYPE_STILL_IN_PROGRESS.  The other values of this enum can be
- * OR'ed together to represent a situation where different workers used
- * different methods, so we need a separate bit for each one.  Keep the
- * NUM_TUPLESORTMETHODS constant in sync with the number of bits!
+/* ---------------------
+ *	Instrumentation information for Sorts.
+ * ---------------------
  */
 
-#define NUM_TUPLESORTMETHODS 4
-
 typedef enum
 {
 	SORT_SPACE_TYPE_DISK,
 	SORT_SPACE_TYPE_MEMORY,
 } TuplesortSpaceType;
 
+/*
+ * The parallel-sort infrastructure relies on having a zero TuplesortMethod
+ * to indicate that a worker never did anything, so we assign zero to
+ * SORT_TYPE_STILL_IN_PROGRESS.  The other values of this enum can be
+ * OR'ed together to represent a situation where different workers used
+ * different methods, so we need a separate bit for each one.  Keep the
+ * NUM_TUPLESORTMETHODS constant in sync with the number of bits!
+ */
 typedef enum
 {
 	SORT_TYPE_STILL_IN_PROGRESS = 0,
@@ -139,40 +139,40 @@ typedef enum
 	SORT_TYPE_EXTERNAL_SORT = 1 << 2,
 	SORT_TYPE_EXTERNAL_MERGE = 1 << 3
 } TuplesortMethod;
+#define NUM_TUPLESORTMETHODS 4
 
 typedef struct TuplesortInstrumentation
 {
-	TuplesortMethod sortMethod;		/* sort algorithm used */
+	TuplesortMethod sortMethod; /* sort algorithm used */
 	TuplesortSpaceType spaceType;	/* type of space spaceUsed represents */
-	int64       spaceUsed;			/* space consumption, in kB */
+	int64		spaceUsed;		/* space consumption, in kB */
 } TuplesortInstrumentation;
 
-/* ----------------
- *  Shared memory container for per-worker sort information
- *  ----------------
+/*
+ * Shared memory container for per-worker sort information
  */
 typedef struct SharedSortInfo
 {
-	int num_workers;
+	int			num_workers;
 	TuplesortInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER];
 } SharedSortInfo;
 
-/* ----------------
- *   Values displayed by EXPLAIN ANALYZE
- * ----------------
+
+/* ---------------------
+ *   Instrumentation information for nodeHash.c
+ * ---------------------
  */
 typedef struct HashInstrumentation
 {
-	int		nbuckets;			/* number of buckets at end of execution */
-	int		nbuckets_original;	/* planned number of buckets */
-	int		nbatch;				/* number of batches at end of execution */
-	int		nbatch_original;	/* planned number of batches */
-	Size	space_peak;			/* peak memory usage in bytes */
+	int			nbuckets;		/* number of buckets at end of execution */
+	int			nbuckets_original;	/* planned number of buckets */
+	int			nbatch;			/* number of batches at end of execution */
+	int			nbatch_original;	/* planned number of batches */
+	Size		space_peak;		/* peak memory usage in bytes */
 } HashInstrumentation;
 
-/* ----------------
- *   Shared memory container for per-worker hash information
- * ----------------
+/*
+ * Shared memory container for per-worker information
  */
 typedef struct SharedHashInfo
 {
@@ -180,9 +180,10 @@ typedef struct SharedHashInfo
 	HashInstrumentation hinstrument[FLEXIBLE_ARRAY_MEMBER];
 } SharedHashInfo;
 
-/* ----------------
+
+/* ---------------------
  *   Instrumentation information for IncrementalSort
- * ----------------
+ * ---------------------
  */
 typedef struct IncrementalSortGroupInfo
 {
@@ -200,10 +201,7 @@ typedef struct IncrementalSortInfo
 	IncrementalSortGroupInfo prefixsortGroupInfo;
 } IncrementalSortInfo;
 
-/* ----------------
- *   Shared memory container for per-worker incremental sort information
- * ----------------
- */
+/* Shared memory container for per-worker incremental sort information */
 typedef struct SharedIncrementalSortInfo
 {
 	int			num_workers;
diff --git a/src/include/utils/tuplesort.h b/src/include/utils/tuplesort.h
index a7e867f36b8..943a2b7dc93 100644
--- a/src/include/utils/tuplesort.h
+++ b/src/include/utils/tuplesort.h
@@ -62,21 +62,6 @@ typedef struct SortCoordinateData
 
 typedef struct SortCoordinateData *SortCoordinate;
 
-/*
- * Data structures for reporting sort statistics.  Note that
- * TuplesortInstrumentation can't contain any pointers because we
- * sometimes put it in shared memory.
- *
- * The parallel-sort infrastructure relies on having a zero TuplesortMethod
- * to indicate that a worker never did anything, so we assign zero to
- * SORT_TYPE_STILL_IN_PROGRESS.  The other values of this enum can be
- * OR'ed together to represent a situation where different workers used
- * different methods, so we need a separate bit for each one.  Keep the
- * NUM_TUPLESORTMETHODS constant in sync with the number of bits!
- */
-
-#define NUM_TUPLESORTMETHODS 4
-
 /* Bitwise option flags for tuple sorts */
 #define TUPLESORT_NONE					0
 
-- 
2.47.3


--xs5il3t73pzvzpq7--





^ permalink  raw  reply  [nested|flat] 13+ messages in thread

* [PATCH v3a] edit comments and stuff
@ 2026-01-05 14:26 Álvaro Herrera <[email protected]>
  0 siblings, 0 replies; 13+ messages in thread

From: Álvaro Herrera @ 2026-01-05 14:26 UTC (permalink / raw)

---
 src/backend/utils/sort/tuplesort.c     |   2 +-
 src/include/executor/instrument_node.h | 146 ++++++++++++-------------
 src/include/utils/tuplesort.h          |  15 ---
 3 files changed, 73 insertions(+), 90 deletions(-)

diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c
index 473d31188b8..9e4cd816137 100644
--- a/src/backend/utils/sort/tuplesort.c
+++ b/src/backend/utils/sort/tuplesort.c
@@ -200,7 +200,7 @@ struct Tuplesortstate
 	int64		maxSpace;		/* maximum amount of space occupied among sort
 								 * of groups, either in-memory or on-disk */
 	bool		isMaxSpaceDisk; /* true when maxSpace is value for on-disk
-								 * space, false when its value for in-memory
+								 * space, false when it's value for in-memory
 								 * space */
 	TupSortStatus maxSpaceStatus;	/* sort status when maxSpace was reached */
 	LogicalTapeSet *tapeset;	/* logtape.c object for tapes in a temp file */
diff --git a/src/include/executor/instrument_node.h b/src/include/executor/instrument_node.h
index 75520008c36..49627eb4a27 100644
--- a/src/include/executor/instrument_node.h
+++ b/src/include/executor/instrument_node.h
@@ -1,8 +1,12 @@
 /*-------------------------------------------------------------------------
  *
  * instrument_node.h
- *	  Definitions for node-specific instrumentation
+ *	  Definitions for node-specific support for parallel query instrumentation
  *
+ * These structs purposely contain no pointers because they are copied
+ * across processes during parallel query execution.  Each worker copies its
+ * individual information into the container struct at executor shutdown time,
+ * to allow the leader to display the information in EXPLAIN ANALYZE.
  *
  * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
@@ -15,32 +19,30 @@
 #define INSTRUMENT_NODE_H
 
 
-
 /* ---------------------
- * per-worker aggregate information
+ *	Instrumentation information for aggregate function execution
  * ---------------------
  */
 typedef struct AggregateInstrumentation
 {
-	Size	hash_mem_peak; /* peak hash table memory usage */
-	uint64	hash_disk_used; /*kB of disk space used */
-	int		hash_batches_used; /* batches used during entire execution */
+	Size		hash_mem_peak;	/* peak hash table memory usage */
+	uint64		hash_disk_used; /* kB of disk space used */
+	int			hash_batches_used;	/* batches used during entire execution */
 } AggregateInstrumentation;
 
-/* ----------------
- *    Shared memory container for per-worker aggregate information
- * ----------------
+/*
+ * Shared memory container for per-worker aggregate information
  */
 typedef struct SharedAggInfo
 {
-	int	num_workers;
+	int			num_workers;
 	AggregateInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER];
 } SharedAggInfo;
-/*
- * Struct for statistics maintained by amgettuple and amgetbitmap
- *
- * Note: IndexScanInstrumentation can't contain any pointers, since it is
- * copied into a SharedIndexScanInstrumentation during parallel scans
+
+
+/* ---------------------
+ *	Instrumentation information for indexscans (amgettuple and amgetbitmap)
+ * ---------------------
  */
 typedef struct IndexScanInstrumentation
 {
@@ -49,7 +51,7 @@ typedef struct IndexScanInstrumentation
 } IndexScanInstrumentation;
 
 /*
- * Struct for every worker's IndexScanInstrumentation, stored in shared memory
+ * Shared memory container for per-worker information
  */
 typedef struct SharedIndexScanInstrumentation
 {
@@ -57,11 +59,13 @@ typedef struct SharedIndexScanInstrumentation
 	IndexScanInstrumentation winstrument[FLEXIBLE_ARRAY_MEMBER];
 } SharedIndexScanInstrumentation;
 
-/*
- *	 BitmapHeapScanInstrumentation information
+
+/* ---------------------
+ *	Instrumentation information for bitmap heap scans
  *
  *		exact_pages		   total number of exact pages retrieved
  *		lossy_pages		   total number of lossy pages retrieved
+ * ---------------------
  */
 typedef struct BitmapHeapScanInstrumentation
 {
@@ -70,11 +74,7 @@ typedef struct BitmapHeapScanInstrumentation
 } BitmapHeapScanInstrumentation;
 
 /*
- *	 Instrumentation data for a parallel bitmap heap scan.
- *
- * A shared memory struct that each parallel worker copies its
- * BitmapHeapScanInstrumentation information into at executor shutdown to
- * allow the leader to display the information in EXPLAIN ANALYZE.
+ * Shared memory container for per-worker information
  */
 typedef struct SharedBitmapHeapInstrumentation
 {
@@ -83,25 +83,27 @@ typedef struct SharedBitmapHeapInstrumentation
 } SharedBitmapHeapInstrumentation;
 
 
+/* ---------------------
+ *	Instrumentation information for Memoize
+ * ---------------------
+ */
 typedef struct MemoizeInstrumentation
 {
-	uint64 cache_hits;		/* number of rescans where we've found the
-							 * scan parameters values to be cached */
-	uint64 cache_misses;	/* number of rescans where we've not found the
-							 * scan parameters values to be cached */
-	uint64 cache_evictions;	/* number of cache entries removed due to
-							 * the need to free memory */
-	uint64 cache_overflows;	/* number of times we've had to bypass the
-							 * cache when filling it due to not being
-							 * able to free enough space to store the
-							 * current scan's tuples */
-	uint64	mem_peak;		/* peak memory usage in bytes */
-
+	uint64		cache_hits;		/* number of rescans where we've found the
+								 * scan parameters values to be cached */
+	uint64		cache_misses;	/* number of rescans where we've not found the
+								 * scan parameters values to be cached */
+	uint64		cache_evictions;	/* number of cache entries removed due to
+									 * the need to free memory */
+	uint64		cache_overflows;	/* number of times we've had to bypass the
+									 * cache when filling it due to not being
+									 * able to free enough space to store the
+									 * current scan's tuples */
+	uint64		mem_peak;		/* peak memory usage in bytes */
 } MemoizeInstrumentation;
 
-/* ----------------
- *  Shared memory container for per-worker memoize information
- *  ----------------
+/*
+ * Shared memory container for per-worker memoize information
  */
 typedef struct SharedMemoizeInfo
 {
@@ -110,27 +112,25 @@ typedef struct SharedMemoizeInfo
 } SharedMemoizeInfo;
 
 
-/*
- * Data structures for reporting sort statistics.  Note that
- * TuplesortInstrumentation can't contain any pointers because we
- * sometimes put it in shared memory.
- *
- * The parallel-sort infrastructure relies on having a zero TuplesortMethod
- * to indicate that a worker never did anything, so we assign zero to
- * SORT_TYPE_STILL_IN_PROGRESS.  The other values of this enum can be
- * OR'ed together to represent a situation where different workers used
- * different methods, so we need a separate bit for each one.  Keep the
- * NUM_TUPLESORTMETHODS constant in sync with the number of bits!
+/* ---------------------
+ *	Instrumentation information for Sorts.
+ * ---------------------
  */
 
-#define NUM_TUPLESORTMETHODS 4
-
 typedef enum
 {
 	SORT_SPACE_TYPE_DISK,
 	SORT_SPACE_TYPE_MEMORY,
 } TuplesortSpaceType;
 
+/*
+ * The parallel-sort infrastructure relies on having a zero TuplesortMethod
+ * to indicate that a worker never did anything, so we assign zero to
+ * SORT_TYPE_STILL_IN_PROGRESS.  The other values of this enum can be
+ * OR'ed together to represent a situation where different workers used
+ * different methods, so we need a separate bit for each one.  Keep the
+ * NUM_TUPLESORTMETHODS constant in sync with the number of bits!
+ */
 typedef enum
 {
 	SORT_TYPE_STILL_IN_PROGRESS = 0,
@@ -139,40 +139,40 @@ typedef enum
 	SORT_TYPE_EXTERNAL_SORT = 1 << 2,
 	SORT_TYPE_EXTERNAL_MERGE = 1 << 3
 } TuplesortMethod;
+#define NUM_TUPLESORTMETHODS 4
 
 typedef struct TuplesortInstrumentation
 {
-	TuplesortMethod sortMethod;		/* sort algorithm used */
+	TuplesortMethod sortMethod; /* sort algorithm used */
 	TuplesortSpaceType spaceType;	/* type of space spaceUsed represents */
-	int64       spaceUsed;			/* space consumption, in kB */
+	int64		spaceUsed;		/* space consumption, in kB */
 } TuplesortInstrumentation;
 
-/* ----------------
- *  Shared memory container for per-worker sort information
- *  ----------------
+/*
+ * Shared memory container for per-worker sort information
  */
 typedef struct SharedSortInfo
 {
-	int num_workers;
+	int			num_workers;
 	TuplesortInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER];
 } SharedSortInfo;
 
-/* ----------------
- *   Values displayed by EXPLAIN ANALYZE
- * ----------------
+
+/* ---------------------
+ *   Instrumentation information for nodeHash.c
+ * ---------------------
  */
 typedef struct HashInstrumentation
 {
-	int		nbuckets;			/* number of buckets at end of execution */
-	int		nbuckets_original;	/* planned number of buckets */
-	int		nbatch;				/* number of batches at end of execution */
-	int		nbatch_original;	/* planned number of batches */
-	Size	space_peak;			/* peak memory usage in bytes */
+	int			nbuckets;		/* number of buckets at end of execution */
+	int			nbuckets_original;	/* planned number of buckets */
+	int			nbatch;			/* number of batches at end of execution */
+	int			nbatch_original;	/* planned number of batches */
+	Size		space_peak;		/* peak memory usage in bytes */
 } HashInstrumentation;
 
-/* ----------------
- *   Shared memory container for per-worker hash information
- * ----------------
+/*
+ * Shared memory container for per-worker information
  */
 typedef struct SharedHashInfo
 {
@@ -180,9 +180,10 @@ typedef struct SharedHashInfo
 	HashInstrumentation hinstrument[FLEXIBLE_ARRAY_MEMBER];
 } SharedHashInfo;
 
-/* ----------------
+
+/* ---------------------
  *   Instrumentation information for IncrementalSort
- * ----------------
+ * ---------------------
  */
 typedef struct IncrementalSortGroupInfo
 {
@@ -200,10 +201,7 @@ typedef struct IncrementalSortInfo
 	IncrementalSortGroupInfo prefixsortGroupInfo;
 } IncrementalSortInfo;
 
-/* ----------------
- *   Shared memory container for per-worker incremental sort information
- * ----------------
- */
+/* Shared memory container for per-worker incremental sort information */
 typedef struct SharedIncrementalSortInfo
 {
 	int			num_workers;
diff --git a/src/include/utils/tuplesort.h b/src/include/utils/tuplesort.h
index a7e867f36b8..943a2b7dc93 100644
--- a/src/include/utils/tuplesort.h
+++ b/src/include/utils/tuplesort.h
@@ -62,21 +62,6 @@ typedef struct SortCoordinateData
 
 typedef struct SortCoordinateData *SortCoordinate;
 
-/*
- * Data structures for reporting sort statistics.  Note that
- * TuplesortInstrumentation can't contain any pointers because we
- * sometimes put it in shared memory.
- *
- * The parallel-sort infrastructure relies on having a zero TuplesortMethod
- * to indicate that a worker never did anything, so we assign zero to
- * SORT_TYPE_STILL_IN_PROGRESS.  The other values of this enum can be
- * OR'ed together to represent a situation where different workers used
- * different methods, so we need a separate bit for each one.  Keep the
- * NUM_TUPLESORTMETHODS constant in sync with the number of bits!
- */
-
-#define NUM_TUPLESORTMETHODS 4
-
 /* Bitwise option flags for tuple sorts */
 #define TUPLESORT_NONE					0
 
-- 
2.47.3


--xs5il3t73pzvzpq7--





^ permalink  raw  reply  [nested|flat] 13+ messages in thread

* Re: [PATCH] ANALYZE: hash-accelerate MCV tracking for equality-only types
@ 2026-05-04 02:10 John Naylor <[email protected]>
  0 siblings, 0 replies; 13+ messages in thread

From: John Naylor @ 2026-05-04 02:10 UTC (permalink / raw)
  To: Ilia Evdokimov <[email protected]>; +Cc: Chengpeng Yan <[email protected]>; Tatsuya Kawata <[email protected]>; pgsql-hackers

On Thu, Feb 26, 2026 at 6:46 PM Ilia Evdokimov
<[email protected]> wrote:
> While reviewing the patch more closely, I noticed
> that compute_distinct_stats() is only used for types where we have =, !=
> but not <. In practice, most common scalar types go through
> compute_scalar_stats() instead.
>
> That makes me wonder how often this optimization would actually trigger
> in real workloads. Since compute_scalar_stats() is the more common path,
> there's chance that the hash-table based improvement in
> compute_distinct_stats() may not provide a noticeable overall benefit.

Coming back to this point, in any installation, the common path is
going to vastly outnumber the rare path, so this patch is optimizing
the wrong thing.

-- 
John Naylor
Amazon Web Services





^ permalink  raw  reply  [nested|flat] 13+ messages in thread


end of thread, other threads:[~2026-05-04 02:10 UTC | newest]

Thread overview: 13+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2019-05-21 00:02 [PATCH v5 07/12] consistent language: to which Justin Pryzby <[email protected]>
2023-07-12 16:57 [PATCH v16 1/3] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]>
2023-07-12 16:57 [PATCH v13 1/2] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]>
2023-07-12 16:57 [PATCH v17 1/3] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]>
2023-07-12 16:57 [PATCH v17 1/3] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]>
2023-07-12 16:57 [PATCH v14 1/2] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]>
2023-07-12 16:57 [PATCH v17 1/3] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]>
2023-07-12 16:57 [PATCH v15 1/2] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]>
2023-07-12 16:57 [PATCH v15 1/2] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]>
2026-01-05 14:26 [PATCH v3a] edit comments and stuff Álvaro Herrera <[email protected]>
2026-01-05 14:26 [PATCH v3a] edit comments and stuff Álvaro Herrera <[email protected]>
2026-01-05 14:26 [PATCH v3a] edit comments and stuff Álvaro Herrera <[email protected]>
2026-05-04 02:10 Re: [PATCH] ANALYZE: hash-accelerate MCV tracking for equality-only types John Naylor <[email protected]>

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox