Pgindent clauses.c, per request from Tom.
authorBruce Momjian <bruce@momjian.us>
Mon, 28 Nov 2011 21:47:43 +0000 (16:47 -0500)
committerBruce Momjian <bruce@momjian.us>
Mon, 28 Nov 2011 21:47:43 +0000 (16:47 -0500)
src/backend/optimizer/util/clauses.c

index c4e75964d4e6ede61b50a624b19f0cb388dac4bb..7ad7bb3635b5e9478f63ef84c3685320d8cf6ce6 100644 (file)
@@ -2109,982 +2109,1017 @@ eval_const_expressions_mutator(Node *node,
    switch (nodeTag(node))
    {
        case T_Param:
-   {
-       Param      *param = (Param *) node;
-
-       /* Look to see if we've been given a value for this Param */
-       if (param->paramkind == PARAM_EXTERN &&
-           context->boundParams != NULL &&
-           param->paramid > 0 &&
-           param->paramid <= context->boundParams->numParams)
-       {
-           ParamExternData *prm = &context->boundParams->params[param->paramid - 1];
-
-           if (OidIsValid(prm->ptype))
            {
-               /* OK to substitute parameter value? */
-               if (context->estimate || (prm->pflags & PARAM_FLAG_CONST))
+               Param      *param = (Param *) node;
+
+               /* Look to see if we've been given a value for this Param */
+               if (param->paramkind == PARAM_EXTERN &&
+                   context->boundParams != NULL &&
+                   param->paramid > 0 &&
+                   param->paramid <= context->boundParams->numParams)
                {
-                   /*
-                    * Return a Const representing the param value.  Must copy
-                    * pass-by-ref datatypes, since the Param might be in a
-                    * memory context shorter-lived than our output plan
-                    * should be.
-                    */
-                   int16       typLen;
-                   bool        typByVal;
-                   Datum       pval;
-
-                   Assert(prm->ptype == param->paramtype);
-                   get_typlenbyval(param->paramtype, &typLen, &typByVal);
-                   if (prm->isnull || typByVal)
-                       pval = prm->value;
-                   else
-                       pval = datumCopy(prm->value, typByVal, typLen);
-                   return (Node *) makeConst(param->paramtype,
-                                             param->paramtypmod,
-                                             param->paramcollid,
-                                             (int) typLen,
-                                             pval,
-                                             prm->isnull,
-                                             typByVal);
+                   ParamExternData *prm = &context->boundParams->params[param->paramid - 1];
+
+                   if (OidIsValid(prm->ptype))
+                   {
+                       /* OK to substitute parameter value? */
+                       if (context->estimate || (prm->pflags & PARAM_FLAG_CONST))
+                       {
+                           /*
+                            * Return a Const representing the param value.
+                            * Must copy pass-by-ref datatypes, since the
+                            * Param might be in a memory context
+                            * shorter-lived than our output plan should be.
+                            */
+                           int16       typLen;
+                           bool        typByVal;
+                           Datum       pval;
+
+                           Assert(prm->ptype == param->paramtype);
+                           get_typlenbyval(param->paramtype, &typLen, &typByVal);
+                           if (prm->isnull || typByVal)
+                               pval = prm->value;
+                           else
+                               pval = datumCopy(prm->value, typByVal, typLen);
+                           return (Node *) makeConst(param->paramtype,
+                                                     param->paramtypmod,
+                                                     param->paramcollid,
+                                                     (int) typLen,
+                                                     pval,
+                                                     prm->isnull,
+                                                     typByVal);
+                       }
+                   }
                }
+
+               /*
+                * Not replaceable, so just copy the Param (no need to
+                * recurse)
+                */
+               return (Node *) copyObject(param);
            }
-       }
-       /* Not replaceable, so just copy the Param (no need to recurse) */
-       return (Node *) copyObject(param);
-   }
        case T_FuncExpr:
-   {
-       FuncExpr   *expr = (FuncExpr *) node;
-       List       *args;
-       bool        has_named_args;
-       Expr       *simple;
-       FuncExpr   *newexpr;
-       ListCell   *lc;
+           {
+               FuncExpr   *expr = (FuncExpr *) node;
+               List       *args;
+               bool        has_named_args;
+               Expr       *simple;
+               FuncExpr   *newexpr;
+               ListCell   *lc;
 
-       /*
-        * Reduce constants in the FuncExpr's arguments, and check to see if
-        * there are any named args.
-        */
-       args = NIL;
-       has_named_args = false;
-       foreach(lc, expr->args)
-       {
-           Node       *arg = (Node *) lfirst(lc);
+               /*
+                * Reduce constants in the FuncExpr's arguments, and check to
+                * see if there are any named args.
+                */
+               args = NIL;
+               has_named_args = false;
+               foreach(lc, expr->args)
+               {
+                   Node       *arg = (Node *) lfirst(lc);
 
-           arg = eval_const_expressions_mutator(arg, context);
-           if (IsA(arg, NamedArgExpr))
-               has_named_args = true;
-           args = lappend(args, arg);
-       }
+                   arg = eval_const_expressions_mutator(arg, context);
+                   if (IsA(arg, NamedArgExpr))
+                       has_named_args = true;
+                   args = lappend(args, arg);
+               }
 
-       /*
-        * Code for op/func reduction is pretty bulky, so split it out as a
-        * separate function.  Note: exprTypmod normally returns -1 for a
-        * FuncExpr, but not when the node is recognizably a length coercion;
-        * we want to preserve the typmod in the eventual Const if so.
-        */
-       simple = simplify_function((Expr *) expr,
-                                  expr->funcid,
-                                  expr->funcresulttype, exprTypmod(node),
-                                  expr->funccollid,
-                                  expr->inputcollid,
-                                  &args,
-                                  has_named_args, true, context);
-       if (simple)             /* successfully simplified it */
-           return (Node *) simple;
+               /*
+                * Code for op/func reduction is pretty bulky, so split it out
+                * as a separate function.  Note: exprTypmod normally returns
+                * -1 for a FuncExpr, but not when the node is recognizably a
+                * length coercion; we want to preserve the typmod in the
+                * eventual Const if so.
+                */
+               simple = simplify_function((Expr *) expr,
+                                          expr->funcid,
+                                     expr->funcresulttype, exprTypmod(node),
+                                          expr->funccollid,
+                                          expr->inputcollid,
+                                          &args,
+                                          has_named_args, true, context);
+               if (simple)     /* successfully simplified it */
+                   return (Node *) simple;
 
-       /*
-        * The expression cannot be simplified any further, so build and
-        * return a replacement FuncExpr node using the possibly-simplified
-        * arguments.  Note that we have also converted the argument list to
-        * positional notation.
-        */
-       newexpr = makeNode(FuncExpr);
-       newexpr->funcid = expr->funcid;
-       newexpr->funcresulttype = expr->funcresulttype;
-       newexpr->funcretset = expr->funcretset;
-       newexpr->funcformat = expr->funcformat;
-       newexpr->funccollid = expr->funccollid;
-       newexpr->inputcollid = expr->inputcollid;
-       newexpr->args = args;
-       newexpr->location = expr->location;
-       return (Node *) newexpr;
-   }
+               /*
+                * The expression cannot be simplified any further, so build
+                * and return a replacement FuncExpr node using the
+                * possibly-simplified arguments.  Note that we have also
+                * converted the argument list to positional notation.
+                */
+               newexpr = makeNode(FuncExpr);
+               newexpr->funcid = expr->funcid;
+               newexpr->funcresulttype = expr->funcresulttype;
+               newexpr->funcretset = expr->funcretset;
+               newexpr->funcformat = expr->funcformat;
+               newexpr->funccollid = expr->funccollid;
+               newexpr->inputcollid = expr->inputcollid;
+               newexpr->args = args;
+               newexpr->location = expr->location;
+               return (Node *) newexpr;
+           }
        case T_OpExpr:
-   {
-       OpExpr     *expr = (OpExpr *) node;
-       List       *args;
-       Expr       *simple;
-       OpExpr     *newexpr;
+           {
+               OpExpr     *expr = (OpExpr *) node;
+               List       *args;
+               Expr       *simple;
+               OpExpr     *newexpr;
 
-       /*
-        * Reduce constants in the OpExpr's arguments.  We know args is either
-        * NIL or a List node, so we can call expression_tree_mutator directly
-        * rather than recursing to self.
-        */
-       args = (List *) expression_tree_mutator((Node *) expr->args,
+               /*
+                * Reduce constants in the OpExpr's arguments.  We know args
+                * is either NIL or a List node, so we can call
+                * expression_tree_mutator directly rather than recursing to
+                * self.
+                */
+               args = (List *) expression_tree_mutator((Node *) expr->args,
                                              eval_const_expressions_mutator,
-                                               (void *) context);
+                                                       (void *) context);
 
-       /*
-        * Need to get OID of underlying function.  Okay to scribble on input
-        * to this extent.
-        */
-       set_opfuncid(expr);
+               /*
+                * Need to get OID of underlying function.  Okay to scribble
+                * on input to this extent.
+                */
+               set_opfuncid(expr);
 
-       /*
-        * Code for op/func reduction is pretty bulky, so split it out as a
-        * separate function.
-        */
-       simple = simplify_function((Expr *) expr,
-                                  expr->opfuncid,
-                                  expr->opresulttype, -1,
-                                  expr->opcollid,
-                                  expr->inputcollid,
-                                  &args,
-                                  false, true, context);
-       if (simple)             /* successfully simplified it */
-           return (Node *) simple;
+               /*
+                * Code for op/func reduction is pretty bulky, so split it out
+                * as a separate function.
+                */
+               simple = simplify_function((Expr *) expr,
+                                          expr->opfuncid,
+                                          expr->opresulttype, -1,
+                                          expr->opcollid,
+                                          expr->inputcollid,
+                                          &args,
+                                          false, true, context);
+               if (simple)     /* successfully simplified it */
+                   return (Node *) simple;
 
-       /*
-        * If the operator is boolean equality or inequality, we know how to
-        * simplify cases involving one constant and one non-constant
-        * argument.
-        */
-       if (expr->opno == BooleanEqualOperator ||
-           expr->opno == BooleanNotEqualOperator)
-       {
-           simple = (Expr *) simplify_boolean_equality(expr->opno, args);
-           if (simple)         /* successfully simplified it */
-               return (Node *) simple;
-       }
+               /*
+                * If the operator is boolean equality or inequality, we know
+                * how to simplify cases involving one constant and one
+                * non-constant argument.
+                */
+               if (expr->opno == BooleanEqualOperator ||
+                   expr->opno == BooleanNotEqualOperator)
+               {
+                   simple = (Expr *) simplify_boolean_equality(expr->opno, args);
+                   if (simple) /* successfully simplified it */
+                       return (Node *) simple;
+               }
 
-       /*
-        * The expression cannot be simplified any further, so build and
-        * return a replacement OpExpr node using the possibly-simplified
-        * arguments.
-        */
-       newexpr = makeNode(OpExpr);
-       newexpr->opno = expr->opno;
-       newexpr->opfuncid = expr->opfuncid;
-       newexpr->opresulttype = expr->opresulttype;
-       newexpr->opretset = expr->opretset;
-       newexpr->opcollid = expr->opcollid;
-       newexpr->inputcollid = expr->inputcollid;
-       newexpr->args = args;
-       newexpr->location = expr->location;
-       return (Node *) newexpr;
-   }
+               /*
+                * The expression cannot be simplified any further, so build
+                * and return a replacement OpExpr node using the
+                * possibly-simplified arguments.
+                */
+               newexpr = makeNode(OpExpr);
+               newexpr->opno = expr->opno;
+               newexpr->opfuncid = expr->opfuncid;
+               newexpr->opresulttype = expr->opresulttype;
+               newexpr->opretset = expr->opretset;
+               newexpr->opcollid = expr->opcollid;
+               newexpr->inputcollid = expr->inputcollid;
+               newexpr->args = args;
+               newexpr->location = expr->location;
+               return (Node *) newexpr;
+           }
        case T_DistinctExpr:
-   {
-       DistinctExpr *expr = (DistinctExpr *) node;
-       List       *args;
-       ListCell   *arg;
-       bool        has_null_input = false;
-       bool        all_null_input = true;
-       bool        has_nonconst_input = false;
-       Expr       *simple;
-       DistinctExpr *newexpr;
+           {
+               DistinctExpr *expr = (DistinctExpr *) node;
+               List       *args;
+               ListCell   *arg;
+               bool        has_null_input = false;
+               bool        all_null_input = true;
+               bool        has_nonconst_input = false;
+               Expr       *simple;
+               DistinctExpr *newexpr;
 
-       /*
-        * Reduce constants in the DistinctExpr's arguments.  We know args is
-        * either NIL or a List node, so we can call expression_tree_mutator
-        * directly rather than recursing to self.
-        */
-       args = (List *) expression_tree_mutator((Node *) expr->args,
+               /*
+                * Reduce constants in the DistinctExpr's arguments.  We know
+                * args is either NIL or a List node, so we can call
+                * expression_tree_mutator directly rather than recursing to
+                * self.
+                */
+               args = (List *) expression_tree_mutator((Node *) expr->args,
                                              eval_const_expressions_mutator,
-                                               (void *) context);
+                                                       (void *) context);
 
-       /*
-        * We must do our own check for NULLs because DistinctExpr has
-        * different results for NULL input than the underlying operator does.
-        */
-       foreach(arg, args)
-       {
-           if (IsA(lfirst(arg), Const))
-           {
-               has_null_input |= ((Const *) lfirst(arg))->constisnull;
-               all_null_input &= ((Const *) lfirst(arg))->constisnull;
-           }
-           else
-               has_nonconst_input = true;
-       }
+               /*
+                * We must do our own check for NULLs because DistinctExpr has
+                * different results for NULL input than the underlying
+                * operator does.
+                */
+               foreach(arg, args)
+               {
+                   if (IsA(lfirst(arg), Const))
+                   {
+                       has_null_input |= ((Const *) lfirst(arg))->constisnull;
+                       all_null_input &= ((Const *) lfirst(arg))->constisnull;
+                   }
+                   else
+                       has_nonconst_input = true;
+               }
 
-       /* all constants? then can optimize this out */
-       if (!has_nonconst_input)
-       {
-           /* all nulls? then not distinct */
-           if (all_null_input)
-               return makeBoolConst(false, false);
+               /* all constants? then can optimize this out */
+               if (!has_nonconst_input)
+               {
+                   /* all nulls? then not distinct */
+                   if (all_null_input)
+                       return makeBoolConst(false, false);
 
-           /* one null? then distinct */
-           if (has_null_input)
-               return makeBoolConst(true, false);
+                   /* one null? then distinct */
+                   if (has_null_input)
+                       return makeBoolConst(true, false);
 
-           /* otherwise try to evaluate the '=' operator */
-           /* (NOT okay to try to inline it, though!) */
+                   /* otherwise try to evaluate the '=' operator */
+                   /* (NOT okay to try to inline it, though!) */
 
-           /*
-            * Need to get OID of underlying function.  Okay to scribble on
-            * input to this extent.
-            */
-           set_opfuncid((OpExpr *) expr);      /* rely on struct equivalence */
+                   /*
+                    * Need to get OID of underlying function.  Okay to
+                    * scribble on input to this extent.
+                    */
+                   set_opfuncid((OpExpr *) expr);      /* rely on struct
+                                                        * equivalence */
+
+                   /*
+                    * Code for op/func reduction is pretty bulky, so split it
+                    * out as a separate function.
+                    */
+                   simple = simplify_function((Expr *) expr,
+                                              expr->opfuncid,
+                                              expr->opresulttype, -1,
+                                              expr->opcollid,
+                                              expr->inputcollid,
+                                              &args,
+                                              false, false, context);
+                   if (simple) /* successfully simplified it */
+                   {
+                       /*
+                        * Since the underlying operator is "=", must negate
+                        * its result
+                        */
+                       Const      *csimple = (Const *) simple;
+
+                       Assert(IsA(csimple, Const));
+                       csimple->constvalue =
+                           BoolGetDatum(!DatumGetBool(csimple->constvalue));
+                       return (Node *) csimple;
+                   }
+               }
 
-           /*
-            * Code for op/func reduction is pretty bulky, so split it out as
-            * a separate function.
-            */
-           simple = simplify_function((Expr *) expr,
-                                      expr->opfuncid,
-                                      expr->opresulttype, -1,
-                                      expr->opcollid,
-                                      expr->inputcollid,
-                                      &args,
-                                      false, false, context);
-           if (simple)         /* successfully simplified it */
-           {
                /*
-                * Since the underlying operator is "=", must negate its
-                * result
+                * The expression cannot be simplified any further, so build
+                * and return a replacement DistinctExpr node using the
+                * possibly-simplified arguments.
                 */
-               Const      *csimple = (Const *) simple;
-
-               Assert(IsA(csimple, Const));
-               csimple->constvalue =
-                   BoolGetDatum(!DatumGetBool(csimple->constvalue));
-               return (Node *) csimple;
+               newexpr = makeNode(DistinctExpr);
+               newexpr->opno = expr->opno;
+               newexpr->opfuncid = expr->opfuncid;
+               newexpr->opresulttype = expr->opresulttype;
+               newexpr->opretset = expr->opretset;
+               newexpr->opcollid = expr->opcollid;
+               newexpr->inputcollid = expr->inputcollid;
+               newexpr->args = args;
+               newexpr->location = expr->location;
+               return (Node *) newexpr;
            }
-       }
-
-       /*
-        * The expression cannot be simplified any further, so build and
-        * return a replacement DistinctExpr node using the
-        * possibly-simplified arguments.
-        */
-       newexpr = makeNode(DistinctExpr);
-       newexpr->opno = expr->opno;
-       newexpr->opfuncid = expr->opfuncid;
-       newexpr->opresulttype = expr->opresulttype;
-       newexpr->opretset = expr->opretset;
-       newexpr->opcollid = expr->opcollid;
-       newexpr->inputcollid = expr->inputcollid;
-       newexpr->args = args;
-       newexpr->location = expr->location;
-       return (Node *) newexpr;
-   }
        case T_BoolExpr:
-   {
-       BoolExpr   *expr = (BoolExpr *) node;
-
-       switch (expr->boolop)
-       {
-           case OR_EXPR:
-               {
-                   List       *newargs;
-                   bool        haveNull = false;
-                   bool        forceTrue = false;
+           {
+               BoolExpr   *expr = (BoolExpr *) node;
 
-                   newargs = simplify_or_arguments(expr->args, context,
-                                                   &haveNull, &forceTrue);
-                   if (forceTrue)
-                       return makeBoolConst(true, false);
-                   if (haveNull)
-                       newargs = lappend(newargs, makeBoolConst(false, true));
-                   /* If all the inputs are FALSE, result is FALSE */
-                   if (newargs == NIL)
-                       return makeBoolConst(false, false);
-                   /* If only one nonconst-or-NULL input, it's the result */
-                   if (list_length(newargs) == 1)
-                       return (Node *) linitial(newargs);
-                   /* Else we still need an OR node */
-                   return (Node *) make_orclause(newargs);
-               }
-           case AND_EXPR:
+               switch (expr->boolop)
                {
-                   List       *newargs;
-                   bool        haveNull = false;
-                   bool        forceFalse = false;
-
-                   newargs = simplify_and_arguments(expr->args, context,
+                   case OR_EXPR:
+                       {
+                           List       *newargs;
+                           bool        haveNull = false;
+                           bool        forceTrue = false;
+
+                           newargs = simplify_or_arguments(expr->args, context,
+                                                     &haveNull, &forceTrue);
+                           if (forceTrue)
+                               return makeBoolConst(true, false);
+                           if (haveNull)
+                               newargs = lappend(newargs, makeBoolConst(false, true));
+                           /* If all the inputs are FALSE, result is FALSE */
+                           if (newargs == NIL)
+                               return makeBoolConst(false, false);
+
+                           /*
+                            * If only one nonconst-or-NULL input, it's the
+                            * result
+                            */
+                           if (list_length(newargs) == 1)
+                               return (Node *) linitial(newargs);
+                           /* Else we still need an OR node */
+                           return (Node *) make_orclause(newargs);
+                       }
+                   case AND_EXPR:
+                       {
+                           List       *newargs;
+                           bool        haveNull = false;
+                           bool        forceFalse = false;
+
+                           newargs = simplify_and_arguments(expr->args, context,
                                                     &haveNull, &forceFalse);
-                   if (forceFalse)
-                       return makeBoolConst(false, false);
-                   if (haveNull)
-                       newargs = lappend(newargs, makeBoolConst(false, true));
-                   /* If all the inputs are TRUE, result is TRUE */
-                   if (newargs == NIL)
-                       return makeBoolConst(true, false);
-                   /* If only one nonconst-or-NULL input, it's the result */
-                   if (list_length(newargs) == 1)
-                       return (Node *) linitial(newargs);
-                   /* Else we still need an AND node */
-                   return (Node *) make_andclause(newargs);
-               }
-           case NOT_EXPR:
-               {
-                   Node       *arg;
-
-                   Assert(list_length(expr->args) == 1);
-                   arg = eval_const_expressions_mutator(linitial(expr->args),
-                                                        context);
-
-                   /*
-                    * Use negate_clause() to see if we can simplify away the
-                    * NOT.
-                    */
-                   return negate_clause(arg);
+                           if (forceFalse)
+                               return makeBoolConst(false, false);
+                           if (haveNull)
+                               newargs = lappend(newargs, makeBoolConst(false, true));
+                           /* If all the inputs are TRUE, result is TRUE */
+                           if (newargs == NIL)
+                               return makeBoolConst(true, false);
+
+                           /*
+                            * If only one nonconst-or-NULL input, it's the
+                            * result
+                            */
+                           if (list_length(newargs) == 1)
+                               return (Node *) linitial(newargs);
+                           /* Else we still need an AND node */
+                           return (Node *) make_andclause(newargs);
+                       }
+                   case NOT_EXPR:
+                       {
+                           Node       *arg;
+
+                           Assert(list_length(expr->args) == 1);
+                           arg = eval_const_expressions_mutator(linitial(expr->args),
+                                                                context);
+
+                           /*
+                            * Use negate_clause() to see if we can simplify
+                            * away the NOT.
+                            */
+                           return negate_clause(arg);
+                       }
+                   default:
+                       elog(ERROR, "unrecognized boolop: %d",
+                            (int) expr->boolop);
+                       break;
                }
-           default:
-               elog(ERROR, "unrecognized boolop: %d",
-                    (int) expr->boolop);
                break;
-       }
-       break;
-   }
+           }
        case T_SubPlan:
        case T_AlternativeSubPlan:
-       /*
-        * Return a SubPlan unchanged --- too late to do anything with it.
-        *
-        * XXX should we ereport() here instead?  Probably this routine should
-        * never be invoked after SubPlan creation.
-        */
-       return node;
+
+           /*
+            * Return a SubPlan unchanged --- too late to do anything with it.
+            *
+            * XXX should we ereport() here instead?  Probably this routine
+            * should never be invoked after SubPlan creation.
+            */
+           return node;
        case T_RelabelType:
-   {
-       /*
-        * If we can simplify the input to a constant, then we don't need the
-        * RelabelType node anymore: just change the type field of the Const
-        * node.  Otherwise, must copy the RelabelType node.
-        */
-       RelabelType *relabel = (RelabelType *) node;
-       Node       *arg;
+           {
+               /*
+                * If we can simplify the input to a constant, then we don't
+                * need the RelabelType node anymore: just change the type
+                * field of the Const node.  Otherwise, must copy the
+                * RelabelType node.
+                */
+               RelabelType *relabel = (RelabelType *) node;
+               Node       *arg;
 
-       arg = eval_const_expressions_mutator((Node *) relabel->arg,
-                                            context);
+               arg = eval_const_expressions_mutator((Node *) relabel->arg,
+                                                    context);
 
-       /*
-        * If we find stacked RelabelTypes (eg, from foo :: int :: oid) we can
-        * discard all but the top one.
-        */
-       while (arg && IsA(arg, RelabelType))
-           arg = (Node *) ((RelabelType *) arg)->arg;
+               /*
+                * If we find stacked RelabelTypes (eg, from foo :: int ::
+                * oid) we can discard all but the top one.
+                */
+               while (arg && IsA(arg, RelabelType))
+                   arg = (Node *) ((RelabelType *) arg)->arg;
 
-       if (arg && IsA(arg, Const))
-       {
-           Const      *con = (Const *) arg;
+               if (arg && IsA(arg, Const))
+               {
+                   Const      *con = (Const *) arg;
 
-           con->consttype = relabel->resulttype;
-           con->consttypmod = relabel->resulttypmod;
-           con->constcollid = relabel->resultcollid;
-           return (Node *) con;
-       }
-       else
-       {
-           RelabelType *newrelabel = makeNode(RelabelType);
-
-           newrelabel->arg = (Expr *) arg;
-           newrelabel->resulttype = relabel->resulttype;
-           newrelabel->resulttypmod = relabel->resulttypmod;
-           newrelabel->resultcollid = relabel->resultcollid;
-           newrelabel->relabelformat = relabel->relabelformat;
-           newrelabel->location = relabel->location;
-           return (Node *) newrelabel;
-       }
-   }
+                   con->consttype = relabel->resulttype;
+                   con->consttypmod = relabel->resulttypmod;
+                   con->constcollid = relabel->resultcollid;
+                   return (Node *) con;
+               }
+               else
+               {
+                   RelabelType *newrelabel = makeNode(RelabelType);
+
+                   newrelabel->arg = (Expr *) arg;
+                   newrelabel->resulttype = relabel->resulttype;
+                   newrelabel->resulttypmod = relabel->resulttypmod;
+                   newrelabel->resultcollid = relabel->resultcollid;
+                   newrelabel->relabelformat = relabel->relabelformat;
+                   newrelabel->location = relabel->location;
+                   return (Node *) newrelabel;
+               }
+           }
        case T_CoerceViaIO:
-   {
-       CoerceViaIO *expr = (CoerceViaIO *) node;
-       Expr       *arg;
-       List       *args;
-       Oid         outfunc;
-       bool        outtypisvarlena;
-       Oid         infunc;
-       Oid         intypioparam;
-       Expr       *simple;
-       CoerceViaIO *newexpr;
+           {
+               CoerceViaIO *expr = (CoerceViaIO *) node;
+               Expr       *arg;
+               List       *args;
+               Oid         outfunc;
+               bool        outtypisvarlena;
+               Oid         infunc;
+               Oid         intypioparam;
+               Expr       *simple;
+               CoerceViaIO *newexpr;
 
-       /*
-        * Reduce constants in the CoerceViaIO's argument.
-        */
-       arg = (Expr *) eval_const_expressions_mutator((Node *) expr->arg,
-                                                     context);
-       args = list_make1(arg);
+               /*
+                * Reduce constants in the CoerceViaIO's argument.
+                */
+               arg = (Expr *) eval_const_expressions_mutator((Node *) expr->arg,
+                                                             context);
+               args = list_make1(arg);
 
-       /*
-        * CoerceViaIO represents calling the source type's output function
-        * then the result type's input function.  So, try to simplify it as
-        * though it were a stack of two such function calls.  First we need
-        * to know what the functions are.
-        *
-        * Note that the coercion functions are assumed not to care about
-        * input collation, so we just pass InvalidOid for that.
-        */
-       getTypeOutputInfo(exprType((Node *) arg), &outfunc, &outtypisvarlena);
-       getTypeInputInfo(expr->resulttype, &infunc, &intypioparam);
-
-       simple = simplify_function(NULL,
-                                  outfunc,
-                                  CSTRINGOID, -1,
-                                  InvalidOid,
-                                  InvalidOid,
-                                  &args,
-                                  false, true, context);
-       if (simple)             /* successfully simplified output fn */
-       {
-           /*
-            * Input functions may want 1 to 3 arguments.  We always supply
-            * all three, trusting that nothing downstream will complain.
-            */
-           args = list_make3(simple,
-                             makeConst(OIDOID, -1, InvalidOid, sizeof(Oid),
-                                       ObjectIdGetDatum(intypioparam),
-                                       false, true),
+               /*
+                * CoerceViaIO represents calling the source type's output
+                * function then the result type's input function.  So, try to
+                * simplify it as though it were a stack of two such function
+                * calls.  First we need to know what the functions are.
+                *
+                * Note that the coercion functions are assumed not to care
+                * about input collation, so we just pass InvalidOid for that.
+                */
+               getTypeOutputInfo(exprType((Node *) arg), &outfunc, &outtypisvarlena);
+               getTypeInputInfo(expr->resulttype, &infunc, &intypioparam);
+
+               simple = simplify_function(NULL,
+                                          outfunc,
+                                          CSTRINGOID, -1,
+                                          InvalidOid,
+                                          InvalidOid,
+                                          &args,
+                                          false, true, context);
+               if (simple)     /* successfully simplified output fn */
+               {
+                   /*
+                    * Input functions may want 1 to 3 arguments.  We always
+                    * supply all three, trusting that nothing downstream will
+                    * complain.
+                    */
+                   args = list_make3(simple,
+                              makeConst(OIDOID, -1, InvalidOid, sizeof(Oid),
+                                        ObjectIdGetDatum(intypioparam),
+                                        false, true),
                            makeConst(INT4OID, -1, InvalidOid, sizeof(int32),
                                      Int32GetDatum(-1),
                                      false, true));
 
-           simple = simplify_function(NULL,
-                                      infunc,
-                                      expr->resulttype, -1,
-                                      expr->resultcollid,
-                                      InvalidOid,
-                                      &args,
-                                      false, true, context);
-           if (simple)         /* successfully simplified input fn */
-               return (Node *) simple;
-       }
+                   simple = simplify_function(NULL,
+                                              infunc,
+                                              expr->resulttype, -1,
+                                              expr->resultcollid,
+                                              InvalidOid,
+                                              &args,
+                                              false, true, context);
+                   if (simple) /* successfully simplified input fn */
+                       return (Node *) simple;
+               }
 
-       /*
-        * The expression cannot be simplified any further, so build and
-        * return a replacement CoerceViaIO node using the possibly-simplified
-        * argument.
-        */
-       newexpr = makeNode(CoerceViaIO);
-       newexpr->arg = arg;
-       newexpr->resulttype = expr->resulttype;
-       newexpr->resultcollid = expr->resultcollid;
-       newexpr->coerceformat = expr->coerceformat;
-       newexpr->location = expr->location;
-       return (Node *) newexpr;
-   }
+               /*
+                * The expression cannot be simplified any further, so build
+                * and return a replacement CoerceViaIO node using the
+                * possibly-simplified argument.
+                */
+               newexpr = makeNode(CoerceViaIO);
+               newexpr->arg = arg;
+               newexpr->resulttype = expr->resulttype;
+               newexpr->resultcollid = expr->resultcollid;
+               newexpr->coerceformat = expr->coerceformat;
+               newexpr->location = expr->location;
+               return (Node *) newexpr;
+           }
        case T_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);
+           {
+               ArrayCoerceExpr *expr = (ArrayCoerceExpr *) node;
+               Expr       *arg;
+               ArrayCoerceExpr *newexpr;
 
-       newexpr = makeNode(ArrayCoerceExpr);
-       newexpr->arg = arg;
-       newexpr->elemfuncid = expr->elemfuncid;
-       newexpr->resulttype = expr->resulttype;
-       newexpr->resulttypmod = expr->resulttypmod;
-       newexpr->resultcollid = expr->resultcollid;
-       newexpr->isExplicit = expr->isExplicit;
-       newexpr->coerceformat = expr->coerceformat;
-       newexpr->location = expr->location;
+               /*
+                * 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->resultcollid = expr->resultcollid;
+               newexpr->isExplicit = expr->isExplicit;
+               newexpr->coerceformat = expr->coerceformat;
+               newexpr->location = expr->location;
 
-       /*
-        * 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,
-                                         newexpr->resultcollid);
-
-       /* Else we must return the partially-simplified node */
-       return (Node *) newexpr;
-   }
-   case T_CollateExpr:
-   {
-       /*
-        * If we can simplify the input to a constant, then we don't need the
-        * CollateExpr node at all: just change the constcollid field of the
-        * Const node.  Otherwise, replace the CollateExpr with a RelabelType.
-        * (We do that so as to improve uniformity of expression
-        * representation and thus simplify comparison of expressions.)
-        */
-       CollateExpr *collate = (CollateExpr *) node;
-       Node       *arg;
+               /*
+                * 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,
+                                                 newexpr->resultcollid);
+
+               /* Else we must return the partially-simplified node */
+               return (Node *) newexpr;
+           }
+       case T_CollateExpr:
+           {
+               /*
+                * If we can simplify the input to a constant, then we don't
+                * need the CollateExpr node at all: just change the
+                * constcollid field of the Const node.  Otherwise, replace
+                * the CollateExpr with a RelabelType. (We do that so as to
+                * improve uniformity of expression representation and thus
+                * simplify comparison of expressions.)
+                */
+               CollateExpr *collate = (CollateExpr *) node;
+               Node       *arg;
 
-       arg = eval_const_expressions_mutator((Node *) collate->arg,
-                                            context);
+               arg = eval_const_expressions_mutator((Node *) collate->arg,
+                                                    context);
 
-       if (arg && IsA(arg, Const))
-       {
-           Const      *con = (Const *) arg;
+               if (arg && IsA(arg, Const))
+               {
+                   Const      *con = (Const *) arg;
 
-           con->constcollid = collate->collOid;
-           return (Node *) con;
-       }
-       else if (collate->collOid == exprCollation(arg))
-       {
-           /* Don't need a RelabelType either... */
-           return arg;
-       }
-       else
-       {
-           RelabelType *relabel = makeNode(RelabelType);
+                   con->constcollid = collate->collOid;
+                   return (Node *) con;
+               }
+               else if (collate->collOid == exprCollation(arg))
+               {
+                   /* Don't need a RelabelType either... */
+                   return arg;
+               }
+               else
+               {
+                   RelabelType *relabel = makeNode(RelabelType);
 
-           relabel->resulttype = exprType(arg);
-           relabel->resulttypmod = exprTypmod(arg);
-           relabel->resultcollid = collate->collOid;
-           relabel->relabelformat = COERCE_DONTCARE;
-           relabel->location = collate->location;
+                   relabel->resulttype = exprType(arg);
+                   relabel->resulttypmod = exprTypmod(arg);
+                   relabel->resultcollid = collate->collOid;
+                   relabel->relabelformat = COERCE_DONTCARE;
+                   relabel->location = collate->location;
 
-           /* Don't create stacked RelabelTypes */
-           while (arg && IsA(arg, RelabelType))
-               arg = (Node *) ((RelabelType *) arg)->arg;
-           relabel->arg = (Expr *) arg;
+                   /* Don't create stacked RelabelTypes */
+                   while (arg && IsA(arg, RelabelType))
+                       arg = (Node *) ((RelabelType *) arg)->arg;
+                   relabel->arg = (Expr *) arg;
 
-           return (Node *) relabel;
-       }
-   }
-   case T_CaseExpr:
-   {
-       /*----------
-        * CASE expressions can be simplified if there are constant
-        * condition clauses:
-        *      FALSE (or NULL): drop the alternative
-        *      TRUE: drop all remaining alternatives
-        * If the first non-FALSE alternative is a constant TRUE, we can
-        * simplify the entire CASE to that alternative's expression.
-        * If there are no non-FALSE alternatives, we simplify the entire
-        * CASE to the default result (ELSE result).
-        *
-        * If we have a simple-form CASE with constant test expression,
-        * we substitute the constant value for contained CaseTestExpr
-        * placeholder nodes, so that we have the opportunity to reduce
-        * constant test conditions.  For example this allows
-        *      CASE 0 WHEN 0 THEN 1 ELSE 1/0 END
-        * to reduce to 1 rather than drawing a divide-by-0 error.  Note
-        * that when the test expression is constant, we don't have to
-        * include it in the resulting CASE; for example
-        *      CASE 0 WHEN x THEN y ELSE z END
-        * is transformed by the parser to
-        *      CASE 0 WHEN CaseTestExpr = x THEN y ELSE z END
-        * which we can simplify to
-        *      CASE WHEN 0 = x THEN y ELSE z END
-        * It is not necessary for the executor to evaluate the "arg"
-        * expression when executing the CASE, since any contained
-        * CaseTestExprs that might have referred to it will have been
-        * replaced by the constant.
-        *----------
-        */
-       CaseExpr   *caseexpr = (CaseExpr *) node;
-       CaseExpr   *newcase;
-       Node       *save_case_val;
-       Node       *newarg;
-       List       *newargs;
-       bool        const_true_cond;
-       Node       *defresult = NULL;
-       ListCell   *arg;
-
-       /* Simplify the test expression, if any */
-       newarg = eval_const_expressions_mutator((Node *) caseexpr->arg,
-                                               context);
-
-       /* Set up for contained CaseTestExpr nodes */
-       save_case_val = context->case_val;
-       if (newarg && IsA(newarg, Const))
-       {
-           context->case_val = newarg;
-           newarg = NULL;      /* not needed anymore, see comment above */
-       }
-       else
-           context->case_val = NULL;
+                   return (Node *) relabel;
+               }
+           }
+       case T_CaseExpr:
+           {
+               /*----------
+                * CASE expressions can be simplified if there are constant
+                * condition clauses:
+                *      FALSE (or NULL): drop the alternative
+                *      TRUE: drop all remaining alternatives
+                * If the first non-FALSE alternative is a constant TRUE, we can
+                * simplify the entire CASE to that alternative's expression.
+                * If there are no non-FALSE alternatives, we simplify the entire
+                * CASE to the default result (ELSE result).
+                *
+                * If we have a simple-form CASE with constant test expression,
+                * we substitute the constant value for contained CaseTestExpr
+                * placeholder nodes, so that we have the opportunity to reduce
+                * constant test conditions.  For example this allows
+                *      CASE 0 WHEN 0 THEN 1 ELSE 1/0 END
+                * to reduce to 1 rather than drawing a divide-by-0 error.  Note
+                * that when the test expression is constant, we don't have to
+                * include it in the resulting CASE; for example
+                *      CASE 0 WHEN x THEN y ELSE z END
+                * is transformed by the parser to
+                *      CASE 0 WHEN CaseTestExpr = x THEN y ELSE z END
+                * which we can simplify to
+                *      CASE WHEN 0 = x THEN y ELSE z END
+                * It is not necessary for the executor to evaluate the "arg"
+                * expression when executing the CASE, since any contained
+                * CaseTestExprs that might have referred to it will have been
+                * replaced by the constant.
+                *----------
+                */
+               CaseExpr   *caseexpr = (CaseExpr *) node;
+               CaseExpr   *newcase;
+               Node       *save_case_val;
+               Node       *newarg;
+               List       *newargs;
+               bool        const_true_cond;
+               Node       *defresult = NULL;
+               ListCell   *arg;
+
+               /* Simplify the test expression, if any */
+               newarg = eval_const_expressions_mutator((Node *) caseexpr->arg,
+                                                       context);
+
+               /* Set up for contained CaseTestExpr nodes */
+               save_case_val = context->case_val;
+               if (newarg && IsA(newarg, Const))
+               {
+                   context->case_val = newarg;
+                   newarg = NULL;      /* not needed anymore, see comment
+                                        * above */
+               }
+               else
+                   context->case_val = NULL;
 
-       /* Simplify the WHEN clauses */
-       newargs = NIL;
-       const_true_cond = false;
-       foreach(arg, caseexpr->args)
-       {
-           CaseWhen   *oldcasewhen = (CaseWhen *) lfirst(arg);
-           Node       *casecond;
-           Node       *caseresult;
+               /* Simplify the WHEN clauses */
+               newargs = NIL;
+               const_true_cond = false;
+               foreach(arg, caseexpr->args)
+               {
+                   CaseWhen   *oldcasewhen = (CaseWhen *) lfirst(arg);
+                   Node       *casecond;
+                   Node       *caseresult;
 
-           Assert(IsA(oldcasewhen, CaseWhen));
+                   Assert(IsA(oldcasewhen, CaseWhen));
 
-           /* Simplify this alternative's test condition */
-           casecond =
-               eval_const_expressions_mutator((Node *) oldcasewhen->expr,
-                                              context);
+                   /* Simplify this alternative's test condition */
+                   casecond =
+                       eval_const_expressions_mutator((Node *) oldcasewhen->expr,
+                                                      context);
 
-           /*
-            * If the test condition is constant FALSE (or NULL), then drop
-            * this WHEN clause completely, without processing the result.
-            */
-           if (casecond && IsA(casecond, Const))
-           {
-               Const      *const_input = (Const *) casecond;
+                   /*
+                    * If the test condition is constant FALSE (or NULL), then
+                    * drop this WHEN clause completely, without processing
+                    * the result.
+                    */
+                   if (casecond && IsA(casecond, Const))
+                   {
+                       Const      *const_input = (Const *) casecond;
+
+                       if (const_input->constisnull ||
+                           !DatumGetBool(const_input->constvalue))
+                           continue;   /* drop alternative with FALSE
+                                        * condition */
+                       /* Else it's constant TRUE */
+                       const_true_cond = true;
+                   }
+
+                   /* Simplify this alternative's result value */
+                   caseresult =
+                       eval_const_expressions_mutator((Node *) oldcasewhen->result,
+                                                      context);
+
+                   /* If non-constant test condition, emit a new WHEN node */
+                   if (!const_true_cond)
+                   {
+                       CaseWhen   *newcasewhen = makeNode(CaseWhen);
+
+                       newcasewhen->expr = (Expr *) casecond;
+                       newcasewhen->result = (Expr *) caseresult;
+                       newcasewhen->location = oldcasewhen->location;
+                       newargs = lappend(newargs, newcasewhen);
+                       continue;
+                   }
 
-               if (const_input->constisnull ||
-                   !DatumGetBool(const_input->constvalue))
-                   continue;   /* drop alternative with FALSE condition */
-               /* Else it's constant TRUE */
-               const_true_cond = true;
-           }
+                   /*
+                    * Found a TRUE condition, so none of the remaining
+                    * alternatives can be reached.  We treat the result as
+                    * the default result.
+                    */
+                   defresult = caseresult;
+                   break;
+               }
 
-           /* Simplify this alternative's result value */
-           caseresult =
-               eval_const_expressions_mutator((Node *) oldcasewhen->result,
-                                              context);
+               /* Simplify the default result, unless we replaced it above */
+               if (!const_true_cond)
+                   defresult =
+                       eval_const_expressions_mutator((Node *) caseexpr->defresult,
+                                                      context);
 
-           /* If non-constant test condition, emit a new WHEN node */
-           if (!const_true_cond)
-           {
-               CaseWhen   *newcasewhen = makeNode(CaseWhen);
+               context->case_val = save_case_val;
 
-               newcasewhen->expr = (Expr *) casecond;
-               newcasewhen->result = (Expr *) caseresult;
-               newcasewhen->location = oldcasewhen->location;
-               newargs = lappend(newargs, newcasewhen);
-               continue;
+               /*
+                * If no non-FALSE alternatives, CASE reduces to the default
+                * result
+                */
+               if (newargs == NIL)
+                   return defresult;
+               /* Otherwise we need a new CASE node */
+               newcase = makeNode(CaseExpr);
+               newcase->casetype = caseexpr->casetype;
+               newcase->casecollid = caseexpr->casecollid;
+               newcase->arg = (Expr *) newarg;
+               newcase->args = newargs;
+               newcase->defresult = (Expr *) defresult;
+               newcase->location = caseexpr->location;
+               return (Node *) newcase;
            }
-
-           /*
-            * Found a TRUE condition, so none of the remaining alternatives
-            * can be reached.  We treat the result as the default result.
-            */
-           defresult = caseresult;
-           break;
-       }
-
-       /* Simplify the default result, unless we replaced it above */
-       if (!const_true_cond)
-           defresult =
-               eval_const_expressions_mutator((Node *) caseexpr->defresult,
-                                              context);
-
-       context->case_val = save_case_val;
-
-       /* If no non-FALSE alternatives, CASE reduces to the default result */
-       if (newargs == NIL)
-           return defresult;
-       /* Otherwise we need a new CASE node */
-       newcase = makeNode(CaseExpr);
-       newcase->casetype = caseexpr->casetype;
-       newcase->casecollid = caseexpr->casecollid;
-       newcase->arg = (Expr *) newarg;
-       newcase->args = newargs;
-       newcase->defresult = (Expr *) defresult;
-       newcase->location = caseexpr->location;
-       return (Node *) newcase;
-   }
        case T_CaseTestExpr:
-   {
-       /*
-        * If we know a constant test value for the current CASE construct,
-        * substitute it for the placeholder.  Else just return the
-        * placeholder as-is.
-        */
-       if (context->case_val)
-           return copyObject(context->case_val);
-       else
-           return copyObject(node);
-   }
+           {
+               /*
+                * If we know a constant test value for the current CASE
+                * construct, substitute it for the placeholder.  Else just
+                * return the placeholder as-is.
+                */
+               if (context->case_val)
+                   return copyObject(context->case_val);
+               else
+                   return copyObject(node);
+           }
        case T_ArrayExpr:
-   {
-       ArrayExpr  *arrayexpr = (ArrayExpr *) node;
-       ArrayExpr  *newarray;
-       bool        all_const = true;
-       List       *newelems;
-       ListCell   *element;
-
-       newelems = NIL;
-       foreach(element, arrayexpr->elements)
-       {
-           Node       *e;
+           {
+               ArrayExpr  *arrayexpr = (ArrayExpr *) node;
+               ArrayExpr  *newarray;
+               bool        all_const = true;
+               List       *newelems;
+               ListCell   *element;
+
+               newelems = NIL;
+               foreach(element, arrayexpr->elements)
+               {
+                   Node       *e;
 
-           e = eval_const_expressions_mutator((Node *) lfirst(element),
-                                              context);
-           if (!IsA(e, Const))
-               all_const = false;
-           newelems = lappend(newelems, e);
-       }
+                   e = eval_const_expressions_mutator((Node *) lfirst(element),
+                                                      context);
+                   if (!IsA(e, Const))
+                       all_const = false;
+                   newelems = lappend(newelems, e);
+               }
 
-       newarray = makeNode(ArrayExpr);
-       newarray->array_typeid = arrayexpr->array_typeid;
-       newarray->array_collid = arrayexpr->array_collid;
-       newarray->element_typeid = arrayexpr->element_typeid;
-       newarray->elements = newelems;
-       newarray->multidims = arrayexpr->multidims;
-       newarray->location = arrayexpr->location;
-
-       if (all_const)
-           return (Node *) evaluate_expr((Expr *) newarray,
-                                         newarray->array_typeid,
-                                         exprTypmod(node),
-                                         newarray->array_collid);
-
-       return (Node *) newarray;
-   }
+               newarray = makeNode(ArrayExpr);
+               newarray->array_typeid = arrayexpr->array_typeid;
+               newarray->array_collid = arrayexpr->array_collid;
+               newarray->element_typeid = arrayexpr->element_typeid;
+               newarray->elements = newelems;
+               newarray->multidims = arrayexpr->multidims;
+               newarray->location = arrayexpr->location;
+
+               if (all_const)
+                   return (Node *) evaluate_expr((Expr *) newarray,
+                                                 newarray->array_typeid,
+                                                 exprTypmod(node),
+                                                 newarray->array_collid);
+
+               return (Node *) newarray;
+           }
        case T_CoalesceExpr:
-   {
-       CoalesceExpr *coalesceexpr = (CoalesceExpr *) node;
-       CoalesceExpr *newcoalesce;
-       List       *newargs;
-       ListCell   *arg;
+           {
+               CoalesceExpr *coalesceexpr = (CoalesceExpr *) node;
+               CoalesceExpr *newcoalesce;
+               List       *newargs;
+               ListCell   *arg;
 
-       newargs = NIL;
-       foreach(arg, coalesceexpr->args)
-       {
-           Node       *e;
+               newargs = NIL;
+               foreach(arg, coalesceexpr->args)
+               {
+                   Node       *e;
 
-           e = eval_const_expressions_mutator((Node *) lfirst(arg),
-                                              context);
+                   e = eval_const_expressions_mutator((Node *) lfirst(arg),
+                                                      context);
 
-           /*
-            * We can remove null constants from the list. For a non-null
-            * constant, if it has not been preceded by any other
-            * non-null-constant expressions then it is the result. Otherwise,
-            * it's the next argument, but we can drop following arguments
-            * since they will never be reached.
-            */
-           if (IsA(e, Const))
-           {
-               if (((Const *) e)->constisnull)
-                   continue;   /* drop null constant */
+                   /*
+                    * We can remove null constants from the list. For a
+                    * non-null constant, if it has not been preceded by any
+                    * other non-null-constant expressions then it is the
+                    * result. Otherwise, it's the next argument, but we can
+                    * drop following arguments since they will never be
+                    * reached.
+                    */
+                   if (IsA(e, Const))
+                   {
+                       if (((Const *) e)->constisnull)
+                           continue;   /* drop null constant */
+                       if (newargs == NIL)
+                           return e;   /* first expr */
+                       newargs = lappend(newargs, e);
+                       break;
+                   }
+                   newargs = lappend(newargs, e);
+               }
+
+               /*
+                * If all the arguments were constant null, the result is just
+                * null
+                */
                if (newargs == NIL)
-                   return e;   /* first expr */
-               newargs = lappend(newargs, e);
-               break;
+                   return (Node *) makeNullConst(coalesceexpr->coalescetype,
+                                                 -1,
+                                              coalesceexpr->coalescecollid);
+
+               newcoalesce = makeNode(CoalesceExpr);
+               newcoalesce->coalescetype = coalesceexpr->coalescetype;
+               newcoalesce->coalescecollid = coalesceexpr->coalescecollid;
+               newcoalesce->args = newargs;
+               newcoalesce->location = coalesceexpr->location;
+               return (Node *) newcoalesce;
            }
-           newargs = lappend(newargs, e);
-       }
-
-       /* If all the arguments were constant null, the result is just null */
-       if (newargs == NIL)
-           return (Node *) makeNullConst(coalesceexpr->coalescetype,
-                                         -1,
-                                         coalesceexpr->coalescecollid);
-
-       newcoalesce = makeNode(CoalesceExpr);
-       newcoalesce->coalescetype = coalesceexpr->coalescetype;
-       newcoalesce->coalescecollid = coalesceexpr->coalescecollid;
-       newcoalesce->args = newargs;
-       newcoalesce->location = coalesceexpr->location;
-       return (Node *) newcoalesce;
-   }
        case T_FieldSelect:
-   {
-       /*
-        * We can optimize field selection from a whole-row Var into a simple
-        * Var.  (This case won't be generated directly by the parser, because
-        * ParseComplexProjection short-circuits it. But it can arise while
-        * simplifying functions.)  Also, we can optimize field selection from
-        * a RowExpr construct.
-        *
-        * We must however check that the declared type of the field is still
-        * the same as when the FieldSelect was created --- this can change if
-        * someone did ALTER COLUMN TYPE on the rowtype.
-        */
-       FieldSelect *fselect = (FieldSelect *) node;
-       FieldSelect *newfselect;
-       Node       *arg;
-
-       arg = eval_const_expressions_mutator((Node *) fselect->arg,
-                                            context);
-       if (arg && IsA(arg, Var) &&
-           ((Var *) arg)->varattno == InvalidAttrNumber)
-       {
-           if (rowtype_field_matches(((Var *) arg)->vartype,
-                                     fselect->fieldnum,
-                                     fselect->resulttype,
-                                     fselect->resulttypmod,
-                                     fselect->resultcollid))
-               return (Node *) makeVar(((Var *) arg)->varno,
-                                       fselect->fieldnum,
-                                       fselect->resulttype,
-                                       fselect->resulttypmod,
-                                       fselect->resultcollid,
-                                       ((Var *) arg)->varlevelsup);
-       }
-       if (arg && IsA(arg, RowExpr))
-       {
-           RowExpr    *rowexpr = (RowExpr *) arg;
-
-           if (fselect->fieldnum > 0 &&
-               fselect->fieldnum <= list_length(rowexpr->args))
            {
-               Node       *fld = (Node *) list_nth(rowexpr->args,
-                                                   fselect->fieldnum - 1);
-
-               if (rowtype_field_matches(rowexpr->row_typeid,
-                                         fselect->fieldnum,
-                                         fselect->resulttype,
-                                         fselect->resulttypmod,
-                                         fselect->resultcollid) &&
-                   fselect->resulttype == exprType(fld) &&
-                   fselect->resulttypmod == exprTypmod(fld) &&
-                   fselect->resultcollid == exprCollation(fld))
-                   return fld;
+               /*
+                * We can optimize field selection from a whole-row Var into a
+                * simple Var.  (This case won't be generated directly by the
+                * parser, because ParseComplexProjection short-circuits it.
+                * But it can arise while simplifying functions.)  Also, we
+                * can optimize field selection from a RowExpr construct.
+                *
+                * We must however check that the declared type of the field
+                * is still the same as when the FieldSelect was created ---
+                * this can change if someone did ALTER COLUMN TYPE on the
+                * rowtype.
+                */
+               FieldSelect *fselect = (FieldSelect *) node;
+               FieldSelect *newfselect;
+               Node       *arg;
+
+               arg = eval_const_expressions_mutator((Node *) fselect->arg,
+                                                    context);
+               if (arg && IsA(arg, Var) &&
+                   ((Var *) arg)->varattno == InvalidAttrNumber)
+               {
+                   if (rowtype_field_matches(((Var *) arg)->vartype,
+                                             fselect->fieldnum,
+                                             fselect->resulttype,
+                                             fselect->resulttypmod,
+                                             fselect->resultcollid))
+                       return (Node *) makeVar(((Var *) arg)->varno,
+                                               fselect->fieldnum,
+                                               fselect->resulttype,
+                                               fselect->resulttypmod,
+                                               fselect->resultcollid,
+                                               ((Var *) arg)->varlevelsup);
+               }
+               if (arg && IsA(arg, RowExpr))
+               {
+                   RowExpr    *rowexpr = (RowExpr *) arg;
+
+                   if (fselect->fieldnum > 0 &&
+                       fselect->fieldnum <= list_length(rowexpr->args))
+                   {
+                       Node       *fld = (Node *) list_nth(rowexpr->args,
+                                                     fselect->fieldnum - 1);
+
+                       if (rowtype_field_matches(rowexpr->row_typeid,
+                                                 fselect->fieldnum,
+                                                 fselect->resulttype,
+                                                 fselect->resulttypmod,
+                                                 fselect->resultcollid) &&
+                           fselect->resulttype == exprType(fld) &&
+                           fselect->resulttypmod == exprTypmod(fld) &&
+                           fselect->resultcollid == exprCollation(fld))
+                           return fld;
+                   }
+               }
+               newfselect = makeNode(FieldSelect);
+               newfselect->arg = (Expr *) arg;
+               newfselect->fieldnum = fselect->fieldnum;
+               newfselect->resulttype = fselect->resulttype;
+               newfselect->resulttypmod = fselect->resulttypmod;
+               newfselect->resultcollid = fselect->resultcollid;
+               return (Node *) newfselect;
            }
-       }
-       newfselect = makeNode(FieldSelect);
-       newfselect->arg = (Expr *) arg;
-       newfselect->fieldnum = fselect->fieldnum;
-       newfselect->resulttype = fselect->resulttype;
-       newfselect->resulttypmod = fselect->resulttypmod;
-       newfselect->resultcollid = fselect->resultcollid;
-       return (Node *) newfselect;
-   }
        case T_NullTest:
-   {
-       NullTest   *ntest = (NullTest *) node;
-       NullTest   *newntest;
-       Node       *arg;
-
-       arg = eval_const_expressions_mutator((Node *) ntest->arg,
-                                            context);
-       if (arg && IsA(arg, RowExpr))
-       {
-           /*
-            * We break ROW(...) IS [NOT] NULL into separate tests on its
-            * component fields.  This form is usually more efficient to
-            * evaluate, as well as being more amenable to optimization.
-            */
-           RowExpr    *rarg = (RowExpr *) arg;
-           List       *newargs = NIL;
-           ListCell   *l;
-
-           Assert(ntest->argisrow);
-
-           foreach(l, rarg->args)
            {
-               Node       *relem = (Node *) lfirst(l);
+               NullTest   *ntest = (NullTest *) node;
+               NullTest   *newntest;
+               Node       *arg;
 
-               /*
-                * A constant field refutes the whole NullTest if it's of the
-                * wrong nullness; else we can discard it.
-                */
-               if (relem && IsA(relem, Const))
+               arg = eval_const_expressions_mutator((Node *) ntest->arg,
+                                                    context);
+               if (arg && IsA(arg, RowExpr))
                {
-                   Const      *carg = (Const *) relem;
-
-                   if (carg->constisnull ?
-                       (ntest->nulltesttype == IS_NOT_NULL) :
-                       (ntest->nulltesttype == IS_NULL))
-                       return makeBoolConst(false, false);
-                   continue;
+                   /*
+                    * We break ROW(...) IS [NOT] NULL into separate tests on
+                    * its component fields.  This form is usually more
+                    * efficient to evaluate, as well as being more amenable
+                    * to optimization.
+                    */
+                   RowExpr    *rarg = (RowExpr *) arg;
+                   List       *newargs = NIL;
+                   ListCell   *l;
+
+                   Assert(ntest->argisrow);
+
+                   foreach(l, rarg->args)
+                   {
+                       Node       *relem = (Node *) lfirst(l);
+
+                       /*
+                        * A constant field refutes the whole NullTest if it's
+                        * of the wrong nullness; else we can discard it.
+                        */
+                       if (relem && IsA(relem, Const))
+                       {
+                           Const      *carg = (Const *) relem;
+
+                           if (carg->constisnull ?
+                               (ntest->nulltesttype == IS_NOT_NULL) :
+                               (ntest->nulltesttype == IS_NULL))
+                               return makeBoolConst(false, false);
+                           continue;
+                       }
+                       newntest = makeNode(NullTest);
+                       newntest->arg = (Expr *) relem;
+                       newntest->nulltesttype = ntest->nulltesttype;
+                       newntest->argisrow = type_is_rowtype(exprType(relem));
+                       newargs = lappend(newargs, newntest);
+                   }
+                   /* If all the inputs were constants, result is TRUE */
+                   if (newargs == NIL)
+                       return makeBoolConst(true, false);
+                   /* If only one nonconst input, it's the result */
+                   if (list_length(newargs) == 1)
+                       return (Node *) linitial(newargs);
+                   /* Else we need an AND node */
+                   return (Node *) make_andclause(newargs);
+               }
+               if (!ntest->argisrow && arg && IsA(arg, Const))
+               {
+                   Const      *carg = (Const *) arg;
+                   bool        result;
+
+                   switch (ntest->nulltesttype)
+                   {
+                       case IS_NULL:
+                           result = carg->constisnull;
+                           break;
+                       case IS_NOT_NULL:
+                           result = !carg->constisnull;
+                           break;
+                       default:
+                           elog(ERROR, "unrecognized nulltesttype: %d",
+                                (int) ntest->nulltesttype);
+                           result = false;     /* keep compiler quiet */
+                           break;
+                   }
+
+                   return makeBoolConst(result, false);
                }
+
                newntest = makeNode(NullTest);
-               newntest->arg = (Expr *) relem;
+               newntest->arg = (Expr *) arg;
                newntest->nulltesttype = ntest->nulltesttype;
-               newntest->argisrow = type_is_rowtype(exprType(relem));
-               newargs = lappend(newargs, newntest);
+               newntest->argisrow = ntest->argisrow;
+               return (Node *) newntest;
            }
-           /* If all the inputs were constants, result is TRUE */
-           if (newargs == NIL)
-               return makeBoolConst(true, false);
-           /* If only one nonconst input, it's the result */
-           if (list_length(newargs) == 1)
-               return (Node *) linitial(newargs);
-           /* Else we need an AND node */
-           return (Node *) make_andclause(newargs);
-       }
-       if (!ntest->argisrow && arg && IsA(arg, Const))
-       {
-           Const      *carg = (Const *) arg;
-           bool        result;
-
-           switch (ntest->nulltesttype)
-           {
-               case IS_NULL:
-                   result = carg->constisnull;
-                   break;
-               case IS_NOT_NULL:
-                   result = !carg->constisnull;
-                   break;
-               default:
-                   elog(ERROR, "unrecognized nulltesttype: %d",
-                        (int) ntest->nulltesttype);
-                   result = false;     /* keep compiler quiet */
-                   break;
-           }
-
-           return makeBoolConst(result, false);
-       }
-
-       newntest = makeNode(NullTest);
-       newntest->arg = (Expr *) arg;
-       newntest->nulltesttype = ntest->nulltesttype;
-       newntest->argisrow = ntest->argisrow;
-       return (Node *) newntest;
-   }
        case T_BooleanTest:
-   {
-       BooleanTest *btest = (BooleanTest *) node;
-       BooleanTest *newbtest;
-       Node       *arg;
-
-       arg = eval_const_expressions_mutator((Node *) btest->arg,
-                                            context);
-       if (arg && IsA(arg, Const))
-       {
-           Const      *carg = (Const *) arg;
-           bool        result;
-
-           switch (btest->booltesttype)
            {
-               case IS_TRUE:
-                   result = (!carg->constisnull &&
-                             DatumGetBool(carg->constvalue));
-                   break;
-               case IS_NOT_TRUE:
-                   result = (carg->constisnull ||
-                             !DatumGetBool(carg->constvalue));
-                   break;
-               case IS_FALSE:
-                   result = (!carg->constisnull &&
-                             !DatumGetBool(carg->constvalue));
-                   break;
-               case IS_NOT_FALSE:
-                   result = (carg->constisnull ||
-                             DatumGetBool(carg->constvalue));
-                   break;
-               case IS_UNKNOWN:
-                   result = carg->constisnull;
-                   break;
-               case IS_NOT_UNKNOWN:
-                   result = !carg->constisnull;
-                   break;
-               default:
-                   elog(ERROR, "unrecognized booltesttype: %d",
-                        (int) btest->booltesttype);
-                   result = false;     /* keep compiler quiet */
-                   break;
-           }
+               BooleanTest *btest = (BooleanTest *) node;
+               BooleanTest *newbtest;
+               Node       *arg;
 
-           return makeBoolConst(result, false);
-       }
+               arg = eval_const_expressions_mutator((Node *) btest->arg,
+                                                    context);
+               if (arg && IsA(arg, Const))
+               {
+                   Const      *carg = (Const *) arg;
+                   bool        result;
+
+                   switch (btest->booltesttype)
+                   {
+                       case IS_TRUE:
+                           result = (!carg->constisnull &&
+                                     DatumGetBool(carg->constvalue));
+                           break;
+                       case IS_NOT_TRUE:
+                           result = (carg->constisnull ||
+                                     !DatumGetBool(carg->constvalue));
+                           break;
+                       case IS_FALSE:
+                           result = (!carg->constisnull &&
+                                     !DatumGetBool(carg->constvalue));
+                           break;
+                       case IS_NOT_FALSE:
+                           result = (carg->constisnull ||
+                                     DatumGetBool(carg->constvalue));
+                           break;
+                       case IS_UNKNOWN:
+                           result = carg->constisnull;
+                           break;
+                       case IS_NOT_UNKNOWN:
+                           result = !carg->constisnull;
+                           break;
+                       default:
+                           elog(ERROR, "unrecognized booltesttype: %d",
+                                (int) btest->booltesttype);
+                           result = false;     /* keep compiler quiet */
+                           break;
+                   }
+
+                   return makeBoolConst(result, false);
+               }
 
-       newbtest = makeNode(BooleanTest);
-       newbtest->arg = (Expr *) arg;
-       newbtest->booltesttype = btest->booltesttype;
-       return (Node *) newbtest;
-   }
+               newbtest = makeNode(BooleanTest);
+               newbtest->arg = (Expr *) arg;
+               newbtest->booltesttype = btest->booltesttype;
+               return (Node *) newbtest;
+           }
        case T_PlaceHolderVar:
-       /*
-        * In estimation mode, just strip the PlaceHolderVar node altogether;
-        * this amounts to estimating that the contained value won't be forced
-        * to null by an outer join.  In regular mode we just use the default
-        * behavior (ie, simplify the expression but leave the PlaceHolderVar
-        * node intact).
-        */
+
+           /*
+            * In estimation mode, just strip the PlaceHolderVar node
+            * altogether; this amounts to estimating that the contained value
+            * won't be forced to null by an outer join.  In regular mode we
+            * just use the default behavior (ie, simplify the expression but
+            * leave the PlaceHolderVar node intact).
+            */
            if (context->estimate)
            {
                PlaceHolderVar *phv = (PlaceHolderVar *) node;
@@ -3392,7 +3427,7 @@ simplify_boolean_equality(Oid opno, List *args)
  * result type OID (which is needed for polymorphic functions), result typmod,
  * result collation, the input collation to use for the function, the
  * pre-simplified argument list, and some flags; also the context data for
- * eval_const_expressions.  In common cases, several of the arguments could be
+ * eval_const_expressions. In common cases, several of the arguments could be
  * derived from the original expression.  Sending them separately avoids
  * duplicating NodeTag-specific knowledge, and it's necessary for CoerceViaIO.
  * A NULL original expression disables use of transform functions while
@@ -3424,7 +3459,7 @@ simplify_function(Expr *oldexpr, Oid funcid,
     * deliver a constant result, use a transform function to generate a
     * substitute node tree, or expand in-line the body of the function
     * definition (which only works for simple SQL-language functions, but
-    * that is a common case).  Each needs access to the function's pg_proc
+    * that is a common case).  Each needs access to the function's pg_proc
     * tuple, so fetch it just once.
     */
    func_tuple = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid));
@@ -3469,15 +3504,15 @@ simplify_function(Expr *oldexpr, Oid funcid,
     *
     * Currently, this facility is undocumented and not exposed to users at
     * the SQL level.  Core length coercion casts use it to avoid calls
-    * guaranteed to return their input unchanged.  This in turn allows ALTER
-    * TABLE ALTER TYPE to avoid rewriting tables for some typmod changes.  In
+    * guaranteed to return their input unchanged.  This in turn allows ALTER
+    * TABLE ALTER TYPE to avoid rewriting tables for some typmod changes.  In
     * the future, this facility may find other applications, like simplifying
     * x*0, x*1, and x+0.
     */
    transform = ((Form_pg_proc) GETSTRUCT(func_tuple))->protransform;
    if (!newexpr && OidIsValid(transform) && oldexpr)
        newexpr = (Expr *) DatumGetPointer(OidFunctionCall1(transform,
-                                                           PointerGetDatum(oldexpr)));
+                                                 PointerGetDatum(oldexpr)));
 
    if (!newexpr && allow_inline)
        newexpr = inline_function(funcid, result_type, result_collid,
@@ -4523,7 +4558,7 @@ inline_set_returning_function(PlannerInfo *root, RangeTblEntry *rte)
     * If it returns RECORD, we have to check against the column type list
     * provided in the RTE; check_sql_fn_retval can't do that.  (If no match,
     * we just fail to inline, rather than complaining; see notes for
-    * tlist_matches_coltypelist.)  We don't have to do this for functions
+    * tlist_matches_coltypelist.)  We don't have to do this for functions
     * with declared OUT parameters, even though their funcresulttype is
     * RECORDOID, so check get_func_result_type too.
     */