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;
+                    }
+                }
             }
         }
         

Reply via email to