44#define READ_LOCALS_NO_FIELDS(nodeTypeName) \
45 nodeTypeName *local_node = makeNode(nodeTypeName)
48#define READ_TEMP_LOCALS() \
53#define READ_LOCALS(nodeTypeName) \
54 READ_LOCALS_NO_FIELDS(nodeTypeName); \
58#define READ_INT_FIELD(fldname) \
59 token = pg_strtok(&length); \
60 token = pg_strtok(&length); \
61 local_node->fldname = atoi(token)
64#define READ_UINT_FIELD(fldname) \
65 token = pg_strtok(&length); \
66 token = pg_strtok(&length); \
67 local_node->fldname = atoui(token)
70#define READ_INT64_FIELD(fldname) \
71 token = pg_strtok(&length); \
72 token = pg_strtok(&length); \
73 local_node->fldname = strtoi64(token, NULL, 10)
76#define READ_UINT64_FIELD(fldname) \
77 token = pg_strtok(&length); \
78 token = pg_strtok(&length); \
79 local_node->fldname = strtou64(token, NULL, 10)
82#define READ_LONG_FIELD(fldname) \
83 token = pg_strtok(&length); \
84 token = pg_strtok(&length); \
85 local_node->fldname = atol(token)
88#define READ_OID_FIELD(fldname) \
89 token = pg_strtok(&length); \
90 token = pg_strtok(&length); \
91 local_node->fldname = atooid(token)
94#define READ_CHAR_FIELD(fldname) \
95 token = pg_strtok(&length); \
96 token = pg_strtok(&length); \
98 local_node->fldname = (length == 0) ? '\0' : (token[0] == '\\' ? token[1] : token[0])
101#define READ_ENUM_FIELD(fldname, enumtype) \
102 token = pg_strtok(&length); \
103 token = pg_strtok(&length); \
104 local_node->fldname = (enumtype) atoi(token)
107#define READ_FLOAT_FIELD(fldname) \
108 token = pg_strtok(&length); \
109 token = pg_strtok(&length); \
110 local_node->fldname = atof(token)
113#define READ_BOOL_FIELD(fldname) \
114 token = pg_strtok(&length); \
115 token = pg_strtok(&length); \
116 local_node->fldname = strtobool(token)
119#define READ_STRING_FIELD(fldname) \
120 token = pg_strtok(&length); \
121 token = pg_strtok(&length); \
122 local_node->fldname = nullable_string(token, length)
125#ifdef DEBUG_NODE_TESTS_ENABLED
126#define READ_LOCATION_FIELD(fldname) \
127 token = pg_strtok(&length); \
128 token = pg_strtok(&length); \
129 local_node->fldname = restore_location_fields ? atoi(token) : -1
131#define READ_LOCATION_FIELD(fldname) \
132 token = pg_strtok(&length); \
133 token = pg_strtok(&length); \
135 local_node->fldname = -1
139#define READ_NODE_FIELD(fldname) \
140 token = pg_strtok(&length); \
142 local_node->fldname = nodeRead(NULL, 0)
145#define READ_BITMAPSET_FIELD(fldname) \
146 token = pg_strtok(&length); \
148 local_node->fldname = _readBitmapset()
151#define READ_ATTRNUMBER_ARRAY(fldname, len) \
152 token = pg_strtok(&length); \
153 local_node->fldname = readAttrNumberCols(len)
156#define READ_OID_ARRAY(fldname, len) \
157 token = pg_strtok(&length); \
158 local_node->fldname = readOidCols(len)
161#define READ_INT_ARRAY(fldname, len) \
162 token = pg_strtok(&length); \
163 local_node->fldname = readIntCols(len)
166#define READ_BOOL_ARRAY(fldname, len) \
167 token = pg_strtok(&length); \
168 local_node->fldname = readBoolCols(len)
181#define atoui(x) ((unsigned int) strtoul((x), NULL, 10))
183#define strtobool(x) ((*(x) == 't') ? true : false)
192 if (length == 2 &&
token[0] ==
'"' &&
token[1] ==
'"')
215 elog(
ERROR,
"incomplete Bitmapset structure");
216 if (length != 1 ||
token[0] !=
'(')
221 elog(
ERROR,
"incomplete Bitmapset structure");
222 if (length != 1 ||
token[0] !=
'b')
232 elog(
ERROR,
"unterminated Bitmapset structure");
233 if (length == 1 &&
token[0] ==
')')
236 if (endptr !=
token + length)
254#include "readfuncs.funcs.c"
339 elog(
ERROR,
"unrecognized node type: %d",
400 local_node->colcollations = tf->colcollations;
462 else if (length == 8 &&
strncmp(
token,
"DISTINCT", 8) == 0)
467 else if (length == 12 &&
strncmp(
token,
"NOT_DISTINCT", 12) == 0)
472 else if (length == 6 &&
strncmp(
token,
"NULLIF", 6) == 0)
487 else if (length == 5 &&
strncmp(
token,
"ILIKE", 5) == 0)
492 else if (length == 7 &&
strncmp(
token,
"SIMILAR", 7) == 0)
497 else if (length == 7 &&
strncmp(
token,
"BETWEEN", 7) == 0)
502 else if (length == 11 &&
strncmp(
token,
"NOT_BETWEEN", 11) == 0)
507 else if (length == 11 &&
strncmp(
token,
"BETWEEN_SYM", 11) == 0)
512 else if (length == 15 &&
strncmp(
token,
"NOT_BETWEEN_SYM", 15) == 0)
517 else if (length == 5 &&
strncmp(
token,
":name", 5) == 0)
539 const char *extnodename;
548 elog(
ERROR,
"extnodename has to be supplied");
580#define MATCH(tokname, namelen) \
581 (length == namelen && memcmp(token, tokname, namelen) == 0)
583#include "readfuncs.switch.c"
614 elog(
ERROR,
"expected \"[\" to start datum, but got \"%s\"; length = %zu",
620 elog(
ERROR,
"byval datum but length = %zu", length);
629 else if (length <= 0)
633 s = (
char *)
palloc(length);
634 for (
Size i = 0;
i < length;
i++)
644 elog(
ERROR,
"expected \"]\" to end datum, but got \"%s\"; length = %zu",
658#define READ_SCALAR_ARRAY(fnname, datatype, convfunc) \
663 READ_TEMP_LOCALS(); \
664 token = pg_strtok(&length); \
666 elog(ERROR, "incomplete scalar array"); \
669 if (length != 1 || token[0] != '(') \
670 elog(ERROR, "unrecognized token: \"%.*s\"", length, token); \
671 vals = (datatype *) palloc(numCols * sizeof(datatype)); \
672 for (int i = 0; i < numCols; i++) \
674 token = pg_strtok(&length); \
675 if (token == NULL || token[0] == ')') \
676 elog(ERROR, "incomplete scalar array"); \
677 vals[i] = convfunc(token); \
679 token = pg_strtok(&length); \
680 if (token == NULL || length != 1 || token[0] != ')') \
681 elog(ERROR, "incomplete scalar array"); \
Bitmapset * bms_add_member(Bitmapset *a, int x)
const ExtensibleNodeMethods * GetExtensibleNodeMethods(const char *extnodename, bool missing_ok)
char * pstrdup(const char *in)
int * readIntCols(int numCols)
static Node * newNode(size_t size, NodeTag tag)
Oid * readOidCols(int numCols)
int16 * readAttrNumberCols(int numCols)
bool * readBoolCols(int numCols)
static Datum PointerGetDatum(const void *X)
char * debackslash(const char *token, int length)
void * nodeRead(const char *token, int tok_len)
const char * pg_strtok(int *length)
#define READ_INT_FIELD(fldname)
#define READ_UINT_FIELD(fldname)
#define READ_NODE_FIELD(fldname)
static ExtensibleNode * _readExtensibleNode(void)
#define READ_CHAR_FIELD(fldname)
static char * nullable_string(const char *token, int length)
#define READ_SCALAR_ARRAY(fnname, datatype, convfunc)
Node * parseNodeString(void)
#define READ_OID_FIELD(fldname)
#define READ_LOCATION_FIELD(fldname)
static Bitmapset * _readBitmapset(void)
static A_Const * _readA_Const(void)
static Const * _readConst(void)
#define READ_STRING_FIELD(fldname)
#define READ_FLOAT_FIELD(fldname)
Datum readDatum(bool typbyval)
#define READ_BOOL_FIELD(fldname)
static BoolExpr * _readBoolExpr(void)
#define READ_ENUM_FIELD(fldname, enumtype)
#define READ_TEMP_LOCALS()
static A_Expr * _readA_Expr(void)
Bitmapset * readBitmapset(void)
#define READ_LOCALS(nodeTypeName)
static RangeTblEntry * _readRangeTblEntry(void)
static const struct fns functions
void check_stack_depth(void)
void(* nodeRead)(struct ExtensibleNode *node)