Convert eval_const_expressions's long series of IsA tests into a switch.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 28 Nov 2011 19:21:40 +0000 (14:21 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 28 Nov 2011 19:21:40 +0000 (14:21 -0500)
This function has now grown enough cases that a switch seems appropriate.
This results in a measurable speed improvement on some platforms, and
should certainly not hurt.  The code's in need of a pgindent run now,
though.

Andres Freund

src/backend/optimizer/util/clauses.c

index 20e315e77a60bdb92009ecc00731463e43de1082..c4e75964d4e6ede61b50a624b19f0cb388dac4bb 100644 (file)
@@ -2106,7 +2106,9 @@ eval_const_expressions_mutator(Node *node,
 {
    if (node == NULL)
        return NULL;
-   if (IsA(node, Param))
+   switch (nodeTag(node))
+   {
+       case T_Param:
    {
        Param      *param = (Param *) node;
 
@@ -2152,7 +2154,7 @@ eval_const_expressions_mutator(Node *node,
        /* Not replaceable, so just copy the Param (no need to recurse) */
        return (Node *) copyObject(param);
    }
-   if (IsA(node, FuncExpr))
+       case T_FuncExpr:
    {
        FuncExpr   *expr = (FuncExpr *) node;
        List       *args;
@@ -2210,7 +2212,7 @@ eval_const_expressions_mutator(Node *node,
        newexpr->location = expr->location;
        return (Node *) newexpr;
    }
-   if (IsA(node, OpExpr))
+       case T_OpExpr:
    {
        OpExpr     *expr = (OpExpr *) node;
        List       *args;
@@ -2275,7 +2277,7 @@ eval_const_expressions_mutator(Node *node,
        newexpr->location = expr->location;
        return (Node *) newexpr;
    }
-   if (IsA(node, DistinctExpr))
+       case T_DistinctExpr:
    {
        DistinctExpr *expr = (DistinctExpr *) node;
        List       *args;
@@ -2372,7 +2374,7 @@ eval_const_expressions_mutator(Node *node,
        newexpr->location = expr->location;
        return (Node *) newexpr;
    }
-   if (IsA(node, BoolExpr))
+       case T_BoolExpr:
    {
        BoolExpr   *expr = (BoolExpr *) node;
 
@@ -2439,10 +2441,10 @@ eval_const_expressions_mutator(Node *node,
                     (int) expr->boolop);
                break;
        }
+       break;
    }
-   if (IsA(node, SubPlan) ||
-       IsA(node, AlternativeSubPlan))
-   {
+       case T_SubPlan:
+       case T_AlternativeSubPlan:
        /*
         * Return a SubPlan unchanged --- too late to do anything with it.
         *
@@ -2450,8 +2452,7 @@ eval_const_expressions_mutator(Node *node,
         * never be invoked after SubPlan creation.
         */
        return node;
-   }
-   if (IsA(node, RelabelType))
+       case T_RelabelType:
    {
        /*
         * 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,
            return (Node *) newrelabel;
        }
    }
-   if (IsA(node, CoerceViaIO))
+       case T_CoerceViaIO:
    {
        CoerceViaIO *expr = (CoerceViaIO *) node;
        Expr       *arg;
@@ -2569,7 +2570,7 @@ eval_const_expressions_mutator(Node *node,
        newexpr->location = expr->location;
        return (Node *) newexpr;
    }
-   if (IsA(node, ArrayCoerceExpr))
+       case T_ArrayCoerceExpr:
    {
        ArrayCoerceExpr *expr = (ArrayCoerceExpr *) node;
        Expr       *arg;
@@ -2607,7 +2608,7 @@ eval_const_expressions_mutator(Node *node,
        /* Else we must return the partially-simplified node */
        return (Node *) newexpr;
    }
-   if (IsA(node, CollateExpr))
+   case T_CollateExpr:
    {
        /*
         * 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,
            return (Node *) relabel;
        }
    }
-   if (IsA(node, CaseExpr))
+   case T_CaseExpr:
    {
        /*----------
         * CASE expressions can be simplified if there are constant
@@ -2783,7 +2784,7 @@ eval_const_expressions_mutator(Node *node,
        newcase->location = caseexpr->location;
        return (Node *) newcase;
    }
-   if (IsA(node, CaseTestExpr))
+       case T_CaseTestExpr:
    {
        /*
         * If we know a constant test value for the current CASE construct,
@@ -2795,7 +2796,7 @@ eval_const_expressions_mutator(Node *node,
        else
            return copyObject(node);
    }
-   if (IsA(node, ArrayExpr))
+       case T_ArrayExpr:
    {
        ArrayExpr  *arrayexpr = (ArrayExpr *) node;
        ArrayExpr  *newarray;
@@ -2831,7 +2832,7 @@ eval_const_expressions_mutator(Node *node,
 
        return (Node *) newarray;
    }
-   if (IsA(node, CoalesceExpr))
+       case T_CoalesceExpr:
    {
        CoalesceExpr *coalesceexpr = (CoalesceExpr *) node;
        CoalesceExpr *newcoalesce;
@@ -2878,7 +2879,7 @@ eval_const_expressions_mutator(Node *node,
        newcoalesce->location = coalesceexpr->location;
        return (Node *) newcoalesce;
    }
-   if (IsA(node, FieldSelect))
+       case T_FieldSelect:
    {
        /*
         * We can optimize field selection from a whole-row Var into a simple
@@ -2941,7 +2942,7 @@ eval_const_expressions_mutator(Node *node,
        newfselect->resultcollid = fselect->resultcollid;
        return (Node *) newfselect;
    }
-   if (IsA(node, NullTest))
+       case T_NullTest:
    {
        NullTest   *ntest = (NullTest *) node;
        NullTest   *newntest;
@@ -3024,7 +3025,7 @@ eval_const_expressions_mutator(Node *node,
        newntest->argisrow = ntest->argisrow;
        return (Node *) newntest;
    }
-   if (IsA(node, BooleanTest))
+       case T_BooleanTest:
    {
        BooleanTest *btest = (BooleanTest *) node;
        BooleanTest *newbtest;
@@ -3076,8 +3077,7 @@ eval_const_expressions_mutator(Node *node,
        newbtest->booltesttype = btest->booltesttype;
        return (Node *) newbtest;
    }
-   if (IsA(node, PlaceHolderVar) &&context->estimate)
-   {
+       case T_PlaceHolderVar:
        /*
         * In estimation mode, just strip the PlaceHolderVar node altogether;
         * this amounts to estimating that the contained value won't be forced
@@ -3085,10 +3085,16 @@ eval_const_expressions_mutator(Node *node,
         * behavior (ie, simplify the expression but leave the PlaceHolderVar
         * node intact).
         */
-       PlaceHolderVar *phv = (PlaceHolderVar *) node;
+           if (context->estimate)
+           {
+               PlaceHolderVar *phv = (PlaceHolderVar *) node;
 
-       return eval_const_expressions_mutator((Node *) phv->phexpr,
-                                             context);
+               return eval_const_expressions_mutator((Node *) phv->phexpr,
+                                                     context);
+           }
+           break;
+       default:
+           break;
    }
 
    /*