mirror of
https://github.com/simtactics/niotso.git
synced 2025-03-28 13:47:45 +00:00
61 lines
1.8 KiB
C
61 lines
1.8 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* 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 */
|