Hello everyone!

I've noticed that COALESCE function doesn't converge to argument expression if it is alone in argument list of COALESCE as part simplification routine for expressions in planner. This might suppress further useful transformations when non-strict ops are required from some expression like converging OUTER JOIN to INNER one with WHERE qual containing COALESCE over single column from inner side.

The patch of transformation in question for COALESCE is attached.


--
Best regard,
Maksim Milyutin
From 1287610efa3895a0ababfc66f346a6a7c7edf9b9 Mon Sep 17 00:00:00 2001
From: Maksim Milyutin <milyuti...@gmail.com>
Date: Fri, 11 Apr 2025 15:43:42 +0300
Subject: [PATCH v1] Simplify COALESCE with single argument

---
 src/backend/optimizer/util/clauses.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index 26a3e050086..60f33839214 100644
--- a/src/backend/optimizer/util/clauses.c
+++ b/src/backend/optimizer/util/clauses.c
@@ -3332,6 +3332,8 @@ eval_const_expressions_mutator(Node *node,
 					return (Node *) makeNullConst(coalesceexpr->coalescetype,
 												  -1,
 												  coalesceexpr->coalescecollid);
+				if (list_length(newargs) == 1)
+					return (Node *) linitial(newargs);
 
 				newcoalesce = makeNode(CoalesceExpr);
 				newcoalesce->coalescetype = coalesceexpr->coalescetype;
-- 
2.43.0

Reply via email to