]> granicus.if.org Git - postgresql/blobdiff - src/backend/nodes/readfuncs.c
Improve parse representation for MERGE
[postgresql] / src / backend / nodes / readfuncs.c
index e027154e6778d2037c1794bc9d615f19d4dba7e5..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 */ \
@@ -86,7 +93,8 @@
 #define READ_CHAR_FIELD(fldname) \
        token = pg_strtok(&length);             /* skip :fldname */ \
        token = pg_strtok(&length);             /* get field value */ \
-       local_node->fldname = token[0]
+       /* avoid overhead of calling debackslash() for one char */ \
+       local_node->fldname = (length == 0) ? '\0' : (token[0] == '\\' ? token[1] : token[0])
 
 /* Read an enumerated-type field that was written as an integer code */
 #define READ_ENUM_FIELD(fldname, enumtype) \
@@ -230,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);
@@ -262,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);
 
@@ -361,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);
 
@@ -446,8 +462,7 @@ _readRangeVar(void)
 {
        READ_LOCALS(RangeVar);
 
-       local_node->catalogname = NULL;         /* not currently saved in output
-                                                                                * format */
+       local_node->catalogname = NULL; /* not currently saved in output format */
 
        READ_STRING_FIELD(schemaname);
        READ_STRING_FIELD(relname);
@@ -467,8 +482,8 @@ _readTableFunc(void)
 {
        READ_LOCALS(TableFunc);
 
-       READ_NODE_FIELD(ns_names);
        READ_NODE_FIELD(ns_uris);
+       READ_NODE_FIELD(ns_names);
        READ_NODE_FIELD(docexpr);
        READ_NODE_FIELD(rowexpr);
        READ_NODE_FIELD(colnames);
@@ -539,7 +554,7 @@ _readConst(void)
 
        token = pg_strtok(&length); /* skip :constvalue */
        if (local_node->constisnull)
-               token = pg_strtok(&length);             /* skip "<>" */
+               token = pg_strtok(&length); /* skip "<>" */
        else
                local_node->constvalue = readDatum(local_node->constbyval);
 
@@ -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);
 
@@ -1202,6 +1216,20 @@ _readCurrentOfExpr(void)
        READ_DONE();
 }
 
+/*
+ * _readNextValueExpr
+ */
+static NextValueExpr *
+_readNextValueExpr(void)
+{
+       READ_LOCALS(NextValueExpr);
+
+       READ_OID_FIELD(seqid);
+       READ_OID_FIELD(typeId);
+
+       READ_DONE();
+}
+
 /*
  * _readInferenceElem
  */
@@ -1303,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.
  */
@@ -1358,6 +1402,7 @@ _readRangeTblEntry(void)
                        break;
                case RTE_NAMEDTUPLESTORE:
                        READ_STRING_FIELD(enrname);
+                       READ_FLOAT_FIELD(enrtuples);
                        READ_OID_FIELD(relid);
                        READ_NODE_FIELD(coltypes);
                        READ_NODE_FIELD(coltypmods);
@@ -1442,23 +1487,25 @@ _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);
        READ_NODE_FIELD(nonleafResultRelations);
+       READ_NODE_FIELD(rootResultRelations);
        READ_NODE_FIELD(subplans);
        READ_BITMAPSET_FIELD(rewindPlanIDs);
        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);
@@ -1480,6 +1527,7 @@ ReadCommonPlan(Plan *local_node)
        READ_FLOAT_FIELD(plan_rows);
        READ_INT_FIELD(plan_width);
        READ_BOOL_FIELD(parallel_aware);
+       READ_BOOL_FIELD(parallel_safe);
        READ_INT_FIELD(plan_node_id);
        READ_NODE_FIELD(targetlist);
        READ_NODE_FIELD(qual);
@@ -1545,8 +1593,11 @@ _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);
        READ_NODE_FIELD(withCheckOptionLists);
        READ_NODE_FIELD(returningLists);
@@ -1560,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();
 }
@@ -1576,6 +1648,7 @@ _readAppend(void)
 
        READ_NODE_FIELD(partitioned_rels);
        READ_NODE_FIELD(appendplans);
+       READ_INT_FIELD(first_partial_plan);
 
        READ_DONE();
 }
@@ -1949,6 +2022,7 @@ ReadCommonJoin(Join *local_node)
        ReadCommonPlan(&local_node->plan);
 
        READ_ENUM_FIELD(jointype, JoinType);
+       READ_BOOL_FIELD(inner_unique);
        READ_NODE_FIELD(joinqual);
 }
 
@@ -1992,6 +2066,7 @@ _readMergeJoin(void)
 
        ReadCommonJoin(&local_node->join);
 
+       READ_BOOL_FIELD(skip_mark_restore);
        READ_NODE_FIELD(mergeclauses);
 
        numCols = list_length(local_node->mergeclauses);
@@ -2111,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();
 }
@@ -2143,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();
 }
@@ -2160,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();
 }
@@ -2182,8 +2266,7 @@ _readHash(void)
        READ_OID_FIELD(skewTable);
        READ_INT_FIELD(skewColumn);
        READ_BOOL_FIELD(skewInherit);
-       READ_OID_FIELD(skewColType);
-       READ_INT_FIELD(skewColTypmod);
+       READ_FLOAT_FIELD(rows_total);
 
        READ_DONE();
 }
@@ -2370,9 +2453,13 @@ _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);
+       READ_LOCATION_FIELD(location);
 
        READ_DONE();
 }
@@ -2385,8 +2472,9 @@ _readPartitionRangeDatum(void)
 {
        READ_LOCALS(PartitionRangeDatum);
 
-       READ_BOOL_FIELD(infinite);
+       READ_ENUM_FIELD(kind, PartitionRangeDatumKind);
        READ_NODE_FIELD(value);
+       READ_LOCATION_FIELD(location);
 
        READ_DONE();
 }
@@ -2511,6 +2599,8 @@ parseNodeString(void)
                return_value = _readSetToDefault();
        else if (MATCH("CURRENTOFEXPR", 13))
                return_value = _readCurrentOfExpr();
+       else if (MATCH("NEXTVALUEEXPR", 13))
+               return_value = _readNextValueExpr();
        else if (MATCH("INFERENCEELEM", 13))
                return_value = _readInferenceElem();
        else if (MATCH("TARGETENTRY", 11))
@@ -2523,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))
@@ -2545,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))
@@ -2631,9 +2725,9 @@ parseNodeString(void)
                return_value = _readAlternativeSubPlan();
        else if (MATCH("EXTENSIBLENODE", 14))
                return_value = _readExtensibleNode();
-       else if (MATCH("PARTITIONBOUND", 14))
+       else if (MATCH("PARTITIONBOUNDSPEC", 18))
                return_value = _readPartitionBoundSpec();
-       else if (MATCH("PARTRANGEDATUM", 14))
+       else if (MATCH("PARTITIONRANGEDATUM", 19))
                return_value = _readPartitionRangeDatum();
        else
        {