This is an automated email from the ASF dual-hosted git repository.

jackietien pushed a commit to branch ty/object_type
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 1c338a5f5ea8144edecf6cfb7c0157277556f200
Author: Zhihao Shen <[email protected]>
AuthorDate: Wed Nov 26 15:23:07 2025 +0800

    Fix window partiton across two TsBlock bugs (#16809)
    
    (cherry picked from commit 100c5a3c5c620a223480b6bfed2eb68c2084d1a8)
---
 .../process/window/TableWindowOperator.java        |  2 +
 .../process/window/TableWindowOperatorTest.java    | 51 ++++++++++++++++++++++
 2 files changed, 53 insertions(+)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/window/TableWindowOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/window/TableWindowOperator.java
index af46988c55e..b6fb47d601f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/window/TableWindowOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/window/TableWindowOperator.java
@@ -294,6 +294,8 @@ public class TableWindowOperator implements ProcessOperator 
{
         partitionExecutors.addLast(partitionExecutor);
 
         partitionStartInCurrentBlock = partitionEndInCurrentBlock;
+        // Reset cross-TsBlock tracking after partition completion
+        startIndexInFirstBlock = -1;
       } else {
         // Last partition of TsBlock
         // The beginning of next TsBlock may have rows in this partition
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/process/window/TableWindowOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/process/window/TableWindowOperatorTest.java
index ed0ec405a9c..9c40227661d 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/process/window/TableWindowOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/process/window/TableWindowOperatorTest.java
@@ -192,6 +192,57 @@ public class TableWindowOperatorTest {
     }
   }
 
+  @Test
+  public void testMixedPartition2() {
+    long[][] timeArray =
+        new long[][] {
+          {1, 2, 3},
+          {4, 5},
+          {6},
+        };
+    String[][] deviceIdArray =
+        new String[][] {
+          {"d1", "d1", "d2"},
+          {"d2", "d3"},
+          {"d3"},
+        };
+    int[][] valueArray =
+        new int[][] {
+          {1, 2, 3},
+          {4, 5},
+          {6},
+        };
+
+    long[] expectColumn1 = new long[] {1, 2, 3, 4, 5, 6};
+    String[] expectColumn2 = new String[] {"d1", "d1", "d2", "d2", "d3", "d3"};
+    int[] expectColumn4 = new int[] {1, 2, 3, 4, 5, 6};
+    long[] expectColumn5 = new long[] {1, 2, 1, 2, 1, 2};
+
+    int count = 0;
+    try (TableWindowOperator windowOperator =
+        genWindowOperator(timeArray, deviceIdArray, valueArray)) {
+      ListenableFuture<?> listenableFuture = windowOperator.isBlocked();
+      listenableFuture.get();
+      while (!windowOperator.isFinished() && windowOperator.hasNext()) {
+        TsBlock tsBlock = windowOperator.next();
+        if (tsBlock != null && !tsBlock.isEmpty()) {
+          for (int i = 0, size = tsBlock.getPositionCount(); i < size; i++, 
count++) {
+            assertEquals(expectColumn1[count], 
tsBlock.getColumn(0).getLong(i));
+            assertEquals(
+                expectColumn2[count],
+                
tsBlock.getColumn(1).getBinary(i).getStringValue(TSFileConfig.STRING_CHARSET));
+            assertEquals(expectColumn4[count], tsBlock.getColumn(2).getInt(i));
+            assertEquals(expectColumn5[count], 
tsBlock.getColumn(3).getLong(i));
+          }
+        }
+      }
+      assertEquals(6, count);
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
   static class ChildOperator implements Operator {
     private int index;
 

Reply via email to