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());
}