Skip to content

Commit 4a4ace8

Browse files
apurtellclaude
andauthored
PHOENIX-7927 Fix EXPLAIN plumbing related NPE in DelegateQueryPlan.setOptimizerDecision (#2532)
Co-authored-by: Claude Opus 4.8[1m] <noreply@anthropic.com>
1 parent 114f3f9 commit 4a4ace8

1 file changed

Lines changed: 10 additions & 2 deletions

File tree

phoenix-core-client/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@
3939

4040
public abstract class DelegateQueryPlan implements QueryPlan {
4141
protected final QueryPlan delegate;
42+
// Fallback storage for the optimizer decision used only when this plan has no delegate to
43+
// forward to. Some DelegateQueryPlan subclasses intentionally pass a null delegate and override
44+
// getContext()/getTableRef()/getProjector() to serve from local state.
45+
private OptimizerDecision optimizerDecision;
4246

4347
public DelegateQueryPlan(QueryPlan delegate) {
4448
this.delegate = delegate;
@@ -175,11 +179,15 @@ public boolean isApplicable() {
175179

176180
@Override
177181
public OptimizerDecision getOptimizerDecision() {
178-
return delegate.getOptimizerDecision();
182+
return delegate != null ? delegate.getOptimizerDecision() : optimizerDecision;
179183
}
180184

181185
@Override
182186
public void setOptimizerDecision(OptimizerDecision decision) {
183-
delegate.setOptimizerDecision(decision);
187+
if (delegate != null) {
188+
delegate.setOptimizerDecision(decision);
189+
} else {
190+
this.optimizerDecision = decision;
191+
}
184192
}
185193
}

0 commit comments

Comments
 (0)