Hi.

In coerce_to_target_type, we have comments like
/*
 * Note that if there are multiple stacked CollateExprs, we just
discard all but the topmost.
 */
    origexpr = expr;
    while (expr && IsA(expr, CollateExpr))
        expr = (Node *) ((CollateExpr *) expr)->arg;

Only the topmost CollateExpr will be used, all others will be dropped.
We can apply this to coerce_type also.
See the attached minor patch.



--
jian
https://www.enterprisedb.com/
From ff1c6eb8590bfba8e5ce2d8be70182402246d1f9 Mon Sep 17 00:00:00 2001
From: jian he <[email protected]>
Date: Mon, 29 Jun 2026 16:11:26 +0800
Subject: [PATCH v1 1/1] coerce_type

discard unncessary CollateExprs

discuccsion: https://postgr.es/m/
---
 src/backend/parser/parse_coerce.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 3b92ae2a920..f83e1933706 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -397,7 +397,10 @@ coerce_type(ParseState *pstate, Node *node,
 		 */
 		CollateExpr *coll = (CollateExpr *) node;
 
-		result = coerce_type(pstate, (Node *) coll->arg,
+		while (node && IsA(node, CollateExpr))
+			node = (Node *) ((CollateExpr *) node)->arg;
+
+		result = coerce_type(pstate, node,
 							 inputTypeId, targetTypeId, targetTypeMod,
 							 ccontext, cformat, location);
 		if (type_is_collatable(targetTypeId))
-- 
2.34.1

Reply via email to