This is an automated email from the ASF dual-hosted git repository. larsh pushed a commit to branch 4.x in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/4.x by this push: new 410f738 PHOENIX-6421 Selecting an indexed array value from an uncovered column with local index returns NULL. 410f738 is described below commit 410f738f6f3824feb7fec5b5486b2993be15a5ef Author: Lars <la...@apache.org> AuthorDate: Fri Mar 19 19:00:17 2021 -0700 PHOENIX-6421 Selecting an indexed array value from an uncovered column with local index returns NULL. --- .../apache/phoenix/end2end/index/LocalIndexIT.java | 30 ++++++++++++++++++++++ .../apache/phoenix/compile/ProjectionCompiler.java | 6 +++++ .../phoenix/iterate/RegionScannerFactory.java | 18 +++++-------- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java index 9f79107..2910322 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java @@ -83,6 +83,36 @@ public class LocalIndexIT extends BaseLocalIndexIT { } @Test + public void testSelectFromIndexWithUncoveredArrayIndex() throws Exception { + if (isNamespaceMapped) { + return; + } + String tableName = schemaName + "." + generateUniqueName(); + String indexName = "IDX_" + generateUniqueName(); + + Connection conn = getConnection(); + conn.setAutoCommit(true); + + conn.createStatement().execute("CREATE TABLE " + tableName + " (pk INTEGER PRIMARY KEY, v1 FLOAT, v2 FLOAT[])"); + conn.createStatement().execute("UPSERT INTO " + tableName + " VALUES(1, 2, ARRAY[3,4])"); + + conn.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v1)"); + + ResultSet rs = conn.createStatement().executeQuery("SELECT v2[1] FROM "+tableName+" WHERE v1 < 3"); + rs.next(); + assertEquals(3, rs.getInt(1)); + rs.close(); + + conn.createStatement().execute("DROP INDEX " + indexName + " ON " + tableName); + conn.createStatement().execute("CREATE LOCAL INDEX " + indexName + " ON " + tableName + "(v2[2])"); + + rs = conn.createStatement().executeQuery("SELECT v2[1] FROM "+tableName+" WHERE v2[2] < 5"); + rs.next(); + assertEquals(3, rs.getInt(1)); + rs.close(); + } + + @Test public void testSelectFromIndexWithAdditionalWhereClause() throws Exception { if (isNamespaceMapped) { return; 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 799b667..13ca41b 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 @@ -81,6 +81,7 @@ import org.apache.phoenix.schema.PTable.ImmutableStorageScheme; import org.apache.phoenix.schema.PTable.IndexType; import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.schema.PTableType; +import org.apache.phoenix.schema.ProjectedColumn; import org.apache.phoenix.schema.RowKeySchema; import org.apache.phoenix.schema.TableNotFoundException; import org.apache.phoenix.schema.TableRef; @@ -699,6 +700,11 @@ public class ProjectionCompiler { if (expression.getDataType().isArrayType()) { indexProjectedColumns.add(expression); PColumn col = expression.getColumn(); + // hack'ish... For covered columns with local indexes we defer to the server. + if (col instanceof ProjectedColumn && ((ProjectedColumn) col) + .getSourceColumnRef() instanceof LocalIndexDataColumnRef) { + return null; + } PTable table = context.getCurrentTable().getTable(); KeyValueColumnExpression keyValueColumnExpression; if (table.getImmutableStorageScheme() != ImmutableStorageScheme.ONE_CELL_PER_COLUMN) { diff --git a/phoenix-core/src/main/java/org/apache/phoenix/iterate/RegionScannerFactory.java b/phoenix-core/src/main/java/org/apache/phoenix/iterate/RegionScannerFactory.java index 414f294..2dd37a8 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/iterate/RegionScannerFactory.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/iterate/RegionScannerFactory.java @@ -214,18 +214,13 @@ public abstract class RegionScannerFactory { if (isDummy(result)) { return true; } - Cell arrayElementCell = null; if (result.size() == 0) { return next; } - if (arrayFuncRefs != null && arrayFuncRefs.length > 0 && arrayKVRefs.size() > 0) { - int arrayElementCellPosition = replaceArrayIndexElement(arrayKVRefs, arrayFuncRefs, result); - arrayElementCell = result.get(arrayElementCellPosition); - } if (ScanUtil.isLocalIndex(scan) && !ScanUtil.isAnalyzeTable(scan)) { if(actualStartKey!=null) { next = scanTillScanStartRow(s, arrayKVRefs, arrayFuncRefs, result, - null, arrayElementCell); + null); if (result.isEmpty() || isDummy(result)) { return next; } @@ -248,6 +243,11 @@ public abstract class RegionScannerFactory { } } } + Cell arrayElementCell = null; + if (arrayFuncRefs != null && arrayFuncRefs.length > 0 && arrayKVRefs.size() > 0) { + int arrayElementCellPosition = replaceArrayIndexElement(arrayKVRefs, arrayFuncRefs, result); + arrayElementCell = result.get(arrayElementCellPosition); + } if (projector != null) { Tuple toProject = useQualifierAsListIndex ? new PositionBasedResultTuple(result) : new ResultTuple(Result.create(result)); @@ -345,7 +345,7 @@ public abstract class RegionScannerFactory { private boolean scanTillScanStartRow(final RegionScanner s, final Set<KeyValueColumnExpression> arrayKVRefs, final Expression[] arrayFuncRefs, List<Cell> result, - ScannerContext scannerContext, Cell arrayElementCell) throws IOException { + ScannerContext scannerContext) throws IOException { boolean next = true; Cell firstCell = result.get(0); long startTime = EnvironmentEdgeManager.currentTimeMillis(); @@ -369,10 +369,6 @@ public abstract class RegionScannerFactory { if (isDummy(result)) { return true; } - if (arrayFuncRefs != null && arrayFuncRefs.length > 0 && arrayKVRefs.size() > 0) { - int arrayElementCellPosition = replaceArrayIndexElement(arrayKVRefs, arrayFuncRefs, result); - arrayElementCell = result.get(arrayElementCellPosition); - } firstCell = result.get(0); } return next;