Skip to content

Commit afaa6b9

Browse files
committed
Marginal performance hack: avoid unnecessary work in expression_tree_mutator.
We can just palloc, instead of using makeNode, when we are going to overwrite the whole node anyway in the FLATCOPY macro. Also, use FLATCOPY instead of copyObject for common node types Var and Const.
1 parent 39a333a commit afaa6b9

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

src/backend/optimizer/util/clauses.c

+25-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.242 2007/04/27 22:05:48 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.243 2007/04/30 00:14:54 tgl Exp $
1212
*
1313
* HISTORY
1414
* AUTHOR DATE MAJOR EVENT
@@ -3770,12 +3770,12 @@ expression_tree_mutator(Node *node,
37703770
*/
37713771

37723772
#define FLATCOPY(newnode, node, nodetype) \
3773-
( (newnode) = makeNode(nodetype), \
3773+
( (newnode) = (nodetype *) palloc(sizeof(nodetype)), \
37743774
memcpy((newnode), (node), sizeof(nodetype)) )
37753775

37763776
#define CHECKFLATCOPY(newnode, node, nodetype) \
37773777
( AssertMacro(IsA((node), nodetype)), \
3778-
(newnode) = makeNode(nodetype), \
3778+
(newnode) = (nodetype *) palloc(sizeof(nodetype)), \
37793779
memcpy((newnode), (node), sizeof(nodetype)) )
37803780

37813781
#define MUTATE(newfield, oldfield, fieldtype) \
@@ -3789,15 +3789,36 @@ expression_tree_mutator(Node *node,
37893789

37903790
switch (nodeTag(node))
37913791
{
3792+
/*
3793+
* Primitive node types with no expression subnodes. Var and Const
3794+
* are frequent enough to deserve special cases, the others we just
3795+
* use copyObject for.
3796+
*/
37923797
case T_Var:
3798+
{
3799+
Var *var = (Var *) node;
3800+
Var *newnode;
3801+
3802+
FLATCOPY(newnode, var, Var);
3803+
return (Node *) newnode;
3804+
}
3805+
break;
37933806
case T_Const:
3807+
{
3808+
Const *oldnode = (Const *) node;
3809+
Const *newnode;
3810+
3811+
FLATCOPY(newnode, oldnode, Const);
3812+
/* XXX we don't bother with datumCopy; should we? */
3813+
return (Node *) newnode;
3814+
}
3815+
break;
37943816
case T_Param:
37953817
case T_CoerceToDomainValue:
37963818
case T_CaseTestExpr:
37973819
case T_SetToDefault:
37983820
case T_RangeTblRef:
37993821
case T_OuterJoinInfo:
3800-
/* primitive node types with no expression subnodes */
38013822
return (Node *) copyObject(node);
38023823
case T_Aggref:
38033824
{

0 commit comments

Comments
 (0)