This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch object_type in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit be06663ff4af6409a53c247ac7ce7ee12f69e249 Author: Weihao Li <[email protected]> AuthorDate: Mon Jul 14 14:00:10 2025 +0800 Fix display of Blob type in last query (cherry picked from commit b2cdbe03f77de38e58b3b8e1b4871ef526f9f19e) --- .../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 b1ecfda15e3..12764b8e2ee 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 @@ -984,11 +984,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()); } } @@ -1119,11 +1119,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()); }
