mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
Teach eval_const_expressions() to simplify an ArrayCoerceExpr to a constant
when its input is constant and the element coercion function is immutable (or nonexistent, ie, binary-coercible case). This is an oversight in the 8.3 implementation of ArrayCoerceExpr, and its result is that certain cases involving IN or NOT IN with constants don't get optimized as they should be. Per experimentation with an example from Ow Mun Heng.
This commit is contained in:
parent
6741688b16
commit
6734182c16
@ -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))
|
||||
{
|
||||
/*----------
|
||||
|
Loading…
Reference in New Issue
Block a user