From 73aa70d65867073737955c1db9bca75d6c019b34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E6=8C=83?= Date: Sun, 24 Jan 2021 17:43:34 +0800 Subject: [PATCH v1 1/2] Make some static functions as extern and extend ChangeVarNodes can change var->attno as well. --- src/backend/optimizer/path/equivclass.c | 4 +--- src/backend/optimizer/util/relnode.c | 4 +--- src/backend/rewrite/rewriteManip.c | 13 +++++++++++++ src/include/optimizer/pathnode.h | 2 ++ src/include/optimizer/paths.h | 2 ++ src/include/rewrite/rewriteManip.h | 2 ++ 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c index 0188c1e9a1..a4a54a497f 100644 --- a/src/backend/optimizer/path/equivclass.c +++ b/src/backend/optimizer/path/equivclass.c @@ -64,8 +64,6 @@ static bool reconsider_outer_join_clause(PlannerInfo *root, bool outer_on_left); static bool reconsider_full_join_clause(PlannerInfo *root, RestrictInfo *rinfo); -static Bitmapset *get_eclass_indexes_for_relids(PlannerInfo *root, - Relids relids); static Bitmapset *get_common_eclass_indexes(PlannerInfo *root, Relids relids1, Relids relids2); @@ -3036,7 +3034,7 @@ is_redundant_with_indexclauses(RestrictInfo *rinfo, List *indexclauses) * Build and return a Bitmapset containing the indexes into root's * eq_classes list for all eclasses that mention any of these relids */ -static Bitmapset * +Bitmapset * get_eclass_indexes_for_relids(PlannerInfo *root, Relids relids) { Bitmapset *ec_indexes = NULL; diff --git a/src/backend/optimizer/util/relnode.c b/src/backend/optimizer/util/relnode.c index 731ff708b9..74c8c9bc88 100644 --- a/src/backend/optimizer/util/relnode.c +++ b/src/backend/optimizer/util/relnode.c @@ -62,8 +62,6 @@ static void build_joinrel_partition_info(RelOptInfo *joinrel, static bool have_partkey_equi_join(RelOptInfo *joinrel, RelOptInfo *rel1, RelOptInfo *rel2, JoinType jointype, List *restrictlist); -static int match_expr_to_partition_keys(Expr *expr, RelOptInfo *rel, - bool strict_op); static void set_joinrel_partition_key_exprs(RelOptInfo *joinrel, RelOptInfo *outer_rel, RelOptInfo *inner_rel, JoinType jointype); @@ -1817,7 +1815,7 @@ have_partkey_equi_join(RelOptInfo *joinrel, * partition key using a strict operator. This allows us to consider * nullable as well as nonnullable partition keys. */ -static int +int match_expr_to_partition_keys(Expr *expr, RelOptInfo *rel, bool strict_op) { int cnt; diff --git a/src/backend/rewrite/rewriteManip.c b/src/backend/rewrite/rewriteManip.c index d4e0b8b4de..aac04a7f9e 100644 --- a/src/backend/rewrite/rewriteManip.c +++ b/src/backend/rewrite/rewriteManip.c @@ -498,6 +498,7 @@ typedef struct { int rt_index; int new_index; + int new_attno; int sublevels_up; } ChangeVarNodes_context; @@ -514,6 +515,11 @@ ChangeVarNodes_walker(Node *node, ChangeVarNodes_context *context) var->varno == context->rt_index) { var->varno = context->new_index; + if (context->new_attno != MaxAttrNumber + 1) + { + var->varattno = context->new_attno; + var->varattnosyn = context->new_attno; /* Question. */ + } /* If the syntactic referent is same RTE, fix it too */ if (var->varnosyn == context->rt_index) var->varnosyn = context->new_index; @@ -606,13 +612,20 @@ ChangeVarNodes_walker(Node *node, ChangeVarNodes_context *context) (void *) context); } + void ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up) +{ + return ChangeVarNodesExtend(node, rt_index, new_index, MaxAttrNumber + 1, sublevels_up); +} +void +ChangeVarNodesExtend(Node *node, int rt_index, int new_index, int new_attno, int sublevels_up) { ChangeVarNodes_context context; context.rt_index = rt_index; context.new_index = new_index; + context.new_attno = new_attno; context.sublevels_up = sublevels_up; /* diff --git a/src/include/optimizer/pathnode.h b/src/include/optimizer/pathnode.h index 23dec14cbd..8a2e65958c 100644 --- a/src/include/optimizer/pathnode.h +++ b/src/include/optimizer/pathnode.h @@ -320,5 +320,7 @@ extern RelOptInfo *build_child_join_rel(PlannerInfo *root, RelOptInfo *outer_rel, RelOptInfo *inner_rel, RelOptInfo *parent_joinrel, List *restrictlist, SpecialJoinInfo *sjinfo, JoinType jointype); +extern int match_expr_to_partition_keys(Expr *expr, RelOptInfo *rel, + bool strict_op); #endif /* PATHNODE_H */ diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h index 035d3e1206..5fc73a055f 100644 --- a/src/include/optimizer/paths.h +++ b/src/include/optimizer/paths.h @@ -165,6 +165,8 @@ extern void add_child_join_rel_equivalences(PlannerInfo *root, AppendRelInfo **appinfos, RelOptInfo *parent_rel, RelOptInfo *child_rel); +extern Bitmapset *get_eclass_indexes_for_relids(PlannerInfo *root, + Relids relids); extern List *generate_implied_equalities_for_column(PlannerInfo *root, RelOptInfo *rel, ec_matches_callback_type callback, diff --git a/src/include/rewrite/rewriteManip.h b/src/include/rewrite/rewriteManip.h index 812414e63f..659d95f5dc 100644 --- a/src/include/rewrite/rewriteManip.h +++ b/src/include/rewrite/rewriteManip.h @@ -44,6 +44,8 @@ typedef enum ReplaceVarsNoMatchOption extern void OffsetVarNodes(Node *node, int offset, int sublevels_up); extern void ChangeVarNodes(Node *node, int old_varno, int new_varno, int sublevels_up); +extern void ChangeVarNodesExtend(Node *node, int rt_index, int new_index, + int new_attno, int sublevels_up); extern void IncrementVarSublevelsUp(Node *node, int delta_sublevels_up, int min_sublevels_up); extern void IncrementVarSublevelsUp_rtable(List *rtable, -- 2.21.0