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;