From 0335cbafbf943f0b64ceaa3c0f9bc010b4f3dd50 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 18 Nov 2005 23:08:43 +0000 Subject: [PATCH] Fix performance issue in exprTypmod(): for a COALESCE expression, it recursed twice on its first argument, leading to exponential time spent on a deep nest of COALESCEs ... such as a deeply nested FULL JOIN would produce. Per report from Matt Carter. --- src/backend/parser/parse_expr.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 750b28acda..a16d87e409 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -1425,8 +1425,12 @@ exprTypmod(Node *expr) int32 typmod; List *arg; + if (exprType((Node *) lfirst(cexpr->args)) != coalescetype) + return -1; typmod = exprTypmod((Node *) lfirst(cexpr->args)); - foreach(arg, cexpr->args) + if (typmod < 0) + return -1; /* no point in trying harder */ + foreach(arg, lnext(cexpr->args)) { Node *e = (Node *) lfirst(arg); -- 2.39.5