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