Skip to content

Commit eab1b82

Browse files
fix: Ensure correct evaluation order in BinaryColumnTransformer
1 parent 10d288d commit eab1b82

4 files changed

Lines changed: 25 additions & 8 deletions

File tree

integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBCaseWhenThenIT.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,4 +919,13 @@ public void testMultipleSatisfyCase() {
919919
};
920920
resultSetEqualTest(sql, expectedHeader, retArray);
921921
}
922+
923+
@Test
924+
public void testThenWithBinarySameConstant() {
925+
String sql = "SELECT CASE WHEN true THEN 200 + (s1 - 200) END AS result FROM root.sg.d1";
926+
String[] expectedHeader = new String[] {TIMESTAMP_STR, "result"};
927+
String[] retArray =
928+
new String[] {"0,0.0,", "1000000,11.0,", "20000000,22.0,", "210000000,33.0,"};
929+
resultSetEqualTest(sql, expectedHeader, retArray);
930+
}
922931
}

integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBCaseWhenThenTableIT.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,4 +673,12 @@ public void testKind1Logic() {
673673
String[] retArray = new String[] {"null,", "just so so~~~,", "null,", "very well~~~,"};
674674
tableResultSetEqualTest(sql, expectedHeader, retArray, DATABASE);
675675
}
676+
677+
@Test
678+
public void testThenWithBinarySameConstant() {
679+
String sql = "SELECT CASE WHEN true THEN 200 + (s1 - 200) END AS result FROM table1";
680+
String[] expectedHeader = new String[] {"result"};
681+
String[] retArray = new String[] {"0,", "11,", "22,", "33,"};
682+
tableResultSetEqualTest(sql, expectedHeader, retArray, DATABASE);
683+
}
676684
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/BinaryColumnTransformer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,12 @@ public void evaluate() {
5656
@Override
5757
public void evaluateWithSelection(boolean[] selection) {
5858
leftTransformer.evaluateWithSelection(selection);
59-
rightTransformer.evaluateWithSelection(selection);
6059
// attention: get positionCount before calling getColumn
6160
int positionCount = leftTransformer.getColumnCachePositionCount();
6261
Column leftColumn = leftTransformer.getColumn();
62+
// When the rightTransformer has the same constant as the leftTransformer, the leftTransformer's
63+
// cache will be cleared, so need to getColumn before evaluate rightTransformer.
64+
rightTransformer.evaluateWithSelection(selection);
6365
Column rightColumn = rightTransformer.getColumn();
6466

6567
ColumnBuilder builder = returnType.createColumnBuilder(positionCount);

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/MultiColumnTransformer.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.tsfile.block.column.ColumnBuilder;
2626
import org.apache.tsfile.read.common.type.Type;
2727

28+
import java.util.ArrayList;
2829
import java.util.List;
2930
import java.util.stream.Collectors;
3031

@@ -60,20 +61,17 @@ public void evaluate() {
6061

6162
@Override
6263
public void evaluateWithSelection(boolean[] selection) {
64+
List<Column> childrenColumns = new ArrayList<>();
65+
6366
for (ColumnTransformer child : columnTransformerList) {
6467
child.evaluateWithSelection(selection);
68+
childrenColumns.add(child.getColumn());
6569
}
6670

6771
int positionCount = columnTransformerList.get(0).getColumnCachePositionCount();
6872

6973
ColumnBuilder builder = returnType.createColumnBuilder(positionCount);
70-
doTransform(
71-
columnTransformerList.stream()
72-
.map(ColumnTransformer::getColumn)
73-
.collect(Collectors.toList()),
74-
builder,
75-
positionCount,
76-
selection);
74+
doTransform(childrenColumns, builder, positionCount, selection);
7775
initializeColumnCache(builder.build());
7876

7977
for (ColumnTransformer child : columnTransformerList) {

0 commit comments

Comments
 (0)