You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Sergey Nuyanzin (Jira)" <ji...@apache.org> on 2021/09/29 10:01:00 UTC

[jira] [Created] (CALCITE-4813) ANY_VALUE assumes that arguments should be comparable

Sergey Nuyanzin created CALCITE-4813:
----------------------------------------

             Summary: ANY_VALUE assumes that arguments should be comparable
                 Key: CALCITE-4813
                 URL: https://issues.apache.org/jira/browse/CALCITE-4813
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.27.0
            Reporter: Sergey Nuyanzin


ANY_VALUE reuses {{MinMaxImplementor}}, as a result it assumes that there are corresponding {{greater}} methods. 

In fact for non comparable input it fails, for instance every query from
{code:sql}
select any_value(r) over(), s from(select array[f, s] r, s from (select 1 as f, 2 as s) t) t;
select any_value(r) over(), s from(select map[f, s] r, s from (select 1 as f, 2 as s) t) t;
select any_value(r) over(), s from(select row(f, s) r, s from (select 1 as f, 2 as s) t) t;
{code}
will fail like
{noformat}
Caused by: java.lang.IllegalStateException: Unable to implement EnumerableCalc(expr#0..2=[{inputs}], EXPR$0=[$t2], S=[$t0]): rowcount = 1.0, cumulative cost = {4.0 rows, 13.0 cpu, 0.0 io}, id = 509
  EnumerableWindow(window#0=[window(aggs [ANY_VALUE($1)])]): rowcount = 1.0, cumulative cost = {3.0 rows, 8.0 cpu, 0.0 io}, id = 505
    EnumerableCalc(expr#0..1=[{inputs}], expr#2=[ARRAY($t0, $t1)], S=[$t1], $1=[$t2]): rowcount = 1.0, cumulative cost = {2.0 rows, 6.0 cpu, 0.0 io}, id = 511
      EnumerableValues(tuples=[[{ 1, 2 }]]): rowcount = 1.0, cumulative cost = {1.0 rows, 1.0 cpu, 0.0 io}, id = 480

	at org.apache.calcite.adapter.enumerable.EnumerableRelImplementor.implementRoot(EnumerableRelImplementor.java:114)
	at org.apache.calcite.adapter.enumerable.EnumerableInterpretable.toBindable(EnumerableInterpretable.java:113)
	at org.apache.calcite.prepare.CalcitePrepareImpl$CalcitePreparingStmt.implement(CalcitePrepareImpl.java:1130)
	at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:318)
	at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:215)
	at org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:647)
	at org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:513)
	at org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:483)
	at org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:249)
	at org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:623)
	at org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:675)
	at org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:156)
	... 8 more
	Suppressed: java.lang.RuntimeException: while resolving method 'greater[interface java.util.List, interface java.util.List]' in class class org.apache.calcite.runtime.SqlFunctions
		at org.apache.calcite.linq4j.tree.Types.lookupMethod(Types.java:318)
		at org.apache.calcite.linq4j.tree.Expressions.call(Expressions.java:448)
		at org.apache.calcite.linq4j.tree.Expressions.call(Expressions.java:460)
		at org.apache.calcite.adapter.enumerable.RexImpTable$MinMaxImplementor.implementNotNullAdd(RexImpTable.java:1113)
		at org.apache.calcite.adapter.enumerable.StrictAggImplementor.implementAdd(StrictAggImplementor.java:151)
		at org.apache.calcite.adapter.enumerable.EnumerableWindow.implementAdd(EnumerableWindow.java:880)
		at org.apache.calcite.adapter.enumerable.EnumerableWindow.implement(EnumerableWindow.java:464)
		at org.apache.calcite.adapter.enumerable.EnumerableRelImplementor.visitChild(EnumerableRelImplementor.java:104)
		at org.apache.calcite.adapter.enumerable.EnumerableCalc.implement(EnumerableCalc.java:118)
		at org.apache.calcite.adapter.enumerable.EnumerableRelImplementor.implementRoot(EnumerableRelImplementor.java:111)
		... 19 more
	Caused by: java.lang.NoSuchMethodException: org.apache.calcite.runtime.SqlFunctions.greater(java.util.List, java.util.List)
		at java.base/java.lang.Class.getMethod(Class.java:2108)
		at org.apache.calcite.linq4j.tree.Types.lookupMethod(Types.java:309)
		... 28 more

{noformat}

From one side ANY_VALUE does not guarantee being deterministic (however it looks like Calcite always picks min value), 
from another side to avoid changing the existing behavior it could be redefine for non comparable input like pick the first available value



--
This message was sent by Atlassian Jira
(v8.3.4#803005)