[ 
https://issues.apache.org/jira/browse/PHOENIX-8015?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Tanuj Khurana updated PHOENIX-8015:
-----------------------------------
    Description: 
When scanning an uncovered index for a query which has a limit clause but no 
filter the client attaches a PageFilter to the scan. This PageFilter is handled 
by the TTLRegionScanner
which sits in the scanner stack below the TTLRegionScanner.
{code:java}
RegionScannerHolder
  -> UncoveredGlobalIndexRegionScanner   <- join-back + verification (drops 
orphans)
    -> TTLRegionScanner                  <- strips PageFilter, counts RAW rows, 
hard-stops
      -> PagingRegionScanner
        -> HBase raw index scanner{code}
All the rows in the uncovered index are unverified. TTLRegionScanner counts the 
unverified rows towards the query limit but these rows can be orphaned rows 
such that the data table row doesn't point back to the index row. In such 
cases, the query returns incorrect results as the TTLRegionScanner returns no 
more rows once the limit is reached but the UncoveredRegionScanner actually 
drops those unverified rows.
Covered indexes don't have this problem because scans on covered indexes are 
processed by GlobalIndexRegionScanner which removes the PageFilter from the 
scan and then reinitializes the underlying the scanners 
([GlobalIndexChecker#init()|https://github.com/apache/phoenix/blob/master/phoenix-core-server/src/main/java/org/apache/phoenix/index/GlobalIndexChecker.java#L205-L209])
 

Uncovered indexes should also follow the similar pattern and only count the row 
towards the query limit after it has been checked and verified.

  was:
When scanning an uncovered index for a query which has a limit clause but no 
filter the client attaches a PageFilter to the scan. This PageFilter is handled 
by the TTLRegionScanner
which sits in the scanner stack below the TTLRegionScanner.
{code:java}
RegionScannerHolder
  -> UncoveredGlobalIndexRegionScanner   <- join-back + verification (drops 
orphans)
    -> TTLRegionScanner                  <- strips PageFilter, counts RAW rows, 
hard-stops
      -> PagingRegionScanner
        -> HBase raw index scanner{code}
All the rows in the uncovered index are unverified. TTLRegionScanner counts the 
unverified rows towards the query limit but these rows can be orphaned rows 
such that the data table row doesn't point back to the index row. In such 
cases, the query returns incorrect results as the TTLRegionScanner returns no 
more rows once the limit is reached but the UncoveredRegionScanner actually 
drops those unverified rows.
Covered indexes don't have this problem because scans on covered indexes are 
processed by GlobalIndexRegionScanner which removes the PageFilter from the 
scan and then reinitializes the underlying the scanners 
([GlobalIndexChecker#init()|https://github.com/apache/phoenix/blob/master/phoenix-core-server/src/main/java/org/apache/phoenix/index/GlobalIndexChecker.java#L205-L209]
 

Uncovered indexes should also follow the similar pattern and only count the row 
towards the query limit after it has been checked and verified.


> LIMIT query on uncovered index with no filter silently truncates when a 
> leading run of unverifiable index rows consumes the limit
> ---------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: PHOENIX-8015
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-8015
>             Project: Phoenix
>          Issue Type: Bug
>    Affects Versions: 5.2.0, 5.2.1, 5.3.0, 5.2.2, 5.3.1, 5.3.2
>            Reporter: Tanuj Khurana
>            Priority: Major
>
> When scanning an uncovered index for a query which has a limit clause but no 
> filter the client attaches a PageFilter to the scan. This PageFilter is 
> handled by the TTLRegionScanner
> which sits in the scanner stack below the TTLRegionScanner.
> {code:java}
> RegionScannerHolder
>   -> UncoveredGlobalIndexRegionScanner   <- join-back + verification (drops 
> orphans)
>     -> TTLRegionScanner                  <- strips PageFilter, counts RAW 
> rows, hard-stops
>       -> PagingRegionScanner
>         -> HBase raw index scanner{code}
> All the rows in the uncovered index are unverified. TTLRegionScanner counts 
> the unverified rows towards the query limit but these rows can be orphaned 
> rows such that the data table row doesn't point back to the index row. In 
> such cases, the query returns incorrect results as the TTLRegionScanner 
> returns no more rows once the limit is reached but the UncoveredRegionScanner 
> actually drops those unverified rows.
> Covered indexes don't have this problem because scans on covered indexes are 
> processed by GlobalIndexRegionScanner which removes the PageFilter from the 
> scan and then reinitializes the underlying the scanners 
> ([GlobalIndexChecker#init()|https://github.com/apache/phoenix/blob/master/phoenix-core-server/src/main/java/org/apache/phoenix/index/GlobalIndexChecker.java#L205-L209])
>  
> Uncovered indexes should also follow the similar pattern and only count the 
> row towards the query limit after it has been checked and verified.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to