From 60a566f535433bf5a636357a6dc35ff43ecfd730 Mon Sep 17 00:00:00 2001
From: amit <amitlangote09@gmail.com>
Date: Thu, 8 Aug 2019 13:49:29 +0900
Subject: [PATCH 1/2] Remove duplicative code processing
 RelOptInfo.partition_qual

---
 src/backend/optimizer/util/plancat.c | 11 ++++++++++-
 src/backend/partitioning/partprune.c | 32 ++++++--------------------------
 2 files changed, 16 insertions(+), 27 deletions(-)

diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index 98e99481c6..9e417c13d3 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -2136,6 +2136,7 @@ set_relation_partition_info(PlannerInfo *root, RelOptInfo *rel,
 							Relation relation)
 {
 	PartitionDesc partdesc;
+	List	*partconstr;
 
 	/* Create the PartitionDirectory infrastructure if we didn't already */
 	if (root->glob->partition_directory == NULL)
@@ -2149,7 +2150,15 @@ set_relation_partition_info(PlannerInfo *root, RelOptInfo *rel,
 	rel->boundinfo = partdesc->boundinfo;
 	rel->nparts = partdesc->nparts;
 	set_baserel_partition_key_exprs(relation, rel);
-	rel->partition_qual = RelationGetPartitionQual(relation);
+	/* Initialize the partition constraint if any */
+	partconstr = RelationGetPartitionQual(relation);
+	if (partconstr)
+	{
+		partconstr = (List *) expression_planner((Expr *) partconstr);
+		if (rel->relid != 1)
+			ChangeVarNodes((Node *) partconstr, 1, rel->relid, 0);
+		rel->partition_qual = partconstr;
+	}
 }
 
 /*
diff --git a/src/backend/partitioning/partprune.c b/src/backend/partitioning/partprune.c
index 2ed1e44c18..d399df6cf5 100644
--- a/src/backend/partitioning/partprune.c
+++ b/src/backend/partitioning/partprune.c
@@ -631,19 +631,10 @@ gen_partprune_steps(RelOptInfo *rel, List *clauses, PartClauseTarget target,
 	 * partition qual to the clause list in this case only.  This may result
 	 * in the default partition being eliminated.
 	 */
-	if (partition_bound_has_default(rel->boundinfo) &&
-		rel->partition_qual != NIL)
+	if (partition_bound_has_default(rel->boundinfo) && rel->partition_qual)
 	{
-		List	   *partqual = rel->partition_qual;
-
-		partqual = (List *) expression_planner((Expr *) partqual);
-
-		/* Fix Vars to have the desired varno */
-		if (rel->relid != 1)
-			ChangeVarNodes((Node *) partqual, 1, rel->relid, 0);
-
 		/* Use list_copy to avoid modifying the passed-in List */
-		clauses = list_concat(list_copy(clauses), partqual);
+		clauses = list_concat(list_copy(clauses), rel->partition_qual);
 	}
 
 	/* Down into the rabbit-hole. */
@@ -1024,22 +1015,11 @@ gen_partprune_steps_internal(GeneratePruningStepsContext *context,
 		 * as contradictory and we're done.  This is particularly helpful to
 		 * prune the default partition.
 		 */
-		if (context->rel->partition_qual)
+		if (predicate_refuted_by(context->rel->partition_qual,
+								 list_make1(clause), false))
 		{
-			List	   *partconstr;
-
-			partconstr = (List *)
-				expression_planner((Expr *) context->rel->partition_qual);
-			if (context->rel->relid != 1)
-				ChangeVarNodes((Node *) partconstr, 1,
-							   context->rel->relid, 0);
-			if (predicate_refuted_by(partconstr,
-									 list_make1(clause),
-									 false))
-			{
-				context->contradictory = true;
-				return NIL;
-			}
+			context->contradictory = true;
+			return NIL;
 		}
 
 		/*
-- 
2.11.0

