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 2024/10/22 02:41:44 UTC

(iotdb) branch master updated: Fix column length may be 0 when using cache fetch

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 8bf22945c15 Fix column length may be 0 when using cache fetch
8bf22945c15 is described below

commit 8bf22945c1517d354489288a3c9aca7c80778cfc
Author: FearfulTomcat27 <14...@qq.com>
AuthorDate: Tue Oct 22 10:41:38 2024 +0800

    Fix column length may be 0 when using cache fetch
---
 .../org/apache/iotdb/db/it/query/IoTDBCaseWhenThenIT.java    | 12 ++++++++++++
 .../iotdb/relational/it/db/it/IoTDBCaseWhenThenTableIT.java  |  8 ++++++++
 .../dag/column/binary/LogicAndColumnTransformer.java         |  2 +-
 .../dag/column/binary/LogicOrColumnTransformer.java          |  2 +-
 .../dag/column/multi/LogicalAndMultiColumnTransformer.java   |  2 +-
 .../dag/column/multi/LogicalOrMultiColumnTransformer.java    |  2 +-
 .../dag/column/multi/MappableUDFColumnTransformer.java       |  2 +-
 7 files changed, 25 insertions(+), 5 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 e1a548ff6c1..e2c60bd644e 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
@@ -888,6 +888,18 @@ public class IoTDBCaseWhenThenIT {
     resultSetEqualTest(sql, expectedHeader, retArray);
   }
 
+  @Test
+  public void testKind1Logic() {
+    String sql =
+        "select case when s3 >= 0 and s3 < 20 and s4 >= 50 and s4 < 60 then 'just so so~~~' when s3 >= 20 and s3 < 40 and s4 >= 70 and s4 < 80 then 'very well~~~' end as result from root.sg.d2";
+    String[] expectedHeader = new String[] {TIMESTAMP_STR, "result"};
+    String[] retArray =
+        new String[] {
+          "0,null,", "1000000,just so so~~~,", "20000000,null,", "210000000,very well~~~,",
+        };
+    resultSetEqualTest(sql, expectedHeader, retArray);
+  }
+
   @Test
   public void testMultipleSatisfyCase() {
     // Test the result when two when clause are satisfied
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 94d87b01ce2..58f25866a65 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
@@ -660,4 +660,12 @@ public class IoTDBCaseWhenThenTableIT {
         };
     tableResultSetEqualTest(sql, expectedHeader, retArray, DATABASE);
   }
+
+  @Test
+  public void testKind1Logic() {
+    String sql =
+        "select case when s3 >= 0 and s3 < 20 and s4 >= 50 and s4 < 60 then 'just so so~~~' when s3 >= 20 and s3 < 40 and s4 >= 70 and s4 < 80 then 'very well~~~' end from table2";
+    String[] retArray = new String[] {"null,", "just so so~~~,", "null,", "very well~~~,"};
+    tableResultSetEqualTest(sql, expectedHeader, retArray, DATABASE);
+  }
 }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/LogicAndColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/LogicAndColumnTransformer.java
index e5471e1ddeb..7a68e5fa030 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/LogicAndColumnTransformer.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/LogicAndColumnTransformer.java
@@ -36,8 +36,8 @@ public class LogicAndColumnTransformer extends LogicBinaryColumnTransformer {
     boolean[] selectionCopy = selection.clone();
 
     leftTransformer.evaluateWithSelection(selectionCopy);
-    Column leftColumn = leftTransformer.getColumn();
     int positionCount = leftTransformer.getColumnCachePositionCount();
+    Column leftColumn = leftTransformer.getColumn();
 
     for (int i = 0; i < positionCount; i++) {
       if (!leftColumn.isNull(i) && !leftColumn.getBoolean(i)) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/LogicOrColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/LogicOrColumnTransformer.java
index 5971c1dc4e1..064ad6974da 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/LogicOrColumnTransformer.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/LogicOrColumnTransformer.java
@@ -36,8 +36,8 @@ public class LogicOrColumnTransformer extends LogicBinaryColumnTransformer {
     boolean[] selectionCopy = selection.clone();
 
     leftTransformer.evaluateWithSelection(selectionCopy);
-    Column leftColumn = leftTransformer.getColumn();
     int positionCount = leftTransformer.getColumnCachePositionCount();
+    Column leftColumn = leftTransformer.getColumn();
 
     for (int i = 0; i < positionCount; i++) {
       if (!leftColumn.isNull(i) && leftColumn.getBoolean(i)) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/LogicalAndMultiColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/LogicalAndMultiColumnTransformer.java
index d7b6315ce72..321f03b186b 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/LogicalAndMultiColumnTransformer.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/LogicalAndMultiColumnTransformer.java
@@ -54,7 +54,7 @@ public class LogicalAndMultiColumnTransformer extends LogicalMultiColumnTransfor
       }
     }
 
-    int positionCount = columnTransformerList.get(0).getColumnCachePositionCount();
+    int positionCount = childrenColumns.get(0).getPositionCount();
     ColumnBuilder builder = returnType.createColumnBuilder(positionCount);
     for (int i = 0; i < positionCount; i++) {
       if (selection[i]) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/LogicalOrMultiColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/LogicalOrMultiColumnTransformer.java
index d1778b13426..9164ec578ee 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/LogicalOrMultiColumnTransformer.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/LogicalOrMultiColumnTransformer.java
@@ -54,7 +54,7 @@ public class LogicalOrMultiColumnTransformer extends LogicalMultiColumnTransform
       }
     }
 
-    int positionCount = columnTransformerList.get(0).getColumnCachePositionCount();
+    int positionCount = childColumns.get(0).getPositionCount();
     ColumnBuilder builder = returnType.createColumnBuilder(positionCount);
 
     for (int i = 0; i < positionCount; i++) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/MappableUDFColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/MappableUDFColumnTransformer.java
index ff8e317dd7a..440585eed78 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/MappableUDFColumnTransformer.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/multi/MappableUDFColumnTransformer.java
@@ -67,7 +67,7 @@ public class MappableUDFColumnTransformer extends ColumnTransformer {
       columns[i] = inputColumnTransformers[i].getColumn();
     }
     // construct input TsBlock with columns
-    int positionCount = inputColumnTransformers[0].getColumnCachePositionCount();
+    int positionCount = columns[0].getPositionCount();
     ColumnBuilder builder = returnType.createColumnBuilder(positionCount);
     // executor UDF and cache result
     executor.execute(columns, builder);