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

ASF GitHub Bot updated CALCITE-7694:
------------------------------------
    Labels: pull-request-available  (was: )

> 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
>            Priority: Major
>              Labels: pull-request-available
>             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