You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2025/08/11 12:20:57 UTC
(iotdb) 17/47: fix: Ensure correct evaluation order in BinaryColumnTransformer
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 <14...@qq.com>
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) {