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

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

commit 530dc45eb0fd2d896412878d968f41b0a5b3b0ce
Author: FearfulTomcat27 <[email protected]>
AuthorDate: Wed Jul 23 15:20:55 2025 +0800

    fix: Ensure correct evaluation order in BinaryColumnTransformer
    
    (cherry picked from commit eab1b825da8b722820e37d1fda6e4ae71d013fef)
---
 .../org/apache/iotdb/db/it/query/IoTDBCaseWhenThenIT.java    |  9 +++++++++
 .../iotdb/relational/it/db/it/IoTDBCaseWhenThenTableIT.java  |  8 ++++++++
 .../dag/column/binary/BinaryColumnTransformer.java           |  4 +++-
 .../dag/column/multi/MultiColumnTransformer.java             | 12 +++++-------
 4 files changed, 25 insertions(+), 8 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBCaseWhenThenIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBCaseWhenThenIT.java
index e2c60bd644e..a88b89e90b5 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBCaseWhenThenIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBCaseWhenThenIT.java
@@ -919,4 +919,13 @@ public class IoTDBCaseWhenThenIT {
         };
     resultSetEqualTest(sql, expectedHeader, retArray);
   }
+
+  @Test
+  public void testThenWithBinarySameConstant() {
+    String sql = "SELECT CASE WHEN true THEN 200 + (s1 - 200) END AS result 
FROM root.sg.d1";
+    String[] expectedHeader = new String[] {TIMESTAMP_STR, "result"};
+    String[] retArray =
+        new String[] {"0,0.0,", "1000000,11.0,", "20000000,22.0,", 
"210000000,33.0,"};
+    resultSetEqualTest(sql, expectedHeader, retArray);
+  }
 }
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBCaseWhenThenTableIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBCaseWhenThenTableIT.java
index 1470546f4f8..5611c9f5524 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBCaseWhenThenTableIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBCaseWhenThenTableIT.java
@@ -673,4 +673,12 @@ public class IoTDBCaseWhenThenTableIT {
     String[] retArray = new String[] {"null,", "just so so~~~,", "null,", 
"very well~~~,"};
     tableResultSetEqualTest(sql, expectedHeader, retArray, DATABASE);
   }
+
+  @Test
+  public void testThenWithBinarySameConstant() {
+    String sql = "SELECT CASE WHEN true THEN 200 + (s1 - 200) END AS result 
FROM table1";
+    String[] expectedHeader = new String[] {"result"};
+    String[] retArray = new String[] {"0,", "11,", "22,", "33,"};
+    tableResultSetEqualTest(sql, expectedHeader, retArray, DATABASE);
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/BinaryColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/BinaryColumnTransformer.java
index c27f5ec038e..75dcb6dc17e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/BinaryColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/BinaryColumnTransformer.java
@@ -56,10 +56,12 @@ public abstract class BinaryColumnTransformer extends 
ColumnTransformer {
   @Override
   public void evaluateWithSelection(boolean[] selection) {
     leftTransformer.evaluateWithSelection(selection);
-    rightTransformer.evaluateWithSelection(selection);
     // attention: get positionCount before calling getColumn
     int positionCount = leftTransformer.getColumnCachePositionCount();
     Column leftColumn = leftTransformer.getColumn();
+    // When the rightTransformer has the same constant as the leftTransformer, 
the leftTransformer's
+    // cache will be cleared, so need to getColumn before evaluate 
rightTransformer.
+    rightTransformer.evaluateWithSelection(selection);
     Column rightColumn = rightTransformer.getColumn();
 
     ColumnBuilder builder = returnType.createColumnBuilder(positionCount);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/MultiColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/MultiColumnTransformer.java
index 2a73affe28d..8045edc4a53 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/MultiColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/MultiColumnTransformer.java
@@ -25,6 +25,7 @@ import org.apache.tsfile.block.column.Column;
 import org.apache.tsfile.block.column.ColumnBuilder;
 import org.apache.tsfile.read.common.type.Type;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -60,20 +61,17 @@ public abstract class MultiColumnTransformer extends 
ColumnTransformer {
 
   @Override
   public void evaluateWithSelection(boolean[] selection) {
+    List<Column> childrenColumns = new ArrayList<>();
+
     for (ColumnTransformer child : columnTransformerList) {
       child.evaluateWithSelection(selection);
+      childrenColumns.add(child.getColumn());
     }
 
     int positionCount = 
columnTransformerList.get(0).getColumnCachePositionCount();
 
     ColumnBuilder builder = returnType.createColumnBuilder(positionCount);
-    doTransform(
-        columnTransformerList.stream()
-            .map(ColumnTransformer::getColumn)
-            .collect(Collectors.toList()),
-        builder,
-        positionCount,
-        selection);
+    doTransform(childrenColumns, builder, positionCount, selection);
     initializeColumnCache(builder.build());
 
     for (ColumnTransformer child : columnTransformerList) {

Reply via email to