From 405911ce6e0a2e1de1b138e2ec5f24adaf52272d Mon Sep 17 00:00:00 2001 From: "Sami Imseih (AWS)" 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