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());

Reply via email to