Index: src/backend/nodes/nodes.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/nodes/nodes.c,v
retrieving revision 1.15
diff -c -c -r1.15 nodes.c
*** src/backend/nodes/nodes.c	20 Jun 2002 20:29:29 -0000	1.15
--- src/backend/nodes/nodes.c	8 Oct 2002 23:52:21 -0000
***************
*** 28,42 ****
   *	  macro makeNode. eg. to create a Resdom node, use makeNode(Resdom)
   *
   */
! Node *
! newNode(Size size, NodeTag tag)
! {
! 	Node	   *newNode;
  
- 	Assert(size >= sizeof(Node));		/* need the tag, at least */
- 
- 	newNode = (Node *) palloc(size);
- 	MemSet((char *) newNode, 0, size);
- 	newNode->type = tag;
- 	return newNode;
- }
--- 28,32 ----
   *	  macro makeNode. eg. to create a Resdom node, use makeNode(Resdom)
   *
   */
! Node *newNodeMacroHolder;
  
Index: src/include/nodes/nodes.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/nodes/nodes.h,v
retrieving revision 1.118
diff -c -c -r1.118 nodes.h
*** src/include/nodes/nodes.h	31 Aug 2002 22:10:47 -0000	1.118
--- src/include/nodes/nodes.h	8 Oct 2002 23:52:25 -0000
***************
*** 261,266 ****
--- 261,285 ----
  
  #define nodeTag(nodeptr)		(((Node*)(nodeptr))->type)
  
+ /*
+  *	There is no way to deferernce the palloc'ed pointer to assign the
+  *	tag, and return the pointer itself, so we need a holder variable.
+  *	Fortunately, this function isn't recursive so we just define
+  *	a global variable for this purpose.
+  */
+ extern Node *newNodeMacroHolder;
+ 
+ #define newNode(size, tag) \
+ ( \
+ 	AssertMacro((size) >= sizeof(Node)),		/* need the tag, at least */ \
+ \
+ 	newNodeMacroHolder = (Node *) palloc(size), \
+ 	memset((char *)newNodeMacroHolder, 0, (size)), \
+ 	newNodeMacroHolder->type = (tag), \
+ 	newNodeMacroHolder \
+ )
+ 
+ 
  #define makeNode(_type_)		((_type_ *) newNode(sizeof(_type_),T_##_type_))
  #define NodeSetTag(nodeptr,t)	(((Node*)(nodeptr))->type = (t))
  
***************
*** 281,291 ****
   *					  extern declarations follow
   * ----------------------------------------------------------------
   */
- 
- /*
-  * nodes/nodes.c
-  */
- extern Node *newNode(Size size, NodeTag tag);
  
  /*
   * nodes/{outfuncs.c,print.c}
--- 300,305 ----
