This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch PHOENIX-7876-feature in repository https://gitbox.apache.org/repos/asf/phoenix.git
commit 394e7ae0c3bfe42c7b1322483a79e6f2d6c4c200 Author: Andrew Purtell <[email protected]> AuthorDate: Wed Jun 24 17:34:17 2026 -0700 PHOENIX-7935 Propagate requested EXPLAIN options to nested plan contexts (#2544) Co-authored-by: Claude Opus 4.8[1m] <[email protected]> --- .../main/java/org/apache/phoenix/execute/ClientAggregatePlan.java | 3 +++ .../src/main/java/org/apache/phoenix/execute/ClientScanPlan.java | 3 +++ .../src/main/java/org/apache/phoenix/execute/HashJoinPlan.java | 5 +++++ .../main/java/org/apache/phoenix/execute/SortMergeJoinPlan.java | 4 ++++ .../main/java/org/apache/phoenix/execute/TupleProjectionPlan.java | 7 +++++++ .../src/main/java/org/apache/phoenix/execute/UnionPlan.java | 5 +++++ 6 files changed, 27 insertions(+) diff --git a/phoenix-core-client/src/main/java/org/apache/phoenix/execute/ClientAggregatePlan.java b/phoenix-core-client/src/main/java/org/apache/phoenix/execute/ClientAggregatePlan.java index b6b3e69219..aef8ca24ab 100644 --- a/phoenix-core-client/src/main/java/org/apache/phoenix/execute/ClientAggregatePlan.java +++ b/phoenix-core-client/src/main/java/org/apache/phoenix/execute/ClientAggregatePlan.java @@ -223,6 +223,9 @@ public class ClientAggregatePlan extends ClientProcessingPlan { @Override public ExplainPlan getExplainPlan() throws SQLException { + // Carry the requested EXPLAIN options down to the delegate so every participating scan renders + // the same disclosures (e.g. VERBOSE predicate-origin attribution) as the driver scan. + delegate.getContext().setExplainOptions(context.getExplainOptions()); ExplainPlan explainPlan = delegate.getExplainPlan(); List<String> planSteps = Lists.newArrayList(explainPlan.getPlanSteps()); ExplainPlanAttributes explainPlanAttributes = explainPlan.getPlanStepsAsAttributes(); diff --git a/phoenix-core-client/src/main/java/org/apache/phoenix/execute/ClientScanPlan.java b/phoenix-core-client/src/main/java/org/apache/phoenix/execute/ClientScanPlan.java index 895853ee6a..06ea050f5f 100644 --- a/phoenix-core-client/src/main/java/org/apache/phoenix/execute/ClientScanPlan.java +++ b/phoenix-core-client/src/main/java/org/apache/phoenix/execute/ClientScanPlan.java @@ -119,6 +119,9 @@ public class ClientScanPlan extends ClientProcessingPlan { @Override public ExplainPlan getExplainPlan() throws SQLException { + // Carry the requested EXPLAIN options down to the delegate so every participating scan renders + // the same disclosures (e.g. VERBOSE predicate-origin attribution) as the driver scan. + delegate.getContext().setExplainOptions(context.getExplainOptions()); ExplainPlan explainPlan = delegate.getExplainPlan(); List<String> currentPlanSteps = explainPlan.getPlanSteps(); ExplainPlanAttributes explainPlanAttributes = explainPlan.getPlanStepsAsAttributes(); diff --git a/phoenix-core-client/src/main/java/org/apache/phoenix/execute/HashJoinPlan.java b/phoenix-core-client/src/main/java/org/apache/phoenix/execute/HashJoinPlan.java index 7732d4d6e7..c48b67276a 100644 --- a/phoenix-core-client/src/main/java/org/apache/phoenix/execute/HashJoinPlan.java +++ b/phoenix-core-client/src/main/java/org/apache/phoenix/execute/HashJoinPlan.java @@ -330,6 +330,11 @@ public class HashJoinPlan extends DelegateQueryPlan { ExplainPlanAttributesBuilder builder = new ExplainPlanAttributesBuilder(delegateAttributes); List<ExplainPlanAttributes> subPlanAttributes = Lists.newArrayList(); int count = subPlans.length; + // Carry the requested EXPLAIN options down to each sub-plan so every participating scan renders + // the same disclosures (e.g. VERBOSE predicate-origin attribution) as the driver scan. + for (int i = 0; i < count; i++) { + subPlans[i].getInnerPlan().getContext().setExplainOptions(getContext().getExplainOptions()); + } for (int i = 0; i < count; i++) { planSteps.addAll(subPlans[i].getPreSteps(this)); ExplainPlanAttributes subPlanAttribute = subPlans[i].getPreStepsAsAttributes(this); diff --git a/phoenix-core-client/src/main/java/org/apache/phoenix/execute/SortMergeJoinPlan.java b/phoenix-core-client/src/main/java/org/apache/phoenix/execute/SortMergeJoinPlan.java index 3c769cf7bb..f0ae604516 100644 --- a/phoenix-core-client/src/main/java/org/apache/phoenix/execute/SortMergeJoinPlan.java +++ b/phoenix-core-client/src/main/java/org/apache/phoenix/execute/SortMergeJoinPlan.java @@ -193,6 +193,10 @@ public class SortMergeJoinPlan implements QueryPlan { List<String> steps = Lists.newArrayList(); steps .add("SORT-MERGE-JOIN (" + joinType.toString().toUpperCase() + ") TABLES /* SORT_MERGE */"); + // Carry the requested EXPLAIN options down to both join halves so every participating scan + // renders the same disclosures (e.g. VERBOSE predicate-origin attribution) as the driver scan. + lhsPlan.getContext().setExplainOptions(getContext().getExplainOptions()); + rhsPlan.getContext().setExplainOptions(getContext().getExplainOptions()); ExplainPlan lhsExplainPlan = lhsPlan.getExplainPlan(); List<String> lhsPlanSteps = lhsExplainPlan.getPlanSteps(); ExplainPlanAttributes lhsPlanAttributes = lhsExplainPlan.getPlanStepsAsAttributes(); diff --git a/phoenix-core-client/src/main/java/org/apache/phoenix/execute/TupleProjectionPlan.java b/phoenix-core-client/src/main/java/org/apache/phoenix/execute/TupleProjectionPlan.java index bc2e1b200f..43e565b64a 100644 --- a/phoenix-core-client/src/main/java/org/apache/phoenix/execute/TupleProjectionPlan.java +++ b/phoenix-core-client/src/main/java/org/apache/phoenix/execute/TupleProjectionPlan.java @@ -147,6 +147,13 @@ public class TupleProjectionPlan extends DelegateQueryPlan { @Override public ExplainPlan getExplainPlan() throws SQLException { + // getContext() is the delegate's context (already carrying the requested EXPLAIN options). + // Carry those same options onto the separate post-filter context so this plan's CLIENT FILTER + // BY + // renders the same disclosures (e.g. VERBOSE predicate-origin attribution) as the driver scan. + if (statementContext != null) { + statementContext.setExplainOptions(getContext().getExplainOptions()); + } ExplainPlan explainPlan = delegate.getExplainPlan(); List<String> planSteps = Lists.newArrayList(explainPlan.getPlanSteps()); ExplainPlanAttributes explainPlanAttributes = explainPlan.getPlanStepsAsAttributes(); diff --git a/phoenix-core-client/src/main/java/org/apache/phoenix/execute/UnionPlan.java b/phoenix-core-client/src/main/java/org/apache/phoenix/execute/UnionPlan.java index 0ff5496839..2350bfdd53 100644 --- a/phoenix-core-client/src/main/java/org/apache/phoenix/execute/UnionPlan.java +++ b/phoenix-core-client/src/main/java/org/apache/phoenix/execute/UnionPlan.java @@ -239,6 +239,11 @@ public class UnionPlan implements QueryPlan { String abstractExplainPlan = "UNION ALL OVER " + this.plans.size() + " QUERIES"; builder.setAbstractExplainPlan(abstractExplainPlan); steps.add(abstractExplainPlan); + // Carry the requested EXPLAIN options down to each branch so every participating scan renders + // the same disclosures (e.g. VERBOSE predicate-origin attribution) as the driver scan. + for (QueryPlan plan : plans) { + plan.getContext().setExplainOptions(getContext().getExplainOptions()); + } // Compose each branch from its own getExplainPlan() so the full sub-plan structure of every // branch is preserved and explaining the union does not trigger sub-plan execution. UnionResultIterators.explainBranches(plans, steps, builder);
