[
https://issues.apache.org/jira/browse/IGNITE-18931?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17954100#comment-17954100
]
Maksim Zhuravkov commented on IGNITE-18931:
-------------------------------------------
Another example:
{code:java}
assertQuery("SELECT RAND(), RAND()")
.returns(1)
.check();
java.lang.AssertionError: Collections sizes are not equal:
Expected: 1[1]
Actual: 2[0.3158693073721933, 0.3158693073721933]
CODE public void
project(org.apache.ignite.internal.sql.engine.exec.ExecutionContext ctx, Object
row, org.apache.ignite.internal.sql.engine.exec.RowHandler.RowBuilder
outBuilder) {
try {
final double reflective_rand_value = new
org.apache.calcite.runtime.RandomFunction().rand();
outBuilder.addField(reflective_rand_value);
outBuilder.addField(reflective_rand_value);
} catch (Exception e) {
throw new org.apache.ignite.sql.SqlException(
262151,
e);
}
}
{code}
> Sql. Invalid expression code generation for comparing the results of a
> non-deterministic function.
> --------------------------------------------------------------------------------------------------
>
> Key: IGNITE-18931
> URL: https://issues.apache.org/jira/browse/IGNITE-18931
> Project: Ignite
> Issue Type: Improvement
> Components: sql
> Reporter: Pavel Pereslegin
> Priority: Major
> Labels: calcite2-required, calcite3-required, ignite-3
>
> Currently expressions like "expr() = expr()" and "expr() != expr()" for
> non-deterministic functions (for example rand_uuid()) do not work correctly.
> The problem seems to be related to the optimization made in
> RexProgramBuilder#registerInternal, ignoring the fact that the function might
> be non-deterministic.
> {code:java}
> final RexSimplify simplify =
> new RexSimplify(rexBuilder, RelOptPredicateList.EMPTY,
> RexUtil.EXECUTOR);
> expr = simplify.simplifyPreservingType(expr);
> {code}
> This optimization translates comparison
> {{<>($t1, $t1)}}
> to
> {{CAST(AND(null, IS NULL($t1))):BOOLEAN NOT NULL}}
> The first expression can be translated into two function calls, but the
> second expression unambiguously makes only one call.
> And it looks like a naive fix would be to apply this optimization only if
> {{RexUtil.isDeterministic(rexNode)}} returns true.
> {{RexProgramBuilder}} currently is not a part of Ignite-3 codebase and it
> seems that it will be better to do such fix in Apache Calcite.
> However, before doing this, we need to learn the discussions that have been
> made on this topic previously.
> CALCITE-2823
> CALCITE-3760
> CALCITE-2142
> CALCITE-2638
> CALCITE-3531
> CALCITE-4256
--
This message was sent by Atlassian Jira
(v8.20.10#820010)