[ 
https://issues.apache.org/jira/browse/CALCITE-7694?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18102632#comment-18102632
 ] 

Yu Xu commented on CALCITE-7694:
--------------------------------

Okay, I should set aside some time to discuss this. If it doesn't seem 
necessary, I'll close the Jira ticket and the associated PR later.

> 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