[ 
https://issues.apache.org/jira/browse/IGNITE-25952?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Maksim Zhuravkov updated IGNITE-25952:
--------------------------------------
    Summary: Sql. Incorrect code generation for TIME/TIMESTAMP casts with 
literals  (was: Sql. Incorrect code generation for TIME/TIMESTAMP casts with 
literal)

> Sql. Incorrect code generation for TIME/TIMESTAMP casts with literals
> ---------------------------------------------------------------------
>
>                 Key: IGNITE-25952
>                 URL: https://issues.apache.org/jira/browse/IGNITE-25952
>             Project: Ignite
>          Issue Type: Bug
>          Components: sql ai3
>    Affects Versions: 3.0
>            Reporter: Maksim Zhuravkov
>            Priority: Major
>              Labels: ignite-3
>
> The following code incorrectly uses calcite's DateTimeFormatter and the query 
> fails:
> {code:java}
> sql("SELECT CAST(TIME '10:12:13' AS STRING FORMAT 'hh24:Mi:ss.FF2')");
> {code}
> Expected:
> {noformat}
> 10:12:13.00
> {noformat}
> Error: 
> {noformat}
> [2025-07-18T11:37:43,798][INFO ][main][ItDynamicParameterTest] >>> Starting 
> test: ItDynamicParameterTest#dddd, displayName: dddd()
> [2025-07-18T11:37:44,045][WARN 
> ][%idpt_n_3344%sql-planning-pool-1][PrepareServiceImpl] Plan prepared: 
> SELECT CAST(TIME '10:12:13' AS VARCHAR FORMAT 'hh24:mi:ss.FF2')
> Project
>     fieldNames: [EXPR$0]
>     projection: [CAST(10:12:13, _UTF-8'hh24:mi:ss.FF2'):VARCHAR CHARACTER SET 
> "UTF-8" NOT NULL]
>     est: (rows=1)
>   Values
>       fieldNames: [ZERO]
>       tuples: [[0]]
>       est: (rows=1)
> public org.apache.calcite.rel.RelNode apply(org.apache.calcite.rel.RelInput 
> p0) {
>   return new org.apache.ignite.internal.sql.engine.rel.IgniteValues(
>       p0);
> }
> public org.apache.calcite.rel.RelNode apply(org.apache.calcite.rel.RelInput 
> p1) {
>   return new org.apache.ignite.internal.sql.engine.rel.IgniteProject(
>       p1);
> }
> 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 {
>     outBuilder.addField(new 
> org.apache.calcite.runtime.SqlFunctions.DateFormatFunction().formatTime("hh24:mi:ss.FF2",
>  36733000));
>   } catch (Exception e) {
>     throw new org.apache.ignite.sql.SqlException(
>       262151,
>       e);
>   }
> }
> [2025-07-18T11:37:44,266][WARN 
> ][%idpt_n_3344%sql-planning-pool-3][PrepareServiceImpl] Plan prepared: 
> DELETE FROM t1
> Project
>     fieldNames: [ROWCOUNT]
>     projection: [CAST($f0):BIGINT NOT NULL]
>     est: (rows=1)
>   ColocatedHashAggregate
>       fieldNames: [$f0]
>       group: []
>       aggregation: [$SUM0(ROWCOUNT)]
>       est: (rows=1)
>     Exchange
>         distribution: single
>         est: (rows=1)
>       TableModify
>           table: PUBLIC.T1
>           fieldNames: [ROWCOUNT]
>           type: DELETE
>           est: (rows=1)
>         TableScan
>             table: PUBLIC.T1
>             fieldNames: [ID]
>             est: (rows=1)
> public org.apache.calcite.rel.RelNode apply(org.apache.calcite.rel.RelInput 
> p2) {
>   return new org.apache.ignite.internal.sql.engine.rel.IgniteTableScan(
>       p2);
> }
> public org.apache.calcite.rel.RelNode apply(org.apache.calcite.rel.RelInput 
> p3) {
>   return new org.apache.ignite.internal.sql.engine.rel.IgniteTableModify(
>       p3);
> }
> public org.apache.calcite.rel.RelNode apply(org.apache.calcite.rel.RelInput 
> p4) {
>   return new org.apache.ignite.internal.sql.engine.rel.IgniteSender(
>       p4);
> }
> public org.apache.calcite.rel.RelNode apply(org.apache.calcite.rel.RelInput 
> p5) {
>   return new org.apache.ignite.internal.sql.engine.rel.IgniteReceiver(
>       p5);
> }
> public org.apache.calcite.rel.RelNode apply(org.apache.calcite.rel.RelInput 
> p6) {
>   return new 
> org.apache.ignite.internal.sql.engine.rel.agg.IgniteColocatedHashAggregate(
>       p6);
> }
> 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 java.math.BigDecimal input_value = (java.math.BigDecimal) 
> ctx.rowHandler().get(0, row);
>     outBuilder.addField(input_value == null ? 0L : 
> org.apache.ignite.internal.sql.engine.util.IgniteMath.convertToLongExact(input_value));
>   } catch (Exception e) {
>     throw new org.apache.ignite.sql.SqlException(
>       262151,
>       e);
>   }
> }
> public Object apply(Object in) {
>   return 
> org.apache.ignite.internal.sql.engine.exec.exp.IgniteSqlFunctions.toBigDecimal(org.apache.calcite.runtime.SqlFunctions.toLong(in),
>  32767, 0);
> }
> [2025-07-18T11:37:44,394][INFO ][main][ItDynamicParameterTest] >>> Stopping 
> test: ItDynamicParameterTest#dddd, displayName: dddd(), cost: 596ms.
> org.apache.ignite.sql.SqlException: IGN-SQL-7 start 0, end 2, length 1
>  TraceId:eef9965a
>       at 
> java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:710)
>       at 
> org.apache.ignite.internal.util.ExceptionUtils$1.copy(ExceptionUtils.java:941)
>       at 
> org.apache.ignite.internal.util.ExceptionUtils$ExceptionFactory.createCopy(ExceptionUtils.java:875)
>       at 
> org.apache.ignite.internal.util.ExceptionUtils.copyExceptionWithCause(ExceptionUtils.java:677)
>       at 
> org.apache.ignite.internal.util.ExceptionUtils.copyExceptionWithCauseInternal(ExceptionUtils.java:810)
>       at 
> org.apache.ignite.internal.util.ExceptionUtils.copyExceptionWithCause(ExceptionUtils.java:655)
>       at 
> org.apache.ignite.internal.util.IgniteUtils.getInterruptibly(IgniteUtils.java:838)
>       at 
> org.apache.ignite.internal.sql.api.IgniteSqlImpl.sync(IgniteSqlImpl.java:686)
>       at 
> org.apache.ignite.internal.sql.api.IgniteSqlImpl.execute(IgniteSqlImpl.java:233)
>       at 
> org.apache.ignite.internal.sql.api.PublicApiThreadingIgniteSql.lambda$execute$2(PublicApiThreadingIgniteSql.java:81)
>       at 
> org.apache.ignite.internal.thread.PublicApiThreading.executeWithRole(PublicApiThreading.java:144)
>       at 
> org.apache.ignite.internal.thread.PublicApiThreading.execUserSyncOperation(PublicApiThreading.java:102)
>       at 
> org.apache.ignite.internal.sql.api.PublicApiThreadingIgniteSql.execute(PublicApiThreadingIgniteSql.java:81)
>       at 
> org.apache.ignite.internal.restart.RestartProofIgniteSql.lambda$execute$3(RestartProofIgniteSql.java:78)
>       at 
> org.apache.ignite.internal.restart.IgniteAttachmentLock.attached(IgniteAttachmentLock.java:59)
>       at 
> org.apache.ignite.internal.restart.RestartProofIgniteSql.execute(RestartProofIgniteSql.java:78)
>       at org.apache.ignite.sql.IgniteSql.execute(IgniteSql.java:90)
>       at 
> org.apache.ignite.internal.ClusterPerClassIntegrationTest.sql(ClusterPerClassIntegrationTest.java:477)
>       at 
> org.apache.ignite.internal.ClusterPerClassIntegrationTest.sql(ClusterPerClassIntegrationTest.java:491)
>       at 
> org.apache.ignite.internal.ClusterPerClassIntegrationTest.sql(ClusterPerClassIntegrationTest.java:487)
>       at 
> org.apache.ignite.internal.ClusterPerClassIntegrationTest.sql(ClusterPerClassIntegrationTest.java:483)
>       at 
> org.apache.ignite.internal.ClusterPerClassIntegrationTest.sql(ClusterPerClassIntegrationTest.java:436)
>       at 
> org.apache.ignite.internal.sql.engine.ItDynamicParameterTest.dddd(ItDynamicParameterTest.java:93)
>       at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>       at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
>       at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
> Caused by: java.util.concurrent.ExecutionException: 
> org.apache.ignite.sql.SqlException: IGN-SQL-7 start 0, end 2, length 1 
> TraceId:eef9965a
>       at 
> java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
>       at 
> java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999)
>       at 
> org.apache.ignite.internal.util.IgniteUtils.getInterruptibly(IgniteUtils.java:836)
>       ... 19 more
> Caused by: org.apache.ignite.sql.SqlException: IGN-SQL-7 start 0, end 2, 
> length 1 TraceId:eef9965a
>       at SC.project(Unknown Source)
>       at 
> org.apache.ignite.internal.sql.engine.exec.exp.ProjectionImplementor$SqlProjectionImpl.project(ProjectionImplementor.java:174)
>       at 
> org.apache.ignite.internal.sql.engine.exec.LogicalRelImplementor.lambda$visit$4(LogicalRelImplementor.java:284)
>       at 
> org.apache.ignite.internal.sql.engine.exec.rel.ProjectNode.push(ProjectNode.java:66)
>       at 
> org.apache.ignite.internal.sql.engine.exec.rel.ScanNode.push(ScanNode.java:116)
>       at 
> org.apache.ignite.internal.sql.engine.exec.rel.AbstractNode.lambda$execute$0(AbstractNode.java:134)
>       at 
> org.apache.ignite.internal.sql.engine.exec.ExecutionContext.lambda$execute$0(ExecutionContext.java:387)
>       at 
> org.apache.ignite.internal.sql.engine.exec.QueryTaskExecutorImpl.lambda$execute$0(QueryTaskExecutorImpl.java:101)
>       at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
>       at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
>       at java.base/java.lang.Thread.run(Thread.java:829)
> Caused by: java.lang.IndexOutOfBoundsException: start 0, end 2, length 1
>       at 
> java.base/java.lang.AbstractStringBuilder.checkRange(AbstractStringBuilder.java:1716)
>       at 
> java.base/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:631)
>       at java.base/java.lang.StringBuilder.append(StringBuilder.java:218)
>       at 
> org.apache.calcite.util.format.FormatElementEnum$13.format(FormatElementEnum.java:135)
>       at 
> org.apache.calcite.runtime.SqlFunctions$DateFormatFunction.lambda$null$1(SqlFunctions.java:4701)
>       at 
> com.google.common.collect.ImmutableList.forEach(ImmutableList.java:423)
>       at 
> org.apache.calcite.runtime.SqlFunctions$DateFormatFunction.lambda$internalFormatDatetime$2(SqlFunctions.java:4701)
>       at 
> org.apache.calcite.runtime.SqlFunctions$DateFormatFunction.withElements(SqlFunctions.java:4694)
> {noformat}
> RexToLixTranslator getConvertExpression uses BuiltinMethod.FORMAT_TIME 
> instead of ignite's methods for formatting date/time types.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to