[
https://issues.apache.org/jira/browse/PHOENIX-3152?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15410694#comment-15410694
]
James Taylor commented on PHOENIX-3152:
---------------------------------------
Here's a test that I dropped in QueryOptimizerTest that creates 100 local
indexes, so I'm not sure how to repro:
{code}
@Test
public void testManyLocalIndexes() throws Exception {
Connection conn = DriverManager.getConnection(getUrl());
conn.createStatement().execute("CREATE TABLE T (k VARCHAR NOT NULL
PRIMARY KEY, v1 CHAR(15), v2 VARCHAR)");
for (int i=0; i < 100; i++) {
conn.createStatement().execute("CREATE LOCAL INDEX IDX" + i + " ON
T(v1, v2)");
}
PhoenixStatement stmt =
conn.createStatement().unwrap(PhoenixStatement.class);
String query = "select * from t where (v1, v2, k) > ('1', '2', '3')";
QueryPlan plan = stmt.optimizeQuery(query);
assertEquals("IDX0",
plan.getTableRef().getTable().getTableName().getString());
}
{code}
> 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)