[
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)