Hi Ruben,

I don't have an Apache Jira account so am not able to raise a Jira ticket. I 
did apply for an account yesterday using the self-serve form but still waiting.

I actually hit the failures running tests within substrait-java, so this is not 
a completely standard configuration either:

https://github.com/substrait-io/substrait-java/blob/e0f453059e5c8d07e0cf303bd76d19158f21bed2/isthmus/src/test/java/io/substrait/isthmus/TpcdsQueryTest.java#L33

Here is the complete stacktrace for the failure on TPC-DS query 40:

Caused by: java.lang.RuntimeException: while converting CASE WHEN CAST(`D_DATE` 
AS DATE) < CAST('2000-03-11' AS DATE) THEN `CS_SALES_PRICE` - CASE WHEN 
`CR_REFUNDED_CASH` IS NOT NULL THEN `CR_REFUNDED_CASH` ELSE 0 END ELSE 0 END
      at 
org.apache.calcite.sql2rel.ReflectiveConvertletTable.lambda$registerNodeTypeMethod$1(ReflectiveConvertletTable.java:99)
      at 
org.apache.calcite.sql2rel.SqlNodeToRexConverterImpl.convertCall(SqlNodeToRexConverterImpl.java:62)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:5930)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:5093)
      at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:175)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.convertExpression(SqlToRelConverter.java:5744)
      at 
org.apache.calcite.sql2rel.AggConverter.translateAgg(AggConverter.java:471)
      at 
org.apache.calcite.sql2rel.AggConverter.translateAgg(AggConverter.java:338)
      at org.apache.calcite.sql2rel.AggConverter.visit(AggConverter.java:322)
      at org.apache.calcite.sql2rel.AggConverter$1.visit(AggConverter.java:177)
      at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:175)
      at org.apache.calcite.sql2rel.AggConverter.visit(AggConverter.java:329)
      at org.apache.calcite.sql2rel.AggConverter$1.visit(AggConverter.java:177)
      at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:175)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter.createAggImpl(SqlToRelConverter.java:3587)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter.convertAgg(SqlToRelConverter.java:3528)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter.convertSelectList(SqlToRelConverter.java:4767)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter.convertSelectImpl(SqlToRelConverter.java:811)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter.convertSelect(SqlToRelConverter.java:737)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter.convertQueryRecursive(SqlToRelConverter.java:3943)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:630)
      at 
io.substrait.isthmus.calcite.rel.DdlSqlToRelConverter.handleNonDdl(DdlSqlToRelConverter.java:50)
      at 
io.substrait.isthmus.calcite.rel.DdlSqlToRelConverter.visit(DdlSqlToRelConverter.java:46)
      at 
io.substrait.isthmus.calcite.rel.DdlSqlToRelConverter.visit(DdlSqlToRelConverter.java:15)
      at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:175)
      at 
io.substrait.isthmus.sql.SubstraitSqlToCalcite.lambda$convert$0(SubstraitSqlToCalcite.java:140)
      at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
      at 
java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:720)
      at 
java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
      at 
java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
      at 
java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
      at 
java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      at 
java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
      at 
io.substrait.isthmus.sql.SubstraitSqlToCalcite.convert(SubstraitSqlToCalcite.java:147)
      at 
io.substrait.isthmus.sql.SubstraitSqlToCalcite.convertQueries(SubstraitSqlToCalcite.java:115)
      at 
io.substrait.isthmus.sql.SubstraitSqlToCalcite.convertQueries(SubstraitSqlToCalcite.java:89)
      at io.substrait.isthmus.SqlToSubstrait.convert(SqlToSubstrait.java:56)
      at 
io.substrait.isthmus.PlanTestBase.toSubstraitPlan(PlanTestBase.java:356)
      at 
io.substrait.isthmus.TpcdsQueryTest.toSubstraitPlan(TpcdsQueryTest.java:61)
      at 
io.substrait.isthmus.TpcdsQueryTest.lambda$testQuery$0(TpcdsQueryTest.java:34)
      at 
org.junit.jupiter.api.AssertDoesNotThrow.assertDoesNotThrow(AssertDoesNotThrow.java:71)
      ... 52 more
Caused by: java.lang.reflect.InvocationTargetException
      at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 
Method)
      at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.base/java.lang.reflect.Method.invoke(Method.java:566)
      at 
org.apache.calcite.sql2rel.ReflectiveConvertletTable.lambda$registerNodeTypeMethod$1(ReflectiveConvertletTable.java:95)
      ... 92 more
Caused by: java.lang.RuntimeException: while converting CASE WHEN 
`CR_REFUNDED_CASH` IS NOT NULL THEN `CR_REFUNDED_CASH` ELSE 0 END
      at 
org.apache.calcite.sql2rel.ReflectiveConvertletTable.lambda$registerNodeTypeMethod$1(ReflectiveConvertletTable.java:99)
      at 
org.apache.calcite.sql2rel.SqlNodeToRexConverterImpl.convertCall(SqlNodeToRexConverterImpl.java:62)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:5930)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:5093)
      at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:175)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.convertExpression(SqlToRelConverter.java:5744)
      at 
org.apache.calcite.sql2rel.StandardConvertletTable.convertOperands(StandardConvertletTable.java:1286)
      at 
org.apache.calcite.sql2rel.StandardConvertletTable.convertOperands(StandardConvertletTable.java:1278)
      at 
org.apache.calcite.sql2rel.StandardConvertletTable.convertCall(StandardConvertletTable.java:1184)
      at 
org.apache.calcite.sql2rel.StandardConvertletTable.lambda$new$2(StandardConvertletTable.java:163)
      at 
org.apache.calcite.sql2rel.SqlNodeToRexConverterImpl.convertCall(SqlNodeToRexConverterImpl.java:62)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:5930)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:5093)
      at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:175)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.convertExpression(SqlToRelConverter.java:5744)
      at 
org.apache.calcite.sql2rel.StandardConvertletTable.convertCase(StandardConvertletTable.java:635)
      ... 97 more
Caused by: java.lang.reflect.InvocationTargetException
      at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 
Method)
      at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.base/java.lang.reflect.Method.invoke(Method.java:566)
      at 
org.apache.calcite.sql2rel.ReflectiveConvertletTable.lambda$registerNodeTypeMethod$1(ReflectiveConvertletTable.java:95)
      ... 112 more
Caused by: java.lang.UnsupportedOperationException: class 
org.apache.calcite.sql.SqlBasicCall: `CR_REFUNDED_CASH`
      at org.apache.calcite.util.Util.needToImplement(Util.java:1112)
      at 
org.apache.calcite.sql.validate.SqlValidatorImpl.getValidatedNodeType(SqlValidatorImpl.java:1891)
      at 
org.apache.calcite.sql2rel.StandardConvertletTable.lambda$new$13(StandardConvertletTable.java:304)
      at 
org.apache.calcite.sql2rel.SqlNodeToRexConverterImpl.convertCall(SqlNodeToRexConverterImpl.java:62)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:5930)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:5093)
      at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:175)
      at 
org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.convertExpression(SqlToRelConverter.java:5744)
      at 
org.apache.calcite.sql2rel.StandardConvertletTable.convertCase(StandardConvertletTable.java:635)
      ... 117 more

It might be that something is wrong in the code paths that the stacktrace shows 
in the way the SqlNode objects are handled, but it seems that the problem stems 
from the creation of the SqlNode structure, which is much more standard Calcite 
usage:

https://github.com/substrait-io/substrait-java/blob/e0f453059e5c8d07e0cf303bd76d19158f21bed2/isthmus/src/main/java/io/substrait/isthmus/sql/SubstraitSqlStatementParser.java#L32-L35

Here we get the SqlBasicCall (with a cast operation) for the `CR_REFUNDED_CASH` 
SqlIdentifier.

I will try to create a simpler reproduction to make diagnosis easier.

Regards,

    Mark.
________________________________
From: Ruben Q L <[email protected]>
Sent: 16 October 2025 10:05
To: [email protected] <[email protected]>; [email protected] 
<[email protected]>
Subject: Re: Regression in Calcite 1.41.0

@Mark, could you please provide more details for reproducibility? (details 
about your system, Calcite configuration, full stack-trace, etc)
Also, if you're not already subscribed to the dev list, I encourage you to do 
so (as explained in [1]) in order to be up-to-date with this (and other) 
discussions.

Best,
Ruben

[1] https://calcite.apache.org/community/#mailing-lists


On Wed, Oct 15, 2025 at 5:03 PM Ruben Q L 
<[email protected]<mailto:[email protected]>> wrote:
Definitely looks like a blocker.
As others have said, we would need a Jira ticket and, ideally, a minimalistic 
unit test reproducing the issue.


On Wed, Oct 15, 2025 at 4:36 PM Mihai Budiu 
<[email protected]<mailto:[email protected]>> wrote:
Sounds like a blocking problem.

Can you provide a reproduction? Calcite has many configuration settings.
In our tests we compile TPCDS without issues, but our configuration is not the 
standard one.

Mihai



________________________________
From: 我 <[email protected]<mailto:[email protected]>>
Sent: Wednesday, October 15, 2025 8:34 AM
To: dev <[email protected]<mailto:[email protected]>>
Subject: Re: Regression in Calcite 1.41.0

Could you log this issue in Jira? It would be even better if you could also 
provide a minimal test case!

Best,
Zhen Chen



---- Replied Message ----
| From | Mark Lewis<[email protected]<mailto:[email protected]>> |
| Date | 10/15/2025 22:36 |
| To | [email protected]<mailto:[email protected]> |
| Cc | |
| Subject | Regression in Calcite 1.41.0 |
Hi community,

I am making use of the Calcite SQLParser and SQLToRelSqlToRelConverter to 
convert SQL statements from the TPC-DS benchmark suite. In preparation to adopt 
the forthcoming Calcite 1.41.0, I tried using a version of Calcite I built 
locally from the current development codebase. I see failures that did not 
exist with Calcite 1.40.0 on TPC-DS queries 40, 67 and 80; all on CASE 
statements, with the underlying failure in 
SqlValidatorImpl.getValidatedNodeType():

Query 40 fails on:

CASE WHEN `CR_REFUNDED_CASH` IS NOT NULL THEN `CR_REFUNDED_CASH` ELSE 0 END

with the underlying error:

java.lang.UnsupportedOperationException: class 
org.apache.calcite.sql.SqlBasicCall: `CR_REFUNDED_CASH`

Query 67 fails on:

CASE WHEN `SS_SALES_PRICE` * `SS_QUANTITY` IS NOT NULL THEN `SS_SALES_PRICE` * 
`SS_QUANTITY` ELSE 0 END

with the underlying error:

java.lang.UnsupportedOperationException: class 
org.apache.calcite.sql.SqlBasicCall: `SS_SALES_PRICE` * `SS_QUANTITY`

Query 80 fails on:

CASE WHEN `SR_RETURN_AMT` IS NOT NULL THEN `SR_RETURN_AMT` ELSE 0 END

with the underlying error:

ava.lang.UnsupportedOperationException: class 
org.apache.calcite.sql.SqlBasicCall: `SR_RETURN_AMT`

This regression appears to be introduced in commit 
12e7d621bbb19aa32cb45329cb84532115037b7a ([CALCITE-7044] Add internal operator 
CAST NOT NULL to enhance rewrite COALESCE operator). Since that commit, the 
SqlNode kind at the point of failure in each case has become SqlBasicCall with 
a CAST NOT NULL operator, and no node type is identified, which is a failure 
condition.

Regards,

   Mark.

Reply via email to