Vladimir Steshin created CALCITE-6848:
-----------------------------------------
Summary: An exception with SINGLE_VALUE and correlated subquery.
Key: CALCITE-6848
URL: https://issues.apache.org/jira/browse/CALCITE-6848
Project: Calcite
Issue Type: Bug
Affects Versions: 1.39.0
Environment: underlined text
Reporter: Vladimir Steshin
Hi.I'm not sure that this is not a duplicate. I found previous CALCITE-685,
CALCITE-2136, CALCITE-4945. But the description is a bit different. Or could
you please point to a correct and actual ticket for this case.
*Reproduser:*
{code:java}
import static java.util.Objects.requireNonNull;
/**
* Tests for using Calcite via JDBC.
*/
public class JdbcTest {
@Test void testSubq() {
String sql = "select (SELECT \"salary\" FROM \"hr\".\"emps\" e order by 1
limit 2) from \"hr\".\"emps\"";
CalciteAssert.hr().query(sql).returnsOrdered("salary=7000.0",
"salary=8000.0");
}
}
{code}
*Plan:*
{code:java}
EnumerableCalc(expr#0..1=[{inputs}], EXPR$0=[$t1]): rowcount = 100.0,
cumulative cost = {1513.125 rows, 15940.544595161893 cpu, 0.0 io}, id = 140
EnumerableNestedLoopJoin(condition=[true], joinType=[left]): rowcount =
100.0, cumulative cost = {1413.125 rows, 15640.544595161893 cpu, 0.0 io}, id =
136
EnumerableCalc(expr#0..4=[{inputs}], expr#5=[0], DUMMY=[$t5]): rowcount =
100.0, cumulative cost = {200.0 rows, 801.0 cpu, 0.0 io}, id = 142
EnumerableTableScan(table=[[hr, emps]]): rowcount = 100.0, cumulative
cost = {100.0 rows, 101.0 cpu, 0.0 io}, id = 59
EnumerableAggregate(group=[{}], agg#0=[SINGLE_VALUE($3)]): rowcount = 1.0,
cumulative cost = {203.125 rows, 14839.544595161893 cpu, 0.0 io}, id = 134
EnumerableLimit(fetch=[2]): rowcount = 2.0, cumulative cost = {202.0
rows, 14839.544595161893 cpu, 0.0 io}, id = 132
EnumerableSort(sort0=[$3], dir0=[ASC]): rowcount = 100.0, cumulative
cost = {200.0 rows, 14837.544595161893 cpu, 0.0 io}, id = 130
EnumerableTableScan(table=[[hr, emps]]): rowcount = 100.0, cumulative
cost = {100.0 rows, 101.0 cpu, 0.0 io}, id = 59
{code}
*Result:*
{code:java}
Error while executing SQL "select (SELECT "salary" FROM "hr"."emps" e order by
1 limit 2) from "hr"."emps"": more than one value in agg SINGLE_VALUE
java.sql.SQLException: Error while executing SQL "select (SELECT "salary" FROM
"hr"."emps" e order by 1 limit 2) from "hr"."emps"": more than one value in agg
SINGLE_VALUE
...
Caused by: java.lang.IllegalStateException: more than one value in agg
SINGLE_VALUE
at Baz$2.apply(Unknown Source)
at Baz$2.apply(Unknown Source)
at Baz$2.apply(Unknown Source)
at
org.apache.calcite.adapter.enumerable.BasicAggregateLambdaFactory$AccumulatorAdderSeq.apply(BasicAggregateLambdaFactory.java:81)
at
org.apache.calcite.linq4j.EnumerableDefaults.aggregate(EnumerableDefaults.java:133)
at
org.apache.calcite.linq4j.DefaultEnumerable.aggregate(DefaultEnumerable.java:107)
at Baz.bind(Unknown Source)
at
org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:367)
at
org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:335)
at
org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaImpl.java:657)
at
org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImpl.java:648)
at
org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:184)
at
org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:64)
at
org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:43)
at
org.apache.calcite.avatica.AvaticaConnection$1.execute(AvaticaConnection.java:669)
at
org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:717)
at
org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:677)
at
org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:157)
... 67 more
{code}
Looks like +SubQueryRemoveRule#rewriteScalarQuery(+) creates a
+SqlStdOperatorTable.SINGLE_VALUE+. But the underlying +TableScan+ produces
several values.
Actual for the main/1.39.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)