[ 
https://issues.apache.org/jira/browse/PHOENIX-7772?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Palash Chauhan updated PHOENIX-7772:
------------------------------------
    Description: 
SegmentInfoPlan passes null as QueryPlan delegate in its constructor. 
{code:java}
public SegmentInfoPlan(StatementContext context, FilterableStatement statement, 
TableRef tableRef,
  RowProjector projector, Integer totalSegmentsValue) {
  super(context, statement, tableRef, projector, null, null, null, 
OrderBy.EMPTY_ORDER_BY, null);
  this.totalSegmentsValue = totalSegmentsValue;
  this.sourceTables = ImmutableSet.of(tableRef);
} {code}
During TOTAL_SEGMENTS query, in QueryOptimizer when there is an index on the 
table, `dataPlan.isDegenerate()` is called
{code:java}
if (
  dataPlan.isApplicable() && (indexes.isEmpty() || dataPlan.isDegenerate()
    || dataPlan.getTableRef().hasDynamicCols() || 
select.getHint().hasHint(Hint.NO_INDEX))
) {
  return Collections.<QueryPlan> singletonList(dataPlan);
} {code}
SegmentInfoPlan -> ClientProcessingPlan -> DelegateQueryPlan
{code:java}
@Override
public boolean isDegenerate() {
  return delegate.isDegenerate();
} {code}
delegate is null which leads to NPE. 

We need to override isDegenerate and return true so that optimizer can choose 
this plan over any index plan and return early if the table has indexes.

  was:
SegmentInfoPlan passes null as QueryPlan delegate in its constructor. 
{code:java}
public SegmentInfoPlan(StatementContext context, FilterableStatement statement, 
TableRef tableRef,
  RowProjector projector, Integer totalSegmentsValue) {
  super(context, statement, tableRef, projector, null, null, null, 
OrderBy.EMPTY_ORDER_BY, null);
  this.totalSegmentsValue = totalSegmentsValue;
  this.sourceTables = ImmutableSet.of(tableRef);
} {code}
During TOTAL_SEGMENTS query, in QueryOptimizer when there is an index on the 
table, `dataPlan.isDegenerate()` is called
{code:java}
if (
  dataPlan.isApplicable() && (indexes.isEmpty() || dataPlan.isDegenerate()
    || dataPlan.getTableRef().hasDynamicCols() || 
select.getHint().hasHint(Hint.NO_INDEX))
) {
  return Collections.<QueryPlan> singletonList(dataPlan);
} {code}
SegmentInfoPlan -> ClientProcessingPlan -> DelegateQueryPlan
{code:java}
@Override
public boolean isDegenerate() {
  return delegate.isDegenerate();
} {code}
delegate is null which leads to NPE. 

We need to override isDegenerate and return true so that optimizer can choose 
this plan over any index plan and return early if the table has indexes.

. 


> TOTAL_SEGMENTS query leads to NPE when table has index 
> -------------------------------------------------------
>
>                 Key: PHOENIX-7772
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-7772
>             Project: Phoenix
>          Issue Type: Bug
>    Affects Versions: 5.3.0
>            Reporter: Palash Chauhan
>            Assignee: Palash Chauhan
>            Priority: Major
>             Fix For: 5.4.0, 5.3.1
>
>
> SegmentInfoPlan passes null as QueryPlan delegate in its constructor. 
> {code:java}
> public SegmentInfoPlan(StatementContext context, FilterableStatement 
> statement, TableRef tableRef,
>   RowProjector projector, Integer totalSegmentsValue) {
>   super(context, statement, tableRef, projector, null, null, null, 
> OrderBy.EMPTY_ORDER_BY, null);
>   this.totalSegmentsValue = totalSegmentsValue;
>   this.sourceTables = ImmutableSet.of(tableRef);
> } {code}
> During TOTAL_SEGMENTS query, in QueryOptimizer when there is an index on the 
> table, `dataPlan.isDegenerate()` is called
> {code:java}
> if (
>   dataPlan.isApplicable() && (indexes.isEmpty() || dataPlan.isDegenerate()
>     || dataPlan.getTableRef().hasDynamicCols() || 
> select.getHint().hasHint(Hint.NO_INDEX))
> ) {
>   return Collections.<QueryPlan> singletonList(dataPlan);
> } {code}
> SegmentInfoPlan -> ClientProcessingPlan -> DelegateQueryPlan
> {code:java}
> @Override
> public boolean isDegenerate() {
>   return delegate.isDegenerate();
> } {code}
> delegate is null which leads to NPE. 
> We need to override isDegenerate and return true so that optimizer can choose 
> this plan over any index plan and return early if the table has indexes.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to