1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-06 19:59:18 +03:00

Teach eval_const_expressions to constant-fold LEAST/GREATEST expressions.

Doing this requires an assumption that the invoked btree comparison
function is immutable.  We could check that explicitly, but in other
places such as contain_mutable_functions we just assume that it's true,
so we may as well do likewise here.  (If the comparison function's
behavior isn't immutable, the sort order in indexes built with it would
be unstable, so it seems certainly wrong for it not to be so.)

Vik Fearing

Discussion: https://postgr.es/m/c6e8504c-4c43-35fa-6c8f-3c0b80a912cc@2ndquadrant.com
This commit is contained in:
Tom Lane 2018-12-30 13:42:04 -05:00
parent e0ef136d52
commit 6f19a8c41f

View File

@ -3378,11 +3378,16 @@ eval_const_expressions_mutator(Node *node,
case T_ArrayRef:
case T_ArrayExpr:
case T_RowExpr:
case T_MinMaxExpr:
{
/*
* Generic handling for node types whose own processing is
* known to be immutable, and for which we need no smarts
* beyond "simplify if all inputs are constants".
*
* Treating MinMaxExpr this way amounts to assuming that the
* btree comparison function it calls is immutable; see the
* reasoning in contain_mutable_functions_walker.
*/
/* Copy the node and const-simplify its arguments */
@ -3783,7 +3788,7 @@ eval_const_expressions_mutator(Node *node,
case T_ConvertRowtypeExpr:
{
ConvertRowtypeExpr *cre = castNode(ConvertRowtypeExpr, node);
Node *arg;
Node *arg;
ConvertRowtypeExpr *newcre;
arg = eval_const_expressions_mutator((Node *) cre->arg,