(appendStringInfoString(str, " :" CppAsString(fldname) " "), \
outBitmapset(str, node->fldname))
+#define WRITE_ATTRNUMBER_ARRAY(fldname, len) \
+ do { \
+ appendStringInfoString(str, " :" CppAsString(fldname) " "); \
+ for (int i = 0; i < len; i++) \
+ appendStringInfo(str, " %d", node->fldname[i]); \
+ } while(0)
+
+#define WRITE_OID_ARRAY(fldname, len) \
+ do { \
+ appendStringInfoString(str, " :" CppAsString(fldname) " "); \
+ for (int i = 0; i < len; i++) \
+ appendStringInfo(str, " %u", node->fldname[i]); \
+ } while(0)
+
+#define WRITE_INT_ARRAY(fldname, len) \
+ do { \
+ appendStringInfoString(str, " :" CppAsString(fldname) " "); \
+ for (int i = 0; i < len; i++) \
+ appendStringInfo(str, " %d", node->fldname[i]); \
+ } while(0)
+
+#define WRITE_BOOL_ARRAY(fldname, len) \
+ do { \
+ appendStringInfoString(str, " :" CppAsString(fldname) " "); \
+ for (int i = 0; i < len; i++) \
+ appendStringInfo(str, " %s", booltostr(node->fldname[i])); \
+ } while(0)
+
#define booltostr(x) ((x) ? "true" : "false")
static void
_outMergeAppend(StringInfo str, const MergeAppend *node)
{
- int i;
-
WRITE_NODE_TYPE("MERGEAPPEND");
_outPlanInfo(str, (const Plan *) node);
WRITE_NODE_FIELD(mergeplans);
-
WRITE_INT_FIELD(numCols);
-
- appendStringInfoString(str, " :sortColIdx");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %d", node->sortColIdx[i]);
-
- appendStringInfoString(str, " :sortOperators");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %u", node->sortOperators[i]);
-
- appendStringInfoString(str, " :collations");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %u", node->collations[i]);
-
- appendStringInfoString(str, " :nullsFirst");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %s", booltostr(node->nullsFirst[i]));
-
+ WRITE_ATTRNUMBER_ARRAY(sortColIdx, node->numCols);
+ WRITE_OID_ARRAY(sortOperators, node->numCols);
+ WRITE_OID_ARRAY(collations, node->numCols);
+ WRITE_BOOL_ARRAY(nullsFirst, node->numCols);
WRITE_NODE_FIELD(part_prune_info);
}
static void
_outRecursiveUnion(StringInfo str, const RecursiveUnion *node)
{
- int i;
-
WRITE_NODE_TYPE("RECURSIVEUNION");
_outPlanInfo(str, (const Plan *) node);
WRITE_INT_FIELD(wtParam);
WRITE_INT_FIELD(numCols);
-
- appendStringInfoString(str, " :dupColIdx");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %d", node->dupColIdx[i]);
-
- appendStringInfoString(str, " :dupOperators");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %u", node->dupOperators[i]);
-
+ WRITE_ATTRNUMBER_ARRAY(dupColIdx, node->numCols);
+ WRITE_OID_ARRAY(dupOperators, node->numCols);
WRITE_LONG_FIELD(numGroups);
}
static void
_outGatherMerge(StringInfo str, const GatherMerge *node)
{
- int i;
-
WRITE_NODE_TYPE("GATHERMERGE");
_outPlanInfo(str, (const Plan *) node);
WRITE_INT_FIELD(num_workers);
WRITE_INT_FIELD(rescan_param);
WRITE_INT_FIELD(numCols);
-
- appendStringInfoString(str, " :sortColIdx");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %d", node->sortColIdx[i]);
-
- appendStringInfoString(str, " :sortOperators");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %u", node->sortOperators[i]);
-
- appendStringInfoString(str, " :collations");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %u", node->collations[i]);
-
- appendStringInfoString(str, " :nullsFirst");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %s", booltostr(node->nullsFirst[i]));
-
+ WRITE_ATTRNUMBER_ARRAY(sortColIdx, node->numCols);
+ WRITE_OID_ARRAY(sortOperators, node->numCols);
+ WRITE_OID_ARRAY(collations, node->numCols);
+ WRITE_BOOL_ARRAY(nullsFirst, node->numCols);
WRITE_BITMAPSET_FIELD(initParam);
}
_outMergeJoin(StringInfo str, const MergeJoin *node)
{
int numCols;
- int i;
WRITE_NODE_TYPE("MERGEJOIN");
numCols = list_length(node->mergeclauses);
- appendStringInfoString(str, " :mergeFamilies");
- for (i = 0; i < numCols; i++)
- appendStringInfo(str, " %u", node->mergeFamilies[i]);
-
- appendStringInfoString(str, " :mergeCollations");
- for (i = 0; i < numCols; i++)
- appendStringInfo(str, " %u", node->mergeCollations[i]);
-
- appendStringInfoString(str, " :mergeStrategies");
- for (i = 0; i < numCols; i++)
- appendStringInfo(str, " %d", node->mergeStrategies[i]);
-
- appendStringInfoString(str, " :mergeNullsFirst");
- for (i = 0; i < numCols; i++)
- appendStringInfo(str, " %s", booltostr(node->mergeNullsFirst[i]));
+ WRITE_OID_ARRAY(mergeFamilies, numCols);
+ WRITE_OID_ARRAY(mergeCollations, numCols);
+ WRITE_INT_ARRAY(mergeStrategies, numCols);
+ WRITE_BOOL_ARRAY(mergeNullsFirst, numCols);
}
static void
static void
_outAgg(StringInfo str, const Agg *node)
{
- int i;
-
WRITE_NODE_TYPE("AGG");
_outPlanInfo(str, (const Plan *) node);
WRITE_ENUM_FIELD(aggstrategy, AggStrategy);
WRITE_ENUM_FIELD(aggsplit, AggSplit);
WRITE_INT_FIELD(numCols);
-
- appendStringInfoString(str, " :grpColIdx");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %d", node->grpColIdx[i]);
-
- appendStringInfoString(str, " :grpOperators");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %u", node->grpOperators[i]);
-
+ WRITE_ATTRNUMBER_ARRAY(grpColIdx, node->numCols);
+ WRITE_OID_ARRAY(grpOperators, node->numCols);
WRITE_LONG_FIELD(numGroups);
WRITE_BITMAPSET_FIELD(aggParams);
WRITE_NODE_FIELD(groupingSets);
static void
_outWindowAgg(StringInfo str, const WindowAgg *node)
{
- int i;
-
WRITE_NODE_TYPE("WINDOWAGG");
_outPlanInfo(str, (const Plan *) node);
WRITE_UINT_FIELD(winref);
WRITE_INT_FIELD(partNumCols);
-
- appendStringInfoString(str, " :partColIdx");
- for (i = 0; i < node->partNumCols; i++)
- appendStringInfo(str, " %d", node->partColIdx[i]);
-
- appendStringInfoString(str, " :partOperations");
- for (i = 0; i < node->partNumCols; i++)
- appendStringInfo(str, " %u", node->partOperators[i]);
-
+ WRITE_ATTRNUMBER_ARRAY(partColIdx, node->partNumCols);
+ WRITE_OID_ARRAY(partOperators, node->partNumCols);
WRITE_INT_FIELD(ordNumCols);
-
- appendStringInfoString(str, " :ordColIdx");
- for (i = 0; i < node->ordNumCols; i++)
- appendStringInfo(str, " %d", node->ordColIdx[i]);
-
- appendStringInfoString(str, " :ordOperations");
- for (i = 0; i < node->ordNumCols; i++)
- appendStringInfo(str, " %u", node->ordOperators[i]);
-
+ WRITE_ATTRNUMBER_ARRAY(ordColIdx, node->ordNumCols);
+ WRITE_OID_ARRAY(ordOperators, node->ordNumCols);
WRITE_INT_FIELD(frameOptions);
WRITE_NODE_FIELD(startOffset);
WRITE_NODE_FIELD(endOffset);
static void
_outGroup(StringInfo str, const Group *node)
{
- int i;
-
WRITE_NODE_TYPE("GROUP");
_outPlanInfo(str, (const Plan *) node);
WRITE_INT_FIELD(numCols);
-
- appendStringInfoString(str, " :grpColIdx");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %d", node->grpColIdx[i]);
-
- appendStringInfoString(str, " :grpOperators");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %u", node->grpOperators[i]);
+ WRITE_ATTRNUMBER_ARRAY(grpColIdx, node->numCols);
+ WRITE_OID_ARRAY(grpOperators, node->numCols);
}
static void
static void
_outSort(StringInfo str, const Sort *node)
{
- int i;
-
WRITE_NODE_TYPE("SORT");
_outPlanInfo(str, (const Plan *) node);
WRITE_INT_FIELD(numCols);
-
- appendStringInfoString(str, " :sortColIdx");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %d", node->sortColIdx[i]);
-
- appendStringInfoString(str, " :sortOperators");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %u", node->sortOperators[i]);
-
- appendStringInfoString(str, " :collations");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %u", node->collations[i]);
-
- appendStringInfoString(str, " :nullsFirst");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %s", booltostr(node->nullsFirst[i]));
+ WRITE_ATTRNUMBER_ARRAY(sortColIdx, node->numCols);
+ WRITE_OID_ARRAY(sortOperators, node->numCols);
+ WRITE_OID_ARRAY(collations, node->numCols);
+ WRITE_BOOL_ARRAY(nullsFirst, node->numCols);
}
static void
_outUnique(StringInfo str, const Unique *node)
{
- int i;
-
WRITE_NODE_TYPE("UNIQUE");
_outPlanInfo(str, (const Plan *) node);
WRITE_INT_FIELD(numCols);
-
- appendStringInfoString(str, " :uniqColIdx");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %d", node->uniqColIdx[i]);
-
- appendStringInfoString(str, " :uniqOperators");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %u", node->uniqOperators[i]);
+ WRITE_ATTRNUMBER_ARRAY(uniqColIdx, node->numCols);
+ WRITE_OID_ARRAY(uniqOperators, node->numCols);
}
static void
static void
_outSetOp(StringInfo str, const SetOp *node)
{
- int i;
-
WRITE_NODE_TYPE("SETOP");
_outPlanInfo(str, (const Plan *) node);
WRITE_ENUM_FIELD(cmd, SetOpCmd);
WRITE_ENUM_FIELD(strategy, SetOpStrategy);
WRITE_INT_FIELD(numCols);
-
- appendStringInfoString(str, " :dupColIdx");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %d", node->dupColIdx[i]);
-
- appendStringInfoString(str, " :dupOperators");
- for (i = 0; i < node->numCols; i++)
- appendStringInfo(str, " %u", node->dupOperators[i]);
-
+ WRITE_ATTRNUMBER_ARRAY(dupColIdx, node->numCols);
+ WRITE_OID_ARRAY(dupOperators, node->numCols);
WRITE_INT_FIELD(flagColIdx);
WRITE_INT_FIELD(firstFlag);
WRITE_LONG_FIELD(numGroups);
static void
_outPartitionedRelPruneInfo(StringInfo str, const PartitionedRelPruneInfo *node)
{
- int i;
-
WRITE_NODE_TYPE("PARTITIONEDRELPRUNEINFO");
WRITE_UINT_FIELD(rtindex);
WRITE_BITMAPSET_FIELD(present_parts);
WRITE_INT_FIELD(nparts);
WRITE_INT_FIELD(nexprs);
-
- appendStringInfoString(str, " :subplan_map");
- for (i = 0; i < node->nparts; i++)
- appendStringInfo(str, " %d", node->subplan_map[i]);
-
- appendStringInfoString(str, " :subpart_map");
- for (i = 0; i < node->nparts; i++)
- appendStringInfo(str, " %d", node->subpart_map[i]);
-
- appendStringInfoString(str, " :hasexecparam");
- for (i = 0; i < node->nexprs; i++)
- appendStringInfo(str, " %s", booltostr(node->hasexecparam[i]));
-
+ WRITE_INT_ARRAY(subplan_map, node->nparts);
+ WRITE_INT_ARRAY(subpart_map, node->nparts);
+ WRITE_BOOL_ARRAY(hasexecparam, node->nexprs);
WRITE_BOOL_FIELD(do_initial_prune);
WRITE_BOOL_FIELD(do_exec_prune);
WRITE_BITMAPSET_FIELD(execparamids);
WRITE_UINT_FIELD(con_relid);
WRITE_UINT_FIELD(ref_relid);
WRITE_INT_FIELD(nkeys);
- appendStringInfoString(str, " :conkey");
- for (i = 0; i < node->nkeys; i++)
- appendStringInfo(str, " %d", node->conkey[i]);
- appendStringInfoString(str, " :confkey");
- for (i = 0; i < node->nkeys; i++)
- appendStringInfo(str, " %d", node->confkey[i]);
- appendStringInfoString(str, " :conpfeqop");
- for (i = 0; i < node->nkeys; i++)
- appendStringInfo(str, " %u", node->conpfeqop[i]);
+ WRITE_ATTRNUMBER_ARRAY(conkey, node->nkeys);
+ WRITE_ATTRNUMBER_ARRAY(confkey, node->nkeys);
+ WRITE_OID_ARRAY(conpfeqop, node->nkeys);
WRITE_INT_FIELD(nmatched_ec);
WRITE_INT_FIELD(nmatched_rcols);
WRITE_INT_FIELD(nmatched_ri);
static void
_outForeignKeyCacheInfo(StringInfo str, const ForeignKeyCacheInfo *node)
{
- int i;
-
WRITE_NODE_TYPE("FOREIGNKEYCACHEINFO");
WRITE_OID_FIELD(conoid);
WRITE_OID_FIELD(conrelid);
WRITE_OID_FIELD(confrelid);
WRITE_INT_FIELD(nkeys);
- appendStringInfoString(str, " :conkey");
- for (i = 0; i < node->nkeys; i++)
- appendStringInfo(str, " %d", node->conkey[i]);
- appendStringInfoString(str, " :confkey");
- for (i = 0; i < node->nkeys; i++)
- appendStringInfo(str, " %d", node->confkey[i]);
- appendStringInfoString(str, " :conpfeqop");
- for (i = 0; i < node->nkeys; i++)
- appendStringInfo(str, " %u", node->conpfeqop[i]);
+ WRITE_ATTRNUMBER_ARRAY(conkey, node->nkeys);
+ WRITE_ATTRNUMBER_ARRAY(confkey, node->nkeys);
+ WRITE_OID_ARRAY(conpfeqop, node->nkeys);
}
static void