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 69935a909b PHOENIX-6984 Fix fallback to skip-join-merge for hinted
global indexes
69935a909b is described below
commit 69935a909bc4fdffbdc7ea80c725ea18013d502e
Author: Istvan Toth <[email protected]>
AuthorDate: Mon Jun 19 18:08:02 2023 +0200
PHOENIX-6984 Fix fallback to skip-join-merge for hinted global indexes
---
.../apache/phoenix/optimize/QueryOptimizer.java | 8 ++++--
.../apache/phoenix/compile/QueryCompilerTest.java | 30 ++++++++++++++++++++++
2 files changed, 36 insertions(+), 2 deletions(-)
diff --git
a/phoenix-core/src/main/java/org/apache/phoenix/optimize/QueryOptimizer.java
b/phoenix-core/src/main/java/org/apache/phoenix/optimize/QueryOptimizer.java
index 91f5167f24..d2eee0caaf 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/optimize/QueryOptimizer.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/optimize/QueryOptimizer.java
@@ -342,8 +342,8 @@ public class QueryOptimizer {
|| (indexState == PIndexState.PENDING_DISABLE &&
isUnderPendingDisableThreshold(indexTableRef.getCurrentTime(),
indexTable.getIndexDisableTimestamp()))) {
try {
// translate nodes that match expressions that are indexed to
the associated column parse node
- indexSelect = ParseNodeRewriter.rewrite(indexSelect, new
IndexExpressionParseNodeRewriter(index, null, statement.getConnection(),
indexSelect.getUdfParseNodes()));
- QueryCompiler compiler = new QueryCompiler(statement,
indexSelect, resolver, targetColumns, parallelIteratorFactory,
dataPlan.getContext().getSequenceManager(), isProjected, true, dataPlans);
+ SelectStatement rewrittenIndexSelect =
ParseNodeRewriter.rewrite(indexSelect, new
IndexExpressionParseNodeRewriter(index, null, statement.getConnection(),
indexSelect.getUdfParseNodes()));
+ QueryCompiler compiler = new QueryCompiler(statement,
rewrittenIndexSelect, resolver, targetColumns, parallelIteratorFactory,
dataPlan.getContext().getSequenceManager(), isProjected, true, dataPlans);
QueryPlan plan = compiler.compile();
@@ -369,6 +369,10 @@ public class QueryOptimizer {
* otherwise we just don't use this index (as opposed to
trying to join back from
* the index table to the data table.
*/
+ // Reset the state changes from the attempt above
+ indexTableRef.setHinted(false);
+ dataPlan.getContext().setUncoveredIndex(false);
+
SelectStatement dataSelect =
(SelectStatement)dataPlan.getStatement();
ParseNode where = dataSelect.getWhere();
if (isHinted && where != null) {
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 862e989033..7d6a9ec3f4 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
@@ -7022,4 +7022,34 @@ public class QueryCompilerTest extends
BaseConnectionlessQueryTest {
}
}
+ @Test
+ public void testUncoveredPhoenix6984() throws Exception {
+ // This only triggers with PHOENIX-6959
+ try (Connection conn = DriverManager.getConnection(getUrl());
+ Statement stmt = conn.createStatement()) {
+ stmt.execute("CREATE TABLE D (\n" + "K1 CHAR(6) NOT NULL,\n"
+ + "K2 VARCHAR(22) NOT NULL,\n" + "K3 CHAR(2) NOT NULL,\n"
+ + "K4 VARCHAR(36) NOT NULL,\n" + "V1 TIMESTAMP,\n" + "V2
TIMESTAMP,\n"
+ + "CONSTRAINT PK_BILLING_ORDER PRIMARY KEY
(K1,K2,K3,K4))");
+
+ stmt.execute("CREATE INDEX I ON D(K2, K1, K3, K4)");
+ String query =
+ "SELECT /*+ INDEX(D I) */ * " + "FROM D " + "WHERE " + "K2
= 'XXX' AND "
+ + "V2 >= TIMESTAMP '2023-05-31 23:59:59.000' AND "
+ + "V1 <= TIMESTAMP '2023-04-01 00:00:00.000' " +
"ORDER BY V2 asc";
+ ResultSet rs = stmt.executeQuery("EXPLAIN " + query);
+ String explainPlan = QueryUtil.getExplainPlan(rs);
+ assertEquals("CLIENT PARALLEL 1-WAY FULL SCAN OVER D\n"
+ + " SERVER FILTER BY (V2 >= TIMESTAMP '2023-05-31
23:59:59.000'"
+ + " AND V1 <= TIMESTAMP '2023-04-01 00:00:00.000')\n"
+ + " SERVER SORTED BY [D.V2]\n" + "CLIENT MERGE SORT\n"
+ + " SKIP-SCAN-JOIN TABLE 0\n"
+ + " CLIENT PARALLEL 1-WAY RANGE SCAN OVER I
['XXX']\n"
+ + " SERVER FILTER BY FIRST KEY ONLY\n"
+ + " DYNAMIC SERVER FILTER BY (\"D.K1\", \"D.K2\",
\"D.K3\", \"D.K4\")"
+ + " IN (($3.$5, $3.$6, $3.$7, $3.$8))",
+ explainPlan);
+ }
+ }
+
}