[Bug] Regression of SQL command "SELECT M4..." between version 1.3.5 and 2.0.5
- Ngôn ngữ chính
- Java
- Star
- 6.4k
- Fork
- 1.2k
- Merge trung bình
- 1 ngày 23 giờ
- Pull request đã merge (30 ngày)
- 115
Mô tả
### 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!
Hướng dẫn đóng góp
Hướng nghiên cứu
Tái hiện truy vấn M4 trên IoTDB 2.0.5 với ranh giới cửa sổ hiển thị đã được báo cáo, sau đó bắt đầu từ SingleInputSingleReferenceLayer.java:224 và lần theo luồng qua UDFQueryRowWindowTransformer. So sánh truy vấn bị lỗi với hành vi hoạt động trên 1.3.5. Hoàn tất khi truy vấn thực thi thành công trên toàn bộ phạm vi đã báo cáo mà không xảy ra ClassCastException LongColumn-to-TimeColumn.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- java, sql
- Lĩnh vực
- databases
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 45/100