This is an automated email from the ASF dual-hosted git repository.
caogaofei pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/dev/1.3 by this push:
new 87c597d97f0 Fix error in string/timestamp/date/blob data type + sort +
limit usage in version 1.3.x (#14323)
87c597d97f0 is described below
commit 87c597d97f00ae7b737f45c6da4741e4dc6a1df0
Author: Beyyes <[email protected]>
AuthorDate: Thu Dec 5 18:39:26 2024 +0800
Fix error in string/timestamp/date/blob data type + sort + limit usage in
version 1.3.x (#14323)
---
.../apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java | 35 ++++++++++++++++++----
.../execution/operator/process/TopKOperator.java | 8 +++++
.../process/join/merge/MergeSortComparator.java | 4 +++
3 files changed, 42 insertions(+), 5 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java
index 6a65ab1ed7e..097fa98281f 100644
---
a/integration-test/src/test/java/org/apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java
+++
b/integration-test/src/test/java/org/apache/iotdb/db/it/orderBy/IoTDBOrderByIT.java
@@ -38,6 +38,7 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.util.Objects;
+import static org.apache.iotdb.db.it.utils.TestUtils.resultSetEqualTest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
@@ -97,6 +98,12 @@ public class IoTDBOrderByIT {
"insert into root.sg.d2(timestamp,num,bigNum,floatNum,str,bool)
values(51536000000,15,3147483648,235.213,\"watermelon\",TRUE)"
};
+ private static final String[] sql3 =
+ new String[] {
+ "create aligned timeseries root.test.dev (v_timestamp TIMESTAMP,
v_string STRING, v_date DATE, v_blob BLOB encoding=PLAIN, v_int32 INT32);",
+ "insert into root.test.dev(timestamp, v_timestamp, v_string, v_date,
v_blob, v_int32) aligned values(1, 2024-09-20T06:15:35.000+00:00, 'e1',
'2012-12-12', X'108DCD62', 1);"
+ };
+
@BeforeClass
public static void setUp() throws Exception {
EnvFactory.getEnv().getConfig().getDataNodeCommonConfig().setSortBufferSize(1024
* 1024L);
@@ -112,12 +119,13 @@ public class IoTDBOrderByIT {
protected static void insertData() {
try (Connection connection = EnvFactory.getEnv().getConnection();
Statement statement = connection.createStatement()) {
- for (String sql : sql) {
- statement.execute(sql);
- }
- for (String sql : sql2) {
- statement.execute(sql);
+
+ for (String[] sqlList : java.util.Arrays.asList(sql, sql2, sql3)) {
+ for (String sql : sqlList) {
+ statement.execute(sql);
+ }
}
+
} catch (Exception e) {
e.printStackTrace();
}
@@ -192,6 +200,23 @@ public class IoTDBOrderByIT {
}
}
+ @Test
+ public void newDataTypeTest() {
+ String[] expectedHeader =
+ new String[]
{"Time,Device,v_int32,v_blob,v_date,v_timestamp,v_string"};
+ String[] retArray =
+ new String[] {
+ "1,root.test.dev,1,0x108dcd62,2012-12-12,1726812935000,e1,",
+ };
+
+ for (String key : new String[] {"time", "v_int32", "v_date",
"v_timestamp", "v_string"}) {
+ resultSetEqualTest(
+ String.format("SELECT * FROM root.test.dev ORDER BY %s LIMIT 1 ALIGN
BY DEVICE", key),
+ expectedHeader,
+ retArray);
+ }
+ }
+
// 1. One-level order by test
@Test
public void orderByTest1() {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/TopKOperator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/TopKOperator.java
index ad4e04e2aed..08d03384693 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/TopKOperator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/TopKOperator.java
@@ -281,11 +281,13 @@ public class TopKOperator implements ProcessOperator {
new boolean[positionCount]);
break;
case INT32:
+ case DATE:
columns[i] =
new IntColumn(
positionCount, Optional.of(new boolean[positionCount]), new
int[positionCount]);
break;
case INT64:
+ case TIMESTAMP:
columns[i] =
new LongColumn(
positionCount, Optional.of(new boolean[positionCount]), new
long[positionCount]);
@@ -303,6 +305,8 @@ public class TopKOperator implements ProcessOperator {
new double[positionCount]);
break;
case TEXT:
+ case STRING:
+ case BLOB:
columns[i] =
new BinaryColumn(
positionCount,
@@ -366,14 +370,18 @@ public class TopKOperator implements ProcessOperator {
break;
case INT32:
case FLOAT:
+ case DATE:
memory += 4;
break;
case INT64:
case DOUBLE:
case VECTOR:
+ case TIMESTAMP:
memory += 8;
break;
case TEXT:
+ case STRING:
+ case BLOB:
memory += 16;
break;
default:
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/join/merge/MergeSortComparator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/join/merge/MergeSortComparator.java
index c299a368e73..4b8afe4e39e 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/join/merge/MergeSortComparator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/join/merge/MergeSortComparator.java
@@ -70,11 +70,13 @@ public class MergeSortComparator {
Comparator<SortKey> comparator;
switch (dataType) {
case INT32:
+ case DATE:
comparator =
Comparator.comparingInt(
(SortKey sortKey) ->
sortKey.tsBlock.getColumn(index).getInt(sortKey.rowIndex));
break;
case INT64:
+ case TIMESTAMP:
comparator =
Comparator.comparingLong(
(SortKey sortKey) ->
sortKey.tsBlock.getColumn(index).getLong(sortKey.rowIndex));
@@ -90,6 +92,8 @@ public class MergeSortComparator {
(SortKey sortKey) ->
sortKey.tsBlock.getColumn(index).getDouble(sortKey.rowIndex));
break;
case TEXT:
+ case BLOB:
+ case STRING:
comparator =
Comparator.comparing(
(SortKey sortKey) ->
sortKey.tsBlock.getColumn(index).getBinary(sortKey.rowIndex));