This is an automated email from the ASF dual-hosted git repository. apurtell pushed a commit to branch PHOENIX-7562-feature in repository https://gitbox.apache.org/repos/asf/phoenix.git
commit fe3c170a0b660f226a9f62bc9c5529873ddace6f Author: Palash Chauhan <palashc...@gmail.com> AuthorDate: Mon May 19 13:49:11 2025 -0700 PHOENIX-7599: Fix count of rows scanned metric for uncovered indexes (#2139) Co-authored-by: Palash Chauhan <p.chau...@pchauha-ltmgv47.internal.salesforce.com> --- .../coprocessor/UncoveredIndexRegionScanner.java | 24 ++++++++++++++-------- .../UncoveredLocalIndexRegionScanner.java | 13 ++++++------ .../phoenix/monitoring/CountRowsScannedIT.java | 20 ++++++++++++++++++ 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/UncoveredIndexRegionScanner.java b/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/UncoveredIndexRegionScanner.java index 70977a545b..06e8622038 100644 --- a/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/UncoveredIndexRegionScanner.java +++ b/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/UncoveredIndexRegionScanner.java @@ -220,11 +220,14 @@ public abstract class UncoveredIndexRegionScanner extends BaseRegionScanner { protected boolean scanIndexTableRows(List<Cell> result, final long startTime, final byte[] actualStartKey, - final int offset) throws IOException { + final int offset, + ScannerContext scannerContext) throws IOException { boolean hasMore = false; if (actualStartKey != null) { do { - hasMore = innerScanner.nextRaw(result); + hasMore = scannerContext != null + ? innerScanner.nextRaw(result, scannerContext) + : innerScanner.nextRaw(result); if (result.isEmpty()) { return hasMore; } @@ -249,7 +252,9 @@ public abstract class UncoveredIndexRegionScanner extends BaseRegionScanner { do { List<Cell> row = new ArrayList<Cell>(); if (result.isEmpty()) { - hasMore = innerScanner.nextRaw(row); + hasMore = scannerContext != null + ? innerScanner.nextRaw(row, scannerContext) + : innerScanner.nextRaw(row); } else { row.addAll(result); result.clear(); @@ -289,8 +294,9 @@ public abstract class UncoveredIndexRegionScanner extends BaseRegionScanner { } protected boolean scanIndexTableRows(List<Cell> result, - final long startTime) throws IOException { - return scanIndexTableRows(result, startTime, null, 0); + final long startTime, + ScannerContext scannerContext) throws IOException { + return scanIndexTableRows(result, startTime, null, 0, scannerContext); } private boolean verifyIndexRowAndRepairIfNecessary(Result dataRow, byte[] indexRowKey, @@ -381,8 +387,8 @@ public abstract class UncoveredIndexRegionScanner extends BaseRegionScanner { } } - public boolean next(List<Cell> result, ScannerContext scannerContext) throws IOException { - return next(result); + public boolean next(List<Cell> result) throws IOException { + return next(result, null); } /** @@ -399,7 +405,7 @@ public abstract class UncoveredIndexRegionScanner extends BaseRegionScanner { * @throws IOException */ @Override - public boolean next(List<Cell> result) throws IOException { + public boolean next(List<Cell> result, ScannerContext scannerContext) throws IOException { long startTime = EnvironmentEdgeManager.currentTimeMillis(); boolean hasMore; region.startRegionOperation(); @@ -416,7 +422,7 @@ public abstract class UncoveredIndexRegionScanner extends BaseRegionScanner { state = State.SCANNING_INDEX; } if (state == State.SCANNING_INDEX) { - hasMore = scanIndexTableRows(result, startTime); + hasMore = scanIndexTableRows(result, startTime, scannerContext); if (isDummy(result)) { updateDummyWithPrevRowKey(result, initStartRowKey, includeInitStartRowKey, scan); diff --git a/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/UncoveredLocalIndexRegionScanner.java b/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/UncoveredLocalIndexRegionScanner.java index 39b8733a0e..31301c2839 100644 --- a/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/UncoveredLocalIndexRegionScanner.java +++ b/phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/UncoveredLocalIndexRegionScanner.java @@ -120,18 +120,19 @@ public class UncoveredLocalIndexRegionScanner extends UncoveredIndexRegionScanne @Override protected boolean scanIndexTableRows(List<Cell> result, - final long startTime) throws IOException { - return scanIndexTableRows(result, startTime, actualStartKey, offset); + final long startTime, + ScannerContext scannerContext) throws IOException { + return scanIndexTableRows(result, startTime, actualStartKey, offset, scannerContext); } @Override - public boolean next(List<Cell> result) throws IOException { - boolean hasMore = super.next(result); + public boolean next(List<Cell> result, ScannerContext scannerContext) throws IOException { + boolean hasMore = super.next(result, scannerContext); ServerIndexUtil.wrapResultUsingOffset(result, offset); return hasMore; } - public boolean next(List<Cell> result, ScannerContext scannerContext) throws IOException { - return next(result); + public boolean next(List<Cell> result) throws IOException { + return next(result, null); } } diff --git a/phoenix-core/src/it/java/org/apache/phoenix/monitoring/CountRowsScannedIT.java b/phoenix-core/src/it/java/org/apache/phoenix/monitoring/CountRowsScannedIT.java index d074d4a483..9a3a894e6c 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/monitoring/CountRowsScannedIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/monitoring/CountRowsScannedIT.java @@ -215,6 +215,26 @@ public class CountRowsScannedIT extends BaseTest { Assert.assertEquals(indexName, stmt.getQueryPlan().getTableRef().getTable().getTableName().toString()); } + @Test + public void testQueryUncoveredIndex() throws Exception { + Connection conn = DriverManager.getConnection(getUrl()); + String tableName = generateUniqueName(); + String indexName = generateUniqueName(); + PhoenixStatement stmt = conn.createStatement().unwrap(PhoenixStatement.class); + stmt.execute("CREATE TABLE " + tableName + + " (A UNSIGNED_LONG NOT NULL PRIMARY KEY, Z UNSIGNED_LONG)"); + stmt.execute("CREATE UNCOVERED INDEX " + indexName + " ON " + tableName + "(Z)"); + for (int i = 1; i <= 100; i++) { + String sql = String.format("UPSERT INTO %s VALUES (%d, %d)", tableName, i, i); + stmt.execute(sql); + } + conn.commit(); + String selectQuery = "SELECT A FROM " + tableName + " WHERE Z > 34 AND Z < 63"; + long count = countRowsScannedFromSql(stmt, selectQuery); + assertEquals(28, count); + Assert.assertEquals(indexName, stmt.getQueryPlan().getTableRef().getTable().getTableName().toString()); + } + @Test public void testJoin() throws Exception { Connection conn = DriverManager.getConnection(getUrl());