On Friday, November 18, 2011 10:14:22 PM Tom Lane wrote:
> Andres Freund <and...@anarazel.de> writes:
> > For unknown reasons the function used non chained ifs for every handled
> > nodeType.
> > Replacing the if chain with if; else if; ... resulted in a small
> > speedup. Replacing it with a switch() in a bigger one.
> 
> Cool, but this patch is impossible to validate by eye.  Could you
> resubmit a version that doesn't reindent unchanged code?  Leave it
> for pgindent to clean that up later.
Sure. It was just to confusing reading the code without reindenting.

Btw, I found git diff/show/blame -w very useful to view reindent code.

Actually git show -w seems to produce an applyable patch which doesn't 
reindent...

Andres
commit e114e3a2708cab8efd64281d09cecbd6303aa329
Author: Andres Freund <and...@anarazel.de>
Date:   Fri Nov 11 23:32:02 2011 +0100

    Replace a long chain of if's in eval_const_expressions_mutator by a switch()
    
    For unknown reasons the function used non chained ifs for every handled
    nodeType.
    
    Replacing the if chain with if; else if; ... resulted in a small
    speedup. Replacing it with a switch() in a bigger one.
    
    When testing with a statement containing a longer VALUES statement:
    pgbench -M prepared -f stmt -T 10:
    orig: 10015.287829
    if: 10075.482117
    switch: 10246.527402

diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index 197d9c2..f6f0b11 100644
--- a/src/backend/optimizer/util/clauses.c
+++ b/src/backend/optimizer/util/clauses.c
@@ -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;
 
@@ -2440,9 +2442,8 @@ eval_const_expressions_mutator(Node *node,
 				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 +2451,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 +2493,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 +2569,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 +2607,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 +2652,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 +2783,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 +2795,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 +2831,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 +2878,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 +2941,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 +3024,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,7 +3076,8 @@ eval_const_expressions_mutator(Node *node,
 		newbtest->booltesttype = btest->booltesttype;
 		return (Node *) newbtest;
 	}
-	if (IsA(node, PlaceHolderVar) &&context->estimate)
+		case T_PlaceHolderVar:
+			if(context->estimate)
 	{
 		/*
 		 * In estimation mode, just strip the PlaceHolderVar node altogether;
@@ -3090,6 +3091,10 @@ eval_const_expressions_mutator(Node *node,
 		return eval_const_expressions_mutator((Node *) phv->phexpr,
 											  context);
 	}
+			//fall through
+		default:
+			;
+	}
 
 	/*
 	 * For any node type not handled above, we recurse using
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to