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

Reply via email to