Sergey Soldatov created PHOENIX-3152:
----------------------------------------

             Summary: Incorrect comparator in QueryOptimizer may cause 
IllegalArgumentException
                 Key: PHOENIX-3152
                 URL: https://issues.apache.org/jira/browse/PHOENIX-3152
             Project: Phoenix
          Issue Type: Bug
    Affects Versions: 4.8.0
            Reporter: Sergey Soldatov


The problem code is in QueryOptimizer#orderPlansBestToWorst
When we have a lot of local similar indexes, all of them comes to the array of 
best candidates. After that we try to sort them using our own Comparator. In 
the compare we check first:
1. bound pk columns count
2. groupBy order
3. number of columns
for two local indexes on different columns first 3 steps always passed (since 
they are equal)
And now we execute the following checks:
{noformat}
                // If all things are equal, don't choose local index as it 
forces scan
                // on every region (unless there's no start/stop key)
                if (table1.getIndexType() == IndexType.LOCAL) {
                    return 
plan1.getContext().getScanRanges().getRanges().isEmpty() ? -1 : 1;
                }
                if (table2.getIndexType() == IndexType.LOCAL) {
                    return 
plan2.getContext().getScanRanges().getRanges().isEmpty() ? 1 : -1;
                }

{noformat}
obvious that for similar two plans with similar scan ranges  {{compare (plan1, 
plan2)}} and {{compare(plan2, plan1)}} will return the same result (1 if ranges 
are not empty, -1 otherwise). This may cause following exception from 
{{Collections.sort}} :
{noformat}
        at java.util.TimSort.mergeLo(TimSort.java:777)
        at java.util.TimSort.mergeAt(TimSort.java:514)Listening for transport   
at java.util.TimSort.mergeCollapse(TimSort.java:441)
        at java.util.TimSort.sort(TimSort.java:245)
        at java.util.Arrays.sort(Arrays.java:1512)
        at java.util.ArrayList.sort(ArrayList.java:1454)
        at java.util.Collections.sort(Collections.java:175)
{noformat} 

I would suggest to add a check that if both plans are local indexes, then 
consider them equal, otherwise execute the check. [~jamestaylor], [~ram_krish] 
any thoughts?

[[email protected]] FYI



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to