diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index c015be9e9b..55bafa2c96 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.264 2008/08/25 22:42:33 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.265 2008/08/26 02:16:31 tgl Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -2359,6 +2359,41 @@ eval_const_expressions_mutator(Node *node, newexpr->coerceformat = expr->coerceformat; return (Node *) newexpr; } + if (IsA(node, ArrayCoerceExpr)) + { + ArrayCoerceExpr *expr = (ArrayCoerceExpr *) node; + Expr *arg; + ArrayCoerceExpr *newexpr; + + /* + * Reduce constants in the ArrayCoerceExpr's argument, then build + * a new ArrayCoerceExpr. + */ + arg = (Expr *) eval_const_expressions_mutator((Node *) expr->arg, + context); + + newexpr = makeNode(ArrayCoerceExpr); + newexpr->arg = arg; + newexpr->elemfuncid = expr->elemfuncid; + newexpr->resulttype = expr->resulttype; + newexpr->resulttypmod = expr->resulttypmod; + newexpr->isExplicit = expr->isExplicit; + newexpr->coerceformat = expr->coerceformat; + + /* + * If constant argument and it's a binary-coercible or immutable + * conversion, we can simplify it to a constant. + */ + if (arg && IsA(arg, Const) && + (!OidIsValid(newexpr->elemfuncid) || + func_volatile(newexpr->elemfuncid) == PROVOLATILE_IMMUTABLE)) + return (Node *) evaluate_expr((Expr *) newexpr, + newexpr->resulttype, + newexpr->resulttypmod); + + /* Else we must return the partially-simplified node */ + return (Node *) newexpr; + } if (IsA(node, CaseExpr)) { /*----------