Skip to content

[Bug] Regression of SQL command "SELECT M4..." between version 1.3.5 and 2.0.5 #16539

@philippe-verdier-oros

Description

@philippe-verdier-oros

Search before asking

  • I searched in the issues and found nothing similar.

Version

Windows 10 64 bits and Linux ARM 64 bits (Linux raspberrybuild 6.6.62+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.62-1+rpt1 (2024-11-25) aarch64 GNU/Linux)
iotdb version 2.0.5

Describe the bug and provide the minimal reproduce step

I created an IOTDB database with a single double scalar and over 400,000 rows.
Using the SQL command "select M4...", I can't read past column 323999, regardless of the starting column. I can read all the data with the command "select id1 from root.** where time >..", and the command "select count(id1) from root.**" returns the correct number of rows.
The problem occurs on Windows 10 64-bit and Linux 64-bit (on a Raspberry Pi 4) with version 2.0.5 but not with version 1.3.5.

What did you expect to see?

select M4(id1,'timeInterval'='400','displayWindowBegin'='323000','displayWindowEnd'='323999') from root.bb1.ctx1
+----------------------------+------------------------------------------------------------------------------------------------------+
| Time|M4(root.bb1.ctx1.id1, ​​"timeInterval"="400", "displayWindowBegin"="323000", "displayWindowEnd"="323999")|
+----------------------------+------------------------------------------------------------------------------------------------------+
|1970-01-01T01:05:23.000+01:00| 20.0|
|1970-01-01T01:05:23.399+01:00| 150.0|
|1970-01-01T01:05:23.400+01:00| 20.0|
|1970-01-01T01:05:23.799+01:00| 150.0|
|1970-01-01T01:05:23.800+01:00| 20.0|
|1970-01-01T01:05:23.849+01:00| 150.0|
|1970-01-01T01:05:23.998+01:00| 140.0|
+----------------------------+------------------------------------------------------------------------------------------------------+
Total line number = 7
It costs 0.094s

What did you see instead?

select M4(id1,'timeInterval'='400','displayWindowBegin'='323000','displayWindowEnd'='324000') from root.bb1.ctx1
Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 301: org.apache.tsfile.read.common.block.column.LongColumn cannot be cast to org.apache.tsfile.read.common.block.column.TimeColumn

And the traces in the "IoTDBDataNode" console for the last command:
2025-10-07 15:36:29,566 [Query-Worker-Thread-15$20251007_133629_00007_1.1.0.0] INFO o.a.i.d.q.e.s.DriverScheduler$Scheduler:581 - The task 20251007_133629_00007_1.1.0.0 is aborted. All other tasks in the same query will be cancelled
2025-10-07 15:36:29,566 [pool-45-IoTDB-ClientRPC-Processor-1] WARN o.a.i.d.u.ErrorHandlingUtils:126 - Status code: 301, Query Statement: "select M4(id1,'timeInterval'='400','displayWindowBegin'='323000','displayWindowEnd'='324000') from root.bb1.ctx1". executeStatement failed because org.apache.tsfile.read.common.block.column.LongColumn cannot be cast to org.apache.tsfile.read.common.block.column.TimeColumn
org.apache.iotdb.commons.exception.IoTDBException: java.lang.ClassCastException: org.apache.tsfile.read.common.block.column.LongColumn cannot be cast to org.apache.tsfile.read.common.block.column.TimeColumn
at org.apache.iotdb.db.queryengine.plan.execution.QueryExecution.dealWithException(QueryExecution.java:479)
at org.apache.iotdb.db.queryengine.plan.execution.QueryExecution.getResult(QueryExecution.java:452)
at org.apache.iotdb.db.queryengine.plan.execution.QueryExecution.getByteBufferBatchResult(QueryExecution.java:498)
at org.apache.iotdb.db.utils.QueryDataSetUtils.convertQueryResultByFetchSize(QueryDataSetUtils.java:619)
at org.apache.iotdb.db.protocol.thrift.impl.ClientRPCServiceImpl.lambda$static$0(ClientRPCServiceImpl.java:283)
at org.apache.iotdb.db.protocol.thrift.impl.ClientRPCServiceImpl.executeStatementInternal(ClientRPCServiceImpl.java:430)
at org.apache.iotdb.db.protocol.thrift.impl.ClientRPCServiceImpl.executeStatementV2(ClientRPCServiceImpl.java:919)
at org.apache.iotdb.service.rpc.thrift.IClientRPCService$Processor$executeStatementV2.getResult(IClientRPCService.java:4164)
at org.apache.iotdb.service.rpc.thrift.IClientRPCService$Processor$executeStatementV2.getResult(IClientRPCService.java:4144)
at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:38)
at org.apache.iotdb.db.protocol.thrift.ProcessorWithMetrics.process(ProcessorWithMetrics.java:64)
at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:248)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: org.apache.tsfile.read.common.block.column.LongColumn cannot be cast to org.apache.tsfile.read.common.block.column.TimeColumn
at org.apache.iotdb.db.queryengine.transformation.dag.intermediate.SingleInputSingleReferenceLayer$2.yield(SingleInputSingleReferenceLayer.java:224)
at org.apache.iotdb.db.queryengine.transformation.dag.transformer.multi.UDFQueryRowWindowTransformer.tryExecuteUDFOnce(UDFQueryRowWindowTransformer.java:42)
at org.apache.iotdb.db.queryengine.transformation.dag.transformer.multi.UniversalUDFQueryTransformer.yieldValue(UniversalUDFQueryTransformer.java:44)
at org.apache.iotdb.db.queryengine.transformation.dag.transformer.Transformer.yield(Transformer.java:41)
at org.apache.iotdb.db.queryengine.execution.operator.process.TransformOperator.iterateReaderToNextValid(TransformOperator.java:177)
at org.apache.iotdb.db.queryengine.execution.operator.process.TransformOperator.iterateAllColumnsToNextValid(TransformOperator.java:160)
at org.apache.iotdb.db.queryengine.execution.operator.process.TransformOperator.next(TransformOperator.java:265)
at org.apache.iotdb.db.queryengine.execution.operator.Operator.nextWithTimer(Operator.java:48)
at org.apache.iotdb.db.queryengine.execution.operator.sink.IdentitySinkOperator.next(IdentitySinkOperator.java:106)
at org.apache.iotdb.db.queryengine.execution.operator.Operator.nextWithTimer(Operator.java:48)
at org.apache.iotdb.db.queryengine.execution.driver.Driver.processInternal(Driver.java:241)
at org.apache.iotdb.db.queryengine.execution.driver.Driver.lambda$processFor$1(Driver.java:152)
at org.apache.iotdb.db.queryengine.execution.driver.Driver.tryWithLock(Driver.java:337)
at org.apache.iotdb.db.queryengine.execution.driver.Driver.processFor(Driver.java:133)
at org.apache.iotdb.db.queryengine.execution.schedule.DriverTaskThread.execute(DriverTaskThread.java:83)
at org.apache.iotdb.db.queryengine.execution.schedule.AbstractDriverThread.run(AbstractDriverThread.java:79)
2025-10-07 15:36:30,574 [pool-38-IoTDB-MPP-Coordinator-Scheduled-Executor-6] WARN o.a.i.d.q.e.f.FragmentInstanceContext:440 - [Unknown exception]:
java.lang.ClassCastException: org.apache.tsfile.read.common.block.column.LongColumn cannot be cast to org.apache.tsfile.read.common.block.column.TimeColumn
at org.apache.iotdb.db.queryengine.transformation.dag.intermediate.SingleInputSingleReferenceLayer$2.yield(SingleInputSingleReferenceLayer.java:224)
at org.apache.iotdb.db.queryengine.transformation.dag.transformer.multi.UDFQueryRowWindowTransformer.tryExecuteUDFOnce(UDFQueryRowWindowTransformer.java:42)
at org.apache.iotdb.db.queryengine.transformation.dag.transformer.multi.UniversalUDFQueryTransformer.yieldValue(UniversalUDFQueryTransformer.java:44)
at org.apache.iotdb.db.queryengine.transformation.dag.transformer.Transformer.yield(Transformer.java:41)
at org.apache.iotdb.db.queryengine.execution.operator.process.TransformOperator.iterateReaderToNextValid(TransformOperator.java:177)
at org.apache.iotdb.db.queryengine.execution.operator.process.TransformOperator.iterateAllColumnsToNextValid(TransformOperator.java:160)
at org.apache.iotdb.db.queryengine.execution.operator.process.TransformOperator.next(TransformOperator.java:265)
at org.apache.iotdb.db.queryengine.execution.operator.Operator.nextWithTimer(Operator.java:48)
at org.apache.iotdb.db.queryengine.execution.operator.sink.IdentitySinkOperator.next(IdentitySinkOperator.java:106)
at org.apache.iotdb.db.queryengine.execution.operator.Operator.nextWithTimer(Operator.java:48)
at org.apache.iotdb.db.queryengine.execution.driver.Driver.processInternal(Driver.java:241)
at org.apache.iotdb.db.queryengine.execution.driver.Driver.lambda$processFor$1(Driver.java:152)
at org.apache.iotdb.db.queryengine.execution.driver.Driver.tryWithLock(Driver.java:337)
at org.apache.iotdb.db.queryengine.execution.driver.Driver.processFor(Driver.java:133)
at org.apache.iotdb.db.queryengine.execution.schedule.DriverTaskThread.execute(DriverTaskThread.java:83)
at org.apache.iotdb.db.queryengine.execution.schedule.AbstractDriverThread.run(AbstractDriverThread.java:79)

Anything else?

With the 1.3.5 version the command:
select M4(id1,'timeInterval'='400','displayWindowBegin'='323000','displayWindowEnd'='324000') from root.bb1.ctx1
succeed
It is also possible to read the data from the time stamp 0 up to 400000

The command "select id1 from root.bb1.ctx1 where time > 0 and time > 400000" is able to read all the rows with the version 2.0.5 and 1.3.5

Are you willing to submit a PR?

  • I'm willing to submit a PR!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions