Yu Xu created CALCITE-7694:
------------------------------

             Summary: RexSimplify should simplify comparisons involving RAND() 
using its [0, 1) range
                 Key: CALCITE-7694
                 URL: https://issues.apache.org/jira/browse/CALCITE-7694
             Project: Calcite
          Issue Type: Improvement
          Components: core
    Affects Versions: 1.42.0
            Reporter: Yu Xu
            Assignee: Yu Xu
             Fix For: 1.43.0


RAND() is a non-deterministic function that returns a DOUBLE value in the 
half-open range [0, 1). Because it is non-deterministic, its result cannot be 
constant-folded by the usual reduction rules, so predicates involving RAND() 
survive into the physical plan and are evaluated row by row at runtime.

However, some of these predicates are decidable at planning time purely from

the known [0, 1) range of RAND(), regardless of the actual random value. For

example:
{code:java}
SELECT * FROM emp WHERE RAND() > 1.0     -- always false
SELECT * FROM emp WHERE RAND() >= 0       -- always true
SELECT * FROM emp WHERE RAND() = 5        -- always false {code}
Today RexSimplify leaves all of these untouched. An always-false predicate   
should collapse the relation to empty, and an always-true predicate should let  
 the filter be removed entirely, avoiding a full scan and a per-row evaluation  
 of the random function.   The same reasoning extends to linear arithmetic on a 
single RAND() call, which   appears after other rewrites or in generated 
sampling SQL:
{code:java}
RAND() * 3 < 3      -- normalizes to RAND() < 1  -> always true
RAND() - 1 > 0      -- normalizes to RAND() > 1  -> always false
1 - RAND() > 1      -- normalizes to RAND() < 0  -> always false {code}
We can simplify these expressions.



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

Reply via email to