1 /*-------------------------------------------------------------------------
4 * Reader functions for Postgres tree nodes.
6 * Portions Copyright (c) 1996-2019, 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 * debugging use. When reading a location field, we normally 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.
24 * However, if restore_location_fields is true, we do restore location
25 * fields from the string. This is currently intended only for use by the
26 * WRITE_READ_PARSE_PLAN_TREES test code, which doesn't want to cause
27 * any change in the node contents.
29 *-------------------------------------------------------------------------
36 #include "miscadmin.h"
37 #include "nodes/extensible.h"
38 #include "nodes/parsenodes.h"
39 #include "nodes/plannodes.h"
40 #include "nodes/readfuncs.h"
41 #include "utils/builtins.h"
45 * Macros to simplify reading of different kinds of fields. Use these
46 * wherever possible to reduce the chance for silly typos. Note that these
47 * hard-wire conventions about the names of the local variables in a Read
51 /* Macros for declaring appropriate local variables */
53 /* A few guys need only local_node */
54 #define READ_LOCALS_NO_FIELDS(nodeTypeName) \
55 nodeTypeName *local_node = makeNode(nodeTypeName)
57 /* And a few guys need only the pg_strtok support fields */
58 #define READ_TEMP_LOCALS() \
62 /* ... but most need both */
63 #define READ_LOCALS(nodeTypeName) \
64 READ_LOCALS_NO_FIELDS(nodeTypeName); \
67 /* Read an integer field (anything written as ":fldname %d") */
68 #define READ_INT_FIELD(fldname) \
69 token = pg_strtok(&length); /* skip :fldname */ \
70 token = pg_strtok(&length); /* get field value */ \
71 local_node->fldname = atoi(token)
73 /* Read an unsigned integer field (anything written as ":fldname %u") */
74 #define READ_UINT_FIELD(fldname) \
75 token = pg_strtok(&length); /* skip :fldname */ \
76 token = pg_strtok(&length); /* get field value */ \
77 local_node->fldname = atoui(token)
79 /* Read an unsigned integer field (anything written using UINT64_FORMAT) */
80 #define READ_UINT64_FIELD(fldname) \
81 token = pg_strtok(&length); /* skip :fldname */ \
82 token = pg_strtok(&length); /* get field value */ \
83 local_node->fldname = pg_strtouint64(token, NULL, 10)
85 /* Read a long integer field (anything written as ":fldname %ld") */
86 #define READ_LONG_FIELD(fldname) \
87 token = pg_strtok(&length); /* skip :fldname */ \
88 token = pg_strtok(&length); /* get field value */ \
89 local_node->fldname = atol(token)
91 /* Read an OID field (don't hard-wire assumption that OID is same as uint) */
92 #define READ_OID_FIELD(fldname) \
93 token = pg_strtok(&length); /* skip :fldname */ \
94 token = pg_strtok(&length); /* get field value */ \
95 local_node->fldname = atooid(token)
97 /* Read a char field (ie, one ascii character) */
98 #define READ_CHAR_FIELD(fldname) \
99 token = pg_strtok(&length); /* skip :fldname */ \
100 token = pg_strtok(&length); /* get field value */ \
101 /* avoid overhead of calling debackslash() for one char */ \
102 local_node->fldname = (length == 0) ? '\0' : (token[0] == '\\' ? token[1] : token[0])
104 /* Read an enumerated-type field that was written as an integer code */
105 #define READ_ENUM_FIELD(fldname, enumtype) \
106 token = pg_strtok(&length); /* skip :fldname */ \
107 token = pg_strtok(&length); /* get field value */ \
108 local_node->fldname = (enumtype) atoi(token)
110 /* Read a float field */
111 #define READ_FLOAT_FIELD(fldname) \
112 token = pg_strtok(&length); /* skip :fldname */ \
113 token = pg_strtok(&length); /* get field value */ \
114 local_node->fldname = atof(token)
116 /* Read a boolean field */
117 #define READ_BOOL_FIELD(fldname) \
118 token = pg_strtok(&length); /* skip :fldname */ \
119 token = pg_strtok(&length); /* get field value */ \
120 local_node->fldname = strtobool(token)
122 /* Read a character-string field */
123 #define READ_STRING_FIELD(fldname) \
124 token = pg_strtok(&length); /* skip :fldname */ \
125 token = pg_strtok(&length); /* get field value */ \
126 local_node->fldname = nullable_string(token, length)
128 /* Read a parse location field (and possibly throw away the value) */
129 #ifdef WRITE_READ_PARSE_PLAN_TREES
130 #define READ_LOCATION_FIELD(fldname) \
131 token = pg_strtok(&length); /* skip :fldname */ \
132 token = pg_strtok(&length); /* get field value */ \
133 local_node->fldname = restore_location_fields ? atoi(token) : -1
135 #define READ_LOCATION_FIELD(fldname) \
136 token = pg_strtok(&length); /* skip :fldname */ \
137 token = pg_strtok(&length); /* get field value */ \
138 (void) token; /* in case not used elsewhere */ \
139 local_node->fldname = -1 /* set field to "unknown" */
142 /* Read a Node field */
143 #define READ_NODE_FIELD(fldname) \
144 token = pg_strtok(&length); /* skip :fldname */ \
145 (void) token; /* in case not used elsewhere */ \
146 local_node->fldname = nodeRead(NULL, 0)
148 /* Read a bitmapset field */
149 #define READ_BITMAPSET_FIELD(fldname) \
150 token = pg_strtok(&length); /* skip :fldname */ \
151 (void) token; /* in case not used elsewhere */ \
152 local_node->fldname = _readBitmapset()
154 /* Read an attribute number array */
155 #define READ_ATTRNUMBER_ARRAY(fldname, len) \
156 token = pg_strtok(&length); /* skip :fldname */ \
157 local_node->fldname = readAttrNumberCols(len);
159 /* Read an oid array */
160 #define READ_OID_ARRAY(fldname, len) \
161 token = pg_strtok(&length); /* skip :fldname */ \
162 local_node->fldname = readOidCols(len);
164 /* Read an int array */
165 #define READ_INT_ARRAY(fldname, len) \
166 token = pg_strtok(&length); /* skip :fldname */ \
167 local_node->fldname = readIntCols(len);
169 /* Read a bool array */
170 #define READ_BOOL_ARRAY(fldname, len) \
171 token = pg_strtok(&length); /* skip :fldname */ \
172 local_node->fldname = readBoolCols(len);
175 #define READ_DONE() \
180 * NOTE: use atoi() to read values written with %d, or atoui() to read
181 * values written with %u in outfuncs.c. An exception is OID values,
182 * for which use atooid(). (As of 7.1, outfuncs.c writes OIDs as %u,
183 * but this will probably change in the future.)
185 #define atoui(x) ((unsigned int) strtoul((x), NULL, 10))
187 #define strtobool(x) ((*(x) == 't') ? true : false)
189 #define nullable_string(token,length) \
190 ((length) == 0 ? NULL : debackslash(token, length))
199 Bitmapset *result = NULL;
203 token = pg_strtok(&length);
205 elog(ERROR, "incomplete Bitmapset structure");
206 if (length != 1 || token[0] != '(')
207 elog(ERROR, "unrecognized token: \"%.*s\"", length, token);
209 token = pg_strtok(&length);
211 elog(ERROR, "incomplete Bitmapset structure");
212 if (length != 1 || token[0] != 'b')
213 elog(ERROR, "unrecognized token: \"%.*s\"", length, token);
220 token = pg_strtok(&length);
222 elog(ERROR, "unterminated Bitmapset structure");
223 if (length == 1 && token[0] == ')')
225 val = (int) strtol(token, &endptr, 10);
226 if (endptr != token + length)
227 elog(ERROR, "unrecognized integer: \"%.*s\"", length, token);
228 result = bms_add_member(result, val);
235 * for use by extensions which define extensible nodes
240 return _readBitmapset();
251 READ_ENUM_FIELD(commandType, CmdType);
252 READ_ENUM_FIELD(querySource, QuerySource);
253 local_node->queryId = UINT64CONST(0); /* not saved in output format */
254 READ_BOOL_FIELD(canSetTag);
255 READ_NODE_FIELD(utilityStmt);
256 READ_INT_FIELD(resultRelation);
257 READ_BOOL_FIELD(hasAggs);
258 READ_BOOL_FIELD(hasWindowFuncs);
259 READ_BOOL_FIELD(hasTargetSRFs);
260 READ_BOOL_FIELD(hasSubLinks);
261 READ_BOOL_FIELD(hasDistinctOn);
262 READ_BOOL_FIELD(hasRecursive);
263 READ_BOOL_FIELD(hasModifyingCTE);
264 READ_BOOL_FIELD(hasForUpdate);
265 READ_BOOL_FIELD(hasRowSecurity);
266 READ_NODE_FIELD(cteList);
267 READ_NODE_FIELD(rtable);
268 READ_NODE_FIELD(jointree);
269 READ_NODE_FIELD(targetList);
270 READ_ENUM_FIELD(override, OverridingKind);
271 READ_NODE_FIELD(onConflict);
272 READ_NODE_FIELD(returningList);
273 READ_NODE_FIELD(groupClause);
274 READ_NODE_FIELD(groupingSets);
275 READ_NODE_FIELD(havingQual);
276 READ_NODE_FIELD(windowClause);
277 READ_NODE_FIELD(distinctClause);
278 READ_NODE_FIELD(sortClause);
279 READ_NODE_FIELD(limitOffset);
280 READ_NODE_FIELD(limitCount);
281 READ_NODE_FIELD(rowMarks);
282 READ_NODE_FIELD(setOperations);
283 READ_NODE_FIELD(constraintDeps);
284 READ_NODE_FIELD(withCheckOptions);
285 READ_LOCATION_FIELD(stmt_location);
286 READ_LOCATION_FIELD(stmt_len);
295 _readNotifyStmt(void)
297 READ_LOCALS(NotifyStmt);
299 READ_STRING_FIELD(conditionname);
300 READ_STRING_FIELD(payload);
306 * _readDeclareCursorStmt
308 static DeclareCursorStmt *
309 _readDeclareCursorStmt(void)
311 READ_LOCALS(DeclareCursorStmt);
313 READ_STRING_FIELD(portalname);
314 READ_INT_FIELD(options);
315 READ_NODE_FIELD(query);
321 * _readWithCheckOption
323 static WithCheckOption *
324 _readWithCheckOption(void)
326 READ_LOCALS(WithCheckOption);
328 READ_ENUM_FIELD(kind, WCOKind);
329 READ_STRING_FIELD(relname);
330 READ_STRING_FIELD(polname);
331 READ_NODE_FIELD(qual);
332 READ_BOOL_FIELD(cascaded);
338 * _readSortGroupClause
340 static SortGroupClause *
341 _readSortGroupClause(void)
343 READ_LOCALS(SortGroupClause);
345 READ_UINT_FIELD(tleSortGroupRef);
346 READ_OID_FIELD(eqop);
347 READ_OID_FIELD(sortop);
348 READ_BOOL_FIELD(nulls_first);
349 READ_BOOL_FIELD(hashable);
358 _readGroupingSet(void)
360 READ_LOCALS(GroupingSet);
362 READ_ENUM_FIELD(kind, GroupingSetKind);
363 READ_NODE_FIELD(content);
364 READ_LOCATION_FIELD(location);
372 static WindowClause *
373 _readWindowClause(void)
375 READ_LOCALS(WindowClause);
377 READ_STRING_FIELD(name);
378 READ_STRING_FIELD(refname);
379 READ_NODE_FIELD(partitionClause);
380 READ_NODE_FIELD(orderClause);
381 READ_INT_FIELD(frameOptions);
382 READ_NODE_FIELD(startOffset);
383 READ_NODE_FIELD(endOffset);
384 READ_OID_FIELD(startInRangeFunc);
385 READ_OID_FIELD(endInRangeFunc);
386 READ_OID_FIELD(inRangeColl);
387 READ_BOOL_FIELD(inRangeAsc);
388 READ_BOOL_FIELD(inRangeNullsFirst);
389 READ_UINT_FIELD(winref);
390 READ_BOOL_FIELD(copiedOrder);
398 static RowMarkClause *
399 _readRowMarkClause(void)
401 READ_LOCALS(RowMarkClause);
403 READ_UINT_FIELD(rti);
404 READ_ENUM_FIELD(strength, LockClauseStrength);
405 READ_ENUM_FIELD(waitPolicy, LockWaitPolicy);
406 READ_BOOL_FIELD(pushedDown);
412 * _readCommonTableExpr
414 static CommonTableExpr *
415 _readCommonTableExpr(void)
417 READ_LOCALS(CommonTableExpr);
419 READ_STRING_FIELD(ctename);
420 READ_NODE_FIELD(aliascolnames);
421 READ_ENUM_FIELD(ctematerialized, CTEMaterialize);
422 READ_NODE_FIELD(ctequery);
423 READ_LOCATION_FIELD(location);
424 READ_BOOL_FIELD(cterecursive);
425 READ_INT_FIELD(cterefcount);
426 READ_NODE_FIELD(ctecolnames);
427 READ_NODE_FIELD(ctecoltypes);
428 READ_NODE_FIELD(ctecoltypmods);
429 READ_NODE_FIELD(ctecolcollations);
435 * _readSetOperationStmt
437 static SetOperationStmt *
438 _readSetOperationStmt(void)
440 READ_LOCALS(SetOperationStmt);
442 READ_ENUM_FIELD(op, SetOperation);
443 READ_BOOL_FIELD(all);
444 READ_NODE_FIELD(larg);
445 READ_NODE_FIELD(rarg);
446 READ_NODE_FIELD(colTypes);
447 READ_NODE_FIELD(colTypmods);
448 READ_NODE_FIELD(colCollations);
449 READ_NODE_FIELD(groupClauses);
456 * Stuff from primnodes.h.
464 READ_STRING_FIELD(aliasname);
465 READ_NODE_FIELD(colnames);
473 READ_LOCALS(RangeVar);
475 local_node->catalogname = NULL; /* not currently saved in output format */
477 READ_STRING_FIELD(schemaname);
478 READ_STRING_FIELD(relname);
479 READ_BOOL_FIELD(inh);
480 READ_CHAR_FIELD(relpersistence);
481 READ_NODE_FIELD(alias);
482 READ_LOCATION_FIELD(location);
493 READ_LOCALS(TableFunc);
495 READ_NODE_FIELD(ns_uris);
496 READ_NODE_FIELD(ns_names);
497 READ_NODE_FIELD(docexpr);
498 READ_NODE_FIELD(rowexpr);
499 READ_NODE_FIELD(colnames);
500 READ_NODE_FIELD(coltypes);
501 READ_NODE_FIELD(coltypmods);
502 READ_NODE_FIELD(colcollations);
503 READ_NODE_FIELD(colexprs);
504 READ_NODE_FIELD(coldefexprs);
505 READ_BITMAPSET_FIELD(notnulls);
506 READ_INT_FIELD(ordinalitycol);
507 READ_LOCATION_FIELD(location);
513 _readIntoClause(void)
515 READ_LOCALS(IntoClause);
517 READ_NODE_FIELD(rel);
518 READ_NODE_FIELD(colNames);
519 READ_STRING_FIELD(accessMethod);
520 READ_NODE_FIELD(options);
521 READ_ENUM_FIELD(onCommit, OnCommitAction);
522 READ_STRING_FIELD(tableSpaceName);
523 READ_NODE_FIELD(viewQuery);
524 READ_BOOL_FIELD(skipData);
537 READ_UINT_FIELD(varno);
538 READ_INT_FIELD(varattno);
539 READ_OID_FIELD(vartype);
540 READ_INT_FIELD(vartypmod);
541 READ_OID_FIELD(varcollid);
542 READ_UINT_FIELD(varlevelsup);
543 READ_UINT_FIELD(varnoold);
544 READ_INT_FIELD(varoattno);
545 READ_LOCATION_FIELD(location);
558 READ_OID_FIELD(consttype);
559 READ_INT_FIELD(consttypmod);
560 READ_OID_FIELD(constcollid);
561 READ_INT_FIELD(constlen);
562 READ_BOOL_FIELD(constbyval);
563 READ_BOOL_FIELD(constisnull);
564 READ_LOCATION_FIELD(location);
566 token = pg_strtok(&length); /* skip :constvalue */
567 if (local_node->constisnull)
568 token = pg_strtok(&length); /* skip "<>" */
570 local_node->constvalue = readDatum(local_node->constbyval);
583 READ_ENUM_FIELD(paramkind, ParamKind);
584 READ_INT_FIELD(paramid);
585 READ_OID_FIELD(paramtype);
586 READ_INT_FIELD(paramtypmod);
587 READ_OID_FIELD(paramcollid);
588 READ_LOCATION_FIELD(location);
601 READ_OID_FIELD(aggfnoid);
602 READ_OID_FIELD(aggtype);
603 READ_OID_FIELD(aggcollid);
604 READ_OID_FIELD(inputcollid);
605 READ_OID_FIELD(aggtranstype);
606 READ_NODE_FIELD(aggargtypes);
607 READ_NODE_FIELD(aggdirectargs);
608 READ_NODE_FIELD(args);
609 READ_NODE_FIELD(aggorder);
610 READ_NODE_FIELD(aggdistinct);
611 READ_NODE_FIELD(aggfilter);
612 READ_BOOL_FIELD(aggstar);
613 READ_BOOL_FIELD(aggvariadic);
614 READ_CHAR_FIELD(aggkind);
615 READ_UINT_FIELD(agglevelsup);
616 READ_ENUM_FIELD(aggsplit, AggSplit);
617 READ_LOCATION_FIELD(location);
625 static GroupingFunc *
626 _readGroupingFunc(void)
628 READ_LOCALS(GroupingFunc);
630 READ_NODE_FIELD(args);
631 READ_NODE_FIELD(refs);
632 READ_NODE_FIELD(cols);
633 READ_UINT_FIELD(agglevelsup);
634 READ_LOCATION_FIELD(location);
643 _readWindowFunc(void)
645 READ_LOCALS(WindowFunc);
647 READ_OID_FIELD(winfnoid);
648 READ_OID_FIELD(wintype);
649 READ_OID_FIELD(wincollid);
650 READ_OID_FIELD(inputcollid);
651 READ_NODE_FIELD(args);
652 READ_NODE_FIELD(aggfilter);
653 READ_UINT_FIELD(winref);
654 READ_BOOL_FIELD(winstar);
655 READ_BOOL_FIELD(winagg);
656 READ_LOCATION_FIELD(location);
662 * _readSubscriptingRef
664 static SubscriptingRef *
665 _readSubscriptingRef(void)
667 READ_LOCALS(SubscriptingRef);
669 READ_OID_FIELD(refcontainertype);
670 READ_OID_FIELD(refelemtype);
671 READ_INT_FIELD(reftypmod);
672 READ_OID_FIELD(refcollid);
673 READ_NODE_FIELD(refupperindexpr);
674 READ_NODE_FIELD(reflowerindexpr);
675 READ_NODE_FIELD(refexpr);
676 READ_NODE_FIELD(refassgnexpr);
687 READ_LOCALS(FuncExpr);
689 READ_OID_FIELD(funcid);
690 READ_OID_FIELD(funcresulttype);
691 READ_BOOL_FIELD(funcretset);
692 READ_BOOL_FIELD(funcvariadic);
693 READ_ENUM_FIELD(funcformat, CoercionForm);
694 READ_OID_FIELD(funccollid);
695 READ_OID_FIELD(inputcollid);
696 READ_NODE_FIELD(args);
697 READ_LOCATION_FIELD(location);
705 static NamedArgExpr *
706 _readNamedArgExpr(void)
708 READ_LOCALS(NamedArgExpr);
710 READ_NODE_FIELD(arg);
711 READ_STRING_FIELD(name);
712 READ_INT_FIELD(argnumber);
713 READ_LOCATION_FIELD(location);
726 READ_OID_FIELD(opno);
727 READ_OID_FIELD(opfuncid);
728 READ_OID_FIELD(opresulttype);
729 READ_BOOL_FIELD(opretset);
730 READ_OID_FIELD(opcollid);
731 READ_OID_FIELD(inputcollid);
732 READ_NODE_FIELD(args);
733 READ_LOCATION_FIELD(location);
741 static DistinctExpr *
742 _readDistinctExpr(void)
744 READ_LOCALS(DistinctExpr);
746 READ_OID_FIELD(opno);
747 READ_OID_FIELD(opfuncid);
748 READ_OID_FIELD(opresulttype);
749 READ_BOOL_FIELD(opretset);
750 READ_OID_FIELD(opcollid);
751 READ_OID_FIELD(inputcollid);
752 READ_NODE_FIELD(args);
753 READ_LOCATION_FIELD(location);
762 _readNullIfExpr(void)
764 READ_LOCALS(NullIfExpr);
766 READ_OID_FIELD(opno);
767 READ_OID_FIELD(opfuncid);
768 READ_OID_FIELD(opresulttype);
769 READ_BOOL_FIELD(opretset);
770 READ_OID_FIELD(opcollid);
771 READ_OID_FIELD(inputcollid);
772 READ_NODE_FIELD(args);
773 READ_LOCATION_FIELD(location);
779 * _readScalarArrayOpExpr
781 static ScalarArrayOpExpr *
782 _readScalarArrayOpExpr(void)
784 READ_LOCALS(ScalarArrayOpExpr);
786 READ_OID_FIELD(opno);
787 READ_OID_FIELD(opfuncid);
788 READ_BOOL_FIELD(useOr);
789 READ_OID_FIELD(inputcollid);
790 READ_NODE_FIELD(args);
791 READ_LOCATION_FIELD(location);
802 READ_LOCALS(BoolExpr);
804 /* do-it-yourself enum representation */
805 token = pg_strtok(&length); /* skip :boolop */
806 token = pg_strtok(&length); /* get field value */
807 if (strncmp(token, "and", 3) == 0)
808 local_node->boolop = AND_EXPR;
809 else if (strncmp(token, "or", 2) == 0)
810 local_node->boolop = OR_EXPR;
811 else if (strncmp(token, "not", 3) == 0)
812 local_node->boolop = NOT_EXPR;
814 elog(ERROR, "unrecognized boolop \"%.*s\"", length, token);
816 READ_NODE_FIELD(args);
817 READ_LOCATION_FIELD(location);
828 READ_LOCALS(SubLink);
830 READ_ENUM_FIELD(subLinkType, SubLinkType);
831 READ_INT_FIELD(subLinkId);
832 READ_NODE_FIELD(testexpr);
833 READ_NODE_FIELD(operName);
834 READ_NODE_FIELD(subselect);
835 READ_LOCATION_FIELD(location);
841 * _readSubPlan is not needed since it doesn't appear in stored rules.
848 _readFieldSelect(void)
850 READ_LOCALS(FieldSelect);
852 READ_NODE_FIELD(arg);
853 READ_INT_FIELD(fieldnum);
854 READ_OID_FIELD(resulttype);
855 READ_INT_FIELD(resulttypmod);
856 READ_OID_FIELD(resultcollid);
865 _readFieldStore(void)
867 READ_LOCALS(FieldStore);
869 READ_NODE_FIELD(arg);
870 READ_NODE_FIELD(newvals);
871 READ_NODE_FIELD(fieldnums);
872 READ_OID_FIELD(resulttype);
881 _readRelabelType(void)
883 READ_LOCALS(RelabelType);
885 READ_NODE_FIELD(arg);
886 READ_OID_FIELD(resulttype);
887 READ_INT_FIELD(resulttypmod);
888 READ_OID_FIELD(resultcollid);
889 READ_ENUM_FIELD(relabelformat, CoercionForm);
890 READ_LOCATION_FIELD(location);
899 _readCoerceViaIO(void)
901 READ_LOCALS(CoerceViaIO);
903 READ_NODE_FIELD(arg);
904 READ_OID_FIELD(resulttype);
905 READ_OID_FIELD(resultcollid);
906 READ_ENUM_FIELD(coerceformat, CoercionForm);
907 READ_LOCATION_FIELD(location);
913 * _readArrayCoerceExpr
915 static ArrayCoerceExpr *
916 _readArrayCoerceExpr(void)
918 READ_LOCALS(ArrayCoerceExpr);
920 READ_NODE_FIELD(arg);
921 READ_NODE_FIELD(elemexpr);
922 READ_OID_FIELD(resulttype);
923 READ_INT_FIELD(resulttypmod);
924 READ_OID_FIELD(resultcollid);
925 READ_ENUM_FIELD(coerceformat, CoercionForm);
926 READ_LOCATION_FIELD(location);
932 * _readConvertRowtypeExpr
934 static ConvertRowtypeExpr *
935 _readConvertRowtypeExpr(void)
937 READ_LOCALS(ConvertRowtypeExpr);
939 READ_NODE_FIELD(arg);
940 READ_OID_FIELD(resulttype);
941 READ_ENUM_FIELD(convertformat, CoercionForm);
942 READ_LOCATION_FIELD(location);
951 _readCollateExpr(void)
953 READ_LOCALS(CollateExpr);
955 READ_NODE_FIELD(arg);
956 READ_OID_FIELD(collOid);
957 READ_LOCATION_FIELD(location);
968 READ_LOCALS(CaseExpr);
970 READ_OID_FIELD(casetype);
971 READ_OID_FIELD(casecollid);
972 READ_NODE_FIELD(arg);
973 READ_NODE_FIELD(args);
974 READ_NODE_FIELD(defresult);
975 READ_LOCATION_FIELD(location);
986 READ_LOCALS(CaseWhen);
988 READ_NODE_FIELD(expr);
989 READ_NODE_FIELD(result);
990 READ_LOCATION_FIELD(location);
998 static CaseTestExpr *
999 _readCaseTestExpr(void)
1001 READ_LOCALS(CaseTestExpr);
1003 READ_OID_FIELD(typeId);
1004 READ_INT_FIELD(typeMod);
1005 READ_OID_FIELD(collation);
1014 _readArrayExpr(void)
1016 READ_LOCALS(ArrayExpr);
1018 READ_OID_FIELD(array_typeid);
1019 READ_OID_FIELD(array_collid);
1020 READ_OID_FIELD(element_typeid);
1021 READ_NODE_FIELD(elements);
1022 READ_BOOL_FIELD(multidims);
1023 READ_LOCATION_FIELD(location);
1034 READ_LOCALS(RowExpr);
1036 READ_NODE_FIELD(args);
1037 READ_OID_FIELD(row_typeid);
1038 READ_ENUM_FIELD(row_format, CoercionForm);
1039 READ_NODE_FIELD(colnames);
1040 READ_LOCATION_FIELD(location);
1046 * _readRowCompareExpr
1048 static RowCompareExpr *
1049 _readRowCompareExpr(void)
1051 READ_LOCALS(RowCompareExpr);
1053 READ_ENUM_FIELD(rctype, RowCompareType);
1054 READ_NODE_FIELD(opnos);
1055 READ_NODE_FIELD(opfamilies);
1056 READ_NODE_FIELD(inputcollids);
1057 READ_NODE_FIELD(largs);
1058 READ_NODE_FIELD(rargs);
1066 static CoalesceExpr *
1067 _readCoalesceExpr(void)
1069 READ_LOCALS(CoalesceExpr);
1071 READ_OID_FIELD(coalescetype);
1072 READ_OID_FIELD(coalescecollid);
1073 READ_NODE_FIELD(args);
1074 READ_LOCATION_FIELD(location);
1083 _readMinMaxExpr(void)
1085 READ_LOCALS(MinMaxExpr);
1087 READ_OID_FIELD(minmaxtype);
1088 READ_OID_FIELD(minmaxcollid);
1089 READ_OID_FIELD(inputcollid);
1090 READ_ENUM_FIELD(op, MinMaxOp);
1091 READ_NODE_FIELD(args);
1092 READ_LOCATION_FIELD(location);
1098 * _readSQLValueFunction
1100 static SQLValueFunction *
1101 _readSQLValueFunction(void)
1103 READ_LOCALS(SQLValueFunction);
1105 READ_ENUM_FIELD(op, SQLValueFunctionOp);
1106 READ_OID_FIELD(type);
1107 READ_INT_FIELD(typmod);
1108 READ_LOCATION_FIELD(location);
1119 READ_LOCALS(XmlExpr);
1121 READ_ENUM_FIELD(op, XmlExprOp);
1122 READ_STRING_FIELD(name);
1123 READ_NODE_FIELD(named_args);
1124 READ_NODE_FIELD(arg_names);
1125 READ_NODE_FIELD(args);
1126 READ_ENUM_FIELD(xmloption, XmlOptionType);
1127 READ_OID_FIELD(type);
1128 READ_INT_FIELD(typmod);
1129 READ_LOCATION_FIELD(location);
1140 READ_LOCALS(NullTest);
1142 READ_NODE_FIELD(arg);
1143 READ_ENUM_FIELD(nulltesttype, NullTestType);
1144 READ_BOOL_FIELD(argisrow);
1145 READ_LOCATION_FIELD(location);
1153 static BooleanTest *
1154 _readBooleanTest(void)
1156 READ_LOCALS(BooleanTest);
1158 READ_NODE_FIELD(arg);
1159 READ_ENUM_FIELD(booltesttype, BoolTestType);
1160 READ_LOCATION_FIELD(location);
1166 * _readCoerceToDomain
1168 static CoerceToDomain *
1169 _readCoerceToDomain(void)
1171 READ_LOCALS(CoerceToDomain);
1173 READ_NODE_FIELD(arg);
1174 READ_OID_FIELD(resulttype);
1175 READ_INT_FIELD(resulttypmod);
1176 READ_OID_FIELD(resultcollid);
1177 READ_ENUM_FIELD(coercionformat, CoercionForm);
1178 READ_LOCATION_FIELD(location);
1184 * _readCoerceToDomainValue
1186 static CoerceToDomainValue *
1187 _readCoerceToDomainValue(void)
1189 READ_LOCALS(CoerceToDomainValue);
1191 READ_OID_FIELD(typeId);
1192 READ_INT_FIELD(typeMod);
1193 READ_OID_FIELD(collation);
1194 READ_LOCATION_FIELD(location);
1202 static SetToDefault *
1203 _readSetToDefault(void)
1205 READ_LOCALS(SetToDefault);
1207 READ_OID_FIELD(typeId);
1208 READ_INT_FIELD(typeMod);
1209 READ_OID_FIELD(collation);
1210 READ_LOCATION_FIELD(location);
1216 * _readCurrentOfExpr
1218 static CurrentOfExpr *
1219 _readCurrentOfExpr(void)
1221 READ_LOCALS(CurrentOfExpr);
1223 READ_UINT_FIELD(cvarno);
1224 READ_STRING_FIELD(cursor_name);
1225 READ_INT_FIELD(cursor_param);
1231 * _readNextValueExpr
1233 static NextValueExpr *
1234 _readNextValueExpr(void)
1236 READ_LOCALS(NextValueExpr);
1238 READ_OID_FIELD(seqid);
1239 READ_OID_FIELD(typeId);
1245 * _readInferenceElem
1247 static InferenceElem *
1248 _readInferenceElem(void)
1250 READ_LOCALS(InferenceElem);
1252 READ_NODE_FIELD(expr);
1253 READ_OID_FIELD(infercollid);
1254 READ_OID_FIELD(inferopclass);
1262 static TargetEntry *
1263 _readTargetEntry(void)
1265 READ_LOCALS(TargetEntry);
1267 READ_NODE_FIELD(expr);
1268 READ_INT_FIELD(resno);
1269 READ_STRING_FIELD(resname);
1270 READ_UINT_FIELD(ressortgroupref);
1271 READ_OID_FIELD(resorigtbl);
1272 READ_INT_FIELD(resorigcol);
1273 READ_BOOL_FIELD(resjunk);
1281 static RangeTblRef *
1282 _readRangeTblRef(void)
1284 READ_LOCALS(RangeTblRef);
1286 READ_INT_FIELD(rtindex);
1297 READ_LOCALS(JoinExpr);
1299 READ_ENUM_FIELD(jointype, JoinType);
1300 READ_BOOL_FIELD(isNatural);
1301 READ_NODE_FIELD(larg);
1302 READ_NODE_FIELD(rarg);
1303 READ_NODE_FIELD(usingClause);
1304 READ_NODE_FIELD(quals);
1305 READ_NODE_FIELD(alias);
1306 READ_INT_FIELD(rtindex);
1317 READ_LOCALS(FromExpr);
1319 READ_NODE_FIELD(fromlist);
1320 READ_NODE_FIELD(quals);
1326 * _readOnConflictExpr
1328 static OnConflictExpr *
1329 _readOnConflictExpr(void)
1331 READ_LOCALS(OnConflictExpr);
1333 READ_ENUM_FIELD(action, OnConflictAction);
1334 READ_NODE_FIELD(arbiterElems);
1335 READ_NODE_FIELD(arbiterWhere);
1336 READ_OID_FIELD(constraint);
1337 READ_NODE_FIELD(onConflictSet);
1338 READ_NODE_FIELD(onConflictWhere);
1339 READ_INT_FIELD(exclRelIndex);
1340 READ_NODE_FIELD(exclRelTlist);
1346 * Stuff from parsenodes.h.
1350 * _readRangeTblEntry
1352 static RangeTblEntry *
1353 _readRangeTblEntry(void)
1355 READ_LOCALS(RangeTblEntry);
1357 /* put alias + eref first to make dump more legible */
1358 READ_NODE_FIELD(alias);
1359 READ_NODE_FIELD(eref);
1360 READ_ENUM_FIELD(rtekind, RTEKind);
1362 switch (local_node->rtekind)
1365 READ_OID_FIELD(relid);
1366 READ_CHAR_FIELD(relkind);
1367 READ_INT_FIELD(rellockmode);
1368 READ_NODE_FIELD(tablesample);
1371 READ_NODE_FIELD(subquery);
1372 READ_BOOL_FIELD(security_barrier);
1375 READ_ENUM_FIELD(jointype, JoinType);
1376 READ_NODE_FIELD(joinaliasvars);
1379 READ_NODE_FIELD(functions);
1380 READ_BOOL_FIELD(funcordinality);
1383 READ_NODE_FIELD(tablefunc);
1384 /* The RTE must have a copy of the column type info, if any */
1385 if (local_node->tablefunc)
1387 TableFunc *tf = local_node->tablefunc;
1389 local_node->coltypes = tf->coltypes;
1390 local_node->coltypmods = tf->coltypmods;
1391 local_node->colcollations = tf->colcollations;
1395 READ_NODE_FIELD(values_lists);
1396 READ_NODE_FIELD(coltypes);
1397 READ_NODE_FIELD(coltypmods);
1398 READ_NODE_FIELD(colcollations);
1401 READ_STRING_FIELD(ctename);
1402 READ_UINT_FIELD(ctelevelsup);
1403 READ_BOOL_FIELD(self_reference);
1404 READ_NODE_FIELD(coltypes);
1405 READ_NODE_FIELD(coltypmods);
1406 READ_NODE_FIELD(colcollations);
1408 case RTE_NAMEDTUPLESTORE:
1409 READ_STRING_FIELD(enrname);
1410 READ_FLOAT_FIELD(enrtuples);
1411 READ_OID_FIELD(relid);
1412 READ_NODE_FIELD(coltypes);
1413 READ_NODE_FIELD(coltypmods);
1414 READ_NODE_FIELD(colcollations);
1417 /* no extra fields */
1420 elog(ERROR, "unrecognized RTE kind: %d",
1421 (int) local_node->rtekind);
1425 READ_BOOL_FIELD(lateral);
1426 READ_BOOL_FIELD(inh);
1427 READ_BOOL_FIELD(inFromCl);
1428 READ_UINT_FIELD(requiredPerms);
1429 READ_OID_FIELD(checkAsUser);
1430 READ_BITMAPSET_FIELD(selectedCols);
1431 READ_BITMAPSET_FIELD(insertedCols);
1432 READ_BITMAPSET_FIELD(updatedCols);
1433 READ_BITMAPSET_FIELD(extraUpdatedCols);
1434 READ_NODE_FIELD(securityQuals);
1440 * _readRangeTblFunction
1442 static RangeTblFunction *
1443 _readRangeTblFunction(void)
1445 READ_LOCALS(RangeTblFunction);
1447 READ_NODE_FIELD(funcexpr);
1448 READ_INT_FIELD(funccolcount);
1449 READ_NODE_FIELD(funccolnames);
1450 READ_NODE_FIELD(funccoltypes);
1451 READ_NODE_FIELD(funccoltypmods);
1452 READ_NODE_FIELD(funccolcollations);
1453 READ_BITMAPSET_FIELD(funcparams);
1459 * _readTableSampleClause
1461 static TableSampleClause *
1462 _readTableSampleClause(void)
1464 READ_LOCALS(TableSampleClause);
1466 READ_OID_FIELD(tsmhandler);
1467 READ_NODE_FIELD(args);
1468 READ_NODE_FIELD(repeatable);
1479 READ_LOCALS(DefElem);
1481 READ_STRING_FIELD(defnamespace);
1482 READ_STRING_FIELD(defname);
1483 READ_NODE_FIELD(arg);
1484 READ_ENUM_FIELD(defaction, DefElemAction);
1485 READ_LOCATION_FIELD(location);
1491 * Stuff from plannodes.h.
1497 static PlannedStmt *
1498 _readPlannedStmt(void)
1500 READ_LOCALS(PlannedStmt);
1502 READ_ENUM_FIELD(commandType, CmdType);
1503 READ_UINT64_FIELD(queryId);
1504 READ_BOOL_FIELD(hasReturning);
1505 READ_BOOL_FIELD(hasModifyingCTE);
1506 READ_BOOL_FIELD(canSetTag);
1507 READ_BOOL_FIELD(transientPlan);
1508 READ_BOOL_FIELD(dependsOnRole);
1509 READ_BOOL_FIELD(parallelModeNeeded);
1510 READ_INT_FIELD(jitFlags);
1511 READ_NODE_FIELD(planTree);
1512 READ_NODE_FIELD(rtable);
1513 READ_NODE_FIELD(resultRelations);
1514 READ_NODE_FIELD(rootResultRelations);
1515 READ_NODE_FIELD(subplans);
1516 READ_BITMAPSET_FIELD(rewindPlanIDs);
1517 READ_NODE_FIELD(rowMarks);
1518 READ_NODE_FIELD(relationOids);
1519 READ_NODE_FIELD(invalItems);
1520 READ_NODE_FIELD(paramExecTypes);
1521 READ_NODE_FIELD(utilityStmt);
1522 READ_LOCATION_FIELD(stmt_location);
1523 READ_LOCATION_FIELD(stmt_len);
1530 * Assign the basic stuff of all nodes that inherit from Plan
1533 ReadCommonPlan(Plan *local_node)
1537 READ_FLOAT_FIELD(startup_cost);
1538 READ_FLOAT_FIELD(total_cost);
1539 READ_FLOAT_FIELD(plan_rows);
1540 READ_INT_FIELD(plan_width);
1541 READ_BOOL_FIELD(parallel_aware);
1542 READ_BOOL_FIELD(parallel_safe);
1543 READ_INT_FIELD(plan_node_id);
1544 READ_NODE_FIELD(targetlist);
1545 READ_NODE_FIELD(qual);
1546 READ_NODE_FIELD(lefttree);
1547 READ_NODE_FIELD(righttree);
1548 READ_NODE_FIELD(initPlan);
1549 READ_BITMAPSET_FIELD(extParam);
1550 READ_BITMAPSET_FIELD(allParam);
1559 READ_LOCALS_NO_FIELDS(Plan);
1561 ReadCommonPlan(local_node);
1572 READ_LOCALS(Result);
1574 ReadCommonPlan(&local_node->plan);
1576 READ_NODE_FIELD(resconstantqual);
1585 _readProjectSet(void)
1587 READ_LOCALS_NO_FIELDS(ProjectSet);
1589 ReadCommonPlan(&local_node->plan);
1597 static ModifyTable *
1598 _readModifyTable(void)
1600 READ_LOCALS(ModifyTable);
1602 ReadCommonPlan(&local_node->plan);
1604 READ_ENUM_FIELD(operation, CmdType);
1605 READ_BOOL_FIELD(canSetTag);
1606 READ_UINT_FIELD(nominalRelation);
1607 READ_UINT_FIELD(rootRelation);
1608 READ_BOOL_FIELD(partColsUpdated);
1609 READ_NODE_FIELD(resultRelations);
1610 READ_INT_FIELD(resultRelIndex);
1611 READ_INT_FIELD(rootResultRelIndex);
1612 READ_NODE_FIELD(plans);
1613 READ_NODE_FIELD(withCheckOptionLists);
1614 READ_NODE_FIELD(returningLists);
1615 READ_NODE_FIELD(fdwPrivLists);
1616 READ_BITMAPSET_FIELD(fdwDirectModifyPlans);
1617 READ_NODE_FIELD(rowMarks);
1618 READ_INT_FIELD(epqParam);
1619 READ_ENUM_FIELD(onConflictAction, OnConflictAction);
1620 READ_NODE_FIELD(arbiterIndexes);
1621 READ_NODE_FIELD(onConflictSet);
1622 READ_NODE_FIELD(onConflictWhere);
1623 READ_UINT_FIELD(exclRelRTI);
1624 READ_NODE_FIELD(exclRelTlist);
1635 READ_LOCALS(Append);
1637 ReadCommonPlan(&local_node->plan);
1639 READ_NODE_FIELD(appendplans);
1640 READ_INT_FIELD(first_partial_plan);
1641 READ_NODE_FIELD(part_prune_info);
1649 static MergeAppend *
1650 _readMergeAppend(void)
1652 READ_LOCALS(MergeAppend);
1654 ReadCommonPlan(&local_node->plan);
1656 READ_NODE_FIELD(mergeplans);
1657 READ_INT_FIELD(numCols);
1658 READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numCols);
1659 READ_OID_ARRAY(sortOperators, local_node->numCols);
1660 READ_OID_ARRAY(collations, local_node->numCols);
1661 READ_BOOL_ARRAY(nullsFirst, local_node->numCols);
1662 READ_NODE_FIELD(part_prune_info);
1668 * _readRecursiveUnion
1670 static RecursiveUnion *
1671 _readRecursiveUnion(void)
1673 READ_LOCALS(RecursiveUnion);
1675 ReadCommonPlan(&local_node->plan);
1677 READ_INT_FIELD(wtParam);
1678 READ_INT_FIELD(numCols);
1679 READ_ATTRNUMBER_ARRAY(dupColIdx, local_node->numCols);
1680 READ_OID_ARRAY(dupOperators, local_node->numCols);
1681 READ_OID_ARRAY(dupCollations, local_node->numCols);
1682 READ_LONG_FIELD(numGroups);
1691 _readBitmapAnd(void)
1693 READ_LOCALS(BitmapAnd);
1695 ReadCommonPlan(&local_node->plan);
1697 READ_NODE_FIELD(bitmapplans);
1708 READ_LOCALS(BitmapOr);
1710 ReadCommonPlan(&local_node->plan);
1712 READ_BOOL_FIELD(isshared);
1713 READ_NODE_FIELD(bitmapplans);
1720 * Assign the basic stuff of all nodes that inherit from Scan
1723 ReadCommonScan(Scan *local_node)
1727 ReadCommonPlan(&local_node->plan);
1729 READ_UINT_FIELD(scanrelid);
1738 READ_LOCALS_NO_FIELDS(Scan);
1740 ReadCommonScan(local_node);
1751 READ_LOCALS_NO_FIELDS(SeqScan);
1753 ReadCommonScan(local_node);
1762 _readSampleScan(void)
1764 READ_LOCALS(SampleScan);
1766 ReadCommonScan(&local_node->scan);
1768 READ_NODE_FIELD(tablesample);
1777 _readIndexScan(void)
1779 READ_LOCALS(IndexScan);
1781 ReadCommonScan(&local_node->scan);
1783 READ_OID_FIELD(indexid);
1784 READ_NODE_FIELD(indexqual);
1785 READ_NODE_FIELD(indexqualorig);
1786 READ_NODE_FIELD(indexorderby);
1787 READ_NODE_FIELD(indexorderbyorig);
1788 READ_NODE_FIELD(indexorderbyops);
1789 READ_ENUM_FIELD(indexorderdir, ScanDirection);
1795 * _readIndexOnlyScan
1797 static IndexOnlyScan *
1798 _readIndexOnlyScan(void)
1800 READ_LOCALS(IndexOnlyScan);
1802 ReadCommonScan(&local_node->scan);
1804 READ_OID_FIELD(indexid);
1805 READ_NODE_FIELD(indexqual);
1806 READ_NODE_FIELD(indexorderby);
1807 READ_NODE_FIELD(indextlist);
1808 READ_ENUM_FIELD(indexorderdir, ScanDirection);
1814 * _readBitmapIndexScan
1816 static BitmapIndexScan *
1817 _readBitmapIndexScan(void)
1819 READ_LOCALS(BitmapIndexScan);
1821 ReadCommonScan(&local_node->scan);
1823 READ_OID_FIELD(indexid);
1824 READ_BOOL_FIELD(isshared);
1825 READ_NODE_FIELD(indexqual);
1826 READ_NODE_FIELD(indexqualorig);
1832 * _readBitmapHeapScan
1834 static BitmapHeapScan *
1835 _readBitmapHeapScan(void)
1837 READ_LOCALS(BitmapHeapScan);
1839 ReadCommonScan(&local_node->scan);
1841 READ_NODE_FIELD(bitmapqualorig);
1852 READ_LOCALS(TidScan);
1854 ReadCommonScan(&local_node->scan);
1856 READ_NODE_FIELD(tidquals);
1864 static SubqueryScan *
1865 _readSubqueryScan(void)
1867 READ_LOCALS(SubqueryScan);
1869 ReadCommonScan(&local_node->scan);
1871 READ_NODE_FIELD(subplan);
1879 static FunctionScan *
1880 _readFunctionScan(void)
1882 READ_LOCALS(FunctionScan);
1884 ReadCommonScan(&local_node->scan);
1886 READ_NODE_FIELD(functions);
1887 READ_BOOL_FIELD(funcordinality);
1896 _readValuesScan(void)
1898 READ_LOCALS(ValuesScan);
1900 ReadCommonScan(&local_node->scan);
1902 READ_NODE_FIELD(values_lists);
1908 * _readTableFuncScan
1910 static TableFuncScan *
1911 _readTableFuncScan(void)
1913 READ_LOCALS(TableFuncScan);
1915 ReadCommonScan(&local_node->scan);
1917 READ_NODE_FIELD(tablefunc);
1928 READ_LOCALS(CteScan);
1930 ReadCommonScan(&local_node->scan);
1932 READ_INT_FIELD(ctePlanId);
1933 READ_INT_FIELD(cteParam);
1939 * _readNamedTuplestoreScan
1941 static NamedTuplestoreScan *
1942 _readNamedTuplestoreScan(void)
1944 READ_LOCALS(NamedTuplestoreScan);
1946 ReadCommonScan(&local_node->scan);
1948 READ_STRING_FIELD(enrname);
1954 * _readWorkTableScan
1956 static WorkTableScan *
1957 _readWorkTableScan(void)
1959 READ_LOCALS(WorkTableScan);
1961 ReadCommonScan(&local_node->scan);
1963 READ_INT_FIELD(wtParam);
1971 static ForeignScan *
1972 _readForeignScan(void)
1974 READ_LOCALS(ForeignScan);
1976 ReadCommonScan(&local_node->scan);
1978 READ_ENUM_FIELD(operation, CmdType);
1979 READ_OID_FIELD(fs_server);
1980 READ_NODE_FIELD(fdw_exprs);
1981 READ_NODE_FIELD(fdw_private);
1982 READ_NODE_FIELD(fdw_scan_tlist);
1983 READ_NODE_FIELD(fdw_recheck_quals);
1984 READ_BITMAPSET_FIELD(fs_relids);
1985 READ_BOOL_FIELD(fsSystemCol);
1994 _readCustomScan(void)
1996 READ_LOCALS(CustomScan);
1998 const CustomScanMethods *methods;
2000 ReadCommonScan(&local_node->scan);
2002 READ_UINT_FIELD(flags);
2003 READ_NODE_FIELD(custom_plans);
2004 READ_NODE_FIELD(custom_exprs);
2005 READ_NODE_FIELD(custom_private);
2006 READ_NODE_FIELD(custom_scan_tlist);
2007 READ_BITMAPSET_FIELD(custom_relids);
2009 /* Lookup CustomScanMethods by CustomName */
2010 token = pg_strtok(&length); /* skip methods: */
2011 token = pg_strtok(&length); /* CustomName */
2012 custom_name = nullable_string(token, length);
2013 methods = GetCustomScanMethods(custom_name, false);
2014 local_node->methods = methods;
2021 * Assign the basic stuff of all nodes that inherit from Join
2024 ReadCommonJoin(Join *local_node)
2028 ReadCommonPlan(&local_node->plan);
2030 READ_ENUM_FIELD(jointype, JoinType);
2031 READ_BOOL_FIELD(inner_unique);
2032 READ_NODE_FIELD(joinqual);
2041 READ_LOCALS_NO_FIELDS(Join);
2043 ReadCommonJoin(local_node);
2054 READ_LOCALS(NestLoop);
2056 ReadCommonJoin(&local_node->join);
2058 READ_NODE_FIELD(nestParams);
2067 _readMergeJoin(void)
2071 READ_LOCALS(MergeJoin);
2073 ReadCommonJoin(&local_node->join);
2075 READ_BOOL_FIELD(skip_mark_restore);
2076 READ_NODE_FIELD(mergeclauses);
2078 numCols = list_length(local_node->mergeclauses);
2080 READ_OID_ARRAY(mergeFamilies, numCols);
2081 READ_OID_ARRAY(mergeCollations, numCols);
2082 READ_INT_ARRAY(mergeStrategies, numCols);
2083 READ_BOOL_ARRAY(mergeNullsFirst, numCols);
2094 READ_LOCALS(HashJoin);
2096 ReadCommonJoin(&local_node->join);
2098 READ_NODE_FIELD(hashclauses);
2099 READ_NODE_FIELD(hashoperators);
2100 READ_NODE_FIELD(hashcollations);
2101 READ_NODE_FIELD(hashkeys);
2112 READ_LOCALS_NO_FIELDS(Material);
2114 ReadCommonPlan(&local_node->plan);
2127 ReadCommonPlan(&local_node->plan);
2129 READ_INT_FIELD(numCols);
2130 READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numCols);
2131 READ_OID_ARRAY(sortOperators, local_node->numCols);
2132 READ_OID_ARRAY(collations, local_node->numCols);
2133 READ_BOOL_ARRAY(nullsFirst, local_node->numCols);
2146 ReadCommonPlan(&local_node->plan);
2148 READ_INT_FIELD(numCols);
2149 READ_ATTRNUMBER_ARRAY(grpColIdx, local_node->numCols);
2150 READ_OID_ARRAY(grpOperators, local_node->numCols);
2151 READ_OID_ARRAY(grpCollations, local_node->numCols);
2164 ReadCommonPlan(&local_node->plan);
2166 READ_ENUM_FIELD(aggstrategy, AggStrategy);
2167 READ_ENUM_FIELD(aggsplit, AggSplit);
2168 READ_INT_FIELD(numCols);
2169 READ_ATTRNUMBER_ARRAY(grpColIdx, local_node->numCols);
2170 READ_OID_ARRAY(grpOperators, local_node->numCols);
2171 READ_OID_ARRAY(grpCollations, local_node->numCols);
2172 READ_LONG_FIELD(numGroups);
2173 READ_BITMAPSET_FIELD(aggParams);
2174 READ_NODE_FIELD(groupingSets);
2175 READ_NODE_FIELD(chain);
2184 _readWindowAgg(void)
2186 READ_LOCALS(WindowAgg);
2188 ReadCommonPlan(&local_node->plan);
2190 READ_UINT_FIELD(winref);
2191 READ_INT_FIELD(partNumCols);
2192 READ_ATTRNUMBER_ARRAY(partColIdx, local_node->partNumCols);
2193 READ_OID_ARRAY(partOperators, local_node->partNumCols);
2194 READ_OID_ARRAY(partCollations, local_node->partNumCols);
2195 READ_INT_FIELD(ordNumCols);
2196 READ_ATTRNUMBER_ARRAY(ordColIdx, local_node->ordNumCols);
2197 READ_OID_ARRAY(ordOperators, local_node->ordNumCols);
2198 READ_OID_ARRAY(ordCollations, local_node->ordNumCols);
2199 READ_INT_FIELD(frameOptions);
2200 READ_NODE_FIELD(startOffset);
2201 READ_NODE_FIELD(endOffset);
2202 READ_OID_FIELD(startInRangeFunc);
2203 READ_OID_FIELD(endInRangeFunc);
2204 READ_OID_FIELD(inRangeColl);
2205 READ_BOOL_FIELD(inRangeAsc);
2206 READ_BOOL_FIELD(inRangeNullsFirst);
2217 READ_LOCALS(Unique);
2219 ReadCommonPlan(&local_node->plan);
2221 READ_INT_FIELD(numCols);
2222 READ_ATTRNUMBER_ARRAY(uniqColIdx, local_node->numCols);
2223 READ_OID_ARRAY(uniqOperators, local_node->numCols);
2224 READ_OID_ARRAY(uniqCollations, local_node->numCols);
2235 READ_LOCALS(Gather);
2237 ReadCommonPlan(&local_node->plan);
2239 READ_INT_FIELD(num_workers);
2240 READ_INT_FIELD(rescan_param);
2241 READ_BOOL_FIELD(single_copy);
2242 READ_BOOL_FIELD(invisible);
2243 READ_BITMAPSET_FIELD(initParam);
2251 static GatherMerge *
2252 _readGatherMerge(void)
2254 READ_LOCALS(GatherMerge);
2256 ReadCommonPlan(&local_node->plan);
2258 READ_INT_FIELD(num_workers);
2259 READ_INT_FIELD(rescan_param);
2260 READ_INT_FIELD(numCols);
2261 READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numCols);
2262 READ_OID_ARRAY(sortOperators, local_node->numCols);
2263 READ_OID_ARRAY(collations, local_node->numCols);
2264 READ_BOOL_ARRAY(nullsFirst, local_node->numCols);
2265 READ_BITMAPSET_FIELD(initParam);
2278 ReadCommonPlan(&local_node->plan);
2280 READ_NODE_FIELD(hashkeys);
2281 READ_OID_FIELD(skewTable);
2282 READ_INT_FIELD(skewColumn);
2283 READ_BOOL_FIELD(skewInherit);
2284 READ_FLOAT_FIELD(rows_total);
2297 ReadCommonPlan(&local_node->plan);
2299 READ_ENUM_FIELD(cmd, SetOpCmd);
2300 READ_ENUM_FIELD(strategy, SetOpStrategy);
2301 READ_INT_FIELD(numCols);
2302 READ_ATTRNUMBER_ARRAY(dupColIdx, local_node->numCols);
2303 READ_OID_ARRAY(dupOperators, local_node->numCols);
2304 READ_OID_ARRAY(dupCollations, local_node->numCols);
2305 READ_INT_FIELD(flagColIdx);
2306 READ_INT_FIELD(firstFlag);
2307 READ_LONG_FIELD(numGroups);
2318 READ_LOCALS(LockRows);
2320 ReadCommonPlan(&local_node->plan);
2322 READ_NODE_FIELD(rowMarks);
2323 READ_INT_FIELD(epqParam);
2336 ReadCommonPlan(&local_node->plan);
2338 READ_NODE_FIELD(limitOffset);
2339 READ_NODE_FIELD(limitCount);
2345 * _readNestLoopParam
2347 static NestLoopParam *
2348 _readNestLoopParam(void)
2350 READ_LOCALS(NestLoopParam);
2352 READ_INT_FIELD(paramno);
2353 READ_NODE_FIELD(paramval);
2361 static PlanRowMark *
2362 _readPlanRowMark(void)
2364 READ_LOCALS(PlanRowMark);
2366 READ_UINT_FIELD(rti);
2367 READ_UINT_FIELD(prti);
2368 READ_UINT_FIELD(rowmarkId);
2369 READ_ENUM_FIELD(markType, RowMarkType);
2370 READ_INT_FIELD(allMarkTypes);
2371 READ_ENUM_FIELD(strength, LockClauseStrength);
2372 READ_ENUM_FIELD(waitPolicy, LockWaitPolicy);
2373 READ_BOOL_FIELD(isParent);
2378 static PartitionPruneInfo *
2379 _readPartitionPruneInfo(void)
2381 READ_LOCALS(PartitionPruneInfo);
2383 READ_NODE_FIELD(prune_infos);
2384 READ_BITMAPSET_FIELD(other_subplans);
2389 static PartitionedRelPruneInfo *
2390 _readPartitionedRelPruneInfo(void)
2392 READ_LOCALS(PartitionedRelPruneInfo);
2394 READ_UINT_FIELD(rtindex);
2395 READ_BITMAPSET_FIELD(present_parts);
2396 READ_INT_FIELD(nparts);
2397 READ_INT_ARRAY(subplan_map, local_node->nparts);
2398 READ_INT_ARRAY(subpart_map, local_node->nparts);
2399 READ_OID_ARRAY(relid_map, local_node->nparts);
2400 READ_NODE_FIELD(initial_pruning_steps);
2401 READ_NODE_FIELD(exec_pruning_steps);
2402 READ_BITMAPSET_FIELD(execparamids);
2407 static PartitionPruneStepOp *
2408 _readPartitionPruneStepOp(void)
2410 READ_LOCALS(PartitionPruneStepOp);
2412 READ_INT_FIELD(step.step_id);
2413 READ_INT_FIELD(opstrategy);
2414 READ_NODE_FIELD(exprs);
2415 READ_NODE_FIELD(cmpfns);
2416 READ_BITMAPSET_FIELD(nullkeys);
2421 static PartitionPruneStepCombine *
2422 _readPartitionPruneStepCombine(void)
2424 READ_LOCALS(PartitionPruneStepCombine);
2426 READ_INT_FIELD(step.step_id);
2427 READ_ENUM_FIELD(combineOp, PartitionPruneCombineOp);
2428 READ_NODE_FIELD(source_stepids);
2434 * _readPlanInvalItem
2436 static PlanInvalItem *
2437 _readPlanInvalItem(void)
2439 READ_LOCALS(PlanInvalItem);
2441 READ_INT_FIELD(cacheId);
2442 READ_UINT_FIELD(hashValue);
2453 READ_LOCALS(SubPlan);
2455 READ_ENUM_FIELD(subLinkType, SubLinkType);
2456 READ_NODE_FIELD(testexpr);
2457 READ_NODE_FIELD(paramIds);
2458 READ_INT_FIELD(plan_id);
2459 READ_STRING_FIELD(plan_name);
2460 READ_OID_FIELD(firstColType);
2461 READ_INT_FIELD(firstColTypmod);
2462 READ_OID_FIELD(firstColCollation);
2463 READ_BOOL_FIELD(useHashTable);
2464 READ_BOOL_FIELD(unknownEqFalse);
2465 READ_BOOL_FIELD(parallel_safe);
2466 READ_NODE_FIELD(setParam);
2467 READ_NODE_FIELD(parParam);
2468 READ_NODE_FIELD(args);
2469 READ_FLOAT_FIELD(startup_cost);
2470 READ_FLOAT_FIELD(per_call_cost);
2476 * _readAlternativeSubPlan
2478 static AlternativeSubPlan *
2479 _readAlternativeSubPlan(void)
2481 READ_LOCALS(AlternativeSubPlan);
2483 READ_NODE_FIELD(subplans);
2489 * _readExtensibleNode
2491 static ExtensibleNode *
2492 _readExtensibleNode(void)
2494 const ExtensibleNodeMethods *methods;
2495 ExtensibleNode *local_node;
2496 const char *extnodename;
2500 token = pg_strtok(&length); /* skip :extnodename */
2501 token = pg_strtok(&length); /* get extnodename */
2503 extnodename = nullable_string(token, length);
2505 elog(ERROR, "extnodename has to be supplied");
2506 methods = GetExtensibleNodeMethods(extnodename, false);
2508 local_node = (ExtensibleNode *) newNode(methods->node_size,
2510 local_node->extnodename = extnodename;
2512 /* deserialize the private fields */
2513 methods->nodeRead(local_node);
2519 * _readPartitionBoundSpec
2521 static PartitionBoundSpec *
2522 _readPartitionBoundSpec(void)
2524 READ_LOCALS(PartitionBoundSpec);
2526 READ_CHAR_FIELD(strategy);
2527 READ_BOOL_FIELD(is_default);
2528 READ_INT_FIELD(modulus);
2529 READ_INT_FIELD(remainder);
2530 READ_NODE_FIELD(listdatums);
2531 READ_NODE_FIELD(lowerdatums);
2532 READ_NODE_FIELD(upperdatums);
2533 READ_LOCATION_FIELD(location);
2539 * _readPartitionRangeDatum
2541 static PartitionRangeDatum *
2542 _readPartitionRangeDatum(void)
2544 READ_LOCALS(PartitionRangeDatum);
2546 READ_ENUM_FIELD(kind, PartitionRangeDatumKind);
2547 READ_NODE_FIELD(value);
2548 READ_LOCATION_FIELD(location);
2556 * Given a character string representing a node tree, parseNodeString creates
2557 * the internal node structure.
2559 * The string to be read must already have been loaded into pg_strtok().
2562 parseNodeString(void)
2568 /* Guard against stack overflow due to overly complex expressions */
2569 check_stack_depth();
2571 token = pg_strtok(&length);
2573 #define MATCH(tokname, namelen) \
2574 (length == namelen && memcmp(token, tokname, namelen) == 0)
2576 if (MATCH("QUERY", 5))
2577 return_value = _readQuery();
2578 else if (MATCH("WITHCHECKOPTION", 15))
2579 return_value = _readWithCheckOption();
2580 else if (MATCH("SORTGROUPCLAUSE", 15))
2581 return_value = _readSortGroupClause();
2582 else if (MATCH("GROUPINGSET", 11))
2583 return_value = _readGroupingSet();
2584 else if (MATCH("WINDOWCLAUSE", 12))
2585 return_value = _readWindowClause();
2586 else if (MATCH("ROWMARKCLAUSE", 13))
2587 return_value = _readRowMarkClause();
2588 else if (MATCH("COMMONTABLEEXPR", 15))
2589 return_value = _readCommonTableExpr();
2590 else if (MATCH("SETOPERATIONSTMT", 16))
2591 return_value = _readSetOperationStmt();
2592 else if (MATCH("ALIAS", 5))
2593 return_value = _readAlias();
2594 else if (MATCH("RANGEVAR", 8))
2595 return_value = _readRangeVar();
2596 else if (MATCH("INTOCLAUSE", 10))
2597 return_value = _readIntoClause();
2598 else if (MATCH("TABLEFUNC", 9))
2599 return_value = _readTableFunc();
2600 else if (MATCH("VAR", 3))
2601 return_value = _readVar();
2602 else if (MATCH("CONST", 5))
2603 return_value = _readConst();
2604 else if (MATCH("PARAM", 5))
2605 return_value = _readParam();
2606 else if (MATCH("AGGREF", 6))
2607 return_value = _readAggref();
2608 else if (MATCH("GROUPINGFUNC", 12))
2609 return_value = _readGroupingFunc();
2610 else if (MATCH("WINDOWFUNC", 10))
2611 return_value = _readWindowFunc();
2612 else if (MATCH("SUBSCRIPTINGREF", 15))
2613 return_value = _readSubscriptingRef();
2614 else if (MATCH("FUNCEXPR", 8))
2615 return_value = _readFuncExpr();
2616 else if (MATCH("NAMEDARGEXPR", 12))
2617 return_value = _readNamedArgExpr();
2618 else if (MATCH("OPEXPR", 6))
2619 return_value = _readOpExpr();
2620 else if (MATCH("DISTINCTEXPR", 12))
2621 return_value = _readDistinctExpr();
2622 else if (MATCH("NULLIFEXPR", 10))
2623 return_value = _readNullIfExpr();
2624 else if (MATCH("SCALARARRAYOPEXPR", 17))
2625 return_value = _readScalarArrayOpExpr();
2626 else if (MATCH("BOOLEXPR", 8))
2627 return_value = _readBoolExpr();
2628 else if (MATCH("SUBLINK", 7))
2629 return_value = _readSubLink();
2630 else if (MATCH("FIELDSELECT", 11))
2631 return_value = _readFieldSelect();
2632 else if (MATCH("FIELDSTORE", 10))
2633 return_value = _readFieldStore();
2634 else if (MATCH("RELABELTYPE", 11))
2635 return_value = _readRelabelType();
2636 else if (MATCH("COERCEVIAIO", 11))
2637 return_value = _readCoerceViaIO();
2638 else if (MATCH("ARRAYCOERCEEXPR", 15))
2639 return_value = _readArrayCoerceExpr();
2640 else if (MATCH("CONVERTROWTYPEEXPR", 18))
2641 return_value = _readConvertRowtypeExpr();
2642 else if (MATCH("COLLATE", 7))
2643 return_value = _readCollateExpr();
2644 else if (MATCH("CASE", 4))
2645 return_value = _readCaseExpr();
2646 else if (MATCH("WHEN", 4))
2647 return_value = _readCaseWhen();
2648 else if (MATCH("CASETESTEXPR", 12))
2649 return_value = _readCaseTestExpr();
2650 else if (MATCH("ARRAY", 5))
2651 return_value = _readArrayExpr();
2652 else if (MATCH("ROW", 3))
2653 return_value = _readRowExpr();
2654 else if (MATCH("ROWCOMPARE", 10))
2655 return_value = _readRowCompareExpr();
2656 else if (MATCH("COALESCE", 8))
2657 return_value = _readCoalesceExpr();
2658 else if (MATCH("MINMAX", 6))
2659 return_value = _readMinMaxExpr();
2660 else if (MATCH("SQLVALUEFUNCTION", 16))
2661 return_value = _readSQLValueFunction();
2662 else if (MATCH("XMLEXPR", 7))
2663 return_value = _readXmlExpr();
2664 else if (MATCH("NULLTEST", 8))
2665 return_value = _readNullTest();
2666 else if (MATCH("BOOLEANTEST", 11))
2667 return_value = _readBooleanTest();
2668 else if (MATCH("COERCETODOMAIN", 14))
2669 return_value = _readCoerceToDomain();
2670 else if (MATCH("COERCETODOMAINVALUE", 19))
2671 return_value = _readCoerceToDomainValue();
2672 else if (MATCH("SETTODEFAULT", 12))
2673 return_value = _readSetToDefault();
2674 else if (MATCH("CURRENTOFEXPR", 13))
2675 return_value = _readCurrentOfExpr();
2676 else if (MATCH("NEXTVALUEEXPR", 13))
2677 return_value = _readNextValueExpr();
2678 else if (MATCH("INFERENCEELEM", 13))
2679 return_value = _readInferenceElem();
2680 else if (MATCH("TARGETENTRY", 11))
2681 return_value = _readTargetEntry();
2682 else if (MATCH("RANGETBLREF", 11))
2683 return_value = _readRangeTblRef();
2684 else if (MATCH("JOINEXPR", 8))
2685 return_value = _readJoinExpr();
2686 else if (MATCH("FROMEXPR", 8))
2687 return_value = _readFromExpr();
2688 else if (MATCH("ONCONFLICTEXPR", 14))
2689 return_value = _readOnConflictExpr();
2690 else if (MATCH("RTE", 3))
2691 return_value = _readRangeTblEntry();
2692 else if (MATCH("RANGETBLFUNCTION", 16))
2693 return_value = _readRangeTblFunction();
2694 else if (MATCH("TABLESAMPLECLAUSE", 17))
2695 return_value = _readTableSampleClause();
2696 else if (MATCH("NOTIFY", 6))
2697 return_value = _readNotifyStmt();
2698 else if (MATCH("DEFELEM", 7))
2699 return_value = _readDefElem();
2700 else if (MATCH("DECLARECURSOR", 13))
2701 return_value = _readDeclareCursorStmt();
2702 else if (MATCH("PLANNEDSTMT", 11))
2703 return_value = _readPlannedStmt();
2704 else if (MATCH("PLAN", 4))
2705 return_value = _readPlan();
2706 else if (MATCH("RESULT", 6))
2707 return_value = _readResult();
2708 else if (MATCH("PROJECTSET", 10))
2709 return_value = _readProjectSet();
2710 else if (MATCH("MODIFYTABLE", 11))
2711 return_value = _readModifyTable();
2712 else if (MATCH("APPEND", 6))
2713 return_value = _readAppend();
2714 else if (MATCH("MERGEAPPEND", 11))
2715 return_value = _readMergeAppend();
2716 else if (MATCH("RECURSIVEUNION", 14))
2717 return_value = _readRecursiveUnion();
2718 else if (MATCH("BITMAPAND", 9))
2719 return_value = _readBitmapAnd();
2720 else if (MATCH("BITMAPOR", 8))
2721 return_value = _readBitmapOr();
2722 else if (MATCH("SCAN", 4))
2723 return_value = _readScan();
2724 else if (MATCH("SEQSCAN", 7))
2725 return_value = _readSeqScan();
2726 else if (MATCH("SAMPLESCAN", 10))
2727 return_value = _readSampleScan();
2728 else if (MATCH("INDEXSCAN", 9))
2729 return_value = _readIndexScan();
2730 else if (MATCH("INDEXONLYSCAN", 13))
2731 return_value = _readIndexOnlyScan();
2732 else if (MATCH("BITMAPINDEXSCAN", 15))
2733 return_value = _readBitmapIndexScan();
2734 else if (MATCH("BITMAPHEAPSCAN", 14))
2735 return_value = _readBitmapHeapScan();
2736 else if (MATCH("TIDSCAN", 7))
2737 return_value = _readTidScan();
2738 else if (MATCH("SUBQUERYSCAN", 12))
2739 return_value = _readSubqueryScan();
2740 else if (MATCH("FUNCTIONSCAN", 12))
2741 return_value = _readFunctionScan();
2742 else if (MATCH("VALUESSCAN", 10))
2743 return_value = _readValuesScan();
2744 else if (MATCH("TABLEFUNCSCAN", 13))
2745 return_value = _readTableFuncScan();
2746 else if (MATCH("CTESCAN", 7))
2747 return_value = _readCteScan();
2748 else if (MATCH("NAMEDTUPLESTORESCAN", 19))
2749 return_value = _readNamedTuplestoreScan();
2750 else if (MATCH("WORKTABLESCAN", 13))
2751 return_value = _readWorkTableScan();
2752 else if (MATCH("FOREIGNSCAN", 11))
2753 return_value = _readForeignScan();
2754 else if (MATCH("CUSTOMSCAN", 10))
2755 return_value = _readCustomScan();
2756 else if (MATCH("JOIN", 4))
2757 return_value = _readJoin();
2758 else if (MATCH("NESTLOOP", 8))
2759 return_value = _readNestLoop();
2760 else if (MATCH("MERGEJOIN", 9))
2761 return_value = _readMergeJoin();
2762 else if (MATCH("HASHJOIN", 8))
2763 return_value = _readHashJoin();
2764 else if (MATCH("MATERIAL", 8))
2765 return_value = _readMaterial();
2766 else if (MATCH("SORT", 4))
2767 return_value = _readSort();
2768 else if (MATCH("GROUP", 5))
2769 return_value = _readGroup();
2770 else if (MATCH("AGG", 3))
2771 return_value = _readAgg();
2772 else if (MATCH("WINDOWAGG", 9))
2773 return_value = _readWindowAgg();
2774 else if (MATCH("UNIQUE", 6))
2775 return_value = _readUnique();
2776 else if (MATCH("GATHER", 6))
2777 return_value = _readGather();
2778 else if (MATCH("GATHERMERGE", 11))
2779 return_value = _readGatherMerge();
2780 else if (MATCH("HASH", 4))
2781 return_value = _readHash();
2782 else if (MATCH("SETOP", 5))
2783 return_value = _readSetOp();
2784 else if (MATCH("LOCKROWS", 8))
2785 return_value = _readLockRows();
2786 else if (MATCH("LIMIT", 5))
2787 return_value = _readLimit();
2788 else if (MATCH("NESTLOOPPARAM", 13))
2789 return_value = _readNestLoopParam();
2790 else if (MATCH("PLANROWMARK", 11))
2791 return_value = _readPlanRowMark();
2792 else if (MATCH("PARTITIONPRUNEINFO", 18))
2793 return_value = _readPartitionPruneInfo();
2794 else if (MATCH("PARTITIONEDRELPRUNEINFO", 23))
2795 return_value = _readPartitionedRelPruneInfo();
2796 else if (MATCH("PARTITIONPRUNESTEPOP", 20))
2797 return_value = _readPartitionPruneStepOp();
2798 else if (MATCH("PARTITIONPRUNESTEPCOMBINE", 25))
2799 return_value = _readPartitionPruneStepCombine();
2800 else if (MATCH("PLANINVALITEM", 13))
2801 return_value = _readPlanInvalItem();
2802 else if (MATCH("SUBPLAN", 7))
2803 return_value = _readSubPlan();
2804 else if (MATCH("ALTERNATIVESUBPLAN", 18))
2805 return_value = _readAlternativeSubPlan();
2806 else if (MATCH("EXTENSIBLENODE", 14))
2807 return_value = _readExtensibleNode();
2808 else if (MATCH("PARTITIONBOUNDSPEC", 18))
2809 return_value = _readPartitionBoundSpec();
2810 else if (MATCH("PARTITIONRANGEDATUM", 19))
2811 return_value = _readPartitionRangeDatum();
2814 elog(ERROR, "badly formatted node string \"%.32s\"...", token);
2815 return_value = NULL; /* keep compiler quiet */
2818 return (Node *) return_value;
2825 * Given a string representation of a constant, recreate the appropriate
2826 * Datum. The string representation embeds length info, but not byValue,
2827 * so we must be told that.
2830 readDatum(bool typbyval)
2840 * read the actual length of the value
2842 token = pg_strtok(&tokenLength);
2843 length = atoui(token);
2845 token = pg_strtok(&tokenLength); /* read the '[' */
2846 if (token == NULL || token[0] != '[')
2847 elog(ERROR, "expected \"[\" to start datum, but got \"%s\"; length = %zu",
2848 token ? token : "[NULL]", length);
2852 if (length > (Size) sizeof(Datum))
2853 elog(ERROR, "byval datum but length = %zu", length);
2855 s = (char *) (&res);
2856 for (i = 0; i < (Size) sizeof(Datum); i++)
2858 token = pg_strtok(&tokenLength);
2859 s[i] = (char) atoi(token);
2862 else if (length <= 0)
2866 s = (char *) palloc(length);
2867 for (i = 0; i < length; i++)
2869 token = pg_strtok(&tokenLength);
2870 s[i] = (char) atoi(token);
2872 res = PointerGetDatum(s);
2875 token = pg_strtok(&tokenLength); /* read the ']' */
2876 if (token == NULL || token[0] != ']')
2877 elog(ERROR, "expected \"]\" to end datum, but got \"%s\"; length = %zu",
2878 token ? token : "[NULL]", length);
2884 * readAttrNumberCols
2887 readAttrNumberCols(int numCols)
2892 AttrNumber *attr_vals;
2897 attr_vals = (AttrNumber *) palloc(numCols * sizeof(AttrNumber));
2898 for (i = 0; i < numCols; i++)
2900 token = pg_strtok(&tokenLength);
2901 attr_vals[i] = atoi(token);
2911 readOidCols(int numCols)
2921 oid_vals = (Oid *) palloc(numCols * sizeof(Oid));
2922 for (i = 0; i < numCols; i++)
2924 token = pg_strtok(&tokenLength);
2925 oid_vals[i] = atooid(token);
2935 readIntCols(int numCols)
2945 int_vals = (int *) palloc(numCols * sizeof(int));
2946 for (i = 0; i < numCols; i++)
2948 token = pg_strtok(&tokenLength);
2949 int_vals[i] = atoi(token);
2959 readBoolCols(int numCols)
2969 bool_vals = (bool *) palloc(numCols * sizeof(bool));
2970 for (i = 0; i < numCols; i++)
2972 token = pg_strtok(&tokenLength);
2973 bool_vals[i] = strtobool(token);