Description
See InListIT#testLeadingPKWithTrailingRVCSlotHole as an example query that will fail when given the /*+ RANGE_SCAN */ hint.
The issue is caused by the WhereOptimizer extracting the leading partially qualified row keys of the where clause but improperly producing splitScan start and stop rows in parallel iterators.
For example, with a where clause like:
SELECT * FROM TABLE_SALTED_4 WHERE pk1 = 2 and pk3 = 4;
The ScanRanges will set the scan boundaries as:
[\x00\x80\x00\x00\x02 - \x03\x80\x00\x00\x03]
This is technically correct as the scan start/stop rows need to include the salt byte, but it means that naively intersecting the scan ranges with region boundaries such as:
[* - \x01] [\x01 - \x02] [\x02 - \x03] [\x03 - *]
Will produce the following partially incorrect splitScan boundaries:
[\x00\x80\x00\x00\x02 - \x01] [\x01 - \x02] [\x02 - \x03] [\x03 - \x03\x80\x00\x00\x03]
Note that this is only a problem when the /*+ RANGE_SCAN */ hint is given. Without a hint, this query will use a skip scan, sidestepping the issue.
This is also related to PHOENIX-1163 and depending on how PHOENIX-1163 is resolved, could be fixed at the same time.