summaryrefslogtreecommitdiffstats
path: root/src/include/nodes/value.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/nodes/value.h')
-rw-r--r--src/include/nodes/value.h90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/include/nodes/value.h b/src/include/nodes/value.h
new file mode 100644
index 0000000..b24c4c1
--- /dev/null
+++ b/src/include/nodes/value.h
@@ -0,0 +1,90 @@
+/*-------------------------------------------------------------------------
+ *
+ * value.h
+ * interface for value nodes
+ *
+ *
+ * Copyright (c) 2003-2023, PostgreSQL Global Development Group
+ *
+ * src/include/nodes/value.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef VALUE_H
+#define VALUE_H
+
+#include "nodes/nodes.h"
+
+/*
+ * The node types Integer, Float, String, and BitString are used to represent
+ * literals in the lexer and are also used to pass constants around in the
+ * parser. One difference between these node types and, say, a plain int or
+ * char * is that the nodes can be put into a List.
+ *
+ * (There used to be a Value node, which encompassed all these different node types. Hence the name of this file.)
+ */
+
+typedef struct Integer
+{
+ pg_node_attr(special_read_write)
+
+ NodeTag type;
+ int ival;
+} Integer;
+
+/*
+ * Float is internally represented as string. Using T_Float as the node type
+ * simply indicates that the contents of the string look like a valid numeric
+ * literal. The value might end up being converted to NUMERIC, so we can't
+ * store it internally as a C double, since that could lose precision. Since
+ * these nodes are generally 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 an 'int'.
+ */
+typedef struct Float
+{
+ pg_node_attr(special_read_write)
+
+ NodeTag type;
+ char *fval;
+} Float;
+
+typedef struct Boolean
+{
+ pg_node_attr(special_read_write)
+
+ NodeTag type;
+ bool boolval;
+} Boolean;
+
+typedef struct String
+{
+ pg_node_attr(special_read_write)
+
+ NodeTag type;
+ char *sval;
+} String;
+
+typedef struct BitString
+{
+ pg_node_attr(special_read_write)
+
+ NodeTag type;
+ char *bsval;
+} BitString;
+
+#define intVal(v) (castNode(Integer, v)->ival)
+#define floatVal(v) atof(castNode(Float, v)->fval)
+#define boolVal(v) (castNode(Boolean, v)->boolval)
+#define strVal(v) (castNode(String, v)->sval)
+
+extern Integer *makeInteger(int i);
+extern Float *makeFloat(char *numericStr);
+extern Boolean *makeBoolean(bool val);
+extern String *makeString(char *str);
+extern BitString *makeBitString(char *str);
+
+#endif /* VALUE_H */