v1-0001-Fix-find_em_expr_usable_for_sorting_rel.patch

application/octet-stream

Filename: v1-0001-Fix-find_em_expr_usable_for_sorting_rel.patch
Type: application/octet-stream
Part: 0
Message: Re: "could not find pathkey item to sort" for TPC-DS queries 94-96

Patch

Format: format-patch
Series: patch v1-0001
Subject: Fix find_em_expr_usable_for_sorting_rel
File+
src/backend/optimizer/path/equivclass.c 42 2
From 53f73314b44e1364a99a0dc103b52b4a79b9d764 Mon Sep 17 00:00:00 2001
From: jcoleman <jtc331@gmail.com>
Date: Thu, 15 Apr 2021 01:48:36 +0000
Subject: [PATCH v1] Fix find_em_expr_usable_for_sorting_rel

---
 src/backend/optimizer/path/equivclass.c | 44 +++++++++++++++++++++++--
 1 file changed, 42 insertions(+), 2 deletions(-)

diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c
index 0188c1e9a1..27867e16e8 100644
--- a/src/backend/optimizer/path/equivclass.c
+++ b/src/backend/optimizer/path/equivclass.c
@@ -68,6 +68,7 @@ static Bitmapset *get_eclass_indexes_for_relids(PlannerInfo *root,
 												Relids relids);
 static Bitmapset *get_common_eclass_indexes(PlannerInfo *root, Relids relids1,
 											Relids relids2);
+static Expr* expr_list_member_ignore_relabel(Expr *node, List *exprlist);
 
 
 /*
@@ -798,6 +799,27 @@ find_em_expr_for_rel(EquivalenceClass *ec, RelOptInfo *rel)
 	return NULL;
 }
 
+static Expr*
+expr_list_member_ignore_relabel(Expr *node, List *exprlist)
+{
+	ListCell   *temp;
+
+	while (node && IsA(node, RelabelType))
+		node = ((RelabelType *) node)->arg;
+
+	foreach(temp, exprlist)
+	{
+		Expr	   *tlexpr = (Expr *) lfirst(temp);
+
+		while (tlexpr && IsA(tlexpr, RelabelType))
+			tlexpr = ((RelabelType *) tlexpr)->arg;
+
+		if (equal(node, tlexpr))
+			return node;
+	}
+	return NULL;
+}
+
 /*
  * Find an equivalence class member expression that can be safely used to build
  * a sort node using the provided relation. The rules are a subset of those
@@ -819,6 +841,9 @@ find_em_expr_usable_for_sorting_rel(PlannerInfo *root, EquivalenceClass *ec,
 	{
 		EquivalenceMember *em = lfirst(lc_em);
 		Expr	   *em_expr = em->em_expr;
+		List	   *exprvars;
+		ListCell   *k;
+		PathTarget *target = rel->reltarget;
 
 		/*
 		 * We shouldn't be trying to sort by an equivalence class that
@@ -858,8 +883,23 @@ find_em_expr_usable_for_sorting_rel(PlannerInfo *root, EquivalenceClass *ec,
 		 * valuable here to expend the work trying to find a match in the
 		 * target's exprs since such a sort will have to be postponed anyway.
 		 */
-		if (!ec->ec_has_volatile)
-			return em->em_expr;
+		if (ec->ec_has_volatile)
+			return NULL;
+
+
+		exprvars = pull_var_clause((Node *) em_expr,
+								   PVC_INCLUDE_AGGREGATES |
+								   PVC_INCLUDE_WINDOWFUNCS |
+								   PVC_INCLUDE_PLACEHOLDERS);
+		foreach(k, exprvars)
+		{
+			if (!expr_list_member_ignore_relabel(lfirst(k), target->exprs))
+				break;
+		}
+		list_free(exprvars);
+
+		if (!k) /* If we made it through exprvars finding a tlist member for each */
+			return em->em_expr; /* found usable expression */
 	}
 
 	/* We didn't find any suitable equivalence class expression */
-- 
2.20.1