]> granicus.if.org Git - postgresql/blobdiff - src/backend/nodes/readfuncs.c
Improve parse representation for MERGE
[postgresql] / src / backend / nodes / readfuncs.c
index 8ab09d74d604d8609de276b9af4e097ffab5392a..37e35685956729c3bfb70e78c60c909e54d0c710 100644 (file)
@@ -3,7 +3,7 @@
  * readfuncs.c
  *       Reader functions for Postgres tree nodes.
  *
- * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
@@ -33,6 +33,7 @@
 #include "nodes/parsenodes.h"
 #include "nodes/plannodes.h"
 #include "nodes/readfuncs.h"
+#include "utils/builtins.h"
 
 
 /*
        token = pg_strtok(&length);             /* get field value */ \
        local_node->fldname = atoui(token)
 
-/* Read an long integer field (anything written as ":fldname %ld") */
+/* Read an unsigned integer field (anything written using UINT64_FORMAT) */
+#define READ_UINT64_FIELD(fldname) \
+       token = pg_strtok(&length);             /* skip :fldname */ \
+       token = pg_strtok(&length);             /* get field value */ \
+       local_node->fldname = pg_strtouint64(token, NULL, 10)
+
+/* Read a long integer field (anything written as ":fldname %ld") */
 #define READ_LONG_FIELD(fldname) \
        token = pg_strtok(&length);             /* skip :fldname */ \
        token = pg_strtok(&length);             /* get field value */ \
@@ -231,7 +238,7 @@ _readQuery(void)
 
        READ_ENUM_FIELD(commandType, CmdType);
        READ_ENUM_FIELD(querySource, QuerySource);
-       local_node->queryId = 0;        /* not saved in output format */
+       local_node->queryId = UINT64CONST(0);   /* not saved in output format */
        READ_BOOL_FIELD(canSetTag);
        READ_NODE_FIELD(utilityStmt);
        READ_INT_FIELD(resultRelation);
@@ -263,6 +270,9 @@ _readQuery(void)
        READ_NODE_FIELD(setOperations);
        READ_NODE_FIELD(constraintDeps);
        /* withCheckOptions intentionally omitted, see comment in parsenodes.h */
+       READ_INT_FIELD(mergeTarget_relation);
+       READ_NODE_FIELD(mergeSourceTargetList);
+       READ_NODE_FIELD(mergeActionList);
        READ_LOCATION_FIELD(stmt_location);
        READ_LOCATION_FIELD(stmt_len);
 
@@ -362,6 +372,11 @@ _readWindowClause(void)
        READ_INT_FIELD(frameOptions);
        READ_NODE_FIELD(startOffset);
        READ_NODE_FIELD(endOffset);
+       READ_OID_FIELD(startInRangeFunc);
+       READ_OID_FIELD(endInRangeFunc);
+       READ_OID_FIELD(inRangeColl);
+       READ_BOOL_FIELD(inRangeAsc);
+       READ_BOOL_FIELD(inRangeNullsFirst);
        READ_UINT_FIELD(winref);
        READ_BOOL_FIELD(copiedOrder);
 
@@ -892,11 +907,10 @@ _readArrayCoerceExpr(void)
        READ_LOCALS(ArrayCoerceExpr);
 
        READ_NODE_FIELD(arg);
-       READ_OID_FIELD(elemfuncid);
+       READ_NODE_FIELD(elemexpr);
        READ_OID_FIELD(resulttype);
        READ_INT_FIELD(resulttypmod);
        READ_OID_FIELD(resultcollid);
-       READ_BOOL_FIELD(isExplicit);
        READ_ENUM_FIELD(coerceformat, CoercionForm);
        READ_LOCATION_FIELD(location);
 
@@ -1317,6 +1331,22 @@ _readOnConflictExpr(void)
        READ_DONE();
 }
 
+/*
+ * _readMergeAction
+ */
+static MergeAction *
+_readMergeAction(void)
+{
+       READ_LOCALS(MergeAction);
+
+       READ_BOOL_FIELD(matched);
+       READ_ENUM_FIELD(commandType, CmdType);
+       READ_NODE_FIELD(qual);
+       READ_NODE_FIELD(targetList);
+
+       READ_DONE();
+}
+
 /*
  *     Stuff from parsenodes.h.
  */
@@ -1457,13 +1487,14 @@ _readPlannedStmt(void)
        READ_LOCALS(PlannedStmt);
 
        READ_ENUM_FIELD(commandType, CmdType);
-       READ_UINT_FIELD(queryId);
+       READ_UINT64_FIELD(queryId);
        READ_BOOL_FIELD(hasReturning);
        READ_BOOL_FIELD(hasModifyingCTE);
        READ_BOOL_FIELD(canSetTag);
        READ_BOOL_FIELD(transientPlan);
        READ_BOOL_FIELD(dependsOnRole);
        READ_BOOL_FIELD(parallelModeNeeded);
+       READ_BOOL_FIELD(jitFlags);
        READ_NODE_FIELD(planTree);
        READ_NODE_FIELD(rtable);
        READ_NODE_FIELD(resultRelations);
@@ -1474,7 +1505,7 @@ _readPlannedStmt(void)
        READ_NODE_FIELD(rowMarks);
        READ_NODE_FIELD(relationOids);
        READ_NODE_FIELD(invalItems);
-       READ_INT_FIELD(nParamExec);
+       READ_NODE_FIELD(paramExecTypes);
        READ_NODE_FIELD(utilityStmt);
        READ_LOCATION_FIELD(stmt_location);
        READ_LOCATION_FIELD(stmt_len);
@@ -1562,7 +1593,9 @@ _readModifyTable(void)
        READ_BOOL_FIELD(canSetTag);
        READ_UINT_FIELD(nominalRelation);
        READ_NODE_FIELD(partitioned_rels);
+       READ_BOOL_FIELD(partColsUpdated);
        READ_NODE_FIELD(resultRelations);
+       READ_INT_FIELD(mergeTargetRelation);
        READ_INT_FIELD(resultRelIndex);
        READ_INT_FIELD(rootResultRelIndex);
        READ_NODE_FIELD(plans);
@@ -1578,6 +1611,27 @@ _readModifyTable(void)
        READ_NODE_FIELD(onConflictWhere);
        READ_UINT_FIELD(exclRelRTI);
        READ_NODE_FIELD(exclRelTlist);
+       READ_NODE_FIELD(mergeSourceTargetList);
+       READ_NODE_FIELD(mergeActionList);
+
+       READ_DONE();
+}
+
+/*
+ * _readMergeWhenClause
+ */
+static MergeWhenClause *
+_readMergeWhenClause(void)
+{
+       READ_LOCALS(MergeWhenClause);
+
+       READ_BOOL_FIELD(matched);
+       READ_ENUM_FIELD(commandType, CmdType);
+       READ_NODE_FIELD(condition);
+       READ_NODE_FIELD(targetList);
+       READ_NODE_FIELD(cols);
+       READ_NODE_FIELD(values);
+       READ_ENUM_FIELD(override, OverridingKind);
 
        READ_DONE();
 }
@@ -1594,6 +1648,7 @@ _readAppend(void)
 
        READ_NODE_FIELD(partitioned_rels);
        READ_NODE_FIELD(appendplans);
+       READ_INT_FIELD(first_partial_plan);
 
        READ_DONE();
 }
@@ -2131,6 +2186,11 @@ _readWindowAgg(void)
        READ_INT_FIELD(frameOptions);
        READ_NODE_FIELD(startOffset);
        READ_NODE_FIELD(endOffset);
+       READ_OID_FIELD(startInRangeFunc);
+       READ_OID_FIELD(endInRangeFunc);
+       READ_OID_FIELD(inRangeColl);
+       READ_BOOL_FIELD(inRangeAsc);
+       READ_BOOL_FIELD(inRangeNullsFirst);
 
        READ_DONE();
 }
@@ -2163,8 +2223,10 @@ _readGather(void)
        ReadCommonPlan(&local_node->plan);
 
        READ_INT_FIELD(num_workers);
+       READ_INT_FIELD(rescan_param);
        READ_BOOL_FIELD(single_copy);
        READ_BOOL_FIELD(invisible);
+       READ_BITMAPSET_FIELD(initParam);
 
        READ_DONE();
 }
@@ -2180,11 +2242,13 @@ _readGatherMerge(void)
        ReadCommonPlan(&local_node->plan);
 
        READ_INT_FIELD(num_workers);
+       READ_INT_FIELD(rescan_param);
        READ_INT_FIELD(numCols);
        READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numCols);
        READ_OID_ARRAY(sortOperators, local_node->numCols);
        READ_OID_ARRAY(collations, local_node->numCols);
        READ_BOOL_ARRAY(nullsFirst, local_node->numCols);
+       READ_BITMAPSET_FIELD(initParam);
 
        READ_DONE();
 }
@@ -2202,6 +2266,7 @@ _readHash(void)
        READ_OID_FIELD(skewTable);
        READ_INT_FIELD(skewColumn);
        READ_BOOL_FIELD(skewInherit);
+       READ_FLOAT_FIELD(rows_total);
 
        READ_DONE();
 }
@@ -2388,6 +2453,9 @@ _readPartitionBoundSpec(void)
        READ_LOCALS(PartitionBoundSpec);
 
        READ_CHAR_FIELD(strategy);
+       READ_BOOL_FIELD(is_default);
+       READ_INT_FIELD(modulus);
+       READ_INT_FIELD(remainder);
        READ_NODE_FIELD(listdatums);
        READ_NODE_FIELD(lowerdatums);
        READ_NODE_FIELD(upperdatums);
@@ -2404,7 +2472,7 @@ _readPartitionRangeDatum(void)
 {
        READ_LOCALS(PartitionRangeDatum);
 
-       READ_BOOL_FIELD(infinite);
+       READ_ENUM_FIELD(kind, PartitionRangeDatumKind);
        READ_NODE_FIELD(value);
        READ_LOCATION_FIELD(location);
 
@@ -2545,6 +2613,8 @@ parseNodeString(void)
                return_value = _readFromExpr();
        else if (MATCH("ONCONFLICTEXPR", 14))
                return_value = _readOnConflictExpr();
+       else if (MATCH("MERGEACTION", 11))
+               return_value = _readMergeAction();
        else if (MATCH("RTE", 3))
                return_value = _readRangeTblEntry();
        else if (MATCH("RANGETBLFUNCTION", 16))
@@ -2567,6 +2637,8 @@ parseNodeString(void)
                return_value = _readProjectSet();
        else if (MATCH("MODIFYTABLE", 11))
                return_value = _readModifyTable();
+       else if (MATCH("MERGEWHENCLAUSE", 15))
+               return_value = _readMergeWhenClause();
        else if (MATCH("APPEND", 6))
                return_value = _readAppend();
        else if (MATCH("MERGEAPPEND", 11))