Thomas Mueller created OAK-10261:
------------------------------------

             Summary: Query with OR clause with COALESCE function incorrectly 
interpreted
                 Key: OAK-10261
                 URL: https://issues.apache.org/jira/browse/OAK-10261
             Project: Jackrabbit Oak
          Issue Type: Improvement
          Components: query
            Reporter: Thomas Mueller


The "coalesce" function incorrectly asks the index to do "is not null" for the 
first property:

{noformat}
SELECT a.* 
FROM [dam:Asset] AS a 
WHERE ((COALESCE(a.[jcr:lastModified], a.[jcr:created]) < 
cast('2023-05-08T20:51:06.239+03:00' AS date)) 
OR (COALESCE(a.[jcr:lastModified], a.[jcr:created]) = 
cast('2023-05-08T20:51:06.239+03:00' AS date) 

[dam:Asset] as [asset] /* lucene:fragments-9(/oak:index/fragments-9)  
+jcr:lastModified:[-9223372036854775808 TO 9223372036854775807]  
 */ 
{noformat}

This is because the Coalesce implementation uses an incorrect 
"getPropertyExistence" method. It is implemented as follows, so that it implies 
the first operand is not null, which is incorrect: the first operand can be 
null. Even the second operand can be null; just the combination can't be null - 
but there seems to be no good reason to inform the index to do this.

{noformat}
    // this is wrong:
    @Override
    public PropertyExistenceImpl getPropertyExistence() {
        PropertyExistenceImpl pe = operand1.getPropertyExistence();
        return pe != null ? pe : operand2.getPropertyExistence();
    }
{noformat}



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

Reply via email to