1 /*-------------------------------------------------------------------------
4 * Reader functions for Postgres tree nodes.
6 * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * src/backend/nodes/readfuncs.c
14 * Path nodes do not have any readfuncs support, because we never
15 * have occasion to read them in. (There was once code here that
16 * claimed to read them, but it was broken as well as unused.) We
17 * never read executor state trees, either.
19 * Parse location fields are written out by outfuncs.c, but only for
20 * possible debugging use. When reading a location field, we discard
21 * the stored value and set the location field to -1 (ie, "unknown").
22 * This is because nodes coming from a stored rule should not be thought
23 * to have a known location in the current query's text.
25 *-------------------------------------------------------------------------
32 #include "nodes/extensible.h"
33 #include "nodes/parsenodes.h"
34 #include "nodes/plannodes.h"
35 #include "nodes/readfuncs.h"
39 * Macros to simplify reading of different kinds of fields. Use these
40 * wherever possible to reduce the chance for silly typos. Note that these
41 * hard-wire conventions about the names of the local variables in a Read
45 /* Macros for declaring appropriate local variables */
47 /* A few guys need only local_node */
48 #define READ_LOCALS_NO_FIELDS(nodeTypeName) \
49 nodeTypeName *local_node = makeNode(nodeTypeName)
51 /* And a few guys need only the pg_strtok support fields */
52 #define READ_TEMP_LOCALS() \
56 /* ... but most need both */
57 #define READ_LOCALS(nodeTypeName) \
58 READ_LOCALS_NO_FIELDS(nodeTypeName); \
61 /* Read an integer field (anything written as ":fldname %d") */
62 #define READ_INT_FIELD(fldname) \
63 token = pg_strtok(&length); /* skip :fldname */ \
64 token = pg_strtok(&length); /* get field value */ \
65 local_node->fldname = atoi(token)
67 /* Read an unsigned integer field (anything written as ":fldname %u") */
68 #define READ_UINT_FIELD(fldname) \
69 token = pg_strtok(&length); /* skip :fldname */ \
70 token = pg_strtok(&length); /* get field value */ \
71 local_node->fldname = atoui(token)
73 /* Read an long integer field (anything written as ":fldname %ld") */
74 #define READ_LONG_FIELD(fldname) \
75 token = pg_strtok(&length); /* skip :fldname */ \
76 token = pg_strtok(&length); /* get field value */ \
77 local_node->fldname = atol(token)
79 /* Read an OID field (don't hard-wire assumption that OID is same as uint) */
80 #define READ_OID_FIELD(fldname) \
81 token = pg_strtok(&length); /* skip :fldname */ \
82 token = pg_strtok(&length); /* get field value */ \
83 local_node->fldname = atooid(token)
85 /* Read a char field (ie, one ascii character) */
86 #define READ_CHAR_FIELD(fldname) \
87 token = pg_strtok(&length); /* skip :fldname */ \
88 token = pg_strtok(&length); /* get field value */ \
89 local_node->fldname = token[0]
91 /* Read an enumerated-type field that was written as an integer code */
92 #define READ_ENUM_FIELD(fldname, enumtype) \
93 token = pg_strtok(&length); /* skip :fldname */ \
94 token = pg_strtok(&length); /* get field value */ \
95 local_node->fldname = (enumtype) atoi(token)
97 /* Read a float field */
98 #define READ_FLOAT_FIELD(fldname) \
99 token = pg_strtok(&length); /* skip :fldname */ \
100 token = pg_strtok(&length); /* get field value */ \
101 local_node->fldname = atof(token)
103 /* Read a boolean field */
104 #define READ_BOOL_FIELD(fldname) \
105 token = pg_strtok(&length); /* skip :fldname */ \
106 token = pg_strtok(&length); /* get field value */ \
107 local_node->fldname = strtobool(token)
109 /* Read a character-string field */
110 #define READ_STRING_FIELD(fldname) \
111 token = pg_strtok(&length); /* skip :fldname */ \
112 token = pg_strtok(&length); /* get field value */ \
113 local_node->fldname = nullable_string(token, length)
115 /* Read a parse location field (and throw away the value, per notes above) */
116 #define READ_LOCATION_FIELD(fldname) \
117 token = pg_strtok(&length); /* skip :fldname */ \
118 token = pg_strtok(&length); /* get field value */ \
119 (void) token; /* in case not used elsewhere */ \
120 local_node->fldname = -1 /* set field to "unknown" */
122 /* Read a Node field */
123 #define READ_NODE_FIELD(fldname) \
124 token = pg_strtok(&length); /* skip :fldname */ \
125 (void) token; /* in case not used elsewhere */ \
126 local_node->fldname = nodeRead(NULL, 0)
128 /* Read a bitmapset field */
129 #define READ_BITMAPSET_FIELD(fldname) \
130 token = pg_strtok(&length); /* skip :fldname */ \
131 (void) token; /* in case not used elsewhere */ \
132 local_node->fldname = _readBitmapset()
134 /* Read an attribute number array */
135 #define READ_ATTRNUMBER_ARRAY(fldname, len) \
136 token = pg_strtok(&length); /* skip :fldname */ \
137 local_node->fldname = readAttrNumberCols(len);
139 /* Read an oid array */
140 #define READ_OID_ARRAY(fldname, len) \
141 token = pg_strtok(&length); /* skip :fldname */ \
142 local_node->fldname = readOidCols(len);
144 /* Read an int array */
145 #define READ_INT_ARRAY(fldname, len) \
146 token = pg_strtok(&length); /* skip :fldname */ \
147 local_node->fldname = readIntCols(len);
149 /* Read a bool array */
150 #define READ_BOOL_ARRAY(fldname, len) \
151 token = pg_strtok(&length); /* skip :fldname */ \
152 local_node->fldname = readBoolCols(len);
155 #define READ_DONE() \
160 * NOTE: use atoi() to read values written with %d, or atoui() to read
161 * values written with %u in outfuncs.c. An exception is OID values,
162 * for which use atooid(). (As of 7.1, outfuncs.c writes OIDs as %u,
163 * but this will probably change in the future.)
165 #define atoui(x) ((unsigned int) strtoul((x), NULL, 10))
167 #define atooid(x) ((Oid) strtoul((x), NULL, 10))
169 #define strtobool(x) ((*(x) == 't') ? true : false)
171 #define nullable_string(token,length) \
172 ((length) == 0 ? NULL : debackslash(token, length))
175 static Datum readDatum(bool typbyval);
176 static bool *readBoolCols(int numCols);
177 static int *readIntCols(int numCols);
178 static Oid *readOidCols(int numCols);
179 static AttrNumber *readAttrNumberCols(int numCols);
187 Bitmapset *result = NULL;
191 token = pg_strtok(&length);
193 elog(ERROR, "incomplete Bitmapset structure");
194 if (length != 1 || token[0] != '(')
195 elog(ERROR, "unrecognized token: \"%.*s\"", length, token);
197 token = pg_strtok(&length);
199 elog(ERROR, "incomplete Bitmapset structure");
200 if (length != 1 || token[0] != 'b')
201 elog(ERROR, "unrecognized token: \"%.*s\"", length, token);
208 token = pg_strtok(&length);
210 elog(ERROR, "unterminated Bitmapset structure");
211 if (length == 1 && token[0] == ')')
213 val = (int) strtol(token, &endptr, 10);
214 if (endptr != token + length)
215 elog(ERROR, "unrecognized integer: \"%.*s\"", length, token);
216 result = bms_add_member(result, val);
223 * for use by extensions which define extensible nodes
228 return _readBitmapset();
239 READ_ENUM_FIELD(commandType, CmdType);
240 READ_ENUM_FIELD(querySource, QuerySource);
241 local_node->queryId = 0; /* not saved in output format */
242 READ_BOOL_FIELD(canSetTag);
243 READ_NODE_FIELD(utilityStmt);
244 READ_INT_FIELD(resultRelation);
245 READ_BOOL_FIELD(hasAggs);
246 READ_BOOL_FIELD(hasWindowFuncs);
247 READ_BOOL_FIELD(hasSubLinks);
248 READ_BOOL_FIELD(hasDistinctOn);
249 READ_BOOL_FIELD(hasRecursive);
250 READ_BOOL_FIELD(hasModifyingCTE);
251 READ_BOOL_FIELD(hasForUpdate);
252 READ_BOOL_FIELD(hasRowSecurity);
253 READ_NODE_FIELD(cteList);
254 READ_NODE_FIELD(rtable);
255 READ_NODE_FIELD(jointree);
256 READ_NODE_FIELD(targetList);
257 READ_NODE_FIELD(onConflict);
258 READ_NODE_FIELD(returningList);
259 READ_NODE_FIELD(groupClause);
260 READ_NODE_FIELD(groupingSets);
261 READ_NODE_FIELD(havingQual);
262 READ_NODE_FIELD(windowClause);
263 READ_NODE_FIELD(distinctClause);
264 READ_NODE_FIELD(sortClause);
265 READ_NODE_FIELD(limitOffset);
266 READ_NODE_FIELD(limitCount);
267 READ_NODE_FIELD(rowMarks);
268 READ_NODE_FIELD(setOperations);
269 READ_NODE_FIELD(constraintDeps);
278 _readNotifyStmt(void)
280 READ_LOCALS(NotifyStmt);
282 READ_STRING_FIELD(conditionname);
283 READ_STRING_FIELD(payload);
289 * _readDeclareCursorStmt
291 static DeclareCursorStmt *
292 _readDeclareCursorStmt(void)
294 READ_LOCALS(DeclareCursorStmt);
296 READ_STRING_FIELD(portalname);
297 READ_INT_FIELD(options);
298 READ_NODE_FIELD(query);
304 * _readWithCheckOption
306 static WithCheckOption *
307 _readWithCheckOption(void)
309 READ_LOCALS(WithCheckOption);
311 READ_ENUM_FIELD(kind, WCOKind);
312 READ_STRING_FIELD(relname);
313 READ_STRING_FIELD(polname);
314 READ_NODE_FIELD(qual);
315 READ_BOOL_FIELD(cascaded);
321 * _readSortGroupClause
323 static SortGroupClause *
324 _readSortGroupClause(void)
326 READ_LOCALS(SortGroupClause);
328 READ_UINT_FIELD(tleSortGroupRef);
329 READ_OID_FIELD(eqop);
330 READ_OID_FIELD(sortop);
331 READ_BOOL_FIELD(nulls_first);
332 READ_BOOL_FIELD(hashable);
341 _readGroupingSet(void)
343 READ_LOCALS(GroupingSet);
345 READ_ENUM_FIELD(kind, GroupingSetKind);
346 READ_NODE_FIELD(content);
347 READ_LOCATION_FIELD(location);
355 static WindowClause *
356 _readWindowClause(void)
358 READ_LOCALS(WindowClause);
360 READ_STRING_FIELD(name);
361 READ_STRING_FIELD(refname);
362 READ_NODE_FIELD(partitionClause);
363 READ_NODE_FIELD(orderClause);
364 READ_INT_FIELD(frameOptions);
365 READ_NODE_FIELD(startOffset);
366 READ_NODE_FIELD(endOffset);
367 READ_UINT_FIELD(winref);
368 READ_BOOL_FIELD(copiedOrder);
376 static RowMarkClause *
377 _readRowMarkClause(void)
379 READ_LOCALS(RowMarkClause);
381 READ_UINT_FIELD(rti);
382 READ_ENUM_FIELD(strength, LockClauseStrength);
383 READ_ENUM_FIELD(waitPolicy, LockWaitPolicy);
384 READ_BOOL_FIELD(pushedDown);
390 * _readCommonTableExpr
392 static CommonTableExpr *
393 _readCommonTableExpr(void)
395 READ_LOCALS(CommonTableExpr);
397 READ_STRING_FIELD(ctename);
398 READ_NODE_FIELD(aliascolnames);
399 READ_NODE_FIELD(ctequery);
400 READ_LOCATION_FIELD(location);
401 READ_BOOL_FIELD(cterecursive);
402 READ_INT_FIELD(cterefcount);
403 READ_NODE_FIELD(ctecolnames);
404 READ_NODE_FIELD(ctecoltypes);
405 READ_NODE_FIELD(ctecoltypmods);
406 READ_NODE_FIELD(ctecolcollations);
412 * _readSetOperationStmt
414 static SetOperationStmt *
415 _readSetOperationStmt(void)
417 READ_LOCALS(SetOperationStmt);
419 READ_ENUM_FIELD(op, SetOperation);
420 READ_BOOL_FIELD(all);
421 READ_NODE_FIELD(larg);
422 READ_NODE_FIELD(rarg);
423 READ_NODE_FIELD(colTypes);
424 READ_NODE_FIELD(colTypmods);
425 READ_NODE_FIELD(colCollations);
426 READ_NODE_FIELD(groupClauses);
433 * Stuff from primnodes.h.
441 READ_STRING_FIELD(aliasname);
442 READ_NODE_FIELD(colnames);
450 READ_LOCALS(RangeVar);
452 local_node->catalogname = NULL; /* not currently saved in output
455 READ_STRING_FIELD(schemaname);
456 READ_STRING_FIELD(relname);
457 READ_ENUM_FIELD(inhOpt, InhOption);
458 READ_CHAR_FIELD(relpersistence);
459 READ_NODE_FIELD(alias);
460 READ_LOCATION_FIELD(location);
466 _readIntoClause(void)
468 READ_LOCALS(IntoClause);
470 READ_NODE_FIELD(rel);
471 READ_NODE_FIELD(colNames);
472 READ_NODE_FIELD(options);
473 READ_ENUM_FIELD(onCommit, OnCommitAction);
474 READ_STRING_FIELD(tableSpaceName);
475 READ_NODE_FIELD(viewQuery);
476 READ_BOOL_FIELD(skipData);
489 READ_UINT_FIELD(varno);
490 READ_INT_FIELD(varattno);
491 READ_OID_FIELD(vartype);
492 READ_INT_FIELD(vartypmod);
493 READ_OID_FIELD(varcollid);
494 READ_UINT_FIELD(varlevelsup);
495 READ_UINT_FIELD(varnoold);
496 READ_INT_FIELD(varoattno);
497 READ_LOCATION_FIELD(location);
510 READ_OID_FIELD(consttype);
511 READ_INT_FIELD(consttypmod);
512 READ_OID_FIELD(constcollid);
513 READ_INT_FIELD(constlen);
514 READ_BOOL_FIELD(constbyval);
515 READ_BOOL_FIELD(constisnull);
516 READ_LOCATION_FIELD(location);
518 token = pg_strtok(&length); /* skip :constvalue */
519 if (local_node->constisnull)
520 token = pg_strtok(&length); /* skip "<>" */
522 local_node->constvalue = readDatum(local_node->constbyval);
535 READ_ENUM_FIELD(paramkind, ParamKind);
536 READ_INT_FIELD(paramid);
537 READ_OID_FIELD(paramtype);
538 READ_INT_FIELD(paramtypmod);
539 READ_OID_FIELD(paramcollid);
540 READ_LOCATION_FIELD(location);
553 READ_OID_FIELD(aggfnoid);
554 READ_OID_FIELD(aggtype);
555 READ_OID_FIELD(aggoutputtype);
556 READ_OID_FIELD(aggcollid);
557 READ_OID_FIELD(inputcollid);
558 READ_NODE_FIELD(aggdirectargs);
559 READ_NODE_FIELD(args);
560 READ_NODE_FIELD(aggorder);
561 READ_NODE_FIELD(aggdistinct);
562 READ_NODE_FIELD(aggfilter);
563 READ_BOOL_FIELD(aggstar);
564 READ_BOOL_FIELD(aggvariadic);
565 READ_CHAR_FIELD(aggkind);
566 READ_UINT_FIELD(agglevelsup);
567 READ_LOCATION_FIELD(location);
575 static GroupingFunc *
576 _readGroupingFunc(void)
578 READ_LOCALS(GroupingFunc);
580 READ_NODE_FIELD(args);
581 READ_NODE_FIELD(refs);
582 READ_NODE_FIELD(cols);
583 READ_UINT_FIELD(agglevelsup);
584 READ_LOCATION_FIELD(location);
593 _readWindowFunc(void)
595 READ_LOCALS(WindowFunc);
597 READ_OID_FIELD(winfnoid);
598 READ_OID_FIELD(wintype);
599 READ_OID_FIELD(wincollid);
600 READ_OID_FIELD(inputcollid);
601 READ_NODE_FIELD(args);
602 READ_NODE_FIELD(aggfilter);
603 READ_UINT_FIELD(winref);
604 READ_BOOL_FIELD(winstar);
605 READ_BOOL_FIELD(winagg);
606 READ_LOCATION_FIELD(location);
617 READ_LOCALS(ArrayRef);
619 READ_OID_FIELD(refarraytype);
620 READ_OID_FIELD(refelemtype);
621 READ_INT_FIELD(reftypmod);
622 READ_OID_FIELD(refcollid);
623 READ_NODE_FIELD(refupperindexpr);
624 READ_NODE_FIELD(reflowerindexpr);
625 READ_NODE_FIELD(refexpr);
626 READ_NODE_FIELD(refassgnexpr);
637 READ_LOCALS(FuncExpr);
639 READ_OID_FIELD(funcid);
640 READ_OID_FIELD(funcresulttype);
641 READ_BOOL_FIELD(funcretset);
642 READ_BOOL_FIELD(funcvariadic);
643 READ_ENUM_FIELD(funcformat, CoercionForm);
644 READ_OID_FIELD(funccollid);
645 READ_OID_FIELD(inputcollid);
646 READ_NODE_FIELD(args);
647 READ_LOCATION_FIELD(location);
655 static NamedArgExpr *
656 _readNamedArgExpr(void)
658 READ_LOCALS(NamedArgExpr);
660 READ_NODE_FIELD(arg);
661 READ_STRING_FIELD(name);
662 READ_INT_FIELD(argnumber);
663 READ_LOCATION_FIELD(location);
676 READ_OID_FIELD(opno);
677 READ_OID_FIELD(opfuncid);
678 READ_OID_FIELD(opresulttype);
679 READ_BOOL_FIELD(opretset);
680 READ_OID_FIELD(opcollid);
681 READ_OID_FIELD(inputcollid);
682 READ_NODE_FIELD(args);
683 READ_LOCATION_FIELD(location);
691 static DistinctExpr *
692 _readDistinctExpr(void)
694 READ_LOCALS(DistinctExpr);
696 READ_OID_FIELD(opno);
697 READ_OID_FIELD(opfuncid);
698 READ_OID_FIELD(opresulttype);
699 READ_BOOL_FIELD(opretset);
700 READ_OID_FIELD(opcollid);
701 READ_OID_FIELD(inputcollid);
702 READ_NODE_FIELD(args);
703 READ_LOCATION_FIELD(location);
712 _readNullIfExpr(void)
714 READ_LOCALS(NullIfExpr);
716 READ_OID_FIELD(opno);
717 READ_OID_FIELD(opfuncid);
718 READ_OID_FIELD(opresulttype);
719 READ_BOOL_FIELD(opretset);
720 READ_OID_FIELD(opcollid);
721 READ_OID_FIELD(inputcollid);
722 READ_NODE_FIELD(args);
723 READ_LOCATION_FIELD(location);
729 * _readScalarArrayOpExpr
731 static ScalarArrayOpExpr *
732 _readScalarArrayOpExpr(void)
734 READ_LOCALS(ScalarArrayOpExpr);
736 READ_OID_FIELD(opno);
737 READ_OID_FIELD(opfuncid);
738 READ_BOOL_FIELD(useOr);
739 READ_OID_FIELD(inputcollid);
740 READ_NODE_FIELD(args);
741 READ_LOCATION_FIELD(location);
752 READ_LOCALS(BoolExpr);
754 /* do-it-yourself enum representation */
755 token = pg_strtok(&length); /* skip :boolop */
756 token = pg_strtok(&length); /* get field value */
757 if (strncmp(token, "and", 3) == 0)
758 local_node->boolop = AND_EXPR;
759 else if (strncmp(token, "or", 2) == 0)
760 local_node->boolop = OR_EXPR;
761 else if (strncmp(token, "not", 3) == 0)
762 local_node->boolop = NOT_EXPR;
764 elog(ERROR, "unrecognized boolop \"%.*s\"", length, token);
766 READ_NODE_FIELD(args);
767 READ_LOCATION_FIELD(location);
778 READ_LOCALS(SubLink);
780 READ_ENUM_FIELD(subLinkType, SubLinkType);
781 READ_INT_FIELD(subLinkId);
782 READ_NODE_FIELD(testexpr);
783 READ_NODE_FIELD(operName);
784 READ_NODE_FIELD(subselect);
785 READ_LOCATION_FIELD(location);
791 * _readSubPlan is not needed since it doesn't appear in stored rules.
798 _readFieldSelect(void)
800 READ_LOCALS(FieldSelect);
802 READ_NODE_FIELD(arg);
803 READ_INT_FIELD(fieldnum);
804 READ_OID_FIELD(resulttype);
805 READ_INT_FIELD(resulttypmod);
806 READ_OID_FIELD(resultcollid);
815 _readFieldStore(void)
817 READ_LOCALS(FieldStore);
819 READ_NODE_FIELD(arg);
820 READ_NODE_FIELD(newvals);
821 READ_NODE_FIELD(fieldnums);
822 READ_OID_FIELD(resulttype);
831 _readRelabelType(void)
833 READ_LOCALS(RelabelType);
835 READ_NODE_FIELD(arg);
836 READ_OID_FIELD(resulttype);
837 READ_INT_FIELD(resulttypmod);
838 READ_OID_FIELD(resultcollid);
839 READ_ENUM_FIELD(relabelformat, CoercionForm);
840 READ_LOCATION_FIELD(location);
849 _readCoerceViaIO(void)
851 READ_LOCALS(CoerceViaIO);
853 READ_NODE_FIELD(arg);
854 READ_OID_FIELD(resulttype);
855 READ_OID_FIELD(resultcollid);
856 READ_ENUM_FIELD(coerceformat, CoercionForm);
857 READ_LOCATION_FIELD(location);
863 * _readArrayCoerceExpr
865 static ArrayCoerceExpr *
866 _readArrayCoerceExpr(void)
868 READ_LOCALS(ArrayCoerceExpr);
870 READ_NODE_FIELD(arg);
871 READ_OID_FIELD(elemfuncid);
872 READ_OID_FIELD(resulttype);
873 READ_INT_FIELD(resulttypmod);
874 READ_OID_FIELD(resultcollid);
875 READ_BOOL_FIELD(isExplicit);
876 READ_ENUM_FIELD(coerceformat, CoercionForm);
877 READ_LOCATION_FIELD(location);
883 * _readConvertRowtypeExpr
885 static ConvertRowtypeExpr *
886 _readConvertRowtypeExpr(void)
888 READ_LOCALS(ConvertRowtypeExpr);
890 READ_NODE_FIELD(arg);
891 READ_OID_FIELD(resulttype);
892 READ_ENUM_FIELD(convertformat, CoercionForm);
893 READ_LOCATION_FIELD(location);
902 _readCollateExpr(void)
904 READ_LOCALS(CollateExpr);
906 READ_NODE_FIELD(arg);
907 READ_OID_FIELD(collOid);
908 READ_LOCATION_FIELD(location);
919 READ_LOCALS(CaseExpr);
921 READ_OID_FIELD(casetype);
922 READ_OID_FIELD(casecollid);
923 READ_NODE_FIELD(arg);
924 READ_NODE_FIELD(args);
925 READ_NODE_FIELD(defresult);
926 READ_LOCATION_FIELD(location);
937 READ_LOCALS(CaseWhen);
939 READ_NODE_FIELD(expr);
940 READ_NODE_FIELD(result);
941 READ_LOCATION_FIELD(location);
949 static CaseTestExpr *
950 _readCaseTestExpr(void)
952 READ_LOCALS(CaseTestExpr);
954 READ_OID_FIELD(typeId);
955 READ_INT_FIELD(typeMod);
956 READ_OID_FIELD(collation);
967 READ_LOCALS(ArrayExpr);
969 READ_OID_FIELD(array_typeid);
970 READ_OID_FIELD(array_collid);
971 READ_OID_FIELD(element_typeid);
972 READ_NODE_FIELD(elements);
973 READ_BOOL_FIELD(multidims);
974 READ_LOCATION_FIELD(location);
985 READ_LOCALS(RowExpr);
987 READ_NODE_FIELD(args);
988 READ_OID_FIELD(row_typeid);
989 READ_ENUM_FIELD(row_format, CoercionForm);
990 READ_NODE_FIELD(colnames);
991 READ_LOCATION_FIELD(location);
997 * _readRowCompareExpr
999 static RowCompareExpr *
1000 _readRowCompareExpr(void)
1002 READ_LOCALS(RowCompareExpr);
1004 READ_ENUM_FIELD(rctype, RowCompareType);
1005 READ_NODE_FIELD(opnos);
1006 READ_NODE_FIELD(opfamilies);
1007 READ_NODE_FIELD(inputcollids);
1008 READ_NODE_FIELD(largs);
1009 READ_NODE_FIELD(rargs);
1017 static CoalesceExpr *
1018 _readCoalesceExpr(void)
1020 READ_LOCALS(CoalesceExpr);
1022 READ_OID_FIELD(coalescetype);
1023 READ_OID_FIELD(coalescecollid);
1024 READ_NODE_FIELD(args);
1025 READ_LOCATION_FIELD(location);
1034 _readMinMaxExpr(void)
1036 READ_LOCALS(MinMaxExpr);
1038 READ_OID_FIELD(minmaxtype);
1039 READ_OID_FIELD(minmaxcollid);
1040 READ_OID_FIELD(inputcollid);
1041 READ_ENUM_FIELD(op, MinMaxOp);
1042 READ_NODE_FIELD(args);
1043 READ_LOCATION_FIELD(location);
1054 READ_LOCALS(XmlExpr);
1056 READ_ENUM_FIELD(op, XmlExprOp);
1057 READ_STRING_FIELD(name);
1058 READ_NODE_FIELD(named_args);
1059 READ_NODE_FIELD(arg_names);
1060 READ_NODE_FIELD(args);
1061 READ_ENUM_FIELD(xmloption, XmlOptionType);
1062 READ_OID_FIELD(type);
1063 READ_INT_FIELD(typmod);
1064 READ_LOCATION_FIELD(location);
1075 READ_LOCALS(NullTest);
1077 READ_NODE_FIELD(arg);
1078 READ_ENUM_FIELD(nulltesttype, NullTestType);
1079 READ_BOOL_FIELD(argisrow);
1080 READ_LOCATION_FIELD(location);
1088 static BooleanTest *
1089 _readBooleanTest(void)
1091 READ_LOCALS(BooleanTest);
1093 READ_NODE_FIELD(arg);
1094 READ_ENUM_FIELD(booltesttype, BoolTestType);
1095 READ_LOCATION_FIELD(location);
1101 * _readCoerceToDomain
1103 static CoerceToDomain *
1104 _readCoerceToDomain(void)
1106 READ_LOCALS(CoerceToDomain);
1108 READ_NODE_FIELD(arg);
1109 READ_OID_FIELD(resulttype);
1110 READ_INT_FIELD(resulttypmod);
1111 READ_OID_FIELD(resultcollid);
1112 READ_ENUM_FIELD(coercionformat, CoercionForm);
1113 READ_LOCATION_FIELD(location);
1119 * _readCoerceToDomainValue
1121 static CoerceToDomainValue *
1122 _readCoerceToDomainValue(void)
1124 READ_LOCALS(CoerceToDomainValue);
1126 READ_OID_FIELD(typeId);
1127 READ_INT_FIELD(typeMod);
1128 READ_OID_FIELD(collation);
1129 READ_LOCATION_FIELD(location);
1137 static SetToDefault *
1138 _readSetToDefault(void)
1140 READ_LOCALS(SetToDefault);
1142 READ_OID_FIELD(typeId);
1143 READ_INT_FIELD(typeMod);
1144 READ_OID_FIELD(collation);
1145 READ_LOCATION_FIELD(location);
1151 * _readCurrentOfExpr
1153 static CurrentOfExpr *
1154 _readCurrentOfExpr(void)
1156 READ_LOCALS(CurrentOfExpr);
1158 READ_UINT_FIELD(cvarno);
1159 READ_STRING_FIELD(cursor_name);
1160 READ_INT_FIELD(cursor_param);
1166 * _readInferenceElem
1168 static InferenceElem *
1169 _readInferenceElem(void)
1171 READ_LOCALS(InferenceElem);
1173 READ_NODE_FIELD(expr);
1174 READ_OID_FIELD(infercollid);
1175 READ_OID_FIELD(inferopclass);
1183 static TargetEntry *
1184 _readTargetEntry(void)
1186 READ_LOCALS(TargetEntry);
1188 READ_NODE_FIELD(expr);
1189 READ_INT_FIELD(resno);
1190 READ_STRING_FIELD(resname);
1191 READ_UINT_FIELD(ressortgroupref);
1192 READ_OID_FIELD(resorigtbl);
1193 READ_INT_FIELD(resorigcol);
1194 READ_BOOL_FIELD(resjunk);
1202 static RangeTblRef *
1203 _readRangeTblRef(void)
1205 READ_LOCALS(RangeTblRef);
1207 READ_INT_FIELD(rtindex);
1218 READ_LOCALS(JoinExpr);
1220 READ_ENUM_FIELD(jointype, JoinType);
1221 READ_BOOL_FIELD(isNatural);
1222 READ_NODE_FIELD(larg);
1223 READ_NODE_FIELD(rarg);
1224 READ_NODE_FIELD(usingClause);
1225 READ_NODE_FIELD(quals);
1226 READ_NODE_FIELD(alias);
1227 READ_INT_FIELD(rtindex);
1238 READ_LOCALS(FromExpr);
1240 READ_NODE_FIELD(fromlist);
1241 READ_NODE_FIELD(quals);
1247 * _readOnConflictExpr
1249 static OnConflictExpr *
1250 _readOnConflictExpr(void)
1252 READ_LOCALS(OnConflictExpr);
1254 READ_ENUM_FIELD(action, OnConflictAction);
1255 READ_NODE_FIELD(arbiterElems);
1256 READ_NODE_FIELD(arbiterWhere);
1257 READ_OID_FIELD(constraint);
1258 READ_NODE_FIELD(onConflictSet);
1259 READ_NODE_FIELD(onConflictWhere);
1260 READ_INT_FIELD(exclRelIndex);
1261 READ_NODE_FIELD(exclRelTlist);
1267 * Stuff from parsenodes.h.
1271 * _readRangeTblEntry
1273 static RangeTblEntry *
1274 _readRangeTblEntry(void)
1276 READ_LOCALS(RangeTblEntry);
1278 /* put alias + eref first to make dump more legible */
1279 READ_NODE_FIELD(alias);
1280 READ_NODE_FIELD(eref);
1281 READ_ENUM_FIELD(rtekind, RTEKind);
1283 switch (local_node->rtekind)
1286 READ_OID_FIELD(relid);
1287 READ_CHAR_FIELD(relkind);
1288 READ_NODE_FIELD(tablesample);
1291 READ_NODE_FIELD(subquery);
1292 READ_BOOL_FIELD(security_barrier);
1295 READ_ENUM_FIELD(jointype, JoinType);
1296 READ_NODE_FIELD(joinaliasvars);
1299 READ_NODE_FIELD(functions);
1300 READ_BOOL_FIELD(funcordinality);
1303 READ_NODE_FIELD(values_lists);
1304 READ_NODE_FIELD(values_collations);
1307 READ_STRING_FIELD(ctename);
1308 READ_UINT_FIELD(ctelevelsup);
1309 READ_BOOL_FIELD(self_reference);
1310 READ_NODE_FIELD(ctecoltypes);
1311 READ_NODE_FIELD(ctecoltypmods);
1312 READ_NODE_FIELD(ctecolcollations);
1315 elog(ERROR, "unrecognized RTE kind: %d",
1316 (int) local_node->rtekind);
1320 READ_BOOL_FIELD(lateral);
1321 READ_BOOL_FIELD(inh);
1322 READ_BOOL_FIELD(inFromCl);
1323 READ_UINT_FIELD(requiredPerms);
1324 READ_OID_FIELD(checkAsUser);
1325 READ_BITMAPSET_FIELD(selectedCols);
1326 READ_BITMAPSET_FIELD(insertedCols);
1327 READ_BITMAPSET_FIELD(updatedCols);
1328 READ_NODE_FIELD(securityQuals);
1334 * _readRangeTblFunction
1336 static RangeTblFunction *
1337 _readRangeTblFunction(void)
1339 READ_LOCALS(RangeTblFunction);
1341 READ_NODE_FIELD(funcexpr);
1342 READ_INT_FIELD(funccolcount);
1343 READ_NODE_FIELD(funccolnames);
1344 READ_NODE_FIELD(funccoltypes);
1345 READ_NODE_FIELD(funccoltypmods);
1346 READ_NODE_FIELD(funccolcollations);
1347 READ_BITMAPSET_FIELD(funcparams);
1353 * _readTableSampleClause
1355 static TableSampleClause *
1356 _readTableSampleClause(void)
1358 READ_LOCALS(TableSampleClause);
1360 READ_OID_FIELD(tsmhandler);
1361 READ_NODE_FIELD(args);
1362 READ_NODE_FIELD(repeatable);
1373 READ_LOCALS(DefElem);
1375 READ_STRING_FIELD(defnamespace);
1376 READ_STRING_FIELD(defname);
1377 READ_NODE_FIELD(arg);
1378 READ_ENUM_FIELD(defaction, DefElemAction);
1386 static PlannedStmt *
1387 _readPlannedStmt(void)
1389 READ_LOCALS(PlannedStmt);
1391 READ_ENUM_FIELD(commandType, CmdType);
1392 READ_UINT_FIELD(queryId);
1393 READ_BOOL_FIELD(hasReturning);
1394 READ_BOOL_FIELD(hasModifyingCTE);
1395 READ_BOOL_FIELD(canSetTag);
1396 READ_BOOL_FIELD(transientPlan);
1397 READ_NODE_FIELD(planTree);
1398 READ_NODE_FIELD(rtable);
1399 READ_NODE_FIELD(resultRelations);
1400 READ_NODE_FIELD(utilityStmt);
1401 READ_NODE_FIELD(subplans);
1402 READ_BITMAPSET_FIELD(rewindPlanIDs);
1403 READ_NODE_FIELD(rowMarks);
1404 READ_NODE_FIELD(relationOids);
1405 READ_NODE_FIELD(invalItems);
1406 READ_INT_FIELD(nParamExec);
1407 READ_BOOL_FIELD(hasRowSecurity);
1408 READ_BOOL_FIELD(parallelModeNeeded);
1409 READ_BOOL_FIELD(hasForeignJoin);
1416 * Assign the basic stuff of all nodes that inherit from Plan
1419 ReadCommonPlan(Plan *local_node)
1423 READ_FLOAT_FIELD(startup_cost);
1424 READ_FLOAT_FIELD(total_cost);
1425 READ_FLOAT_FIELD(plan_rows);
1426 READ_INT_FIELD(plan_width);
1427 READ_BOOL_FIELD(parallel_aware);
1428 READ_INT_FIELD(plan_node_id);
1429 READ_NODE_FIELD(targetlist);
1430 READ_NODE_FIELD(qual);
1431 READ_NODE_FIELD(lefttree);
1432 READ_NODE_FIELD(righttree);
1433 READ_NODE_FIELD(initPlan);
1434 READ_BITMAPSET_FIELD(extParam);
1435 READ_BITMAPSET_FIELD(allParam);
1444 READ_LOCALS_NO_FIELDS(Plan);
1446 ReadCommonPlan(local_node);
1457 READ_LOCALS(Result);
1459 ReadCommonPlan(&local_node->plan);
1461 READ_NODE_FIELD(resconstantqual);
1469 static ModifyTable *
1470 _readModifyTable(void)
1472 READ_LOCALS(ModifyTable);
1474 ReadCommonPlan(&local_node->plan);
1476 READ_ENUM_FIELD(operation, CmdType);
1477 READ_BOOL_FIELD(canSetTag);
1478 READ_UINT_FIELD(nominalRelation);
1479 READ_NODE_FIELD(resultRelations);
1480 READ_INT_FIELD(resultRelIndex);
1481 READ_NODE_FIELD(plans);
1482 READ_NODE_FIELD(withCheckOptionLists);
1483 READ_NODE_FIELD(returningLists);
1484 READ_NODE_FIELD(fdwPrivLists);
1485 READ_BITMAPSET_FIELD(fdwDirectModifyPlans);
1486 READ_NODE_FIELD(rowMarks);
1487 READ_INT_FIELD(epqParam);
1488 READ_ENUM_FIELD(onConflictAction, OnConflictAction);
1489 READ_NODE_FIELD(arbiterIndexes);
1490 READ_NODE_FIELD(onConflictSet);
1491 READ_NODE_FIELD(onConflictWhere);
1492 READ_UINT_FIELD(exclRelRTI);
1493 READ_NODE_FIELD(exclRelTlist);
1504 READ_LOCALS(Append);
1506 ReadCommonPlan(&local_node->plan);
1508 READ_NODE_FIELD(appendplans);
1516 static MergeAppend *
1517 _readMergeAppend(void)
1519 READ_LOCALS(MergeAppend);
1521 ReadCommonPlan(&local_node->plan);
1523 READ_NODE_FIELD(mergeplans);
1524 READ_INT_FIELD(numCols);
1525 READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numCols);
1526 READ_OID_ARRAY(sortOperators, local_node->numCols);
1527 READ_OID_ARRAY(collations, local_node->numCols);
1528 READ_BOOL_ARRAY(nullsFirst, local_node->numCols);
1534 * _readRecursiveUnion
1536 static RecursiveUnion *
1537 _readRecursiveUnion(void)
1539 READ_LOCALS(RecursiveUnion);
1541 ReadCommonPlan(&local_node->plan);
1543 READ_INT_FIELD(wtParam);
1544 READ_INT_FIELD(numCols);
1545 READ_ATTRNUMBER_ARRAY(dupColIdx, local_node->numCols);
1546 READ_OID_ARRAY(dupOperators, local_node->numCols);
1547 READ_LONG_FIELD(numGroups);
1556 _readBitmapAnd(void)
1558 READ_LOCALS(BitmapAnd);
1560 ReadCommonPlan(&local_node->plan);
1562 READ_NODE_FIELD(bitmapplans);
1573 READ_LOCALS(BitmapOr);
1575 ReadCommonPlan(&local_node->plan);
1577 READ_NODE_FIELD(bitmapplans);
1584 * Assign the basic stuff of all nodes that inherit from Scan
1587 ReadCommonScan(Scan *local_node)
1591 ReadCommonPlan(&local_node->plan);
1593 READ_UINT_FIELD(scanrelid);
1602 READ_LOCALS_NO_FIELDS(Scan);
1604 ReadCommonScan(local_node);
1615 READ_LOCALS_NO_FIELDS(SeqScan);
1617 ReadCommonScan(local_node);
1626 _readSampleScan(void)
1628 READ_LOCALS(SampleScan);
1630 ReadCommonScan(&local_node->scan);
1632 READ_NODE_FIELD(tablesample);
1641 _readIndexScan(void)
1643 READ_LOCALS(IndexScan);
1645 ReadCommonScan(&local_node->scan);
1647 READ_OID_FIELD(indexid);
1648 READ_NODE_FIELD(indexqual);
1649 READ_NODE_FIELD(indexqualorig);
1650 READ_NODE_FIELD(indexorderby);
1651 READ_NODE_FIELD(indexorderbyorig);
1652 READ_NODE_FIELD(indexorderbyops);
1653 READ_ENUM_FIELD(indexorderdir, ScanDirection);
1659 * _readIndexOnlyScan
1661 static IndexOnlyScan *
1662 _readIndexOnlyScan(void)
1664 READ_LOCALS(IndexOnlyScan);
1666 ReadCommonScan(&local_node->scan);
1668 READ_OID_FIELD(indexid);
1669 READ_NODE_FIELD(indexqual);
1670 READ_NODE_FIELD(indexorderby);
1671 READ_NODE_FIELD(indextlist);
1672 READ_ENUM_FIELD(indexorderdir, ScanDirection);
1678 * _readBitmapIndexScan
1680 static BitmapIndexScan *
1681 _readBitmapIndexScan(void)
1683 READ_LOCALS(BitmapIndexScan);
1685 ReadCommonScan(&local_node->scan);
1687 READ_OID_FIELD(indexid);
1688 READ_NODE_FIELD(indexqual);
1689 READ_NODE_FIELD(indexqualorig);
1695 * _readBitmapHeapScan
1697 static BitmapHeapScan *
1698 _readBitmapHeapScan(void)
1700 READ_LOCALS(BitmapHeapScan);
1702 ReadCommonScan(&local_node->scan);
1704 READ_NODE_FIELD(bitmapqualorig);
1715 READ_LOCALS(TidScan);
1717 ReadCommonScan(&local_node->scan);
1719 READ_NODE_FIELD(tidquals);
1727 static SubqueryScan *
1728 _readSubqueryScan(void)
1730 READ_LOCALS(SubqueryScan);
1732 ReadCommonScan(&local_node->scan);
1734 READ_NODE_FIELD(subplan);
1742 static FunctionScan *
1743 _readFunctionScan(void)
1745 READ_LOCALS(FunctionScan);
1747 ReadCommonScan(&local_node->scan);
1749 READ_NODE_FIELD(functions);
1750 READ_BOOL_FIELD(funcordinality);
1759 _readValuesScan(void)
1761 READ_LOCALS(ValuesScan);
1763 ReadCommonScan(&local_node->scan);
1765 READ_NODE_FIELD(values_lists);
1776 READ_LOCALS(CteScan);
1778 ReadCommonScan(&local_node->scan);
1780 READ_INT_FIELD(ctePlanId);
1781 READ_INT_FIELD(cteParam);
1787 * _readWorkTableScan
1789 static WorkTableScan *
1790 _readWorkTableScan(void)
1792 READ_LOCALS(WorkTableScan);
1794 ReadCommonScan(&local_node->scan);
1796 READ_INT_FIELD(wtParam);
1804 static ForeignScan *
1805 _readForeignScan(void)
1807 READ_LOCALS(ForeignScan);
1809 ReadCommonScan(&local_node->scan);
1811 READ_ENUM_FIELD(operation, CmdType);
1812 READ_OID_FIELD(fs_server);
1813 READ_NODE_FIELD(fdw_exprs);
1814 READ_NODE_FIELD(fdw_private);
1815 READ_NODE_FIELD(fdw_scan_tlist);
1816 READ_NODE_FIELD(fdw_recheck_quals);
1817 READ_BITMAPSET_FIELD(fs_relids);
1818 READ_BOOL_FIELD(fsSystemCol);
1827 _readCustomScan(void)
1829 READ_LOCALS(CustomScan);
1831 const CustomScanMethods *methods;
1833 ReadCommonScan(&local_node->scan);
1835 READ_UINT_FIELD(flags);
1836 READ_NODE_FIELD(custom_plans);
1837 READ_NODE_FIELD(custom_exprs);
1838 READ_NODE_FIELD(custom_private);
1839 READ_NODE_FIELD(custom_scan_tlist);
1840 READ_BITMAPSET_FIELD(custom_relids);
1842 /* Lookup CustomScanMethods by CustomName */
1843 token = pg_strtok(&length); /* skip methods: */
1844 token = pg_strtok(&length); /* CustomName */
1845 custom_name = nullable_string(token, length);
1846 methods = GetCustomScanMethods(custom_name, false);
1847 local_node->methods = methods;
1854 * Assign the basic stuff of all nodes that inherit from Join
1857 ReadCommonJoin(Join *local_node)
1861 ReadCommonPlan(&local_node->plan);
1863 READ_ENUM_FIELD(jointype, JoinType);
1864 READ_NODE_FIELD(joinqual);
1873 READ_LOCALS_NO_FIELDS(Join);
1875 ReadCommonJoin(local_node);
1886 READ_LOCALS(NestLoop);
1888 ReadCommonJoin(&local_node->join);
1890 READ_NODE_FIELD(nestParams);
1899 _readMergeJoin(void)
1903 READ_LOCALS(MergeJoin);
1905 ReadCommonJoin(&local_node->join);
1907 READ_NODE_FIELD(mergeclauses);
1909 numCols = list_length(local_node->mergeclauses);
1911 READ_OID_ARRAY(mergeFamilies, numCols);
1912 READ_OID_ARRAY(mergeCollations, numCols);
1913 READ_INT_ARRAY(mergeStrategies, numCols);
1914 READ_BOOL_ARRAY(mergeNullsFirst, numCols);
1925 READ_LOCALS(HashJoin);
1927 ReadCommonJoin(&local_node->join);
1929 READ_NODE_FIELD(hashclauses);
1940 READ_LOCALS_NO_FIELDS(Material);
1942 ReadCommonPlan(&local_node->plan);
1955 ReadCommonPlan(&local_node->plan);
1957 READ_INT_FIELD(numCols);
1958 READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numCols);
1959 READ_OID_ARRAY(sortOperators, local_node->numCols);
1960 READ_OID_ARRAY(collations, local_node->numCols);
1961 READ_BOOL_ARRAY(nullsFirst, local_node->numCols);
1974 ReadCommonPlan(&local_node->plan);
1976 READ_INT_FIELD(numCols);
1977 READ_ATTRNUMBER_ARRAY(grpColIdx, local_node->numCols);
1978 READ_OID_ARRAY(grpOperators, local_node->numCols);
1991 ReadCommonPlan(&local_node->plan);
1993 READ_ENUM_FIELD(aggstrategy, AggStrategy);
1994 READ_BOOL_FIELD(combineStates);
1995 READ_BOOL_FIELD(finalizeAggs);
1996 READ_INT_FIELD(numCols);
1997 READ_ATTRNUMBER_ARRAY(grpColIdx, local_node->numCols);
1998 READ_OID_ARRAY(grpOperators, local_node->numCols);
1999 READ_LONG_FIELD(numGroups);
2000 READ_NODE_FIELD(groupingSets);
2001 READ_NODE_FIELD(chain);
2010 _readWindowAgg(void)
2012 READ_LOCALS(WindowAgg);
2014 ReadCommonPlan(&local_node->plan);
2016 READ_UINT_FIELD(winref);
2017 READ_INT_FIELD(partNumCols);
2018 READ_ATTRNUMBER_ARRAY(partColIdx, local_node->partNumCols);
2019 READ_OID_ARRAY(partOperators, local_node->partNumCols);
2020 READ_INT_FIELD(ordNumCols);
2021 READ_ATTRNUMBER_ARRAY(ordColIdx, local_node->ordNumCols);
2022 READ_OID_ARRAY(ordOperators, local_node->ordNumCols);
2023 READ_INT_FIELD(frameOptions);
2024 READ_NODE_FIELD(startOffset);
2025 READ_NODE_FIELD(endOffset);
2036 READ_LOCALS(Unique);
2038 ReadCommonPlan(&local_node->plan);
2040 READ_INT_FIELD(numCols);
2041 READ_ATTRNUMBER_ARRAY(uniqColIdx, local_node->numCols);
2042 READ_OID_ARRAY(uniqOperators, local_node->numCols);
2053 READ_LOCALS(Gather);
2055 ReadCommonPlan(&local_node->plan);
2057 READ_INT_FIELD(num_workers);
2058 READ_BOOL_FIELD(single_copy);
2059 READ_BOOL_FIELD(invisible);
2072 ReadCommonPlan(&local_node->plan);
2074 READ_OID_FIELD(skewTable);
2075 READ_INT_FIELD(skewColumn);
2076 READ_BOOL_FIELD(skewInherit);
2077 READ_OID_FIELD(skewColType);
2078 READ_INT_FIELD(skewColTypmod);
2091 ReadCommonPlan(&local_node->plan);
2093 READ_ENUM_FIELD(cmd, SetOpCmd);
2094 READ_ENUM_FIELD(strategy, SetOpStrategy);
2095 READ_INT_FIELD(numCols);
2096 READ_ATTRNUMBER_ARRAY(dupColIdx, local_node->numCols);
2097 READ_OID_ARRAY(dupOperators, local_node->numCols);
2098 READ_INT_FIELD(flagColIdx);
2099 READ_INT_FIELD(firstFlag);
2100 READ_LONG_FIELD(numGroups);
2111 READ_LOCALS(LockRows);
2113 ReadCommonPlan(&local_node->plan);
2115 READ_NODE_FIELD(rowMarks);
2116 READ_INT_FIELD(epqParam);
2129 ReadCommonPlan(&local_node->plan);
2131 READ_NODE_FIELD(limitOffset);
2132 READ_NODE_FIELD(limitCount);
2138 * _readNestLoopParam
2140 static NestLoopParam *
2141 _readNestLoopParam(void)
2143 READ_LOCALS(NestLoopParam);
2145 READ_INT_FIELD(paramno);
2146 READ_NODE_FIELD(paramval);
2154 static PlanRowMark *
2155 _readPlanRowMark(void)
2157 READ_LOCALS(PlanRowMark);
2159 READ_UINT_FIELD(rti);
2160 READ_UINT_FIELD(prti);
2161 READ_UINT_FIELD(rowmarkId);
2162 READ_ENUM_FIELD(markType, RowMarkType);
2163 READ_INT_FIELD(allMarkTypes);
2164 READ_ENUM_FIELD(strength, LockClauseStrength);
2165 READ_ENUM_FIELD(waitPolicy, LockWaitPolicy);
2166 READ_BOOL_FIELD(isParent);
2172 * _readPlanInvalItem
2174 static PlanInvalItem *
2175 _readPlanInvalItem(void)
2177 READ_LOCALS(PlanInvalItem);
2179 READ_INT_FIELD(cacheId);
2180 READ_UINT_FIELD(hashValue);
2191 READ_LOCALS(SubPlan);
2193 READ_ENUM_FIELD(subLinkType, SubLinkType);
2194 READ_NODE_FIELD(testexpr);
2195 READ_NODE_FIELD(paramIds);
2196 READ_INT_FIELD(plan_id);
2197 READ_STRING_FIELD(plan_name);
2198 READ_OID_FIELD(firstColType);
2199 READ_INT_FIELD(firstColTypmod);
2200 READ_OID_FIELD(firstColCollation);
2201 READ_BOOL_FIELD(useHashTable);
2202 READ_BOOL_FIELD(unknownEqFalse);
2203 READ_NODE_FIELD(setParam);
2204 READ_NODE_FIELD(parParam);
2205 READ_NODE_FIELD(args);
2206 READ_FLOAT_FIELD(startup_cost);
2207 READ_FLOAT_FIELD(per_call_cost);
2213 * _readAlternativeSubPlan
2215 static AlternativeSubPlan *
2216 _readAlternativeSubPlan(void)
2218 READ_LOCALS(AlternativeSubPlan);
2220 READ_NODE_FIELD(subplans);
2226 * _readExtensibleNode
2228 static ExtensibleNode *
2229 _readExtensibleNode(void)
2231 const ExtensibleNodeMethods *methods;
2232 ExtensibleNode *local_node;
2233 const char *extnodename;
2236 token = pg_strtok(&length); /* skip: extnodename */
2237 token = pg_strtok(&length); /* get extnodename */
2239 extnodename = nullable_string(token, length);
2241 elog(ERROR, "extnodename has to be supplied");
2242 methods = GetExtensibleNodeMethods(extnodename, false);
2244 local_node = (ExtensibleNode *) newNode(methods->node_size,
2246 local_node->extnodename = extnodename;
2248 /* deserialize the private fields */
2249 methods->nodeRead(local_node);
2257 * Given a character string representing a node tree, parseNodeString creates
2258 * the internal node structure.
2260 * The string to be read must already have been loaded into pg_strtok().
2263 parseNodeString(void)
2269 token = pg_strtok(&length);
2271 #define MATCH(tokname, namelen) \
2272 (length == namelen && memcmp(token, tokname, namelen) == 0)
2274 if (MATCH("QUERY", 5))
2275 return_value = _readQuery();
2276 else if (MATCH("WITHCHECKOPTION", 15))
2277 return_value = _readWithCheckOption();
2278 else if (MATCH("SORTGROUPCLAUSE", 15))
2279 return_value = _readSortGroupClause();
2280 else if (MATCH("GROUPINGSET", 11))
2281 return_value = _readGroupingSet();
2282 else if (MATCH("WINDOWCLAUSE", 12))
2283 return_value = _readWindowClause();
2284 else if (MATCH("ROWMARKCLAUSE", 13))
2285 return_value = _readRowMarkClause();
2286 else if (MATCH("COMMONTABLEEXPR", 15))
2287 return_value = _readCommonTableExpr();
2288 else if (MATCH("SETOPERATIONSTMT", 16))
2289 return_value = _readSetOperationStmt();
2290 else if (MATCH("ALIAS", 5))
2291 return_value = _readAlias();
2292 else if (MATCH("RANGEVAR", 8))
2293 return_value = _readRangeVar();
2294 else if (MATCH("INTOCLAUSE", 10))
2295 return_value = _readIntoClause();
2296 else if (MATCH("VAR", 3))
2297 return_value = _readVar();
2298 else if (MATCH("CONST", 5))
2299 return_value = _readConst();
2300 else if (MATCH("PARAM", 5))
2301 return_value = _readParam();
2302 else if (MATCH("AGGREF", 6))
2303 return_value = _readAggref();
2304 else if (MATCH("GROUPINGFUNC", 12))
2305 return_value = _readGroupingFunc();
2306 else if (MATCH("WINDOWFUNC", 10))
2307 return_value = _readWindowFunc();
2308 else if (MATCH("ARRAYREF", 8))
2309 return_value = _readArrayRef();
2310 else if (MATCH("FUNCEXPR", 8))
2311 return_value = _readFuncExpr();
2312 else if (MATCH("NAMEDARGEXPR", 12))
2313 return_value = _readNamedArgExpr();
2314 else if (MATCH("OPEXPR", 6))
2315 return_value = _readOpExpr();
2316 else if (MATCH("DISTINCTEXPR", 12))
2317 return_value = _readDistinctExpr();
2318 else if (MATCH("NULLIFEXPR", 10))
2319 return_value = _readNullIfExpr();
2320 else if (MATCH("SCALARARRAYOPEXPR", 17))
2321 return_value = _readScalarArrayOpExpr();
2322 else if (MATCH("BOOLEXPR", 8))
2323 return_value = _readBoolExpr();
2324 else if (MATCH("SUBLINK", 7))
2325 return_value = _readSubLink();
2326 else if (MATCH("FIELDSELECT", 11))
2327 return_value = _readFieldSelect();
2328 else if (MATCH("FIELDSTORE", 10))
2329 return_value = _readFieldStore();
2330 else if (MATCH("RELABELTYPE", 11))
2331 return_value = _readRelabelType();
2332 else if (MATCH("COERCEVIAIO", 11))
2333 return_value = _readCoerceViaIO();
2334 else if (MATCH("ARRAYCOERCEEXPR", 15))
2335 return_value = _readArrayCoerceExpr();
2336 else if (MATCH("CONVERTROWTYPEEXPR", 18))
2337 return_value = _readConvertRowtypeExpr();
2338 else if (MATCH("COLLATE", 7))
2339 return_value = _readCollateExpr();
2340 else if (MATCH("CASE", 4))
2341 return_value = _readCaseExpr();
2342 else if (MATCH("WHEN", 4))
2343 return_value = _readCaseWhen();
2344 else if (MATCH("CASETESTEXPR", 12))
2345 return_value = _readCaseTestExpr();
2346 else if (MATCH("ARRAY", 5))
2347 return_value = _readArrayExpr();
2348 else if (MATCH("ROW", 3))
2349 return_value = _readRowExpr();
2350 else if (MATCH("ROWCOMPARE", 10))
2351 return_value = _readRowCompareExpr();
2352 else if (MATCH("COALESCE", 8))
2353 return_value = _readCoalesceExpr();
2354 else if (MATCH("MINMAX", 6))
2355 return_value = _readMinMaxExpr();
2356 else if (MATCH("XMLEXPR", 7))
2357 return_value = _readXmlExpr();
2358 else if (MATCH("NULLTEST", 8))
2359 return_value = _readNullTest();
2360 else if (MATCH("BOOLEANTEST", 11))
2361 return_value = _readBooleanTest();
2362 else if (MATCH("COERCETODOMAIN", 14))
2363 return_value = _readCoerceToDomain();
2364 else if (MATCH("COERCETODOMAINVALUE", 19))
2365 return_value = _readCoerceToDomainValue();
2366 else if (MATCH("SETTODEFAULT", 12))
2367 return_value = _readSetToDefault();
2368 else if (MATCH("CURRENTOFEXPR", 13))
2369 return_value = _readCurrentOfExpr();
2370 else if (MATCH("INFERENCEELEM", 13))
2371 return_value = _readInferenceElem();
2372 else if (MATCH("TARGETENTRY", 11))
2373 return_value = _readTargetEntry();
2374 else if (MATCH("RANGETBLREF", 11))
2375 return_value = _readRangeTblRef();
2376 else if (MATCH("JOINEXPR", 8))
2377 return_value = _readJoinExpr();
2378 else if (MATCH("FROMEXPR", 8))
2379 return_value = _readFromExpr();
2380 else if (MATCH("ONCONFLICTEXPR", 14))
2381 return_value = _readOnConflictExpr();
2382 else if (MATCH("RTE", 3))
2383 return_value = _readRangeTblEntry();
2384 else if (MATCH("RANGETBLFUNCTION", 16))
2385 return_value = _readRangeTblFunction();
2386 else if (MATCH("TABLESAMPLECLAUSE", 17))
2387 return_value = _readTableSampleClause();
2388 else if (MATCH("NOTIFY", 6))
2389 return_value = _readNotifyStmt();
2390 else if (MATCH("DEFELEM", 7))
2391 return_value = _readDefElem();
2392 else if (MATCH("DECLARECURSOR", 13))
2393 return_value = _readDeclareCursorStmt();
2394 else if (MATCH("PLANNEDSTMT", 11))
2395 return_value = _readPlannedStmt();
2396 else if (MATCH("PLAN", 4))
2397 return_value = _readPlan();
2398 else if (MATCH("RESULT", 6))
2399 return_value = _readResult();
2400 else if (MATCH("MODIFYTABLE", 11))
2401 return_value = _readModifyTable();
2402 else if (MATCH("APPEND", 6))
2403 return_value = _readAppend();
2404 else if (MATCH("MERGEAPPEND", 11))
2405 return_value = _readMergeAppend();
2406 else if (MATCH("RECURSIVEUNION", 14))
2407 return_value = _readRecursiveUnion();
2408 else if (MATCH("BITMAPAND", 9))
2409 return_value = _readBitmapAnd();
2410 else if (MATCH("BITMAPOR", 8))
2411 return_value = _readBitmapOr();
2412 else if (MATCH("SCAN", 4))
2413 return_value = _readScan();
2414 else if (MATCH("SEQSCAN", 7))
2415 return_value = _readSeqScan();
2416 else if (MATCH("SAMPLESCAN", 10))
2417 return_value = _readSampleScan();
2418 else if (MATCH("INDEXSCAN", 9))
2419 return_value = _readIndexScan();
2420 else if (MATCH("INDEXONLYSCAN", 13))
2421 return_value = _readIndexOnlyScan();
2422 else if (MATCH("BITMAPINDEXSCAN", 15))
2423 return_value = _readBitmapIndexScan();
2424 else if (MATCH("BITMAPHEAPSCAN", 14))
2425 return_value = _readBitmapHeapScan();
2426 else if (MATCH("TIDSCAN", 7))
2427 return_value = _readTidScan();
2428 else if (MATCH("SUBQUERYSCAN", 12))
2429 return_value = _readSubqueryScan();
2430 else if (MATCH("FUNCTIONSCAN", 12))
2431 return_value = _readFunctionScan();
2432 else if (MATCH("VALUESSCAN", 10))
2433 return_value = _readValuesScan();
2434 else if (MATCH("CTESCAN", 7))
2435 return_value = _readCteScan();
2436 else if (MATCH("WORKTABLESCAN", 13))
2437 return_value = _readWorkTableScan();
2438 else if (MATCH("FOREIGNSCAN", 11))
2439 return_value = _readForeignScan();
2440 else if (MATCH("CUSTOMSCAN", 10))
2441 return_value = _readCustomScan();
2442 else if (MATCH("JOIN", 4))
2443 return_value = _readJoin();
2444 else if (MATCH("NESTLOOP", 8))
2445 return_value = _readNestLoop();
2446 else if (MATCH("MERGEJOIN", 9))
2447 return_value = _readMergeJoin();
2448 else if (MATCH("HASHJOIN", 8))
2449 return_value = _readHashJoin();
2450 else if (MATCH("MATERIAL", 8))
2451 return_value = _readMaterial();
2452 else if (MATCH("SORT", 4))
2453 return_value = _readSort();
2454 else if (MATCH("GROUP", 5))
2455 return_value = _readGroup();
2456 else if (MATCH("AGG", 3))
2457 return_value = _readAgg();
2458 else if (MATCH("WINDOWAGG", 9))
2459 return_value = _readWindowAgg();
2460 else if (MATCH("UNIQUE", 6))
2461 return_value = _readUnique();
2462 else if (MATCH("GATHER", 6))
2463 return_value = _readGather();
2464 else if (MATCH("HASH", 4))
2465 return_value = _readHash();
2466 else if (MATCH("SETOP", 5))
2467 return_value = _readSetOp();
2468 else if (MATCH("LOCKROWS", 8))
2469 return_value = _readLockRows();
2470 else if (MATCH("LIMIT", 5))
2471 return_value = _readLimit();
2472 else if (MATCH("NESTLOOPPARAM", 13))
2473 return_value = _readNestLoopParam();
2474 else if (MATCH("PLANROWMARK", 11))
2475 return_value = _readPlanRowMark();
2476 else if (MATCH("PLANINVALITEM", 13))
2477 return_value = _readPlanInvalItem();
2478 else if (MATCH("SUBPLAN", 7))
2479 return_value = _readSubPlan();
2480 else if (MATCH("ALTERNATIVESUBPLAN", 18))
2481 return_value = _readAlternativeSubPlan();
2482 else if (MATCH("EXTENSIBLENODE", 14))
2483 return_value = _readExtensibleNode();
2486 elog(ERROR, "badly formatted node string \"%.32s\"...", token);
2487 return_value = NULL; /* keep compiler quiet */
2490 return (Node *) return_value;
2497 * Given a string representation of a constant, recreate the appropriate
2498 * Datum. The string representation embeds length info, but not byValue,
2499 * so we must be told that.
2502 readDatum(bool typbyval)
2512 * read the actual length of the value
2514 token = pg_strtok(&tokenLength);
2515 length = atoui(token);
2517 token = pg_strtok(&tokenLength); /* read the '[' */
2518 if (token == NULL || token[0] != '[')
2519 elog(ERROR, "expected \"[\" to start datum, but got \"%s\"; length = %zu",
2520 token ? (const char *) token : "[NULL]", length);
2524 if (length > (Size) sizeof(Datum))
2525 elog(ERROR, "byval datum but length = %zu", length);
2527 s = (char *) (&res);
2528 for (i = 0; i < (Size) sizeof(Datum); i++)
2530 token = pg_strtok(&tokenLength);
2531 s[i] = (char) atoi(token);
2534 else if (length <= 0)
2538 s = (char *) palloc(length);
2539 for (i = 0; i < length; i++)
2541 token = pg_strtok(&tokenLength);
2542 s[i] = (char) atoi(token);
2544 res = PointerGetDatum(s);
2547 token = pg_strtok(&tokenLength); /* read the ']' */
2548 if (token == NULL || token[0] != ']')
2549 elog(ERROR, "expected \"]\" to end datum, but got \"%s\"; length = %zu",
2550 token ? (const char *) token : "[NULL]", length);
2556 * readAttrNumberCols
2559 readAttrNumberCols(int numCols)
2564 AttrNumber *attr_vals;
2569 attr_vals = (AttrNumber *) palloc(numCols * sizeof(AttrNumber));
2570 for (i = 0; i < numCols; i++)
2572 token = pg_strtok(&tokenLength);
2573 attr_vals[i] = atoi(token);
2583 readOidCols(int numCols)
2593 oid_vals = (Oid *) palloc(numCols * sizeof(Oid));
2594 for (i = 0; i < numCols; i++)
2596 token = pg_strtok(&tokenLength);
2597 oid_vals[i] = atooid(token);
2607 readIntCols(int numCols)
2617 int_vals = (int *) palloc(numCols * sizeof(int));
2618 for (i = 0; i < numCols; i++)
2620 token = pg_strtok(&tokenLength);
2621 int_vals[i] = atoi(token);
2631 readBoolCols(int numCols)
2641 bool_vals = (bool *) palloc(numCols * sizeof(bool));
2642 for (i = 0; i < numCols; i++)
2644 token = pg_strtok(&tokenLength);
2645 bool_vals[i] = strtobool(token);