PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
value.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * value.h
4  * interface for Value nodes
5  *
6  *
7  * Copyright (c) 2003-2017, PostgreSQL Global Development Group
8  *
9  * src/include/nodes/value.h
10  *
11  *-------------------------------------------------------------------------
12  */
13 
14 #ifndef VALUE_H
15 #define VALUE_H
16 
17 #include "nodes/nodes.h"
18 
19 /*----------------------
20  * Value node
21  *
22  * The same Value struct is used for five node types: T_Integer,
23  * T_Float, T_String, T_BitString, T_Null.
24  *
25  * Integral values are actually represented by a machine integer,
26  * but both floats and strings are represented as strings.
27  * Using T_Float as the node type simply indicates that
28  * the contents of the string look like a valid numeric literal.
29  *
30  * (Before Postgres 7.0, we used a double to represent T_Float,
31  * but that creates loss-of-precision problems when the value is
32  * ultimately destined to be converted to NUMERIC. Since Value nodes
33  * are only used in the parsing process, not for runtime data, it's
34  * better to use the more general representation.)
35  *
36  * Note that an integer-looking string will get lexed as T_Float if
37  * the value is too large to fit in a 'long'.
38  *
39  * Nulls, of course, don't need the value part at all.
40  *----------------------
41  */
42 typedef struct Value
43 {
44  NodeTag type; /* tag appropriately (eg. T_String) */
45  union ValUnion
46  {
47  long ival; /* machine integer */
48  char *str; /* string */
49  } val;
50 } Value;
51 
52 #define intVal(v) (((Value *)(v))->val.ival)
53 #define floatVal(v) atof(((Value *)(v))->val.str)
54 #define strVal(v) (((Value *)(v))->val.str)
55 
56 extern Value *makeInteger(long i);
57 extern Value *makeFloat(char *numericStr);
58 extern Value *makeString(char *str);
59 extern Value *makeBitString(char *str);
60 
61 #endif /* VALUE_H */
long ival
Definition: value.h:47
struct Value Value
NodeTag
Definition: nodes.h:26
Value * makeInteger(long i)
Definition: value.c:23
Value * makeString(char *str)
Definition: value.c:53
union Value::ValUnion val
Value * makeFloat(char *numericStr)
Definition: value.c:38
Value * makeBitString(char *str)
Definition: value.c:68
Definition: value.h:42
char * str
Definition: value.h:48
int i
NodeTag type
Definition: value.h:44