diff --git a/src/backend/nodes/Makefile b/src/backend/nodes/Makefile
index a2a994d8685cffd6afeb86d9d5ea40a96f5ac885..a4c19201bb2f9b92ec99299875136c6f75b70012 100644
--- a/src/backend/nodes/Makefile
+++ b/src/backend/nodes/Makefile
@@ -4,7 +4,7 @@
 #    Makefile for backend/nodes
 #
 # IDENTIFICATION
-#    $PostgreSQL: pgsql/src/backend/nodes/Makefile,v 1.15 2003/11/29 19:51:49 pgsql Exp $
+#    $PostgreSQL: pgsql/src/backend/nodes/Makefile,v 1.16 2004/01/07 18:43:36 neilc Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -14,7 +14,7 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = nodeFuncs.o nodes.o list.o bitmapset.o \
        copyfuncs.o equalfuncs.o makefuncs.o \
-       outfuncs.o readfuncs.o print.o read.o
+       outfuncs.o readfuncs.o print.o read.o value.o
 
 all: SUBSYS.o
 
diff --git a/src/backend/nodes/list.c b/src/backend/nodes/list.c
index eba26bb4808e4ccd5826d5d64df273297bdc24e9..aeda02d17029a3dd43a0509ebde9c36f0a0af725 100644
--- a/src/backend/nodes/list.c
+++ b/src/backend/nodes/list.c
@@ -1,7 +1,7 @@
 /*-------------------------------------------------------------------------
  *
  * list.c
- *	  POSTGRES generic list package
+ *	  implementation for PostgreSQL generic linked list package
  *
  *
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
@@ -9,17 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/nodes/list.c,v 1.55 2003/11/29 19:51:49 pgsql Exp $
- *
- * NOTES
- *	  XXX a few of the following functions are duplicated to handle
- *		  List of pointers and List of integers separately. Some day,
- *		  someone should unify them.			- ay 11/2/94
- *	  This file needs cleanup.
- *
- * HISTORY
- *	  AUTHOR			DATE			MAJOR EVENT
- *	  Andrew Yu			Oct, 1994		file creation
+ *	  $PostgreSQL: pgsql/src/backend/nodes/list.c,v 1.56 2004/01/07 18:43:36 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -27,67 +17,6 @@
 
 #include "nodes/parsenodes.h"
 
-
-/*
- *	makeInteger
- */
-Value *
-makeInteger(long i)
-{
-	Value	   *v = makeNode(Value);
-
-	v->type = T_Integer;
-	v->val.ival = i;
-	return v;
-}
-
-/*
- *	makeFloat
- *
- * Caller is responsible for passing a palloc'd string.
- */
-Value *
-makeFloat(char *numericStr)
-{
-	Value	   *v = makeNode(Value);
-
-	v->type = T_Float;
-	v->val.str = numericStr;
-	return v;
-}
-
-/*
- *	makeString
- *
- * Caller is responsible for passing a palloc'd string.
- */
-Value *
-makeString(char *str)
-{
-	Value	   *v = makeNode(Value);
-
-	v->type = T_String;
-	v->val.str = str;
-	return v;
-}
-
-
-/*
- *	makeBitString
- *
- * Caller is responsible for passing a palloc'd string.
- */
-Value *
-makeBitString(char *str)
-{
-	Value	   *v = makeNode(Value);
-
-	v->type = T_BitString;
-	v->val.str = str;
-	return v;
-}
-
-
 /*
  *	lcons
  *
diff --git a/src/backend/nodes/value.c b/src/backend/nodes/value.c
new file mode 100644
index 0000000000000000000000000000000000000000..5ea965c8b2febb6ef19dd07b949db937ccc5a978
--- /dev/null
+++ b/src/backend/nodes/value.c
@@ -0,0 +1,75 @@
+/*-------------------------------------------------------------------------
+ *
+ * value.c
+ *	  implementation of Value nodes
+ *
+ *
+ * Copyright (c) 2003, PostgreSQL Global Development Group
+ *
+ *
+ * IDENTIFICATION
+ *	  $PostgreSQL: pgsql/src/backend/nodes/value.c,v 1.1 2004/01/07 18:43:36 neilc Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "nodes/parsenodes.h"
+
+/*
+ *	makeInteger
+ */
+Value *
+makeInteger(long i)
+{
+	Value	   *v = makeNode(Value);
+
+	v->type = T_Integer;
+	v->val.ival = i;
+	return v;
+}
+
+/*
+ *	makeFloat
+ *
+ * Caller is responsible for passing a palloc'd string.
+ */
+Value *
+makeFloat(char *numericStr)
+{
+	Value	   *v = makeNode(Value);
+
+	v->type = T_Float;
+	v->val.str = numericStr;
+	return v;
+}
+
+/*
+ *	makeString
+ *
+ * Caller is responsible for passing a palloc'd string.
+ */
+Value *
+makeString(char *str)
+{
+	Value	   *v = makeNode(Value);
+
+	v->type = T_String;
+	v->val.str = str;
+	return v;
+}
+
+/*
+ *	makeBitString
+ *
+ * Caller is responsible for passing a palloc'd string.
+ */
+Value *
+makeBitString(char *str)
+{
+	Value	   *v = makeNode(Value);
+
+	v->type = T_BitString;
+	v->val.str = str;
+	return v;
+}
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h
index cc4d3fe9331c448b45bc075ddb35e4206cf9ebe6..ced6f6cb432ee0dbe8f90118d944e7cc524dd66e 100644
--- a/src/include/nodes/nodes.h
+++ b/src/include/nodes/nodes.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/nodes.h,v 1.149 2004/01/06 23:55:19 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/nodes.h,v 1.150 2004/01/07 18:43:36 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -175,16 +175,20 @@ typedef enum NodeTag
 	T_AllocSetContext,
 
 	/*
-	 * TAGS FOR VALUE NODES (pg_list.h)
+	 * TAGS FOR VALUE NODES (value.h)
 	 */
 	T_Value = 650,
-	T_List,
 	T_Integer,
 	T_Float,
 	T_String,
 	T_BitString,
 	T_Null,
 
+	/*
+	 * TAGS FOR LIST NODES (pg_list.h)
+	 */
+	T_List,
+
 	/*
 	 * TAGS FOR PARSE TREE NODES (parsenodes.h)
 	 */
diff --git a/src/include/nodes/pg_list.h b/src/include/nodes/pg_list.h
index e9d6db86991276000ddc1f981a03977e2b732ade..31566a29c9f0a83757d341011c5f0205b61ee38e 100644
--- a/src/include/nodes/pg_list.h
+++ b/src/include/nodes/pg_list.h
@@ -1,13 +1,13 @@
 /*-------------------------------------------------------------------------
  *
  * pg_list.h
- *	  POSTGRES generic list package
+ *	  interface for PostgreSQL generic linked list package
  *
  *
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/pg_list.h,v 1.42 2003/11/29 22:41:06 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/pg_list.h,v 1.43 2004/01/07 18:43:36 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -21,44 +21,6 @@
  * ----------------------------------------------------------------
  */
 
-/*----------------------
- *		Value node
- *
- * The same Value struct is used for five node types: T_Integer,
- * T_Float, T_String, T_BitString, T_Null.
- *
- * Integral values are actually represented by a machine integer,
- * but both floats and strings are represented as strings.
- * Using T_Float as the node type simply indicates that
- * the contents of the string look like a valid numeric literal.
- *
- * (Before Postgres 7.0, we used a double to represent T_Float,
- * but that creates loss-of-precision problems when the value is
- * ultimately destined to be converted to NUMERIC.	Since Value nodes
- * are only used in the parsing process, not for runtime data, it's
- * better to use the more general representation.)
- *
- * Note that an integer-looking string will get lexed as T_Float if
- * the value is too large to fit in a 'long'.
- *
- * Nulls, of course, don't need the value part at all.
- *----------------------
- */
-typedef struct Value
-{
-	NodeTag		type;			/* tag appropriately (eg. T_String) */
-	union ValUnion
-	{
-		long		ival;		/* machine integer */
-		char	   *str;		/* string */
-	}			val;
-} Value;
-
-#define intVal(v)		(((Value *)(v))->val.ival)
-#define floatVal(v)		atof(((Value *)(v))->val.str)
-#define strVal(v)		(((Value *)(v))->val.str)
-
-
 /*----------------------
  *		List node
  *
@@ -150,15 +112,6 @@ typedef struct FastList
 #define makeFastList1(fl, x1)  \
 	( (fl)->head = (fl)->tail = makeList1(x1) )
 
-
-/*
- * function prototypes in nodes/list.c
- */
-extern Value *makeInteger(long i);
-extern Value *makeFloat(char *numericStr);
-extern Value *makeString(char *str);
-extern Value *makeBitString(char *str);
-
 extern List *lcons(void *datum, List *list);
 extern List *lconsi(int datum, List *list);
 extern List *lconso(Oid datum, List *list);
diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h
index 41efbf75162ca74241b567195e0497e5e127961f..6a9312b73fe309f6fb0deff64699164bd12a7ef9 100644
--- a/src/include/nodes/primnodes.h
+++ b/src/include/nodes/primnodes.h
@@ -10,7 +10,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/primnodes.h,v 1.93 2003/11/29 22:41:06 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/primnodes.h,v 1.94 2004/01/07 18:43:36 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -19,6 +19,7 @@
 
 #include "access/attnum.h"
 #include "nodes/pg_list.h"
+#include "nodes/value.h"
 
 
 /* ----------------------------------------------------------------
diff --git a/src/include/nodes/value.h b/src/include/nodes/value.h
new file mode 100644
index 0000000000000000000000000000000000000000..6f135492d377d14e82aa09e1b52a839f0ee2b66e
--- /dev/null
+++ b/src/include/nodes/value.h
@@ -0,0 +1,56 @@
+/*-------------------------------------------------------------------------
+ *
+ * value.h
+ *	  interface for Value nodes
+ *
+ *
+ * Copyright (c) 2003, PostgreSQL Global Development Group
+ *
+ * $PostgreSQL: pgsql/src/include/nodes/value.h,v 1.1 2004/01/07 18:43:36 neilc Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "nodes/nodes.h"
+
+/*----------------------
+ *		Value node
+ *
+ * The same Value struct is used for five node types: T_Integer,
+ * T_Float, T_String, T_BitString, T_Null.
+ *
+ * Integral values are actually represented by a machine integer,
+ * but both floats and strings are represented as strings.
+ * Using T_Float as the node type simply indicates that
+ * the contents of the string look like a valid numeric literal.
+ *
+ * (Before Postgres 7.0, we used a double to represent T_Float,
+ * but that creates loss-of-precision problems when the value is
+ * ultimately destined to be converted to NUMERIC.	Since Value nodes
+ * are only used in the parsing process, not for runtime data, it's
+ * better to use the more general representation.)
+ *
+ * Note that an integer-looking string will get lexed as T_Float if
+ * the value is too large to fit in a 'long'.
+ *
+ * Nulls, of course, don't need the value part at all.
+ *----------------------
+ */
+typedef struct Value
+{
+	NodeTag		type;			/* tag appropriately (eg. T_String) */
+	union ValUnion
+	{
+		long		ival;		/* machine integer */
+		char	   *str;		/* string */
+	}			val;
+} Value;
+
+#define intVal(v)		(((Value *)(v))->val.ival)
+#define floatVal(v)		atof(((Value *)(v))->val.str)
+#define strVal(v)		(((Value *)(v))->val.str)
+
+extern Value *makeInteger(long i);
+extern Value *makeFloat(char *numericStr);
+extern Value *makeString(char *str);
+extern Value *makeBitString(char *str);