]> granicus.if.org Git - postgresql/blobdiff - src/backend/nodes/outfuncs.c
Fix PARAM_EXEC assignment mechanism to be safe in the presence of WITH.
[postgresql] / src / backend / nodes / outfuncs.c
index c8eccce5a7a3d22d187b05d8e60eb19d5fd59fe5..02a0f62a53a4e3d06a3ad48d523e959d5d6b2ab7 100644 (file)
@@ -3,7 +3,7 @@
  * outfuncs.c
  *       Output functions for Postgres tree nodes.
  *
- * Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
@@ -96,7 +96,7 @@
 
 #define booltostr(x)  ((x) ? "true" : "false")
 
-static void _outNode(StringInfo str, void *obj);
+static void _outNode(StringInfo str, const void *obj);
 
 
 /*
@@ -107,7 +107,7 @@ static void _outNode(StringInfo str, void *obj);
  *       If a null or empty string is given, it is encoded as "<>".
  */
 static void
-_outToken(StringInfo str, char *s)
+_outToken(StringInfo str, const char *s)
 {
        if (s == NULL || *s == '\0')
        {
@@ -139,9 +139,9 @@ _outToken(StringInfo str, char *s)
 }
 
 static void
-_outList(StringInfo str, List *node)
+_outList(StringInfo str, const List *node)
 {
-       ListCell   *lc;
+       const ListCell *lc;
 
        appendStringInfoChar(str, '(');
 
@@ -182,7 +182,7 @@ _outList(StringInfo str, List *node)
  * Note: the output format is "(b int int ...)", similar to an integer List.
  */
 static void
-_outBitmapset(StringInfo str, Bitmapset *bms)
+_outBitmapset(StringInfo str, const Bitmapset *bms)
 {
        Bitmapset  *tmpset;
        int                     x;
@@ -237,19 +237,20 @@ _outDatum(StringInfo str, Datum value, int typlen, bool typbyval)
  */
 
 static void
-_outPlannedStmt(StringInfo str, PlannedStmt *node)
+_outPlannedStmt(StringInfo str, const PlannedStmt *node)
 {
        WRITE_NODE_TYPE("PLANNEDSTMT");
 
        WRITE_ENUM_FIELD(commandType, CmdType);
+       WRITE_UINT_FIELD(queryId);
        WRITE_BOOL_FIELD(hasReturning);
+       WRITE_BOOL_FIELD(hasModifyingCTE);
        WRITE_BOOL_FIELD(canSetTag);
        WRITE_BOOL_FIELD(transientPlan);
        WRITE_NODE_FIELD(planTree);
        WRITE_NODE_FIELD(rtable);
        WRITE_NODE_FIELD(resultRelations);
        WRITE_NODE_FIELD(utilityStmt);
-       WRITE_NODE_FIELD(intoClause);
        WRITE_NODE_FIELD(subplans);
        WRITE_BITMAPSET_FIELD(rewindPlanIDs);
        WRITE_NODE_FIELD(rowMarks);
@@ -262,7 +263,7 @@ _outPlannedStmt(StringInfo str, PlannedStmt *node)
  * print the basic stuff of all nodes that inherit from Plan
  */
 static void
-_outPlanInfo(StringInfo str, Plan *node)
+_outPlanInfo(StringInfo str, const Plan *node)
 {
        WRITE_FLOAT_FIELD(startup_cost, "%.2f");
        WRITE_FLOAT_FIELD(total_cost, "%.2f");
@@ -281,9 +282,9 @@ _outPlanInfo(StringInfo str, Plan *node)
  * print the basic stuff of all nodes that inherit from Scan
  */
 static void
-_outScanInfo(StringInfo str, Scan *node)
+_outScanInfo(StringInfo str, const Scan *node)
 {
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_UINT_FIELD(scanrelid);
 }
@@ -292,9 +293,9 @@ _outScanInfo(StringInfo str, Scan *node)
  * print the basic stuff of all nodes that inherit from Join
  */
 static void
-_outJoinPlanInfo(StringInfo str, Join *node)
+_outJoinPlanInfo(StringInfo str, const Join *node)
 {
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_ENUM_FIELD(jointype, JoinType);
        WRITE_NODE_FIELD(joinqual);
@@ -302,32 +303,34 @@ _outJoinPlanInfo(StringInfo str, Join *node)
 
 
 static void
-_outPlan(StringInfo str, Plan *node)
+_outPlan(StringInfo str, const Plan *node)
 {
        WRITE_NODE_TYPE("PLAN");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 }
 
 static void
-_outResult(StringInfo str, Result *node)
+_outResult(StringInfo str, const Result *node)
 {
        WRITE_NODE_TYPE("RESULT");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_NODE_FIELD(resconstantqual);
 }
 
 static void
-_outModifyTable(StringInfo str, ModifyTable *node)
+_outModifyTable(StringInfo str, const ModifyTable *node)
 {
        WRITE_NODE_TYPE("MODIFYTABLE");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_ENUM_FIELD(operation, CmdType);
+       WRITE_BOOL_FIELD(canSetTag);
        WRITE_NODE_FIELD(resultRelations);
+       WRITE_INT_FIELD(resultRelIndex);
        WRITE_NODE_FIELD(plans);
        WRITE_NODE_FIELD(returningLists);
        WRITE_NODE_FIELD(rowMarks);
@@ -335,23 +338,23 @@ _outModifyTable(StringInfo str, ModifyTable *node)
 }
 
 static void
-_outAppend(StringInfo str, Append *node)
+_outAppend(StringInfo str, const Append *node)
 {
        WRITE_NODE_TYPE("APPEND");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_NODE_FIELD(appendplans);
 }
 
 static void
-_outMergeAppend(StringInfo str, MergeAppend *node)
+_outMergeAppend(StringInfo str, const MergeAppend *node)
 {
        int                     i;
 
        WRITE_NODE_TYPE("MERGEAPPEND");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_NODE_FIELD(mergeplans);
 
@@ -365,19 +368,23 @@ _outMergeAppend(StringInfo str, MergeAppend *node)
        for (i = 0; i < node->numCols; i++)
                appendStringInfo(str, " %u", node->sortOperators[i]);
 
+       appendStringInfo(str, " :collations");
+       for (i = 0; i < node->numCols; i++)
+               appendStringInfo(str, " %u", node->collations[i]);
+
        appendStringInfo(str, " :nullsFirst");
        for (i = 0; i < node->numCols; i++)
                appendStringInfo(str, " %s", booltostr(node->nullsFirst[i]));
 }
 
 static void
-_outRecursiveUnion(StringInfo str, RecursiveUnion *node)
+_outRecursiveUnion(StringInfo str, const RecursiveUnion *node)
 {
        int                     i;
 
        WRITE_NODE_TYPE("RECURSIVEUNION");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_INT_FIELD(wtParam);
        WRITE_INT_FIELD(numCols);
@@ -394,47 +401,47 @@ _outRecursiveUnion(StringInfo str, RecursiveUnion *node)
 }
 
 static void
-_outBitmapAnd(StringInfo str, BitmapAnd *node)
+_outBitmapAnd(StringInfo str, const BitmapAnd *node)
 {
        WRITE_NODE_TYPE("BITMAPAND");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_NODE_FIELD(bitmapplans);
 }
 
 static void
-_outBitmapOr(StringInfo str, BitmapOr *node)
+_outBitmapOr(StringInfo str, const BitmapOr *node)
 {
        WRITE_NODE_TYPE("BITMAPOR");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_NODE_FIELD(bitmapplans);
 }
 
 static void
-_outScan(StringInfo str, Scan *node)
+_outScan(StringInfo str, const Scan *node)
 {
        WRITE_NODE_TYPE("SCAN");
 
-       _outScanInfo(str, (Scan *) node);
+       _outScanInfo(str, node);
 }
 
 static void
-_outSeqScan(StringInfo str, SeqScan *node)
+_outSeqScan(StringInfo str, const SeqScan *node)
 {
        WRITE_NODE_TYPE("SEQSCAN");
 
-       _outScanInfo(str, (Scan *) node);
+       _outScanInfo(str, (const Scan *) node);
 }
 
 static void
-_outIndexScan(StringInfo str, IndexScan *node)
+_outIndexScan(StringInfo str, const IndexScan *node)
 {
        WRITE_NODE_TYPE("INDEXSCAN");
 
-       _outScanInfo(str, (Scan *) node);
+       _outScanInfo(str, (const Scan *) node);
 
        WRITE_OID_FIELD(indexid);
        WRITE_NODE_FIELD(indexqual);
@@ -445,11 +452,25 @@ _outIndexScan(StringInfo str, IndexScan *node)
 }
 
 static void
-_outBitmapIndexScan(StringInfo str, BitmapIndexScan *node)
+_outIndexOnlyScan(StringInfo str, const IndexOnlyScan *node)
+{
+       WRITE_NODE_TYPE("INDEXONLYSCAN");
+
+       _outScanInfo(str, (const Scan *) node);
+
+       WRITE_OID_FIELD(indexid);
+       WRITE_NODE_FIELD(indexqual);
+       WRITE_NODE_FIELD(indexorderby);
+       WRITE_NODE_FIELD(indextlist);
+       WRITE_ENUM_FIELD(indexorderdir, ScanDirection);
+}
+
+static void
+_outBitmapIndexScan(StringInfo str, const BitmapIndexScan *node)
 {
        WRITE_NODE_TYPE("BITMAPINDEXSCAN");
 
-       _outScanInfo(str, (Scan *) node);
+       _outScanInfo(str, (const Scan *) node);
 
        WRITE_OID_FIELD(indexid);
        WRITE_NODE_FIELD(indexqual);
@@ -457,108 +478,119 @@ _outBitmapIndexScan(StringInfo str, BitmapIndexScan *node)
 }
 
 static void
-_outBitmapHeapScan(StringInfo str, BitmapHeapScan *node)
+_outBitmapHeapScan(StringInfo str, const BitmapHeapScan *node)
 {
        WRITE_NODE_TYPE("BITMAPHEAPSCAN");
 
-       _outScanInfo(str, (Scan *) node);
+       _outScanInfo(str, (const Scan *) node);
 
        WRITE_NODE_FIELD(bitmapqualorig);
 }
 
 static void
-_outTidScan(StringInfo str, TidScan *node)
+_outTidScan(StringInfo str, const TidScan *node)
 {
        WRITE_NODE_TYPE("TIDSCAN");
 
-       _outScanInfo(str, (Scan *) node);
+       _outScanInfo(str, (const Scan *) node);
 
        WRITE_NODE_FIELD(tidquals);
 }
 
 static void
-_outSubqueryScan(StringInfo str, SubqueryScan *node)
+_outSubqueryScan(StringInfo str, const SubqueryScan *node)
 {
        WRITE_NODE_TYPE("SUBQUERYSCAN");
 
-       _outScanInfo(str, (Scan *) node);
+       _outScanInfo(str, (const Scan *) node);
 
        WRITE_NODE_FIELD(subplan);
-       WRITE_NODE_FIELD(subrtable);
-       WRITE_NODE_FIELD(subrowmark);
 }
 
 static void
-_outFunctionScan(StringInfo str, FunctionScan *node)
+_outFunctionScan(StringInfo str, const FunctionScan *node)
 {
        WRITE_NODE_TYPE("FUNCTIONSCAN");
 
-       _outScanInfo(str, (Scan *) node);
+       _outScanInfo(str, (const Scan *) node);
 
        WRITE_NODE_FIELD(funcexpr);
        WRITE_NODE_FIELD(funccolnames);
        WRITE_NODE_FIELD(funccoltypes);
        WRITE_NODE_FIELD(funccoltypmods);
+       WRITE_NODE_FIELD(funccolcollations);
 }
 
 static void
-_outValuesScan(StringInfo str, ValuesScan *node)
+_outValuesScan(StringInfo str, const ValuesScan *node)
 {
        WRITE_NODE_TYPE("VALUESSCAN");
 
-       _outScanInfo(str, (Scan *) node);
+       _outScanInfo(str, (const Scan *) node);
 
        WRITE_NODE_FIELD(values_lists);
 }
 
 static void
-_outCteScan(StringInfo str, CteScan *node)
+_outCteScan(StringInfo str, const CteScan *node)
 {
        WRITE_NODE_TYPE("CTESCAN");
 
-       _outScanInfo(str, (Scan *) node);
+       _outScanInfo(str, (const Scan *) node);
 
        WRITE_INT_FIELD(ctePlanId);
        WRITE_INT_FIELD(cteParam);
 }
 
 static void
-_outWorkTableScan(StringInfo str, WorkTableScan *node)
+_outWorkTableScan(StringInfo str, const WorkTableScan *node)
 {
        WRITE_NODE_TYPE("WORKTABLESCAN");
 
-       _outScanInfo(str, (Scan *) node);
+       _outScanInfo(str, (const Scan *) node);
 
        WRITE_INT_FIELD(wtParam);
 }
 
 static void
-_outJoin(StringInfo str, Join *node)
+_outForeignScan(StringInfo str, const ForeignScan *node)
+{
+       WRITE_NODE_TYPE("FOREIGNSCAN");
+
+       _outScanInfo(str, (const Scan *) node);
+
+       WRITE_NODE_FIELD(fdw_exprs);
+       WRITE_NODE_FIELD(fdw_private);
+       WRITE_BOOL_FIELD(fsSystemCol);
+}
+
+static void
+_outJoin(StringInfo str, const Join *node)
 {
        WRITE_NODE_TYPE("JOIN");
 
-       _outJoinPlanInfo(str, (Join *) node);
+       _outJoinPlanInfo(str, (const Join *) node);
 }
 
 static void
-_outNestLoop(StringInfo str, NestLoop *node)
+_outNestLoop(StringInfo str, const NestLoop *node)
 {
        WRITE_NODE_TYPE("NESTLOOP");
 
-       _outJoinPlanInfo(str, (Join *) node);
+       _outJoinPlanInfo(str, (const Join *) node);
 
        WRITE_NODE_FIELD(nestParams);
 }
 
 static void
-_outMergeJoin(StringInfo str, MergeJoin *node)
+_outMergeJoin(StringInfo str, const MergeJoin *node)
 {
        int                     numCols;
        int                     i;
 
        WRITE_NODE_TYPE("MERGEJOIN");
 
-       _outJoinPlanInfo(str, (Join *) node);
+       _outJoinPlanInfo(str, (const Join *) node);
 
        WRITE_NODE_FIELD(mergeclauses);
 
@@ -568,6 +600,10 @@ _outMergeJoin(StringInfo str, MergeJoin *node)
        for (i = 0; i < numCols; i++)
                appendStringInfo(str, " %u", node->mergeFamilies[i]);
 
+       appendStringInfo(str, " :mergeCollations");
+       for (i = 0; i < numCols; i++)
+               appendStringInfo(str, " %u", node->mergeCollations[i]);
+
        appendStringInfo(str, " :mergeStrategies");
        for (i = 0; i < numCols; i++)
                appendStringInfo(str, " %d", node->mergeStrategies[i]);
@@ -578,23 +614,23 @@ _outMergeJoin(StringInfo str, MergeJoin *node)
 }
 
 static void
-_outHashJoin(StringInfo str, HashJoin *node)
+_outHashJoin(StringInfo str, const HashJoin *node)
 {
        WRITE_NODE_TYPE("HASHJOIN");
 
-       _outJoinPlanInfo(str, (Join *) node);
+       _outJoinPlanInfo(str, (const Join *) node);
 
        WRITE_NODE_FIELD(hashclauses);
 }
 
 static void
-_outAgg(StringInfo str, Agg *node)
+_outAgg(StringInfo str, const Agg *node)
 {
        int                     i;
 
        WRITE_NODE_TYPE("AGG");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_ENUM_FIELD(aggstrategy, AggStrategy);
        WRITE_INT_FIELD(numCols);
@@ -611,13 +647,13 @@ _outAgg(StringInfo str, Agg *node)
 }
 
 static void
-_outWindowAgg(StringInfo str, WindowAgg *node)
+_outWindowAgg(StringInfo str, const WindowAgg *node)
 {
        int                     i;
 
        WRITE_NODE_TYPE("WINDOWAGG");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_UINT_FIELD(winref);
        WRITE_INT_FIELD(partNumCols);
@@ -646,13 +682,13 @@ _outWindowAgg(StringInfo str, WindowAgg *node)
 }
 
 static void
-_outGroup(StringInfo str, Group *node)
+_outGroup(StringInfo str, const Group *node)
 {
        int                     i;
 
        WRITE_NODE_TYPE("GROUP");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_INT_FIELD(numCols);
 
@@ -666,21 +702,21 @@ _outGroup(StringInfo str, Group *node)
 }
 
 static void
-_outMaterial(StringInfo str, Material *node)
+_outMaterial(StringInfo str, const Material *node)
 {
        WRITE_NODE_TYPE("MATERIAL");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 }
 
 static void
-_outSort(StringInfo str, Sort *node)
+_outSort(StringInfo str, const Sort *node)
 {
        int                     i;
 
        WRITE_NODE_TYPE("SORT");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_INT_FIELD(numCols);
 
@@ -692,19 +728,23 @@ _outSort(StringInfo str, Sort *node)
        for (i = 0; i < node->numCols; i++)
                appendStringInfo(str, " %u", node->sortOperators[i]);
 
+       appendStringInfo(str, " :collations");
+       for (i = 0; i < node->numCols; i++)
+               appendStringInfo(str, " %u", node->collations[i]);
+
        appendStringInfo(str, " :nullsFirst");
        for (i = 0; i < node->numCols; i++)
                appendStringInfo(str, " %s", booltostr(node->nullsFirst[i]));
 }
 
 static void
-_outUnique(StringInfo str, Unique *node)
+_outUnique(StringInfo str, const Unique *node)
 {
        int                     i;
 
        WRITE_NODE_TYPE("UNIQUE");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_INT_FIELD(numCols);
 
@@ -718,11 +758,11 @@ _outUnique(StringInfo str, Unique *node)
 }
 
 static void
-_outHash(StringInfo str, Hash *node)
+_outHash(StringInfo str, const Hash *node)
 {
        WRITE_NODE_TYPE("HASH");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_OID_FIELD(skewTable);
        WRITE_INT_FIELD(skewColumn);
@@ -732,13 +772,13 @@ _outHash(StringInfo str, Hash *node)
 }
 
 static void
-_outSetOp(StringInfo str, SetOp *node)
+_outSetOp(StringInfo str, const SetOp *node)
 {
        int                     i;
 
        WRITE_NODE_TYPE("SETOP");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_ENUM_FIELD(cmd, SetOpCmd);
        WRITE_ENUM_FIELD(strategy, SetOpStrategy);
@@ -758,29 +798,29 @@ _outSetOp(StringInfo str, SetOp *node)
 }
 
 static void
-_outLockRows(StringInfo str, LockRows *node)
+_outLockRows(StringInfo str, const LockRows *node)
 {
        WRITE_NODE_TYPE("LOCKROWS");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_NODE_FIELD(rowMarks);
        WRITE_INT_FIELD(epqParam);
 }
 
 static void
-_outLimit(StringInfo str, Limit *node)
+_outLimit(StringInfo str, const Limit *node)
 {
        WRITE_NODE_TYPE("LIMIT");
 
-       _outPlanInfo(str, (Plan *) node);
+       _outPlanInfo(str, (const Plan *) node);
 
        WRITE_NODE_FIELD(limitOffset);
        WRITE_NODE_FIELD(limitCount);
 }
 
 static void
-_outNestLoopParam(StringInfo str, NestLoopParam *node)
+_outNestLoopParam(StringInfo str, const NestLoopParam *node)
 {
        WRITE_NODE_TYPE("NESTLOOPPARAM");
 
@@ -789,26 +829,25 @@ _outNestLoopParam(StringInfo str, NestLoopParam *node)
 }
 
 static void
-_outPlanRowMark(StringInfo str, PlanRowMark *node)
+_outPlanRowMark(StringInfo str, const PlanRowMark *node)
 {
        WRITE_NODE_TYPE("PLANROWMARK");
 
        WRITE_UINT_FIELD(rti);
        WRITE_UINT_FIELD(prti);
+       WRITE_UINT_FIELD(rowmarkId);
        WRITE_ENUM_FIELD(markType, RowMarkType);
        WRITE_BOOL_FIELD(noWait);
        WRITE_BOOL_FIELD(isParent);
 }
 
 static void
-_outPlanInvalItem(StringInfo str, PlanInvalItem *node)
+_outPlanInvalItem(StringInfo str, const PlanInvalItem *node)
 {
        WRITE_NODE_TYPE("PLANINVALITEM");
 
        WRITE_INT_FIELD(cacheId);
-       appendStringInfo(str, " :tupleId (%u,%u)",
-                                        ItemPointerGetBlockNumber(&node->tupleId),
-                                        ItemPointerGetOffsetNumber(&node->tupleId));
+       WRITE_UINT_FIELD(hashValue);
 }
 
 /*****************************************************************************
@@ -818,7 +857,7 @@ _outPlanInvalItem(StringInfo str, PlanInvalItem *node)
  *****************************************************************************/
 
 static void
-_outAlias(StringInfo str, Alias *node)
+_outAlias(StringInfo str, const Alias *node)
 {
        WRITE_NODE_TYPE("ALIAS");
 
@@ -827,7 +866,7 @@ _outAlias(StringInfo str, Alias *node)
 }
 
 static void
-_outRangeVar(StringInfo str, RangeVar *node)
+_outRangeVar(StringInfo str, const RangeVar *node)
 {
        WRITE_NODE_TYPE("RANGEVAR");
 
@@ -844,7 +883,7 @@ _outRangeVar(StringInfo str, RangeVar *node)
 }
 
 static void
-_outIntoClause(StringInfo str, IntoClause *node)
+_outIntoClause(StringInfo str, const IntoClause *node)
 {
        WRITE_NODE_TYPE("INTOCLAUSE");
 
@@ -853,10 +892,11 @@ _outIntoClause(StringInfo str, IntoClause *node)
        WRITE_NODE_FIELD(options);
        WRITE_ENUM_FIELD(onCommit, OnCommitAction);
        WRITE_STRING_FIELD(tableSpaceName);
+       WRITE_BOOL_FIELD(skipData);
 }
 
 static void
-_outVar(StringInfo str, Var *node)
+_outVar(StringInfo str, const Var *node)
 {
        WRITE_NODE_TYPE("VAR");
 
@@ -864,6 +904,7 @@ _outVar(StringInfo str, Var *node)
        WRITE_INT_FIELD(varattno);
        WRITE_OID_FIELD(vartype);
        WRITE_INT_FIELD(vartypmod);
+       WRITE_OID_FIELD(varcollid);
        WRITE_UINT_FIELD(varlevelsup);
        WRITE_UINT_FIELD(varnoold);
        WRITE_INT_FIELD(varoattno);
@@ -871,12 +912,13 @@ _outVar(StringInfo str, Var *node)
 }
 
 static void
-_outConst(StringInfo str, Const *node)
+_outConst(StringInfo str, const Const *node)
 {
        WRITE_NODE_TYPE("CONST");
 
        WRITE_OID_FIELD(consttype);
        WRITE_INT_FIELD(consttypmod);
+       WRITE_OID_FIELD(constcollid);
        WRITE_INT_FIELD(constlen);
        WRITE_BOOL_FIELD(constbyval);
        WRITE_BOOL_FIELD(constisnull);
@@ -890,7 +932,7 @@ _outConst(StringInfo str, Const *node)
 }
 
 static void
-_outParam(StringInfo str, Param *node)
+_outParam(StringInfo str, const Param *node)
 {
        WRITE_NODE_TYPE("PARAM");
 
@@ -898,16 +940,19 @@ _outParam(StringInfo str, Param *node)
        WRITE_INT_FIELD(paramid);
        WRITE_OID_FIELD(paramtype);
        WRITE_INT_FIELD(paramtypmod);
+       WRITE_OID_FIELD(paramcollid);
        WRITE_LOCATION_FIELD(location);
 }
 
 static void
-_outAggref(StringInfo str, Aggref *node)
+_outAggref(StringInfo str, const Aggref *node)
 {
        WRITE_NODE_TYPE("AGGREF");
 
        WRITE_OID_FIELD(aggfnoid);
        WRITE_OID_FIELD(aggtype);
+       WRITE_OID_FIELD(aggcollid);
+       WRITE_OID_FIELD(inputcollid);
        WRITE_NODE_FIELD(args);
        WRITE_NODE_FIELD(aggorder);
        WRITE_NODE_FIELD(aggdistinct);
@@ -917,12 +962,14 @@ _outAggref(StringInfo str, Aggref *node)
 }
 
 static void
-_outWindowFunc(StringInfo str, WindowFunc *node)
+_outWindowFunc(StringInfo str, const WindowFunc *node)
 {
        WRITE_NODE_TYPE("WINDOWFUNC");
 
        WRITE_OID_FIELD(winfnoid);
        WRITE_OID_FIELD(wintype);
+       WRITE_OID_FIELD(wincollid);
+       WRITE_OID_FIELD(inputcollid);
        WRITE_NODE_FIELD(args);
        WRITE_UINT_FIELD(winref);
        WRITE_BOOL_FIELD(winstar);
@@ -931,13 +978,14 @@ _outWindowFunc(StringInfo str, WindowFunc *node)
 }
 
 static void
-_outArrayRef(StringInfo str, ArrayRef *node)
+_outArrayRef(StringInfo str, const ArrayRef *node)
 {
        WRITE_NODE_TYPE("ARRAYREF");
 
        WRITE_OID_FIELD(refarraytype);
        WRITE_OID_FIELD(refelemtype);
        WRITE_INT_FIELD(reftypmod);
+       WRITE_OID_FIELD(refcollid);
        WRITE_NODE_FIELD(refupperindexpr);
        WRITE_NODE_FIELD(reflowerindexpr);
        WRITE_NODE_FIELD(refexpr);
@@ -945,7 +993,7 @@ _outArrayRef(StringInfo str, ArrayRef *node)
 }
 
 static void
-_outFuncExpr(StringInfo str, FuncExpr *node)
+_outFuncExpr(StringInfo str, const FuncExpr *node)
 {
        WRITE_NODE_TYPE("FUNCEXPR");
 
@@ -953,12 +1001,14 @@ _outFuncExpr(StringInfo str, FuncExpr *node)
        WRITE_OID_FIELD(funcresulttype);
        WRITE_BOOL_FIELD(funcretset);
        WRITE_ENUM_FIELD(funcformat, CoercionForm);
+       WRITE_OID_FIELD(funccollid);
+       WRITE_OID_FIELD(inputcollid);
        WRITE_NODE_FIELD(args);
        WRITE_LOCATION_FIELD(location);
 }
 
 static void
-_outNamedArgExpr(StringInfo str, NamedArgExpr *node)
+_outNamedArgExpr(StringInfo str, const NamedArgExpr *node)
 {
        WRITE_NODE_TYPE("NAMEDARGEXPR");
 
@@ -969,7 +1019,7 @@ _outNamedArgExpr(StringInfo str, NamedArgExpr *node)
 }
 
 static void
-_outOpExpr(StringInfo str, OpExpr *node)
+_outOpExpr(StringInfo str, const OpExpr *node)
 {
        WRITE_NODE_TYPE("OPEXPR");
 
@@ -977,12 +1027,14 @@ _outOpExpr(StringInfo str, OpExpr *node)
        WRITE_OID_FIELD(opfuncid);
        WRITE_OID_FIELD(opresulttype);
        WRITE_BOOL_FIELD(opretset);
+       WRITE_OID_FIELD(opcollid);
+       WRITE_OID_FIELD(inputcollid);
        WRITE_NODE_FIELD(args);
        WRITE_LOCATION_FIELD(location);
 }
 
 static void
-_outDistinctExpr(StringInfo str, DistinctExpr *node)
+_outDistinctExpr(StringInfo str, const DistinctExpr *node)
 {
        WRITE_NODE_TYPE("DISTINCTEXPR");
 
@@ -990,24 +1042,42 @@ _outDistinctExpr(StringInfo str, DistinctExpr *node)
        WRITE_OID_FIELD(opfuncid);
        WRITE_OID_FIELD(opresulttype);
        WRITE_BOOL_FIELD(opretset);
+       WRITE_OID_FIELD(opcollid);
+       WRITE_OID_FIELD(inputcollid);
        WRITE_NODE_FIELD(args);
        WRITE_LOCATION_FIELD(location);
 }
 
 static void
-_outScalarArrayOpExpr(StringInfo str, ScalarArrayOpExpr *node)
+_outNullIfExpr(StringInfo str, const NullIfExpr *node)
+{
+       WRITE_NODE_TYPE("NULLIFEXPR");
+
+       WRITE_OID_FIELD(opno);
+       WRITE_OID_FIELD(opfuncid);
+       WRITE_OID_FIELD(opresulttype);
+       WRITE_BOOL_FIELD(opretset);
+       WRITE_OID_FIELD(opcollid);
+       WRITE_OID_FIELD(inputcollid);
+       WRITE_NODE_FIELD(args);
+       WRITE_LOCATION_FIELD(location);
+}
+
+static void
+_outScalarArrayOpExpr(StringInfo str, const ScalarArrayOpExpr *node)
 {
        WRITE_NODE_TYPE("SCALARARRAYOPEXPR");
 
        WRITE_OID_FIELD(opno);
        WRITE_OID_FIELD(opfuncid);
        WRITE_BOOL_FIELD(useOr);
+       WRITE_OID_FIELD(inputcollid);
        WRITE_NODE_FIELD(args);
        WRITE_LOCATION_FIELD(location);
 }
 
 static void
-_outBoolExpr(StringInfo str, BoolExpr *node)
+_outBoolExpr(StringInfo str, const BoolExpr *node)
 {
        char       *opstr = NULL;
 
@@ -1034,7 +1104,7 @@ _outBoolExpr(StringInfo str, BoolExpr *node)
 }
 
 static void
-_outSubLink(StringInfo str, SubLink *node)
+_outSubLink(StringInfo str, const SubLink *node)
 {
        WRITE_NODE_TYPE("SUBLINK");
 
@@ -1046,7 +1116,7 @@ _outSubLink(StringInfo str, SubLink *node)
 }
 
 static void
-_outSubPlan(StringInfo str, SubPlan *node)
+_outSubPlan(StringInfo str, const SubPlan *node)
 {
        WRITE_NODE_TYPE("SUBPLAN");
 
@@ -1057,6 +1127,7 @@ _outSubPlan(StringInfo str, SubPlan *node)
        WRITE_STRING_FIELD(plan_name);
        WRITE_OID_FIELD(firstColType);
        WRITE_INT_FIELD(firstColTypmod);
+       WRITE_OID_FIELD(firstColCollation);
        WRITE_BOOL_FIELD(useHashTable);
        WRITE_BOOL_FIELD(unknownEqFalse);
        WRITE_NODE_FIELD(setParam);
@@ -1067,7 +1138,7 @@ _outSubPlan(StringInfo str, SubPlan *node)
 }
 
 static void
-_outAlternativeSubPlan(StringInfo str, AlternativeSubPlan *node)
+_outAlternativeSubPlan(StringInfo str, const AlternativeSubPlan *node)
 {
        WRITE_NODE_TYPE("ALTERNATIVESUBPLAN");
 
@@ -1075,7 +1146,7 @@ _outAlternativeSubPlan(StringInfo str, AlternativeSubPlan *node)
 }
 
 static void
-_outFieldSelect(StringInfo str, FieldSelect *node)
+_outFieldSelect(StringInfo str, const FieldSelect *node)
 {
        WRITE_NODE_TYPE("FIELDSELECT");
 
@@ -1083,10 +1154,11 @@ _outFieldSelect(StringInfo str, FieldSelect *node)
        WRITE_INT_FIELD(fieldnum);
        WRITE_OID_FIELD(resulttype);
        WRITE_INT_FIELD(resulttypmod);
+       WRITE_OID_FIELD(resultcollid);
 }
 
 static void
-_outFieldStore(StringInfo str, FieldStore *node)
+_outFieldStore(StringInfo str, const FieldStore *node)
 {
        WRITE_NODE_TYPE("FIELDSTORE");
 
@@ -1097,30 +1169,32 @@ _outFieldStore(StringInfo str, FieldStore *node)
 }
 
 static void
-_outRelabelType(StringInfo str, RelabelType *node)
+_outRelabelType(StringInfo str, const RelabelType *node)
 {
        WRITE_NODE_TYPE("RELABELTYPE");
 
        WRITE_NODE_FIELD(arg);
        WRITE_OID_FIELD(resulttype);
        WRITE_INT_FIELD(resulttypmod);
+       WRITE_OID_FIELD(resultcollid);
        WRITE_ENUM_FIELD(relabelformat, CoercionForm);
        WRITE_LOCATION_FIELD(location);
 }
 
 static void
-_outCoerceViaIO(StringInfo str, CoerceViaIO *node)
+_outCoerceViaIO(StringInfo str, const CoerceViaIO *node)
 {
        WRITE_NODE_TYPE("COERCEVIAIO");
 
        WRITE_NODE_FIELD(arg);
        WRITE_OID_FIELD(resulttype);
+       WRITE_OID_FIELD(resultcollid);
        WRITE_ENUM_FIELD(coerceformat, CoercionForm);
        WRITE_LOCATION_FIELD(location);
 }
 
 static void
-_outArrayCoerceExpr(StringInfo str, ArrayCoerceExpr *node)
+_outArrayCoerceExpr(StringInfo str, const ArrayCoerceExpr *node)
 {
        WRITE_NODE_TYPE("ARRAYCOERCEEXPR");
 
@@ -1128,13 +1202,14 @@ _outArrayCoerceExpr(StringInfo str, ArrayCoerceExpr *node)
        WRITE_OID_FIELD(elemfuncid);
        WRITE_OID_FIELD(resulttype);
        WRITE_INT_FIELD(resulttypmod);
+       WRITE_OID_FIELD(resultcollid);
        WRITE_BOOL_FIELD(isExplicit);
        WRITE_ENUM_FIELD(coerceformat, CoercionForm);
        WRITE_LOCATION_FIELD(location);
 }
 
 static void
-_outConvertRowtypeExpr(StringInfo str, ConvertRowtypeExpr *node)
+_outConvertRowtypeExpr(StringInfo str, const ConvertRowtypeExpr *node)
 {
        WRITE_NODE_TYPE("CONVERTROWTYPEEXPR");
 
@@ -1145,11 +1220,22 @@ _outConvertRowtypeExpr(StringInfo str, ConvertRowtypeExpr *node)
 }
 
 static void
-_outCaseExpr(StringInfo str, CaseExpr *node)
+_outCollateExpr(StringInfo str, const CollateExpr *node)
+{
+       WRITE_NODE_TYPE("COLLATE");
+
+       WRITE_NODE_FIELD(arg);
+       WRITE_OID_FIELD(collOid);
+       WRITE_LOCATION_FIELD(location);
+}
+
+static void
+_outCaseExpr(StringInfo str, const CaseExpr *node)
 {
        WRITE_NODE_TYPE("CASE");
 
        WRITE_OID_FIELD(casetype);
+       WRITE_OID_FIELD(casecollid);
        WRITE_NODE_FIELD(arg);
        WRITE_NODE_FIELD(args);
        WRITE_NODE_FIELD(defresult);
@@ -1157,7 +1243,7 @@ _outCaseExpr(StringInfo str, CaseExpr *node)
 }
 
 static void
-_outCaseWhen(StringInfo str, CaseWhen *node)
+_outCaseWhen(StringInfo str, const CaseWhen *node)
 {
        WRITE_NODE_TYPE("WHEN");
 
@@ -1167,20 +1253,22 @@ _outCaseWhen(StringInfo str, CaseWhen *node)
 }
 
 static void
-_outCaseTestExpr(StringInfo str, CaseTestExpr *node)
+_outCaseTestExpr(StringInfo str, const CaseTestExpr *node)
 {
        WRITE_NODE_TYPE("CASETESTEXPR");
 
        WRITE_OID_FIELD(typeId);
        WRITE_INT_FIELD(typeMod);
+       WRITE_OID_FIELD(collation);
 }
 
 static void
-_outArrayExpr(StringInfo str, ArrayExpr *node)
+_outArrayExpr(StringInfo str, const ArrayExpr *node)
 {
        WRITE_NODE_TYPE("ARRAY");
 
        WRITE_OID_FIELD(array_typeid);
+       WRITE_OID_FIELD(array_collid);
        WRITE_OID_FIELD(element_typeid);
        WRITE_NODE_FIELD(elements);
        WRITE_BOOL_FIELD(multidims);
@@ -1188,7 +1276,7 @@ _outArrayExpr(StringInfo str, ArrayExpr *node)
 }
 
 static void
-_outRowExpr(StringInfo str, RowExpr *node)
+_outRowExpr(StringInfo str, const RowExpr *node)
 {
        WRITE_NODE_TYPE("ROW");
 
@@ -1200,40 +1288,44 @@ _outRowExpr(StringInfo str, RowExpr *node)
 }
 
 static void
-_outRowCompareExpr(StringInfo str, RowCompareExpr *node)
+_outRowCompareExpr(StringInfo str, const RowCompareExpr *node)
 {
        WRITE_NODE_TYPE("ROWCOMPARE");
 
        WRITE_ENUM_FIELD(rctype, RowCompareType);
        WRITE_NODE_FIELD(opnos);
        WRITE_NODE_FIELD(opfamilies);
+       WRITE_NODE_FIELD(inputcollids);
        WRITE_NODE_FIELD(largs);
        WRITE_NODE_FIELD(rargs);
 }
 
 static void
-_outCoalesceExpr(StringInfo str, CoalesceExpr *node)
+_outCoalesceExpr(StringInfo str, const CoalesceExpr *node)
 {
        WRITE_NODE_TYPE("COALESCE");
 
        WRITE_OID_FIELD(coalescetype);
+       WRITE_OID_FIELD(coalescecollid);
        WRITE_NODE_FIELD(args);
        WRITE_LOCATION_FIELD(location);
 }
 
 static void
-_outMinMaxExpr(StringInfo str, MinMaxExpr *node)
+_outMinMaxExpr(StringInfo str, const MinMaxExpr *node)
 {
        WRITE_NODE_TYPE("MINMAX");
 
        WRITE_OID_FIELD(minmaxtype);
+       WRITE_OID_FIELD(minmaxcollid);
+       WRITE_OID_FIELD(inputcollid);
        WRITE_ENUM_FIELD(op, MinMaxOp);
        WRITE_NODE_FIELD(args);
        WRITE_LOCATION_FIELD(location);
 }
 
 static void
-_outXmlExpr(StringInfo str, XmlExpr *node)
+_outXmlExpr(StringInfo str, const XmlExpr *node)
 {
        WRITE_NODE_TYPE("XMLEXPR");
 
@@ -1249,20 +1341,7 @@ _outXmlExpr(StringInfo str, XmlExpr *node)
 }
 
 static void
-_outNullIfExpr(StringInfo str, NullIfExpr *node)
-{
-       WRITE_NODE_TYPE("NULLIFEXPR");
-
-       WRITE_OID_FIELD(opno);
-       WRITE_OID_FIELD(opfuncid);
-       WRITE_OID_FIELD(opresulttype);
-       WRITE_BOOL_FIELD(opretset);
-       WRITE_NODE_FIELD(args);
-       WRITE_LOCATION_FIELD(location);
-}
-
-static void
-_outNullTest(StringInfo str, NullTest *node)
+_outNullTest(StringInfo str, const NullTest *node)
 {
        WRITE_NODE_TYPE("NULLTEST");
 
@@ -1272,7 +1351,7 @@ _outNullTest(StringInfo str, NullTest *node)
 }
 
 static void
-_outBooleanTest(StringInfo str, BooleanTest *node)
+_outBooleanTest(StringInfo str, const BooleanTest *node)
 {
        WRITE_NODE_TYPE("BOOLEANTEST");
 
@@ -1281,39 +1360,42 @@ _outBooleanTest(StringInfo str, BooleanTest *node)
 }
 
 static void
-_outCoerceToDomain(StringInfo str, CoerceToDomain *node)
+_outCoerceToDomain(StringInfo str, const CoerceToDomain *node)
 {
        WRITE_NODE_TYPE("COERCETODOMAIN");
 
        WRITE_NODE_FIELD(arg);
        WRITE_OID_FIELD(resulttype);
        WRITE_INT_FIELD(resulttypmod);
+       WRITE_OID_FIELD(resultcollid);
        WRITE_ENUM_FIELD(coercionformat, CoercionForm);
        WRITE_LOCATION_FIELD(location);
 }
 
 static void
-_outCoerceToDomainValue(StringInfo str, CoerceToDomainValue *node)
+_outCoerceToDomainValue(StringInfo str, const CoerceToDomainValue *node)
 {
        WRITE_NODE_TYPE("COERCETODOMAINVALUE");
 
        WRITE_OID_FIELD(typeId);
        WRITE_INT_FIELD(typeMod);
+       WRITE_OID_FIELD(collation);
        WRITE_LOCATION_FIELD(location);
 }
 
 static void
-_outSetToDefault(StringInfo str, SetToDefault *node)
+_outSetToDefault(StringInfo str, const SetToDefault *node)
 {
        WRITE_NODE_TYPE("SETTODEFAULT");
 
        WRITE_OID_FIELD(typeId);
        WRITE_INT_FIELD(typeMod);
+       WRITE_OID_FIELD(collation);
        WRITE_LOCATION_FIELD(location);
 }
 
 static void
-_outCurrentOfExpr(StringInfo str, CurrentOfExpr *node)
+_outCurrentOfExpr(StringInfo str, const CurrentOfExpr *node)
 {
        WRITE_NODE_TYPE("CURRENTOFEXPR");
 
@@ -1323,7 +1405,7 @@ _outCurrentOfExpr(StringInfo str, CurrentOfExpr *node)
 }
 
 static void
-_outTargetEntry(StringInfo str, TargetEntry *node)
+_outTargetEntry(StringInfo str, const TargetEntry *node)
 {
        WRITE_NODE_TYPE("TARGETENTRY");
 
@@ -1337,7 +1419,7 @@ _outTargetEntry(StringInfo str, TargetEntry *node)
 }
 
 static void
-_outRangeTblRef(StringInfo str, RangeTblRef *node)
+_outRangeTblRef(StringInfo str, const RangeTblRef *node)
 {
        WRITE_NODE_TYPE("RANGETBLREF");
 
@@ -1345,7 +1427,7 @@ _outRangeTblRef(StringInfo str, RangeTblRef *node)
 }
 
 static void
-_outJoinExpr(StringInfo str, JoinExpr *node)
+_outJoinExpr(StringInfo str, const JoinExpr *node)
 {
        WRITE_NODE_TYPE("JOINEXPR");
 
@@ -1360,7 +1442,7 @@ _outJoinExpr(StringInfo str, JoinExpr *node)
 }
 
 static void
-_outFromExpr(StringInfo str, FromExpr *node)
+_outFromExpr(StringInfo str, const FromExpr *node)
 {
        WRITE_NODE_TYPE("FROMEXPR");
 
@@ -1379,13 +1461,22 @@ _outFromExpr(StringInfo str, FromExpr *node)
  *
  * Note we do NOT print the parent, else we'd be in infinite recursion.
  * We can print the parent's relids for identification purposes, though.
+ * We also do not print the whole of param_info, since it's printed by
+ * _outRelOptInfo; it's sufficient and less cluttering to print just the
+ * required outer relids.
  */
 static void
-_outPathInfo(StringInfo str, Path *node)
+_outPathInfo(StringInfo str, const Path *node)
 {
        WRITE_ENUM_FIELD(pathtype, NodeTag);
        appendStringInfo(str, " :parent_relids ");
        _outBitmapset(str, node->parent->relids);
+       appendStringInfo(str, " :required_outer ");
+       if (node->param_info)
+               _outBitmapset(str, node->param_info->ppi_req_outer);
+       else
+               _outBitmapset(str, NULL);
+       WRITE_FLOAT_FIELD(rows, "%.0f");
        WRITE_FLOAT_FIELD(startup_cost, "%.2f");
        WRITE_FLOAT_FIELD(total_cost, "%.2f");
        WRITE_NODE_FIELD(pathkeys);
@@ -1395,9 +1486,9 @@ _outPathInfo(StringInfo str, Path *node)
  * print the basic stuff of all nodes that inherit from JoinPath
  */
 static void
-_outJoinPathInfo(StringInfo str, JoinPath *node)
+_outJoinPathInfo(StringInfo str, const JoinPath *node)
 {
-       _outPathInfo(str, (Path *) node);
+       _outPathInfo(str, (const Path *) node);
 
        WRITE_ENUM_FIELD(jointype, JoinType);
        WRITE_NODE_FIELD(outerjoinpath);
@@ -1406,144 +1497,151 @@ _outJoinPathInfo(StringInfo str, JoinPath *node)
 }
 
 static void
-_outPath(StringInfo str, Path *node)
+_outPath(StringInfo str, const Path *node)
 {
        WRITE_NODE_TYPE("PATH");
 
-       _outPathInfo(str, (Path *) node);
+       _outPathInfo(str, (const Path *) node);
 }
 
 static void
-_outIndexPath(StringInfo str, IndexPath *node)
+_outIndexPath(StringInfo str, const IndexPath *node)
 {
        WRITE_NODE_TYPE("INDEXPATH");
 
-       _outPathInfo(str, (Path *) node);
+       _outPathInfo(str, (const Path *) node);
 
        WRITE_NODE_FIELD(indexinfo);
        WRITE_NODE_FIELD(indexclauses);
        WRITE_NODE_FIELD(indexquals);
+       WRITE_NODE_FIELD(indexqualcols);
        WRITE_NODE_FIELD(indexorderbys);
-       WRITE_BOOL_FIELD(isjoininner);
+       WRITE_NODE_FIELD(indexorderbycols);
        WRITE_ENUM_FIELD(indexscandir, ScanDirection);
        WRITE_FLOAT_FIELD(indextotalcost, "%.2f");
        WRITE_FLOAT_FIELD(indexselectivity, "%.4f");
-       WRITE_FLOAT_FIELD(rows, "%.0f");
 }
 
 static void
-_outBitmapHeapPath(StringInfo str, BitmapHeapPath *node)
+_outBitmapHeapPath(StringInfo str, const BitmapHeapPath *node)
 {
        WRITE_NODE_TYPE("BITMAPHEAPPATH");
 
-       _outPathInfo(str, (Path *) node);
+       _outPathInfo(str, (const Path *) node);
 
        WRITE_NODE_FIELD(bitmapqual);
-       WRITE_BOOL_FIELD(isjoininner);
-       WRITE_FLOAT_FIELD(rows, "%.0f");
 }
 
 static void
-_outBitmapAndPath(StringInfo str, BitmapAndPath *node)
+_outBitmapAndPath(StringInfo str, const BitmapAndPath *node)
 {
        WRITE_NODE_TYPE("BITMAPANDPATH");
 
-       _outPathInfo(str, (Path *) node);
+       _outPathInfo(str, (const Path *) node);
 
        WRITE_NODE_FIELD(bitmapquals);
        WRITE_FLOAT_FIELD(bitmapselectivity, "%.4f");
 }
 
 static void
-_outBitmapOrPath(StringInfo str, BitmapOrPath *node)
+_outBitmapOrPath(StringInfo str, const BitmapOrPath *node)
 {
        WRITE_NODE_TYPE("BITMAPORPATH");
 
-       _outPathInfo(str, (Path *) node);
+       _outPathInfo(str, (const Path *) node);
 
        WRITE_NODE_FIELD(bitmapquals);
        WRITE_FLOAT_FIELD(bitmapselectivity, "%.4f");
 }
 
 static void
-_outTidPath(StringInfo str, TidPath *node)
+_outTidPath(StringInfo str, const TidPath *node)
 {
        WRITE_NODE_TYPE("TIDPATH");
 
-       _outPathInfo(str, (Path *) node);
+       _outPathInfo(str, (const Path *) node);
 
        WRITE_NODE_FIELD(tidquals);
 }
 
 static void
-_outAppendPath(StringInfo str, AppendPath *node)
+_outForeignPath(StringInfo str, const ForeignPath *node)
+{
+       WRITE_NODE_TYPE("FOREIGNPATH");
+
+       _outPathInfo(str, (const Path *) node);
+
+       WRITE_NODE_FIELD(fdw_private);
+}
+
+static void
+_outAppendPath(StringInfo str, const AppendPath *node)
 {
        WRITE_NODE_TYPE("APPENDPATH");
 
-       _outPathInfo(str, (Path *) node);
+       _outPathInfo(str, (const Path *) node);
 
        WRITE_NODE_FIELD(subpaths);
 }
 
 static void
-_outMergeAppendPath(StringInfo str, MergeAppendPath *node)
+_outMergeAppendPath(StringInfo str, const MergeAppendPath *node)
 {
        WRITE_NODE_TYPE("MERGEAPPENDPATH");
 
-       _outPathInfo(str, (Path *) node);
+       _outPathInfo(str, (const Path *) node);
 
        WRITE_NODE_FIELD(subpaths);
        WRITE_FLOAT_FIELD(limit_tuples, "%.0f");
 }
 
 static void
-_outResultPath(StringInfo str, ResultPath *node)
+_outResultPath(StringInfo str, const ResultPath *node)
 {
        WRITE_NODE_TYPE("RESULTPATH");
 
-       _outPathInfo(str, (Path *) node);
+       _outPathInfo(str, (const Path *) node);
 
        WRITE_NODE_FIELD(quals);
 }
 
 static void
-_outMaterialPath(StringInfo str, MaterialPath *node)
+_outMaterialPath(StringInfo str, const MaterialPath *node)
 {
        WRITE_NODE_TYPE("MATERIALPATH");
 
-       _outPathInfo(str, (Path *) node);
+       _outPathInfo(str, (const Path *) node);
 
        WRITE_NODE_FIELD(subpath);
 }
 
 static void
-_outUniquePath(StringInfo str, UniquePath *node)
+_outUniquePath(StringInfo str, const UniquePath *node)
 {
        WRITE_NODE_TYPE("UNIQUEPATH");
 
-       _outPathInfo(str, (Path *) node);
+       _outPathInfo(str, (const Path *) node);
 
        WRITE_NODE_FIELD(subpath);
        WRITE_ENUM_FIELD(umethod, UniquePathMethod);
        WRITE_NODE_FIELD(in_operators);
        WRITE_NODE_FIELD(uniq_exprs);
-       WRITE_FLOAT_FIELD(rows, "%.0f");
 }
 
 static void
-_outNestPath(StringInfo str, NestPath *node)
+_outNestPath(StringInfo str, const NestPath *node)
 {
        WRITE_NODE_TYPE("NESTPATH");
 
-       _outJoinPathInfo(str, (JoinPath *) node);
+       _outJoinPathInfo(str, (const JoinPath *) node);
 }
 
 static void
-_outMergePath(StringInfo str, MergePath *node)
+_outMergePath(StringInfo str, const MergePath *node)
 {
        WRITE_NODE_TYPE("MERGEPATH");
 
-       _outJoinPathInfo(str, (JoinPath *) node);
+       _outJoinPathInfo(str, (const JoinPath *) node);
 
        WRITE_NODE_FIELD(path_mergeclauses);
        WRITE_NODE_FIELD(outersortkeys);
@@ -1552,37 +1650,37 @@ _outMergePath(StringInfo str, MergePath *node)
 }
 
 static void
-_outHashPath(StringInfo str, HashPath *node)
+_outHashPath(StringInfo str, const HashPath *node)
 {
        WRITE_NODE_TYPE("HASHPATH");
 
-       _outJoinPathInfo(str, (JoinPath *) node);
+       _outJoinPathInfo(str, (const JoinPath *) node);
 
        WRITE_NODE_FIELD(path_hashclauses);
        WRITE_INT_FIELD(num_batches);
 }
 
 static void
-_outPlannerGlobal(StringInfo str, PlannerGlobal *node)
+_outPlannerGlobal(StringInfo str, const PlannerGlobal *node)
 {
        WRITE_NODE_TYPE("PLANNERGLOBAL");
 
        /* NB: this isn't a complete set of fields */
-       WRITE_NODE_FIELD(paramlist);
        WRITE_NODE_FIELD(subplans);
-       WRITE_NODE_FIELD(subrtables);
-       WRITE_NODE_FIELD(subrowmarks);
        WRITE_BITMAPSET_FIELD(rewindPlanIDs);
        WRITE_NODE_FIELD(finalrtable);
        WRITE_NODE_FIELD(finalrowmarks);
+       WRITE_NODE_FIELD(resultRelations);
        WRITE_NODE_FIELD(relationOids);
        WRITE_NODE_FIELD(invalItems);
+       WRITE_INT_FIELD(nParamExec);
        WRITE_UINT_FIELD(lastPHId);
+       WRITE_UINT_FIELD(lastRowMarkId);
        WRITE_BOOL_FIELD(transientPlan);
 }
 
 static void
-_outPlannerInfo(StringInfo str, PlannerInfo *node)
+_outPlannerInfo(StringInfo str, const PlannerInfo *node)
 {
        WRITE_NODE_TYPE("PLANNERINFO");
 
@@ -1590,9 +1688,10 @@ _outPlannerInfo(StringInfo str, PlannerInfo *node)
        WRITE_NODE_FIELD(parse);
        WRITE_NODE_FIELD(glob);
        WRITE_UINT_FIELD(query_level);
+       WRITE_NODE_FIELD(plan_params);
+       WRITE_BITMAPSET_FIELD(all_baserels);
        WRITE_NODE_FIELD(join_rel_list);
        WRITE_INT_FIELD(join_cur_level);
-       WRITE_NODE_FIELD(resultRelations);
        WRITE_NODE_FIELD(init_plans);
        WRITE_NODE_FIELD(cte_plan_ids);
        WRITE_NODE_FIELD(eq_classes);
@@ -1601,6 +1700,7 @@ _outPlannerInfo(StringInfo str, PlannerInfo *node)
        WRITE_NODE_FIELD(right_join_clauses);
        WRITE_NODE_FIELD(full_join_clauses);
        WRITE_NODE_FIELD(join_info_list);
+       WRITE_NODE_FIELD(lateral_info_list);
        WRITE_NODE_FIELD(append_rel_list);
        WRITE_NODE_FIELD(rowMarks);
        WRITE_NODE_FIELD(placeholder_list);
@@ -1615,6 +1715,7 @@ _outPlannerInfo(StringInfo str, PlannerInfo *node)
        WRITE_FLOAT_FIELD(limit_tuples, "%.0f");
        WRITE_BOOL_FIELD(hasInheritedTarget);
        WRITE_BOOL_FIELD(hasJoinRTEs);
+       WRITE_BOOL_FIELD(hasLateralRTEs);
        WRITE_BOOL_FIELD(hasHavingQual);
        WRITE_BOOL_FIELD(hasPseudoConstantQuals);
        WRITE_BOOL_FIELD(hasRecursion);
@@ -1624,7 +1725,7 @@ _outPlannerInfo(StringInfo str, PlannerInfo *node)
 }
 
 static void
-_outRelOptInfo(StringInfo str, RelOptInfo *node)
+_outRelOptInfo(StringInfo str, const RelOptInfo *node)
 {
        WRITE_NODE_TYPE("RELOPTINFO");
 
@@ -1633,31 +1734,36 @@ _outRelOptInfo(StringInfo str, RelOptInfo *node)
        WRITE_BITMAPSET_FIELD(relids);
        WRITE_FLOAT_FIELD(rows, "%.0f");
        WRITE_INT_FIELD(width);
+       WRITE_BOOL_FIELD(consider_startup);
        WRITE_NODE_FIELD(reltargetlist);
        WRITE_NODE_FIELD(pathlist);
+       WRITE_NODE_FIELD(ppilist);
        WRITE_NODE_FIELD(cheapest_startup_path);
        WRITE_NODE_FIELD(cheapest_total_path);
        WRITE_NODE_FIELD(cheapest_unique_path);
+       WRITE_NODE_FIELD(cheapest_parameterized_paths);
        WRITE_UINT_FIELD(relid);
        WRITE_UINT_FIELD(reltablespace);
        WRITE_ENUM_FIELD(rtekind, RTEKind);
        WRITE_INT_FIELD(min_attr);
        WRITE_INT_FIELD(max_attr);
+       WRITE_NODE_FIELD(lateral_vars);
+       WRITE_BITMAPSET_FIELD(lateral_relids);
        WRITE_NODE_FIELD(indexlist);
        WRITE_UINT_FIELD(pages);
        WRITE_FLOAT_FIELD(tuples, "%.0f");
+       WRITE_FLOAT_FIELD(allvisfrac, "%.6f");
        WRITE_NODE_FIELD(subplan);
-       WRITE_NODE_FIELD(subrtable);
-       WRITE_NODE_FIELD(subrowmark);
+       WRITE_NODE_FIELD(subroot);
+       WRITE_NODE_FIELD(subplan_params);
+       /* we don't try to print fdwroutine or fdw_private */
        WRITE_NODE_FIELD(baserestrictinfo);
        WRITE_NODE_FIELD(joininfo);
        WRITE_BOOL_FIELD(has_eclass_joins);
-       WRITE_BITMAPSET_FIELD(index_outer_relids);
-       WRITE_NODE_FIELD(index_inner_paths);
 }
 
 static void
-_outIndexOptInfo(StringInfo str, IndexOptInfo *node)
+_outIndexOptInfo(StringInfo str, const IndexOptInfo *node)
 {
        WRITE_NODE_TYPE("INDEXOPTINFO");
 
@@ -1667,14 +1773,18 @@ _outIndexOptInfo(StringInfo str, IndexOptInfo *node)
        WRITE_UINT_FIELD(pages);
        WRITE_FLOAT_FIELD(tuples, "%.0f");
        WRITE_INT_FIELD(ncolumns);
-       WRITE_NODE_FIELD(indexprs);
+       WRITE_OID_FIELD(relam);
+       /* indexprs is redundant since we print indextlist */
        WRITE_NODE_FIELD(indpred);
+       WRITE_NODE_FIELD(indextlist);
        WRITE_BOOL_FIELD(predOK);
        WRITE_BOOL_FIELD(unique);
+       WRITE_BOOL_FIELD(immediate);
+       WRITE_BOOL_FIELD(hypothetical);
 }
 
 static void
-_outEquivalenceClass(StringInfo str, EquivalenceClass *node)
+_outEquivalenceClass(StringInfo str, const EquivalenceClass *node)
 {
        /*
         * To simplify reading, we just chase up to the topmost merged EC and
@@ -1686,6 +1796,7 @@ _outEquivalenceClass(StringInfo str, EquivalenceClass *node)
        WRITE_NODE_TYPE("EQUIVALENCECLASS");
 
        WRITE_NODE_FIELD(ec_opfamilies);
+       WRITE_OID_FIELD(ec_collation);
        WRITE_NODE_FIELD(ec_members);
        WRITE_NODE_FIELD(ec_sources);
        WRITE_NODE_FIELD(ec_derives);
@@ -1698,7 +1809,7 @@ _outEquivalenceClass(StringInfo str, EquivalenceClass *node)
 }
 
 static void
-_outEquivalenceMember(StringInfo str, EquivalenceMember *node)
+_outEquivalenceMember(StringInfo str, const EquivalenceMember *node)
 {
        WRITE_NODE_TYPE("EQUIVALENCEMEMBER");
 
@@ -1710,7 +1821,7 @@ _outEquivalenceMember(StringInfo str, EquivalenceMember *node)
 }
 
 static void
-_outPathKey(StringInfo str, PathKey *node)
+_outPathKey(StringInfo str, const PathKey *node)
 {
        WRITE_NODE_TYPE("PATHKEY");
 
@@ -1721,7 +1832,17 @@ _outPathKey(StringInfo str, PathKey *node)
 }
 
 static void
-_outRestrictInfo(StringInfo str, RestrictInfo *node)
+_outParamPathInfo(StringInfo str, const ParamPathInfo *node)
+{
+       WRITE_NODE_TYPE("PARAMPATHINFO");
+
+       WRITE_BITMAPSET_FIELD(ppi_req_outer);
+       WRITE_FLOAT_FIELD(ppi_rows, "%.0f");
+       WRITE_NODE_FIELD(ppi_clauses);
+}
+
+static void
+_outRestrictInfo(StringInfo str, const RestrictInfo *node)
 {
        WRITE_NODE_TYPE("RESTRICTINFO");
 
@@ -1733,6 +1854,7 @@ _outRestrictInfo(StringInfo str, RestrictInfo *node)
        WRITE_BOOL_FIELD(pseudoconstant);
        WRITE_BITMAPSET_FIELD(clause_relids);
        WRITE_BITMAPSET_FIELD(required_relids);
+       WRITE_BITMAPSET_FIELD(outer_relids);
        WRITE_BITMAPSET_FIELD(nullable_relids);
        WRITE_BITMAPSET_FIELD(left_relids);
        WRITE_BITMAPSET_FIELD(right_relids);
@@ -1750,17 +1872,7 @@ _outRestrictInfo(StringInfo str, RestrictInfo *node)
 }
 
 static void
-_outInnerIndexscanInfo(StringInfo str, InnerIndexscanInfo *node)
-{
-       WRITE_NODE_TYPE("INNERINDEXSCANINFO");
-       WRITE_BITMAPSET_FIELD(other_relids);
-       WRITE_BOOL_FIELD(isouterjoin);
-       WRITE_NODE_FIELD(cheapest_startup_innerpath);
-       WRITE_NODE_FIELD(cheapest_total_innerpath);
-}
-
-static void
-_outPlaceHolderVar(StringInfo str, PlaceHolderVar *node)
+_outPlaceHolderVar(StringInfo str, const PlaceHolderVar *node)
 {
        WRITE_NODE_TYPE("PLACEHOLDERVAR");
 
@@ -1771,7 +1883,7 @@ _outPlaceHolderVar(StringInfo str, PlaceHolderVar *node)
 }
 
 static void
-_outSpecialJoinInfo(StringInfo str, SpecialJoinInfo *node)
+_outSpecialJoinInfo(StringInfo str, const SpecialJoinInfo *node)
 {
        WRITE_NODE_TYPE("SPECIALJOININFO");
 
@@ -1786,7 +1898,16 @@ _outSpecialJoinInfo(StringInfo str, SpecialJoinInfo *node)
 }
 
 static void
-_outAppendRelInfo(StringInfo str, AppendRelInfo *node)
+_outLateralJoinInfo(StringInfo str, const LateralJoinInfo *node)
+{
+       WRITE_NODE_TYPE("LATERALJOININFO");
+
+       WRITE_UINT_FIELD(lateral_rhs);
+       WRITE_BITMAPSET_FIELD(lateral_lhs);
+}
+
+static void
+_outAppendRelInfo(StringInfo str, const AppendRelInfo *node)
 {
        WRITE_NODE_TYPE("APPENDRELINFO");
 
@@ -1799,7 +1920,7 @@ _outAppendRelInfo(StringInfo str, AppendRelInfo *node)
 }
 
 static void
-_outPlaceHolderInfo(StringInfo str, PlaceHolderInfo *node)
+_outPlaceHolderInfo(StringInfo str, const PlaceHolderInfo *node)
 {
        WRITE_NODE_TYPE("PLACEHOLDERINFO");
 
@@ -1812,23 +1933,26 @@ _outPlaceHolderInfo(StringInfo str, PlaceHolderInfo *node)
 }
 
 static void
-_outMinMaxAggInfo(StringInfo str, MinMaxAggInfo *node)
+_outMinMaxAggInfo(StringInfo str, const MinMaxAggInfo *node)
 {
        WRITE_NODE_TYPE("MINMAXAGGINFO");
 
        WRITE_OID_FIELD(aggfnoid);
        WRITE_OID_FIELD(aggsortop);
        WRITE_NODE_FIELD(target);
-       WRITE_NODE_FIELD(pathkeys);
+       /* We intentionally omit subroot --- too large, not interesting enough */
+       WRITE_NODE_FIELD(path);
+       WRITE_FLOAT_FIELD(pathcost, "%.2f");
+       WRITE_NODE_FIELD(param);
 }
 
 static void
-_outPlannerParamItem(StringInfo str, PlannerParamItem *node)
+_outPlannerParamItem(StringInfo str, const PlannerParamItem *node)
 {
        WRITE_NODE_TYPE("PLANNERPARAMITEM");
 
        WRITE_NODE_FIELD(item);
-       WRITE_UINT_FIELD(abslevel);
+       WRITE_INT_FIELD(paramId);
 }
 
 /*****************************************************************************
@@ -1837,11 +1961,12 @@ _outPlannerParamItem(StringInfo str, PlannerParamItem *node)
  *
  *****************************************************************************/
 
+/*
+ * print the basic stuff of all nodes that inherit from CreateStmt
+ */
 static void
-_outCreateStmt(StringInfo str, CreateStmt *node)
+_outCreateStmtInfo(StringInfo str, const CreateStmt *node)
 {
-       WRITE_NODE_TYPE("CREATESTMT");
-
        WRITE_NODE_FIELD(relation);
        WRITE_NODE_FIELD(tableElts);
        WRITE_NODE_FIELD(inhRelations);
@@ -1854,18 +1979,26 @@ _outCreateStmt(StringInfo str, CreateStmt *node)
 }
 
 static void
-_outCreateForeignTableStmt(StringInfo str, CreateForeignTableStmt *node)
+_outCreateStmt(StringInfo str, const CreateStmt *node)
+{
+       WRITE_NODE_TYPE("CREATESTMT");
+
+       _outCreateStmtInfo(str, (const CreateStmt *) node);
+}
+
+static void
+_outCreateForeignTableStmt(StringInfo str, const CreateForeignTableStmt *node)
 {
        WRITE_NODE_TYPE("CREATEFOREIGNTABLESTMT");
 
-       _outCreateStmt(str, (CreateStmt *) &node->base);
+       _outCreateStmtInfo(str, (const CreateStmt *) node);
 
        WRITE_STRING_FIELD(servername);
        WRITE_NODE_FIELD(options);
 }
 
 static void
-_outIndexStmt(StringInfo str, IndexStmt *node)
+_outIndexStmt(StringInfo str, const IndexStmt *node)
 {
        WRITE_NODE_TYPE("INDEXSTMT");
 
@@ -1877,7 +2010,9 @@ _outIndexStmt(StringInfo str, IndexStmt *node)
        WRITE_NODE_FIELD(options);
        WRITE_NODE_FIELD(whereClause);
        WRITE_NODE_FIELD(excludeOpNames);
+       WRITE_STRING_FIELD(idxcomment);
        WRITE_OID_FIELD(indexOid);
+       WRITE_OID_FIELD(oldNode);
        WRITE_BOOL_FIELD(unique);
        WRITE_BOOL_FIELD(primary);
        WRITE_BOOL_FIELD(isconstraint);
@@ -1887,7 +2022,7 @@ _outIndexStmt(StringInfo str, IndexStmt *node)
 }
 
 static void
-_outNotifyStmt(StringInfo str, NotifyStmt *node)
+_outNotifyStmt(StringInfo str, const NotifyStmt *node)
 {
        WRITE_NODE_TYPE("NOTIFY");
 
@@ -1896,7 +2031,7 @@ _outNotifyStmt(StringInfo str, NotifyStmt *node)
 }
 
 static void
-_outDeclareCursorStmt(StringInfo str, DeclareCursorStmt *node)
+_outDeclareCursorStmt(StringInfo str, const DeclareCursorStmt *node)
 {
        WRITE_NODE_TYPE("DECLARECURSOR");
 
@@ -1906,7 +2041,7 @@ _outDeclareCursorStmt(StringInfo str, DeclareCursorStmt *node)
 }
 
 static void
-_outSelectStmt(StringInfo str, SelectStmt *node)
+_outSelectStmt(StringInfo str, const SelectStmt *node)
 {
        WRITE_NODE_TYPE("SELECT");
 
@@ -1918,12 +2053,12 @@ _outSelectStmt(StringInfo str, SelectStmt *node)
        WRITE_NODE_FIELD(groupClause);
        WRITE_NODE_FIELD(havingClause);
        WRITE_NODE_FIELD(windowClause);
-       WRITE_NODE_FIELD(withClause);
        WRITE_NODE_FIELD(valuesLists);
        WRITE_NODE_FIELD(sortClause);
        WRITE_NODE_FIELD(limitOffset);
        WRITE_NODE_FIELD(limitCount);
        WRITE_NODE_FIELD(lockingClause);
+       WRITE_NODE_FIELD(withClause);
        WRITE_ENUM_FIELD(op, SetOperation);
        WRITE_BOOL_FIELD(all);
        WRITE_NODE_FIELD(larg);
@@ -1931,7 +2066,7 @@ _outSelectStmt(StringInfo str, SelectStmt *node)
 }
 
 static void
-_outFuncCall(StringInfo str, FuncCall *node)
+_outFuncCall(StringInfo str, const FuncCall *node)
 {
        WRITE_NODE_TYPE("FUNCCALL");
 
@@ -1946,7 +2081,7 @@ _outFuncCall(StringInfo str, FuncCall *node)
 }
 
 static void
-_outDefElem(StringInfo str, DefElem *node)
+_outDefElem(StringInfo str, const DefElem *node)
 {
        WRITE_NODE_TYPE("DEFELEM");
 
@@ -1957,16 +2092,16 @@ _outDefElem(StringInfo str, DefElem *node)
 }
 
 static void
-_outInhRelation(StringInfo str, InhRelation *node)
+_outTableLikeClause(StringInfo str, const TableLikeClause *node)
 {
-       WRITE_NODE_TYPE("INHRELATION");
+       WRITE_NODE_TYPE("TABLELIKECLAUSE");
 
        WRITE_NODE_FIELD(relation);
        WRITE_UINT_FIELD(options);
 }
 
 static void
-_outLockingClause(StringInfo str, LockingClause *node)
+_outLockingClause(StringInfo str, const LockingClause *node)
 {
        WRITE_NODE_TYPE("LOCKINGCLAUSE");
 
@@ -1976,7 +2111,7 @@ _outLockingClause(StringInfo str, LockingClause *node)
 }
 
 static void
-_outXmlSerialize(StringInfo str, XmlSerialize *node)
+_outXmlSerialize(StringInfo str, const XmlSerialize *node)
 {
        WRITE_NODE_TYPE("XMLSERIALIZE");
 
@@ -1987,7 +2122,7 @@ _outXmlSerialize(StringInfo str, XmlSerialize *node)
 }
 
 static void
-_outColumnDef(StringInfo str, ColumnDef *node)
+_outColumnDef(StringInfo str, const ColumnDef *node)
 {
        WRITE_NODE_TYPE("COLUMNDEF");
 
@@ -1996,14 +2131,18 @@ _outColumnDef(StringInfo str, ColumnDef *node)
        WRITE_INT_FIELD(inhcount);
        WRITE_BOOL_FIELD(is_local);
        WRITE_BOOL_FIELD(is_not_null);
-       WRITE_INT_FIELD(storage);
+       WRITE_BOOL_FIELD(is_from_type);
+       WRITE_CHAR_FIELD(storage);
        WRITE_NODE_FIELD(raw_default);
        WRITE_NODE_FIELD(cooked_default);
+       WRITE_NODE_FIELD(collClause);
+       WRITE_OID_FIELD(collOid);
        WRITE_NODE_FIELD(constraints);
+       WRITE_NODE_FIELD(fdwoptions);
 }
 
 static void
-_outTypeName(StringInfo str, TypeName *node)
+_outTypeName(StringInfo str, const TypeName *node)
 {
        WRITE_NODE_TYPE("TYPENAME");
 
@@ -2018,7 +2157,7 @@ _outTypeName(StringInfo str, TypeName *node)
 }
 
 static void
-_outTypeCast(StringInfo str, TypeCast *node)
+_outTypeCast(StringInfo str, const TypeCast *node)
 {
        WRITE_NODE_TYPE("TYPECAST");
 
@@ -2028,25 +2167,37 @@ _outTypeCast(StringInfo str, TypeCast *node)
 }
 
 static void
-_outIndexElem(StringInfo str, IndexElem *node)
+_outCollateClause(StringInfo str, const CollateClause *node)
+{
+       WRITE_NODE_TYPE("COLLATECLAUSE");
+
+       WRITE_NODE_FIELD(arg);
+       WRITE_NODE_FIELD(collname);
+       WRITE_LOCATION_FIELD(location);
+}
+
+static void
+_outIndexElem(StringInfo str, const IndexElem *node)
 {
        WRITE_NODE_TYPE("INDEXELEM");
 
        WRITE_STRING_FIELD(name);
        WRITE_NODE_FIELD(expr);
        WRITE_STRING_FIELD(indexcolname);
+       WRITE_NODE_FIELD(collation);
        WRITE_NODE_FIELD(opclass);
        WRITE_ENUM_FIELD(ordering, SortByDir);
        WRITE_ENUM_FIELD(nulls_ordering, SortByNulls);
 }
 
 static void
-_outQuery(StringInfo str, Query *node)
+_outQuery(StringInfo str, const Query *node)
 {
        WRITE_NODE_TYPE("QUERY");
 
        WRITE_ENUM_FIELD(commandType, CmdType);
        WRITE_ENUM_FIELD(querySource, QuerySource);
+       /* we intentionally do not print the queryId field */
        WRITE_BOOL_FIELD(canSetTag);
 
        /*
@@ -2075,12 +2226,12 @@ _outQuery(StringInfo str, Query *node)
                appendStringInfo(str, " :utilityStmt <>");
 
        WRITE_INT_FIELD(resultRelation);
-       WRITE_NODE_FIELD(intoClause);
        WRITE_BOOL_FIELD(hasAggs);
        WRITE_BOOL_FIELD(hasWindowFuncs);
        WRITE_BOOL_FIELD(hasSubLinks);
        WRITE_BOOL_FIELD(hasDistinctOn);
        WRITE_BOOL_FIELD(hasRecursive);
+       WRITE_BOOL_FIELD(hasModifyingCTE);
        WRITE_BOOL_FIELD(hasForUpdate);
        WRITE_NODE_FIELD(cteList);
        WRITE_NODE_FIELD(rtable);
@@ -2100,7 +2251,7 @@ _outQuery(StringInfo str, Query *node)
 }
 
 static void
-_outSortGroupClause(StringInfo str, SortGroupClause *node)
+_outSortGroupClause(StringInfo str, const SortGroupClause *node)
 {
        WRITE_NODE_TYPE("SORTGROUPCLAUSE");
 
@@ -2112,7 +2263,7 @@ _outSortGroupClause(StringInfo str, SortGroupClause *node)
 }
 
 static void
-_outWindowClause(StringInfo str, WindowClause *node)
+_outWindowClause(StringInfo str, const WindowClause *node)
 {
        WRITE_NODE_TYPE("WINDOWCLAUSE");
 
@@ -2128,7 +2279,7 @@ _outWindowClause(StringInfo str, WindowClause *node)
 }
 
 static void
-_outRowMarkClause(StringInfo str, RowMarkClause *node)
+_outRowMarkClause(StringInfo str, const RowMarkClause *node)
 {
        WRITE_NODE_TYPE("ROWMARKCLAUSE");
 
@@ -2139,7 +2290,7 @@ _outRowMarkClause(StringInfo str, RowMarkClause *node)
 }
 
 static void
-_outWithClause(StringInfo str, WithClause *node)
+_outWithClause(StringInfo str, const WithClause *node)
 {
        WRITE_NODE_TYPE("WITHCLAUSE");
 
@@ -2149,7 +2300,7 @@ _outWithClause(StringInfo str, WithClause *node)
 }
 
 static void
-_outCommonTableExpr(StringInfo str, CommonTableExpr *node)
+_outCommonTableExpr(StringInfo str, const CommonTableExpr *node)
 {
        WRITE_NODE_TYPE("COMMONTABLEEXPR");
 
@@ -2162,10 +2313,11 @@ _outCommonTableExpr(StringInfo str, CommonTableExpr *node)
        WRITE_NODE_FIELD(ctecolnames);
        WRITE_NODE_FIELD(ctecoltypes);
        WRITE_NODE_FIELD(ctecoltypmods);
+       WRITE_NODE_FIELD(ctecolcollations);
 }
 
 static void
-_outSetOperationStmt(StringInfo str, SetOperationStmt *node)
+_outSetOperationStmt(StringInfo str, const SetOperationStmt *node)
 {
        WRITE_NODE_TYPE("SETOPERATIONSTMT");
 
@@ -2175,11 +2327,12 @@ _outSetOperationStmt(StringInfo str, SetOperationStmt *node)
        WRITE_NODE_FIELD(rarg);
        WRITE_NODE_FIELD(colTypes);
        WRITE_NODE_FIELD(colTypmods);
+       WRITE_NODE_FIELD(colCollations);
        WRITE_NODE_FIELD(groupClauses);
 }
 
 static void
-_outRangeTblEntry(StringInfo str, RangeTblEntry *node)
+_outRangeTblEntry(StringInfo str, const RangeTblEntry *node)
 {
        WRITE_NODE_TYPE("RTE");
 
@@ -2191,11 +2344,12 @@ _outRangeTblEntry(StringInfo str, RangeTblEntry *node)
        switch (node->rtekind)
        {
                case RTE_RELATION:
-               case RTE_SPECIAL:
                        WRITE_OID_FIELD(relid);
+                       WRITE_CHAR_FIELD(relkind);
                        break;
                case RTE_SUBQUERY:
                        WRITE_NODE_FIELD(subquery);
+                       WRITE_BOOL_FIELD(security_barrier);
                        break;
                case RTE_JOIN:
                        WRITE_ENUM_FIELD(jointype, JoinType);
@@ -2205,9 +2359,11 @@ _outRangeTblEntry(StringInfo str, RangeTblEntry *node)
                        WRITE_NODE_FIELD(funcexpr);
                        WRITE_NODE_FIELD(funccoltypes);
                        WRITE_NODE_FIELD(funccoltypmods);
+                       WRITE_NODE_FIELD(funccolcollations);
                        break;
                case RTE_VALUES:
                        WRITE_NODE_FIELD(values_lists);
+                       WRITE_NODE_FIELD(values_collations);
                        break;
                case RTE_CTE:
                        WRITE_STRING_FIELD(ctename);
@@ -2215,12 +2371,14 @@ _outRangeTblEntry(StringInfo str, RangeTblEntry *node)
                        WRITE_BOOL_FIELD(self_reference);
                        WRITE_NODE_FIELD(ctecoltypes);
                        WRITE_NODE_FIELD(ctecoltypmods);
+                       WRITE_NODE_FIELD(ctecolcollations);
                        break;
                default:
                        elog(ERROR, "unrecognized RTE kind: %d", (int) node->rtekind);
                        break;
        }
 
+       WRITE_BOOL_FIELD(lateral);
        WRITE_BOOL_FIELD(inh);
        WRITE_BOOL_FIELD(inFromCl);
        WRITE_UINT_FIELD(requiredPerms);
@@ -2230,7 +2388,7 @@ _outRangeTblEntry(StringInfo str, RangeTblEntry *node)
 }
 
 static void
-_outAExpr(StringInfo str, A_Expr *node)
+_outAExpr(StringInfo str, const A_Expr *node)
 {
        WRITE_NODE_TYPE("AEXPR");
 
@@ -2286,7 +2444,7 @@ _outAExpr(StringInfo str, A_Expr *node)
 }
 
 static void
-_outValue(StringInfo str, Value *value)
+_outValue(StringInfo str, const Value *value)
 {
        switch (value->type)
        {
@@ -2321,7 +2479,7 @@ _outValue(StringInfo str, Value *value)
 }
 
 static void
-_outColumnRef(StringInfo str, ColumnRef *node)
+_outColumnRef(StringInfo str, const ColumnRef *node)
 {
        WRITE_NODE_TYPE("COLUMNREF");
 
@@ -2330,7 +2488,7 @@ _outColumnRef(StringInfo str, ColumnRef *node)
 }
 
 static void
-_outParamRef(StringInfo str, ParamRef *node)
+_outParamRef(StringInfo str, const ParamRef *node)
 {
        WRITE_NODE_TYPE("PARAMREF");
 
@@ -2339,7 +2497,7 @@ _outParamRef(StringInfo str, ParamRef *node)
 }
 
 static void
-_outAConst(StringInfo str, A_Const *node)
+_outAConst(StringInfo str, const A_Const *node)
 {
        WRITE_NODE_TYPE("A_CONST");
 
@@ -2349,13 +2507,13 @@ _outAConst(StringInfo str, A_Const *node)
 }
 
 static void
-_outA_Star(StringInfo str, A_Star *node)
+_outA_Star(StringInfo str, const A_Star *node)
 {
        WRITE_NODE_TYPE("A_STAR");
 }
 
 static void
-_outA_Indices(StringInfo str, A_Indices *node)
+_outA_Indices(StringInfo str, const A_Indices *node)
 {
        WRITE_NODE_TYPE("A_INDICES");
 
@@ -2364,7 +2522,7 @@ _outA_Indices(StringInfo str, A_Indices *node)
 }
 
 static void
-_outA_Indirection(StringInfo str, A_Indirection *node)
+_outA_Indirection(StringInfo str, const A_Indirection *node)
 {
        WRITE_NODE_TYPE("A_INDIRECTION");
 
@@ -2373,7 +2531,7 @@ _outA_Indirection(StringInfo str, A_Indirection *node)
 }
 
 static void
-_outA_ArrayExpr(StringInfo str, A_ArrayExpr *node)
+_outA_ArrayExpr(StringInfo str, const A_ArrayExpr *node)
 {
        WRITE_NODE_TYPE("A_ARRAYEXPR");
 
@@ -2382,7 +2540,7 @@ _outA_ArrayExpr(StringInfo str, A_ArrayExpr *node)
 }
 
 static void
-_outResTarget(StringInfo str, ResTarget *node)
+_outResTarget(StringInfo str, const ResTarget *node)
 {
        WRITE_NODE_TYPE("RESTARGET");
 
@@ -2393,7 +2551,7 @@ _outResTarget(StringInfo str, ResTarget *node)
 }
 
 static void
-_outSortBy(StringInfo str, SortBy *node)
+_outSortBy(StringInfo str, const SortBy *node)
 {
        WRITE_NODE_TYPE("SORTBY");
 
@@ -2405,7 +2563,7 @@ _outSortBy(StringInfo str, SortBy *node)
 }
 
 static void
-_outWindowDef(StringInfo str, WindowDef *node)
+_outWindowDef(StringInfo str, const WindowDef *node)
 {
        WRITE_NODE_TYPE("WINDOWDEF");
 
@@ -2420,26 +2578,28 @@ _outWindowDef(StringInfo str, WindowDef *node)
 }
 
 static void
-_outRangeSubselect(StringInfo str, RangeSubselect *node)
+_outRangeSubselect(StringInfo str, const RangeSubselect *node)
 {
        WRITE_NODE_TYPE("RANGESUBSELECT");
 
+       WRITE_BOOL_FIELD(lateral);
        WRITE_NODE_FIELD(subquery);
        WRITE_NODE_FIELD(alias);
 }
 
 static void
-_outRangeFunction(StringInfo str, RangeFunction *node)
+_outRangeFunction(StringInfo str, const RangeFunction *node)
 {
        WRITE_NODE_TYPE("RANGEFUNCTION");
 
+       WRITE_BOOL_FIELD(lateral);
        WRITE_NODE_FIELD(funccallnode);
        WRITE_NODE_FIELD(alias);
        WRITE_NODE_FIELD(coldeflist);
 }
 
 static void
-_outConstraint(StringInfo str, Constraint *node)
+_outConstraint(StringInfo str, const Constraint *node)
 {
        WRITE_NODE_TYPE("CONSTRAINT");
 
@@ -2467,6 +2627,7 @@ _outConstraint(StringInfo str, Constraint *node)
 
                case CONSTR_CHECK:
                        appendStringInfo(str, "CHECK");
+                       WRITE_BOOL_FIELD(is_no_inherit);
                        WRITE_NODE_FIELD(raw_expr);
                        WRITE_STRING_FIELD(cooked_expr);
                        break;
@@ -2507,7 +2668,9 @@ _outConstraint(StringInfo str, Constraint *node)
                        WRITE_CHAR_FIELD(fk_matchtype);
                        WRITE_CHAR_FIELD(fk_upd_action);
                        WRITE_CHAR_FIELD(fk_del_action);
+                       WRITE_NODE_FIELD(old_conpfeqop);
                        WRITE_BOOL_FIELD(skip_validation);
+                       WRITE_BOOL_FIELD(initially_valid);
                        break;
 
                case CONSTR_ATTR_DEFERRABLE:
@@ -2539,7 +2702,7 @@ _outConstraint(StringInfo str, Constraint *node)
  *       converts a Node into ascii string and append it to 'str'
  */
 static void
-_outNode(StringInfo str, void *obj)
+_outNode(StringInfo str, const void *obj)
 {
        if (obj == NULL)
                appendStringInfo(str, "<>");
@@ -2594,6 +2757,9 @@ _outNode(StringInfo str, void *obj)
                        case T_IndexScan:
                                _outIndexScan(str, obj);
                                break;
+                       case T_IndexOnlyScan:
+                               _outIndexOnlyScan(str, obj);
+                               break;
                        case T_BitmapIndexScan:
                                _outBitmapIndexScan(str, obj);
                                break;
@@ -2618,6 +2784,9 @@ _outNode(StringInfo str, void *obj)
                        case T_WorkTableScan:
                                _outWorkTableScan(str, obj);
                                break;
+                       case T_ForeignScan:
+                               _outForeignScan(str, obj);
+                               break;
                        case T_Join:
                                _outJoin(str, obj);
                                break;
@@ -2708,6 +2877,9 @@ _outNode(StringInfo str, void *obj)
                        case T_DistinctExpr:
                                _outDistinctExpr(str, obj);
                                break;
+                       case T_NullIfExpr:
+                               _outNullIfExpr(str, obj);
+                               break;
                        case T_ScalarArrayOpExpr:
                                _outScalarArrayOpExpr(str, obj);
                                break;
@@ -2741,6 +2913,9 @@ _outNode(StringInfo str, void *obj)
                        case T_ConvertRowtypeExpr:
                                _outConvertRowtypeExpr(str, obj);
                                break;
+                       case T_CollateExpr:
+                               _outCollateExpr(str, obj);
+                               break;
                        case T_CaseExpr:
                                _outCaseExpr(str, obj);
                                break;
@@ -2768,9 +2943,6 @@ _outNode(StringInfo str, void *obj)
                        case T_XmlExpr:
                                _outXmlExpr(str, obj);
                                break;
-                       case T_NullIfExpr:
-                               _outNullIfExpr(str, obj);
-                               break;
                        case T_NullTest:
                                _outNullTest(str, obj);
                                break;
@@ -2820,6 +2992,9 @@ _outNode(StringInfo str, void *obj)
                        case T_TidPath:
                                _outTidPath(str, obj);
                                break;
+                       case T_ForeignPath:
+                               _outForeignPath(str, obj);
+                               break;
                        case T_AppendPath:
                                _outAppendPath(str, obj);
                                break;
@@ -2865,18 +3040,21 @@ _outNode(StringInfo str, void *obj)
                        case T_PathKey:
                                _outPathKey(str, obj);
                                break;
+                       case T_ParamPathInfo:
+                               _outParamPathInfo(str, obj);
+                               break;
                        case T_RestrictInfo:
                                _outRestrictInfo(str, obj);
                                break;
-                       case T_InnerIndexscanInfo:
-                               _outInnerIndexscanInfo(str, obj);
-                               break;
                        case T_PlaceHolderVar:
                                _outPlaceHolderVar(str, obj);
                                break;
                        case T_SpecialJoinInfo:
                                _outSpecialJoinInfo(str, obj);
                                break;
+                       case T_LateralJoinInfo:
+                               _outLateralJoinInfo(str, obj);
+                               break;
                        case T_AppendRelInfo:
                                _outAppendRelInfo(str, obj);
                                break;
@@ -2917,6 +3095,9 @@ _outNode(StringInfo str, void *obj)
                        case T_TypeCast:
                                _outTypeCast(str, obj);
                                break;
+                       case T_CollateClause:
+                               _outCollateClause(str, obj);
+                               break;
                        case T_IndexElem:
                                _outIndexElem(str, obj);
                                break;
@@ -2992,8 +3173,8 @@ _outNode(StringInfo str, void *obj)
                        case T_DefElem:
                                _outDefElem(str, obj);
                                break;
-                       case T_InhRelation:
-                               _outInhRelation(str, obj);
+                       case T_TableLikeClause:
+                               _outTableLikeClause(str, obj);
                                break;
                        case T_LockingClause:
                                _outLockingClause(str, obj);
@@ -3021,7 +3202,7 @@ _outNode(StringInfo str, void *obj)
  *        returns the ascii representation of the Node as a palloc'd string
  */
 char *
-nodeToString(void *obj)
+nodeToString(const void *obj)
 {
        StringInfoData str;