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 b731cd6dca PHOENIX-6959 Server merges are not used for hinted
uncovered indexes for wildcard selects on 5.1
b731cd6dca is described below
commit b731cd6dca3892ae026ee6811c41d39544e76bab
Author: Istvan Toth <[email protected]>
AuthorDate: Mon Jun 19 07:57:08 2023 +0200
PHOENIX-6959 Server merges are not used for hinted uncovered indexes for
wildcard selects on 5.1
---
.../end2end/index/GlobalIndexOptimizationIT.java | 43 ++++++++++------------
.../apache/phoenix/compile/ProjectionCompiler.java | 14 +++++--
2 files changed, 31 insertions(+), 26 deletions(-)
diff --git
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalIndexOptimizationIT.java
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalIndexOptimizationIT.java
index 7df45185f0..de506a775a 100644
---
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalIndexOptimizationIT.java
+++
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/GlobalIndexOptimizationIT.java
@@ -155,14 +155,13 @@ public class GlobalIndexOptimizationIT extends
ParallelStatsDisabledIT {
- String expected =
- "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + dataTableName +
"\n" +
- " SKIP-SCAN-JOIN TABLE 0\n" +
- " CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +
indexTableName + " \\['a'\\]\n" +
- " SERVER FILTER BY FIRST KEY ONLY\n" +
- " DYNAMIC SERVER FILTER BY \\(\"" + dataTableName +
".T_ID\", \"" + dataTableName + ".K1\", \"" + dataTableName + ".K2\"\\) IN
\\(\\(\\$\\d+.\\$\\d+, \\$\\d+.\\$\\d+, \\$\\d+.\\$\\d+\\)\\)";
+ String expected =
+ "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + indexTableName
+ " ['a']\n" +
+ " SERVER MERGE [0.K3]\n" +
+ " SERVER FILTER BY FIRST KEY ONLY";
String actual = QueryUtil.getExplainPlan(rs);
- assertTrue("Expected:\n" + expected + "\nbut got\n" + actual,
Pattern.matches(expected, actual));
+ assertTrue("Expected:\n" + expected + "\nbut got\n" + actual,
+ actual.equals(expected));
rs = conn1.createStatement().executeQuery(query);
assertTrue(rs.next());
@@ -180,14 +179,13 @@ public class GlobalIndexOptimizationIT extends
ParallelStatsDisabledIT {
query = "SELECT /*+ INDEX(" + dataTableName + " " + indexTableName
+ ")*/ * FROM " + dataTableName +" where v1='a'";
rs = conn1.createStatement().executeQuery("EXPLAIN "+ query);
- expected =
- "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + dataTableName +
"\n" +
- " SKIP-SCAN-JOIN TABLE 0\n" +
- " CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +
indexTableName + " \\['a'\\]\n" +
- " SERVER FILTER BY FIRST KEY ONLY\n" +
- " DYNAMIC SERVER FILTER BY \\(\"" + dataTableName +
".T_ID\", \"" + dataTableName + ".K1\", \"" + dataTableName + ".K2\"\\) IN
\\(\\(\\$\\d+.\\$\\d+, \\$\\d+.\\$\\d+, \\$\\d+.\\$\\d+\\)\\)";
+ expected =
+ "CLIENT PARALLEL 1-WAY RANGE SCAN OVER " + indexTableName
+ " ['a']\n" +
+ " SERVER MERGE [0.K3]\n" +
+ " SERVER FILTER BY FIRST KEY ONLY";
actual = QueryUtil.getExplainPlan(rs);
- assertTrue("Expected:\n" + expected + "\nbut got\n" + actual,
Pattern.matches(expected, actual));
+ assertTrue("Expected:\n" + expected + "\nbut got\n" + actual,
+ actual.equals(expected));
rs = conn1.createStatement().executeQuery(query);
assertTrue(rs.next());
@@ -207,16 +205,15 @@ public class GlobalIndexOptimizationIT extends
ParallelStatsDisabledIT {
query = "SELECT /*+ INDEX(" + dataTableName + " " + indexTableName
+ ")*/ * FROM " + dataTableName +" where v1='a' limit 1";
rs = conn1.createStatement().executeQuery("EXPLAIN "+ query);
- expected =
- "CLIENT PARALLEL 1-WAY FULL SCAN OVER " + dataTableName +
"\n" +
- "CLIENT 1 ROW LIMIT\n" +
- " SKIP-SCAN-JOIN TABLE 0\n" +
- " CLIENT PARALLEL 1-WAY RANGE SCAN OVER " +
indexTableName + " \\['a'\\]\n" +
- " SERVER FILTER BY FIRST KEY ONLY\n" +
- " DYNAMIC SERVER FILTER BY \\(\"" + dataTableName +
".T_ID\", \"" + dataTableName + ".K1\", \"" + dataTableName + ".K2\"\\) IN
\\(\\(\\$\\d+.\\$\\d+, \\$\\d+.\\$\\d+, \\$\\d+.\\$\\d+\\)\\)\n" +
- " JOIN-SCANNER 1 ROW LIMIT";
+ expected =
+ "CLIENT SERIAL 1-WAY RANGE SCAN OVER " + indexTableName +
" ['a']\n" +
+ " SERVER MERGE [0.K3]\n" +
+ " SERVER FILTER BY FIRST KEY ONLY\n" +
+ " SERVER 1 ROW LIMIT\n" +
+ "CLIENT 1 ROW LIMIT";
actual = QueryUtil.getExplainPlan(rs);
- assertTrue("Expected:\n" + expected + "\nbut got\n" + actual,
Pattern.matches(expected, actual));
+ assertTrue("Expected:\n" + expected + "\nbut got\n" + actual,
+ actual.equals(expected));
rs = conn1.createStatement().executeQuery(query);
assertTrue(rs.next());
diff --git
a/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java
b/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java
index f36f605c55..43e66ea5cf 100644
---
a/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java
+++
b/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java
@@ -208,7 +208,7 @@ public class ProjectionCompiler {
int tableOffset = dataTable.getBucketNum() == null ? 0 : 1;
int minTablePKOffset = getMinPKOffset(dataTable, tenantId);
int minIndexPKOffset = getMinPKOffset(index, tenantId);
- if (index.getIndexType() != IndexType.LOCAL) {
+ if (index.getIndexType() != IndexType.LOCAL &&
!isHintedGlobalIndex(tableRef)) {
if (index.getColumns().size()-minIndexPKOffset !=
dataTable.getColumns().size()-minTablePKOffset) {
// We'll end up not using this by the optimizer, so just throw
String schemaNameStr =
dataTable.getSchemaName()==null?null:dataTable.getSchemaName().getString();
@@ -246,7 +246,7 @@ public class ProjectionCompiler {
}
String colName = tableColumn.getName().getString();
String tableAlias = tableRef.getTableAlias();
- if (resolveColumn) {
+ if (resolveColumn && !(ref instanceof IndexDataColumnRef)) {
try {
if (tableAlias != null) {
ref = resolver.resolveColumn(null, tableAlias,
indexColName);
@@ -505,7 +505,15 @@ public class ProjectionCompiler {
} else {
isProjectEmptyKeyValue = where == null ||
LiteralExpression.isTrue(where) || where.requiresFinalEvaluation();
for (byte[] family : projectedFamilies) {
- projectColumnFamily(table, scan, family);
+ try {
+ if (table.getColumnFamily(family) != null) {
+ projectColumnFamily(table, scan, family);
+ }
+ } catch (ColumnFamilyNotFoundException e) {
+ if (!(tableRef.getTable().getIndexType() ==
IndexType.LOCAL || isHintedGlobalIndex(tableRef))) {
+ throw e;
+ }
+ }
}
}