explain-fully-pruned-append-mergeappend.patch
text/plain
Filename: explain-fully-pruned-append-mergeappend.patch
Type: text/plain
Part: 0
Message:
Re: Runtime pruning problem
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/commands/explain.c | 19 | 8 |
| src/backend/executor/nodeAppend.c | 0 | 1 |
| src/include/nodes/execnodes.h | 3 | 0 |
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index a6c6de78f1..5a494fd4b6 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -1981,16 +1981,27 @@ ExplainNode(PlanState *planstate, List *ancestors,
ancestors, es);
break;
case T_Append:
- ExplainMemberNodes(((AppendState *) planstate)->appendplans,
- ((AppendState *) planstate)->as_nplans,
- list_length(((Append *) plan)->appendplans),
- ancestors, es);
+ {
+ AppendState *astate = (AppendState *) planstate;
+ /* Runtime pruning may have pruned all partitions. */
+ int nsubnodes = astate->as_whichplan == NO_MATCHING_SUBPLANS ?
+ 0 : astate->as_nplans;
+
+ ExplainMemberNodes(astate->appendplans, nsubnodes,
+ list_length(((Append *) plan)->appendplans),
+ ancestors, es);
+ }
break;
case T_MergeAppend:
- ExplainMemberNodes(((MergeAppendState *) planstate)->mergeplans,
- ((MergeAppendState *) planstate)->ms_nplans,
- list_length(((MergeAppend *) plan)->mergeplans),
- ancestors, es);
+ {
+ MergeAppendState *mastate = (MergeAppendState *) planstate;
+ /* Runtime pruning may have pruned all partitions. */
+ int nsubnodes = mastate->ms_noopscan ? 0 : mastate->ms_nplans;
+
+ ExplainMemberNodes(mastate->mergeplans, nsubnodes,
+ list_length(((MergeAppend *) plan)->mergeplans),
+ ancestors, es);
+ }
break;
case T_BitmapAnd:
ExplainMemberNodes(((BitmapAndState *) planstate)->bitmapplans,
diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c
index f3be2429db..c12f5161e7 100644
--- a/src/backend/executor/nodeAppend.c
+++ b/src/backend/executor/nodeAppend.c
@@ -78,7 +78,6 @@ struct ParallelAppendState
};
#define INVALID_SUBPLAN_INDEX -1
-#define NO_MATCHING_SUBPLANS -2
static TupleTableSlot *ExecAppend(PlanState *pstate);
static bool choose_next_subplan_locally(AppendState *node);
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index a5e4b7ef2e..40e019b395 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -1155,6 +1155,9 @@ typedef struct ModifyTableState
* ----------------
*/
+/* Exported for explain.c to use. */
+#define NO_MATCHING_SUBPLANS -2
+
struct AppendState;
typedef struct AppendState AppendState;
struct ParallelAppendState;