Make UniqueRelInfo a node
authorAlexander Korotkov <akorotkov@postgresql.org>
Fri, 27 Oct 2023 02:29:48 +0000 (05:29 +0300)
committerAlexander Korotkov <akorotkov@postgresql.org>
Fri, 27 Oct 2023 02:45:16 +0000 (05:45 +0300)
d3d55ce571 changed RelOptInfo.unique_for_rels from the list of Relid sets to
the list of UniqueRelInfo's.  But it didn't make UniqueRelInfo a node.
This commit makes UniqueRelInfo a node.  Also this commit revises some
comments related to RelOptInfo.unique_for_rels.

Reported-by: Tom Lane
Discussion: https://postgr.es/m/flat/1189851.1698340331%40sss.pgh.pa.us

src/backend/optimizer/plan/analyzejoins.c
src/include/nodes/pathnodes.h

index 2e14268e188eb6de29cadf1079c22cfee77ebc9f..ccf07b2077cc97983c51d5ead0786b3c8855b137 100644 (file)
 #include "optimizer/tlist.h"
 #include "utils/lsyscache.h"
 
-/*
- * UniqueRelInfo caches a fact that a relation is unique when being joined
- * to other relation(s) specified by outerrelids.
- * 'extra_clauses' contains additional clauses from a baserestrictinfo list that
- * were used to prove uniqueness. We cache it for the SJ checking procedure: SJ
- * can be removed if the outer relation contains strictly the same set of
- * clauses.
- */
-typedef struct UniqueRelInfo
-{
-       Relids          outerrelids;
-       List       *extra_clauses;
-} UniqueRelInfo;
-
 /*
  * The context for replace_varno_walker() containing source and target relids.
  */
index 86596f367b975f7841d316257516f993e0e37792..ed85dc7414b5315b1d6944e42b89eadc958205b4 100644 (file)
@@ -719,7 +719,7 @@ typedef struct PartitionSchemeData *PartitionScheme;
  * populate these fields, for base rels; but someday they might be used for
  * join rels too:
  *
- *             unique_for_rels - list of Relid sets, each one being a set of other
+ *             unique_for_rels - list of UniqueRelInfo, each one being a set of other
  *                                     rels for which this one has been proven unique
  *             non_unique_for_rels - list of Relid sets, each one being a set of
  *                                     other rels for which we have tried and failed to prove
@@ -952,7 +952,7 @@ typedef struct RelOptInfo
        /*
         * cache space for remembering if we have proven this relation unique
         */
-       /* known unique for these other relid set(s) */
+       /* known unique for these other relid set(s) given in UniqueRelInfo(s) */
        List       *unique_for_rels;
        /* known not unique for these set(s) */
        List       *non_unique_for_rels;
@@ -3391,4 +3391,29 @@ typedef struct AggTransInfo
        bool            initValueIsNull;
 } AggTransInfo;
 
+/*
+ * UniqueRelInfo caches a fact that a relation is unique when being joined
+ * to other relation(s).
+ */
+typedef struct UniqueRelInfo
+{
+       pg_node_attr(no_copy_equal, no_read, no_query_jumble)
+
+       NodeTag         type;
+
+       /*
+        * The relation in consideration is unique when being joined with this set
+        * of other relation(s).
+        */
+       Relids          outerrelids;
+
+       /*
+        * Additional clauses from a baserestrictinfo list that were used to prove
+        * the uniqueness.   We cache it for the self-join checking procedure: a
+        * self-join can be removed if the outer relation contains strictly the
+        * same set of clauses.
+        */
+       List       *extra_clauses;
+} UniqueRelInfo;
+
 #endif                                                 /* PATHNODES_H */