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;