From 405911ce6e0a2e1de1b138e2ec5f24adaf52272d Mon Sep 17 00:00:00 2001
From: "Sami Imseih (AWS)"
 <simseih@dev-dsk-simseih-1d-3940b79e.us-east-1.amazon.com>
Date: Mon, 17 Feb 2025 19:47:26 +0000
Subject: [PATCH 1/1] experiement on top of v27

---
 src/backend/nodes/queryjumblefuncs.c | 40 +++++++++-------------------
 1 file changed, 12 insertions(+), 28 deletions(-)

diff --git a/src/backend/nodes/queryjumblefuncs.c b/src/backend/nodes/queryjumblefuncs.c
index c3c5edff32..0c03bf0dbf 100644
--- a/src/backend/nodes/queryjumblefuncs.c
+++ b/src/backend/nodes/queryjumblefuncs.c
@@ -262,7 +262,7 @@ RecordConstLocation(JumbleState *jstate, int location, bool merged)
  * test them for being Const expression for simplicity.
  */
 static bool
-IsMergeableConst(Node *element, List **known_immutable_funcs)
+IsMergeableConst(Node *element)
 {
 	if (IsA(element, RelabelType))
 		element = (Node *) ((RelabelType *) element)->arg;
@@ -275,37 +275,24 @@ IsMergeableConst(Node *element, List **known_immutable_funcs)
 		FuncExpr *func = (FuncExpr *) element;
 		ListCell   *temp;
 
-		if (func->funcid > FirstGenbkiObjectId)
-			return false;
-
-		if (func->funcformat != COERCE_IMPLICIT_CAST)
-			return false;
-
-		if (!list_member_oid(*known_immutable_funcs, func->funcid))
-		{
-			/* Not found in the cache, verify and add if needed */
-			if(func_volatile(func->funcid) != PROVOLATILE_IMMUTABLE)
-				return false;
-
-			*known_immutable_funcs = lappend_oid(*known_immutable_funcs,
-												 func->funcid);
-		}
-
 		foreach(temp, func->args)
 		{
 			Node *arg = lfirst(temp);
 
-			if (!IsA(arg, Const))
-				return false;
+			if (IsA(arg, Const))
+				return true;
 		}
-
+	} else if (IsA(element, Const))
 		return true;
-	}
+	else if (IsA(element, Param))
+	{
+		Param *p = (Param *) element;
 
-	if (!IsA(element, Const))
-		return false;
+		if (p->paramkind == PARAM_EXTERN)
+			return true;
+	}
 
-	return true;
+	return false;
 }
 
 /*
@@ -322,9 +309,6 @@ IsMergeableConstList(List *elements, Node **firstExpr, Node **lastExpr)
 {
 	ListCell   *temp;
 
-	/* To keep track of immutable functions in elements */
-	List	   *immutable_funcs = NIL;
-
 	/* A mergeable list needs to contain at least two elements */
 	if (elements == NIL || list_length(elements) < 2)
 		return false;
@@ -337,7 +321,7 @@ IsMergeableConstList(List *elements, Node **firstExpr, Node **lastExpr)
 
 	foreach(temp, elements)
 	{
-		if (!IsMergeableConst(lfirst(temp), &immutable_funcs))
+		if (!IsMergeableConst(lfirst(temp)))
 			return false;
 	}
 	*firstExpr = linitial(elements);
-- 
2.47.1

