apache / apache/iotdb

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

Đang mở
#16,539 3 bình luận 0 reaction 0 người được giao Xem trên GitHub
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

Mở 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

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.