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) {
