You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by st...@apache.org on 2023/06/03 12:46:01 UTC
[phoenix] branch 5.1 updated: PHOENIX-6969 Projection bug in hinted uncovered index query with order by
This is an automated email from the ASF dual-hosted git repository.
stoty pushed a commit to branch 5.1
in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/5.1 by this push:
new 2d1562cd5f PHOENIX-6969 Projection bug in hinted uncovered index query with order by
2d1562cd5f is described below
commit 2d1562cd5fcaca803b10189cb2be0100fd3bbabc
Author: Istvan Toth <st...@apache.org>
AuthorDate: Fri Jun 2 12:22:25 2023 +0200
PHOENIX-6969 Projection bug in hinted uncovered index query with order by
---
.../apache/phoenix/schema/IndexDataColumnRef.java | 8 ++-----
.../apache/phoenix/compile/QueryCompilerTest.java | 27 ++++++++++++++++++++++
2 files changed, 29 insertions(+), 6 deletions(-)
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/IndexDataColumnRef.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/IndexDataColumnRef.java
index 3e55b937e1..6b8c0e2952 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/IndexDataColumnRef.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/IndexDataColumnRef.java
@@ -23,7 +23,6 @@ import java.util.Set;
import org.apache.phoenix.compile.FromCompiler;
import org.apache.phoenix.compile.StatementContext;
import org.apache.phoenix.expression.ColumnExpression;
-import org.apache.phoenix.expression.IsNullExpression;
import org.apache.phoenix.expression.ProjectedColumnExpression;
import org.apache.phoenix.parse.ParseNodeFactory;
import org.apache.phoenix.parse.TableName;
@@ -36,6 +35,7 @@ import org.apache.phoenix.util.IndexUtil;
*/
public class IndexDataColumnRef extends ColumnRef {
final private int position;
+ // Despite the final keyword, columns IS mutable, and must not be used for equality/hashCode
final private Set<PColumn> columns;
private static final ParseNodeFactory FACTORY = new ParseNodeFactory();
@@ -76,7 +76,6 @@ public class IndexDataColumnRef extends ColumnRef {
final int prime = 31;
int result = super.hashCode();
result = prime * result + position;
- result = prime * result + ((columns == null) ? 0 : columns.hashCode());
return result;
}
@@ -86,9 +85,6 @@ public class IndexDataColumnRef extends ColumnRef {
return false;
}
IndexDataColumnRef that = (IndexDataColumnRef) o;
- if (position != that.position) {
- return false;
- }
- return columns.equals(that.columns);
+ return position == that.position;
}
}
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
index ba659bdce7..862e989033 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
@@ -6995,4 +6995,31 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
assertEquals(explainExpected, explainPlan);
}
}
+
+ @Test
+ public void testUncoveredPhoenix6969() throws Exception {
+
+ try (Connection conn = DriverManager.getConnection(getUrl());
+ Statement stmt = conn.createStatement()) {
+
+ stmt.execute(
+ "create table dd (k1 integer not null, k2 integer not null, k3 integer not null,"
+ + " k4 integer not null, v1 integer, v2 integer, v3 integer, v4 integer"
+ + " constraint pk primary key (k1,k2,k3,k4))");
+ stmt.execute("create index ii on dd (k4, k1, k2, k3)");
+ String query =
+ "select /*+ index(dd ii) */ k1, k2, k3, k4, v1, v2, v3, v4 from dd"
+ + " where k4=1 and k2=1 order by k1 asc, v1 asc limit 1";
+ ResultSet rs = stmt.executeQuery("EXPLAIN " + query);
+ String explainPlan = QueryUtil.getExplainPlan(rs);
+ //We are more interested in the query compiling than the exact result
+ assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER II [1]\n"
+ + " SERVER MERGE [0.V1, 0.V2, 0.V3, 0.V4]\n"
+ + " SERVER FILTER BY FIRST KEY ONLY AND \"K2\" = 1\n"
+ + " SERVER TOP 1 ROW SORTED BY [\"K1\", \"V1\"]\n"
+ + "CLIENT MERGE SORT\n"
+ + "CLIENT LIMIT 1", explainPlan);
+ }
+ }
+
}