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

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

commit b9154ca69f89a7752991386543f9c85681ecdff4
Author: JackieTien97 <[email protected]>
AuthorDate: Fri Sep 20 16:39:05 2024 +0800

    Support no measurement columns in the select clause
---
 .../it/query/recent/IoTDBNullIdQueryIT.java        | 111 ++++++++++++++++++++-
 .../schemaregion/utils/ResourceByPathUtils.java    |   5 +-
 .../apache/iotdb/db/utils/ModificationUtils.java   |   4 +
 3 files changed, 115 insertions(+), 5 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBNullIdQueryIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBNullIdQueryIT.java
index 7c76e2fac66..1934fd5f31f 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBNullIdQueryIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBNullIdQueryIT.java
@@ -54,20 +54,21 @@ public class IoTDBNullIdQueryIT {
         "USE " + DATABASE_NAME,
         "CREATE TABLE testNullId(id1 STRING ID, id2 STRING ID, s1 INT32 
MEASUREMENT, s2 BOOLEAN MEASUREMENT, s3 DOUBLE MEASUREMENT)",
         "INSERT INTO testNullId(time,id1,id2,s1,s2,s3) " + "values(1, null, 
null, 0, false, 11.1)",
-        "CREATE TABLE table1(device_id STRING ID, s1 INT32 MEASUREMENT, s2 
BOOLEAN MEASUREMENT, s3 INT64 MEASUREMENT)",
+        "CREATE TABLE table1(device_id STRING ID, color STRING ATTRIBUTE, s1 
INT32 MEASUREMENT, s2 BOOLEAN MEASUREMENT, s3 INT64 MEASUREMENT)",
         // in seq disk
-        "INSERT INTO table1(time,device_id,s1,s2,s3) " + "values(1, 'd1', 1, 
false, 11)",
+        "INSERT INTO table1(time,device_id,color,s1,s2,s3) "
+            + "values(1, 'd1', 'green', 1, false, 11)",
         "INSERT INTO table1(time,device_id,s1) " + "values(5, 'd1', 5)",
         "FLUSH",
         // in uneq disk
         "INSERT INTO table1(time,device_id,s1,s2,s3) " + "values(4, 'd1', 4, 
true, 44)",
-        "INSERT INTO table1(time,device_id,s1) " + "values(3, 'd1', 3)",
+        "INSERT INTO table1(time,device_id,color,s1) " + "values(3, 'd1', 
'green', 3)",
         "FLUSH",
         // in seq memtable
         "INSERT INTO table1(time,device_id,s1,s2,s3) " + "values(7, 'd1', 7, 
false, 77)",
         "INSERT INTO table1(time,device_id,s1) " + "values(6, 'd1', 6)",
         // in unseq memtable
-        "INSERT INTO table1(time,device_id,s1) " + "values(2, 'd1', 2)",
+        "INSERT INTO table1(time,device_id,color,s1) " + "values(2, 'd1', 
'green', 2)",
       };
 
   @BeforeClass
@@ -309,4 +310,106 @@ public class IoTDBNullIdQueryIT {
         retArray,
         DATABASE_NAME);
   }
+
+  @Test
+  public void noMeasurementColumnsSelectTest() {
+    String[] expectedHeader = new String[] {"time"};
+    String[] retArray =
+        new String[] {
+          "1970-01-01T00:00:00.001Z,",
+          "1970-01-01T00:00:00.002Z,",
+          "1970-01-01T00:00:00.003Z,",
+          "1970-01-01T00:00:00.004Z,",
+          "1970-01-01T00:00:00.005Z,",
+          "1970-01-01T00:00:00.006Z,",
+          "1970-01-01T00:00:00.007Z,"
+        };
+    tableResultSetEqualTest("select time from table1", expectedHeader, 
retArray, DATABASE_NAME);
+
+    expectedHeader = new String[] {"device_id"};
+    retArray = new String[] {"d1,", "d1,", "d1,", "d1,", "d1,", "d1,"};
+    tableResultSetEqualTest(
+        "select device_id from table1 where time > 1", expectedHeader, 
retArray, DATABASE_NAME);
+
+    expectedHeader = new String[] {"color"};
+    retArray = new String[] {"green,", "green,", "green,", "green,", "green,", 
"green,"};
+    tableResultSetEqualTest(
+        "select color from table1 where time > 1", expectedHeader, retArray, 
DATABASE_NAME);
+
+    expectedHeader = new String[] {"time", "device_id"};
+    retArray =
+        new String[] {
+          "1970-01-01T00:00:00.001Z,d1,",
+          "1970-01-01T00:00:00.002Z,d1,",
+          "1970-01-01T00:00:00.003Z,d1,",
+          "1970-01-01T00:00:00.004Z,d1,",
+          "1970-01-01T00:00:00.005Z,d1,",
+          "1970-01-01T00:00:00.006Z,d1,",
+        };
+    tableResultSetEqualTest(
+        "select time, device_id from table1 where time < 7",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    expectedHeader = new String[] {"time", "device_id", "color"};
+    retArray =
+        new String[] {
+          "1970-01-01T00:00:00.001Z,d1,green,",
+          "1970-01-01T00:00:00.002Z,d1,green,",
+          "1970-01-01T00:00:00.003Z,d1,green,",
+          "1970-01-01T00:00:00.004Z,d1,green,",
+          "1970-01-01T00:00:00.005Z,d1,green,",
+          "1970-01-01T00:00:00.006Z,d1,green,",
+        };
+    tableResultSetEqualTest(
+        "select time, device_id, color from table1 where time < 7",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    expectedHeader = new String[] {"device_id", "color"};
+    retArray =
+        new String[] {
+          "d1,green,",
+        };
+    tableResultSetEqualTest(
+        "select device_id, color from table1 where device_id='d1' limit 1",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    expectedHeader = new String[] {"color"};
+    retArray =
+        new String[] {
+          "green,",
+        };
+    tableResultSetEqualTest(
+        "select color from table1 where device_id='d1' limit 1",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    expectedHeader = new String[] {"time"};
+    retArray =
+        new String[] {
+          "1970-01-01T00:00:00.003Z,", "1970-01-01T00:00:00.004Z,", 
"1970-01-01T00:00:00.005Z,",
+        };
+    tableResultSetEqualTest(
+        "select time from table1 where time >= 3 and time <= 5 and 
device_id='d1'",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    expectedHeader = new String[] {"time"};
+    retArray =
+        new String[] {
+          "1970-01-01T00:00:00.003Z,", "1970-01-01T00:00:00.004Z,", 
"1970-01-01T00:00:00.005Z,",
+        };
+    tableResultSetEqualTest(
+        "select time from table1 where time >= 3 and time < 6 and 
color='green'",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java
index c2bb9a00f1a..c356d8c5c88 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java
@@ -43,6 +43,7 @@ import org.apache.tsfile.file.metadata.IChunkMetadata;
 import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.ITimeSeriesMetadata;
 import org.apache.tsfile.file.metadata.TimeseriesMetadata;
+import org.apache.tsfile.file.metadata.enums.CompressionType;
 import org.apache.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.tsfile.file.metadata.statistics.Statistics;
 import org.apache.tsfile.read.common.TimeRange;
@@ -254,7 +255,9 @@ class AlignedResourceByPathUtils extends 
ResourceByPathUtils {
         array,
         types,
         encodings,
-        alignedFullPath.getSchemaList().get(0).getCompressor());
+        // considering that compressor won't be used in memtable scan, so here 
passing
+        // CompressionType.UNCOMPRESSED just as a placeholder
+        CompressionType.UNCOMPRESSED);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java
index 5ecdc354ddc..6dc09d0ae1a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ModificationUtils.java
@@ -34,6 +34,7 @@ import org.apache.tsfile.utils.Pair;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import static 
org.apache.iotdb.commons.conf.IoTDBConstant.ONE_LEVEL_PATH_WILDCARD;
@@ -313,6 +314,9 @@ public class ModificationUtils {
       IMemTable memTable,
       List<Pair<Modification, IMemTable>> modsToMemtable,
       long timeLowerBound) {
+    if (measurementList.isEmpty()) {
+      return Collections.emptyList();
+    }
     List<Modification> modifications =
         ModificationUtils.getModificationsForMemtable(memTable, 
modsToMemtable);
     List<List<TimeRange>> deletionList = new ArrayList<>();

Reply via email to