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 b2cdbe03f77 Fix display of Blob type in last query
b2cdbe03f77 is described below

commit b2cdbe03f77de38e58b3b8e1b4871ef526f9f19e
Author: Weihao Li <[email protected]>
AuthorDate: Mon Jul 14 14:00:10 2025 +0800

    Fix display of Blob type in last query
---
 .../db/it/last/IoTDBLastQueryLastCacheIT.java      | 15 +++++++++-
 .../protocol/thrift/impl/ClientRPCServiceImpl.java |  8 ++---
 .../last/AlignedUpdateLastCacheOperator.java       |  4 +--
 .../AlignedUpdateViewPathLastCacheOperator.java    |  4 +--
 .../process/last/LastQueryTransformOperator.java   |  4 +--
 .../operator/process/last/LastQueryUtil.java       | 34 ++++++++++++++++++++++
 .../process/last/UpdateLastCacheOperator.java      |  4 +--
 .../last/UpdateViewPathLastCacheOperator.java      |  4 +--
 .../plan/planner/OperatorTreeGenerator.java        |  8 ++---
 9 files changed, 66 insertions(+), 19 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/last/IoTDBLastQueryLastCacheIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/last/IoTDBLastQueryLastCacheIT.java
index 5c30e95e7bf..c4584f22fab 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/last/IoTDBLastQueryLastCacheIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/last/IoTDBLastQueryLastCacheIT.java
@@ -77,7 +77,9 @@ public class IoTDBLastQueryLastCacheIT {
         "insert into root.ln_1.tb_6141(time,`switch_BOOLEAN`) aligned 
values(1675995566000,false);",
         "create aligned timeseries root.sg(风机退出_BOOLEAN BOOLEAN 
encoding=RLE,`NH4-N_DOUBLE` DOUBLE encoding=GORILLA,膜产水状态_BOOLEAN BOOLEAN 
encoding=RLE,11_TEXT TEXT encoding=PLAIN,产水间歇运行时间设置_DOUBLE DOUBLE 
encoding=GORILLA,文本_TEXT TEXT encoding=PLAIN, 风机投入_BOOLEAN BOOLEAN 
encoding=RLE,枚举_INT32 INT32 encoding=RLE,出水TP_DOUBLE DOUBLE 
encoding=GORILLA,水管流速_DOUBLE DOUBLE encoding=GORILLA,CO2_DOUBLE DOUBLE 
encoding=GORILLA,`开关量-运行_BOOLEAN` BOOLEAN encoding=RLE,code_DOUBLE DOUBLE 
encoding=GORILLA);",
         "insert into root.sg(time,code_DOUBLE) aligned 
values(1679477545000,2.0);",
-        "insert into root.sg(time,`NH4-N_DOUBLE`) aligned 
values(1679365910000,12.0);"
+        "insert into root.sg(time,`NH4-N_DOUBLE`) aligned 
values(1679365910000,12.0);",
+        "create timeseries root.sg.d1.s1 with datatype=BLOB;",
+        "insert into root.sg.d1(time,s1) values(1,X'cafebabe')",
       };
 
   @BeforeClass
@@ -179,4 +181,15 @@ public class IoTDBLastQueryLastCacheIT {
         expectedHeader,
         retArray);
   }
+
+  @Test
+  public void testLastQuerySortWithBlobType() {
+    String[] expectedHeader =
+        new String[] {TIMESTAMP_STR, TIMESERIES_STR, VALUE_STR, DATA_TYPE_STR};
+    String[] retArray =
+        new String[] {
+          "1,root.sg.d1.s1,0xcafebabe,BLOB,",
+        };
+    resultSetEqualTest("select last s1 from root.sg.d1;", expectedHeader, 
retArray);
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
index d149d9dc4c9..bf624aa3a60 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
@@ -981,11 +981,11 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
               device2MeasurementLastEntry.getValue().entrySet()) {
             final TimeValuePair tvPair = 
measurementLastEntry.getValue().getRight();
             if (tvPair != TableDeviceLastCache.EMPTY_TIME_VALUE_PAIR) {
-              LastQueryUtil.appendLastValue(
+              LastQueryUtil.appendLastValueRespectBlob(
                   builder,
                   tvPair.getTimestamp(),
                   deviceWithSeparator + measurementLastEntry.getKey(),
-                  tvPair.getValue().getStringValue(),
+                  tvPair.getValue(),
                   measurementLastEntry.getValue().getLeft().name());
             }
           }
@@ -1116,11 +1116,11 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
             }
           } else {
             // we don't consider TTL
-            LastQueryUtil.appendLastValue(
+            LastQueryUtil.appendLastValueRespectBlob(
                 builder,
                 timeValuePair.getTimestamp(),
                 new Binary(fullPath.getFullPath(), 
TSFileConfig.STRING_CHARSET),
-                timeValuePair.getValue().getStringValue(),
+                timeValuePair.getValue(),
                 timeValuePair.getValue().getDataType().name());
           }
         }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateLastCacheOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateLastCacheOperator.java
index c7ae13af686..67aa5191db5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateLastCacheOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateLastCacheOperator.java
@@ -101,8 +101,8 @@ public class AlignedUpdateLastCacheOperator extends 
AbstractUpdateLastCacheOpera
 
   protected void appendLastValueToTsBlockBuilder(
       long lastTime, TsPrimitiveType lastValue, MeasurementPath 
measurementPath, String type) {
-    LastQueryUtil.appendLastValue(
-        tsBlockBuilder, lastTime, measurementPath.getFullPath(), 
lastValue.getStringValue(), type);
+    LastQueryUtil.appendLastValueRespectBlob(
+        tsBlockBuilder, lastTime, measurementPath.getFullPath(), lastValue, 
type);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateViewPathLastCacheOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateViewPathLastCacheOperator.java
index 5c5d4887c03..77902a10e37 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateViewPathLastCacheOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/AlignedUpdateViewPathLastCacheOperator.java
@@ -58,8 +58,8 @@ public class AlignedUpdateViewPathLastCacheOperator extends 
AlignedUpdateLastCac
   @Override
   protected void appendLastValueToTsBlockBuilder(
       long lastTime, TsPrimitiveType lastValue, MeasurementPath 
measurementPath, String type) {
-    LastQueryUtil.appendLastValue(
-        tsBlockBuilder, lastTime, outputViewPath, lastValue.getStringValue(), 
type);
+    LastQueryUtil.appendLastValueRespectBlob(
+        tsBlockBuilder, lastTime, outputViewPath, lastValue, type);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryTransformOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryTransformOperator.java
index 68b5227d726..88d67a21f97 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryTransformOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryTransformOperator.java
@@ -74,11 +74,11 @@ public class LastQueryTransformOperator implements 
ProcessOperator {
         if (tsBlock.getColumn(1).isNull(0)) {
           return null;
         }
-        LastQueryUtil.appendLastValue(
+        LastQueryUtil.appendLastValueRespectBlob(
             tsBlockBuilder,
             tsBlock.getColumn(0).getLong(0),
             viewPath,
-            tsBlock.getColumn(1).getTsPrimitiveType(0).getStringValue(),
+            tsBlock.getColumn(1).getTsPrimitiveType(0),
             dataType);
       }
     } else {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryUtil.java
index 481b8f27ddb..aadd9c8df38 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryUtil.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/LastQueryUtil.java
@@ -36,6 +36,8 @@ import org.apache.tsfile.read.filter.basic.Filter;
 import org.apache.tsfile.read.filter.operator.TimeFilterOperators.TimeGt;
 import org.apache.tsfile.read.filter.operator.TimeFilterOperators.TimeGtEq;
 import org.apache.tsfile.utils.Binary;
+import org.apache.tsfile.utils.BytesUtils;
+import org.apache.tsfile.utils.TsPrimitiveType;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -65,6 +67,38 @@ public class LastQueryUtil {
     return tsBlock.getColumn(0).getBinary(index);
   }
 
+  public static void appendLastValueRespectBlob(
+      TsBlockBuilder builder,
+      long lastTime,
+      String fullPath,
+      TsPrimitiveType lastValue,
+      String dataType) {
+    appendLastValue(
+        builder,
+        lastTime,
+        fullPath,
+        dataType.equals(TSDataType.BLOB.name())
+            ? 
BytesUtils.parseBlobByteArrayToString(lastValue.getBinary().getValues())
+            : lastValue.getStringValue(),
+        dataType);
+  }
+
+  public static void appendLastValueRespectBlob(
+      TsBlockBuilder builder,
+      long lastTime,
+      Binary fullPath,
+      TsPrimitiveType lastValue,
+      String dataType) {
+    appendLastValue(
+        builder,
+        lastTime,
+        fullPath,
+        dataType.equals(TSDataType.BLOB.name())
+            ? 
BytesUtils.parseBlobByteArrayToString(lastValue.getBinary().getValues())
+            : lastValue.getStringValue(),
+        dataType);
+  }
+
   public static void appendLastValue(
       TsBlockBuilder builder, long lastTime, String fullPath, String 
lastValue, String dataType) {
     // Time
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateLastCacheOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateLastCacheOperator.java
index 0090446c4ec..36f71f03d55 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateLastCacheOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateLastCacheOperator.java
@@ -115,8 +115,8 @@ public class UpdateLastCacheOperator extends 
AbstractUpdateLastCacheOperator {
   }
 
   protected void appendLastValueToTsBlockBuilder(long lastTime, 
TsPrimitiveType lastValue) {
-    LastQueryUtil.appendLastValue(
-        tsBlockBuilder, lastTime, fullPath.getFullPath(), 
lastValue.getStringValue(), dataType);
+    LastQueryUtil.appendLastValueRespectBlob(
+        tsBlockBuilder, lastTime, fullPath.getFullPath(), lastValue, dataType);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateViewPathLastCacheOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateViewPathLastCacheOperator.java
index aa4b35b9f83..84f8dd40b12 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateViewPathLastCacheOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/last/UpdateViewPathLastCacheOperator.java
@@ -54,8 +54,8 @@ public class UpdateViewPathLastCacheOperator extends 
UpdateLastCacheOperator {
 
   @Override
   protected void appendLastValueToTsBlockBuilder(long lastTime, 
TsPrimitiveType lastValue) {
-    LastQueryUtil.appendLastValue(
-        tsBlockBuilder, lastTime, outputViewPath, lastValue.getStringValue(), 
dataType);
+    LastQueryUtil.appendLastValueRespectBlob(
+        tsBlockBuilder, lastTime, outputViewPath, lastValue, dataType);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
index 82a6cea7448..a6a79247b0a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java
@@ -3106,11 +3106,11 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
       TsBlockBuilder builder = LastQueryUtil.createTsBlockBuilder(initSize);
       for (int i = 0; i < initSize; i++) {
         TimeValuePair timeValuePair = cachedLastValueAndPathList.get(i).left;
-        LastQueryUtil.appendLastValue(
+        LastQueryUtil.appendLastValueRespectBlob(
             builder,
             timeValuePair.getTimestamp(),
             cachedLastValueAndPathList.get(i).right,
-            timeValuePair.getValue().getStringValue(),
+            timeValuePair.getValue(),
             timeValuePair.getValue().getDataType().name());
       }
       OperatorContext operatorContext =
@@ -3133,11 +3133,11 @@ public class OperatorTreeGenerator extends 
PlanVisitor<Operator, LocalExecutionP
       TsBlockBuilder builder = LastQueryUtil.createTsBlockBuilder(initSize);
       for (int i = 0; i < initSize; i++) {
         TimeValuePair timeValuePair = cachedLastValueAndPathList.get(i).left;
-        LastQueryUtil.appendLastValue(
+        LastQueryUtil.appendLastValueRespectBlob(
             builder,
             timeValuePair.getTimestamp(),
             cachedLastValueAndPathList.get(i).right,
-            timeValuePair.getValue().getStringValue(),
+            timeValuePair.getValue(),
             timeValuePair.getValue().getDataType().name());
       }
 

Reply via email to