52 #define READ_LOCALS_NO_FIELDS(nodeTypeName) \
53 nodeTypeName *local_node = makeNode(nodeTypeName)
56 #define READ_TEMP_LOCALS() \
61 #define READ_LOCALS(nodeTypeName) \
62 READ_LOCALS_NO_FIELDS(nodeTypeName); \
66 #define READ_INT_FIELD(fldname) \
67 token = pg_strtok(&length); \
68 token = pg_strtok(&length); \
69 local_node->fldname = atoi(token)
72 #define READ_UINT_FIELD(fldname) \
73 token = pg_strtok(&length); \
74 token = pg_strtok(&length); \
75 local_node->fldname = atoui(token)
78 #define READ_UINT64_FIELD(fldname) \
79 token = pg_strtok(&length); \
80 token = pg_strtok(&length); \
81 local_node->fldname = strtou64(token, NULL, 10)
84 #define READ_LONG_FIELD(fldname) \
85 token = pg_strtok(&length); \
86 token = pg_strtok(&length); \
87 local_node->fldname = atol(token)
90 #define READ_OID_FIELD(fldname) \
91 token = pg_strtok(&length); \
92 token = pg_strtok(&length); \
93 local_node->fldname = atooid(token)
96 #define READ_CHAR_FIELD(fldname) \
97 token = pg_strtok(&length); \
98 token = pg_strtok(&length); \
100 local_node->fldname = (length == 0) ? '\0' : (token[0] == '\\' ? token[1] : token[0])
103 #define READ_ENUM_FIELD(fldname, enumtype) \
104 token = pg_strtok(&length); \
105 token = pg_strtok(&length); \
106 local_node->fldname = (enumtype) atoi(token)
109 #define READ_FLOAT_FIELD(fldname) \
110 token = pg_strtok(&length); \
111 token = pg_strtok(&length); \
112 local_node->fldname = atof(token)
115 #define READ_BOOL_FIELD(fldname) \
116 token = pg_strtok(&length); \
117 token = pg_strtok(&length); \
118 local_node->fldname = strtobool(token)
121 #define READ_STRING_FIELD(fldname) \
122 token = pg_strtok(&length); \
123 token = pg_strtok(&length); \
124 local_node->fldname = nullable_string(token, length)
127 #ifdef WRITE_READ_PARSE_PLAN_TREES
128 #define READ_LOCATION_FIELD(fldname) \
129 token = pg_strtok(&length); \
130 token = pg_strtok(&length); \
131 local_node->fldname = restore_location_fields ? atoi(token) : -1
133 #define READ_LOCATION_FIELD(fldname) \
134 token = pg_strtok(&length); \
135 token = pg_strtok(&length); \
137 local_node->fldname = -1
141 #define READ_NODE_FIELD(fldname) \
142 token = pg_strtok(&length); \
144 local_node->fldname = nodeRead(NULL, 0)
147 #define READ_BITMAPSET_FIELD(fldname) \
148 token = pg_strtok(&length); \
150 local_node->fldname = _readBitmapset()
153 #define READ_ATTRNUMBER_ARRAY(fldname, len) \
154 token = pg_strtok(&length); \
155 local_node->fldname = readAttrNumberCols(len)
158 #define READ_OID_ARRAY(fldname, len) \
159 token = pg_strtok(&length); \
160 local_node->fldname = readOidCols(len)
163 #define READ_INT_ARRAY(fldname, len) \
164 token = pg_strtok(&length); \
165 local_node->fldname = readIntCols(len)
168 #define READ_BOOL_ARRAY(fldname, len) \
169 token = pg_strtok(&length); \
170 local_node->fldname = readBoolCols(len)
173 #define READ_DONE() \
183 #define atoui(x) ((unsigned int) strtoul((x), NULL, 10))
185 #define strtobool(x) ((*(x) == 't') ? true : false)
187 #define nullable_string(token,length) \
188 ((length) == 0 ? NULL : debackslash(token, length))
203 elog(
ERROR,
"incomplete Bitmapset structure");
204 if (length != 1 || token[0] !=
'(')
205 elog(
ERROR,
"unrecognized token: \"%.*s\"", length, token);
209 elog(
ERROR,
"incomplete Bitmapset structure");
210 if (length != 1 || token[0] !=
'b')
211 elog(
ERROR,
"unrecognized token: \"%.*s\"", length, token);
220 elog(
ERROR,
"unterminated Bitmapset structure");
221 if (length == 1 && token[0] ==
')')
223 val = (int) strtol(token, &endptr, 10);
224 if (endptr != token + length)
225 elog(
ERROR,
"unrecognized integer: \"%.*s\"", length, token);
251 local_node->queryId = UINT64CONST(0);
555 local_node->catalogname = NULL;
650 if (local_node->constisnull)
653 local_node->constvalue =
readDatum(local_node->constbyval);
895 if (strncmp(token,
"and", 3) == 0)
897 else if (strncmp(token,
"or", 2) == 0)
899 else if (strncmp(token,
"not", 3) == 0)
902 elog(
ERROR,
"unrecognized boolop \"%.*s\"", length, token);
1666 switch (local_node->rtekind)
1693 if (local_node->tablefunc)
1728 elog(
ERROR,
"unrecognized RTE kind: %d",
1729 (
int) local_node->rtekind);
2344 local_node->methods = methods;
2884 const char *extnodename;
2893 elog(
ERROR,
"extnodename has to be supplied");
2961 #define MATCH(tokname, namelen) \
2962 (length == namelen && memcmp(token, tokname, namelen) == 0)
2964 if (
MATCH(
"QUERY", 5))
2966 else if (
MATCH(
"WITHCHECKOPTION", 15))
2968 else if (
MATCH(
"SORTGROUPCLAUSE", 15))
2970 else if (
MATCH(
"GROUPINGSET", 11))
2972 else if (
MATCH(
"WINDOWCLAUSE", 12))
2974 else if (
MATCH(
"ROWMARKCLAUSE", 13))
2976 else if (
MATCH(
"CTESEARCHCLAUSE", 15))
2978 else if (
MATCH(
"CTECYCLECLAUSE", 14))
2980 else if (
MATCH(
"COMMONTABLEEXPR", 15))
2982 else if (
MATCH(
"MERGEWHENCLAUSE", 15))
2984 else if (
MATCH(
"MERGEACTION", 11))
2986 else if (
MATCH(
"SETOPERATIONSTMT", 16))
2988 else if (
MATCH(
"ALIAS", 5))
2990 else if (
MATCH(
"RANGEVAR", 8))
2992 else if (
MATCH(
"INTOCLAUSE", 10))
2994 else if (
MATCH(
"TABLEFUNC", 9))
2996 else if (
MATCH(
"VAR", 3))
2998 else if (
MATCH(
"CONST", 5))
3000 else if (
MATCH(
"PARAM", 5))
3002 else if (
MATCH(
"AGGREF", 6))
3004 else if (
MATCH(
"GROUPINGFUNC", 12))
3006 else if (
MATCH(
"WINDOWFUNC", 10))
3008 else if (
MATCH(
"SUBSCRIPTINGREF", 15))
3010 else if (
MATCH(
"FUNCEXPR", 8))
3012 else if (
MATCH(
"NAMEDARGEXPR", 12))
3014 else if (
MATCH(
"OPEXPR", 6))
3016 else if (
MATCH(
"DISTINCTEXPR", 12))
3018 else if (
MATCH(
"NULLIFEXPR", 10))
3020 else if (
MATCH(
"SCALARARRAYOPEXPR", 17))
3022 else if (
MATCH(
"BOOLEXPR", 8))
3024 else if (
MATCH(
"SUBLINK", 7))
3026 else if (
MATCH(
"FIELDSELECT", 11))
3028 else if (
MATCH(
"FIELDSTORE", 10))
3030 else if (
MATCH(
"RELABELTYPE", 11))
3032 else if (
MATCH(
"COERCEVIAIO", 11))
3034 else if (
MATCH(
"ARRAYCOERCEEXPR", 15))
3036 else if (
MATCH(
"CONVERTROWTYPEEXPR", 18))
3038 else if (
MATCH(
"COLLATEEXPR", 11))
3040 else if (
MATCH(
"CASEEXPR", 8))
3042 else if (
MATCH(
"CASEWHEN", 8))
3044 else if (
MATCH(
"CASETESTEXPR", 12))
3046 else if (
MATCH(
"ARRAYEXPR", 9))
3048 else if (
MATCH(
"ROWEXPR", 7))
3050 else if (
MATCH(
"ROWCOMPAREEXPR", 14))
3052 else if (
MATCH(
"COALESCEEXPR", 12))
3054 else if (
MATCH(
"MINMAXEXPR", 10))
3056 else if (
MATCH(
"SQLVALUEFUNCTION", 16))
3058 else if (
MATCH(
"XMLEXPR", 7))
3060 else if (
MATCH(
"NULLTEST", 8))
3062 else if (
MATCH(
"BOOLEANTEST", 11))
3064 else if (
MATCH(
"COERCETODOMAIN", 14))
3066 else if (
MATCH(
"COERCETODOMAINVALUE", 19))
3068 else if (
MATCH(
"SETTODEFAULT", 12))
3070 else if (
MATCH(
"CURRENTOFEXPR", 13))
3072 else if (
MATCH(
"NEXTVALUEEXPR", 13))
3074 else if (
MATCH(
"INFERENCEELEM", 13))
3076 else if (
MATCH(
"TARGETENTRY", 11))
3078 else if (
MATCH(
"RANGETBLREF", 11))
3080 else if (
MATCH(
"JOINEXPR", 8))
3082 else if (
MATCH(
"FROMEXPR", 8))
3084 else if (
MATCH(
"ONCONFLICTEXPR", 14))
3086 else if (
MATCH(
"APPENDRELINFO", 13))
3088 else if (
MATCH(
"RANGETBLENTRY", 13))
3090 else if (
MATCH(
"RANGETBLFUNCTION", 16))
3092 else if (
MATCH(
"TABLESAMPLECLAUSE", 17))
3094 else if (
MATCH(
"NOTIFYSTMT", 10))
3096 else if (
MATCH(
"DEFELEM", 7))
3098 else if (
MATCH(
"DECLARECURSORSTMT", 17))
3100 else if (
MATCH(
"PLANNEDSTMT", 11))
3102 else if (
MATCH(
"PLAN", 4))
3104 else if (
MATCH(
"RESULT", 6))
3106 else if (
MATCH(
"PROJECTSET", 10))
3108 else if (
MATCH(
"MODIFYTABLE", 11))
3110 else if (
MATCH(
"APPEND", 6))
3112 else if (
MATCH(
"MERGEAPPEND", 11))
3114 else if (
MATCH(
"RECURSIVEUNION", 14))
3116 else if (
MATCH(
"BITMAPAND", 9))
3118 else if (
MATCH(
"BITMAPOR", 8))
3120 else if (
MATCH(
"SCAN", 4))
3122 else if (
MATCH(
"SEQSCAN", 7))
3124 else if (
MATCH(
"SAMPLESCAN", 10))
3126 else if (
MATCH(
"INDEXSCAN", 9))
3128 else if (
MATCH(
"INDEXONLYSCAN", 13))
3130 else if (
MATCH(
"BITMAPINDEXSCAN", 15))
3132 else if (
MATCH(
"BITMAPHEAPSCAN", 14))
3134 else if (
MATCH(
"TIDSCAN", 7))
3136 else if (
MATCH(
"TIDRANGESCAN", 12))
3138 else if (
MATCH(
"SUBQUERYSCAN", 12))
3140 else if (
MATCH(
"FUNCTIONSCAN", 12))
3142 else if (
MATCH(
"VALUESSCAN", 10))
3144 else if (
MATCH(
"TABLEFUNCSCAN", 13))
3146 else if (
MATCH(
"CTESCAN", 7))
3148 else if (
MATCH(
"NAMEDTUPLESTORESCAN", 19))
3150 else if (
MATCH(
"WORKTABLESCAN", 13))
3152 else if (
MATCH(
"FOREIGNSCAN", 11))
3154 else if (
MATCH(
"CUSTOMSCAN", 10))
3156 else if (
MATCH(
"JOIN", 4))
3158 else if (
MATCH(
"NESTLOOP", 8))
3160 else if (
MATCH(
"MERGEJOIN", 9))
3162 else if (
MATCH(
"HASHJOIN", 8))
3164 else if (
MATCH(
"MATERIAL", 8))
3166 else if (
MATCH(
"MEMOIZE", 7))
3168 else if (
MATCH(
"SORT", 4))
3170 else if (
MATCH(
"INCREMENTALSORT", 15))
3172 else if (
MATCH(
"GROUP", 5))
3174 else if (
MATCH(
"AGG", 3))
3176 else if (
MATCH(
"WINDOWAGG", 9))
3178 else if (
MATCH(
"UNIQUE", 6))
3180 else if (
MATCH(
"GATHER", 6))
3182 else if (
MATCH(
"GATHERMERGE", 11))
3184 else if (
MATCH(
"HASH", 4))
3186 else if (
MATCH(
"SETOP", 5))
3188 else if (
MATCH(
"LOCKROWS", 8))
3190 else if (
MATCH(
"LIMIT", 5))
3192 else if (
MATCH(
"NESTLOOPPARAM", 13))
3194 else if (
MATCH(
"PLANROWMARK", 11))
3196 else if (
MATCH(
"PARTITIONPRUNEINFO", 18))
3198 else if (
MATCH(
"PARTITIONEDRELPRUNEINFO", 23))
3200 else if (
MATCH(
"PARTITIONPRUNESTEPOP", 20))
3202 else if (
MATCH(
"PARTITIONPRUNESTEPCOMBINE", 25))
3204 else if (
MATCH(
"PLANINVALITEM", 13))
3206 else if (
MATCH(
"SUBPLAN", 7))
3208 else if (
MATCH(
"ALTERNATIVESUBPLAN", 18))
3210 else if (
MATCH(
"EXTENSIBLENODE", 14))
3212 else if (
MATCH(
"PARTITIONBOUNDSPEC", 18))
3214 else if (
MATCH(
"PARTITIONRANGEDATUM", 19))
3216 else if (
MATCH(
"JSONFORMAT", 10))
3218 else if (
MATCH(
"JSONRETURNING", 13))
3220 else if (
MATCH(
"JSONVALUEEXPR", 13))
3222 else if (
MATCH(
"JSONCONSTRUCTOREXPR", 19))
3224 else if (
MATCH(
"JSONISPREDICATE", 15))
3226 else if (
MATCH(
"JSONBEHAVIOR", 12))
3228 else if (
MATCH(
"JSONEXPR", 8))
3230 else if (
MATCH(
"JSONCOERCION", 12))
3232 else if (
MATCH(
"JSONITEMCOERCIONS", 17))
3234 else if (
MATCH(
"JSONTABLEPARENT", 15))
3236 else if (
MATCH(
"JSONTABLESIBLING", 16))
3240 elog(
ERROR,
"badly formatted node string \"%.32s\"...", token);
3241 return_value = NULL;
3244 return (
Node *) return_value;
3269 length =
atoui(token);
3272 if (token == NULL || token[0] !=
'[')
3273 elog(
ERROR,
"expected \"[\" to start datum, but got \"%s\"; length = %zu",
3274 token ? token :
"[NULL]", length);
3279 elog(
ERROR,
"byval datum but length = %zu", length);
3281 s = (
char *) (&
res);
3285 s[
i] = (char) atoi(token);
3288 else if (length <= 0)
3292 s = (
char *)
palloc(length);
3293 for (
i = 0;
i < length;
i++)
3296 s[
i] = (char) atoi(token);
3302 if (token == NULL || token[0] !=
']')
3303 elog(
ERROR,
"expected \"]\" to end datum, but got \"%s\"; length = %zu",
3304 token ? token :
"[NULL]", length);
3324 for (
i = 0;
i < numCols;
i++)
3327 attr_vals[
i] = atoi(token);
3348 for (
i = 0;
i < numCols;
i++)
3371 int_vals = (
int *)
palloc(numCols *
sizeof(
int));
3372 for (
i = 0;
i < numCols;
i++)
3375 int_vals[
i] = atoi(token);
3395 bool_vals = (
bool *)
palloc(numCols *
sizeof(
bool));
3396 for (
i = 0;
i < numCols;
i++)
Bitmapset * bms_add_member(Bitmapset *a, int x)
static Datum values[MAXATTR]
static void PGresult * res
const CustomScanMethods * GetCustomScanMethods(const char *CustomName, bool missing_ok)
const ExtensibleNodeMethods * GetExtensibleNodeMethods(const char *extnodename, bool missing_ok)
#define newNode(size, tag)
static int list_length(const List *l)
void check_stack_depth(void)
#define PointerGetDatum(X)
const char * pg_strtok(int *length)
static MergeAction * _readMergeAction(void)
static PlannedStmt * _readPlannedStmt(void)
static JsonCoercion * _readJsonCoercion(void)
static PartitionedRelPruneInfo * _readPartitionedRelPruneInfo(void)
static CollateExpr * _readCollateExpr(void)
static CoerceViaIO * _readCoerceViaIO(void)
static PlanInvalItem * _readPlanInvalItem(void)
static WithCheckOption * _readWithCheckOption(void)
static Alias * _readAlias(void)
static NestLoopParam * _readNestLoopParam(void)
static PartitionPruneStepOp * _readPartitionPruneStepOp(void)
static RangeTblFunction * _readRangeTblFunction(void)
static JsonValueExpr * _readJsonValueExpr(void)
static void ReadCommonPlan(Plan *local_node)
static PartitionPruneInfo * _readPartitionPruneInfo(void)
static Result * _readResult(void)
#define READ_INT_FIELD(fldname)
static AlternativeSubPlan * _readAlternativeSubPlan(void)
static JsonConstructorExpr * _readJsonConstructorExpr(void)
static PartitionRangeDatum * _readPartitionRangeDatum(void)
static WorkTableScan * _readWorkTableScan(void)
static CoerceToDomain * _readCoerceToDomain(void)
static IndexScan * _readIndexScan(void)
static ArrayCoerceExpr * _readArrayCoerceExpr(void)
static Group * _readGroup(void)
static WindowAgg * _readWindowAgg(void)
static NamedArgExpr * _readNamedArgExpr(void)
static RowExpr * _readRowExpr(void)
static CoerceToDomainValue * _readCoerceToDomainValue(void)
#define READ_UINT_FIELD(fldname)
#define READ_NODE_FIELD(fldname)
static RangeTblEntry * _readRangeTblEntry(void)
static JsonTableParent * _readJsonTableParent(void)
static FieldStore * _readFieldStore(void)
#define READ_CHAR_FIELD(fldname)
static ScalarArrayOpExpr * _readScalarArrayOpExpr(void)
static TableFunc * _readTableFunc(void)
static SetOp * _readSetOp(void)
static TableFuncScan * _readTableFuncScan(void)
static CoalesceExpr * _readCoalesceExpr(void)
static TableSampleClause * _readTableSampleClause(void)
static DefElem * _readDefElem(void)
static RangeTblRef * _readRangeTblRef(void)
static BooleanTest * _readBooleanTest(void)
static FuncExpr * _readFuncExpr(void)
static JsonFormat * _readJsonFormat(void)
static BitmapOr * _readBitmapOr(void)
Node * parseNodeString(void)
static Const * _readConst(void)
static JoinExpr * _readJoinExpr(void)
static Sort * _readSort(void)
static Aggref * _readAggref(void)
static SQLValueFunction * _readSQLValueFunction(void)
int * readIntCols(int numCols)
static RowMarkClause * _readRowMarkClause(void)
static IncrementalSort * _readIncrementalSort(void)
#define READ_LOCALS_NO_FIELDS(nodeTypeName)
static AppendRelInfo * _readAppendRelInfo(void)
static Plan * _readPlan(void)
static RangeVar * _readRangeVar(void)
static CaseWhen * _readCaseWhen(void)
#define READ_BOOL_ARRAY(fldname, len)
#define READ_BITMAPSET_FIELD(fldname)
static Scan * _readScan(void)
#define READ_OID_FIELD(fldname)
static Memoize * _readMemoize(void)
#define READ_LOCATION_FIELD(fldname)
static ConvertRowtypeExpr * _readConvertRowtypeExpr(void)
static Gather * _readGather(void)
static IntoClause * _readIntoClause(void)
static TidScan * _readTidScan(void)
static CTESearchClause * _readCTESearchClause(void)
static InferenceElem * _readInferenceElem(void)
static NextValueExpr * _readNextValueExpr(void)
static NamedTuplestoreScan * _readNamedTuplestoreScan(void)
static WindowFunc * _readWindowFunc(void)
static NestLoop * _readNestLoop(void)
static JsonItemCoercions * _readJsonItemCoercions(void)
static Agg * _readAgg(void)
static CustomScan * _readCustomScan(void)
static MergeAppend * _readMergeAppend(void)
static Var * _readVar(void)
static CommonTableExpr * _readCommonTableExpr(void)
static SampleScan * _readSampleScan(void)
static void ReadCommonScan(Scan *local_node)
static TargetEntry * _readTargetEntry(void)
#define READ_STRING_FIELD(fldname)
static OnConflictExpr * _readOnConflictExpr(void)
static BoolExpr * _readBoolExpr(void)
static ModifyTable * _readModifyTable(void)
static CTECycleClause * _readCTECycleClause(void)
static WindowClause * _readWindowClause(void)
AttrNumber * readAttrNumberCols(int numCols)
static void ReadCommonSort(Sort *local_node)
#define READ_FLOAT_FIELD(fldname)
static JsonReturning * _readJsonReturning(void)
static BitmapIndexScan * _readBitmapIndexScan(void)
static Query * _readQuery(void)
#define nullable_string(token, length)
static CurrentOfExpr * _readCurrentOfExpr(void)
static MergeWhenClause * _readMergeWhenClause(void)
static SeqScan * _readSeqScan(void)
static LockRows * _readLockRows(void)
static DistinctExpr * _readDistinctExpr(void)
Datum readDatum(bool typbyval)
static GroupingFunc * _readGroupingFunc(void)
static JsonIsPredicate * _readJsonIsPredicate()
static DeclareCursorStmt * _readDeclareCursorStmt(void)
static FromExpr * _readFromExpr(void)
static NotifyStmt * _readNotifyStmt(void)
static Hash * _readHash(void)
static JsonExpr * _readJsonExpr(void)
#define READ_LONG_FIELD(fldname)
static PlanRowMark * _readPlanRowMark(void)
static IndexOnlyScan * _readIndexOnlyScan(void)
static JsonBehavior * _readJsonBehavior(void)
static JsonTableSibling * _readJsonTableSibling(void)
static PartitionPruneStepCombine * _readPartitionPruneStepCombine(void)
static ExtensibleNode * _readExtensibleNode(void)
#define READ_BOOL_FIELD(fldname)
static RecursiveUnion * _readRecursiveUnion(void)
static ArrayExpr * _readArrayExpr(void)
static Append * _readAppend(void)
static ValuesScan * _readValuesScan(void)
static XmlExpr * _readXmlExpr(void)
#define READ_ATTRNUMBER_ARRAY(fldname, len)
#define MATCH(tokname, namelen)
Bitmapset * readBitmapset(void)
bool * readBoolCols(int numCols)
static FunctionScan * _readFunctionScan(void)
static SetToDefault * _readSetToDefault(void)
static MergeJoin * _readMergeJoin(void)
static BitmapHeapScan * _readBitmapHeapScan(void)
static FieldSelect * _readFieldSelect(void)
static Join * _readJoin(void)
Oid * readOidCols(int numCols)
static SubscriptingRef * _readSubscriptingRef(void)
static void ReadCommonJoin(Join *local_node)
static Bitmapset * _readBitmapset(void)
static NullIfExpr * _readNullIfExpr(void)
#define READ_UINT64_FIELD(fldname)
static ProjectSet * _readProjectSet(void)
static GatherMerge * _readGatherMerge(void)
static CteScan * _readCteScan(void)
static SetOperationStmt * _readSetOperationStmt(void)
static CaseTestExpr * _readCaseTestExpr(void)
static RelabelType * _readRelabelType(void)
static RowCompareExpr * _readRowCompareExpr(void)
static SubPlan * _readSubPlan(void)
static PartitionBoundSpec * _readPartitionBoundSpec(void)
static NullTest * _readNullTest(void)
static Material * _readMaterial(void)
static CaseExpr * _readCaseExpr(void)
static Param * _readParam(void)
static GroupingSet * _readGroupingSet(void)
#define READ_ENUM_FIELD(fldname, enumtype)
static HashJoin * _readHashJoin(void)
static SubLink * _readSubLink(void)
#define READ_TEMP_LOCALS()
static SubqueryScan * _readSubqueryScan(void)
#define READ_LOCALS(nodeTypeName)
static BitmapAnd * _readBitmapAnd(void)
static TidRangeScan * _readTidRangeScan(void)
#define READ_INT_ARRAY(fldname, len)
static OpExpr * _readOpExpr(void)
static SortGroupClause * _readSortGroupClause(void)
#define READ_OID_ARRAY(fldname, len)
static Unique * _readUnique(void)
static MinMaxExpr * _readMinMaxExpr(void)
static ForeignScan * _readForeignScan(void)
static Limit * _readLimit(void)
static const struct fns functions
void(* nodeRead)(struct ExtensibleNode *node)