Make UniqueRelInfo a node

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
This commit is contained in:
Alexander Korotkov 2023-10-27 05:29:48 +03:00
parent 74604a37f2
commit 2b26a69455
2 changed files with 27 additions and 16 deletions

View File

@ -34,20 +34,6 @@
#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.
*/

View 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 */