text: /*-------------------------------------------------------------------------
   *
   * value.h
   *	  interface for Value nodes
   *
   *
   * Copyright (c) 2003-2011, PostgreSQL Global Development Group
   *
   * src/include/nodes/value.h
   *
   *-------------------------------------------------------------------------
   */
  
  #ifndef VALUE_H
  #define VALUE_H
  
  #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);
  
  #endif   /* VALUE_H */
  