PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
readfuncs.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * readfuncs.c
4  * Reader functions for Postgres tree nodes.
5  *
6  * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  *
10  * IDENTIFICATION
11  * src/backend/nodes/readfuncs.c
12  *
13  * NOTES
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.
18  *
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.
24  *
25  *-------------------------------------------------------------------------
26  */
27 #include "postgres.h"
28 
29 #include <math.h>
30 
31 #include "fmgr.h"
32 #include "nodes/extensible.h"
33 #include "nodes/parsenodes.h"
34 #include "nodes/plannodes.h"
35 #include "nodes/readfuncs.h"
36 
37 
38 /*
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
42  * routine.
43  */
44 
45 /* Macros for declaring appropriate local variables */
46 
47 /* A few guys need only local_node */
48 #define READ_LOCALS_NO_FIELDS(nodeTypeName) \
49  nodeTypeName *local_node = makeNode(nodeTypeName)
50 
51 /* And a few guys need only the pg_strtok support fields */
52 #define READ_TEMP_LOCALS() \
53  char *token; \
54  int length
55 
56 /* ... but most need both */
57 #define READ_LOCALS(nodeTypeName) \
58  READ_LOCALS_NO_FIELDS(nodeTypeName); \
59  READ_TEMP_LOCALS()
60 
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)
66 
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)
72 
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)
78 
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)
84 
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  /* avoid overhead of calling debackslash() for one char */ \
90  local_node->fldname = (length == 0) ? '\0' : (token[0] == '\\' ? token[1] : token[0])
91 
92 /* Read an enumerated-type field that was written as an integer code */
93 #define READ_ENUM_FIELD(fldname, enumtype) \
94  token = pg_strtok(&length); /* skip :fldname */ \
95  token = pg_strtok(&length); /* get field value */ \
96  local_node->fldname = (enumtype) atoi(token)
97 
98 /* Read a float field */
99 #define READ_FLOAT_FIELD(fldname) \
100  token = pg_strtok(&length); /* skip :fldname */ \
101  token = pg_strtok(&length); /* get field value */ \
102  local_node->fldname = atof(token)
103 
104 /* Read a boolean field */
105 #define READ_BOOL_FIELD(fldname) \
106  token = pg_strtok(&length); /* skip :fldname */ \
107  token = pg_strtok(&length); /* get field value */ \
108  local_node->fldname = strtobool(token)
109 
110 /* Read a character-string field */
111 #define READ_STRING_FIELD(fldname) \
112  token = pg_strtok(&length); /* skip :fldname */ \
113  token = pg_strtok(&length); /* get field value */ \
114  local_node->fldname = nullable_string(token, length)
115 
116 /* Read a parse location field (and throw away the value, per notes above) */
117 #define READ_LOCATION_FIELD(fldname) \
118  token = pg_strtok(&length); /* skip :fldname */ \
119  token = pg_strtok(&length); /* get field value */ \
120  (void) token; /* in case not used elsewhere */ \
121  local_node->fldname = -1 /* set field to "unknown" */
122 
123 /* Read a Node field */
124 #define READ_NODE_FIELD(fldname) \
125  token = pg_strtok(&length); /* skip :fldname */ \
126  (void) token; /* in case not used elsewhere */ \
127  local_node->fldname = nodeRead(NULL, 0)
128 
129 /* Read a bitmapset field */
130 #define READ_BITMAPSET_FIELD(fldname) \
131  token = pg_strtok(&length); /* skip :fldname */ \
132  (void) token; /* in case not used elsewhere */ \
133  local_node->fldname = _readBitmapset()
134 
135 /* Read an attribute number array */
136 #define READ_ATTRNUMBER_ARRAY(fldname, len) \
137  token = pg_strtok(&length); /* skip :fldname */ \
138  local_node->fldname = readAttrNumberCols(len);
139 
140 /* Read an oid array */
141 #define READ_OID_ARRAY(fldname, len) \
142  token = pg_strtok(&length); /* skip :fldname */ \
143  local_node->fldname = readOidCols(len);
144 
145 /* Read an int array */
146 #define READ_INT_ARRAY(fldname, len) \
147  token = pg_strtok(&length); /* skip :fldname */ \
148  local_node->fldname = readIntCols(len);
149 
150 /* Read a bool array */
151 #define READ_BOOL_ARRAY(fldname, len) \
152  token = pg_strtok(&length); /* skip :fldname */ \
153  local_node->fldname = readBoolCols(len);
154 
155 /* Routine exit */
156 #define READ_DONE() \
157  return local_node
158 
159 
160 /*
161  * NOTE: use atoi() to read values written with %d, or atoui() to read
162  * values written with %u in outfuncs.c. An exception is OID values,
163  * for which use atooid(). (As of 7.1, outfuncs.c writes OIDs as %u,
164  * but this will probably change in the future.)
165  */
166 #define atoui(x) ((unsigned int) strtoul((x), NULL, 10))
167 
168 #define strtobool(x) ((*(x) == 't') ? true : false)
169 
170 #define nullable_string(token,length) \
171  ((length) == 0 ? NULL : debackslash(token, length))
172 
173 
174 /*
175  * _readBitmapset
176  */
177 static Bitmapset *
179 {
180  Bitmapset *result = NULL;
181 
183 
184  token = pg_strtok(&length);
185  if (token == NULL)
186  elog(ERROR, "incomplete Bitmapset structure");
187  if (length != 1 || token[0] != '(')
188  elog(ERROR, "unrecognized token: \"%.*s\"", length, token);
189 
190  token = pg_strtok(&length);
191  if (token == NULL)
192  elog(ERROR, "incomplete Bitmapset structure");
193  if (length != 1 || token[0] != 'b')
194  elog(ERROR, "unrecognized token: \"%.*s\"", length, token);
195 
196  for (;;)
197  {
198  int val;
199  char *endptr;
200 
201  token = pg_strtok(&length);
202  if (token == NULL)
203  elog(ERROR, "unterminated Bitmapset structure");
204  if (length == 1 && token[0] == ')')
205  break;
206  val = (int) strtol(token, &endptr, 10);
207  if (endptr != token + length)
208  elog(ERROR, "unrecognized integer: \"%.*s\"", length, token);
209  result = bms_add_member(result, val);
210  }
211 
212  return result;
213 }
214 
215 /*
216  * for use by extensions which define extensible nodes
217  */
218 Bitmapset *
220 {
221  return _readBitmapset();
222 }
223 
224 /*
225  * _readQuery
226  */
227 static Query *
229 {
231 
232  READ_ENUM_FIELD(commandType, CmdType);
233  READ_ENUM_FIELD(querySource, QuerySource);
234  local_node->queryId = 0; /* not saved in output format */
235  READ_BOOL_FIELD(canSetTag);
236  READ_NODE_FIELD(utilityStmt);
237  READ_INT_FIELD(resultRelation);
238  READ_BOOL_FIELD(hasAggs);
239  READ_BOOL_FIELD(hasWindowFuncs);
240  READ_BOOL_FIELD(hasTargetSRFs);
241  READ_BOOL_FIELD(hasSubLinks);
242  READ_BOOL_FIELD(hasDistinctOn);
243  READ_BOOL_FIELD(hasRecursive);
244  READ_BOOL_FIELD(hasModifyingCTE);
245  READ_BOOL_FIELD(hasForUpdate);
246  READ_BOOL_FIELD(hasRowSecurity);
247  READ_NODE_FIELD(cteList);
248  READ_NODE_FIELD(rtable);
249  READ_NODE_FIELD(jointree);
250  READ_NODE_FIELD(targetList);
251  READ_ENUM_FIELD(override, OverridingKind);
252  READ_NODE_FIELD(onConflict);
253  READ_NODE_FIELD(returningList);
254  READ_NODE_FIELD(groupClause);
255  READ_NODE_FIELD(groupingSets);
256  READ_NODE_FIELD(havingQual);
257  READ_NODE_FIELD(windowClause);
258  READ_NODE_FIELD(distinctClause);
259  READ_NODE_FIELD(sortClause);
260  READ_NODE_FIELD(limitOffset);
261  READ_NODE_FIELD(limitCount);
262  READ_NODE_FIELD(rowMarks);
263  READ_NODE_FIELD(setOperations);
264  READ_NODE_FIELD(constraintDeps);
265  /* withCheckOptions intentionally omitted, see comment in parsenodes.h */
266  READ_LOCATION_FIELD(stmt_location);
267  READ_LOCATION_FIELD(stmt_len);
268 
269  READ_DONE();
270 }
271 
272 /*
273  * _readNotifyStmt
274  */
275 static NotifyStmt *
277 {
279 
280  READ_STRING_FIELD(conditionname);
281  READ_STRING_FIELD(payload);
282 
283  READ_DONE();
284 }
285 
286 /*
287  * _readDeclareCursorStmt
288  */
289 static DeclareCursorStmt *
291 {
293 
294  READ_STRING_FIELD(portalname);
296  READ_NODE_FIELD(query);
297 
298  READ_DONE();
299 }
300 
301 /*
302  * _readWithCheckOption
303  */
304 static WithCheckOption *
306 {
308 
309  READ_ENUM_FIELD(kind, WCOKind);
310  READ_STRING_FIELD(relname);
311  READ_STRING_FIELD(polname);
312  READ_NODE_FIELD(qual);
313  READ_BOOL_FIELD(cascaded);
314 
315  READ_DONE();
316 }
317 
318 /*
319  * _readSortGroupClause
320  */
321 static SortGroupClause *
323 {
325 
326  READ_UINT_FIELD(tleSortGroupRef);
327  READ_OID_FIELD(eqop);
328  READ_OID_FIELD(sortop);
329  READ_BOOL_FIELD(nulls_first);
330  READ_BOOL_FIELD(hashable);
331 
332  READ_DONE();
333 }
334 
335 /*
336  * _readGroupingSet
337  */
338 static GroupingSet *
340 {
342 
344  READ_NODE_FIELD(content);
345  READ_LOCATION_FIELD(location);
346 
347  READ_DONE();
348 }
349 
350 /*
351  * _readWindowClause
352  */
353 static WindowClause *
355 {
357 
359  READ_STRING_FIELD(refname);
360  READ_NODE_FIELD(partitionClause);
361  READ_NODE_FIELD(orderClause);
362  READ_INT_FIELD(frameOptions);
363  READ_NODE_FIELD(startOffset);
364  READ_NODE_FIELD(endOffset);
365  READ_UINT_FIELD(winref);
366  READ_BOOL_FIELD(copiedOrder);
367 
368  READ_DONE();
369 }
370 
371 /*
372  * _readRowMarkClause
373  */
374 static RowMarkClause *
376 {
378 
379  READ_UINT_FIELD(rti);
381  READ_ENUM_FIELD(waitPolicy, LockWaitPolicy);
382  READ_BOOL_FIELD(pushedDown);
383 
384  READ_DONE();
385 }
386 
387 /*
388  * _readCommonTableExpr
389  */
390 static CommonTableExpr *
392 {
394 
395  READ_STRING_FIELD(ctename);
396  READ_NODE_FIELD(aliascolnames);
397  READ_NODE_FIELD(ctequery);
398  READ_LOCATION_FIELD(location);
399  READ_BOOL_FIELD(cterecursive);
400  READ_INT_FIELD(cterefcount);
401  READ_NODE_FIELD(ctecolnames);
402  READ_NODE_FIELD(ctecoltypes);
403  READ_NODE_FIELD(ctecoltypmods);
404  READ_NODE_FIELD(ctecolcollations);
405 
406  READ_DONE();
407 }
408 
409 /*
410  * _readSetOperationStmt
411  */
412 static SetOperationStmt *
414 {
416 
418  READ_BOOL_FIELD(all);
419  READ_NODE_FIELD(larg);
420  READ_NODE_FIELD(rarg);
421  READ_NODE_FIELD(colTypes);
422  READ_NODE_FIELD(colTypmods);
423  READ_NODE_FIELD(colCollations);
424  READ_NODE_FIELD(groupClauses);
425 
426  READ_DONE();
427 }
428 
429 
430 /*
431  * Stuff from primnodes.h.
432  */
433 
434 static Alias *
436 {
438 
439  READ_STRING_FIELD(aliasname);
440  READ_NODE_FIELD(colnames);
441 
442  READ_DONE();
443 }
444 
445 static RangeVar *
447 {
449 
450  local_node->catalogname = NULL; /* not currently saved in output format */
451 
452  READ_STRING_FIELD(schemaname);
453  READ_STRING_FIELD(relname);
454  READ_BOOL_FIELD(inh);
455  READ_CHAR_FIELD(relpersistence);
456  READ_NODE_FIELD(alias);
457  READ_LOCATION_FIELD(location);
458 
459  READ_DONE();
460 }
461 
462 /*
463  * _readTableFunc
464  */
465 static TableFunc *
467 {
469 
470  READ_NODE_FIELD(ns_uris);
471  READ_NODE_FIELD(ns_names);
472  READ_NODE_FIELD(docexpr);
473  READ_NODE_FIELD(rowexpr);
474  READ_NODE_FIELD(colnames);
475  READ_NODE_FIELD(coltypes);
476  READ_NODE_FIELD(coltypmods);
477  READ_NODE_FIELD(colcollations);
478  READ_NODE_FIELD(colexprs);
479  READ_NODE_FIELD(coldefexprs);
480  READ_BITMAPSET_FIELD(notnulls);
481  READ_INT_FIELD(ordinalitycol);
482  READ_LOCATION_FIELD(location);
483 
484  READ_DONE();
485 }
486 
487 static IntoClause *
489 {
491 
492  READ_NODE_FIELD(rel);
493  READ_NODE_FIELD(colNames);
495  READ_ENUM_FIELD(onCommit, OnCommitAction);
496  READ_STRING_FIELD(tableSpaceName);
497  READ_NODE_FIELD(viewQuery);
498  READ_BOOL_FIELD(skipData);
499 
500  READ_DONE();
501 }
502 
503 /*
504  * _readVar
505  */
506 static Var *
507 _readVar(void)
508 {
509  READ_LOCALS(Var);
510 
511  READ_UINT_FIELD(varno);
512  READ_INT_FIELD(varattno);
513  READ_OID_FIELD(vartype);
514  READ_INT_FIELD(vartypmod);
515  READ_OID_FIELD(varcollid);
516  READ_UINT_FIELD(varlevelsup);
517  READ_UINT_FIELD(varnoold);
518  READ_INT_FIELD(varoattno);
519  READ_LOCATION_FIELD(location);
520 
521  READ_DONE();
522 }
523 
524 /*
525  * _readConst
526  */
527 static Const *
529 {
531 
532  READ_OID_FIELD(consttype);
533  READ_INT_FIELD(consttypmod);
534  READ_OID_FIELD(constcollid);
535  READ_INT_FIELD(constlen);
536  READ_BOOL_FIELD(constbyval);
537  READ_BOOL_FIELD(constisnull);
538  READ_LOCATION_FIELD(location);
539 
540  token = pg_strtok(&length); /* skip :constvalue */
541  if (local_node->constisnull)
542  token = pg_strtok(&length); /* skip "<>" */
543  else
544  local_node->constvalue = readDatum(local_node->constbyval);
545 
546  READ_DONE();
547 }
548 
549 /*
550  * _readParam
551  */
552 static Param *
554 {
556 
557  READ_ENUM_FIELD(paramkind, ParamKind);
558  READ_INT_FIELD(paramid);
559  READ_OID_FIELD(paramtype);
560  READ_INT_FIELD(paramtypmod);
561  READ_OID_FIELD(paramcollid);
562  READ_LOCATION_FIELD(location);
563 
564  READ_DONE();
565 }
566 
567 /*
568  * _readAggref
569  */
570 static Aggref *
572 {
574 
575  READ_OID_FIELD(aggfnoid);
576  READ_OID_FIELD(aggtype);
577  READ_OID_FIELD(aggcollid);
578  READ_OID_FIELD(inputcollid);
579  READ_OID_FIELD(aggtranstype);
580  READ_NODE_FIELD(aggargtypes);
581  READ_NODE_FIELD(aggdirectargs);
583  READ_NODE_FIELD(aggorder);
584  READ_NODE_FIELD(aggdistinct);
585  READ_NODE_FIELD(aggfilter);
586  READ_BOOL_FIELD(aggstar);
587  READ_BOOL_FIELD(aggvariadic);
588  READ_CHAR_FIELD(aggkind);
589  READ_UINT_FIELD(agglevelsup);
590  READ_ENUM_FIELD(aggsplit, AggSplit);
591  READ_LOCATION_FIELD(location);
592 
593  READ_DONE();
594 }
595 
596 /*
597  * _readGroupingFunc
598  */
599 static GroupingFunc *
601 {
603 
605  READ_NODE_FIELD(refs);
606  READ_NODE_FIELD(cols);
607  READ_UINT_FIELD(agglevelsup);
608  READ_LOCATION_FIELD(location);
609 
610  READ_DONE();
611 }
612 
613 /*
614  * _readWindowFunc
615  */
616 static WindowFunc *
618 {
620 
621  READ_OID_FIELD(winfnoid);
622  READ_OID_FIELD(wintype);
623  READ_OID_FIELD(wincollid);
624  READ_OID_FIELD(inputcollid);
626  READ_NODE_FIELD(aggfilter);
627  READ_UINT_FIELD(winref);
628  READ_BOOL_FIELD(winstar);
629  READ_BOOL_FIELD(winagg);
630  READ_LOCATION_FIELD(location);
631 
632  READ_DONE();
633 }
634 
635 /*
636  * _readArrayRef
637  */
638 static ArrayRef *
640 {
642 
643  READ_OID_FIELD(refarraytype);
644  READ_OID_FIELD(refelemtype);
645  READ_INT_FIELD(reftypmod);
646  READ_OID_FIELD(refcollid);
647  READ_NODE_FIELD(refupperindexpr);
648  READ_NODE_FIELD(reflowerindexpr);
649  READ_NODE_FIELD(refexpr);
650  READ_NODE_FIELD(refassgnexpr);
651 
652  READ_DONE();
653 }
654 
655 /*
656  * _readFuncExpr
657  */
658 static FuncExpr *
660 {
662 
663  READ_OID_FIELD(funcid);
664  READ_OID_FIELD(funcresulttype);
665  READ_BOOL_FIELD(funcretset);
666  READ_BOOL_FIELD(funcvariadic);
667  READ_ENUM_FIELD(funcformat, CoercionForm);
668  READ_OID_FIELD(funccollid);
669  READ_OID_FIELD(inputcollid);
671  READ_LOCATION_FIELD(location);
672 
673  READ_DONE();
674 }
675 
676 /*
677  * _readNamedArgExpr
678  */
679 static NamedArgExpr *
681 {
683 
686  READ_INT_FIELD(argnumber);
687  READ_LOCATION_FIELD(location);
688 
689  READ_DONE();
690 }
691 
692 /*
693  * _readOpExpr
694  */
695 static OpExpr *
697 {
699 
700  READ_OID_FIELD(opno);
701  READ_OID_FIELD(opfuncid);
702  READ_OID_FIELD(opresulttype);
703  READ_BOOL_FIELD(opretset);
704  READ_OID_FIELD(opcollid);
705  READ_OID_FIELD(inputcollid);
707  READ_LOCATION_FIELD(location);
708 
709  READ_DONE();
710 }
711 
712 /*
713  * _readDistinctExpr
714  */
715 static DistinctExpr *
717 {
719 
720  READ_OID_FIELD(opno);
721  READ_OID_FIELD(opfuncid);
722  READ_OID_FIELD(opresulttype);
723  READ_BOOL_FIELD(opretset);
724  READ_OID_FIELD(opcollid);
725  READ_OID_FIELD(inputcollid);
727  READ_LOCATION_FIELD(location);
728 
729  READ_DONE();
730 }
731 
732 /*
733  * _readNullIfExpr
734  */
735 static NullIfExpr *
737 {
739 
740  READ_OID_FIELD(opno);
741  READ_OID_FIELD(opfuncid);
742  READ_OID_FIELD(opresulttype);
743  READ_BOOL_FIELD(opretset);
744  READ_OID_FIELD(opcollid);
745  READ_OID_FIELD(inputcollid);
747  READ_LOCATION_FIELD(location);
748 
749  READ_DONE();
750 }
751 
752 /*
753  * _readScalarArrayOpExpr
754  */
755 static ScalarArrayOpExpr *
757 {
759 
760  READ_OID_FIELD(opno);
761  READ_OID_FIELD(opfuncid);
762  READ_BOOL_FIELD(useOr);
763  READ_OID_FIELD(inputcollid);
765  READ_LOCATION_FIELD(location);
766 
767  READ_DONE();
768 }
769 
770 /*
771  * _readBoolExpr
772  */
773 static BoolExpr *
775 {
777 
778  /* do-it-yourself enum representation */
779  token = pg_strtok(&length); /* skip :boolop */
780  token = pg_strtok(&length); /* get field value */
781  if (strncmp(token, "and", 3) == 0)
782  local_node->boolop = AND_EXPR;
783  else if (strncmp(token, "or", 2) == 0)
784  local_node->boolop = OR_EXPR;
785  else if (strncmp(token, "not", 3) == 0)
786  local_node->boolop = NOT_EXPR;
787  else
788  elog(ERROR, "unrecognized boolop \"%.*s\"", length, token);
789 
791  READ_LOCATION_FIELD(location);
792 
793  READ_DONE();
794 }
795 
796 /*
797  * _readSubLink
798  */
799 static SubLink *
801 {
803 
804  READ_ENUM_FIELD(subLinkType, SubLinkType);
805  READ_INT_FIELD(subLinkId);
806  READ_NODE_FIELD(testexpr);
807  READ_NODE_FIELD(operName);
808  READ_NODE_FIELD(subselect);
809  READ_LOCATION_FIELD(location);
810 
811  READ_DONE();
812 }
813 
814 /*
815  * _readSubPlan is not needed since it doesn't appear in stored rules.
816  */
817 
818 /*
819  * _readFieldSelect
820  */
821 static FieldSelect *
823 {
825 
827  READ_INT_FIELD(fieldnum);
828  READ_OID_FIELD(resulttype);
829  READ_INT_FIELD(resulttypmod);
830  READ_OID_FIELD(resultcollid);
831 
832  READ_DONE();
833 }
834 
835 /*
836  * _readFieldStore
837  */
838 static FieldStore *
840 {
842 
844  READ_NODE_FIELD(newvals);
845  READ_NODE_FIELD(fieldnums);
846  READ_OID_FIELD(resulttype);
847 
848  READ_DONE();
849 }
850 
851 /*
852  * _readRelabelType
853  */
854 static RelabelType *
856 {
858 
860  READ_OID_FIELD(resulttype);
861  READ_INT_FIELD(resulttypmod);
862  READ_OID_FIELD(resultcollid);
863  READ_ENUM_FIELD(relabelformat, CoercionForm);
864  READ_LOCATION_FIELD(location);
865 
866  READ_DONE();
867 }
868 
869 /*
870  * _readCoerceViaIO
871  */
872 static CoerceViaIO *
874 {
876 
878  READ_OID_FIELD(resulttype);
879  READ_OID_FIELD(resultcollid);
880  READ_ENUM_FIELD(coerceformat, CoercionForm);
881  READ_LOCATION_FIELD(location);
882 
883  READ_DONE();
884 }
885 
886 /*
887  * _readArrayCoerceExpr
888  */
889 static ArrayCoerceExpr *
891 {
893 
895  READ_OID_FIELD(elemfuncid);
896  READ_OID_FIELD(resulttype);
897  READ_INT_FIELD(resulttypmod);
898  READ_OID_FIELD(resultcollid);
899  READ_BOOL_FIELD(isExplicit);
900  READ_ENUM_FIELD(coerceformat, CoercionForm);
901  READ_LOCATION_FIELD(location);
902 
903  READ_DONE();
904 }
905 
906 /*
907  * _readConvertRowtypeExpr
908  */
909 static ConvertRowtypeExpr *
911 {
913 
915  READ_OID_FIELD(resulttype);
916  READ_ENUM_FIELD(convertformat, CoercionForm);
917  READ_LOCATION_FIELD(location);
918 
919  READ_DONE();
920 }
921 
922 /*
923  * _readCollateExpr
924  */
925 static CollateExpr *
927 {
929 
931  READ_OID_FIELD(collOid);
932  READ_LOCATION_FIELD(location);
933 
934  READ_DONE();
935 }
936 
937 /*
938  * _readCaseExpr
939  */
940 static CaseExpr *
942 {
944 
945  READ_OID_FIELD(casetype);
946  READ_OID_FIELD(casecollid);
949  READ_NODE_FIELD(defresult);
950  READ_LOCATION_FIELD(location);
951 
952  READ_DONE();
953 }
954 
955 /*
956  * _readCaseWhen
957  */
958 static CaseWhen *
960 {
962 
963  READ_NODE_FIELD(expr);
965  READ_LOCATION_FIELD(location);
966 
967  READ_DONE();
968 }
969 
970 /*
971  * _readCaseTestExpr
972  */
973 static CaseTestExpr *
975 {
977 
978  READ_OID_FIELD(typeId);
979  READ_INT_FIELD(typeMod);
980  READ_OID_FIELD(collation);
981 
982  READ_DONE();
983 }
984 
985 /*
986  * _readArrayExpr
987  */
988 static ArrayExpr *
990 {
992 
993  READ_OID_FIELD(array_typeid);
994  READ_OID_FIELD(array_collid);
995  READ_OID_FIELD(element_typeid);
996  READ_NODE_FIELD(elements);
997  READ_BOOL_FIELD(multidims);
998  READ_LOCATION_FIELD(location);
999 
1000  READ_DONE();
1001 }
1002 
1003 /*
1004  * _readRowExpr
1005  */
1006 static RowExpr *
1008 {
1010 
1012  READ_OID_FIELD(row_typeid);
1013  READ_ENUM_FIELD(row_format, CoercionForm);
1014  READ_NODE_FIELD(colnames);
1015  READ_LOCATION_FIELD(location);
1016 
1017  READ_DONE();
1018 }
1019 
1020 /*
1021  * _readRowCompareExpr
1022  */
1023 static RowCompareExpr *
1025 {
1027 
1029  READ_NODE_FIELD(opnos);
1030  READ_NODE_FIELD(opfamilies);
1031  READ_NODE_FIELD(inputcollids);
1032  READ_NODE_FIELD(largs);
1033  READ_NODE_FIELD(rargs);
1034 
1035  READ_DONE();
1036 }
1037 
1038 /*
1039  * _readCoalesceExpr
1040  */
1041 static CoalesceExpr *
1043 {
1045 
1046  READ_OID_FIELD(coalescetype);
1047  READ_OID_FIELD(coalescecollid);
1049  READ_LOCATION_FIELD(location);
1050 
1051  READ_DONE();
1052 }
1053 
1054 /*
1055  * _readMinMaxExpr
1056  */
1057 static MinMaxExpr *
1059 {
1061 
1062  READ_OID_FIELD(minmaxtype);
1063  READ_OID_FIELD(minmaxcollid);
1064  READ_OID_FIELD(inputcollid);
1067  READ_LOCATION_FIELD(location);
1068 
1069  READ_DONE();
1070 }
1071 
1072 /*
1073  * _readSQLValueFunction
1074  */
1075 static SQLValueFunction *
1077 {
1079 
1081  READ_OID_FIELD(type);
1082  READ_INT_FIELD(typmod);
1083  READ_LOCATION_FIELD(location);
1084 
1085  READ_DONE();
1086 }
1087 
1088 /*
1089  * _readXmlExpr
1090  */
1091 static XmlExpr *
1093 {
1095 
1098  READ_NODE_FIELD(named_args);
1099  READ_NODE_FIELD(arg_names);
1102  READ_OID_FIELD(type);
1103  READ_INT_FIELD(typmod);
1104  READ_LOCATION_FIELD(location);
1105 
1106  READ_DONE();
1107 }
1108 
1109 /*
1110  * _readNullTest
1111  */
1112 static NullTest *
1114 {
1116 
1118  READ_ENUM_FIELD(nulltesttype, NullTestType);
1119  READ_BOOL_FIELD(argisrow);
1120  READ_LOCATION_FIELD(location);
1121 
1122  READ_DONE();
1123 }
1124 
1125 /*
1126  * _readBooleanTest
1127  */
1128 static BooleanTest *
1130 {
1132 
1134  READ_ENUM_FIELD(booltesttype, BoolTestType);
1135  READ_LOCATION_FIELD(location);
1136 
1137  READ_DONE();
1138 }
1139 
1140 /*
1141  * _readCoerceToDomain
1142  */
1143 static CoerceToDomain *
1145 {
1147 
1149  READ_OID_FIELD(resulttype);
1150  READ_INT_FIELD(resulttypmod);
1151  READ_OID_FIELD(resultcollid);
1152  READ_ENUM_FIELD(coercionformat, CoercionForm);
1153  READ_LOCATION_FIELD(location);
1154 
1155  READ_DONE();
1156 }
1157 
1158 /*
1159  * _readCoerceToDomainValue
1160  */
1161 static CoerceToDomainValue *
1163 {
1165 
1166  READ_OID_FIELD(typeId);
1167  READ_INT_FIELD(typeMod);
1168  READ_OID_FIELD(collation);
1169  READ_LOCATION_FIELD(location);
1170 
1171  READ_DONE();
1172 }
1173 
1174 /*
1175  * _readSetToDefault
1176  */
1177 static SetToDefault *
1179 {
1181 
1182  READ_OID_FIELD(typeId);
1183  READ_INT_FIELD(typeMod);
1184  READ_OID_FIELD(collation);
1185  READ_LOCATION_FIELD(location);
1186 
1187  READ_DONE();
1188 }
1189 
1190 /*
1191  * _readCurrentOfExpr
1192  */
1193 static CurrentOfExpr *
1195 {
1197 
1198  READ_UINT_FIELD(cvarno);
1199  READ_STRING_FIELD(cursor_name);
1200  READ_INT_FIELD(cursor_param);
1201 
1202  READ_DONE();
1203 }
1204 
1205 /*
1206  * _readNextValueExpr
1207  */
1208 static NextValueExpr *
1210 {
1212 
1213  READ_OID_FIELD(seqid);
1214  READ_OID_FIELD(typeId);
1215 
1216  READ_DONE();
1217 }
1218 
1219 /*
1220  * _readInferenceElem
1221  */
1222 static InferenceElem *
1224 {
1226 
1227  READ_NODE_FIELD(expr);
1228  READ_OID_FIELD(infercollid);
1229  READ_OID_FIELD(inferopclass);
1230 
1231  READ_DONE();
1232 }
1233 
1234 /*
1235  * _readTargetEntry
1236  */
1237 static TargetEntry *
1239 {
1241 
1242  READ_NODE_FIELD(expr);
1243  READ_INT_FIELD(resno);
1244  READ_STRING_FIELD(resname);
1245  READ_UINT_FIELD(ressortgroupref);
1246  READ_OID_FIELD(resorigtbl);
1247  READ_INT_FIELD(resorigcol);
1248  READ_BOOL_FIELD(resjunk);
1249 
1250  READ_DONE();
1251 }
1252 
1253 /*
1254  * _readRangeTblRef
1255  */
1256 static RangeTblRef *
1258 {
1260 
1261  READ_INT_FIELD(rtindex);
1262 
1263  READ_DONE();
1264 }
1265 
1266 /*
1267  * _readJoinExpr
1268  */
1269 static JoinExpr *
1271 {
1273 
1274  READ_ENUM_FIELD(jointype, JoinType);
1275  READ_BOOL_FIELD(isNatural);
1276  READ_NODE_FIELD(larg);
1277  READ_NODE_FIELD(rarg);
1278  READ_NODE_FIELD(usingClause);
1279  READ_NODE_FIELD(quals);
1280  READ_NODE_FIELD(alias);
1281  READ_INT_FIELD(rtindex);
1282 
1283  READ_DONE();
1284 }
1285 
1286 /*
1287  * _readFromExpr
1288  */
1289 static FromExpr *
1291 {
1293 
1294  READ_NODE_FIELD(fromlist);
1295  READ_NODE_FIELD(quals);
1296 
1297  READ_DONE();
1298 }
1299 
1300 /*
1301  * _readOnConflictExpr
1302  */
1303 static OnConflictExpr *
1305 {
1307 
1309  READ_NODE_FIELD(arbiterElems);
1310  READ_NODE_FIELD(arbiterWhere);
1311  READ_OID_FIELD(constraint);
1312  READ_NODE_FIELD(onConflictSet);
1313  READ_NODE_FIELD(onConflictWhere);
1314  READ_INT_FIELD(exclRelIndex);
1315  READ_NODE_FIELD(exclRelTlist);
1316 
1317  READ_DONE();
1318 }
1319 
1320 /*
1321  * Stuff from parsenodes.h.
1322  */
1323 
1324 /*
1325  * _readRangeTblEntry
1326  */
1327 static RangeTblEntry *
1329 {
1331 
1332  /* put alias + eref first to make dump more legible */
1333  READ_NODE_FIELD(alias);
1334  READ_NODE_FIELD(eref);
1335  READ_ENUM_FIELD(rtekind, RTEKind);
1336 
1337  switch (local_node->rtekind)
1338  {
1339  case RTE_RELATION:
1340  READ_OID_FIELD(relid);
1341  READ_CHAR_FIELD(relkind);
1342  READ_NODE_FIELD(tablesample);
1343  break;
1344  case RTE_SUBQUERY:
1345  READ_NODE_FIELD(subquery);
1346  READ_BOOL_FIELD(security_barrier);
1347  break;
1348  case RTE_JOIN:
1349  READ_ENUM_FIELD(jointype, JoinType);
1350  READ_NODE_FIELD(joinaliasvars);
1351  break;
1352  case RTE_FUNCTION:
1354  READ_BOOL_FIELD(funcordinality);
1355  break;
1356  case RTE_TABLEFUNC:
1357  READ_NODE_FIELD(tablefunc);
1358  break;
1359  case RTE_VALUES:
1360  READ_NODE_FIELD(values_lists);
1361  READ_NODE_FIELD(coltypes);
1362  READ_NODE_FIELD(coltypmods);
1363  READ_NODE_FIELD(colcollations);
1364  break;
1365  case RTE_CTE:
1366  READ_STRING_FIELD(ctename);
1367  READ_UINT_FIELD(ctelevelsup);
1368  READ_BOOL_FIELD(self_reference);
1369  READ_NODE_FIELD(coltypes);
1370  READ_NODE_FIELD(coltypmods);
1371  READ_NODE_FIELD(colcollations);
1372  break;
1373  case RTE_NAMEDTUPLESTORE:
1374  READ_STRING_FIELD(enrname);
1375  READ_FLOAT_FIELD(enrtuples);
1376  READ_OID_FIELD(relid);
1377  READ_NODE_FIELD(coltypes);
1378  READ_NODE_FIELD(coltypmods);
1379  READ_NODE_FIELD(colcollations);
1380  break;
1381  default:
1382  elog(ERROR, "unrecognized RTE kind: %d",
1383  (int) local_node->rtekind);
1384  break;
1385  }
1386 
1387  READ_BOOL_FIELD(lateral);
1388  READ_BOOL_FIELD(inh);
1389  READ_BOOL_FIELD(inFromCl);
1390  READ_UINT_FIELD(requiredPerms);
1391  READ_OID_FIELD(checkAsUser);
1392  READ_BITMAPSET_FIELD(selectedCols);
1393  READ_BITMAPSET_FIELD(insertedCols);
1394  READ_BITMAPSET_FIELD(updatedCols);
1395  READ_NODE_FIELD(securityQuals);
1396 
1397  READ_DONE();
1398 }
1399 
1400 /*
1401  * _readRangeTblFunction
1402  */
1403 static RangeTblFunction *
1405 {
1407 
1408  READ_NODE_FIELD(funcexpr);
1409  READ_INT_FIELD(funccolcount);
1410  READ_NODE_FIELD(funccolnames);
1411  READ_NODE_FIELD(funccoltypes);
1412  READ_NODE_FIELD(funccoltypmods);
1413  READ_NODE_FIELD(funccolcollations);
1414  READ_BITMAPSET_FIELD(funcparams);
1415 
1416  READ_DONE();
1417 }
1418 
1419 /*
1420  * _readTableSampleClause
1421  */
1422 static TableSampleClause *
1424 {
1426 
1427  READ_OID_FIELD(tsmhandler);
1429  READ_NODE_FIELD(repeatable);
1430 
1431  READ_DONE();
1432 }
1433 
1434 /*
1435  * _readDefElem
1436  */
1437 static DefElem *
1439 {
1441 
1442  READ_STRING_FIELD(defnamespace);
1443  READ_STRING_FIELD(defname);
1445  READ_ENUM_FIELD(defaction, DefElemAction);
1446  READ_LOCATION_FIELD(location);
1447 
1448  READ_DONE();
1449 }
1450 
1451 /*
1452  * _readPlannedStmt
1453  */
1454 static PlannedStmt *
1456 {
1458 
1459  READ_ENUM_FIELD(commandType, CmdType);
1460  READ_UINT_FIELD(queryId);
1461  READ_BOOL_FIELD(hasReturning);
1462  READ_BOOL_FIELD(hasModifyingCTE);
1463  READ_BOOL_FIELD(canSetTag);
1464  READ_BOOL_FIELD(transientPlan);
1465  READ_BOOL_FIELD(dependsOnRole);
1466  READ_BOOL_FIELD(parallelModeNeeded);
1467  READ_NODE_FIELD(planTree);
1468  READ_NODE_FIELD(rtable);
1469  READ_NODE_FIELD(resultRelations);
1470  READ_NODE_FIELD(nonleafResultRelations);
1471  READ_NODE_FIELD(rootResultRelations);
1472  READ_NODE_FIELD(subplans);
1473  READ_BITMAPSET_FIELD(rewindPlanIDs);
1474  READ_NODE_FIELD(rowMarks);
1475  READ_NODE_FIELD(relationOids);
1476  READ_NODE_FIELD(invalItems);
1477  READ_INT_FIELD(nParamExec);
1478  READ_NODE_FIELD(utilityStmt);
1479  READ_LOCATION_FIELD(stmt_location);
1480  READ_LOCATION_FIELD(stmt_len);
1481 
1482  READ_DONE();
1483 }
1484 
1485 /*
1486  * ReadCommonPlan
1487  * Assign the basic stuff of all nodes that inherit from Plan
1488  */
1489 static void
1490 ReadCommonPlan(Plan *local_node)
1491 {
1492  READ_TEMP_LOCALS();
1493 
1494  READ_FLOAT_FIELD(startup_cost);
1495  READ_FLOAT_FIELD(total_cost);
1496  READ_FLOAT_FIELD(plan_rows);
1497  READ_INT_FIELD(plan_width);
1498  READ_BOOL_FIELD(parallel_aware);
1499  READ_BOOL_FIELD(parallel_safe);
1500  READ_INT_FIELD(plan_node_id);
1501  READ_NODE_FIELD(targetlist);
1502  READ_NODE_FIELD(qual);
1503  READ_NODE_FIELD(lefttree);
1504  READ_NODE_FIELD(righttree);
1505  READ_NODE_FIELD(initPlan);
1506  READ_BITMAPSET_FIELD(extParam);
1507  READ_BITMAPSET_FIELD(allParam);
1508 }
1509 
1510 /*
1511  * _readPlan
1512  */
1513 static Plan *
1515 {
1517 
1518  ReadCommonPlan(local_node);
1519 
1520  READ_DONE();
1521 }
1522 
1523 /*
1524  * _readResult
1525  */
1526 static Result *
1528 {
1530 
1531  ReadCommonPlan(&local_node->plan);
1532 
1533  READ_NODE_FIELD(resconstantqual);
1534 
1535  READ_DONE();
1536 }
1537 
1538 /*
1539  * _readProjectSet
1540  */
1541 static ProjectSet *
1543 {
1545 
1546  ReadCommonPlan(&local_node->plan);
1547 
1548  READ_DONE();
1549 }
1550 
1551 /*
1552  * _readModifyTable
1553  */
1554 static ModifyTable *
1556 {
1558 
1559  ReadCommonPlan(&local_node->plan);
1560 
1561  READ_ENUM_FIELD(operation, CmdType);
1562  READ_BOOL_FIELD(canSetTag);
1563  READ_UINT_FIELD(nominalRelation);
1564  READ_NODE_FIELD(partitioned_rels);
1565  READ_NODE_FIELD(resultRelations);
1566  READ_INT_FIELD(resultRelIndex);
1567  READ_INT_FIELD(rootResultRelIndex);
1568  READ_NODE_FIELD(plans);
1569  READ_NODE_FIELD(withCheckOptionLists);
1570  READ_NODE_FIELD(returningLists);
1571  READ_NODE_FIELD(fdwPrivLists);
1572  READ_BITMAPSET_FIELD(fdwDirectModifyPlans);
1573  READ_NODE_FIELD(rowMarks);
1574  READ_INT_FIELD(epqParam);
1575  READ_ENUM_FIELD(onConflictAction, OnConflictAction);
1576  READ_NODE_FIELD(arbiterIndexes);
1577  READ_NODE_FIELD(onConflictSet);
1578  READ_NODE_FIELD(onConflictWhere);
1579  READ_UINT_FIELD(exclRelRTI);
1580  READ_NODE_FIELD(exclRelTlist);
1581 
1582  READ_DONE();
1583 }
1584 
1585 /*
1586  * _readAppend
1587  */
1588 static Append *
1590 {
1592 
1593  ReadCommonPlan(&local_node->plan);
1594 
1595  READ_NODE_FIELD(partitioned_rels);
1596  READ_NODE_FIELD(appendplans);
1597 
1598  READ_DONE();
1599 }
1600 
1601 /*
1602  * _readMergeAppend
1603  */
1604 static MergeAppend *
1606 {
1608 
1609  ReadCommonPlan(&local_node->plan);
1610 
1611  READ_NODE_FIELD(partitioned_rels);
1612  READ_NODE_FIELD(mergeplans);
1613  READ_INT_FIELD(numCols);
1614  READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numCols);
1615  READ_OID_ARRAY(sortOperators, local_node->numCols);
1616  READ_OID_ARRAY(collations, local_node->numCols);
1617  READ_BOOL_ARRAY(nullsFirst, local_node->numCols);
1618 
1619  READ_DONE();
1620 }
1621 
1622 /*
1623  * _readRecursiveUnion
1624  */
1625 static RecursiveUnion *
1627 {
1629 
1630  ReadCommonPlan(&local_node->plan);
1631 
1632  READ_INT_FIELD(wtParam);
1633  READ_INT_FIELD(numCols);
1634  READ_ATTRNUMBER_ARRAY(dupColIdx, local_node->numCols);
1635  READ_OID_ARRAY(dupOperators, local_node->numCols);
1636  READ_LONG_FIELD(numGroups);
1637 
1638  READ_DONE();
1639 }
1640 
1641 /*
1642  * _readBitmapAnd
1643  */
1644 static BitmapAnd *
1646 {
1648 
1649  ReadCommonPlan(&local_node->plan);
1650 
1651  READ_NODE_FIELD(bitmapplans);
1652 
1653  READ_DONE();
1654 }
1655 
1656 /*
1657  * _readBitmapOr
1658  */
1659 static BitmapOr *
1661 {
1663 
1664  ReadCommonPlan(&local_node->plan);
1665 
1666  READ_BOOL_FIELD(isshared);
1667  READ_NODE_FIELD(bitmapplans);
1668 
1669  READ_DONE();
1670 }
1671 
1672 /*
1673  * ReadCommonScan
1674  * Assign the basic stuff of all nodes that inherit from Scan
1675  */
1676 static void
1677 ReadCommonScan(Scan *local_node)
1678 {
1679  READ_TEMP_LOCALS();
1680 
1681  ReadCommonPlan(&local_node->plan);
1682 
1683  READ_UINT_FIELD(scanrelid);
1684 }
1685 
1686 /*
1687  * _readScan
1688  */
1689 static Scan *
1691 {
1693 
1694  ReadCommonScan(local_node);
1695 
1696  READ_DONE();
1697 }
1698 
1699 /*
1700  * _readSeqScan
1701  */
1702 static SeqScan *
1704 {
1706 
1707  ReadCommonScan(local_node);
1708 
1709  READ_DONE();
1710 }
1711 
1712 /*
1713  * _readSampleScan
1714  */
1715 static SampleScan *
1717 {
1719 
1720  ReadCommonScan(&local_node->scan);
1721 
1722  READ_NODE_FIELD(tablesample);
1723 
1724  READ_DONE();
1725 }
1726 
1727 /*
1728  * _readIndexScan
1729  */
1730 static IndexScan *
1732 {
1734 
1735  ReadCommonScan(&local_node->scan);
1736 
1737  READ_OID_FIELD(indexid);
1738  READ_NODE_FIELD(indexqual);
1739  READ_NODE_FIELD(indexqualorig);
1740  READ_NODE_FIELD(indexorderby);
1741  READ_NODE_FIELD(indexorderbyorig);
1742  READ_NODE_FIELD(indexorderbyops);
1743  READ_ENUM_FIELD(indexorderdir, ScanDirection);
1744 
1745  READ_DONE();
1746 }
1747 
1748 /*
1749  * _readIndexOnlyScan
1750  */
1751 static IndexOnlyScan *
1753 {
1755 
1756  ReadCommonScan(&local_node->scan);
1757 
1758  READ_OID_FIELD(indexid);
1759  READ_NODE_FIELD(indexqual);
1760  READ_NODE_FIELD(indexorderby);
1761  READ_NODE_FIELD(indextlist);
1762  READ_ENUM_FIELD(indexorderdir, ScanDirection);
1763 
1764  READ_DONE();
1765 }
1766 
1767 /*
1768  * _readBitmapIndexScan
1769  */
1770 static BitmapIndexScan *
1772 {
1774 
1775  ReadCommonScan(&local_node->scan);
1776 
1777  READ_OID_FIELD(indexid);
1778  READ_BOOL_FIELD(isshared);
1779  READ_NODE_FIELD(indexqual);
1780  READ_NODE_FIELD(indexqualorig);
1781 
1782  READ_DONE();
1783 }
1784 
1785 /*
1786  * _readBitmapHeapScan
1787  */
1788 static BitmapHeapScan *
1790 {
1792 
1793  ReadCommonScan(&local_node->scan);
1794 
1795  READ_NODE_FIELD(bitmapqualorig);
1796 
1797  READ_DONE();
1798 }
1799 
1800 /*
1801  * _readTidScan
1802  */
1803 static TidScan *
1805 {
1807 
1808  ReadCommonScan(&local_node->scan);
1809 
1810  READ_NODE_FIELD(tidquals);
1811 
1812  READ_DONE();
1813 }
1814 
1815 /*
1816  * _readSubqueryScan
1817  */
1818 static SubqueryScan *
1820 {
1822 
1823  ReadCommonScan(&local_node->scan);
1824 
1825  READ_NODE_FIELD(subplan);
1826 
1827  READ_DONE();
1828 }
1829 
1830 /*
1831  * _readFunctionScan
1832  */
1833 static FunctionScan *
1835 {
1837 
1838  ReadCommonScan(&local_node->scan);
1839 
1841  READ_BOOL_FIELD(funcordinality);
1842 
1843  READ_DONE();
1844 }
1845 
1846 /*
1847  * _readValuesScan
1848  */
1849 static ValuesScan *
1851 {
1853 
1854  ReadCommonScan(&local_node->scan);
1855 
1856  READ_NODE_FIELD(values_lists);
1857 
1858  READ_DONE();
1859 }
1860 
1861 /*
1862  * _readTableFuncScan
1863  */
1864 static TableFuncScan *
1866 {
1868 
1869  ReadCommonScan(&local_node->scan);
1870 
1871  READ_NODE_FIELD(tablefunc);
1872 
1873  READ_DONE();
1874 }
1875 
1876 /*
1877  * _readCteScan
1878  */
1879 static CteScan *
1881 {
1883 
1884  ReadCommonScan(&local_node->scan);
1885 
1886  READ_INT_FIELD(ctePlanId);
1887  READ_INT_FIELD(cteParam);
1888 
1889  READ_DONE();
1890 }
1891 
1892 /*
1893  * _readWorkTableScan
1894  */
1895 static WorkTableScan *
1897 {
1899 
1900  ReadCommonScan(&local_node->scan);
1901 
1902  READ_INT_FIELD(wtParam);
1903 
1904  READ_DONE();
1905 }
1906 
1907 /*
1908  * _readForeignScan
1909  */
1910 static ForeignScan *
1912 {
1914 
1915  ReadCommonScan(&local_node->scan);
1916 
1917  READ_ENUM_FIELD(operation, CmdType);
1918  READ_OID_FIELD(fs_server);
1919  READ_NODE_FIELD(fdw_exprs);
1920  READ_NODE_FIELD(fdw_private);
1921  READ_NODE_FIELD(fdw_scan_tlist);
1922  READ_NODE_FIELD(fdw_recheck_quals);
1923  READ_BITMAPSET_FIELD(fs_relids);
1924  READ_BOOL_FIELD(fsSystemCol);
1925 
1926  READ_DONE();
1927 }
1928 
1929 /*
1930  * _readCustomScan
1931  */
1932 static CustomScan *
1934 {
1936  char *custom_name;
1937  const CustomScanMethods *methods;
1938 
1939  ReadCommonScan(&local_node->scan);
1940 
1941  READ_UINT_FIELD(flags);
1942  READ_NODE_FIELD(custom_plans);
1943  READ_NODE_FIELD(custom_exprs);
1944  READ_NODE_FIELD(custom_private);
1945  READ_NODE_FIELD(custom_scan_tlist);
1946  READ_BITMAPSET_FIELD(custom_relids);
1947 
1948  /* Lookup CustomScanMethods by CustomName */
1949  token = pg_strtok(&length); /* skip methods: */
1950  token = pg_strtok(&length); /* CustomName */
1951  custom_name = nullable_string(token, length);
1952  methods = GetCustomScanMethods(custom_name, false);
1953  local_node->methods = methods;
1954 
1955  READ_DONE();
1956 }
1957 
1958 /*
1959  * ReadCommonJoin
1960  * Assign the basic stuff of all nodes that inherit from Join
1961  */
1962 static void
1963 ReadCommonJoin(Join *local_node)
1964 {
1965  READ_TEMP_LOCALS();
1966 
1967  ReadCommonPlan(&local_node->plan);
1968 
1969  READ_ENUM_FIELD(jointype, JoinType);
1970  READ_BOOL_FIELD(inner_unique);
1971  READ_NODE_FIELD(joinqual);
1972 }
1973 
1974 /*
1975  * _readJoin
1976  */
1977 static Join *
1979 {
1981 
1982  ReadCommonJoin(local_node);
1983 
1984  READ_DONE();
1985 }
1986 
1987 /*
1988  * _readNestLoop
1989  */
1990 static NestLoop *
1992 {
1994 
1995  ReadCommonJoin(&local_node->join);
1996 
1997  READ_NODE_FIELD(nestParams);
1998 
1999  READ_DONE();
2000 }
2001 
2002 /*
2003  * _readMergeJoin
2004  */
2005 static MergeJoin *
2007 {
2008  int numCols;
2009 
2011 
2012  ReadCommonJoin(&local_node->join);
2013 
2014  READ_BOOL_FIELD(skip_mark_restore);
2015  READ_NODE_FIELD(mergeclauses);
2016 
2017  numCols = list_length(local_node->mergeclauses);
2018 
2019  READ_OID_ARRAY(mergeFamilies, numCols);
2020  READ_OID_ARRAY(mergeCollations, numCols);
2021  READ_INT_ARRAY(mergeStrategies, numCols);
2022  READ_BOOL_ARRAY(mergeNullsFirst, numCols);
2023 
2024  READ_DONE();
2025 }
2026 
2027 /*
2028  * _readHashJoin
2029  */
2030 static HashJoin *
2032 {
2034 
2035  ReadCommonJoin(&local_node->join);
2036 
2037  READ_NODE_FIELD(hashclauses);
2038 
2039  READ_DONE();
2040 }
2041 
2042 /*
2043  * _readMaterial
2044  */
2045 static Material *
2047 {
2049 
2050  ReadCommonPlan(&local_node->plan);
2051 
2052  READ_DONE();
2053 }
2054 
2055 /*
2056  * _readSort
2057  */
2058 static Sort *
2060 {
2061  READ_LOCALS(Sort);
2062 
2063  ReadCommonPlan(&local_node->plan);
2064 
2065  READ_INT_FIELD(numCols);
2066  READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numCols);
2067  READ_OID_ARRAY(sortOperators, local_node->numCols);
2068  READ_OID_ARRAY(collations, local_node->numCols);
2069  READ_BOOL_ARRAY(nullsFirst, local_node->numCols);
2070 
2071  READ_DONE();
2072 }
2073 
2074 /*
2075  * _readGroup
2076  */
2077 static Group *
2079 {
2080  READ_LOCALS(Group);
2081 
2082  ReadCommonPlan(&local_node->plan);
2083 
2084  READ_INT_FIELD(numCols);
2085  READ_ATTRNUMBER_ARRAY(grpColIdx, local_node->numCols);
2086  READ_OID_ARRAY(grpOperators, local_node->numCols);
2087 
2088  READ_DONE();
2089 }
2090 
2091 /*
2092  * _readAgg
2093  */
2094 static Agg *
2096 {
2097  READ_LOCALS(Agg);
2098 
2099  ReadCommonPlan(&local_node->plan);
2100 
2101  READ_ENUM_FIELD(aggstrategy, AggStrategy);
2102  READ_ENUM_FIELD(aggsplit, AggSplit);
2103  READ_INT_FIELD(numCols);
2104  READ_ATTRNUMBER_ARRAY(grpColIdx, local_node->numCols);
2105  READ_OID_ARRAY(grpOperators, local_node->numCols);
2106  READ_LONG_FIELD(numGroups);
2107  READ_BITMAPSET_FIELD(aggParams);
2108  READ_NODE_FIELD(groupingSets);
2109  READ_NODE_FIELD(chain);
2110 
2111  READ_DONE();
2112 }
2113 
2114 /*
2115  * _readWindowAgg
2116  */
2117 static WindowAgg *
2119 {
2121 
2122  ReadCommonPlan(&local_node->plan);
2123 
2124  READ_UINT_FIELD(winref);
2125  READ_INT_FIELD(partNumCols);
2126  READ_ATTRNUMBER_ARRAY(partColIdx, local_node->partNumCols);
2127  READ_OID_ARRAY(partOperators, local_node->partNumCols);
2128  READ_INT_FIELD(ordNumCols);
2129  READ_ATTRNUMBER_ARRAY(ordColIdx, local_node->ordNumCols);
2130  READ_OID_ARRAY(ordOperators, local_node->ordNumCols);
2131  READ_INT_FIELD(frameOptions);
2132  READ_NODE_FIELD(startOffset);
2133  READ_NODE_FIELD(endOffset);
2134 
2135  READ_DONE();
2136 }
2137 
2138 /*
2139  * _readUnique
2140  */
2141 static Unique *
2143 {
2145 
2146  ReadCommonPlan(&local_node->plan);
2147 
2148  READ_INT_FIELD(numCols);
2149  READ_ATTRNUMBER_ARRAY(uniqColIdx, local_node->numCols);
2150  READ_OID_ARRAY(uniqOperators, local_node->numCols);
2151 
2152  READ_DONE();
2153 }
2154 
2155 /*
2156  * _readGather
2157  */
2158 static Gather *
2160 {
2162 
2163  ReadCommonPlan(&local_node->plan);
2164 
2165  READ_INT_FIELD(num_workers);
2166  READ_BOOL_FIELD(single_copy);
2167  READ_BOOL_FIELD(invisible);
2168 
2169  READ_DONE();
2170 }
2171 
2172 /*
2173  * _readGatherMerge
2174  */
2175 static GatherMerge *
2177 {
2179 
2180  ReadCommonPlan(&local_node->plan);
2181 
2182  READ_INT_FIELD(num_workers);
2183  READ_INT_FIELD(numCols);
2184  READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numCols);
2185  READ_OID_ARRAY(sortOperators, local_node->numCols);
2186  READ_OID_ARRAY(collations, local_node->numCols);
2187  READ_BOOL_ARRAY(nullsFirst, local_node->numCols);
2188 
2189  READ_DONE();
2190 }
2191 
2192 /*
2193  * _readHash
2194  */
2195 static Hash *
2197 {
2198  READ_LOCALS(Hash);
2199 
2200  ReadCommonPlan(&local_node->plan);
2201 
2202  READ_OID_FIELD(skewTable);
2203  READ_INT_FIELD(skewColumn);
2204  READ_BOOL_FIELD(skewInherit);
2205 
2206  READ_DONE();
2207 }
2208 
2209 /*
2210  * _readSetOp
2211  */
2212 static SetOp *
2214 {
2215  READ_LOCALS(SetOp);
2216 
2217  ReadCommonPlan(&local_node->plan);
2218 
2219  READ_ENUM_FIELD(cmd, SetOpCmd);
2220  READ_ENUM_FIELD(strategy, SetOpStrategy);
2221  READ_INT_FIELD(numCols);
2222  READ_ATTRNUMBER_ARRAY(dupColIdx, local_node->numCols);
2223  READ_OID_ARRAY(dupOperators, local_node->numCols);
2224  READ_INT_FIELD(flagColIdx);
2225  READ_INT_FIELD(firstFlag);
2226  READ_LONG_FIELD(numGroups);
2227 
2228  READ_DONE();
2229 }
2230 
2231 /*
2232  * _readLockRows
2233  */
2234 static LockRows *
2236 {
2238 
2239  ReadCommonPlan(&local_node->plan);
2240 
2241  READ_NODE_FIELD(rowMarks);
2242  READ_INT_FIELD(epqParam);
2243 
2244  READ_DONE();
2245 }
2246 
2247 /*
2248  * _readLimit
2249  */
2250 static Limit *
2252 {
2253  READ_LOCALS(Limit);
2254 
2255  ReadCommonPlan(&local_node->plan);
2256 
2257  READ_NODE_FIELD(limitOffset);
2258  READ_NODE_FIELD(limitCount);
2259 
2260  READ_DONE();
2261 }
2262 
2263 /*
2264  * _readNestLoopParam
2265  */
2266 static NestLoopParam *
2268 {
2270 
2271  READ_INT_FIELD(paramno);
2272  READ_NODE_FIELD(paramval);
2273 
2274  READ_DONE();
2275 }
2276 
2277 /*
2278  * _readPlanRowMark
2279  */
2280 static PlanRowMark *
2282 {
2284 
2285  READ_UINT_FIELD(rti);
2286  READ_UINT_FIELD(prti);
2287  READ_UINT_FIELD(rowmarkId);
2288  READ_ENUM_FIELD(markType, RowMarkType);
2289  READ_INT_FIELD(allMarkTypes);
2291  READ_ENUM_FIELD(waitPolicy, LockWaitPolicy);
2292  READ_BOOL_FIELD(isParent);
2293 
2294  READ_DONE();
2295 }
2296 
2297 /*
2298  * _readPlanInvalItem
2299  */
2300 static PlanInvalItem *
2302 {
2304 
2305  READ_INT_FIELD(cacheId);
2306  READ_UINT_FIELD(hashValue);
2307 
2308  READ_DONE();
2309 }
2310 
2311 /*
2312  * _readSubPlan
2313  */
2314 static SubPlan *
2316 {
2318 
2319  READ_ENUM_FIELD(subLinkType, SubLinkType);
2320  READ_NODE_FIELD(testexpr);
2321  READ_NODE_FIELD(paramIds);
2322  READ_INT_FIELD(plan_id);
2323  READ_STRING_FIELD(plan_name);
2324  READ_OID_FIELD(firstColType);
2325  READ_INT_FIELD(firstColTypmod);
2326  READ_OID_FIELD(firstColCollation);
2327  READ_BOOL_FIELD(useHashTable);
2328  READ_BOOL_FIELD(unknownEqFalse);
2329  READ_BOOL_FIELD(parallel_safe);
2330  READ_NODE_FIELD(setParam);
2331  READ_NODE_FIELD(parParam);
2333  READ_FLOAT_FIELD(startup_cost);
2334  READ_FLOAT_FIELD(per_call_cost);
2335 
2336  READ_DONE();
2337 }
2338 
2339 /*
2340  * _readAlternativeSubPlan
2341  */
2342 static AlternativeSubPlan *
2344 {
2346 
2347  READ_NODE_FIELD(subplans);
2348 
2349  READ_DONE();
2350 }
2351 
2352 /*
2353  * _readExtensibleNode
2354  */
2355 static ExtensibleNode *
2357 {
2358  const ExtensibleNodeMethods *methods;
2359  ExtensibleNode *local_node;
2360  const char *extnodename;
2361 
2362  READ_TEMP_LOCALS();
2363 
2364  token = pg_strtok(&length); /* skip :extnodename */
2365  token = pg_strtok(&length); /* get extnodename */
2366 
2367  extnodename = nullable_string(token, length);
2368  if (!extnodename)
2369  elog(ERROR, "extnodename has to be supplied");
2370  methods = GetExtensibleNodeMethods(extnodename, false);
2371 
2372  local_node = (ExtensibleNode *) newNode(methods->node_size,
2374  local_node->extnodename = extnodename;
2375 
2376  /* deserialize the private fields */
2377  methods->nodeRead(local_node);
2378 
2379  READ_DONE();
2380 }
2381 
2382 /*
2383  * _readPartitionBoundSpec
2384  */
2385 static PartitionBoundSpec *
2387 {
2389 
2390  READ_CHAR_FIELD(strategy);
2391  READ_NODE_FIELD(listdatums);
2392  READ_NODE_FIELD(lowerdatums);
2393  READ_NODE_FIELD(upperdatums);
2394  READ_LOCATION_FIELD(location);
2395 
2396  READ_DONE();
2397 }
2398 
2399 /*
2400  * _readPartitionRangeDatum
2401  */
2402 static PartitionRangeDatum *
2404 {
2406 
2409  READ_LOCATION_FIELD(location);
2410 
2411  READ_DONE();
2412 }
2413 
2414 /*
2415  * parseNodeString
2416  *
2417  * Given a character string representing a node tree, parseNodeString creates
2418  * the internal node structure.
2419  *
2420  * The string to be read must already have been loaded into pg_strtok().
2421  */
2422 Node *
2424 {
2425  void *return_value;
2426 
2427  READ_TEMP_LOCALS();
2428 
2429  token = pg_strtok(&length);
2430 
2431 #define MATCH(tokname, namelen) \
2432  (length == namelen && memcmp(token, tokname, namelen) == 0)
2433 
2434  if (MATCH("QUERY", 5))
2435  return_value = _readQuery();
2436  else if (MATCH("WITHCHECKOPTION", 15))
2437  return_value = _readWithCheckOption();
2438  else if (MATCH("SORTGROUPCLAUSE", 15))
2439  return_value = _readSortGroupClause();
2440  else if (MATCH("GROUPINGSET", 11))
2441  return_value = _readGroupingSet();
2442  else if (MATCH("WINDOWCLAUSE", 12))
2443  return_value = _readWindowClause();
2444  else if (MATCH("ROWMARKCLAUSE", 13))
2445  return_value = _readRowMarkClause();
2446  else if (MATCH("COMMONTABLEEXPR", 15))
2447  return_value = _readCommonTableExpr();
2448  else if (MATCH("SETOPERATIONSTMT", 16))
2449  return_value = _readSetOperationStmt();
2450  else if (MATCH("ALIAS", 5))
2451  return_value = _readAlias();
2452  else if (MATCH("RANGEVAR", 8))
2453  return_value = _readRangeVar();
2454  else if (MATCH("INTOCLAUSE", 10))
2455  return_value = _readIntoClause();
2456  else if (MATCH("TABLEFUNC", 9))
2457  return_value = _readTableFunc();
2458  else if (MATCH("VAR", 3))
2459  return_value = _readVar();
2460  else if (MATCH("CONST", 5))
2461  return_value = _readConst();
2462  else if (MATCH("PARAM", 5))
2463  return_value = _readParam();
2464  else if (MATCH("AGGREF", 6))
2465  return_value = _readAggref();
2466  else if (MATCH("GROUPINGFUNC", 12))
2467  return_value = _readGroupingFunc();
2468  else if (MATCH("WINDOWFUNC", 10))
2469  return_value = _readWindowFunc();
2470  else if (MATCH("ARRAYREF", 8))
2471  return_value = _readArrayRef();
2472  else if (MATCH("FUNCEXPR", 8))
2473  return_value = _readFuncExpr();
2474  else if (MATCH("NAMEDARGEXPR", 12))
2475  return_value = _readNamedArgExpr();
2476  else if (MATCH("OPEXPR", 6))
2477  return_value = _readOpExpr();
2478  else if (MATCH("DISTINCTEXPR", 12))
2479  return_value = _readDistinctExpr();
2480  else if (MATCH("NULLIFEXPR", 10))
2481  return_value = _readNullIfExpr();
2482  else if (MATCH("SCALARARRAYOPEXPR", 17))
2483  return_value = _readScalarArrayOpExpr();
2484  else if (MATCH("BOOLEXPR", 8))
2485  return_value = _readBoolExpr();
2486  else if (MATCH("SUBLINK", 7))
2487  return_value = _readSubLink();
2488  else if (MATCH("FIELDSELECT", 11))
2489  return_value = _readFieldSelect();
2490  else if (MATCH("FIELDSTORE", 10))
2491  return_value = _readFieldStore();
2492  else if (MATCH("RELABELTYPE", 11))
2493  return_value = _readRelabelType();
2494  else if (MATCH("COERCEVIAIO", 11))
2495  return_value = _readCoerceViaIO();
2496  else if (MATCH("ARRAYCOERCEEXPR", 15))
2497  return_value = _readArrayCoerceExpr();
2498  else if (MATCH("CONVERTROWTYPEEXPR", 18))
2499  return_value = _readConvertRowtypeExpr();
2500  else if (MATCH("COLLATE", 7))
2501  return_value = _readCollateExpr();
2502  else if (MATCH("CASE", 4))
2503  return_value = _readCaseExpr();
2504  else if (MATCH("WHEN", 4))
2505  return_value = _readCaseWhen();
2506  else if (MATCH("CASETESTEXPR", 12))
2507  return_value = _readCaseTestExpr();
2508  else if (MATCH("ARRAY", 5))
2509  return_value = _readArrayExpr();
2510  else if (MATCH("ROW", 3))
2511  return_value = _readRowExpr();
2512  else if (MATCH("ROWCOMPARE", 10))
2513  return_value = _readRowCompareExpr();
2514  else if (MATCH("COALESCE", 8))
2515  return_value = _readCoalesceExpr();
2516  else if (MATCH("MINMAX", 6))
2517  return_value = _readMinMaxExpr();
2518  else if (MATCH("SQLVALUEFUNCTION", 16))
2519  return_value = _readSQLValueFunction();
2520  else if (MATCH("XMLEXPR", 7))
2521  return_value = _readXmlExpr();
2522  else if (MATCH("NULLTEST", 8))
2523  return_value = _readNullTest();
2524  else if (MATCH("BOOLEANTEST", 11))
2525  return_value = _readBooleanTest();
2526  else if (MATCH("COERCETODOMAIN", 14))
2527  return_value = _readCoerceToDomain();
2528  else if (MATCH("COERCETODOMAINVALUE", 19))
2529  return_value = _readCoerceToDomainValue();
2530  else if (MATCH("SETTODEFAULT", 12))
2531  return_value = _readSetToDefault();
2532  else if (MATCH("CURRENTOFEXPR", 13))
2533  return_value = _readCurrentOfExpr();
2534  else if (MATCH("NEXTVALUEEXPR", 13))
2535  return_value = _readNextValueExpr();
2536  else if (MATCH("INFERENCEELEM", 13))
2537  return_value = _readInferenceElem();
2538  else if (MATCH("TARGETENTRY", 11))
2539  return_value = _readTargetEntry();
2540  else if (MATCH("RANGETBLREF", 11))
2541  return_value = _readRangeTblRef();
2542  else if (MATCH("JOINEXPR", 8))
2543  return_value = _readJoinExpr();
2544  else if (MATCH("FROMEXPR", 8))
2545  return_value = _readFromExpr();
2546  else if (MATCH("ONCONFLICTEXPR", 14))
2547  return_value = _readOnConflictExpr();
2548  else if (MATCH("RTE", 3))
2549  return_value = _readRangeTblEntry();
2550  else if (MATCH("RANGETBLFUNCTION", 16))
2551  return_value = _readRangeTblFunction();
2552  else if (MATCH("TABLESAMPLECLAUSE", 17))
2553  return_value = _readTableSampleClause();
2554  else if (MATCH("NOTIFY", 6))
2555  return_value = _readNotifyStmt();
2556  else if (MATCH("DEFELEM", 7))
2557  return_value = _readDefElem();
2558  else if (MATCH("DECLARECURSOR", 13))
2559  return_value = _readDeclareCursorStmt();
2560  else if (MATCH("PLANNEDSTMT", 11))
2561  return_value = _readPlannedStmt();
2562  else if (MATCH("PLAN", 4))
2563  return_value = _readPlan();
2564  else if (MATCH("RESULT", 6))
2565  return_value = _readResult();
2566  else if (MATCH("PROJECTSET", 10))
2567  return_value = _readProjectSet();
2568  else if (MATCH("MODIFYTABLE", 11))
2569  return_value = _readModifyTable();
2570  else if (MATCH("APPEND", 6))
2571  return_value = _readAppend();
2572  else if (MATCH("MERGEAPPEND", 11))
2573  return_value = _readMergeAppend();
2574  else if (MATCH("RECURSIVEUNION", 14))
2575  return_value = _readRecursiveUnion();
2576  else if (MATCH("BITMAPAND", 9))
2577  return_value = _readBitmapAnd();
2578  else if (MATCH("BITMAPOR", 8))
2579  return_value = _readBitmapOr();
2580  else if (MATCH("SCAN", 4))
2581  return_value = _readScan();
2582  else if (MATCH("SEQSCAN", 7))
2583  return_value = _readSeqScan();
2584  else if (MATCH("SAMPLESCAN", 10))
2585  return_value = _readSampleScan();
2586  else if (MATCH("INDEXSCAN", 9))
2587  return_value = _readIndexScan();
2588  else if (MATCH("INDEXONLYSCAN", 13))
2589  return_value = _readIndexOnlyScan();
2590  else if (MATCH("BITMAPINDEXSCAN", 15))
2591  return_value = _readBitmapIndexScan();
2592  else if (MATCH("BITMAPHEAPSCAN", 14))
2593  return_value = _readBitmapHeapScan();
2594  else if (MATCH("TIDSCAN", 7))
2595  return_value = _readTidScan();
2596  else if (MATCH("SUBQUERYSCAN", 12))
2597  return_value = _readSubqueryScan();
2598  else if (MATCH("FUNCTIONSCAN", 12))
2599  return_value = _readFunctionScan();
2600  else if (MATCH("VALUESSCAN", 10))
2601  return_value = _readValuesScan();
2602  else if (MATCH("TABLEFUNCSCAN", 13))
2603  return_value = _readTableFuncScan();
2604  else if (MATCH("CTESCAN", 7))
2605  return_value = _readCteScan();
2606  else if (MATCH("WORKTABLESCAN", 13))
2607  return_value = _readWorkTableScan();
2608  else if (MATCH("FOREIGNSCAN", 11))
2609  return_value = _readForeignScan();
2610  else if (MATCH("CUSTOMSCAN", 10))
2611  return_value = _readCustomScan();
2612  else if (MATCH("JOIN", 4))
2613  return_value = _readJoin();
2614  else if (MATCH("NESTLOOP", 8))
2615  return_value = _readNestLoop();
2616  else if (MATCH("MERGEJOIN", 9))
2617  return_value = _readMergeJoin();
2618  else if (MATCH("HASHJOIN", 8))
2619  return_value = _readHashJoin();
2620  else if (MATCH("MATERIAL", 8))
2621  return_value = _readMaterial();
2622  else if (MATCH("SORT", 4))
2623  return_value = _readSort();
2624  else if (MATCH("GROUP", 5))
2625  return_value = _readGroup();
2626  else if (MATCH("AGG", 3))
2627  return_value = _readAgg();
2628  else if (MATCH("WINDOWAGG", 9))
2629  return_value = _readWindowAgg();
2630  else if (MATCH("UNIQUE", 6))
2631  return_value = _readUnique();
2632  else if (MATCH("GATHER", 6))
2633  return_value = _readGather();
2634  else if (MATCH("GATHERMERGE", 11))
2635  return_value = _readGatherMerge();
2636  else if (MATCH("HASH", 4))
2637  return_value = _readHash();
2638  else if (MATCH("SETOP", 5))
2639  return_value = _readSetOp();
2640  else if (MATCH("LOCKROWS", 8))
2641  return_value = _readLockRows();
2642  else if (MATCH("LIMIT", 5))
2643  return_value = _readLimit();
2644  else if (MATCH("NESTLOOPPARAM", 13))
2645  return_value = _readNestLoopParam();
2646  else if (MATCH("PLANROWMARK", 11))
2647  return_value = _readPlanRowMark();
2648  else if (MATCH("PLANINVALITEM", 13))
2649  return_value = _readPlanInvalItem();
2650  else if (MATCH("SUBPLAN", 7))
2651  return_value = _readSubPlan();
2652  else if (MATCH("ALTERNATIVESUBPLAN", 18))
2653  return_value = _readAlternativeSubPlan();
2654  else if (MATCH("EXTENSIBLENODE", 14))
2655  return_value = _readExtensibleNode();
2656  else if (MATCH("PARTITIONBOUNDSPEC", 18))
2657  return_value = _readPartitionBoundSpec();
2658  else if (MATCH("PARTITIONRANGEDATUM", 19))
2659  return_value = _readPartitionRangeDatum();
2660  else
2661  {
2662  elog(ERROR, "badly formatted node string \"%.32s\"...", token);
2663  return_value = NULL; /* keep compiler quiet */
2664  }
2665 
2666  return (Node *) return_value;
2667 }
2668 
2669 
2670 /*
2671  * readDatum
2672  *
2673  * Given a string representation of a constant, recreate the appropriate
2674  * Datum. The string representation embeds length info, but not byValue,
2675  * so we must be told that.
2676  */
2677 Datum
2678 readDatum(bool typbyval)
2679 {
2680  Size length,
2681  i;
2682  int tokenLength;
2683  char *token;
2684  Datum res;
2685  char *s;
2686 
2687  /*
2688  * read the actual length of the value
2689  */
2690  token = pg_strtok(&tokenLength);
2691  length = atoui(token);
2692 
2693  token = pg_strtok(&tokenLength); /* read the '[' */
2694  if (token == NULL || token[0] != '[')
2695  elog(ERROR, "expected \"[\" to start datum, but got \"%s\"; length = %zu",
2696  token ? (const char *) token : "[NULL]", length);
2697 
2698  if (typbyval)
2699  {
2700  if (length > (Size) sizeof(Datum))
2701  elog(ERROR, "byval datum but length = %zu", length);
2702  res = (Datum) 0;
2703  s = (char *) (&res);
2704  for (i = 0; i < (Size) sizeof(Datum); i++)
2705  {
2706  token = pg_strtok(&tokenLength);
2707  s[i] = (char) atoi(token);
2708  }
2709  }
2710  else if (length <= 0)
2711  res = (Datum) NULL;
2712  else
2713  {
2714  s = (char *) palloc(length);
2715  for (i = 0; i < length; i++)
2716  {
2717  token = pg_strtok(&tokenLength);
2718  s[i] = (char) atoi(token);
2719  }
2720  res = PointerGetDatum(s);
2721  }
2722 
2723  token = pg_strtok(&tokenLength); /* read the ']' */
2724  if (token == NULL || token[0] != ']')
2725  elog(ERROR, "expected \"]\" to end datum, but got \"%s\"; length = %zu",
2726  token ? (const char *) token : "[NULL]", length);
2727 
2728  return res;
2729 }
2730 
2731 /*
2732  * readAttrNumberCols
2733  */
2734 AttrNumber *
2736 {
2737  int tokenLength,
2738  i;
2739  char *token;
2740  AttrNumber *attr_vals;
2741 
2742  if (numCols <= 0)
2743  return NULL;
2744 
2745  attr_vals = (AttrNumber *) palloc(numCols * sizeof(AttrNumber));
2746  for (i = 0; i < numCols; i++)
2747  {
2748  token = pg_strtok(&tokenLength);
2749  attr_vals[i] = atoi(token);
2750  }
2751 
2752  return attr_vals;
2753 }
2754 
2755 /*
2756  * readOidCols
2757  */
2758 Oid *
2759 readOidCols(int numCols)
2760 {
2761  int tokenLength,
2762  i;
2763  char *token;
2764  Oid *oid_vals;
2765 
2766  if (numCols <= 0)
2767  return NULL;
2768 
2769  oid_vals = (Oid *) palloc(numCols * sizeof(Oid));
2770  for (i = 0; i < numCols; i++)
2771  {
2772  token = pg_strtok(&tokenLength);
2773  oid_vals[i] = atooid(token);
2774  }
2775 
2776  return oid_vals;
2777 }
2778 
2779 /*
2780  * readIntCols
2781  */
2782 int *
2783 readIntCols(int numCols)
2784 {
2785  int tokenLength,
2786  i;
2787  char *token;
2788  int *int_vals;
2789 
2790  if (numCols <= 0)
2791  return NULL;
2792 
2793  int_vals = (int *) palloc(numCols * sizeof(int));
2794  for (i = 0; i < numCols; i++)
2795  {
2796  token = pg_strtok(&tokenLength);
2797  int_vals[i] = atoi(token);
2798  }
2799 
2800  return int_vals;
2801 }
2802 
2803 /*
2804  * readBoolCols
2805  */
2806 bool *
2807 readBoolCols(int numCols)
2808 {
2809  int tokenLength,
2810  i;
2811  char *token;
2812  bool *bool_vals;
2813 
2814  if (numCols <= 0)
2815  return NULL;
2816 
2817  bool_vals = (bool *) palloc(numCols * sizeof(bool));
2818  for (i = 0; i < numCols; i++)
2819  {
2820  token = pg_strtok(&tokenLength);
2821  bool_vals[i] = strtobool(token);
2822  }
2823 
2824  return bool_vals;
2825 }
static NullTest * _readNullTest(void)
Definition: readfuncs.c:1113
static JoinExpr * _readJoinExpr(void)
Definition: readfuncs.c:1270
static RangeVar * _readRangeVar(void)
Definition: readfuncs.c:446
#define atoui(x)
Definition: readfuncs.c:166
static RangeTblEntry * _readRangeTblEntry(void)
Definition: readfuncs.c:1328
static DefElem * _readDefElem(void)
Definition: readfuncs.c:1438
static RowExpr * _readRowExpr(void)
Definition: readfuncs.c:1007
int length(const List *list)
Definition: list.c:1271
static MergeJoin * _readMergeJoin(void)
Definition: readfuncs.c:2006
static MinMaxExpr * _readMinMaxExpr(void)
Definition: readfuncs.c:1058
static RowMarkClause * _readRowMarkClause(void)
Definition: readfuncs.c:375
static FuncExpr * _readFuncExpr(void)
Definition: readfuncs.c:659
Plan plan
Definition: plannodes.h:328
#define READ_BOOL_ARRAY(fldname, len)
Definition: readfuncs.c:151
static Hash * _readHash(void)
Definition: readfuncs.c:2196
char * pg_strtok(int *length)
Definition: read.c:107
static Result * _readResult(void)
Definition: readfuncs.c:1527
static Query * _readQuery(void)
Definition: readfuncs.c:228
static RowCompareExpr * _readRowCompareExpr(void)
Definition: readfuncs.c:1024
static Param * _readParam(void)
Definition: readfuncs.c:553
static PlanInvalItem * _readPlanInvalItem(void)
Definition: readfuncs.c:2301
ParamKind
Definition: primnodes.h:233
static WindowAgg * _readWindowAgg(void)
Definition: readfuncs.c:2118
static IndexScan * _readIndexScan(void)
Definition: readfuncs.c:1731
static NotifyStmt * _readNotifyStmt(void)
Definition: readfuncs.c:276
static Scan * _readScan(void)
Definition: readfuncs.c:1690
static NamedArgExpr * _readNamedArgExpr(void)
Definition: readfuncs.c:680
static LockRows * _readLockRows(void)
Definition: readfuncs.c:2235
static CurrentOfExpr * _readCurrentOfExpr(void)
Definition: readfuncs.c:1194
PartitionRangeDatumKind
Definition: parsenodes.h:816
#define READ_LONG_FIELD(fldname)
Definition: readfuncs.c:74
#define PointerGetDatum(X)
Definition: postgres.h:562
static CollateExpr * _readCollateExpr(void)
Definition: readfuncs.c:926
static SubqueryScan * _readSubqueryScan(void)
Definition: readfuncs.c:1819
BoolTestType
Definition: primnodes.h:1195
#define strtobool(x)
Definition: readfuncs.c:168
static BitmapIndexScan * _readBitmapIndexScan(void)
Definition: readfuncs.c:1771
static CaseExpr * _readCaseExpr(void)
Definition: readfuncs.c:941
static FunctionScan * _readFunctionScan(void)
Definition: readfuncs.c:1834
static PartitionBoundSpec * _readPartitionBoundSpec(void)
Definition: readfuncs.c:2386
#define READ_BOOL_FIELD(fldname)
Definition: readfuncs.c:105
XmlExprOp
Definition: primnodes.h:1121
QuerySource
Definition: parsenodes.h:38
static Unique * _readUnique(void)
Definition: readfuncs.c:2142
static MergeAppend * _readMergeAppend(void)
Definition: readfuncs.c:1605
Definition: nodes.h:509
#define READ_LOCALS_NO_FIELDS(nodeTypeName)
Definition: readfuncs.c:48
static WindowFunc * _readWindowFunc(void)
Definition: readfuncs.c:617
static WindowClause * _readWindowClause(void)
Definition: readfuncs.c:354
return result
Definition: formatting.c:1633
static OpExpr * _readOpExpr(void)
Definition: readfuncs.c:696
static IndexOnlyScan * _readIndexOnlyScan(void)
Definition: readfuncs.c:1752
static BitmapAnd * _readBitmapAnd(void)
Definition: readfuncs.c:1645
NullTestType
Definition: primnodes.h:1172
unsigned int Oid
Definition: postgres_ext.h:31
Definition: primnodes.h:163
static FromExpr * _readFromExpr(void)
Definition: readfuncs.c:1290
static Aggref * _readAggref(void)
Definition: readfuncs.c:571
SetOpStrategy
Definition: nodes.h:787
static NestLoop * _readNestLoop(void)
Definition: readfuncs.c:1991
OnCommitAction
Definition: primnodes.h:47
static ModifyTable * _readModifyTable(void)
Definition: readfuncs.c:1555
static NextValueExpr * _readNextValueExpr(void)
Definition: readfuncs.c:1209
JoinType
Definition: nodes.h:673
static DistinctExpr * _readDistinctExpr(void)
Definition: readfuncs.c:716
Oid * readOidCols(int numCols)
Definition: readfuncs.c:2759
static ArrayCoerceExpr * _readArrayCoerceExpr(void)
Definition: readfuncs.c:890
static TargetEntry * _readTargetEntry(void)
Definition: readfuncs.c:1238
#define newNode(size, tag)
Definition: nodes.h:547
static void ReadCommonPlan(Plan *local_node)
Definition: readfuncs.c:1490
static Agg * _readAgg(void)
Definition: readfuncs.c:2095
static SeqScan * _readSeqScan(void)
Definition: readfuncs.c:1703
MinMaxOp
Definition: primnodes.h:1054
SetOperation
Definition: parsenodes.h:1490
bool * readBoolCols(int numCols)
Definition: readfuncs.c:2807
static AlternativeSubPlan * _readAlternativeSubPlan(void)
Definition: readfuncs.c:2343
static CteScan * _readCteScan(void)
Definition: readfuncs.c:1880
static GroupingFunc * _readGroupingFunc(void)
Definition: readfuncs.c:600
#define ERROR
Definition: elog.h:43
static CoerceToDomain * _readCoerceToDomain(void)
Definition: readfuncs.c:1144
static SubLink * _readSubLink(void)
Definition: readfuncs.c:800
static HashJoin * _readHashJoin(void)
Definition: readfuncs.c:2031
#define READ_FLOAT_FIELD(fldname)
Definition: readfuncs.c:99
static ValuesScan * _readValuesScan(void)
Definition: readfuncs.c:1850
static ConvertRowtypeExpr * _readConvertRowtypeExpr(void)
Definition: readfuncs.c:910
#define READ_OID_ARRAY(fldname, len)
Definition: readfuncs.c:141
static struct @121 value
static OnConflictExpr * _readOnConflictExpr(void)
Definition: readfuncs.c:1304
RTEKind
Definition: parsenodes.h:928
static NullIfExpr * _readNullIfExpr(void)
Definition: readfuncs.c:736
static Append * _readAppend(void)
Definition: readfuncs.c:1589
static ExtensibleNode * _readExtensibleNode(void)
Definition: readfuncs.c:2356
static PlanRowMark * _readPlanRowMark(void)
Definition: readfuncs.c:2281
static FieldSelect * _readFieldSelect(void)
Definition: readfuncs.c:822
int * readIntCols(int numCols)
Definition: readfuncs.c:2783
static ArrayRef * _readArrayRef(void)
Definition: readfuncs.c:639
ScanDirection
Definition: sdir.h:22
static CaseWhen * _readCaseWhen(void)
Definition: readfuncs.c:959
static SQLValueFunction * _readSQLValueFunction(void)
Definition: readfuncs.c:1076
#define READ_CHAR_FIELD(fldname)
Definition: readfuncs.c:86
AttrNumber * readAttrNumberCols(int numCols)
Definition: readfuncs.c:2735
#define MATCH(tokname, namelen)
#define atooid(x)
Definition: postgres_ext.h:42
static ForeignScan * _readForeignScan(void)
Definition: readfuncs.c:1911
static RelabelType * _readRelabelType(void)
Definition: readfuncs.c:855
WCOKind
Definition: parsenodes.h:1105
static SetOp * _readSetOp(void)
Definition: readfuncs.c:2213
#define READ_UINT_FIELD(fldname)
Definition: readfuncs.c:68
#define READ_ENUM_FIELD(fldname, enumtype)
Definition: readfuncs.c:93
Datum readDatum(bool typbyval)
Definition: readfuncs.c:2678
SQLValueFunctionOp
Definition: primnodes.h:1082
static SortGroupClause * _readSortGroupClause(void)
Definition: readfuncs.c:322
void(* nodeRead)(struct ExtensibleNode *node)
Definition: extensible.h:70
#define READ_NODE_FIELD(fldname)
Definition: readfuncs.c:124
SubLinkType
Definition: primnodes.h:618
Bitmapset * readBitmapset(void)
Definition: readfuncs.c:219
static Limit * _readLimit(void)
Definition: readfuncs.c:2251
static PartitionRangeDatum * _readPartitionRangeDatum(void)
Definition: readfuncs.c:2403
LockClauseStrength
Definition: lockoptions.h:21
static void ReadCommonScan(Scan *local_node)
Definition: readfuncs.c:1677
uintptr_t Datum
Definition: postgres.h:372
static void ReadCommonJoin(Join *local_node)
Definition: readfuncs.c:1963
static GatherMerge * _readGatherMerge(void)
Definition: readfuncs.c:2176
static DeclareCursorStmt * _readDeclareCursorStmt(void)
Definition: readfuncs.c:290
static Gather * _readGather(void)
Definition: readfuncs.c:2159
#define READ_TEMP_LOCALS()
Definition: readfuncs.c:52
const char * extnodename
Definition: extensible.h:35
static Var * _readVar(void)
Definition: readfuncs.c:507
#define READ_LOCATION_FIELD(fldname)
Definition: readfuncs.c:117
RowCompareType
Definition: primnodes.h:1017
static SampleScan * _readSampleScan(void)
Definition: readfuncs.c:1716
static SubPlan * _readSubPlan(void)
Definition: readfuncs.c:2315
#define READ_LOCALS(nodeTypeName)
Definition: readfuncs.c:57
#define NULL
Definition: c.h:229
static TidScan * _readTidScan(void)
Definition: readfuncs.c:1804
static CoerceToDomainValue * _readCoerceToDomainValue(void)
Definition: readfuncs.c:1162
static TableFuncScan * _readTableFuncScan(void)
Definition: readfuncs.c:1865
static IntoClause * _readIntoClause(void)
Definition: readfuncs.c:488
static Const * _readConst(void)
Definition: readfuncs.c:528
static SetOperationStmt * _readSetOperationStmt(void)
Definition: readfuncs.c:413
static PlannedStmt * _readPlannedStmt(void)
Definition: readfuncs.c:1455
XmlOptionType
Definition: primnodes.h:1133
size_t Size
Definition: c.h:356
static Material * _readMaterial(void)
Definition: readfuncs.c:2046
AggSplit
Definition: nodes.h:757
#define READ_OID_FIELD(fldname)
Definition: readfuncs.c:80
static int list_length(const List *l)
Definition: pg_list.h:89
static CaseTestExpr * _readCaseTestExpr(void)
Definition: readfuncs.c:974
RowMarkType
Definition: plannodes.h:950
static Alias * _readAlias(void)
Definition: readfuncs.c:435
static BitmapOr * _readBitmapOr(void)
Definition: readfuncs.c:1660
static const struct fns functions
Definition: regcomp.c:299
static RangeTblRef * _readRangeTblRef(void)
Definition: readfuncs.c:1257
static RecursiveUnion * _readRecursiveUnion(void)
Definition: readfuncs.c:1626
Bitmapset * bms_add_member(Bitmapset *a, int x)
Definition: bitmapset.c:698
static FieldStore * _readFieldStore(void)
Definition: readfuncs.c:839
static CoalesceExpr * _readCoalesceExpr(void)
Definition: readfuncs.c:1042
const char * name
Definition: encode.c:521
#define READ_BITMAPSET_FIELD(fldname)
Definition: readfuncs.c:130
Node * parseNodeString(void)
Definition: readfuncs.c:2423
static SetToDefault * _readSetToDefault(void)
Definition: readfuncs.c:1178
static WithCheckOption * _readWithCheckOption(void)
Definition: readfuncs.c:305
static InferenceElem * _readInferenceElem(void)
Definition: readfuncs.c:1223
AggStrategy
Definition: nodes.h:735
static ScalarArrayOpExpr * _readScalarArrayOpExpr(void)
Definition: readfuncs.c:756
void * palloc(Size size)
Definition: mcxt.c:849
int xmloption
Definition: xml.c:97
SetOpCmd
Definition: nodes.h:779
int i
static BoolExpr * _readBoolExpr(void)
Definition: readfuncs.c:774
static CustomScan * _readCustomScan(void)
Definition: readfuncs.c:1933
DefElemAction
Definition: parsenodes.h:707
void * arg
static CommonTableExpr * _readCommonTableExpr(void)
Definition: readfuncs.c:391
static ArrayExpr * _readArrayExpr(void)
Definition: readfuncs.c:989
GroupingSetKind
Definition: parsenodes.h:1241
#define READ_STRING_FIELD(fldname)
Definition: readfuncs.c:111
#define READ_DONE()
Definition: readfuncs.c:156
#define READ_INT_FIELD(fldname)
Definition: readfuncs.c:62
Definition: plannodes.h:780
#define elog
Definition: elog.h:219
static RangeTblFunction * _readRangeTblFunction(void)
Definition: readfuncs.c:1404
static BooleanTest * _readBooleanTest(void)
Definition: readfuncs.c:1129
static Plan * _readPlan(void)
Definition: readfuncs.c:1514
static XmlExpr * _readXmlExpr(void)
Definition: readfuncs.c:1092
#define READ_ATTRNUMBER_ARRAY(fldname, len)
Definition: readfuncs.c:136
CoercionForm
Definition: primnodes.h:436
static TableFunc * _readTableFunc(void)
Definition: readfuncs.c:466
#define READ_INT_ARRAY(fldname, len)
Definition: readfuncs.c:146
const CustomScanMethods * GetCustomScanMethods(const char *CustomName, bool missing_ok)
Definition: extensible.c:137
static TableSampleClause * _readTableSampleClause(void)
Definition: readfuncs.c:1423
static NestLoopParam * _readNestLoopParam(void)
Definition: readfuncs.c:2267
static ProjectSet * _readProjectSet(void)
Definition: readfuncs.c:1542
OnConflictAction
Definition: nodes.h:799
static BitmapHeapScan * _readBitmapHeapScan(void)
Definition: readfuncs.c:1789
int16 AttrNumber
Definition: attnum.h:21
LockWaitPolicy
Definition: lockoptions.h:36
long val
Definition: informix.c:689
static Bitmapset * _readBitmapset(void)
Definition: readfuncs.c:178
CmdType
Definition: nodes.h:649
static Join * _readJoin(void)
Definition: readfuncs.c:1978
static Sort * _readSort(void)
Definition: readfuncs.c:2059
static CoerceViaIO * _readCoerceViaIO(void)
Definition: readfuncs.c:873
static Group * _readGroup(void)
Definition: readfuncs.c:2078
static GroupingSet * _readGroupingSet(void)
Definition: readfuncs.c:339
static WorkTableScan * _readWorkTableScan(void)
Definition: readfuncs.c:1896
const ExtensibleNodeMethods * GetExtensibleNodeMethods(const char *extnodename, bool missing_ok)
Definition: extensible.c:125
#define nullable_string(token, length)
Definition: readfuncs.c:170
Plan plan
Definition: plannodes.h:666
OverridingKind
Definition: parsenodes.h:30