@@ -2106,7 +2106,9 @@ eval_const_expressions_mutator(Node *node,
21062106{
21072107if (node == NULL )
21082108return NULL ;
2109- if (IsA (node ,Param ))
2109+ switch (nodeTag (node ))
2110+ {
2111+ case T_Param :
21102112{
21112113Param * param = (Param * )node ;
21122114
@@ -2152,7 +2154,7 @@ eval_const_expressions_mutator(Node *node,
21522154/* Not replaceable, so just copy the Param (no need to recurse) */
21532155return (Node * )copyObject (param );
21542156}
2155- if ( IsA ( node , FuncExpr ))
2157+ case T_FuncExpr :
21562158{
21572159FuncExpr * expr = (FuncExpr * )node ;
21582160List * args ;
@@ -2210,7 +2212,7 @@ eval_const_expressions_mutator(Node *node,
22102212newexpr -> location = expr -> location ;
22112213return (Node * )newexpr ;
22122214}
2213- if ( IsA ( node , OpExpr ))
2215+ case T_OpExpr :
22142216{
22152217OpExpr * expr = (OpExpr * )node ;
22162218List * args ;
@@ -2275,7 +2277,7 @@ eval_const_expressions_mutator(Node *node,
22752277newexpr -> location = expr -> location ;
22762278return (Node * )newexpr ;
22772279}
2278- if ( IsA ( node , DistinctExpr ))
2280+ case T_DistinctExpr :
22792281{
22802282DistinctExpr * expr = (DistinctExpr * )node ;
22812283List * args ;
@@ -2372,7 +2374,7 @@ eval_const_expressions_mutator(Node *node,
23722374newexpr -> location = expr -> location ;
23732375return (Node * )newexpr ;
23742376}
2375- if ( IsA ( node , BoolExpr ))
2377+ case T_BoolExpr :
23762378{
23772379BoolExpr * expr = (BoolExpr * )node ;
23782380
@@ -2439,19 +2441,18 @@ eval_const_expressions_mutator(Node *node,
24392441 (int )expr -> boolop );
24402442break ;
24412443}
2444+ break ;
24422445}
2443- if (IsA (node ,SubPlan )||
2444- IsA (node ,AlternativeSubPlan ))
2445- {
2446+ case T_SubPlan :
2447+ case T_AlternativeSubPlan :
24462448/*
24472449 * Return a SubPlan unchanged --- too late to do anything with it.
24482450 *
24492451 * XXX should we ereport() here instead? Probably this routine should
24502452 * never be invoked after SubPlan creation.
24512453 */
24522454return node ;
2453- }
2454- if (IsA (node ,RelabelType ))
2455+ case T_RelabelType :
24552456{
24562457/*
24572458 * If we can simplify the input to a constant, then we don't need the
@@ -2493,7 +2494,7 @@ eval_const_expressions_mutator(Node *node,
24932494return (Node * )newrelabel ;
24942495}
24952496}
2496- if ( IsA ( node , CoerceViaIO ))
2497+ case T_CoerceViaIO :
24972498{
24982499CoerceViaIO * expr = (CoerceViaIO * )node ;
24992500Expr * arg ;
@@ -2569,7 +2570,7 @@ eval_const_expressions_mutator(Node *node,
25692570newexpr -> location = expr -> location ;
25702571return (Node * )newexpr ;
25712572}
2572- if ( IsA ( node , ArrayCoerceExpr ))
2573+ case T_ArrayCoerceExpr :
25732574{
25742575ArrayCoerceExpr * expr = (ArrayCoerceExpr * )node ;
25752576Expr * arg ;
@@ -2607,7 +2608,7 @@ eval_const_expressions_mutator(Node *node,
26072608/* Else we must return the partially-simplified node */
26082609return (Node * )newexpr ;
26092610}
2610- if ( IsA ( node , CollateExpr ))
2611+ case T_CollateExpr :
26112612{
26122613/*
26132614 * If we can simplify the input to a constant, then we don't need the
@@ -2652,7 +2653,7 @@ eval_const_expressions_mutator(Node *node,
26522653return (Node * )relabel ;
26532654}
26542655}
2655- if ( IsA ( node , CaseExpr ))
2656+ case T_CaseExpr :
26562657{
26572658/*----------
26582659 * CASE expressions can be simplified if there are constant
@@ -2783,7 +2784,7 @@ eval_const_expressions_mutator(Node *node,
27832784newcase -> location = caseexpr -> location ;
27842785return (Node * )newcase ;
27852786}
2786- if ( IsA ( node , CaseTestExpr ))
2787+ case T_CaseTestExpr :
27872788{
27882789/*
27892790 * If we know a constant test value for the current CASE construct,
@@ -2795,7 +2796,7 @@ eval_const_expressions_mutator(Node *node,
27952796else
27962797return copyObject (node );
27972798}
2798- if ( IsA ( node , ArrayExpr ))
2799+ case T_ArrayExpr :
27992800{
28002801ArrayExpr * arrayexpr = (ArrayExpr * )node ;
28012802ArrayExpr * newarray ;
@@ -2831,7 +2832,7 @@ eval_const_expressions_mutator(Node *node,
28312832
28322833return (Node * )newarray ;
28332834}
2834- if ( IsA ( node , CoalesceExpr ))
2835+ case T_CoalesceExpr :
28352836{
28362837CoalesceExpr * coalesceexpr = (CoalesceExpr * )node ;
28372838CoalesceExpr * newcoalesce ;
@@ -2878,7 +2879,7 @@ eval_const_expressions_mutator(Node *node,
28782879newcoalesce -> location = coalesceexpr -> location ;
28792880return (Node * )newcoalesce ;
28802881}
2881- if ( IsA ( node , FieldSelect ))
2882+ case T_FieldSelect :
28822883{
28832884/*
28842885 * We can optimize field selection from a whole-row Var into a simple
@@ -2941,7 +2942,7 @@ eval_const_expressions_mutator(Node *node,
29412942newfselect -> resultcollid = fselect -> resultcollid ;
29422943return (Node * )newfselect ;
29432944}
2944- if ( IsA ( node , NullTest ))
2945+ case T_NullTest :
29452946{
29462947NullTest * ntest = (NullTest * )node ;
29472948NullTest * newntest ;
@@ -3024,7 +3025,7 @@ eval_const_expressions_mutator(Node *node,
30243025newntest -> argisrow = ntest -> argisrow ;
30253026return (Node * )newntest ;
30263027}
3027- if ( IsA ( node , BooleanTest ))
3028+ case T_BooleanTest :
30283029{
30293030BooleanTest * btest = (BooleanTest * )node ;
30303031BooleanTest * newbtest ;
@@ -3076,19 +3077,24 @@ eval_const_expressions_mutator(Node *node,
30763077newbtest -> booltesttype = btest -> booltesttype ;
30773078return (Node * )newbtest ;
30783079}
3079- if (IsA (node ,PlaceHolderVar )&& context -> estimate )
3080- {
3080+ case T_PlaceHolderVar :
30813081/*
30823082 * In estimation mode, just strip the PlaceHolderVar node altogether;
30833083 * this amounts to estimating that the contained value won't be forced
30843084 * to null by an outer join. In regular mode we just use the default
30853085 * behavior (ie, simplify the expression but leave the PlaceHolderVar
30863086 * node intact).
30873087 */
3088- PlaceHolderVar * phv = (PlaceHolderVar * )node ;
3088+ if (context -> estimate )
3089+ {
3090+ PlaceHolderVar * phv = (PlaceHolderVar * )node ;
30893091
3090- return eval_const_expressions_mutator ((Node * )phv -> phexpr ,
3091- context );
3092+ return eval_const_expressions_mutator ((Node * )phv -> phexpr ,
3093+ context );
3094+ }
3095+ break ;
3096+ default :
3097+ break ;
30923098}
30933099
30943100/*