From 73aa70d65867073737955c1db9bca75d6c019b34 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=B8=80=E6=8C=83?= <yizhi.fzh@alibaba-inc.com>
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

