You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@phoenix.apache.org by "chenglei (Jira)" <ji...@apache.org> on 2020/03/01 03:58:00 UTC

[jira] [Updated] (PHOENIX-5753) Fix erroneous query result when RVC is clipped with desc column

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

chenglei updated PHOENIX-5753:
------------------------------
    Attachment: PHOENIX-5753_v1-4.x-HBase-1.4.patch

> Fix erroneous query result when RVC is clipped with desc column
> ---------------------------------------------------------------
>
>                 Key: PHOENIX-5753
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-5753
>             Project: Phoenix
>          Issue Type: Bug
>    Affects Versions: 5.0.0, 4.15.0
>            Reporter: chenglei
>            Assignee: chenglei
>            Priority: Major
>              Labels: DESC
>             Fix For: 4.16.0
>
>         Attachments: PHOENIX-5753_v1-4.x-HBase-1.4.patch
>
>
> Given following table and data:
> {code:java}
>        CREATE TABLE  test
>        (
>             pk1 INTEGER NOT NULL ,  
>             pk2 INTEGER NOT NULL, 
>             pk3 INTEGER NOT NULL, 
>             pk4 INTEGER NOT NULL, 
>             v INTEGER, CONSTRAINT PK PRIMARY KEY(pk1,pk2,pk3 desc,pk4))
>        )
> {code}
>       Noticed pk3 is DESC.
> {code:java}
>        UPSERT INTO test (pk1, pk2, pk3, pk4, v) VALUES (1,3,4,10,1)
> {code}
> If we execute the following sql:
> {code:java}
>      select * from test
>      where (pk1 >=1 and pk1<=2) and (pk2>=3 and pk2<=4) and (pk3,pk4) < (5,7)
> {code}
> the returned result is empty, but obviously, the above inserted row (1,3,4,10,1) should be returned.
> I think this problem is introduced by PHOENIX-3383 and PHOENIX-4841, when we clip the {{(pk3,pk4) < (5,7)}} because {{pk3}} is {{DESC}}  by following line 260 in {{WhereOptimizer.pushKeyExpressionsToScan}} , {{(pk3,pk4) < (5,7)}} is clipped to {{pk3 <= 5}} and {{pk4 < 7}} .
> {code:java}
> 257                        List<KeyRange> leftRanges = clipLeft(schema, slot.getPKPosition()
> 258                            + slotOffset - clipLeftSpan, clipLeftSpan, keyRanges, ptr);
> 259                    keyRanges =
> 260                            clipRight(schema, slot.getPKPosition() + slotOffset - 1, keyRanges,
> 261                                    leftRanges, ptr);
> 262                    if (prevSortOrder == SortOrder.DESC) {
> 263                        leftRanges = invertKeyRanges(leftRanges);
> 264                    }
> 265                    slotSpanArray[cnf.size()] = clipLeftSpan-1;
> 266                    cnf.add(leftRanges);
> 267                    clipLeftSpan = 0;
> 268                    prevSortOrder = sortOrder;
> 269                    // since we have to clip the portion with the same sort order, we can no longer
> 270                    // extract the nodes from the where clause
> 271                    // for eg. for the schema A VARCHAR DESC, B VARCHAR ASC and query
> 272                    //   WHERE (A,B) < ('a','b')
> 273                    // the range (* - a\xFFb) is converted to (~a-*)(*-b)
> 274                    // so we still need to filter on A,B
> 275                    stopExtracting = true;
> 276                }
> {code}
> Eventually after we completed the  {{WhereOptimizer.pushKeyExpressionsToScan}}, the result
> {{ScanRanges.ranges}} is  [[[1 - 2]], [[3 - 4]], [[~5 - *)], [(* - 7)]],  {{ScanRanges.useSkipScanFilter}} is {{true}}  and {{SkipScanFilter}} is also [[[1 - 2]], [[3 - 4]], [[~5 - *)], [(* - 7)]], so the  the above inserted row (1,3,4,10,1) could not be retrieved.
> But as we know, {{(pk3,pk4) < (5,7)}} is not semantically equals to {{pk3 <= 5}} and {{pk4 < 7}} , we could only have
>   {{pk3 <= 5}}  but not  {{pk4 < 7}}, so when we clipped  {{(pk3,pk4) < (5,7)}}  to {{pk3 <= 5}} , we could  simply skip remaining columns of this RVC.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)