apache / apache/iotdb

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

未关闭
#16,539 3 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Java
星标
6.4k
派生
1.2k
平均合并
1 天 23 小时
30 天内合并 PR
115

描述

### Search before asking

- [x] I searched in the [issues](https://github.com/apache/iotdb/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!

贡献指南

打开贡献指南

调研方向

在 IoTDB 2.0.5 上使用报告的显示窗口边界复现 M4 查询,然后从 SingleInputSingleReferenceLayer.java:224 开始,跟踪经过 UDFQueryRowWindowTransformer 的调用流程。将失败的查询与 1.3.5 中正常工作的行为进行比较。当查询在报告的整个范围内成功执行且不发生 LongColumn-to-TimeColumn ClassCastException 时,即表示完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
java, sql
领域
databases
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
45/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。