]> granicus.if.org Git - postgresql/blobdiff - src/backend/nodes/outfuncs.c
Support UPDATE/DELETE WHERE CURRENT OF cursor_name, per SQL standard.
[postgresql] / src / backend / nodes / outfuncs.c
index 5ba31580ae7bc0bdbb4e69eea6fec257efd1c1d6..869905f0cc548e01b42ecf74f314bbc850b43597 100644 (file)
@@ -3,12 +3,12 @@
  * outfuncs.c
  *       Output functions for Postgres tree nodes.
  *
- * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.263 2005/11/26 22:14:56 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.310 2007/06/11 01:16:22 tgl Exp $
  *
  * NOTES
  *       Every node type that can appear in stored rules' parsetrees *must*
@@ -24,7 +24,6 @@
 #include <ctype.h>
 
 #include "lib/stringinfo.h"
-#include "nodes/parsenodes.h"
 #include "nodes/plannodes.h"
 #include "nodes/relation.h"
 #include "utils/datum.h"
@@ -235,6 +234,25 @@ _outDatum(StringInfo str, Datum value, int typlen, bool typbyval)
  *     Stuff from plannodes.h
  */
 
+static void
+_outPlannedStmt(StringInfo str, PlannedStmt *node)
+{
+       WRITE_NODE_TYPE("PLANNEDSTMT");
+
+       WRITE_ENUM_FIELD(commandType, CmdType);
+       WRITE_BOOL_FIELD(canSetTag);
+       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(returningLists);
+       WRITE_NODE_FIELD(rowMarks);
+       WRITE_INT_FIELD(nParamExec);
+}
+
 /*
  * print the basic stuff of all nodes that inherit from Plan
  */
@@ -252,7 +270,6 @@ _outPlanInfo(StringInfo str, Plan *node)
        WRITE_NODE_FIELD(initPlan);
        WRITE_BITMAPSET_FIELD(extParam);
        WRITE_BITMAPSET_FIELD(allParam);
-       WRITE_INT_FIELD(nParamExec);
 }
 
 /*
@@ -401,6 +418,7 @@ _outSubqueryScan(StringInfo str, SubqueryScan *node)
        _outScanInfo(str, (Scan *) node);
 
        WRITE_NODE_FIELD(subplan);
+       WRITE_NODE_FIELD(subrtable);
 }
 
 static void
@@ -409,6 +427,21 @@ _outFunctionScan(StringInfo str, FunctionScan *node)
        WRITE_NODE_TYPE("FUNCTIONSCAN");
 
        _outScanInfo(str, (Scan *) node);
+
+       WRITE_NODE_FIELD(funcexpr);
+       WRITE_NODE_FIELD(funccolnames);
+       WRITE_NODE_FIELD(funccoltypes);
+       WRITE_NODE_FIELD(funccoltypmods);
+}
+
+static void
+_outValuesScan(StringInfo str, ValuesScan *node)
+{
+       WRITE_NODE_TYPE("VALUESSCAN");
+
+       _outScanInfo(str, (Scan *) node);
+
+       WRITE_NODE_FIELD(values_lists);
 }
 
 static void
@@ -430,11 +463,28 @@ _outNestLoop(StringInfo str, NestLoop *node)
 static void
 _outMergeJoin(StringInfo str, MergeJoin *node)
 {
+       int                     numCols;
+       int                     i;
+
        WRITE_NODE_TYPE("MERGEJOIN");
 
        _outJoinPlanInfo(str, (Join *) node);
 
        WRITE_NODE_FIELD(mergeclauses);
+
+       numCols = list_length(node->mergeclauses);
+
+       appendStringInfo(str, " :mergeFamilies");
+       for (i = 0; i < numCols; i++)
+               appendStringInfo(str, " %u", node->mergeFamilies[i]);
+
+       appendStringInfo(str, " :mergeStrategies");
+       for (i = 0; i < numCols; i++)
+               appendStringInfo(str, " %d", node->mergeStrategies[i]);
+
+       appendStringInfo(str, " :mergeNullsFirst");
+       for (i = 0; i < numCols; i++)
+               appendStringInfo(str, " %d", (int) node->mergeNullsFirst[i]);
 }
 
 static void
@@ -473,6 +523,10 @@ _outGroup(StringInfo str, Group *node)
        appendStringInfo(str, " :grpColIdx");
        for (i = 0; i < node->numCols; i++)
                appendStringInfo(str, " %d", node->grpColIdx[i]);
+
+       appendStringInfo(str, " :grpOperators");
+       for (i = 0; i < node->numCols; i++)
+               appendStringInfo(str, " %u", node->grpOperators[i]);
 }
 
 static void
@@ -501,6 +555,10 @@ _outSort(StringInfo str, Sort *node)
        appendStringInfo(str, " :sortOperators");
        for (i = 0; i < node->numCols; i++)
                appendStringInfo(str, " %u", node->sortOperators[i]);
+
+       appendStringInfo(str, " :nullsFirst");
+       for (i = 0; i < node->numCols; i++)
+               appendStringInfo(str, " %s", booltostr(node->nullsFirst[i]));
 }
 
 static void
@@ -517,6 +575,10 @@ _outUnique(StringInfo str, Unique *node)
        appendStringInfo(str, " :uniqColIdx");
        for (i = 0; i < node->numCols; i++)
                appendStringInfo(str, " %d", node->uniqColIdx[i]);
+
+       appendStringInfo(str, " :uniqOperators");
+       for (i = 0; i < node->numCols; i++)
+               appendStringInfo(str, " %u", node->uniqOperators[i]);
 }
 
 static void
@@ -535,6 +597,10 @@ _outSetOp(StringInfo str, SetOp *node)
        for (i = 0; i < node->numCols; i++)
                appendStringInfo(str, " %d", node->dupColIdx[i]);
 
+       appendStringInfo(str, " :dupOperators");
+       for (i = 0; i < node->numCols; i++)
+               appendStringInfo(str, " %d", node->dupOperators[i]);
+
        WRITE_INT_FIELD(flagColIdx);
 }
 
@@ -588,6 +654,18 @@ _outRangeVar(StringInfo str, RangeVar *node)
        WRITE_NODE_FIELD(alias);
 }
 
+static void
+_outIntoClause(StringInfo str, IntoClause *node)
+{
+       WRITE_NODE_TYPE("INTOCLAUSE");
+
+       WRITE_NODE_FIELD(rel);
+       WRITE_NODE_FIELD(colNames);
+       WRITE_NODE_FIELD(options);
+       WRITE_ENUM_FIELD(onCommit, OnCommitAction);
+       WRITE_STRING_FIELD(tableSpaceName);
+}
+
 static void
 _outVar(StringInfo str, Var *node)
 {
@@ -608,6 +686,7 @@ _outConst(StringInfo str, Const *node)
        WRITE_NODE_TYPE("CONST");
 
        WRITE_OID_FIELD(consttype);
+       WRITE_INT_FIELD(consttypmod);
        WRITE_INT_FIELD(constlen);
        WRITE_BOOL_FIELD(constbyval);
        WRITE_BOOL_FIELD(constisnull);
@@ -624,10 +703,10 @@ _outParam(StringInfo str, Param *node)
 {
        WRITE_NODE_TYPE("PARAM");
 
-       WRITE_INT_FIELD(paramkind);
+       WRITE_ENUM_FIELD(paramkind, ParamKind);
        WRITE_INT_FIELD(paramid);
-       WRITE_STRING_FIELD(paramname);
        WRITE_OID_FIELD(paramtype);
+       WRITE_INT_FIELD(paramtypmod);
 }
 
 static void
@@ -637,7 +716,7 @@ _outAggref(StringInfo str, Aggref *node)
 
        WRITE_OID_FIELD(aggfnoid);
        WRITE_OID_FIELD(aggtype);
-       WRITE_NODE_FIELD(target);
+       WRITE_NODE_FIELD(args);
        WRITE_UINT_FIELD(agglevelsup);
        WRITE_BOOL_FIELD(aggstar);
        WRITE_BOOL_FIELD(aggdistinct);
@@ -648,9 +727,9 @@ _outArrayRef(StringInfo str, ArrayRef *node)
 {
        WRITE_NODE_TYPE("ARRAYREF");
 
-       WRITE_OID_FIELD(refrestype);
        WRITE_OID_FIELD(refarraytype);
        WRITE_OID_FIELD(refelemtype);
+       WRITE_INT_FIELD(reftypmod);
        WRITE_NODE_FIELD(refupperindexpr);
        WRITE_NODE_FIELD(reflowerindexpr);
        WRITE_NODE_FIELD(refexpr);
@@ -736,10 +815,8 @@ _outSubLink(StringInfo str, SubLink *node)
        WRITE_NODE_TYPE("SUBLINK");
 
        WRITE_ENUM_FIELD(subLinkType, SubLinkType);
-       WRITE_BOOL_FIELD(useOr);
-       WRITE_NODE_FIELD(lefthand);
+       WRITE_NODE_FIELD(testexpr);
        WRITE_NODE_FIELD(operName);
-       WRITE_NODE_FIELD(operOids);
        WRITE_NODE_FIELD(subselect);
 }
 
@@ -749,12 +826,10 @@ _outSubPlan(StringInfo str, SubPlan *node)
        WRITE_NODE_TYPE("SUBPLAN");
 
        WRITE_ENUM_FIELD(subLinkType, SubLinkType);
-       WRITE_BOOL_FIELD(useOr);
-       WRITE_NODE_FIELD(exprs);
+       WRITE_NODE_FIELD(testexpr);
        WRITE_NODE_FIELD(paramIds);
-       WRITE_NODE_FIELD(plan);
        WRITE_INT_FIELD(plan_id);
-       WRITE_NODE_FIELD(rtable);
+       WRITE_OID_FIELD(firstColType);
        WRITE_BOOL_FIELD(useHashTable);
        WRITE_BOOL_FIELD(unknownEqFalse);
        WRITE_NODE_FIELD(setParam);
@@ -795,6 +870,29 @@ _outRelabelType(StringInfo str, RelabelType *node)
        WRITE_ENUM_FIELD(relabelformat, CoercionForm);
 }
 
+static void
+_outCoerceViaIO(StringInfo str, CoerceViaIO *node)
+{
+       WRITE_NODE_TYPE("COERCEVIAIO");
+
+       WRITE_NODE_FIELD(arg);
+       WRITE_OID_FIELD(resulttype);
+       WRITE_ENUM_FIELD(coerceformat, CoercionForm);
+}
+
+static void
+_outArrayCoerceExpr(StringInfo str, ArrayCoerceExpr *node)
+{
+       WRITE_NODE_TYPE("ARRAYCOERCEEXPR");
+
+       WRITE_NODE_FIELD(arg);
+       WRITE_OID_FIELD(elemfuncid);
+       WRITE_OID_FIELD(resulttype);
+       WRITE_INT_FIELD(resulttypmod);
+       WRITE_BOOL_FIELD(isExplicit);
+       WRITE_ENUM_FIELD(coerceformat, CoercionForm);
+}
+
 static void
 _outConvertRowtypeExpr(StringInfo str, ConvertRowtypeExpr *node)
 {
@@ -855,6 +953,18 @@ _outRowExpr(StringInfo str, RowExpr *node)
        WRITE_ENUM_FIELD(row_format, CoercionForm);
 }
 
+static void
+_outRowCompareExpr(StringInfo str, RowCompareExpr *node)
+{
+       WRITE_NODE_TYPE("ROWCOMPARE");
+
+       WRITE_ENUM_FIELD(rctype, RowCompareType);
+       WRITE_NODE_FIELD(opnos);
+       WRITE_NODE_FIELD(opfamilies);
+       WRITE_NODE_FIELD(largs);
+       WRITE_NODE_FIELD(rargs);
+}
+
 static void
 _outCoalesceExpr(StringInfo str, CoalesceExpr *node)
 {
@@ -874,6 +984,21 @@ _outMinMaxExpr(StringInfo str, MinMaxExpr *node)
        WRITE_NODE_FIELD(args);
 }
 
+static void
+_outXmlExpr(StringInfo str, XmlExpr *node)
+{
+       WRITE_NODE_TYPE("XMLEXPR");
+       
+       WRITE_ENUM_FIELD(op, XmlExprOp);
+       WRITE_STRING_FIELD(name);
+       WRITE_NODE_FIELD(named_args);
+       WRITE_NODE_FIELD(arg_names);
+       WRITE_NODE_FIELD(args);
+       WRITE_ENUM_FIELD(xmloption, XmlOptionType);
+       WRITE_OID_FIELD(type);
+       WRITE_INT_FIELD(typmod);
+}
+
 static void
 _outNullIfExpr(StringInfo str, NullIfExpr *node)
 {
@@ -933,6 +1058,15 @@ _outSetToDefault(StringInfo str, SetToDefault *node)
        WRITE_INT_FIELD(typeMod);
 }
 
+static void
+_outCurrentOfExpr(StringInfo str, CurrentOfExpr *node)
+{
+       WRITE_NODE_TYPE("CURRENTOFEXPR");
+
+       WRITE_UINT_FIELD(cvarno);
+       WRITE_STRING_FIELD(cursor_name);
+}
+
 static void
 _outTargetEntry(StringInfo str, TargetEntry *node)
 {
@@ -1099,8 +1233,7 @@ _outResultPath(StringInfo str, ResultPath *node)
 
        _outPathInfo(str, (Path *) node);
 
-       WRITE_NODE_FIELD(subpath);
-       WRITE_NODE_FIELD(constantqual);
+       WRITE_NODE_FIELD(quals);
 }
 
 static void
@@ -1155,6 +1288,19 @@ _outHashPath(StringInfo str, HashPath *node)
        WRITE_NODE_FIELD(path_hashclauses);
 }
 
+static void
+_outPlannerGlobal(StringInfo str, 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_BITMAPSET_FIELD(rewindPlanIDs);
+       WRITE_NODE_FIELD(finalrtable);
+}
+
 static void
 _outPlannerInfo(StringInfo str, PlannerInfo *node)
 {
@@ -1162,19 +1308,29 @@ _outPlannerInfo(StringInfo str, PlannerInfo *node)
 
        /* NB: this isn't a complete set of fields */
        WRITE_NODE_FIELD(parse);
+       WRITE_NODE_FIELD(glob);
+       WRITE_UINT_FIELD(query_level);
        WRITE_NODE_FIELD(join_rel_list);
-       WRITE_NODE_FIELD(equi_key_list);
+       WRITE_NODE_FIELD(resultRelations);
+       WRITE_NODE_FIELD(returningLists);
+       WRITE_NODE_FIELD(init_plans);
+       WRITE_NODE_FIELD(eq_classes);
+       WRITE_NODE_FIELD(canon_pathkeys);
        WRITE_NODE_FIELD(left_join_clauses);
        WRITE_NODE_FIELD(right_join_clauses);
        WRITE_NODE_FIELD(full_join_clauses);
+       WRITE_NODE_FIELD(oj_info_list);
        WRITE_NODE_FIELD(in_info_list);
+       WRITE_NODE_FIELD(append_rel_list);
        WRITE_NODE_FIELD(query_pathkeys);
        WRITE_NODE_FIELD(group_pathkeys);
        WRITE_NODE_FIELD(sort_pathkeys);
+       WRITE_FLOAT_FIELD(total_table_pages, "%.0f");
        WRITE_FLOAT_FIELD(tuple_fraction, "%.4f");
        WRITE_BOOL_FIELD(hasJoinRTEs);
        WRITE_BOOL_FIELD(hasOuterJoins);
        WRITE_BOOL_FIELD(hasHavingQual);
+       WRITE_BOOL_FIELD(hasPseudoConstantQuals);
 }
 
 static void
@@ -1194,15 +1350,16 @@ _outRelOptInfo(StringInfo str, RelOptInfo *node)
        WRITE_NODE_FIELD(cheapest_unique_path);
        WRITE_UINT_FIELD(relid);
        WRITE_ENUM_FIELD(rtekind, RTEKind);
-       WRITE_UINT_FIELD(min_attr);
-       WRITE_UINT_FIELD(max_attr);
+       WRITE_INT_FIELD(min_attr);
+       WRITE_INT_FIELD(max_attr);
        WRITE_NODE_FIELD(indexlist);
        WRITE_UINT_FIELD(pages);
        WRITE_FLOAT_FIELD(tuples, "%.0f");
        WRITE_NODE_FIELD(subplan);
+       WRITE_NODE_FIELD(subrtable);
        WRITE_NODE_FIELD(baserestrictinfo);
-       WRITE_BITMAPSET_FIELD(outerjoinset);
        WRITE_NODE_FIELD(joininfo);
+       WRITE_BOOL_FIELD(has_eclass_joins);
        WRITE_BITMAPSET_FIELD(index_outer_relids);
        WRITE_NODE_FIELD(index_inner_paths);
 }
@@ -1225,12 +1382,49 @@ _outIndexOptInfo(StringInfo str, IndexOptInfo *node)
 }
 
 static void
-_outPathKeyItem(StringInfo str, PathKeyItem *node)
+_outEquivalenceClass(StringInfo str, EquivalenceClass *node)
 {
-       WRITE_NODE_TYPE("PATHKEYITEM");
+       /*
+        * To simplify reading, we just chase up to the topmost merged EC and
+        * print that, without bothering to show the merge-ees separately.
+        */
+       while (node->ec_merged)
+               node = node->ec_merged;
 
-       WRITE_NODE_FIELD(key);
-       WRITE_OID_FIELD(sortop);
+       WRITE_NODE_TYPE("EQUIVALENCECLASS");
+
+       WRITE_NODE_FIELD(ec_opfamilies);
+       WRITE_NODE_FIELD(ec_members);
+       WRITE_NODE_FIELD(ec_sources);
+       WRITE_NODE_FIELD(ec_derives);
+       WRITE_BITMAPSET_FIELD(ec_relids);
+       WRITE_BOOL_FIELD(ec_has_const);
+       WRITE_BOOL_FIELD(ec_has_volatile);
+       WRITE_BOOL_FIELD(ec_below_outer_join);
+       WRITE_BOOL_FIELD(ec_broken);
+}
+
+static void
+_outEquivalenceMember(StringInfo str, EquivalenceMember *node)
+{
+       WRITE_NODE_TYPE("EQUIVALENCEMEMBER");
+
+       WRITE_NODE_FIELD(em_expr);
+       WRITE_BITMAPSET_FIELD(em_relids);
+       WRITE_BOOL_FIELD(em_is_const);
+       WRITE_BOOL_FIELD(em_is_child);
+       WRITE_OID_FIELD(em_datatype);
+}
+
+static void
+_outPathKey(StringInfo str, PathKey *node)
+{
+       WRITE_NODE_TYPE("PATHKEY");
+
+       WRITE_NODE_FIELD(pk_eclass);
+       WRITE_OID_FIELD(pk_opfamily);
+       WRITE_INT_FIELD(pk_strategy);
+       WRITE_BOOL_FIELD(pk_nulls_first);
 }
 
 static void
@@ -1243,16 +1437,19 @@ _outRestrictInfo(StringInfo str, RestrictInfo *node)
        WRITE_BOOL_FIELD(is_pushed_down);
        WRITE_BOOL_FIELD(outerjoin_delayed);
        WRITE_BOOL_FIELD(can_join);
+       WRITE_BOOL_FIELD(pseudoconstant);
        WRITE_BITMAPSET_FIELD(clause_relids);
        WRITE_BITMAPSET_FIELD(required_relids);
        WRITE_BITMAPSET_FIELD(left_relids);
        WRITE_BITMAPSET_FIELD(right_relids);
        WRITE_NODE_FIELD(orclause);
-       WRITE_OID_FIELD(mergejoinoperator);
-       WRITE_OID_FIELD(left_sortop);
-       WRITE_OID_FIELD(right_sortop);
-       WRITE_NODE_FIELD(left_pathkey);
-       WRITE_NODE_FIELD(right_pathkey);
+       /* don't write parent_ec, leads to infinite recursion in plan tree dump */
+       WRITE_NODE_FIELD(mergeopfamilies);
+       /* don't write left_ec, leads to infinite recursion in plan tree dump */
+       /* don't write right_ec, leads to infinite recursion in plan tree dump */
+       WRITE_NODE_FIELD(left_em);
+       WRITE_NODE_FIELD(right_em);
+       WRITE_BOOL_FIELD(outer_is_left);
        WRITE_OID_FIELD(hashjoinoperator);
 }
 
@@ -1262,7 +1459,20 @@ _outInnerIndexscanInfo(StringInfo str, InnerIndexscanInfo *node)
        WRITE_NODE_TYPE("INNERINDEXSCANINFO");
        WRITE_BITMAPSET_FIELD(other_relids);
        WRITE_BOOL_FIELD(isouterjoin);
-       WRITE_NODE_FIELD(best_innerpath);
+       WRITE_NODE_FIELD(cheapest_startup_innerpath);
+       WRITE_NODE_FIELD(cheapest_total_innerpath);
+}
+
+static void
+_outOuterJoinInfo(StringInfo str, OuterJoinInfo *node)
+{
+       WRITE_NODE_TYPE("OUTERJOININFO");
+
+       WRITE_BITMAPSET_FIELD(min_lefthand);
+       WRITE_BITMAPSET_FIELD(min_righthand);
+       WRITE_BOOL_FIELD(is_full_join);
+       WRITE_BOOL_FIELD(lhs_strict);
+       WRITE_BOOL_FIELD(delay_upper_joins);
 }
 
 static void
@@ -1273,6 +1483,30 @@ _outInClauseInfo(StringInfo str, InClauseInfo *node)
        WRITE_BITMAPSET_FIELD(lefthand);
        WRITE_BITMAPSET_FIELD(righthand);
        WRITE_NODE_FIELD(sub_targetlist);
+       WRITE_NODE_FIELD(in_operators);
+}
+
+static void
+_outAppendRelInfo(StringInfo str, AppendRelInfo *node)
+{
+       WRITE_NODE_TYPE("APPENDRELINFO");
+
+       WRITE_UINT_FIELD(parent_relid);
+       WRITE_UINT_FIELD(child_relid);
+       WRITE_OID_FIELD(parent_reltype);
+       WRITE_OID_FIELD(child_reltype);
+       WRITE_NODE_FIELD(col_mappings);
+       WRITE_NODE_FIELD(translated_vars);
+       WRITE_OID_FIELD(parent_reloid);
+}
+
+static void
+_outPlannerParamItem(StringInfo str, PlannerParamItem *node)
+{
+       WRITE_NODE_TYPE("PLANNERPARAMITEM");
+
+       WRITE_NODE_FIELD(item);
+       WRITE_UINT_FIELD(abslevel);
 }
 
 /*****************************************************************************
@@ -1290,7 +1524,7 @@ _outCreateStmt(StringInfo str, CreateStmt *node)
        WRITE_NODE_FIELD(tableElts);
        WRITE_NODE_FIELD(inhRelations);
        WRITE_NODE_FIELD(constraints);
-       WRITE_ENUM_FIELD(hasoids, ContainsOids);
+       WRITE_NODE_FIELD(options);
        WRITE_ENUM_FIELD(oncommit, OnCommitAction);
        WRITE_STRING_FIELD(tablespacename);
 }
@@ -1305,11 +1539,12 @@ _outIndexStmt(StringInfo str, IndexStmt *node)
        WRITE_STRING_FIELD(accessMethod);
        WRITE_STRING_FIELD(tableSpace);
        WRITE_NODE_FIELD(indexParams);
+       WRITE_NODE_FIELD(options);
        WRITE_NODE_FIELD(whereClause);
-       WRITE_NODE_FIELD(rangetable);
        WRITE_BOOL_FIELD(unique);
        WRITE_BOOL_FIELD(primary);
        WRITE_BOOL_FIELD(isconstraint);
+       WRITE_BOOL_FIELD(concurrent);
 }
 
 static void
@@ -1336,14 +1571,13 @@ _outSelectStmt(StringInfo str, SelectStmt *node)
        WRITE_NODE_TYPE("SELECT");
 
        WRITE_NODE_FIELD(distinctClause);
-       WRITE_NODE_FIELD(into);
-       WRITE_NODE_FIELD(intoColNames);
-       WRITE_ENUM_FIELD(intoHasOids, ContainsOids);
+       WRITE_NODE_FIELD(intoClause);
        WRITE_NODE_FIELD(targetList);
        WRITE_NODE_FIELD(fromClause);
        WRITE_NODE_FIELD(whereClause);
        WRITE_NODE_FIELD(groupClause);
        WRITE_NODE_FIELD(havingClause);
+       WRITE_NODE_FIELD(valuesLists);
        WRITE_NODE_FIELD(sortClause);
        WRITE_NODE_FIELD(limitOffset);
        WRITE_NODE_FIELD(limitCount);
@@ -1363,6 +1597,7 @@ _outFuncCall(StringInfo str, FuncCall *node)
        WRITE_NODE_FIELD(args);
        WRITE_BOOL_FIELD(agg_star);
        WRITE_BOOL_FIELD(agg_distinct);
+       WRITE_INT_FIELD(location);
 }
 
 static void
@@ -1381,7 +1616,17 @@ _outLockingClause(StringInfo str, LockingClause *node)
 
        WRITE_NODE_FIELD(lockedRels);
        WRITE_BOOL_FIELD(forUpdate);
-       WRITE_BOOL_FIELD(nowait);
+       WRITE_BOOL_FIELD(noWait);
+}
+
+static void
+_outXmlSerialize(StringInfo str, XmlSerialize *node)
+{
+       WRITE_NODE_TYPE("XMLSERIALIZE");
+
+       WRITE_ENUM_FIELD(xmloption, XmlOptionType);
+       WRITE_NODE_FIELD(expr);
+       WRITE_NODE_FIELD(typename);
 }
 
 static void
@@ -1397,7 +1642,6 @@ _outColumnDef(StringInfo str, ColumnDef *node)
        WRITE_NODE_FIELD(raw_default);
        WRITE_STRING_FIELD(cooked_default);
        WRITE_NODE_FIELD(constraints);
-       WRITE_NODE_FIELD(support);
 }
 
 static void
@@ -1410,8 +1654,10 @@ _outTypeName(StringInfo str, TypeName *node)
        WRITE_BOOL_FIELD(timezone);
        WRITE_BOOL_FIELD(setof);
        WRITE_BOOL_FIELD(pct_type);
-       WRITE_INT_FIELD(typmod);
+       WRITE_NODE_FIELD(typmods);
+       WRITE_INT_FIELD(typemod);
        WRITE_NODE_FIELD(arrayBounds);
+       WRITE_INT_FIELD(location);
 }
 
 static void
@@ -1431,6 +1677,8 @@ _outIndexElem(StringInfo str, IndexElem *node)
        WRITE_STRING_FIELD(name);
        WRITE_NODE_FIELD(expr);
        WRITE_NODE_FIELD(opclass);
+       WRITE_ENUM_FIELD(ordering, SortByDir);
+       WRITE_ENUM_FIELD(nulls_ordering, SortByNulls);
 }
 
 static void
@@ -1468,23 +1716,21 @@ _outQuery(StringInfo str, Query *node)
                appendStringInfo(str, " :utilityStmt <>");
 
        WRITE_INT_FIELD(resultRelation);
-       WRITE_NODE_FIELD(into);
+       WRITE_NODE_FIELD(intoClause);
        WRITE_BOOL_FIELD(hasAggs);
        WRITE_BOOL_FIELD(hasSubLinks);
        WRITE_NODE_FIELD(rtable);
        WRITE_NODE_FIELD(jointree);
-       WRITE_NODE_FIELD(rowMarks);
-       WRITE_BOOL_FIELD(forUpdate);
-       WRITE_BOOL_FIELD(rowNoWait);
        WRITE_NODE_FIELD(targetList);
+       WRITE_NODE_FIELD(returningList);
        WRITE_NODE_FIELD(groupClause);
        WRITE_NODE_FIELD(havingQual);
        WRITE_NODE_FIELD(distinctClause);
        WRITE_NODE_FIELD(sortClause);
        WRITE_NODE_FIELD(limitOffset);
        WRITE_NODE_FIELD(limitCount);
+       WRITE_NODE_FIELD(rowMarks);
        WRITE_NODE_FIELD(setOperations);
-       WRITE_NODE_FIELD(resultRelations);
 }
 
 static void
@@ -1494,6 +1740,7 @@ _outSortClause(StringInfo str, SortClause *node)
 
        WRITE_UINT_FIELD(tleSortGroupRef);
        WRITE_OID_FIELD(sortop);
+       WRITE_BOOL_FIELD(nulls_first);
 }
 
 static void
@@ -1503,6 +1750,17 @@ _outGroupClause(StringInfo str, GroupClause *node)
 
        WRITE_UINT_FIELD(tleSortGroupRef);
        WRITE_OID_FIELD(sortop);
+       WRITE_BOOL_FIELD(nulls_first);
+}
+
+static void
+_outRowMarkClause(StringInfo str, RowMarkClause *node)
+{
+       WRITE_NODE_TYPE("ROWMARKCLAUSE");
+
+       WRITE_UINT_FIELD(rti);
+       WRITE_BOOL_FIELD(forUpdate);
+       WRITE_BOOL_FIELD(noWait);
 }
 
 static void
@@ -1515,6 +1773,7 @@ _outSetOperationStmt(StringInfo str, SetOperationStmt *node)
        WRITE_NODE_FIELD(larg);
        WRITE_NODE_FIELD(rarg);
        WRITE_NODE_FIELD(colTypes);
+       WRITE_NODE_FIELD(colTypmods);
 }
 
 static void
@@ -1538,7 +1797,11 @@ _outRangeTblEntry(StringInfo str, RangeTblEntry *node)
                        break;
                case RTE_FUNCTION:
                        WRITE_NODE_FIELD(funcexpr);
-                       WRITE_NODE_FIELD(coldeflist);
+                       WRITE_NODE_FIELD(funccoltypes);
+                       WRITE_NODE_FIELD(funccoltypmods);
+                       break;
+               case RTE_VALUES:
+                       WRITE_NODE_FIELD(values_lists);
                        break;
                case RTE_JOIN:
                        WRITE_ENUM_FIELD(jointype, JoinType);
@@ -1597,6 +1860,10 @@ _outAExpr(StringInfo str, A_Expr *node)
                        appendStringInfo(str, " OF ");
                        WRITE_NODE_FIELD(name);
                        break;
+               case AEXPR_IN:
+                       appendStringInfo(str, " IN ");
+                       WRITE_NODE_FIELD(name);
+                       break;
                default:
                        appendStringInfo(str, " ??");
                        break;
@@ -1604,6 +1871,7 @@ _outAExpr(StringInfo str, A_Expr *node)
 
        WRITE_NODE_FIELD(lexpr);
        WRITE_NODE_FIELD(rexpr);
+       WRITE_INT_FIELD(location);
 }
 
 static void
@@ -1643,6 +1911,7 @@ _outColumnRef(StringInfo str, ColumnRef *node)
        WRITE_NODE_TYPE("COLUMNREF");
 
        WRITE_NODE_FIELD(fields);
+       WRITE_INT_FIELD(location);
 }
 
 static void
@@ -1658,6 +1927,7 @@ _outAConst(StringInfo str, A_Const *node)
 {
        WRITE_NODE_TYPE("A_CONST");
 
+       appendStringInfo(str, " :val ");
        _outValue(str, &(node->val));
        WRITE_NODE_FIELD(typename);
 }
@@ -1688,6 +1958,7 @@ _outResTarget(StringInfo str, ResTarget *node)
        WRITE_STRING_FIELD(name);
        WRITE_NODE_FIELD(indirection);
        WRITE_NODE_FIELD(val);
+       WRITE_INT_FIELD(location);
 }
 
 static void
@@ -1703,12 +1974,14 @@ _outConstraint(StringInfo str, Constraint *node)
                case CONSTR_PRIMARY:
                        appendStringInfo(str, "PRIMARY_KEY");
                        WRITE_NODE_FIELD(keys);
+                       WRITE_NODE_FIELD(options);
                        WRITE_STRING_FIELD(indexspace);
                        break;
 
                case CONSTR_UNIQUE:
                        appendStringInfo(str, "UNIQUE");
                        WRITE_NODE_FIELD(keys);
+                       WRITE_NODE_FIELD(options);
                        WRITE_STRING_FIELD(indexspace);
                        break;
 
@@ -1776,6 +2049,9 @@ _outNode(StringInfo str, void *obj)
                appendStringInfoChar(str, '{');
                switch (nodeTag(obj))
                {
+                       case T_PlannedStmt:
+                               _outPlannedStmt(str, obj);
+                               break;
                        case T_Plan:
                                _outPlan(str, obj);
                                break;
@@ -1815,6 +2091,9 @@ _outNode(StringInfo str, void *obj)
                        case T_FunctionScan:
                                _outFunctionScan(str, obj);
                                break;
+                       case T_ValuesScan:
+                               _outValuesScan(str, obj);
+                               break;
                        case T_Join:
                                _outJoin(str, obj);
                                break;
@@ -1857,6 +2136,9 @@ _outNode(StringInfo str, void *obj)
                        case T_RangeVar:
                                _outRangeVar(str, obj);
                                break;
+                       case T_IntoClause:
+                               _outIntoClause(str, obj);
+                               break;
                        case T_Var:
                                _outVar(str, obj);
                                break;
@@ -1902,6 +2184,12 @@ _outNode(StringInfo str, void *obj)
                        case T_RelabelType:
                                _outRelabelType(str, obj);
                                break;
+                       case T_CoerceViaIO:
+                               _outCoerceViaIO(str, obj);
+                               break;
+                       case T_ArrayCoerceExpr:
+                               _outArrayCoerceExpr(str, obj);
+                               break;
                        case T_ConvertRowtypeExpr:
                                _outConvertRowtypeExpr(str, obj);
                                break;
@@ -1920,12 +2208,18 @@ _outNode(StringInfo str, void *obj)
                        case T_RowExpr:
                                _outRowExpr(str, obj);
                                break;
+                       case T_RowCompareExpr:
+                               _outRowCompareExpr(str, obj);
+                               break;
                        case T_CoalesceExpr:
                                _outCoalesceExpr(str, obj);
                                break;
                        case T_MinMaxExpr:
                                _outMinMaxExpr(str, obj);
                                break;
+                       case T_XmlExpr:
+                               _outXmlExpr(str, obj);
+                               break;
                        case T_NullIfExpr:
                                _outNullIfExpr(str, obj);
                                break;
@@ -1944,6 +2238,9 @@ _outNode(StringInfo str, void *obj)
                        case T_SetToDefault:
                                _outSetToDefault(str, obj);
                                break;
+                       case T_CurrentOfExpr:
+                               _outCurrentOfExpr(str, obj);
+                               break;
                        case T_TargetEntry:
                                _outTargetEntry(str, obj);
                                break;
@@ -1996,6 +2293,9 @@ _outNode(StringInfo str, void *obj)
                        case T_HashPath:
                                _outHashPath(str, obj);
                                break;
+                       case T_PlannerGlobal:
+                               _outPlannerGlobal(str, obj);
+                               break;
                        case T_PlannerInfo:
                                _outPlannerInfo(str, obj);
                                break;
@@ -2005,8 +2305,14 @@ _outNode(StringInfo str, void *obj)
                        case T_IndexOptInfo:
                                _outIndexOptInfo(str, obj);
                                break;
-                       case T_PathKeyItem:
-                               _outPathKeyItem(str, obj);
+                       case T_EquivalenceClass:
+                               _outEquivalenceClass(str, obj);
+                               break;
+                       case T_EquivalenceMember:
+                               _outEquivalenceMember(str, obj);
+                               break;
+                       case T_PathKey:
+                               _outPathKey(str, obj);
                                break;
                        case T_RestrictInfo:
                                _outRestrictInfo(str, obj);
@@ -2014,9 +2320,18 @@ _outNode(StringInfo str, void *obj)
                        case T_InnerIndexscanInfo:
                                _outInnerIndexscanInfo(str, obj);
                                break;
+                       case T_OuterJoinInfo:
+                               _outOuterJoinInfo(str, obj);
+                               break;
                        case T_InClauseInfo:
                                _outInClauseInfo(str, obj);
                                break;
+                       case T_AppendRelInfo:
+                               _outAppendRelInfo(str, obj);
+                               break;
+                       case T_PlannerParamItem:
+                               _outPlannerParamItem(str, obj);
+                               break;
 
                        case T_CreateStmt:
                                _outCreateStmt(str, obj);
@@ -2054,6 +2369,9 @@ _outNode(StringInfo str, void *obj)
                        case T_GroupClause:
                                _outGroupClause(str, obj);
                                break;
+                       case T_RowMarkClause:
+                               _outRowMarkClause(str, obj);
+                               break;
                        case T_SetOperationStmt:
                                _outSetOperationStmt(str, obj);
                                break;
@@ -2096,6 +2414,9 @@ _outNode(StringInfo str, void *obj)
                        case T_LockingClause:
                                _outLockingClause(str, obj);
                                break;
+                       case T_XmlSerialize:
+                               _outXmlSerialize(str, obj);
+                               break;
 
                        default: