You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ca...@apache.org on 2024/07/25 14:26:26 UTC

(iotdb) branch ty/TableModelGrammar updated: Add more table it

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

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


The following commit(s) were added to refs/heads/ty/TableModelGrammar by this push:
     new 819e5a42b61 Add more table it
819e5a42b61 is described below

commit 819e5a42b61d909ff80283d26846e0c7c29f6229
Author: Beyyes <cg...@foxmail.com>
AuthorDate: Thu Jul 25 22:26:20 2024 +0800

    Add more table it
---
 .../java/org/apache/iotdb/itbase/env/BaseEnv.java  |    5 +
 ...rmatIT.java => IoTDBDatetimeFormatTableIT.java} |    2 +-
 ...edQueryIT.java => IoTDBNestedQueryTableIT.java} |    2 +-
 ...ice2IT.java => IoTDBAlignByDeviceTable2IT.java} |    2 +-
 ...ice3IT.java => IoTDBAlignByDeviceTable3IT.java} |    2 +-
 ...eviceIT.java => IoTDBAlignByDeviceTableIT.java} |    2 +-
 ...=> IoTDBAlignByDeviceWithTemplateTable2IT.java} |    2 +-
 ... => IoTDBAlignByDeviceWithTemplateTableIT.java} |    2 +-
 ...DBOrderByLimitOffsetAlignByDeviceTable2IT.java} |    4 +-
 ...TDBOrderByLimitOffsetAlignByDeviceTableIT.java} |    6 +-
 ... => IoTDBOrderByWithAlignByDeviceTable2IT.java} |    2 +-
 ... => IoTDBOrderByWithAlignByDeviceTable3IT.java} |    2 +-
 ...a => IoTDBOrderByWithAlignByDeviceTableIT.java} |    2 +-
 .../IoTDBAlignedOffsetLimitPushDownTableIT.java    |  156 +
 .../IoTDBAlignedSeriesQueryTable2IT.java}          |   17 +-
 .../IoTDBAlignedSeriesQueryTable3IT.java}          |   19 +-
 .../IoTDBAlignedSeriesQueryTable4IT.java}          |   19 +-
 .../IoTDBAlignedSeriesQueryTable5IT.java}          |   18 +-
 .../aligned/IoTDBAlignedSeriesQueryTableIT.java    | 3678 ++++++++++++++++++++
 .../IoTDBPredicatePushDownTable2IT.java}           |   15 +-
 .../IoTDBPredicatePushDownTable3IT.java}           |   17 +-
 .../IoTDBPredicatePushDownTable4IT.java}           |   15 +-
 .../old/aligned/IoTDBPredicatePushDownTableIT.java |  683 ++++
 .../it/query/old/aligned/TableUtils.java           |  216 ++
 ...nctionIT.java => IoTDBCastFunctionTableIT.java} |    2 +-
 ...tion2IT.java => IoTDBDiffFunctionTable2IT.java} |    2 +-
 ...tion3IT.java => IoTDBDiffFunctionTable3IT.java} |    2 +-
 ...nctionIT.java => IoTDBDiffFunctionTableIT.java} |    2 +-
 ...ionIT.java => IoTDBReplaceFunctionTableIT.java} |    2 +-
 ...ctionIT.java => IoTDBRoundFunctionTableIT.java} |    2 +-
 ...nIT.java => IoTDBSubStringFunctionTableIT.java} |    2 +-
 .../it/query/old/orderBy/IoTDBOrderByTableIT.java  | 1566 +++++++++
 .../plan/planner/TableOperatorGenerator.java       |    2 +-
 .../planner/ir/NormalizeOrExpressionRewriter.java  |    5 -
 .../relational/planner/node/StreamSortNode.java    |    2 +-
 35 files changed, 6413 insertions(+), 64 deletions(-)

diff --git a/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java b/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java
index 25454caf871..1d721aaa798 100644
--- a/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java
+++ b/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java
@@ -109,6 +109,11 @@ public interface BaseEnv {
         SessionConfig.DEFAULT_USER, SessionConfig.DEFAULT_PASSWORD, TREE_SQL_DIALECT);
   }
 
+  default Connection getTableConnection() throws SQLException {
+    return getConnection(
+        SessionConfig.DEFAULT_USER, SessionConfig.DEFAULT_PASSWORD, TABLE_SQL_DIALECT);
+  }
+
   default Connection getConnection(String sqlDialect) throws SQLException {
     return getConnection(SessionConfig.DEFAULT_USER, SessionConfig.DEFAULT_PASSWORD, sqlDialect);
   }
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBDatetimeFormatIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBDatetimeFormatTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBDatetimeFormatIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBDatetimeFormatTableIT.java
index 2491934de14..b5cbabd5700 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBDatetimeFormatIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBDatetimeFormatTableIT.java
@@ -41,7 +41,7 @@ import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBDatetimeFormatIT {
+public class IoTDBDatetimeFormatTableIT {
 
   private static final String DATABASE_NAME = "db";
 
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryTableIT.java
index 4e8b1a6959b..d2bc1f172c0 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryTableIT.java
@@ -43,7 +43,7 @@ import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBNestedQueryIT {
+public class IoTDBNestedQueryTableIT {
 
   private static final String DATABASE_NAME = "db";
 
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTable2IT.java
similarity index 95%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice2IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTable2IT.java
index abca27ddc04..ea22855e248 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTable2IT.java
@@ -31,7 +31,7 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDevice2IT extends IoTDBAlignByDeviceIT {
+public class IoTDBAlignByDeviceTable2IT extends IoTDBAlignByDeviceTableIT {
   @BeforeClass
   public static void setUp() throws Exception {
     EnvFactory.getEnv().getConfig().getCommonConfig().setDegreeOfParallelism(4);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTable3IT.java
similarity index 95%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTable3IT.java
index 3f67ef68d91..cd60f5e8dd7 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTable3IT.java
@@ -31,7 +31,7 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDevice3IT extends IoTDBAlignByDeviceIT {
+public class IoTDBAlignByDeviceTable3IT extends IoTDBAlignByDeviceTableIT {
   @BeforeClass
   public static void setUp() throws Exception {
     EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTableIT.java
index d630477511b..cdb312308ad 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceTableIT.java
@@ -39,7 +39,7 @@ import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceIT {
+public class IoTDBAlignByDeviceTableIT {
 
   private static final String DATABASE_NAME = "db";
 
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateTable2IT.java
similarity index 94%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateTable2IT.java
index f19a20779e9..33f3ed9f62f 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateTable2IT.java
@@ -31,7 +31,7 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceWithTemplate2IT extends IoTDBAlignByDeviceWithTemplateIT {
+public class IoTDBAlignByDeviceWithTemplateTable2IT extends IoTDBAlignByDeviceWithTemplateTableIT {
 
   @BeforeClass
   public static void setUp() throws Exception {
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateTableIT.java
index 5a61cdf49c4..a480bf5d592 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplateTableIT.java
@@ -42,7 +42,7 @@ import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceWithTemplateIT {
+public class IoTDBAlignByDeviceWithTemplateTableIT {
 
   private static final String DATABASE_NAME = "db";
   private static final String[] sqls =
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDevice2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceTable2IT.java
similarity index 93%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDevice2IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceTable2IT.java
index bae442fd086..d1e858e1d7f 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDevice2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceTable2IT.java
@@ -31,8 +31,8 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBOrderByLimitOffsetAlignByDevice2IT
-    extends IoTDBOrderByLimitOffsetAlignByDeviceIT {
+public class IoTDBOrderByLimitOffsetAlignByDeviceTable2IT
+    extends IoTDBOrderByLimitOffsetAlignByDeviceTableIT {
   @BeforeClass
   public static void setUp() throws Exception {
     EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceTableIT.java
similarity index 96%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceTableIT.java
index 2e80792f5ee..30ba46b1188 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByLimitOffsetAlignByDeviceTableIT.java
@@ -38,7 +38,7 @@ import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBOrderByLimitOffsetAlignByDeviceIT {
+public class IoTDBOrderByLimitOffsetAlignByDeviceTableIT {
 
   @BeforeClass
   public static void setUp() throws Exception {
@@ -57,7 +57,7 @@ public class IoTDBOrderByLimitOffsetAlignByDeviceIT {
     String[] expectedHeader = new String[] {"time", "device_id", "s1"};
     String[] retArray = new String[] {"1970-01-01T00:00:00.003Z,d1,111,"};
     tableResultSetEqualTest(
-        "SELECT * FROM table1 WHERE s1>40 ORDER BY Time LIMIT 1",
+        "SELECT * FROM table1 WHERE s1>40 ORDER BY Time, device_id LIMIT 1",
         expectedHeader,
         retArray,
         DATABASE_NAME);
@@ -78,7 +78,7 @@ public class IoTDBOrderByLimitOffsetAlignByDeviceIT {
     // 4. both exist OFFSET and LIMIT, can push down LIMIT as OFFSET+LIMIT
     retArray = new String[] {"1970-01-01T00:00:00.003Z,d2,222,"};
     tableResultSetEqualTest(
-        "SELECT * FROM table1 ORDER BY Time DESC OFFSET 1 LIMIT 1",
+        "SELECT * FROM table1 ORDER BY Time DESC, device_id OFFSET 1 LIMIT 1",
         expectedHeader,
         retArray,
         DATABASE_NAME);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDevice2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTable2IT.java
similarity index 94%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDevice2IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTable2IT.java
index d38319613e7..d0e4219d2fb 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDevice2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTable2IT.java
@@ -31,7 +31,7 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBOrderByWithAlignByDevice2IT extends IoTDBOrderByWithAlignByDeviceIT {
+public class IoTDBOrderByWithAlignByDeviceTable2IT extends IoTDBOrderByWithAlignByDeviceTableIT {
   @BeforeClass
   public static void setUp() throws Exception {
     EnvFactory.getEnv().getConfig().getCommonConfig().setDegreeOfParallelism(4);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDevice3IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTable3IT.java
similarity index 94%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDevice3IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTable3IT.java
index 20ef83b8378..282ba80b165 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDevice3IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTable3IT.java
@@ -31,7 +31,7 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBOrderByWithAlignByDevice3IT extends IoTDBOrderByWithAlignByDeviceIT {
+public class IoTDBOrderByWithAlignByDeviceTable3IT extends IoTDBOrderByWithAlignByDeviceTableIT {
   @BeforeClass
   public static void setUp() throws Exception {
     EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTableIT.java
index e89cc9b4285..5f988358b58 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBOrderByWithAlignByDeviceTableIT.java
@@ -52,7 +52,7 @@ import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBOrderByWithAlignByDeviceIT {
+public class IoTDBOrderByWithAlignByDeviceTableIT {
   protected static final String DATABASE_NAME = "db";
   protected static final String[] places =
       new String[] {
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedOffsetLimitPushDownTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedOffsetLimitPushDownTableIT.java
new file mode 100644
index 00000000000..fc344846b0f
--- /dev/null
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedOffsetLimitPushDownTableIT.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.relational.it.query.old.aligned;
+
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.ClusterIT;
+import org.apache.iotdb.itbase.category.LocalStandaloneIT;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.iotdb.relational.it.query.old.aligned.TableUtils.USE_DB;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({LocalStandaloneIT.class, ClusterIT.class})
+public class IoTDBAlignedOffsetLimitPushDownTableIT {
+
+  @BeforeClass
+  public static void setUp() throws Exception {
+    EnvFactory.getEnv().initClusterEnvironment();
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute("CREATE DATABASE IF NOT EXISTS db");
+      statement.execute(USE_DB);
+      statement.execute(
+          "CREATE TABLE table0 (device string id, s1 double measurement, s2 double measurement)");
+
+      statement.execute("insert into table0(device,time,s1,s2) values('d1',1,1,1)");
+      statement.execute("insert into table0(device,time,s1,s2) values('d1',2,2,2)");
+      statement.execute("insert into table0(device,time,s1,s2) values('d1',3,3,3)");
+      statement.execute("insert into table0(device,time,s1,s2) values('d1',4,4,4)");
+      statement.execute("insert into table0(device,time,s1,s2) values('d1',5,5,null)");
+      statement.execute("insert into table0(device,time,s1,s2) values('d1',6,6,null)");
+      statement.execute("insert into table0(device,time,s1,s2) values('d1',7,7,7)");
+
+      statement.execute("flush");
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @AfterClass
+  public static void tearDown() throws Exception {
+    EnvFactory.getEnv().cleanClusterEnvironment();
+  }
+
+  @Test
+  public void selectWithLimitPushDownTest1() {
+
+    String[] retArray = new String[] {"3,3.0", "4,4.0"};
+
+    String[] columnNames = {"s1"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,s1 from table0 where device='d1' and time >= 3 limit 2")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectWithLimitPushDownTest2() {
+
+    String[] retArray = new String[] {"6,6.0,null", "7,7.0,7.0"};
+
+    String[] columnNames = {"s1", "s2"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,s1,s2 from table0 where device='d1' and time >= 1 offset 5")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+}
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable2IT.java
similarity index 76%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable2IT.java
index 3f67ef68d91..4855767c868 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable2IT.java
@@ -16,8 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
 
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,12 +30,20 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDevice3IT extends IoTDBAlignByDeviceIT {
+public class IoTDBAlignedSeriesQueryTable2IT extends IoTDBAlignedSeriesQueryTableIT {
+
   @BeforeClass
   public static void setUp() throws Exception {
-    EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+    EnvFactory.getEnv()
+        .getConfig()
+        .getCommonConfig()
+        .setEnableSeqSpaceCompaction(false)
+        .setEnableUnseqSpaceCompaction(false)
+        .setEnableCrossSpaceCompaction(false)
+        .setMaxTsBlockLineNumber(3)
+        .setMaxNumberOfPointsInPage(2);
     EnvFactory.getEnv().initClusterEnvironment();
-    insertData();
+    TableUtils.insertData();
   }
 
   @AfterClass
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable3IT.java
similarity index 74%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable3IT.java
index 3f67ef68d91..6e08514eba3 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable3IT.java
@@ -16,8 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
 
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,16 +30,24 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDevice3IT extends IoTDBAlignByDeviceIT {
+public class IoTDBAlignedSeriesQueryTable3IT extends IoTDBAlignedSeriesQueryTableIT {
+
   @BeforeClass
   public static void setUp() throws Exception {
-    EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+    EnvFactory.getEnv()
+        .getConfig()
+        .getCommonConfig()
+        .setEnableSeqSpaceCompaction(false)
+        .setEnableUnseqSpaceCompaction(false)
+        .setEnableCrossSpaceCompaction(false)
+        .setMaxTsBlockLineNumber(3)
+        .setMaxNumberOfPointsInPage(3);
     EnvFactory.getEnv().initClusterEnvironment();
-    insertData();
+    TableUtils.insertData();
   }
 
   @AfterClass
-  public static void tearDown() throws Exception {
+  public static void tearDown() {
     EnvFactory.getEnv().cleanClusterEnvironment();
   }
 }
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable4IT.java
similarity index 74%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable4IT.java
index 3f67ef68d91..59374ddfaa4 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDevice3IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable4IT.java
@@ -7,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,8 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
 
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,12 +30,20 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDevice3IT extends IoTDBAlignByDeviceIT {
+public class IoTDBAlignedSeriesQueryTable4IT extends IoTDBAlignedSeriesQueryTableIT {
+
   @BeforeClass
   public static void setUp() throws Exception {
-    EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+    EnvFactory.getEnv()
+        .getConfig()
+        .getCommonConfig()
+        .setEnableSeqSpaceCompaction(false)
+        .setEnableUnseqSpaceCompaction(false)
+        .setEnableCrossSpaceCompaction(false)
+        .setMaxTsBlockLineNumber(3)
+        .setDegreeOfParallelism(4);
     EnvFactory.getEnv().initClusterEnvironment();
-    insertData();
+    TableUtils.insertData();
   }
 
   @AfterClass
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable5IT.java
similarity index 74%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable5IT.java
index f19a20779e9..560aad5b404 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTable5IT.java
@@ -16,8 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
 
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,13 +30,22 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceWithTemplate2IT extends IoTDBAlignByDeviceWithTemplateIT {
+public class IoTDBAlignedSeriesQueryTable5IT extends IoTDBAlignedSeriesQueryTableIT {
 
   @BeforeClass
   public static void setUp() throws Exception {
-    EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+    EnvFactory.getEnv()
+        .getConfig()
+        .getCommonConfig()
+        .setEnableSeqSpaceCompaction(false)
+        .setEnableUnseqSpaceCompaction(false)
+        .setEnableCrossSpaceCompaction(false)
+        .setMaxTsBlockLineNumber(1)
+        .setMaxNumberOfPointsInPage(1)
+        .setDriverTaskExecutionTimeSliceInMs(20);
+
     EnvFactory.getEnv().initClusterEnvironment();
-    insertData();
+    TableUtils.insertData();
   }
 
   @AfterClass
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTableIT.java
new file mode 100644
index 00000000000..3d9c3e43fec
--- /dev/null
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBAlignedSeriesQueryTableIT.java
@@ -0,0 +1,3678 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.relational.it.query.old.aligned;
+
+import org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant;
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.ClusterIT;
+import org.apache.iotdb.itbase.category.LocalStandaloneIT;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.iotdb.db.utils.constant.TestConstant.avg;
+import static org.apache.iotdb.db.utils.constant.TestConstant.count;
+import static org.apache.iotdb.db.utils.constant.TestConstant.firstValue;
+import static org.apache.iotdb.db.utils.constant.TestConstant.lastValue;
+import static org.apache.iotdb.db.utils.constant.TestConstant.maxTime;
+import static org.apache.iotdb.db.utils.constant.TestConstant.maxValue;
+import static org.apache.iotdb.db.utils.constant.TestConstant.minTime;
+import static org.apache.iotdb.db.utils.constant.TestConstant.minValue;
+import static org.apache.iotdb.db.utils.constant.TestConstant.sum;
+import static org.apache.iotdb.itbase.constant.TestConstant.TIMESTAMP_STR;
+import static org.apache.iotdb.relational.it.query.old.aligned.TableUtils.USE_DB;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({LocalStandaloneIT.class, ClusterIT.class})
+public class IoTDBAlignedSeriesQueryTableIT {
+
+  private static final double DELTA = 1e-6;
+
+  @BeforeClass
+  public static void setUp() throws Exception {
+    EnvFactory.getEnv()
+        .getConfig()
+        .getCommonConfig()
+        .setEnableSeqSpaceCompaction(false)
+        .setEnableUnseqSpaceCompaction(false)
+        .setEnableCrossSpaceCompaction(false)
+        .setMaxTsBlockLineNumber(3);
+    EnvFactory.getEnv().initClusterEnvironment();
+    TableUtils.insertData();
+  }
+
+  @AfterClass
+  public static void tearDown() throws Exception {
+    EnvFactory.getEnv().cleanClusterEnvironment();
+  }
+
+  // ------------------------------Raw Query Without Value Filter----------------------------------
+  @Test
+  public void selectAllAlignedWithoutValueFilterTest() {
+
+    String[] retArray =
+        new String[] {
+          "1,1.0,1,1,true,aligned_test1",
+          "2,2.0,2,2,null,aligned_test2",
+          "3,30000.0,null,30000,true,aligned_unseq_test3",
+          "4,4.0,4,null,true,aligned_test4",
+          "5,5.0,5,null,true,aligned_test5",
+          "6,6.0,6,6,true,null",
+          "7,7.0,7,7,false,aligned_test7",
+          "8,8.0,8,8,null,aligned_test8",
+          "9,9.0,9,9,false,aligned_test9",
+          "10,null,10,10,true,aligned_test10",
+          "11,11.0,11,11,null,null",
+          "12,12.0,12,12,null,null",
+          "13,130000.0,130000,130000,true,aligned_unseq_test13",
+          "14,14.0,14,14,null,null",
+          "15,15.0,15,15,null,null",
+          "16,16.0,16,16,null,null",
+          "17,17.0,17,17,null,null",
+          "18,18.0,18,18,null,null",
+          "19,19.0,19,19,null,null",
+          "20,20.0,20,20,null,null",
+          "21,null,null,21,true,null",
+          "22,null,null,22,true,null",
+          "23,230000.0,null,230000,false,null",
+          "24,null,null,24,true,null",
+          "25,null,null,25,true,null",
+          "26,null,null,26,false,null",
+          "27,null,null,27,false,null",
+          "28,null,null,28,false,null",
+          "29,null,null,29,false,null",
+          "30,null,null,30,false,null",
+          "31,null,31,null,null,aligned_test31",
+          "32,null,32,null,null,aligned_test32",
+          "33,null,33,null,null,aligned_test33",
+          "34,null,34,null,null,aligned_test34",
+          "35,null,35,null,null,aligned_test35",
+          "36,null,36,null,null,aligned_test36",
+          "37,null,37,null,null,aligned_test37",
+          "38,null,38,null,null,aligned_test38",
+          "39,null,39,null,null,aligned_test39",
+          "40,null,40,null,null,aligned_test40",
+        };
+
+    String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' order by time")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectAllAlignedWithTimeFilterTest() {
+
+    String[] retArray =
+        new String[] {
+          "9,9.0,9,9,false,aligned_test9",
+          "10,null,10,10,true,aligned_test10",
+          "11,11.0,11,11,null,null",
+          "12,12.0,12,12,null,null",
+          "13,130000.0,130000,130000,true,aligned_unseq_test13",
+          "14,14.0,14,14,null,null",
+          "15,15.0,15,15,null,null",
+          "16,16.0,16,16,null,null",
+          "17,17.0,17,17,null,null",
+          "18,18.0,18,18,null,null",
+          "19,19.0,19,19,null,null",
+          "20,20.0,20,20,null,null",
+          "21,null,null,21,true,null",
+          "22,null,null,22,true,null",
+          "23,230000.0,null,230000,false,null",
+          "24,null,null,24,true,null",
+          "25,null,null,25,true,null",
+          "26,null,null,26,false,null",
+          "27,null,null,27,false,null",
+          "28,null,null,28,false,null",
+          "29,null,null,29,false,null",
+          "30,null,null,30,false,null",
+          "31,null,31,null,null,aligned_test31",
+          "32,null,32,null,null,aligned_test32",
+          "33,null,33,null,null,aligned_test33",
+        };
+
+    String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' and time >= 9 and time <= 33 order by time")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectSomeAlignedWithoutValueFilterTest1() {
+
+    String[] retArray =
+        new String[] {
+          "1,1.0,true,aligned_test1",
+          "2,2.0,null,aligned_test2",
+          "3,30000.0,true,aligned_unseq_test3",
+          "4,4.0,true,aligned_test4",
+          "5,5.0,true,aligned_test5",
+          "6,6.0,true,null",
+          "7,7.0,false,aligned_test7",
+          "8,8.0,null,aligned_test8",
+          "9,9.0,false,aligned_test9",
+          "10,null,true,aligned_test10",
+          "11,11.0,null,null",
+          "12,12.0,null,null",
+          "13,130000.0,true,aligned_unseq_test13",
+          "14,14.0,null,null",
+          "15,15.0,null,null",
+          "16,16.0,null,null",
+          "17,17.0,null,null",
+          "18,18.0,null,null",
+          "19,19.0,null,null",
+          "20,20.0,null,null",
+          "21,null,true,null",
+          "22,null,true,null",
+          "23,230000.0,false,null",
+          "24,null,true,null",
+          "25,null,true,null",
+          "26,null,false,null",
+          "27,null,false,null",
+          "28,null,false,null",
+          "29,null,false,null",
+          "30,null,false,null",
+          "31,null,null,aligned_test31",
+          "32,null,null,aligned_test32",
+          "33,null,null,aligned_test33",
+          "34,null,null,aligned_test34",
+          "35,null,null,aligned_test35",
+          "36,null,null,aligned_test36",
+          "37,null,null,aligned_test37",
+          "38,null,null,aligned_test38",
+          "39,null,null,aligned_test39",
+          "40,null,null,aligned_test40",
+        };
+
+    String[] columnNames = {"s1", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery("select Time,s1,s4,s5 from table0 where device='d1'")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectSomeAlignedWithoutValueFilterTest2() {
+
+    String[] retArray =
+        new String[] {
+          "1,1.0,true",
+          "2,2.0,null",
+          "3,30000.0,true",
+          "4,4.0,true",
+          "5,5.0,true",
+          "6,6.0,true",
+          "7,7.0,false",
+          "8,8.0,null",
+          "9,9.0,false",
+          "10,null,true",
+          "11,11.0,null",
+          "12,12.0,null",
+          "13,130000.0,true",
+          "14,14.0,null",
+          "15,15.0,null",
+          "16,16.0,null",
+          "17,17.0,null",
+          "18,18.0,null",
+          "19,19.0,null",
+          "20,20.0,null",
+          "21,null,true",
+          "22,null,true",
+          "23,230000.0,false",
+          "24,null,true",
+          "25,null,true",
+          "26,null,false",
+          "27,null,false",
+          "28,null,false",
+          "29,null,false",
+          "30,null,false",
+        };
+
+    String[] columnNames = {"s1", "s4"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery("select Time,s1,s4 from table0 where device='d1'")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectSomeAlignedWithTimeFilterTest() {
+
+    String[] retArray =
+        new String[] {
+          "16,16.0,null,null",
+          "17,17.0,null,null",
+          "18,18.0,null,null",
+          "19,19.0,null,null",
+          "20,20.0,null,null",
+          "21,null,true,null",
+          "22,null,true,null",
+          "23,230000.0,false,null",
+          "24,null,true,null",
+          "25,null,true,null",
+          "26,null,false,null",
+          "27,null,false,null",
+          "28,null,false,null",
+          "29,null,false,null",
+          "30,null,false,null",
+          "31,null,null,aligned_test31",
+          "32,null,null,aligned_test32",
+          "33,null,null,aligned_test33",
+          "34,null,null,aligned_test34",
+        };
+
+    String[] columnNames = {"s1", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,s1,s4,s5 from table0 where device='d1' and time >= 16 and time <= 34")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  // ------------------------------Raw Query With Value Filter-------------------------------------
+  @Test
+  public void selectAllAlignedWithValueFilterTest1() {
+
+    String[] retArray =
+        new String[] {
+          "1,1.0,1,1,true,aligned_test1",
+          "3,30000.0,null,30000,true,aligned_unseq_test3",
+          "4,4.0,4,null,true,aligned_test4",
+          "5,5.0,5,null,true,aligned_test5",
+          "6,6.0,6,6,true,null",
+          "10,null,10,10,true,aligned_test10",
+          "13,130000.0,130000,130000,true,aligned_unseq_test13",
+          "21,null,null,21,true,null",
+          "22,null,null,22,true,null",
+          "24,null,null,24,true,null",
+          "25,null,null,25,true,null",
+        };
+
+    String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' and s4 = true")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectAllAlignedWithValueFilterTest2() {
+
+    String[] retArray =
+        new String[] {
+          "12,12.0,12,12,null,null",
+          "14,14.0,14,14,null,null",
+          "15,15.0,15,15,null,null",
+          "16,16.0,16,16,null,null",
+          "17,17.0,17,17,null,null",
+          "18,18.0,18,18,null,null",
+          "19,19.0,19,19,null,null",
+          "20,20.0,20,20,null,null",
+        };
+
+    String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' and s1 > 11.0 and s2 <= 33 order by time asc")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectAllAlignedWithValueFilterTest3() {
+
+    String[] retArray =
+        new String[] {
+          "1,1.0,1,1,true,aligned_test1",
+          "2,2.0,2,2,null,aligned_test2",
+          "3,30000.0,null,30000,true,aligned_unseq_test3",
+          "4,4.0,4,null,true,aligned_test4",
+          "5,5.0,5,null,true,aligned_test5",
+          "6,6.0,6,6,true,null",
+          "7,7.0,7,7,false,aligned_test7",
+          "8,8.0,8,8,null,aligned_test8",
+          "9,9.0,9,9,false,aligned_test9",
+          "10,null,10,10,true,aligned_test10",
+          "11,11.0,11,11,null,null",
+          "12,12.0,12,12,null,null",
+          "13,130000.0,130000,130000,true,aligned_unseq_test13",
+          "14,14.0,14,14,null,null",
+          "15,15.0,15,15,null,null",
+          "16,16.0,16,16,null,null",
+          "17,17.0,17,17,null,null",
+          "18,18.0,18,18,null,null",
+          "19,19.0,19,19,null,null",
+          "20,20.0,20,20,null,null",
+          "23,230000.0,null,230000,false,null",
+          "31,null,31,null,null,aligned_test31",
+          "32,null,32,null,null,aligned_test32",
+        };
+
+    String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' and (s1 >= 13.0 or s2 < 33) order by time asc")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectAllAlignedWithTimeAndValueFilterTest1() {
+
+    String[] retArray =
+        new String[] {
+          "9,9.0,9,9,false,aligned_test9",
+          "11,11.0,11,11,null,null",
+          "12,12.0,12,12,null,null",
+          "14,14.0,14,14,null,null",
+          "15,15.0,15,15,null,null",
+          "16,16.0,16,16,null,null",
+          "17,17.0,17,17,null,null",
+          "18,18.0,18,18,null,null",
+        };
+
+    String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' and time >= 9 and time <= 33 and s1 < 19.0")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectAllAlignedWithLimitOffsetTest() {
+
+    String[] retArray =
+        new String[] {
+          "14,14.0,14,14,null,null",
+          "15,15.0,15,15,null,null",
+          "16,16.0,16,16,null,null",
+          "17,17.0,17,17,null,null",
+          "18,18.0,18,18,null,null",
+        };
+
+    String[] columnNames = {"s1", "s2", "s3", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,s1,s2,s3,s4,s5 from table0 where device='d1' and time >= 9 and time <= 33 offset 5 limit 5")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectSomeAlignedWithValueFilterTest1() {
+
+    String[] retArray =
+        new String[] {
+          "1,1.0,true,aligned_test1",
+          "2,2.0,null,aligned_test2",
+          "4,4.0,true,aligned_test4",
+          "5,5.0,true,aligned_test5",
+          "6,6.0,true,null",
+          "7,7.0,false,aligned_test7",
+          "8,8.0,null,aligned_test8",
+          "9,9.0,false,aligned_test9",
+          "11,11.0,null,null",
+          "12,12.0,null,null",
+          "14,14.0,null,null",
+          "15,15.0,null,null",
+          "16,16.0,null,null",
+          "34,null,null,aligned_test34",
+        };
+
+    String[] columnNames = {"s1", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,s1,s4,s5 from table0 where device='d1' and s1 < 17.0 or s5 = 'aligned_test34'")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectSomeAlignedWithValueFilterTest2() {
+
+    String[] retArray =
+        new String[] {
+          "7,7.0,false", "9,9.0,false",
+        };
+
+    String[] columnNames = {"s1", "s4"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,s1,s4 from table0 where device='d1' and s1 < 19.0 and s4 = false")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectSomeAlignedWithTimeAndValueFilterTest() {
+
+    String[] retArray =
+        new String[] {
+          "23,230000.0,false,null",
+          "26,null,false,null",
+          "27,null,false,null",
+          "28,null,false,null",
+          "29,null,false,null",
+          "30,null,false,null",
+        };
+
+    String[] columnNames = {"s1", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,s1,s4,s5 from table0 where device='d1' and time >= 16 and time <= 34 and s4=false")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  // --------------------------Aggregation Query Without Value Filter---------------------------
+  @Ignore
+  @Test
+  public void countAllAlignedWithoutTimeFilterTest() {
+    String[] retArray = new String[] {"20", "29", "28", "19", "20"};
+    String[] columnNames = {
+      "count(d1.s1)", "count(d1.s2)", "count(d1.s3)", "count(d1.s4)", "count(d1.s5)"
+    };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet = statement.executeQuery("select count(*) from d1")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] ans = new String[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = resultSet.getString(index);
+          }
+          assertArrayEquals(retArray, ans);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countAllAlignedAndNonAlignedWithoutTimeFilterTest() {
+    String[] retArray = new String[] {"20", "29", "28", "19", "20", "19", "29", "28", "18", "19"};
+    String[] columnNames = {
+      "count(d1.s1)",
+      "count(d1.s2)",
+      "count(d1.s3)",
+      "count(d1.s4)",
+      "count(d1.s5)",
+      "count(d2.s1)",
+      "count(d2.s2)",
+      "count(d2.s3)",
+      "count(d2.s4)",
+      "count(d2.s5)"
+    };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet = statement.executeQuery("select count(*) from root.sg1.*")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] ans = new String[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = resultSet.getString(index);
+          }
+          assertArrayEquals(retArray, ans);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countAllAlignedWithTimeFilterTest() {
+    String[] retArray = new String[] {"12", "15", "22", "13", "6"};
+    String[] columnNames = {
+      "count(d1.s1)", "count(d1.s2)", "count(d1.s3)", "count(d1.s4)", "count(d1.s5)"
+    };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery("select count(*) from d1 where time >= 9 and time <= 33")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] ans = new String[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = resultSet.getString(index);
+          }
+          assertArrayEquals(retArray, ans);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  /** aggregate multi columns of aligned timeseries in one SQL */
+  @Ignore
+  @Test
+  public void aggregateSomeAlignedWithoutTimeFilterTest() {
+    double[] retArray =
+        new double[] {
+          20, 29, 28, 390184, 130549, 390417, 19509.2, 4501.689655172413, 13943.464285714286
+        };
+    String[] columnNames = {
+      "count(d1.s1)",
+      "count(d1.s2)",
+      "count(d1.s3)",
+      "sum(d1.s1)",
+      "sum(d1.s2)",
+      "sum(d1.s3)",
+      "avg(d1.s1)",
+      "avg(d1.s2)",
+      "avg(d1.s3)",
+    };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1),count(s2),count(s3),sum(s1),sum(s2),sum(s3),avg(s1),avg(s2),avg(s3) from d1")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          double[] ans = new double[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = Double.parseDouble(resultSet.getString(index));
+          }
+          assertArrayEquals(retArray, ans, DELTA);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  /** aggregate multi columns of aligned timeseries in one SQL */
+  @Ignore
+  @Test
+  public void aggregateSomeAlignedWithTimeFilterTest() {
+    double[] retArray =
+        new double[] {
+          6, 9, 15, 230090, 220, 230322, 38348.333333333336, 24.444444444444443, 15354.8
+        };
+    String[] columnNames = {
+      "count(d1.s1)",
+      "count(d1.s2)",
+      "count(d1.s3)",
+      "sum(d1.s1)",
+      "sum(d1.s2)",
+      "sum(d1.s3)",
+      "avg(d1.s1)",
+      "avg(d1.s2)",
+      "avg(d1.s3)",
+    };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1),count (s2),count (s3),sum(s1),sum(s2),sum(s3),avg(s1),avg(s2),avg(s3) from d1 where time>=16 and time<=34")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          double[] ans = new double[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = Double.parseDouble(resultSet.getString(index));
+          }
+          assertArrayEquals(retArray, ans, DELTA);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countSingleAlignedWithTimeFilterTest() {
+    String[] retArray = new String[] {"9"};
+    String[] columnNames = {"count(d1.s2)"};
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery("select count(s2) from d1 where time>=16 and time<=34")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          // No need to add time column for aggregation query
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            if (builder.length() != 0) {
+              builder.append(",");
+            }
+            builder.append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void sumSingleAlignedWithTimeFilterTest() {
+    String[] retArray = new String[] {"230322.0"};
+    String[] columnNames = {"sum(d1.s3)"};
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery("select sum(s3) from d1 where time>=16 and time<=34")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          // No need to add time column for aggregation query
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            if (builder.length() != 0) {
+              builder.append(",");
+            }
+            builder.append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void avgSingleAlignedWithTimeFilterTest() {
+    double[][] retArray = {{24.444444444444443}};
+    String[] columnNames = {"avg(d1.s2)"};
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery("select avg(s2) from d1 where time>=16 and time<=34")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          double[] ans = new double[columnNames.length];
+          StringBuilder builder = new StringBuilder();
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = Double.parseDouble(resultSet.getString(index));
+          }
+          assertArrayEquals(retArray[cnt], ans, DELTA);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  // --------------------------------Aggregation with value filter------------------------------
+  @Ignore
+  @Test
+  public void countAlignedWithValueFilterTest() {
+    String[] retArray = new String[] {"11"};
+    String[] columnNames = {"count(d1.s4)"};
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery("select count(s4) from d1 where s4 = true")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] ans = new String[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = resultSet.getString(index);
+          }
+          assertArrayEquals(retArray, ans);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void aggregationFuncAlignedWithValueFilterTest() throws ClassNotFoundException {
+    String[] retArray = new String[] {"8", "42.0", "5.25", "1.0", "9.0", "1", "9", "1.0", "9.0"};
+    String[] columnNames = {
+      "count(d1.s1)",
+      "sum(d1.s1)",
+      "avg(d1.s1)",
+      "first_value(d1.s1)",
+      "last_value(d1.s1)",
+      "min_time(d1.s1)",
+      "max_time(d1.s1)",
+      "min_value(d1.s1)",
+      "max_value(d1.s1)",
+    };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1), sum(s1), avg(s1), "
+                  + "first_value(s1), last_value(s1), "
+                  + "min_time(s1), max_time(s1),"
+                  + "max_value(s1), min_value(s1) from d1 where s1 < 10")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] ans = new String[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = resultSet.getString(index);
+          }
+          assertArrayEquals(retArray, ans);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countAllAlignedWithValueFilterTest() throws ClassNotFoundException {
+    String[] retArray = new String[] {"6", "6", "9", "11", "6"};
+    String[] columnNames = {
+      "count(d1.s1)", "count(d1.s2)", "count(d1.s3)", "count(d1.s4)", "count(d1.s5)"
+    };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery("select count(*) from d1 where s4 = true")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] ans = new String[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = resultSet.getString(index);
+          }
+          assertArrayEquals(retArray, ans);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void aggregationAllAlignedWithValueFilterTest() throws ClassNotFoundException {
+    String[] retArray = new String[] {"160016.0", "11", "1", "13"};
+    String[] columnNames = {
+      "sum(d1.s1)", "count(d1.s4)", "min_value(d1.s3)", "max_time(d1.s2)",
+    };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select sum(s1), count(s4), min_value(s3), max_time(s2) from d1 where s4 = true")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] ans = new String[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = resultSet.getString(index);
+          }
+          assertArrayEquals(retArray, ans);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  // ---------------------------------Align by device query ------------------------------------
+  @Test
+  public void selectAllAlignedWithoutValueFilterAlignByDeviceTest() {
+    String[] retArray =
+        new String[] {
+          "1,d1,1.0,1,1,true,aligned_test1",
+          "2,d1,2.0,2,2,null,aligned_test2",
+          "3,d1,30000.0,null,30000,true,aligned_unseq_test3",
+          "4,d1,4.0,4,null,true,aligned_test4",
+          "5,d1,5.0,5,null,true,aligned_test5",
+          "6,d1,6.0,6,6,true,null",
+          "7,d1,7.0,7,7,false,aligned_test7",
+          "8,d1,8.0,8,8,null,aligned_test8",
+          "9,d1,9.0,9,9,false,aligned_test9",
+          "10,d1,null,10,10,true,aligned_test10",
+          "11,d1,11.0,11,11,null,null",
+          "12,d1,12.0,12,12,null,null",
+          "13,d1,130000.0,130000,130000,true,aligned_unseq_test13",
+          "14,d1,14.0,14,14,null,null",
+          "15,d1,15.0,15,15,null,null",
+          "16,d1,16.0,16,16,null,null",
+          "17,d1,17.0,17,17,null,null",
+          "18,d1,18.0,18,18,null,null",
+          "19,d1,19.0,19,19,null,null",
+          "20,d1,20.0,20,20,null,null",
+          "21,d1,null,null,21,true,null",
+          "22,d1,null,null,22,true,null",
+          "23,d1,230000.0,null,230000,false,null",
+          "24,d1,null,null,24,true,null",
+          "25,d1,null,null,25,true,null",
+          "26,d1,null,null,26,false,null",
+          "27,d1,null,null,27,false,null",
+          "28,d1,null,null,28,false,null",
+          "29,d1,null,null,29,false,null",
+          "30,d1,null,null,30,false,null",
+          "31,d1,null,31,null,null,aligned_test31",
+          "32,d1,null,32,null,null,aligned_test32",
+          "33,d1,null,33,null,null,aligned_test33",
+          "34,d1,null,34,null,null,aligned_test34",
+          "35,d1,null,35,null,null,aligned_test35",
+          "36,d1,null,36,null,null,aligned_test36",
+          "37,d1,null,37,null,null,aligned_test37",
+          "38,d1,null,38,null,null,aligned_test38",
+          "39,d1,null,39,null,null,aligned_test39",
+          "40,d1,null,40,null,null,aligned_test40",
+        };
+
+    String[] columnNames = {"device", "s1", "s2", "s3", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,device,s1,s2,s3,s4,s5 from table0 where device='d1' order by time")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectAllAlignedAndNonAlignedAlignByDeviceTest() {
+    String[] retArray =
+        new String[] {
+          "1,d1,1.0,1,1,true,aligned_test1",
+          "2,d1,2.0,2,2,null,aligned_test2",
+          "3,d1,30000.0,null,30000,true,aligned_unseq_test3",
+          "4,d1,4.0,4,null,true,aligned_test4",
+          "5,d1,5.0,5,null,true,aligned_test5",
+          "6,d1,6.0,6,6,true,null",
+          "7,d1,7.0,7,7,false,aligned_test7",
+          "8,d1,8.0,8,8,null,aligned_test8",
+          "9,d1,9.0,9,9,false,aligned_test9",
+          "10,d1,null,10,10,true,aligned_test10",
+          "11,d1,11.0,11,11,null,null",
+          "12,d1,12.0,12,12,null,null",
+          "13,d1,130000.0,130000,130000,true,aligned_unseq_test13",
+          "14,d1,14.0,14,14,null,null",
+          "15,d1,15.0,15,15,null,null",
+          "16,d1,16.0,16,16,null,null",
+          "17,d1,17.0,17,17,null,null",
+          "18,d1,18.0,18,18,null,null",
+          "19,d1,19.0,19,19,null,null",
+          "20,d1,20.0,20,20,null,null",
+          "21,d1,null,null,21,true,null",
+          "22,d1,null,null,22,true,null",
+          "23,d1,230000.0,null,230000,false,null",
+          "24,d1,null,null,24,true,null",
+          "25,d1,null,null,25,true,null",
+          "26,d1,null,null,26,false,null",
+          "27,d1,null,null,27,false,null",
+          "28,d1,null,null,28,false,null",
+          "29,d1,null,null,29,false,null",
+          "30,d1,null,null,30,false,null",
+          "31,d1,null,31,null,null,aligned_test31",
+          "32,d1,null,32,null,null,aligned_test32",
+          "33,d1,null,33,null,null,aligned_test33",
+          "34,d1,null,34,null,null,aligned_test34",
+          "35,d1,null,35,null,null,aligned_test35",
+          "36,d1,null,36,null,null,aligned_test36",
+          "37,d1,null,37,null,null,aligned_test37",
+          "38,d1,null,38,null,null,aligned_test38",
+          "39,d1,null,39,null,null,aligned_test39",
+          "40,d1,null,40,null,null,aligned_test40",
+          "1,d2,1.0,1,1,true,non_aligned_test1",
+          "2,d2,2.0,2,2,null,non_aligned_test2",
+          "3,d2,3.0,null,3,false,non_aligned_test3",
+          "4,d2,4.0,4,null,true,non_aligned_test4",
+          "5,d2,5.0,5,null,true,non_aligned_test5",
+          "6,d2,6.0,6,6,true,null",
+          "7,d2,7.0,7,7,false,non_aligned_test7",
+          "8,d2,8.0,8,8,null,non_aligned_test8",
+          "9,d2,9.0,9,9,false,non_aligned_test9",
+          "10,d2,null,10,10,true,non_aligned_test10",
+          "11,d2,11.0,11,11,null,null",
+          "12,d2,12.0,12,12,null,null",
+          "13,d2,13.0,13,13,null,null",
+          "14,d2,14.0,14,14,null,null",
+          "15,d2,15.0,15,15,null,null",
+          "16,d2,16.0,16,16,null,null",
+          "17,d2,17.0,17,17,null,null",
+          "18,d2,18.0,18,18,null,null",
+          "19,d2,19.0,19,19,null,null",
+          "20,d2,20.0,20,20,null,null",
+          "21,d2,null,null,21,true,null",
+          "22,d2,null,null,22,true,null",
+          "23,d2,null,null,23,true,null",
+          "24,d2,null,null,24,true,null",
+          "25,d2,null,null,25,true,null",
+          "26,d2,null,null,26,false,null",
+          "27,d2,null,null,27,false,null",
+          "28,d2,null,null,28,false,null",
+          "29,d2,null,null,29,false,null",
+          "30,d2,null,null,30,false,null",
+          "31,d2,null,31,null,null,non_aligned_test31",
+          "32,d2,null,32,null,null,non_aligned_test32",
+          "33,d2,null,33,null,null,non_aligned_test33",
+          "34,d2,null,34,null,null,non_aligned_test34",
+          "35,d2,null,35,null,null,non_aligned_test35",
+          "36,d2,null,36,null,null,non_aligned_test36",
+          "37,d2,null,37,null,null,non_aligned_test37",
+          "38,d2,null,38,null,null,non_aligned_test38",
+          "39,d2,null,39,null,null,non_aligned_test39",
+          "40,d2,null,40,null,null,non_aligned_test40",
+        };
+
+    String[] columnNames = {"device", "s1", "s2", "s3", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,device,s1,s2,s3,s4,s5 from table0 order by device, time")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectAllAlignedWithTimeFilterAlignByDeviceTest() {
+    String[] retArray =
+        new String[] {
+          "9,d1,9.0,9,9,false,aligned_test9",
+          "10,d1,null,10,10,true,aligned_test10",
+          "11,d1,11.0,11,11,null,null",
+          "12,d1,12.0,12,12,null,null",
+          "13,d1,130000.0,130000,130000,true,aligned_unseq_test13",
+          "14,d1,14.0,14,14,null,null",
+          "15,d1,15.0,15,15,null,null",
+          "16,d1,16.0,16,16,null,null",
+          "17,d1,17.0,17,17,null,null",
+          "18,d1,18.0,18,18,null,null",
+          "19,d1,19.0,19,19,null,null",
+          "20,d1,20.0,20,20,null,null",
+          "21,d1,null,null,21,true,null",
+          "22,d1,null,null,22,true,null",
+          "23,d1,230000.0,null,230000,false,null",
+          "24,d1,null,null,24,true,null",
+          "25,d1,null,null,25,true,null",
+          "26,d1,null,null,26,false,null",
+          "27,d1,null,null,27,false,null",
+          "28,d1,null,null,28,false,null",
+          "29,d1,null,null,29,false,null",
+          "30,d1,null,null,30,false,null",
+          "31,d1,null,31,null,null,aligned_test31",
+          "32,d1,null,32,null,null,aligned_test32",
+          "33,d1,null,33,null,null,aligned_test33",
+        };
+
+    String[] columnNames = {"device", "s1", "s2", "s3", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,device,s1,s2,s3,s4,s5 from table0 where device='d1' and time >= 9 and time <= 33 order by time")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectSomeAlignedWithoutValueFilterAlignByDeviceTest1() {
+    String[] retArray =
+        new String[] {
+          "1,d1,1.0,true,aligned_test1",
+          "2,d1,2.0,null,aligned_test2",
+          "3,d1,30000.0,true,aligned_unseq_test3",
+          "4,d1,4.0,true,aligned_test4",
+          "5,d1,5.0,true,aligned_test5",
+          "6,d1,6.0,true,null",
+          "7,d1,7.0,false,aligned_test7",
+          "8,d1,8.0,null,aligned_test8",
+          "9,d1,9.0,false,aligned_test9",
+          "10,d1,null,true,aligned_test10",
+          "11,d1,11.0,null,null",
+          "12,d1,12.0,null,null",
+          "13,d1,130000.0,true,aligned_unseq_test13",
+          "14,d1,14.0,null,null",
+          "15,d1,15.0,null,null",
+          "16,d1,16.0,null,null",
+          "17,d1,17.0,null,null",
+          "18,d1,18.0,null,null",
+          "19,d1,19.0,null,null",
+          "20,d1,20.0,null,null",
+          "21,d1,null,true,null",
+          "22,d1,null,true,null",
+          "23,d1,230000.0,false,null",
+          "24,d1,null,true,null",
+          "25,d1,null,true,null",
+          "26,d1,null,false,null",
+          "27,d1,null,false,null",
+          "28,d1,null,false,null",
+          "29,d1,null,false,null",
+          "30,d1,null,false,null",
+          "31,d1,null,null,aligned_test31",
+          "32,d1,null,null,aligned_test32",
+          "33,d1,null,null,aligned_test33",
+          "34,d1,null,null,aligned_test34",
+          "35,d1,null,null,aligned_test35",
+          "36,d1,null,null,aligned_test36",
+          "37,d1,null,null,aligned_test37",
+          "38,d1,null,null,aligned_test38",
+          "39,d1,null,null,aligned_test39",
+          "40,d1,null,null,aligned_test40",
+        };
+
+    String[] columnNames = {"device", "s1", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+
+      try (ResultSet resultSet =
+          statement.executeQuery("select Time,device,s1,s4,s5 from table0 where device='d1'")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectSomeAlignedWithoutValueFilterAlignByDeviceTest2() {
+    String[] retArray =
+        new String[] {
+          "1,d1,1.0,true",
+          "2,d1,2.0,null",
+          "3,d1,30000.0,true",
+          "4,d1,4.0,true",
+          "5,d1,5.0,true",
+          "6,d1,6.0,true",
+          "7,d1,7.0,false",
+          "8,d1,8.0,null",
+          "9,d1,9.0,false",
+          "10,d1,null,true",
+          "11,d1,11.0,null",
+          "12,d1,12.0,null",
+          "13,d1,130000.0,true",
+          "14,d1,14.0,null",
+          "15,d1,15.0,null",
+          "16,d1,16.0,null",
+          "17,d1,17.0,null",
+          "18,d1,18.0,null",
+          "19,d1,19.0,null",
+          "20,d1,20.0,null",
+          "21,d1,null,true",
+          "22,d1,null,true",
+          "23,d1,230000.0,false",
+          "24,d1,null,true",
+          "25,d1,null,true",
+          "26,d1,null,false",
+          "27,d1,null,false",
+          "28,d1,null,false",
+          "29,d1,null,false",
+          "30,d1,null,false",
+        };
+
+    String[] columnNames = {"Device", "s1", "s4"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery("select Time,Device,s1,s4 from table0 where device='d1'")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectSomeAlignedWithTimeFilterAlignByDeviceTest() {
+    String[] retArray =
+        new String[] {
+          "16,d1,16.0,null,null",
+          "17,d1,17.0,null,null",
+          "18,d1,18.0,null,null",
+          "19,d1,19.0,null,null",
+          "20,d1,20.0,null,null",
+          "21,d1,null,true,null",
+          "22,d1,null,true,null",
+          "23,d1,230000.0,false,null",
+          "24,d1,null,true,null",
+          "25,d1,null,true,null",
+          "26,d1,null,false,null",
+          "27,d1,null,false,null",
+          "28,d1,null,false,null",
+          "29,d1,null,false,null",
+          "30,d1,null,false,null",
+          "31,d1,null,null,aligned_test31",
+          "32,d1,null,null,aligned_test32",
+          "33,d1,null,null,aligned_test33",
+          "34,d1,null,null,aligned_test34",
+        };
+
+    String[] columnNames = {"Device", "s1", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,Device,s1,s4,s5 from table0 where device='d1' and time >= 16 and time <= 34 order by time")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectAllAlignedWithValueFilterAlignByDeviceTest1() {
+    String[] retArray =
+        new String[] {
+          "1,d1,1.0,1,1,true,aligned_test1",
+          "3,d1,30000.0,null,30000,true,aligned_unseq_test3",
+          "4,d1,4.0,4,null,true,aligned_test4",
+          "5,d1,5.0,5,null,true,aligned_test5",
+          "6,d1,6.0,6,6,true,null",
+          "10,d1,null,10,10,true,aligned_test10",
+          "13,d1,130000.0,130000,130000,true,aligned_unseq_test13",
+          "21,d1,null,null,21,true,null",
+          "22,d1,null,null,22,true,null",
+          "24,d1,null,null,24,true,null",
+          "25,d1,null,null,25,true,null",
+        };
+
+    String[] columnNames = {"Device", "s1", "s2", "s3", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,Device,s1,s2,s3,s4,s5 from table0 where device='d1' and s4 = true order by time")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectAllAlignedWithValueFilterAlignByDeviceTest2() {
+    String[] retArray =
+        new String[] {
+          "12,d1,12.0,12,12,null,null",
+          "14,d1,14.0,14,14,null,null",
+          "15,d1,15.0,15,15,null,null",
+          "16,d1,16.0,16,16,null,null",
+          "17,d1,17.0,17,17,null,null",
+          "18,d1,18.0,18,18,null,null",
+          "19,d1,19.0,19,19,null,null",
+          "20,d1,20.0,20,20,null,null",
+        };
+
+    String[] columnNames = {"Device", "s1", "s2", "s3", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,Device,s1,s2,s3,s4,s5 from table0 where device='d1' and s1 > 11.0 and s2 <= 33 order by time")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectAllAlignedWithTimeAndValueFilterAlignByDeviceTest1() {
+    String[] retArray =
+        new String[] {
+          "9,d1,9.0,9,9,false,aligned_test9",
+          "11,d1,11.0,11,11,null,null",
+          "12,d1,12.0,12,12,null,null",
+          "14,d1,14.0,14,14,null,null",
+          "15,d1,15.0,15,15,null,null",
+          "16,d1,16.0,16,16,null,null",
+          "17,d1,17.0,17,17,null,null",
+          "18,d1,18.0,18,18,null,null",
+        };
+
+    String[] columnNames = {"Device", "s1", "s2", "s3", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,Device,s1,s2,s3,s4,s5 from table0 where device='d1' and time >= 9 and time <= 33 and s1 < 19.0 order by time")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectSomeAlignedWithValueFilterAlignByDeviceTest1() {
+    String[] retArray =
+        new String[] {
+          "1,d1,1.0,true,aligned_test1",
+          "2,d1,2.0,null,aligned_test2",
+          "4,d1,4.0,true,aligned_test4",
+          "5,d1,5.0,true,aligned_test5",
+          "6,d1,6.0,true,null",
+          "7,d1,7.0,false,aligned_test7",
+          "8,d1,8.0,null,aligned_test8",
+          "9,d1,9.0,false,aligned_test9",
+          "11,d1,11.0,null,null",
+          "12,d1,12.0,null,null",
+          "14,d1,14.0,null,null",
+          "15,d1,15.0,null,null",
+          "16,d1,16.0,null,null",
+          "34,d1,null,null,aligned_test34",
+        };
+
+    String[] columnNames = {"Device", "s1", "s4", "s5"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,Device,s1,s4,s5 from table0 where device='d1' and s1 < 17.0 or s5 = 'aligned_test34' order by time")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void selectSomeAlignedWithValueFilterAlignByDeviceTest2() {
+    String[] retArray =
+        new String[] {
+          "7,d1,7.0,false", "9,d1,9.0,false",
+        };
+
+    String[] columnNames = {"Device", "s1", "s4"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select Time,Device,s1,s4 from table0 where device='d1' and s1 < 19.0 and s4 = false order by time")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length + 1, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          builder.append(resultSet.getLong(1));
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(",").append(resultSet.getString(index));
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countAllAlignedWithoutTimeFilterAlignByDeviceTest() {
+    String[] retArray = new String[] {"d1", "20", "29", "28", "19", "20"};
+    String[] columnNames = {
+      "Device", "count(s1)", "count(s2)", "count(s3)", "count(s4)", "count(s5)"
+    };
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery("select count(*) from d1 align by device")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] ans = new String[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = resultSet.getString(index);
+          }
+          assertArrayEquals(retArray, ans);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countAllAlignedAndNonAlignedWithoutTimeFilterAlignByDeviceTest() {
+    String[] retArray = new String[] {"d1,20,29,28,19,20,", "d2,19,29,28,18,19,"};
+    String[] columnNames = {
+      "Device", "count(s1)", "count(s2)", "count(s3)", "count(s4)", "count(s5)"
+    };
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery("select count(*) from root.sg1.* align by device")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          StringBuilder builder = new StringBuilder();
+          for (String columnName : columnNames) {
+            int index = map.get(columnName);
+            builder.append(resultSet.getString(index)).append(",");
+          }
+          assertEquals(retArray[cnt], builder.toString());
+          cnt++;
+        }
+        assertEquals(retArray.length, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countAllAlignedWithTimeFilterAlignByDeviceTest() {
+    String[] retArray = new String[] {"d1", "12", "15", "22", "13", "6"};
+    String[] columnNames = {
+      "Device", "count(s1)", "count(s2)", "count(s3)", "count(s4)", "count(s5)"
+    };
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(*) from d1 where time >= 9 and time <= 33 align by device")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] ans = new String[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = resultSet.getString(index);
+          }
+          assertArrayEquals(retArray, ans);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  /** aggregate multi columns of aligned timeseries in one SQL */
+  @Ignore
+  @Test
+  public void aggregateSomeAlignedWithoutTimeFilterAlignByDeviceTest() {
+    double[] retArray =
+        new double[] {
+          20, 29, 28, 390184, 130549, 390417, 19509.2, 4501.689655172413, 13943.464285714286
+        };
+    String[] columnNames = {
+      "Device",
+      "count(s1)",
+      "count(s2)",
+      "count(s3)",
+      "sum(s1)",
+      "sum(s2)",
+      "sum(s3)",
+      "avg(s1)",
+      "avg(s2)",
+      "avg(s3)",
+    };
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1),count(s2),count(s3),sum(s1),sum(s2),sum(s3),avg(s1),avg(s2),avg(s3) from d1 align by device")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>();
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          double[] ans = new double[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 1; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i - 1] = Double.parseDouble(resultSet.getString(index));
+            assertEquals(retArray[i - 1], ans[i - 1], DELTA);
+          }
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countAlignedWithValueFilterAlignByDeviceTest() {
+    String[] retArray = new String[] {"d1", "11"};
+    String[] columnNames = {"Device", "count(s4)"};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery("select count(s4) from d1 where s4 = true align by device")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] ans = new String[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = resultSet.getString(index);
+          }
+          assertArrayEquals(retArray, ans);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void aggregationFuncAlignedWithValueFilterAlignByDeviceTest() {
+    String[] retArray =
+        new String[] {"d1", "8", "42.0", "5.25", "1.0", "9.0", "1", "9", "1.0", "9.0"};
+    String[] columnNames = {
+      "Device",
+      "count(s1)",
+      "sum(s1)",
+      "avg(s1)",
+      "first_value(s1)",
+      "last_value(s1)",
+      "min_time(s1)",
+      "max_time(s1)",
+      "min_value(s1)",
+      "max_value(s1)",
+    };
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1), sum(s1), avg(s1), "
+                  + "first_value(s1), last_value(s1), "
+                  + "min_time(s1), max_time(s1),"
+                  + "max_value(s1), min_value(s1) from d1 where s1 < 10 "
+                  + "align by device")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] ans = new String[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = resultSet.getString(index);
+          }
+          assertArrayEquals(retArray, ans);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countAllAlignedWithValueFilterAlignByDeviceTest() {
+    String[] retArray = new String[] {"d1", "6", "6", "9", "11", "6"};
+    String[] columnNames = {
+      "Device", "count(s1)", "count(s2)", "count(s3)", "count(s4)", "count(s5)"
+    };
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery("select count(*) from d1 where s4 = true " + "align by device")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] ans = new String[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = resultSet.getString(index);
+          }
+          assertArrayEquals(retArray, ans);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void aggregationAllAlignedWithValueFilterAlignByDeviceTest() {
+    String[] retArray = new String[] {"d1", "160016.0", "11", "1", "13"};
+    String[] columnNames = {
+      "Device", "sum(s1)", "count(s4)", "min_value(s3)", "max_time(s2)",
+    };
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select sum(s1), count(s4), min_value(s3), max_time(s2) from d1 where s4 = true "
+                  + "align by device")) {
+        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+        Map<String, Integer> map = new HashMap<>(); // used to adjust result sequence
+        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+          map.put(resultSetMetaData.getColumnName(i), i);
+        }
+        assertEquals(columnNames.length, resultSetMetaData.getColumnCount());
+        int cnt = 0;
+        while (resultSet.next()) {
+          String[] ans = new String[columnNames.length];
+          // No need to add time column for aggregation query
+          for (int i = 0; i < columnNames.length; i++) {
+            String columnName = columnNames[i];
+            int index = map.get(columnName);
+            ans[i] = resultSet.getString(index);
+          }
+          assertArrayEquals(retArray, ans);
+          cnt++;
+        }
+        assertEquals(1, cnt);
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countSumAvgGroupByTimeAlignByDeviceTest() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,d1,4,40.0,7.5",
+          "11,d1,10,130142.0,13014.2",
+          "21,d1,1,null,230000.0",
+          "31,d1,0,355.0,null"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1), sum(s2), avg(s1) from d1 "
+                  + "where time > 5 GROUP BY ([1, 41), 10ms) align by device")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(ColumnHeaderConstant.DEVICE)
+                  + ","
+                  + resultSet.getString(count("s1"))
+                  + ","
+                  + resultSet.getString(sum("s2"))
+                  + ","
+                  + resultSet.getString(avg("s1"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void maxMinValueGroupByTimeAlignByDeviceTest() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,d1,10,6.0,10,6",
+          "11,d1,130000,11.0,20,11",
+          "21,d1,230000,230000.0,null,21",
+          "31,d1,null,null,40,null"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+                  + "where time > 5 GROUP BY ([1, 41), 10ms) align by device")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(ColumnHeaderConstant.DEVICE)
+                  + ","
+                  + resultSet.getString(maxValue("s3"))
+                  + ","
+                  + resultSet.getString(minValue("s1"))
+                  + ","
+                  + resultSet.getString(maxTime("s2"))
+                  + ","
+                  + resultSet.getString(minTime("s3"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void firstLastGroupByTimeAlignByDeviceTest() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,d1,null,null", "6,d1,true,aligned_test7",
+          "11,d1,true,aligned_unseq_test13", "16,d1,null,null",
+          "21,d1,true,null", "26,d1,false,null",
+          "31,d1,null,aligned_test31", "36,d1,null,aligned_test36"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select last_value(s4), first_value(s5) from d1 "
+                  + "where time > 5 and time < 38 GROUP BY ([1, 41), 5ms) align by device")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(ColumnHeaderConstant.DEVICE)
+                  + ","
+                  + resultSet.getString(lastValue("s4"))
+                  + ","
+                  + resultSet.getString(firstValue("s5"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void groupByWithWildcardAlignByDeviceTest() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,d1,9,9,8,8,9,9.0,10,10,true,aligned_test10",
+          "11,d1,10,10,10,1,1,20.0,20,20,true,aligned_unseq_test13",
+          "21,d1,1,0,10,10,0,230000.0,null,30,false,null",
+          "31,d1,0,10,0,0,10,null,40,null,null,aligned_test40"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(*), last_value(*) from d1 GROUP BY ([1, 41), 10ms) align by device")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(ColumnHeaderConstant.DEVICE)
+                  + ","
+                  + resultSet.getString(count("s1"))
+                  + ","
+                  + resultSet.getString(count("s2"))
+                  + ","
+                  + resultSet.getString(count("s3"))
+                  + ","
+                  + resultSet.getString(count("s4"))
+                  + ","
+                  + resultSet.getString(count("s5"))
+                  + ","
+                  + resultSet.getString(lastValue("s1"))
+                  + ","
+                  + resultSet.getString(lastValue("s2"))
+                  + ","
+                  + resultSet.getString(lastValue("s3"))
+                  + ","
+                  + resultSet.getString(lastValue("s4"))
+                  + ","
+                  + resultSet.getString(lastValue("s5"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void groupByWithNonAlignedTimeseriesAlignByDeviceTest() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,d1,0,null,null",
+          "7,d1,3,34.0,8.0",
+          "13,d1,4,130045.0,32511.25",
+          "19,d1,2,39.0,19.5",
+          "25,d1,0,null,null",
+          "31,d1,0,130.0,null",
+          "37,d1,0,154.0,null",
+          "1,d2,0,null,null",
+          "7,d2,3,34.0,8.0",
+          "13,d2,4,58.0,14.5",
+          "19,d2,2,39.0,19.5",
+          "25,d2,0,null,null",
+          "31,d2,0,130.0,null",
+          "37,d2,0,154.0,null"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1), sum(s2), avg(s1) from root.sg1.* "
+                  + "where time > 5 GROUP BY ([1, 41), 4ms, 6ms) align by device")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(ColumnHeaderConstant.DEVICE)
+                  + ","
+                  + resultSet.getString(count("s1"))
+                  + ","
+                  + resultSet.getString(sum("s2"))
+                  + ","
+                  + resultSet.getString(avg("s1"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countSumAvgPreviousFillAlignByDeviceTest() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,d1,4,40.0,7.5",
+          "11,d1,10,130142.0,13014.2",
+          "21,d1,1,130142.0,230000.0",
+          "31,d1,0,355.0,230000.0"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1), sum(s2), avg(s1) from d1 "
+                  + "where time > 5 GROUP BY ([1, 41), 10ms) FILL (previous) align by device")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(ColumnHeaderConstant.DEVICE)
+                  + ","
+                  + resultSet.getString(count("s1"))
+                  + ","
+                  + resultSet.getString(sum("s2"))
+                  + ","
+                  + resultSet.getString(avg("s1"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countSumAvgValueFillAlignByDeviceTest() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,d1,1,3.0,30000.0",
+          "6,d1,4,40.0,7.5",
+          "11,d1,5,130052.0,26010.4",
+          "16,d1,5,90.0,18.0",
+          "21,d1,1,3.0,230000.0",
+          "26,d1,0,3.0,3.0",
+          "31,d1,0,3.0,3.0"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1), sum(s2), avg(s1) from d1 "
+                  + "where s3 > 5 and time < 30 GROUP BY ([1, 36), 5ms) FILL (3) align by device")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(ColumnHeaderConstant.DEVICE)
+                  + ","
+                  + resultSet.getString(count("s1"))
+                  + ","
+                  + resultSet.getString(sum("s2"))
+                  + ","
+                  + resultSet.getString(avg("s1"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+    }
+  }
+
+  // --------------------------GroupByWithoutValueFilter--------------------------
+  @Ignore
+  @Test
+  public void countSumAvgGroupByTest1() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,4,40.0,7.5", "11,10,130142.0,13014.2", "21,1,null,230000.0", "31,0,355.0,null"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1), sum(s2), avg(s1) from d1 "
+                  + "where time > 5 GROUP BY ([1, 41), 10ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("d1.s1"))
+                  + ","
+                  + resultSet.getString(sum("d1.s2"))
+                  + ","
+                  + resultSet.getString(avg("d1.s1"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1), sum(s2), avg(s1) from d1 "
+                  + " where time > 5 GROUP BY ([1, 41), 10ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("d1.s1"))
+                  + ","
+                  + resultSet.getString(sum("d1.s2"))
+                  + ","
+                  + resultSet.getString(avg("d1.s1"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countSumAvgGroupByTest2() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,0,null,null", "6,4,40.0,7.5", "11,5,130052.0,26010.4", "16,5,90.0,18.0",
+          "21,1,null,230000.0", "26,0,null,null", "31,0,165.0,null", "36,0,73.0,null"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1), sum(s2), avg(s1) from d1 "
+                  + "where time > 5 and time < 38 GROUP BY ([1, 41), 5ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("d1.s1"))
+                  + ","
+                  + resultSet.getString(sum("d1.s2"))
+                  + ","
+                  + resultSet.getString(avg("d1.s1"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1), sum(s2), avg(s1) from d1 "
+                  + " where time > 5 and time < 38 GROUP BY ([1, 41), 5ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("d1.s1"))
+                  + ","
+                  + resultSet.getString(sum("d1.s2"))
+                  + ","
+                  + resultSet.getString(avg("d1.s1"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countSumAvgGroupByWithSlidingStepTest() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,0,null,null",
+          "7,3,34.0,8.0",
+          "13,4,130045.0,32511.25",
+          "19,2,39.0,19.5",
+          "25,0,null,null",
+          "31,0,130.0,null",
+          "37,0,154.0,null"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1), sum(s2), avg(s1) from d1 "
+                  + "where time > 5 GROUP BY ([1, 41), 4ms, 6ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("d1.s1"))
+                  + ","
+                  + resultSet.getString(sum("d1.s2"))
+                  + ","
+                  + resultSet.getString(avg("d1.s1"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(s1), sum(s2), avg(s1) from d1 "
+                  + " where time > 5 GROUP BY ([1, 41), 4ms, 6ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("d1.s1"))
+                  + ","
+                  + resultSet.getString(sum("d1.s2"))
+                  + ","
+                  + resultSet.getString(avg("d1.s1"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void countSumAvgGroupByWithNonAlignedTimeseriesTest() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,0,null,null,0,null,null",
+          "7,3,34.0,8.0,4,34.0,8.5",
+          "13,4,58.0,14.5,4,130045.0,14.5",
+          "19,2,39.0,19.5,4,39.0,20.5",
+          "25,0,null,null,4,null,26.5",
+          "31,0,130.0,null,0,130.0,null",
+          "37,0,154.0,null,0,154.0,null"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(d1.s1), sum(d2.s2), avg(d2.s1), count(d1.s3), sum(d1.s2), avg(d2.s3) "
+                  + "from root.sg1 where time > 5 GROUP BY ([1, 41), 4ms, 6ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("d1.s1"))
+                  + ","
+                  + resultSet.getString(sum("d2.s2"))
+                  + ","
+                  + resultSet.getString(avg("d2.s1"))
+                  + ","
+                  + resultSet.getString(count("d1.s3"))
+                  + ","
+                  + resultSet.getString(sum("d1.s2"))
+                  + ","
+                  + resultSet.getString(avg("d2.s3"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(d1.s1), sum(d2.s2), avg(d2.s1), count(d1.s3), sum(d1.s2), avg(d2.s3) "
+                  + "from root.sg1 where time > 5 GROUP BY ([1, 41), 4ms, 6ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("d1.s1"))
+                  + ","
+                  + resultSet.getString(sum("d2.s2"))
+                  + ","
+                  + resultSet.getString(avg("d2.s1"))
+                  + ","
+                  + resultSet.getString(count("d1.s3"))
+                  + ","
+                  + resultSet.getString(sum("d1.s2"))
+                  + ","
+                  + resultSet.getString(avg("d2.s3"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void maxMinValueTimeGroupByTest1() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,10,6.0,10,6",
+          "11,130000,11.0,20,11",
+          "21,230000,230000.0,null,21",
+          "31,null,null,40,null"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+                  + "where time > 5 GROUP BY ([1, 41), 10ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(maxValue("d1.s3"))
+                  + ","
+                  + resultSet.getString(minValue("d1.s1"))
+                  + ","
+                  + resultSet.getString(maxTime("d1.s2"))
+                  + ","
+                  + resultSet.getString(minTime("d1.s3"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+                  + " where time > 5 GROUP BY ([1, 41), 10ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(maxValue("d1.s3"))
+                  + ","
+                  + resultSet.getString(minValue("d1.s1"))
+                  + ","
+                  + resultSet.getString(maxTime("d1.s2"))
+                  + ","
+                  + resultSet.getString(minTime("d1.s3"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void maxMinValueTimeGroupByTest2() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,null,null,null,null",
+          "6,10,6.0,10,6",
+          "11,130000,11.0,15,11",
+          "16,20,16.0,20,16",
+          "21,230000,230000.0,null,21",
+          "26,30,null,null,26",
+          "31,null,null,35,null",
+          "36,null,null,37,null"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+                  + "where time > 5 and time < 38 GROUP BY ([1, 41), 5ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(maxValue("d1.s3"))
+                  + ","
+                  + resultSet.getString(minValue("d1.s1"))
+                  + ","
+                  + resultSet.getString(maxTime("d1.s2"))
+                  + ","
+                  + resultSet.getString(minTime("d1.s3"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+                  + " where time > 5 and time < 38 GROUP BY ([1, 41), 5ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(maxValue("d1.s3"))
+                  + ","
+                  + resultSet.getString(minValue("d1.s1"))
+                  + ","
+                  + resultSet.getString(maxTime("d1.s2"))
+                  + ","
+                  + resultSet.getString(minTime("d1.s3"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void maxMinValueTimeGroupByWithSlidingStepTest() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,null,null,null,null",
+          "7,10,7.0,10,7",
+          "13,130000,14.0,16,13",
+          "19,22,19.0,20,19",
+          "25,28,null,null,25",
+          "31,null,null,34,null",
+          "37,null,null,40,null"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+                  + "where time > 5 GROUP BY ([1, 41), 4ms, 6ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(maxValue("d1.s3"))
+                  + ","
+                  + resultSet.getString(minValue("d1.s1"))
+                  + ","
+                  + resultSet.getString(maxTime("d1.s2"))
+                  + ","
+                  + resultSet.getString(minTime("d1.s3"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select max_value(s3), min_value(s1), max_time(s2), min_time(s3) from d1 "
+                  + " where time > 5 GROUP BY ([1, 41), 4ms, 6ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(maxValue("d1.s3"))
+                  + ","
+                  + resultSet.getString(minValue("d1.s1"))
+                  + ","
+                  + resultSet.getString(maxTime("d1.s2"))
+                  + ","
+                  + resultSet.getString(minTime("d1.s3"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void maxMinValueTimeGroupByWithNonAlignedTimeseriesTest() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,null,null,null,null,null,null,null,null",
+          "7,10,7.0,10,7,10,7.0,10,7",
+          "13,16,14.0,16,13,130000,13.0,16,13",
+          "19,22,19.0,20,19,22,19.0,20,19",
+          "25,28,null,null,25,28,null,null,25",
+          "31,null,null,34,null,null,null,34,null",
+          "37,null,null,37,null,null,null,37,null"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select max_value(d2.s3), min_value(d1.s1), max_time(d2.s2), min_time(d1.s3), "
+                  + "max_value(d1.s3), min_value(d2.s1), max_time(d1.s2), min_time(d2.s3) "
+                  + "from root.sg1 where time > 5 and time < 38 GROUP BY ([1, 41), 4ms, 6ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(maxValue("d2.s3"))
+                  + ","
+                  + resultSet.getString(minValue("d1.s1"))
+                  + ","
+                  + resultSet.getString(maxTime("d2.s2"))
+                  + ","
+                  + resultSet.getString(minTime("d1.s3"))
+                  + ","
+                  + resultSet.getString(maxValue("d1.s3"))
+                  + ","
+                  + resultSet.getString(minValue("d2.s1"))
+                  + ","
+                  + resultSet.getString(maxTime("d1.s2"))
+                  + ","
+                  + resultSet.getString(minTime("d2.s3"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select max_value(d2.s3), min_value(d1.s1), max_time(d2.s2), min_time(d1.s3), "
+                  + "max_value(d1.s3), min_value(d2.s1), max_time(d1.s2), min_time(d2.s3) "
+                  + "from root.sg1 where time > 5 and time < 38 GROUP BY ([1, 41), 4ms, 6ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(maxValue("d2.s3"))
+                  + ","
+                  + resultSet.getString(minValue("d1.s1"))
+                  + ","
+                  + resultSet.getString(maxTime("d2.s2"))
+                  + ","
+                  + resultSet.getString(minTime("d1.s3"))
+                  + ","
+                  + resultSet.getString(maxValue("d1.s3"))
+                  + ","
+                  + resultSet.getString(minValue("d2.s1"))
+                  + ","
+                  + resultSet.getString(maxTime("d1.s2"))
+                  + ","
+                  + resultSet.getString(minTime("d2.s3"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void firstLastGroupByTest1() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,true,aligned_test7",
+          "11,true,aligned_unseq_test13",
+          "21,false,null",
+          "31,null,aligned_test31"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select last_value(s4), first_value(s5) from d1 "
+                  + "where time > 5 GROUP BY ([1, 41), 10ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(lastValue("d1.s4"))
+                  + ","
+                  + resultSet.getString(firstValue("d1.s5"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select last_value(s4), first_value(s5) from d1 "
+                  + " where time > 5 GROUP BY ([1, 41), 10ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(lastValue("d1.s4"))
+                  + ","
+                  + resultSet.getString(firstValue("d1.s5"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void firstLastGroupByTest2() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,null,null", "6,true,aligned_test7", "11,true,aligned_unseq_test13", "16,null,null",
+          "21,true,null", "26,false,null", "31,null,aligned_test31", "36,null,aligned_test36"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select last_value(s4), first_value(s5) from d1 "
+                  + "where time > 5 and time < 38 GROUP BY ([1, 41), 5ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(lastValue("d1.s4"))
+                  + ","
+                  + resultSet.getString(firstValue("d1.s5"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select last_value(s4), first_value(s5) from d1 "
+                  + " where time > 5 and time < 38 GROUP BY ([1, 41), 5ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(lastValue("d1.s4"))
+                  + ","
+                  + resultSet.getString(firstValue("d1.s5"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void firstLastGroupByWithSlidingStepTest() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,null,null",
+          "7,true,aligned_test7",
+          "13,true,aligned_unseq_test13",
+          "19,true,null",
+          "25,false,null",
+          "31,null,aligned_test31",
+          "37,null,aligned_test37"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select last_value(s4), first_value(s5) from d1 "
+                  + "where time > 5 and time < 38 GROUP BY ([1, 41), 4ms, 6ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(lastValue("d1.s4"))
+                  + ","
+                  + resultSet.getString(firstValue("d1.s5"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select last_value(s4), first_value(s5) from d1 "
+                  + " where time > 5 and time < 38 GROUP BY ([1, 41), 4ms, 6ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(lastValue("d1.s4"))
+                  + ","
+                  + resultSet.getString(firstValue("d1.s5"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void firstLastGroupByWithNonAlignedTimeseriesTest() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,null,null,null,null",
+          "7,non_aligned_test10,false,aligned_test10,false",
+          "13,null,true,aligned_unseq_test13,null",
+          "19,null,true,null,true",
+          "25,null,true,null,true",
+          "31,non_aligned_test34,null,aligned_test34,null",
+          "37,non_aligned_test37,null,aligned_test37,null"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select last_value(d2.s5), first_value(d1.s4), last_value(d1.s5), first_value(d2.s4) "
+                  + "from root.sg1 where time > 5 and time < 38 GROUP BY ([1, 41), 4ms, 6ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(lastValue("d2.s5"))
+                  + ","
+                  + resultSet.getString(firstValue("d1.s4"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s5"))
+                  + ","
+                  + resultSet.getString(firstValue("d2.s4"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select last_value(d2.s5), first_value(d1.s4), last_value(d1.s5), first_value(d2.s4) "
+                  + "from root.sg1 where time > 5 and time < 38 "
+                  + "GROUP BY ([1, 41), 4ms, 6ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(lastValue("d2.s5"))
+                  + ","
+                  + resultSet.getString(firstValue("d1.s4"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s5"))
+                  + ","
+                  + resultSet.getString(firstValue("d2.s4"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void groupByWithWildcardTest1() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,9,9,8,8,9,9.0,10,10,true,aligned_test10",
+          "11,10,10,10,1,1,20.0,20,20,true,aligned_unseq_test13",
+          "21,1,0,10,10,0,230000.0,null,30,false,null",
+          "31,0,10,0,0,10,null,40,null,null,aligned_test40"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(*), last_value(*) from d1 GROUP BY ([1, 41), 10ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("d1.s1"))
+                  + ","
+                  + resultSet.getString(count("d1.s2"))
+                  + ","
+                  + resultSet.getString(count("d1.s3"))
+                  + ","
+                  + resultSet.getString(count("d1.s4"))
+                  + ","
+                  + resultSet.getString(count("d1.s5"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s1"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s2"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s3"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s4"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s5"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(*), last_value(*) from d1 "
+                  + "GROUP BY ([1, 41), 10ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("d1.s1"))
+                  + ","
+                  + resultSet.getString(count("d1.s2"))
+                  + ","
+                  + resultSet.getString(count("d1.s3"))
+                  + ","
+                  + resultSet.getString(count("d1.s4"))
+                  + ","
+                  + resultSet.getString(count("d1.s5"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s1"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s2"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s3"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s4"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s5"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void groupByWithWildcardTest2() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,0,0,0,0,0",
+          "5,2,2,2,2,1",
+          "9,2,3,3,2,2",
+          "13,3,3,3,1,1",
+          "17,3,3,3,0,0",
+          "21,1,0,3,3,0",
+          "25,0,0,3,3,0",
+          "29,0,1,2,2,1",
+          "33,0,3,0,0,3",
+          "37,0,1,0,0,1"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(*) from d1 "
+                  + "where time > 5 and time < 38 GROUP BY ([1, 41), 3ms, 4ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("d1.s1"))
+                  + ","
+                  + resultSet.getString(count("d1.s2"))
+                  + ","
+                  + resultSet.getString(count("d1.s3"))
+                  + ","
+                  + resultSet.getString(count("d1.s4"))
+                  + ","
+                  + resultSet.getString(count("d1.s5"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select count(*) from d1 "
+                  + " where time > 5 and time < 38 GROUP BY ([1, 41), 3ms, 4ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(count("d1.s1"))
+                  + ","
+                  + resultSet.getString(count("d1.s2"))
+                  + ","
+                  + resultSet.getString(count("d1.s3"))
+                  + ","
+                  + resultSet.getString(count("d1.s4"))
+                  + ","
+                  + resultSet.getString(count("d1.s5"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void groupByWithWildcardTest3() throws SQLException {
+    String[] retArray =
+        new String[] {
+          "1,null,null,null,null,null",
+          "5,7.0,7,7,false,aligned_test7",
+          "9,11.0,11,11,true,aligned_test10",
+          "13,15.0,15,15,true,aligned_unseq_test13",
+          "17,19.0,19,19,null,null",
+          "21,230000.0,null,230000,false,null",
+          "25,null,null,27,false,null",
+          "29,null,31,30,false,aligned_test31",
+          "33,null,35,null,null,aligned_test35",
+          "37,null,37,null,null,aligned_test37"
+        };
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      int cnt;
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select last_value(*) from d1 "
+                  + "where time > 5 and time < 38 GROUP BY ([1, 41), 3ms, 4ms)")) {
+        cnt = 0;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(lastValue("d1.s1"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s2"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s3"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s4"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s5"));
+          Assert.assertEquals(retArray[cnt], ans);
+          cnt++;
+        }
+        Assert.assertEquals(retArray.length, cnt);
+      }
+
+      try (ResultSet resultSet =
+          statement.executeQuery(
+              "select last_value(*) from d1 "
+                  + " where time > 5 and time < 38 GROUP BY ([1, 41), 3ms, 4ms) order by time desc")) {
+        cnt = retArray.length;
+        while (resultSet.next()) {
+          String ans =
+              resultSet.getString(TIMESTAMP_STR)
+                  + ","
+                  + resultSet.getString(lastValue("d1.s1"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s2"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s3"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s4"))
+                  + ","
+                  + resultSet.getString(lastValue("d1.s5"));
+          Assert.assertEquals(retArray[cnt - 1], ans);
+          cnt--;
+        }
+        Assert.assertEquals(0, cnt);
+      }
+    }
+  }
+
+  @Ignore
+  @Test
+  public void groupByWithoutAggregationFuncTest() {
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      statement.executeQuery("select s1 from d1 group by ([0, 100), 5ms)");
+
+      fail("No expected exception thrown");
+    } catch (Exception e) {
+      Assert.assertTrue(
+          e.getMessage(),
+          e.getMessage()
+              .contains(
+                  "Common queries and aggregated queries are not allowed to appear at the same time"));
+    }
+  }
+
+  @Ignore
+  @Test
+  public void negativeOrZeroTimeIntervalTest() {
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      statement.executeQuery(
+          "select count(s1), sum(s2), avg(s1) from  d1 "
+              + "where time > 5 GROUP BY ([1, 41), 0ms)");
+      fail();
+    } catch (Exception e) {
+      Assert.assertTrue(
+          e.getMessage(),
+          e.getMessage()
+              .contains("The second parameter time interval should be a positive integer."));
+    }
+  }
+}
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable2IT.java
similarity index 76%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable2IT.java
index f19a20779e9..3b0a379d9f3 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable2IT.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
 
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,13 +31,20 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceWithTemplate2IT extends IoTDBAlignByDeviceWithTemplateIT {
+public class IoTDBPredicatePushDownTable2IT extends IoTDBPredicatePushDownTableIT {
 
   @BeforeClass
   public static void setUp() throws Exception {
-    EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+    EnvFactory.getEnv()
+        .getConfig()
+        .getCommonConfig()
+        .setEnableSeqSpaceCompaction(false)
+        .setEnableUnseqSpaceCompaction(false)
+        .setEnableCrossSpaceCompaction(false)
+        .setMaxTsBlockLineNumber(3)
+        .setMaxNumberOfPointsInPage(2);
     EnvFactory.getEnv().initClusterEnvironment();
-    insertData();
+    TableUtils.insertData();
   }
 
   @AfterClass
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable3IT.java
similarity index 74%
copy from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
copy to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable3IT.java
index f19a20779e9..72d786abf6d 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable3IT.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
 
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,17 +31,24 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceWithTemplate2IT extends IoTDBAlignByDeviceWithTemplateIT {
+public class IoTDBPredicatePushDownTable3IT extends IoTDBPredicatePushDownTableIT {
 
   @BeforeClass
   public static void setUp() throws Exception {
-    EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+    EnvFactory.getEnv()
+        .getConfig()
+        .getCommonConfig()
+        .setEnableSeqSpaceCompaction(false)
+        .setEnableUnseqSpaceCompaction(false)
+        .setEnableCrossSpaceCompaction(false)
+        .setMaxTsBlockLineNumber(3)
+        .setMaxNumberOfPointsInPage(3);
     EnvFactory.getEnv().initClusterEnvironment();
-    insertData();
+    TableUtils.insertData();
   }
 
   @AfterClass
-  public static void tearDown() throws Exception {
+  public static void tearDown() {
     EnvFactory.getEnv().cleanClusterEnvironment();
   }
 }
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable4IT.java
similarity index 76%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable4IT.java
index f19a20779e9..590f0233625 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/alignbydevice/IoTDBAlignByDeviceWithTemplate2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTable4IT.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.relational.it.query.old.alignbydevice;
+package org.apache.iotdb.relational.it.query.old.aligned;
 
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -31,13 +31,20 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBAlignByDeviceWithTemplate2IT extends IoTDBAlignByDeviceWithTemplateIT {
+public class IoTDBPredicatePushDownTable4IT extends IoTDBPredicatePushDownTableIT {
 
   @BeforeClass
   public static void setUp() throws Exception {
-    EnvFactory.getEnv().getConfig().getCommonConfig().setSeriesSlotNum(1);
+    EnvFactory.getEnv()
+        .getConfig()
+        .getCommonConfig()
+        .setEnableSeqSpaceCompaction(false)
+        .setEnableUnseqSpaceCompaction(false)
+        .setEnableCrossSpaceCompaction(false)
+        .setMaxTsBlockLineNumber(3)
+        .setDegreeOfParallelism(4);
     EnvFactory.getEnv().initClusterEnvironment();
-    insertData();
+    TableUtils.insertData();
   }
 
   @AfterClass
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTableIT.java
new file mode 100644
index 00000000000..f1f58cd41e5
--- /dev/null
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/IoTDBPredicatePushDownTableIT.java
@@ -0,0 +1,683 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.relational.it.query.old.aligned;
+
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.ClusterIT;
+import org.apache.iotdb.itbase.category.LocalStandaloneIT;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import static org.apache.iotdb.relational.it.query.old.aligned.TableUtils.tableResultSetEqualTest;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({LocalStandaloneIT.class, ClusterIT.class})
+public class IoTDBPredicatePushDownTableIT {
+
+  private final String database = "db";
+
+  @BeforeClass
+  public static void setUp() throws Exception {
+    EnvFactory.getEnv()
+        .getConfig()
+        .getCommonConfig()
+        .setEnableSeqSpaceCompaction(false)
+        .setEnableUnseqSpaceCompaction(false)
+        .setEnableCrossSpaceCompaction(false)
+        .setMaxTsBlockLineNumber(3);
+    EnvFactory.getEnv().initClusterEnvironment();
+    TableUtils.insertData();
+  }
+
+  @AfterClass
+  public static void tearDown() throws Exception {
+    EnvFactory.getEnv().cleanClusterEnvironment();
+  }
+
+  @Test
+  public void testAlignedRawDataAlignByTime1() {
+    String[] expectedHeader1 = new String[] {"Time", "s2", "s3"};
+    String[] retArray1 =
+        new String[] {
+          "10,10,10,",
+          "11,11,11,",
+          "12,12,12,",
+          "14,14,14,",
+          "15,15,15,",
+          "16,16,16,",
+          "17,17,17,",
+          "18,18,18,",
+          "19,19,19,",
+          "20,20,20,"
+        };
+    tableResultSetEqualTest(
+        "select Time,s2, s3 from table0 where device='d1' and s2 - 1 >= 9 and s2 < 30",
+        expectedHeader1,
+        retArray1,
+        database);
+
+    String[] expectedHeader2 = new String[] {"Time", "s3"};
+    String[] retArray2 =
+        new String[] {
+          "10,10,", "11,11,", "12,12,", "14,14,", "15,15,", "16,16,", "17,17,", "18,18,", "19,19,",
+          "20,20,"
+        };
+    tableResultSetEqualTest(
+        "select Time,s3 from table0 where device='d1' and s2 - 1 >= 9 and s2 < 30",
+        expectedHeader2,
+        retArray2,
+        database);
+
+    String[] expectedHeader3 = new String[] {"Time", "s2"};
+    String[] retArray3 =
+        new String[] {
+          "10,10,", "11,11,", "12,12,", "14,14,", "15,15,", "16,16,", "17,17,", "18,18,", "19,19,",
+          "20,20,"
+        };
+    tableResultSetEqualTest(
+        "select Time,s2 from table0 where device='d1' and s2 - 1 >= 9 and s2 < 30",
+        expectedHeader3,
+        retArray3,
+        database);
+
+    String[] expectedHeader4 = new String[] {"Time", "s2"};
+    String[] retArray4 = new String[] {"14,14,", "15,15,"};
+    tableResultSetEqualTest(
+        "select Time,s2 from table0 where device='d1' and s2 - 1 >= 9 and s2 < 30 offset 3 limit 2",
+        expectedHeader4,
+        retArray4,
+        database);
+  }
+
+  // TODO fix it
+  @Test
+  public void testAlignedRawDataAlignByTime2() {
+    String[] expectedHeader1 = new String[] {"Time", "s2", "_col2"};
+    String[] retArray1 =
+        new String[] {
+          "3,null,30001.0,",
+          "13,130000,130001.0,",
+          "16,16,17.0,",
+          "17,17,18.0,",
+          "18,18,19.0,",
+          "19,19,20.0,",
+          "20,20,21.0,",
+          "21,null,22.0,",
+          "22,null,23.0,",
+          "23,null,230001.0,",
+          "24,null,25.0,",
+          "25,null,26.0,",
+          "26,null,27.0,",
+          "27,null,28.0,",
+          "28,null,29.0,",
+          "29,null,30.0,",
+          "30,null,31.0,",
+        };
+    tableResultSetEqualTest(
+        "select Time,s2, s3 + 1 from table0 where device='d1' and s3 + 1 > 16",
+        expectedHeader1,
+        retArray1,
+        database);
+
+    String[] expectedHeader2 = new String[] {"Time", "s2"};
+    String[] retArray2 =
+        new String[] {
+          "3,null,",
+          "13,130000,",
+          "16,16,",
+          "17,17,",
+          "18,18,",
+          "19,19,",
+          "20,20,",
+          "21,null,",
+          "22,null,",
+          "23,null,",
+          "24,null,",
+          "25,null,",
+          "26,null,",
+          "27,null,",
+          "28,null,",
+          "29,null,",
+          "30,null,",
+        };
+    tableResultSetEqualTest(
+        "select Time,s2 from table0 where device='d1' and s3 + 1 > 16",
+        expectedHeader2,
+        retArray2,
+        database);
+
+    String[] expectedHeader3 = new String[] {"Time", "s3"};
+    String[] retArray3 =
+        new String[] {
+          "3,30000,",
+          "13,130000,",
+          "16,16,",
+          "17,17,",
+          "18,18,",
+          "19,19,",
+          "20,20,",
+          "21,21,",
+          "22,22,",
+          "23,230000,",
+          "24,24,",
+          "25,25,",
+          "26,26,",
+          "27,27,",
+          "28,28,",
+          "29,29,",
+          "30,30,",
+        };
+    tableResultSetEqualTest(
+        "select Time,s3 from table0 where device='d1' and s3 + 1 > 16",
+        expectedHeader3,
+        retArray3,
+        database);
+
+    String[] expectedHeader4 = new String[] {"Time", "s3"};
+    String[] retArray4 = new String[] {"3,30000,", "13,130000,", "16,16,"};
+    tableResultSetEqualTest(
+        "select Time,s3 from table0 where device='d1' and s3 + 1 > 16 limit 3",
+        expectedHeader4,
+        retArray4,
+        database);
+  }
+
+  @Test
+  public void testNonAlignedRawDataAlignByTime1() {
+    String[] expectedHeader1 = new String[] {"Time", "s2", "s3"};
+    String[] retArray1 =
+        new String[] {
+          "10,10,10,",
+          "11,11,11,",
+          "12,12,12,",
+          "13,13,13,",
+          "14,14,14,",
+          "15,15,15,",
+          "16,16,16,",
+          "17,17,17,",
+          "18,18,18,",
+          "19,19,19,",
+          "20,20,20,"
+        };
+    tableResultSetEqualTest(
+        "select Time,s2, s3 from table0 where device='d2' and s2 - 1 >= 9 and s2 < 30",
+        expectedHeader1,
+        retArray1,
+        database);
+
+    String[] expectedHeader2 = new String[] {"Time", "s3"};
+    String[] retArray2 =
+        new String[] {
+          "10,10,", "11,11,", "12,12,", "13,13,", "14,14,", "15,15,", "16,16,", "17,17,", "18,18,",
+          "19,19,", "20,20,"
+        };
+    tableResultSetEqualTest(
+        "select Time,s3 from table0 where device='d2' and s2 - 1 >= 9 and s2 < 30",
+        expectedHeader2,
+        retArray2,
+        database);
+
+    String[] expectedHeader3 = new String[] {"Time", "s2"};
+    String[] retArray3 =
+        new String[] {
+          "10,10,", "11,11,", "12,12,", "13,13,", "14,14,", "15,15,", "16,16,", "17,17,", "18,18,",
+          "19,19,", "20,20,"
+        };
+    tableResultSetEqualTest(
+        "select Time,s2 from table0 where device='d2' and s2 - 1 >= 9 and s2 < 30",
+        expectedHeader3,
+        retArray3,
+        database);
+
+    String[] expectedHeader4 = new String[] {"Time", "s2"};
+    String[] retArray4 = new String[] {"12,12,", "13,13,", "14,14,"};
+    tableResultSetEqualTest(
+        "select Time,s2 from table0 where device='d2' and s2 - 1 >= 9 and s2 < 30 offset 2 limit 3",
+        expectedHeader4,
+        retArray4,
+        database);
+  }
+
+  @Test
+  public void testNonAlignedRawDataAlignByTime2() {
+    String[] expectedHeader1 = new String[] {"Time", "s2", "s3"};
+    String[] retArray1 =
+        new String[] {
+          "16,16,16,",
+          "17,17,17,",
+          "18,18,18,",
+          "19,19,19,",
+          "20,20,20,",
+          "21,null,21,",
+          "22,null,22,",
+          "23,null,23,",
+          "24,null,24,",
+          "25,null,25,",
+          "26,null,26,",
+          "27,null,27,",
+          "28,null,28,",
+          "29,null,29,",
+          "30,null,30,",
+        };
+    tableResultSetEqualTest(
+        "select Time,s2, s3 from table0 where device='d2' and s3 + 1 > 16",
+        expectedHeader1,
+        retArray1,
+        database);
+
+    String[] expectedHeader2 = new String[] {"Time", "s2"};
+    String[] retArray2 =
+        new String[] {
+          "16,16,",
+          "17,17,",
+          "18,18,",
+          "19,19,",
+          "20,20,",
+          "21,null,",
+          "22,null,",
+          "23,null,",
+          "24,null,",
+          "25,null,",
+          "26,null,",
+          "27,null,",
+          "28,null,",
+          "29,null,",
+          "30,null,",
+        };
+    tableResultSetEqualTest(
+        "select Time,s2 from table0 where device='d2' and s3 + 1 > 16",
+        expectedHeader2,
+        retArray2,
+        database);
+
+    String[] expectedHeader3 = new String[] {"Time", "s3"};
+    String[] retArray3 =
+        new String[] {
+          "16,16,", "17,17,", "18,18,", "19,19,", "20,20,", "21,21,", "22,22,", "23,23,", "24,24,",
+          "25,25,", "26,26,", "27,27,", "28,28,", "29,29,", "30,30,",
+        };
+    tableResultSetEqualTest(
+        "select Time,s3 from table0 where device='d2' and s3 + 1 > 16",
+        expectedHeader3,
+        retArray3,
+        database);
+
+    String[] expectedHeader4 = new String[] {"Time", "s3"};
+    String[] retArray4 =
+        new String[] {
+          "26,26,", "27,27,", "28,28,", "29,29,", "30,30,",
+        };
+    tableResultSetEqualTest(
+        "select Time,s3 from table0 where device='d2' and s3 + 1 > 16 offset 10",
+        expectedHeader4,
+        retArray4,
+        database);
+  }
+
+  @Ignore
+  @Test
+  public void testAlignedAggregationAlignByTime1() {
+    String[] expectedHeader1 = new String[] {"count(d1.s2),count(d1.s3),"};
+    String[] retArray1 =
+        new String[] {
+          "10,10,",
+        };
+    tableResultSetEqualTest(
+        "select count(s2), count(s3) from d1 where s2  - 1 >= 9 and s2 < 30",
+        expectedHeader1,
+        retArray1,
+        database);
+
+    String[] expectedHeader2 = new String[] {"count(d1.s3),"};
+    String[] retArray2 = new String[] {"10,"};
+    tableResultSetEqualTest(
+        "select count(s3) from d1 where s2  - 1 >= 9 and s2 < 30",
+        expectedHeader2,
+        retArray2,
+        database);
+
+    String[] expectedHeader3 = new String[] {"count(d1.s2),"};
+    String[] retArray3 =
+        new String[] {
+          "10,",
+        };
+    tableResultSetEqualTest(
+        "select count(s2) from d1 where s2  - 1 >= 9 and s2 < 30",
+        expectedHeader3,
+        retArray3,
+        database);
+  }
+
+  //  @Ignore
+  //  @Test
+  //  public void testAlignedAggregationAlignByTime2() {
+  //    String[] expectedHeader1 = new String[]{"count(d1.s2),count(d1.s3 + 1),"};
+  //    String[] retArray1 =
+  //        new String[] {
+  //          "6,17,",
+  //        };
+  //    tableResultSetEqualTest(
+  //        "select count(s2), count(s3 + 1) from d1 where s3  + 1 > 16",
+  //        expectedHeader1,
+  //        retArray1, database);
+  //
+  //    String[] expectedHeader2 = "count(d1.s2),";
+  //    String[] retArray2 =
+  //        new String[] {
+  //          "6,",
+  //        };
+  //    tableResultSetEqualTest(
+  //        "select count(s2) from d1 where s3  + 1 > 16", expectedHeader2, retArray2, database);
+  //
+  //    String[] expectedHeader3 = "count(d1.s3),";
+  //    String[] retArray3 =
+  //        new String[] {
+  //          "17,",
+  //        };
+  //    tableResultSetEqualTest(
+  //        "select count(s3) from d1 where s3  + 1 > 16", expectedHeader3, retArray3, database);
+  //  }
+  //
+  //  @Ignore
+  //  @Test
+  //  public void testNonAlignedAggregationAlignByTime1() {
+  //    String[] expectedHeader1 = "count(d2.s2),count(d2.s3),";
+  //    String[] retArray1 = new String[] {"11,11,"};
+  //    tableResultSetEqualTest(
+  //        "select count(s2), count(s3) from d2 where s2  - 1 >= 9 and s2 < 30",
+  //        expectedHeader1,
+  //        retArray1, database);
+  //
+  //    String[] expectedHeader2 = "count(d2.s3),";
+  //    String[] retArray2 = new String[] {"11,"};
+  //    tableResultSetEqualTest(
+  //        "select count(s3) from d2 where s2  - 1 >= 9 and s2 < 30",
+  //        expectedHeader2,
+  //        retArray2, database);
+  //
+  //    String[] expectedHeader3 = "count(d2.s2),";
+  //    String[] retArray3 = new String[] {"11,"};
+  //    tableResultSetEqualTest(
+  //        "select count(s2) from d2 where s2  - 1 >= 9 and s2 < 30",
+  //        expectedHeader3,
+  //        retArray3, database);
+  //  }
+  //
+  //  @Ignore
+  //  @Test
+  //  public void testNonAlignedAggregationAlignByTime2() {
+  //    String[] expectedHeader1 = "count(d2.s2),count(d2.s3),";
+  //    String[] retArray1 =
+  //        new String[] {
+  //          "5,15,",
+  //        };
+  //    tableResultSetEqualTest(
+  //        "select count(s2), count(s3) from d2 where s3  + 1 > 16",
+  //        expectedHeader1,
+  //        retArray1, database);
+  //
+  //    String[] expectedHeader2 = "count(d2.s2),";
+  //    String[] retArray2 =
+  //        new String[] {
+  //          "5,",
+  //        };
+  //    tableResultSetEqualTest(
+  //        "select count(s2) from d2 where s3  + 1 > 16", expectedHeader2, retArray2, database);
+  //
+  //    String[] expectedHeader3 = "count(d2.s3),";
+  //    String[] retArray3 =
+  //        new String[] {
+  //          "15,",
+  //        };
+  //    tableResultSetEqualTest(
+  //        "select count(s3) from d2 where s3  + 1 > 16", expectedHeader3, retArray3, database);
+  //  }
+  //
+  //  @Ignore
+  //  @Test
+  //  public void testMixAggregationAlignByTime() {
+  //    String[] expectedHeader1 =
+  //        "count(d1.s2),count(d2.s2),count(d1.s3),count(d2.s3),";
+  //    String[] retArray1 =
+  //        new String[] {
+  //          "10,10,10,10,",
+  //        };
+  //    tableResultSetEqualTest(
+  //        "select count(s2), count(s3) from d1, d2 where s2  - 1 >= 9 and s2 < 30",
+  //        expectedHeader1,
+  //        retArray1, database);
+  //  }
+  //
+  //  @Ignore
+  //  @Test
+  //  public void testAlignedGroupByTimeAlignByTime1() {
+  //    String[] expectedHeader = "Time,count(d1.s2),sum(d1.s3),";
+  //    String[] retArray = new String[] {"1,1,10.0,", "11,9,142.0,", "21,0,null,", "31,0,null,"};
+  //    tableResultSetEqualTest(
+  //        "select count(s2), sum(s3) from d1 where s2  - 1 >= 9 and s2 < 30 group by ([1, 41),
+  // 10ms)",
+  //        expectedHeader,
+  //        retArray, database);
+  //  }
+  //
+  //  @Ignore
+  //  @Test
+  //  public void testAlignedGroupByTimeAlignByTime2() {
+  //    String[] expectedHeader = "Time,count(d1.s2),sum(d1.s3),";
+  //    String[] retArray =
+  //        new String[] {"1,0,30000.0,", "11,6,130090.0,", "21,0,230232.0,", "31,0,null,"};
+  //    tableResultSetEqualTest(
+  //        "select count(s2), sum(s3) from d1 where s3  + 1 > 16 group by ([1, 41), 10ms)",
+  //        expectedHeader,
+  //        retArray, database);
+  //  }
+  //
+  //  @Ignore
+  //  @Test
+  //  public void testNonAlignedGroupByTimeAlignByTime1() {
+  //    String[] expectedHeader = "Time,count(d2.s2),sum(d2.s3 + 1),";
+  //    String[] retArray = new String[] {"1,1,11.0,", "11,10,165.0,", "21,0,null,", "31,0,null,"};
+  //    tableResultSetEqualTest(
+  //        "select count(s2), sum(s3 + 1) from d2 where s2  - 1 >= 9 and s2 < 30 group by ([1, 41),
+  // 10ms)",
+  //        expectedHeader,
+  //        retArray, database);
+  //  }
+  //
+  //  @Ignore
+  //  @Test
+  //  public void testNonAlignedGroupByTimeAlignByTime2() {
+  //    String[] expectedHeader = "Time,count(d2.s2),sum(d2.s3),";
+  //    String[] retArray = new String[] {"1,0,null,", "11,5,90.0,", "21,0,255.0,", "31,0,null,"};
+  //    tableResultSetEqualTest(
+  //        "select count(s2), sum(s3) from d2 where s3 + 1 > 16 group by ([1, 41), 10ms)",
+  //        expectedHeader,
+  //        retArray, database);
+  //  }
+  //
+  //  @Ignore
+  //  @Test
+  //  public void testMixGroupByTimeAlignByTime() {
+  //    String[] expectedHeader =
+  //        "Time,count(d1.s2),count(d2.s2),sum(d1.s3),sum(d2.s3),";
+  //    String[] retArray =
+  //        new String[] {
+  //          "1,1,1,10.0,10.0,", "11,9,9,142.0,142.0,", "21,0,0,null,null,", "31,0,0,null,null,"
+  //        };
+  //    tableResultSetEqualTest(
+  //        "select count(s2), sum(s3) from d1, d2 where s2 - 1 >= 9 and s2 < 30 group by ([1, 41),
+  // 10ms)",
+  //        expectedHeader,
+  //        retArray, database);
+  //  }
+
+  @Test
+  public void testRawDataAlignByDevice1() {
+    String[] expectedHeader = new String[] {"Time", "Device", "s2", "s3"};
+    String[] retArray =
+        new String[] {
+          "10,d2,10,10,",
+          "11,d2,11,11,",
+          "12,d2,12,12,",
+          "13,d2,13,13,",
+          "14,d2,14,14,",
+          "15,d2,15,15,",
+          "16,d2,16,16,",
+          "17,d2,17,17,",
+          "18,d2,18,18,",
+          "19,d2,19,19,",
+          "20,d2,20,20,",
+          "10,d1,10,10,",
+          "11,d1,11,11,",
+          "12,d1,12,12,",
+          "14,d1,14,14,",
+          "15,d1,15,15,",
+          "16,d1,16,16,",
+          "17,d1,17,17,",
+          "18,d1,18,18,",
+          "19,d1,19,19,",
+          "20,d1,20,20,"
+        };
+    tableResultSetEqualTest(
+        "select Time, Device,s2, s3 from table0 where s2 - 1 >= 9 and s2 < 30 order by device desc",
+        expectedHeader,
+        retArray,
+        database);
+  }
+
+  @Test
+  public void testRawDataAlignByDevice2() {
+    String[] expectedHeader = new String[] {"Time", "Device", "s2", "_col3"};
+    String[] retArray =
+        new String[] {
+          "3,d1,null,30001.0,",
+          "13,d1,130000,130001.0,",
+          "16,d1,16,17.0,",
+          "17,d1,17,18.0,",
+          "18,d1,18,19.0,",
+          "19,d1,19,20.0,",
+          "20,d1,20,21.0,",
+          "21,d1,null,22.0,",
+          "22,d1,null,23.0,",
+          "23,d1,null,230001.0,",
+          "24,d1,null,25.0,",
+          "25,d1,null,26.0,",
+          "26,d1,null,27.0,",
+          "27,d1,null,28.0,",
+          "28,d1,null,29.0,",
+          "29,d1,null,30.0,",
+          "30,d1,null,31.0,",
+          "16,d2,16,17.0,",
+          "17,d2,17,18.0,",
+          "18,d2,18,19.0,",
+          "19,d2,19,20.0,",
+          "20,d2,20,21.0,",
+          "21,d2,null,22.0,",
+          "22,d2,null,23.0,",
+          "23,d2,null,24.0,",
+          "24,d2,null,25.0,",
+          "25,d2,null,26.0,",
+          "26,d2,null,27.0,",
+          "27,d2,null,28.0,",
+          "28,d2,null,29.0,",
+          "29,d2,null,30.0,",
+          "30,d2,null,31.0,",
+        };
+    tableResultSetEqualTest(
+        "select Time,Device,s2, s3 + 1 from table0 where s3 + 1 > 16 order by device",
+        expectedHeader,
+        retArray,
+        database);
+  }
+
+  @Ignore
+  @Test
+  public void testAggregationAlignByDevice1() {
+    String[] expectedHeader = new String[] {"Device,count(s2),sum(s3),"};
+    String[] retArray = new String[] {"d2,11,165.0,", "d1,10,152.0,"};
+    tableResultSetEqualTest(
+        "select count(s2), sum(s3) from d1, d2 where s2 - 1 >= 9 and s2 < 30 order by device desc align by device",
+        expectedHeader,
+        retArray,
+        database);
+  }
+
+  @Ignore
+  @Test
+  public void testAggregationAlignByDevice2() {
+    String[] expectedHeader = new String[] {"Device,count(s2),sum(s3 + 1),"};
+    String[] retArray = new String[] {"d1,6,390339.0,", "d2,5,360.0,"};
+    tableResultSetEqualTest(
+        "select count(s2), sum(s3 + 1) from d1, d2 where s3 + 1 > 16 align by device",
+        expectedHeader,
+        retArray,
+        database);
+  }
+
+  @Ignore
+  @Test
+  public void testGroupByTimeAlignByDevice1() {
+    String[] expectedHeader = new String[] {"Time,Device,count(s2),sum(s3),"};
+    String[] retArray =
+        new String[] {
+          "1,d2,1,10.0,",
+          "11,d2,10,155.0,",
+          "21,d2,0,null,",
+          "31,d2,0,null,",
+          "1,d1,1,10.0,",
+          "11,d1,9,142.0,",
+          "21,d1,0,null,",
+          "31,d1,0,null,"
+        };
+    tableResultSetEqualTest(
+        "select count(s2), sum(s3) from d1, d2 where s2 - 1 >= 9 and s2 < 30 group by ([1, 41), 10ms) order by device desc align by device",
+        expectedHeader,
+        retArray,
+        database);
+  }
+
+  @Ignore
+  @Test
+  public void testGroupByTimeAlignByDevice2() {
+    String[] expectedHeader = new String[] {"Time,Device,count(s2),sum(s3 + 1),"};
+    String[] retArray =
+        new String[] {
+          "1,d1,0,30001.0,",
+          "11,d1,6,130096.0,",
+          "21,d1,0,230242.0,",
+          "31,d1,0,null,",
+          "1,d2,0,null,",
+          "11,d2,5,95.0,",
+          "21,d2,0,265.0,",
+          "31,d2,0,null,"
+        };
+    tableResultSetEqualTest(
+        "select count(s2), sum(s3 + 1) from d1, d2 where s3 + 1 > 16 group by ([1, 41), 10ms) align by device",
+        expectedHeader,
+        retArray,
+        database);
+  }
+}
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/TableUtils.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/TableUtils.java
new file mode 100644
index 00000000000..eba1ba84fbe
--- /dev/null
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/aligned/TableUtils.java
@@ -0,0 +1,216 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.relational.it.query.old.aligned;
+
+import org.apache.iotdb.isession.ISession;
+import org.apache.iotdb.isession.SessionConfig;
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.itbase.env.BaseEnv;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+/**
+ * This class generates data for test cases in aligned time series scenarios.
+ *
+ * <p>You can comprehensively view the generated data in the following online doc:
+ *
+ * <p>https://docs.google.com/spreadsheets/d/1kfrSR1_paSd9B1Z0jnPBD3WQIMDslDuNm4R0mpWx9Ms/edit?usp=sharing
+ */
+public class TableUtils {
+
+  public static final String USE_DB = "use db";
+
+  private static final String[] sqls =
+      new String[] {
+        "CREATE DATABASE db",
+        "USE db",
+        "CREATE TABLE table0 (device string id, s1 FLOAT measurement, s2 INT32 measurement, s3 INT64 measurement, s4 BOOLEAN measurement, s5 TEXT measurement)",
+        "insert into table0(device, time, s1, s2, s3, s4, s5) values('d1', 1, 1.0, 1, 1, TRUE, 'aligned_test1')",
+        "insert into table0(device, time, s1, s2, s3, s5) values('d1', 2, 2.0, 2, 2, 'aligned_test2')",
+        "insert into table0(device, time, s1, s3, s4, s5) values('d1', 3, 3.0, 3, FALSE, 'aligned_test3')",
+        "insert into table0(device, time, s1, s2, s4, s5) values('d1', 4, 4.0, 4, TRUE, 'aligned_test4')",
+        "insert into table0(device, time, s1, s2, s4, s5) values('d1', 5, 5.0, 5, TRUE, 'aligned_test5')",
+        "insert into table0(device, time, s1, s2, s3, s4) values('d1', 6, 6.0, 6, 6, TRUE)",
+        "insert into table0(device, time, s1, s2, s3, s4, s5) values('d1',7, 7.0, 7, 7, FALSE, 'aligned_test7')",
+        "insert into table0(device, time, s1, s2, s3, s5) values('d1',8, 8.0, 8, 8, 'aligned_test8')",
+        "insert into table0(device, time, s1, s2, s3, s4, s5) values('d1',9, 9.0, 9, 9, FALSE, 'aligned_test9')",
+        "insert into table0(device, time, s2, s3, s4, s5) values('d1',10, 10, 10, TRUE, 'aligned_test10')",
+        "insert into table0(device, time, s1, s2, s3, s4, s5) values('d2',1, 1.0, 1, 1, TRUE, 'non_aligned_test1')",
+        "insert into table0(device, time, s1, s2, s3, s5) values('d2',2, 2.0, 2, 2, 'non_aligned_test2')",
+        "insert into table0(device, time, s1, s3, s4, s5) values('d2',3, 3.0, 3, FALSE, 'non_aligned_test3')",
+        "insert into table0(device, time, s1, s2, s4, s5) values('d2',4, 4.0, 4, TRUE, 'non_aligned_test4')",
+        "insert into table0(device, time, s1, s2, s4, s5) values('d2',5, 5.0, 5, TRUE, 'non_aligned_test5')",
+        "insert into table0(device, time, s1, s2, s3, s4) values('d2',6, 6.0, 6, 6, TRUE)",
+        "insert into table0(device, time, s1, s2, s3, s4, s5) values('d2',7, 7.0, 7, 7, FALSE, 'non_aligned_test7')",
+        "insert into table0(device, time, s1, s2, s3, s5) values('d2',8, 8.0, 8, 8, 'non_aligned_test8')",
+        "insert into table0(device, time, s1, s2, s3, s4, s5) values('d2',9, 9.0, 9, 9, FALSE, 'non_aligned_test9')",
+        "insert into table0(device, time, s2, s3, s4, s5) values('d2',10, 10, 10, TRUE, 'non_aligned_test10')",
+        "flush",
+        "insert into table0(device,time, s1, s3, s4, s5) values('d1',3, 30000.0, 30000, TRUE, 'aligned_unseq_test3')",
+        "insert into table0(device,time, s1, s2, s3) values('d1',11, 11.0, 11, 11)",
+        "insert into table0(device,time, s1, s2, s3) values('d1',12, 12.0, 12, 12)",
+        "insert into table0(device,time, s1, s2, s3) values('d1',13, 13.0, 13, 13)",
+        "insert into table0(device,time, s1, s2, s3) values('d1',14, 14.0, 14, 14)",
+        "insert into table0(device,time, s1, s2, s3) values('d1',15, 15.0, 15, 15)",
+        "insert into table0(device,time, s1, s2, s3) values('d1',16, 16.0, 16, 16)",
+        "insert into table0(device,time, s1, s2, s3) values('d1',17, 17.0, 17, 17)",
+        "insert into table0(device,time, s1, s2, s3) values('d1',18, 18.0, 18, 18)",
+        "insert into table0(device,time, s1, s2, s3) values('d1',19, 19.0, 19, 19)",
+        "insert into table0(device,time, s1, s2, s3) values('d1',20, 20.0, 20, 20)",
+        "insert into table0(device,time, s1, s2, s3) values('d2',11, 11.0, 11, 11)",
+        "insert into table0(device,time, s1, s2, s3) values('d2',12, 12.0, 12, 12)",
+        "insert into table0(device,time, s1, s2, s3) values('d2',13, 13.0, 13, 13)",
+        "insert into table0(device,time, s1, s2, s3) values('d2',14, 14.0, 14, 14)",
+        "insert into table0(device,time, s1, s2, s3) values('d2',15, 15.0, 15, 15)",
+        "insert into table0(device,time, s1, s2, s3) values('d2',16, 16.0, 16, 16)",
+        "insert into table0(device,time, s1, s2, s3) values('d2',17, 17.0, 17, 17)",
+        "insert into table0(device,time, s1, s2, s3) values('d2',18, 18.0, 18, 18)",
+        "insert into table0(device,time, s1, s2, s3) values('d2',19, 19.0, 19, 19)",
+        "insert into table0(device,time, s1, s2, s3) values('d2',20, 20.0, 20, 20)",
+        "flush",
+        "insert into table0(device,time, s1, s2, s3, s4, s5) values('d1',13, 130000.0, 130000, 130000, TRUE, 'aligned_unseq_test13')",
+        "insert into table0(device,time, s3, s4) values('d1',21, 21, TRUE)",
+        "insert into table0(device,time, s3, s4) values('d1',22, 22, TRUE)",
+        "insert into table0(device,time, s3, s4) values('d1',23, 23, TRUE)",
+        "insert into table0(device,time, s3, s4) values('d1',24, 24, TRUE)",
+        "insert into table0(device,time, s3, s4) values('d1',25, 25, TRUE)",
+        "insert into table0(device,time, s3, s4) values('d1',26, 26, FALSE)",
+        "insert into table0(device,time, s3, s4) values('d1',27, 27, FALSE)",
+        "insert into table0(device,time, s3, s4) values('d1',28, 28, FALSE)",
+        "insert into table0(device,time, s3, s4) values('d1',29, 29, FALSE)",
+        "insert into table0(device,time, s3, s4) values('d1',30, 30, FALSE)",
+        "insert into table0(device,time, s3, s4) values('d2',21, 21, TRUE)",
+        "insert into table0(device,time, s3, s4) values('d2',22, 22, TRUE)",
+        "insert into table0(device,time, s3, s4) values('d2',23, 23, TRUE)",
+        "insert into table0(device,time, s3, s4) values('d2',24, 24, TRUE)",
+        "insert into table0(device,time, s3, s4) values('d2',25, 25, TRUE)",
+        "insert into table0(device,time, s3, s4) values('d2',26, 26, FALSE)",
+        "insert into table0(device,time, s3, s4) values('d2',27, 27, FALSE)",
+        "insert into table0(device,time, s3, s4) values('d2',28, 28, FALSE)",
+        "insert into table0(device,time, s3, s4) values('d2',29, 29, FALSE)",
+        "insert into table0(device,time, s3, s4) values('d2',30, 30, FALSE)",
+        "flush",
+        "insert into table0(device,time, s1, s3, s4) values('d1',23, 230000.0, 230000, FALSE)",
+        "insert into table0(device,time, s2, s5) values('d1',31, 31, 'aligned_test31')",
+        "insert into table0(device,time, s2, s5) values('d1',32, 32, 'aligned_test32')",
+        "insert into table0(device,time, s2, s5) values('d1',33, 33, 'aligned_test33')",
+        "insert into table0(device,time, s2, s5) values('d1',34, 34, 'aligned_test34')",
+        "insert into table0(device,time, s2, s5) values('d1',35, 35, 'aligned_test35')",
+        "insert into table0(device,time, s2, s5) values('d1',36, 36, 'aligned_test36')",
+        "insert into table0(device,time, s2, s5) values('d1',37, 37, 'aligned_test37')",
+        "insert into table0(device,time, s2, s5) values('d1',38, 38, 'aligned_test38')",
+        "insert into table0(device,time, s2, s5) values('d1',39, 39, 'aligned_test39')",
+        "insert into table0(device,time, s2, s5) values('d1',40, 40, 'aligned_test40')",
+        "insert into table0(device,time, s2, s5) values('d2',31, 31, 'non_aligned_test31')",
+        "insert into table0(device,time, s2, s5) values('d2',32, 32, 'non_aligned_test32')",
+        "insert into table0(device,time, s2, s5) values('d2',33, 33, 'non_aligned_test33')",
+        "insert into table0(device,time, s2, s5) values('d2',34, 34, 'non_aligned_test34')",
+        "insert into table0(device,time, s2, s5) values('d2',35, 35, 'non_aligned_test35')",
+        "insert into table0(device,time, s2, s5) values('d2',36, 36, 'non_aligned_test36')",
+        "insert into table0(device,time, s2, s5) values('d2',37, 37, 'non_aligned_test37')",
+        "insert into table0(device,time, s2, s5) values('d2',38, 38, 'non_aligned_test38')",
+        "insert into table0(device,time, s2, s5) values('d2',39, 39, 'non_aligned_test39')",
+        "insert into table0(device,time, s2, s5) values('d2',40, 40, 'non_aligned_test40')",
+      };
+
+  public static void insertData() {
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+
+      for (String sql : sqls) {
+        statement.addBatch(sql);
+      }
+      statement.executeBatch();
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  public static void insertDataWithSession() {
+    try (ISession session = EnvFactory.getEnv().getSessionConnection()) {
+      for (String sql : sqls) {
+        session.executeNonQueryStatement(sql);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  public static void tableResultSetEqualTest(
+      String sql, String[] expectedHeader, String[] expectedRetArray, String database) {
+    tableResultSetEqualTest(
+        sql,
+        expectedHeader,
+        expectedRetArray,
+        SessionConfig.DEFAULT_USER,
+        SessionConfig.DEFAULT_PASSWORD,
+        database);
+  }
+
+  public static void tableResultSetEqualTest(
+      String sql,
+      String[] expectedHeader,
+      String[] expectedRetArray,
+      String userName,
+      String password,
+      String database) {
+    try (Connection connection =
+        EnvFactory.getEnv().getConnection(userName, password, BaseEnv.TABLE_SQL_DIALECT)) {
+      connection.setClientInfo("time_zone", "+00:00");
+      try (Statement statement = connection.createStatement()) {
+        statement.execute("use " + database);
+        try (ResultSet resultSet = statement.executeQuery(sql)) {
+          ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+          for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+            assertEquals(expectedHeader[i - 1], resultSetMetaData.getColumnName(i));
+          }
+          assertEquals(expectedHeader.length, resultSetMetaData.getColumnCount());
+
+          int cnt = 0;
+          while (resultSet.next()) {
+            StringBuilder builder = new StringBuilder();
+
+            for (int i = 1; i <= expectedHeader.length; i++) {
+              if (i == 1) {
+                builder.append(resultSet.getLong(i)).append(",");
+              } else {
+                builder.append(resultSet.getString(i)).append(",");
+              }
+            }
+            assertEquals(expectedRetArray[cnt], builder.toString());
+            cnt++;
+          }
+          assertEquals(expectedRetArray.length, cnt);
+        }
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+}
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionTableIT.java
index ba40f782452..f9d7e675393 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionTableIT.java
@@ -41,7 +41,7 @@ import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBCastFunctionIT {
+public class IoTDBCastFunctionTableIT {
 
   private static final String DATABASE_NAME = "db";
 
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunction2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTable2IT.java
similarity index 95%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunction2IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTable2IT.java
index a6fefaf68a1..1443d1a8c0d 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunction2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTable2IT.java
@@ -30,7 +30,7 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBDiffFunction2IT extends IoTDBDiffFunctionIT {
+public class IoTDBDiffFunctionTable2IT extends IoTDBDiffFunctionTableIT {
   @BeforeClass
   public static void setUp() throws Exception {
     EnvFactory.getEnv().getConfig().getCommonConfig().setDataRegionGroupExtensionPolicy("CUSTOM");
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunction3IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTable3IT.java
similarity index 95%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunction3IT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTable3IT.java
index 82a298331dc..8819fbbb217 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunction3IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTable3IT.java
@@ -30,7 +30,7 @@ import org.junit.runner.RunWith;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBDiffFunction3IT extends IoTDBDiffFunctionIT {
+public class IoTDBDiffFunctionTable3IT extends IoTDBDiffFunctionTableIT {
   @BeforeClass
   public static void setUp() throws Exception {
     EnvFactory.getEnv().getConfig().getCommonConfig().setDataRegionGroupExtensionPolicy("CUSTOM");
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTableIT.java
index bb34853abf0..bc0cc0ce00d 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBDiffFunctionTableIT.java
@@ -38,7 +38,7 @@ import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBDiffFunctionIT {
+public class IoTDBDiffFunctionTableIT {
 
   private static final String DATABASE_NAME = "db";
 
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBReplaceFunctionIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBReplaceFunctionTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBReplaceFunctionIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBReplaceFunctionTableIT.java
index 25e0351ce42..d44636febf4 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBReplaceFunctionIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBReplaceFunctionTableIT.java
@@ -41,7 +41,7 @@ import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBReplaceFunctionIT {
+public class IoTDBReplaceFunctionTableIT {
 
   private static final String DATABASE_NAME = "db";
   private static final String[] SQLs =
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBRoundFunctionIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBRoundFunctionTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBRoundFunctionIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBRoundFunctionTableIT.java
index 2fe37d04ad2..7b5d658b303 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBRoundFunctionIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBRoundFunctionTableIT.java
@@ -41,7 +41,7 @@ import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBRoundFunctionIT {
+public class IoTDBRoundFunctionTableIT {
 
   private static final String DATABASE_NAME = "db";
 
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBSubStringFunctionIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBSubStringFunctionTableIT.java
similarity index 99%
rename from integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBSubStringFunctionIT.java
rename to integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBSubStringFunctionTableIT.java
index ba19a52a937..d31c12525b8 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBSubStringFunctionIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBSubStringFunctionTableIT.java
@@ -40,7 +40,7 @@ import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({LocalStandaloneIT.class, ClusterIT.class})
-public class IoTDBSubStringFunctionIT {
+public class IoTDBSubStringFunctionTableIT {
 
   private static final String DATABASE_NAME = "db";
 
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/orderBy/IoTDBOrderByTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/orderBy/IoTDBOrderByTableIT.java
new file mode 100644
index 00000000000..e7d33580760
--- /dev/null
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/orderBy/IoTDBOrderByTableIT.java
@@ -0,0 +1,1566 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.relational.it.query.old.orderBy;
+
+import org.apache.iotdb.isession.ISession;
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.ClusterIT;
+import org.apache.iotdb.itbase.category.LocalStandaloneIT;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.write.record.Tablet;
+import org.apache.tsfile.write.schema.IMeasurementSchema;
+import org.apache.tsfile.write.schema.MeasurementSchema;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import static org.apache.iotdb.itbase.env.BaseEnv.TABLE_SQL_DIALECT;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({LocalStandaloneIT.class, ClusterIT.class})
+public class IoTDBOrderByTableIT {
+
+  // the data can be viewed in
+  // https://docs.google.com/spreadsheets/d/1OWA1bKraArCwWVnuTjuhJ5yLG0PFLdD78gD6FjquepI/edit#gid=0
+  private static final String[] sql =
+      new String[] {
+        "CREATE DATABASE sg",
+        "USE sg",
+        "CREATE TABLE table0 (device string id, attr1 string attribute, num int32 measurement, bigNum int64 measurement, "
+            + "floatNum double measurement, str TEXT measurement, bool BOOLEAN measurement);",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 0,3,2947483648,231.2121,'coconut',FALSE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 20,2,2147483648,434.12,'pineapple',TRUE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 40,1,2247483648,12.123,'apricot',TRUE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 80,9,2147483646,43.12,'apple',FALSE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 100,8,2147483964,4654.231,'papaya',TRUE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 31536000000,6,2147483650,1231.21,'banana',TRUE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 31536000100,10,3147483648,231.55,'pumelo',FALSE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 31536000500,4,2147493648,213.1,'peach',FALSE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 31536001000,5,2149783648,56.32,'orange',FALSE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 31536010000,7,2147983648,213.112,'lemon',TRUE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 31536100000,11,2147468648,54.121,'pitaya',FALSE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 41536000000,12,2146483648,45.231,'strawberry',FALSE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 41536000020,14,2907483648,231.34,'cherry',FALSE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 41536900000,13,2107483648,54.12,'lychee',TRUE)",
+        "insert into table0(device, time,num,bigNum,floatNum,str,bool) values('d1', 51536000000,15,3147483648,235.213,'watermelon',TRUE)"
+      };
+
+  private static final String[] sql2 =
+      new String[] {
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',0,3,2947483648,231.2121,'coconut',FALSE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',20,2,2147483648,434.12,'pineapple',TRUE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',40,1,2247483648,12.123,'apricot',TRUE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',80,9,2147483646,43.12,'apple',FALSE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',100,8,2147483964,4654.231,'papaya',TRUE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',31536000000,6,2147483650,1231.21,'banana',TRUE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',31536000100,10,3147483648,231.55,'pumelo',FALSE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',31536000500,4,2147493648,213.1,'peach',FALSE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',31536001000,5,2149783648,56.32,'orange',FALSE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',31536010000,7,2147983648,213.112,'lemon',TRUE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',31536100000,11,2147468648,54.121,'pitaya',FALSE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',41536000000,12,2146483648,45.231,'strawberry',FALSE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',41536000020,14,2907483648,231.34,'cherry',FALSE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',41536900000,13,2107483648,54.12,'lychee',TRUE)",
+        "insert into table0(device,time,num,bigNum,floatNum,str,bool) values('d2',51536000000,15,3147483648,235.213,'watermelon',TRUE)"
+      };
+
+  @BeforeClass
+  public static void setUp() throws Exception {
+    EnvFactory.getEnv().getConfig().getDataNodeCommonConfig().setSortBufferSize(1024 * 1024L);
+    EnvFactory.getEnv().initClusterEnvironment();
+    insertData();
+  }
+
+  @AfterClass
+  public static void tearDown() throws Exception {
+    EnvFactory.getEnv().cleanClusterEnvironment();
+  }
+
+  private static void insertData() {
+    insertData1();
+    insertData2();
+  }
+
+  private static String USE_DB = "use db0";
+
+  // ordinal data
+  public static final String[][] RES =
+      new String[][] {
+        {"0", "3", "2947483648", "231.2121", "coconut", "false"},
+        {"20", "2", "2147483648", "434.12", "pineapple", "true"},
+        {"40", "1", "2247483648", "12.123", "apricot", "true"},
+        {"80", "9", "2147483646", "43.12", "apple", "false"},
+        {"100", "8", "2147483964", "4654.231", "papaya", "true"},
+        {"31536000000", "6", "2147483650", "1231.21", "banana", "true"},
+        {"31536000100", "10", "3147483648", "231.55", "pumelo", "false"},
+        {"31536000500", "4", "2147493648", "213.1", "peach", "false"},
+        {"31536001000", "5", "2149783648", "56.32", "orange", "false"},
+        {"31536010000", "7", "2147983648", "213.112", "lemon", "true"},
+        {"31536100000", "11", "2147468648", "54.121", "pitaya", "false"},
+        {"41536000000", "12", "2146483648", "45.231", "strawberry", "false"},
+        {"41536000020", "14", "2907483648", "231.34", "cherry", "false"},
+        {"41536900000", "13", "2107483648", "54.12", "lychee", "true"},
+        {"51536000000", "15", "3147483648", "235.213", "watermelon", "true"},
+      };
+
+  private void checkHeader(ResultSetMetaData resultSetMetaData, String[] title)
+      throws SQLException {
+    for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
+      assertEquals(title[i - 1], resultSetMetaData.getColumnName(i));
+    }
+  }
+
+  private void testNormalOrderBy(String sql, int[] ans) {
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        ResultSetMetaData metaData = resultSet.getMetaData();
+        checkHeader(metaData, new String[] {"Time", "num", "bigNum", "floatNum", "str", "bool"});
+        int i = 0;
+        while (resultSet.next()) {
+
+          long actualTime = resultSet.getLong(1);
+          String actualNum = resultSet.getString(2);
+          String actualBigNum = resultSet.getString(3);
+          double actualFloatNum = resultSet.getDouble(4);
+          String actualStr = resultSet.getString(5);
+          String actualBool = resultSet.getString(6);
+
+          // System.out.println(actualTime + "," + actualNum + "," + actualBigNum + "," +
+          // actualFloatNum);
+
+          assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+          assertEquals(RES[ans[i]][1], actualNum);
+          assertEquals(RES[ans[i]][2], actualBigNum);
+          assertEquals(Double.parseDouble(RES[ans[i]][3]), actualFloatNum, 0.0001);
+          assertEquals(RES[ans[i]][4], actualStr);
+          assertEquals(RES[ans[i]][5], actualBool);
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Test
+  public void orderByTest1() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by num";
+    int[] ans = {2, 1, 0, 7, 8, 5, 9, 4, 3, 6, 10, 11, 13, 12, 14};
+    testNormalOrderBy(sql, ans);
+  }
+
+  @Test
+  public void orderByTest2() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by bigNum,time";
+    int[] ans = {13, 11, 10, 3, 1, 5, 4, 7, 9, 8, 2, 12, 0, 6, 14};
+    testNormalOrderBy(sql, ans);
+  }
+
+  @Test
+  public void orderByTest3() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by floatNum";
+    int[] ans = {2, 3, 11, 13, 10, 8, 7, 9, 0, 12, 6, 14, 1, 5, 4};
+    testNormalOrderBy(sql, ans);
+  }
+
+  @Test
+  public void orderByTest4() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by str";
+    int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+    testNormalOrderBy(sql, ans);
+  }
+
+  @Test
+  public void orderByTest5() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by num desc";
+    int[] ans = {2, 1, 0, 7, 8, 5, 9, 4, 3, 6, 10, 11, 13, 12, 14};
+    ArrayUtils.reverse(ans);
+    testNormalOrderBy(sql, ans);
+  }
+
+  @Test
+  public void orderByTest6() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by bigNum desc, time asc";
+    int[] ans = {6, 14, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+    testNormalOrderBy(sql, ans);
+  }
+
+  @Test
+  public void orderByTest7() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by floatNum desc";
+    int[] ans = {2, 3, 11, 13, 10, 8, 7, 9, 0, 12, 6, 14, 1, 5, 4};
+    ArrayUtils.reverse(ans);
+    testNormalOrderBy(sql, ans);
+  }
+
+  @Test
+  public void orderByTest8() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by str desc";
+    int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+    ArrayUtils.reverse(ans);
+    testNormalOrderBy(sql, ans);
+  }
+
+  @Test
+  public void orderByTest15() {
+    String sql = "select Time,num+bigNum,floatNum from table0 where device='d1' order by str";
+    int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        ResultSetMetaData metaData = resultSet.getMetaData();
+        checkHeader(metaData, new String[] {"Time", "_col1", "floatNum"});
+        int i = 0;
+        while (resultSet.next()) {
+
+          long actualTime = resultSet.getLong(1);
+          double actualNum = resultSet.getDouble(2);
+          double actualFloat = resultSet.getDouble(3);
+
+          assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+          assertEquals(
+              Long.parseLong(RES[ans[i]][1]) + Long.parseLong(RES[ans[i]][2]), actualNum, 0.0001);
+          assertEquals(Double.parseDouble(RES[ans[i]][3]), actualFloat, 0.0001);
+
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  // 2. Multi-level order by test
+  @Test
+  public void orderByTest9() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by bool asc, str asc";
+    int[] ans = {3, 12, 0, 8, 7, 10, 6, 11, 2, 5, 9, 13, 4, 1, 14};
+    testNormalOrderBy(sql, ans);
+  }
+
+  @Test
+  public void orderByTest10() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by bool asc, num desc";
+    int[] ans = {12, 11, 10, 6, 3, 8, 7, 0, 14, 13, 4, 9, 5, 1, 2};
+    testNormalOrderBy(sql, ans);
+  }
+
+  @Test
+  public void orderByTest11() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by bigNum desc, floatNum desc";
+    int[] ans = {14, 6, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+    testNormalOrderBy(sql, ans);
+  }
+
+  @Test
+  public void orderByTest12() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by str desc, floatNum desc";
+    int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+    testNormalOrderBy(sql, org.bouncycastle.util.Arrays.reverse(ans));
+  }
+
+  @Test
+  public void orderByTest13() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by num+floatNum desc, floatNum desc";
+    int[] ans = {4, 5, 1, 14, 12, 6, 0, 9, 7, 13, 10, 8, 11, 3, 2};
+    testNormalOrderBy(sql, ans);
+  }
+
+  @Test
+  public void orderByTest14() {
+    String sql =
+        "select Time,num+bigNum from table0 where device='d1' order by num+floatNum desc, floatNum desc";
+    int[] ans = {4, 5, 1, 14, 12, 6, 0, 9, 7, 13, 10, 8, 11, 3, 2};
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        ResultSetMetaData metaData = resultSet.getMetaData();
+        checkHeader(metaData, new String[] {"Time", "_col1"});
+        int i = 0;
+        while (resultSet.next()) {
+
+          long actualTime = resultSet.getLong(1);
+          double actualNum = resultSet.getDouble(2);
+
+          assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+          assertEquals(
+              Long.parseLong(RES[ans[i]][1]) + Long.parseLong(RES[ans[i]][2]), actualNum, 0.001);
+
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Test
+  public void orderByTest16() {
+    String sql =
+        "select Time,num+floatNum from table0 where device='d1' order by floatNum+num desc, floatNum desc";
+    int[] ans = {4, 5, 1, 14, 12, 6, 0, 9, 7, 13, 10, 8, 11, 3, 2};
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        ResultSetMetaData metaData = resultSet.getMetaData();
+        checkHeader(metaData, new String[] {"Time", "_col1"});
+        int i = 0;
+        while (resultSet.next()) {
+
+          long actualTime = resultSet.getLong(1);
+          double actualNum = resultSet.getDouble(2);
+
+          assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+          assertEquals(
+              Long.parseLong(RES[ans[i]][1]) + Double.parseDouble(RES[ans[i]][3]),
+              actualNum,
+              0.001);
+
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Test
+  public void orderByTest17() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by str desc, str asc";
+    int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+    testNormalOrderBy(sql, org.bouncycastle.util.Arrays.reverse(ans));
+  }
+
+  @Test
+  public void orderByTest18() {
+    String sql =
+        "select Time,num,bigNum,floatNum,str,bool from table0 where device='d1' order by str, str";
+    int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+    testNormalOrderBy(sql, ans);
+  }
+
+  // limit cannot be pushed down in ORDER BY
+  @Test
+  public void orderByTest19() {
+    String sql = "select Time,num from table0 where device='d1' order by num limit 5";
+    int[] ans = {2, 1, 0, 7, 8};
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        ResultSetMetaData metaData = resultSet.getMetaData();
+        checkHeader(metaData, new String[] {"Time", "num"});
+        int i = 0;
+        while (resultSet.next()) {
+          long actualTime = resultSet.getLong(1);
+          String actualNum = resultSet.getString(2);
+          assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+          assertEquals(RES[ans[i]][1], actualNum);
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  // 3. aggregation query
+  @Ignore
+  @Test
+  public void orderByInAggregationTest() {
+    String sql = "select avg(num) from root.sg.d group by session(10000ms) order by avg(num) desc";
+    double[][] ans = new double[][] {{15.0}, {13.0}, {13.0}, {11.0}, {6.4}, {4.6}};
+    long[] times =
+        new long[] {51536000000L, 41536000000L, 41536900000L, 31536100000L, 31536000000L, 0L};
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        int i = 0;
+        while (resultSet.next()) {
+          long actualTime = resultSet.getLong(1);
+          double actualAvg = resultSet.getDouble(2);
+          assertEquals(times[i], actualTime);
+          assertEquals(ans[i][0], actualAvg, 0.0001);
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationTest2() {
+    String sql =
+        "select avg(num) from root.sg.d group by session(10000ms) order by max_value(floatNum)";
+    double[][] ans =
+        new double[][] {
+          {13.0, 54.12},
+          {11.0, 54.121},
+          {13.0, 231.34},
+          {15.0, 235.213},
+          {6.4, 1231.21},
+          {4.6, 4654.231}
+        };
+    long[] times =
+        new long[] {41536900000L, 31536100000L, 41536000000L, 51536000000L, 31536000000L, 0L};
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        int i = 0;
+        while (resultSet.next()) {
+          long actualTime = resultSet.getLong(1);
+          double actualAvg = resultSet.getDouble(2);
+          assertEquals(times[i], actualTime);
+          assertEquals(ans[i][0], actualAvg, 0.0001);
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationTest3() {
+    String sql =
+        "select avg(num) from root.sg.d group by session(10000ms) order by avg(num) desc,max_value(floatNum)";
+    double[] ans = new double[] {15.0, 13.0, 13.0, 11.0, 6.4, 4.6};
+    long[] times =
+        new long[] {51536000000L, 41536900000L, 41536000000L, 31536100000L, 31536000000L, 0L};
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        int i = 0;
+        while (resultSet.next()) {
+          long actualTime = resultSet.getLong(1);
+          double actualAvg = resultSet.getDouble(2);
+          assertEquals(times[i], actualTime);
+          assertEquals(ans[i], actualAvg, 0.0001);
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationTest4() {
+    String sql =
+        "select avg(num)+avg(floatNum) from root.sg.d group by session(10000ms) order by avg(num)+avg(floatNum)";
+    double[][] ans =
+        new double[][] {{1079.56122}, {395.4584}, {65.121}, {151.2855}, {67.12}, {250.213}};
+    long[] times =
+        new long[] {0L, 31536000000L, 31536100000L, 41536000000L, 41536900000L, 51536000000L};
+    int[] order = new int[] {2, 4, 3, 5, 1, 0};
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        int i = 0;
+        while (resultSet.next()) {
+          long actualTime = resultSet.getLong(1);
+          double actualAvg = resultSet.getDouble(2);
+          assertEquals(times[order[i]], actualTime);
+          assertEquals(ans[order[i]][0], actualAvg, 0.0001);
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationTest5() {
+    String sql =
+        "select min_value(bigNum) from root.sg.d group by session(10000ms) order by avg(num)+avg(floatNum)";
+    long[] ans =
+        new long[] {2147483646L, 2147483650L, 2147468648L, 2146483648L, 2107483648L, 3147483648L};
+    long[] times =
+        new long[] {0L, 31536000000L, 31536100000L, 41536000000L, 41536900000L, 51536000000L};
+    int[] order = new int[] {2, 4, 3, 5, 1, 0};
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        int i = 0;
+        while (resultSet.next()) {
+          long actualTime = resultSet.getLong(1);
+          long actualMinValue = resultSet.getLong(2);
+          assertEquals(times[order[i]], actualTime);
+          assertEquals(ans[order[i]], actualMinValue, 0.0001);
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationTest6() {
+    String sql =
+        "select min_value(num)+min_value(bigNum) from root.sg.d group by session(10000ms) order by avg(num)+avg(floatNum)";
+    long[] ans =
+        new long[] {2147483647L, 2147483654L, 2147468659L, 2146483660L, 2107483661L, 3147483663L};
+    long[] times =
+        new long[] {0L, 31536000000L, 31536100000L, 41536000000L, 41536900000L, 51536000000L};
+    int[] order = new int[] {2, 4, 3, 5, 1, 0};
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        int i = 0;
+        while (resultSet.next()) {
+          long actualTime = resultSet.getLong(1);
+          double actualMinValue = resultSet.getDouble(2);
+          assertEquals(times[order[i]], actualTime);
+          assertEquals(ans[order[i]], actualMinValue, 0.0001);
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationTest7() {
+    String sql =
+        "select avg(num)+min_value(floatNum) from root.sg.d group by session(10000ms) order by max_value(floatNum)";
+    double[][] ans =
+        new double[][] {
+          {13.0, 54.12, 54.12},
+          {11.0, 54.121, 54.121},
+          {13.0, 231.34, 45.231},
+          {15.0, 235.213, 235.213},
+          {6.4, 1231.21, 56.32},
+          {4.6, 4654.231, 12.123}
+        };
+    long[] times =
+        new long[] {41536900000L, 31536100000L, 41536000000L, 51536000000L, 31536000000L, 0L};
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        int i = 0;
+        while (resultSet.next()) {
+          long actualTime = resultSet.getLong(1);
+          double actualAvg = resultSet.getDouble(2);
+          assertEquals(times[i], actualTime);
+          assertEquals(ans[i][0] + ans[i][2], actualAvg, 0.0001);
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationTest8() {
+    String sql =
+        "select avg(num)+avg(floatNum) from root.sg.d group by session(10000ms) order by avg(floatNum)+avg(num)";
+    double[][] ans =
+        new double[][] {{1079.56122}, {395.4584}, {65.121}, {151.2855}, {67.12}, {250.213}};
+    long[] times =
+        new long[] {0L, 31536000000L, 31536100000L, 41536000000L, 41536900000L, 51536000000L};
+    int[] order = new int[] {2, 4, 3, 5, 1, 0};
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        int i = 0;
+        while (resultSet.next()) {
+          long actualTime = resultSet.getLong(1);
+          double actualAvg = resultSet.getDouble(2);
+          assertEquals(times[order[i]], actualTime);
+          assertEquals(ans[order[i]][0], actualAvg, 0.0001);
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  // 4. raw data query with align by device
+  private void testNormalOrderByAlignByDevice(String sql, int[] ans) {
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        ResultSetMetaData metaData = resultSet.getMetaData();
+        checkHeader(
+            metaData, new String[] {"Time", "device", "num", "bigNum", "floatNum", "str", "bool"});
+        int i = 0;
+        int total = 0;
+        String device = "d1";
+        while (resultSet.next()) {
+
+          long actualTime = resultSet.getLong(1);
+          String actualDevice = resultSet.getString(2);
+          String actualNum = resultSet.getString(3);
+          String actualBigNum = resultSet.getString(4);
+          double actualFloatNum = resultSet.getDouble(5);
+          String actualStr = resultSet.getString(6);
+          String actualBool = resultSet.getString(7);
+
+          assertEquals(device, actualDevice);
+          assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+          assertEquals(RES[ans[i]][1], actualNum);
+          assertEquals(RES[ans[i]][2], actualBigNum);
+          assertEquals(Double.parseDouble(RES[ans[i]][3]), actualFloatNum, 0.0001);
+          assertEquals(RES[ans[i]][4], actualStr);
+          assertEquals(RES[ans[i]][5], actualBool);
+
+          if (device.equals("d1")) {
+            device = "d2";
+          } else {
+            device = "d1";
+            i++;
+          }
+          total++;
+        }
+        assertEquals(i, ans.length);
+        assertEquals(total, ans.length * 2);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest1() {
+    String sql =
+        "select Time,device,num+bigNum from table0 order by num+floatNum desc, floatNum desc, device asc";
+    int[] ans = {4, 5, 1, 14, 12, 6, 0, 9, 7, 13, 10, 8, 11, 3, 2};
+    String device = "d1";
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        int i = 0;
+        while (resultSet.next()) {
+          long actualTime = resultSet.getLong(1);
+          String actualDevice = resultSet.getString(2);
+          double actualNum = resultSet.getDouble(3);
+
+          assertEquals(device, actualDevice);
+          assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+          assertEquals(
+              Long.parseLong(RES[ans[i]][1]) + Long.parseLong(RES[ans[i]][2]), actualNum, 0.0001);
+          if (device.equals("d1")) {
+            device = "d2";
+          } else {
+            device = "d1";
+            i++;
+          }
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest2() {
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by num, device asc";
+    int[] ans = {2, 1, 0, 7, 8, 5, 9, 4, 3, 6, 10, 11, 13, 12, 14};
+    testNormalOrderByAlignByDevice(sql, ans);
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest3() {
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by floatNum, device asc";
+    int[] ans = {2, 3, 11, 13, 10, 8, 7, 9, 0, 12, 6, 14, 1, 5, 4};
+    testNormalOrderByAlignByDevice(sql, ans);
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest4() {
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by str, device asc";
+    int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+    testNormalOrderByAlignByDevice(sql, ans);
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest5() {
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by num desc, device asc";
+    int[] ans = {2, 1, 0, 7, 8, 5, 9, 4, 3, 6, 10, 11, 13, 12, 14};
+    testNormalOrderByAlignByDevice(sql, org.bouncycastle.util.Arrays.reverse(ans));
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest6() {
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by str desc, device asc";
+    int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+    testNormalOrderByAlignByDevice(sql, org.bouncycastle.util.Arrays.reverse(ans));
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest7() {
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by bool asc, num desc, device asc";
+    int[] ans = {12, 11, 10, 6, 3, 8, 7, 0, 14, 13, 4, 9, 5, 1, 2};
+    testNormalOrderByAlignByDevice(sql, ans);
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest8() {
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by bigNum desc, floatNum desc, device asc";
+    int[] ans = {14, 6, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+    testNormalOrderByAlignByDevice(sql, ans);
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest9() {
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by str desc, floatNum desc, device asc";
+    int[] ans = {3, 2, 5, 12, 0, 9, 13, 8, 4, 7, 1, 10, 6, 11, 14};
+    testNormalOrderByAlignByDevice(sql, org.bouncycastle.util.Arrays.reverse(ans));
+  }
+
+  private void testNormalOrderByMixAlignBy(String sql, int[] ans) {
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        ResultSetMetaData metaData = resultSet.getMetaData();
+        checkHeader(
+            metaData, new String[] {"Time", "device", "num", "bigNum", "floatNum", "str", "bool"});
+        int i = 0;
+        int total = 0;
+        String device = "d1";
+        while (resultSet.next()) {
+
+          long actualTime = resultSet.getLong(1);
+          String actualDevice = resultSet.getString(2);
+          String actualNum = resultSet.getString(3);
+          String actualBigNum = resultSet.getString(4);
+          double actualFloatNum = resultSet.getDouble(5);
+          String actualStr = resultSet.getString(6);
+          String actualBool = resultSet.getString(7);
+
+          assertEquals(device, actualDevice);
+          assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+          assertEquals(RES[ans[i]][1], actualNum);
+          assertEquals(RES[ans[i]][2], actualBigNum);
+          assertEquals(Double.parseDouble(RES[ans[i]][3]), actualFloatNum, 0.0001);
+          assertEquals(RES[ans[i]][4], actualStr);
+          assertEquals(RES[ans[i]][5], actualBool);
+
+          if (device.equals("d2")) {
+            i++;
+            device = "d1";
+          } else {
+            device = "d2";
+          }
+
+          total++;
+        }
+        assertEquals(total, ans.length * 2);
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  private void testDeviceViewOrderByMixAlignBy(String sql, int[] ans) {
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        ResultSetMetaData metaData = resultSet.getMetaData();
+        checkHeader(
+            metaData, new String[] {"Time", "device", "num", "bigNum", "floatNum", "str", "bool"});
+        int i = 0;
+        int total = 0;
+        String device = "d2";
+        while (resultSet.next()) {
+
+          long actualTime = resultSet.getLong(1);
+          String actualDevice = resultSet.getString(2);
+          String actualNum = resultSet.getString(3);
+          String actualBigNum = resultSet.getString(4);
+          double actualFloatNum = resultSet.getDouble(5);
+          String actualStr = resultSet.getString(6);
+          String actualBool = resultSet.getString(7);
+
+          assertEquals(device, actualDevice);
+          assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+          assertEquals(RES[ans[i]][1], actualNum);
+          assertEquals(RES[ans[i]][2], actualBigNum);
+          assertEquals(Double.parseDouble(RES[ans[i]][3]), actualFloatNum, 0.0001);
+          assertEquals(RES[ans[i]][4], actualStr);
+          assertEquals(RES[ans[i]][5], actualBool);
+
+          i++;
+          total++;
+          if (total == ans.length) {
+            i = 0;
+            if (device.equals("d2")) {
+              device = "d1";
+            } else {
+              device = "d2";
+            }
+          }
+        }
+        assertEquals(total, ans.length * 2);
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  private void orderByBigNumAlignByDevice(String sql, int[] ans) {
+    try (Connection connection = EnvFactory.getEnv().getTableConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute(USE_DB);
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        ResultSetMetaData metaData = resultSet.getMetaData();
+        checkHeader(
+            metaData, new String[] {"Time", "device", "num", "bigNum", "floatNum", "str", "bool"});
+        int i = 0;
+        int total = 0;
+        String device = "d1";
+        while (resultSet.next()) {
+
+          long actualTime = resultSet.getLong(1);
+          String actualDevice = resultSet.getString(2);
+          String actualNum = resultSet.getString(3);
+          String actualBigNum = resultSet.getString(4);
+          double actualFloatNum = resultSet.getDouble(5);
+          String actualStr = resultSet.getString(6);
+          String actualBool = resultSet.getString(7);
+
+          if (total < 4) {
+            i = total % 2;
+            if (total < 2) {
+              device = "d2";
+            } else {
+              device = "d1";
+            }
+          }
+
+          assertEquals(device, actualDevice);
+          assertEquals(Long.parseLong(RES[ans[i]][0]), actualTime);
+          assertEquals(RES[ans[i]][1], actualNum);
+          assertEquals(RES[ans[i]][2], actualBigNum);
+          assertEquals(Double.parseDouble(RES[ans[i]][3]), actualFloatNum, 0.0001);
+          assertEquals(RES[ans[i]][4], actualStr);
+          assertEquals(RES[ans[i]][5], actualBool);
+
+          if (device.equals("d2")) {
+            device = "d1";
+          } else {
+            i++;
+            device = "d2";
+          }
+
+          total++;
+        }
+        assertEquals(i, ans.length);
+        assertEquals(total, ans.length * 2);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest12() {
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by bigNum desc, device desc, time asc";
+    int[] ans = {6, 14, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+    orderByBigNumAlignByDevice(sql, ans);
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest13() {
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by bigNum desc, time desc, device asc";
+    int[] ans = {14, 6, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+    testNormalOrderByMixAlignBy(sql, ans);
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest14() {
+    int[] ans = {14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by time desc, bigNum desc, device asc";
+    testNormalOrderByMixAlignBy(sql, ans);
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest15() {
+    int[] ans = {6, 14, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by device desc, bigNum desc, time asc";
+    testDeviceViewOrderByMixAlignBy(sql, ans);
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest16() {
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by device desc, time asc, bigNum desc";
+    int[] ans = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
+    testDeviceViewOrderByMixAlignBy(sql, ans);
+  }
+
+  @Test
+  public void alignByDeviceOrderByTest17() {
+    String sql =
+        "select Time,device,num,bigNum,floatNum,str,bool from table0 order by bigNum desc, device desc, num asc, time asc";
+    int[] ans = {6, 14, 0, 12, 2, 8, 9, 7, 4, 5, 1, 3, 10, 11, 13};
+    orderByBigNumAlignByDevice(sql, ans);
+  }
+
+  // 5. aggregation query align by device
+  @Ignore
+  @Test
+  public void orderByInAggregationAlignByDeviceTest() {
+    String sql =
+        "select avg(num) from root.** group by session(10000ms) order by avg(num) align by device";
+
+    double[] ans = {4.6, 4.6, 6.4, 6.4, 11.0, 11.0, 13.0, 13.0, 13.0, 13.0, 15.0, 15.0};
+    long[] times =
+        new long[] {
+          0L,
+          0L,
+          31536000000L,
+          31536000000L,
+          31536100000L,
+          31536100000L,
+          41536000000L,
+          41536900000L,
+          41536000000L,
+          41536900000L,
+          51536000000L,
+          51536000000L
+        };
+    String[] device =
+        new String[] {
+          "root.sg.d",
+          "root.sg.d2",
+          "root.sg.d",
+          "root.sg.d2",
+          "root.sg.d",
+          "root.sg.d2",
+          "root.sg.d",
+          "root.sg.d",
+          "root.sg.d2",
+          "root.sg.d2",
+          "root.sg.d",
+          "root.sg.d2"
+        };
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        int i = 0;
+        while (resultSet.next()) {
+          long actualTime = resultSet.getLong(1);
+          String actualDevice = resultSet.getString(2);
+          double actualAvg = resultSet.getDouble(3);
+
+          assertEquals(device[i], actualDevice);
+          assertEquals(times[i], actualTime);
+          assertEquals(ans[i], actualAvg, 0.0001);
+          i++;
+        }
+        assertEquals(i, ans.length);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Test
+  @Ignore
+  public void orderByInAggregationAlignByDeviceTest2() {
+    String sql = "select avg(num) from root.** order by avg(num) align by device";
+    String value = "8";
+    checkSingleDouble(sql, value, true);
+  }
+
+  private void checkSingleDouble(String sql, Object value, boolean deviceAsc) {
+    String device = "root.sg.d";
+    if (!deviceAsc) device = "root.sg.d2";
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        int i = 0;
+        while (resultSet.next()) {
+          String deviceName = resultSet.getString(1);
+          double actualVal = resultSet.getDouble(2);
+          assertEquals(deviceName, device);
+          assertEquals(Double.parseDouble(value.toString()), actualVal, 1);
+          if (device.equals("root.sg.d")) device = "root.sg.d2";
+          else device = "root.sg.d";
+          i++;
+        }
+        assertEquals(i, 2);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationAlignByDeviceTest3() {
+    String sql =
+        "select avg(num)+avg(bigNum) from root.** order by max_value(floatNum) align by device";
+    long value = 2388936669L + 8;
+    checkSingleDouble(sql, value, true);
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationAlignByDeviceTest4() {
+
+    String sql =
+        "select avg(num)+avg(bigNum) from root.** order by max_value(floatNum)+min_value(num) align by device";
+    long value = 2388936669L + 8;
+    checkSingleDouble(sql, value, true);
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationAlignByDeviceTest5() {
+    String sql =
+        "select avg(num) from root.** order by max_value(floatNum)+avg(num) align by device";
+    String value = "8";
+    checkSingleDouble(sql, value, true);
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationAlignByDeviceTest6() {
+    String sql =
+        "select avg(num) from root.** order by max_value(floatNum)+avg(num), device asc, time desc align by device";
+    String value = "8";
+    checkSingleDouble(sql, value, true);
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationAlignByDeviceTest7() {
+    String sql =
+        "select avg(num) from root.** order by max_value(floatNum)+avg(num), time asc, device desc align by device";
+    String value = "8";
+    checkSingleDouble(sql, value, false);
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationAlignByDeviceTest8() {
+    String sql =
+        "select avg(num) from root.** order by time asc, max_value(floatNum)+avg(num), device desc align by device";
+    String value = "8";
+    checkSingleDouble(sql, value, false);
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationAlignByDeviceTest9() {
+    String sql =
+        "select avg(num) from root.** order by device asc, max_value(floatNum)+avg(num), time desc align by device";
+    String value = "8";
+    checkSingleDouble(sql, value, true);
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationAlignByDeviceTest10() {
+    String sql =
+        "select avg(num) from root.** order by max_value(floatNum) desc,time asc, avg(num) asc, device desc align by device";
+    String value = "8";
+    checkSingleDouble(sql, value, false);
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationAlignByDeviceTest11() {
+    String sql =
+        "select avg(num) from root.** order by max_value(floatNum) desc,device asc, avg(num) asc, time desc align by device";
+    String value = "8";
+    checkSingleDouble(sql, value, true);
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationAlignByDeviceTest12() {
+    String sql =
+        "select avg(num+floatNum) from root.** order by time,avg(num+floatNum) align by device";
+    String value = "537.34154";
+    checkSingleDouble(sql, value, true);
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationAlignByDeviceTest13() {
+    String sql = "select avg(num) from root.** order by time,avg(num+floatNum) align by device";
+    String value = "8";
+    checkSingleDouble(sql, value, true);
+  }
+
+  @Ignore
+  @Test
+  public void orderByInAggregationAlignByDeviceTest14() {
+    String sql = "select avg(num+floatNum) from root.** order by time,avg(num) align by device";
+    String value = "537.34154";
+    checkSingleDouble(sql, value, true);
+  }
+
+  String[][] UDFRes =
+      new String[][] {
+        {"0", "3", "0", "0"},
+        {"20", "2", "0", "0"},
+        {"40", "1", "0", "0"},
+        {"80", "9", "0", "0"},
+        {"100", "8", "0", "0"},
+        {"31536000000", "6", "0", "0"},
+        {"31536000100", "10", "0", "0"},
+        {"31536000500", "4", "0", "0"},
+        {"31536001000", "5", "0", "0"},
+        {"31536010000", "7", "0", "0"},
+        {"31536100000", "11", "0", "0"},
+        {"41536000000", "12", "2146483648", "0"},
+        {"41536000020", "14", "0", "14"},
+        {"41536900000", "13", "2107483648", "0"},
+        {"51536000000", "15", "0", "15"},
+      };
+
+  // UDF Test
+  private void orderByUDFTest(String sql, int[] ans) {
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        int i = 0;
+        while (resultSet.next()) {
+          String time = resultSet.getString(1);
+          String num = resultSet.getString(2);
+          String topK = resultSet.getString(3);
+          String bottomK = resultSet.getString(4);
+
+          assertEquals(time, UDFRes[ans[i]][0]);
+          assertEquals(num, UDFRes[ans[i]][1]);
+          if (Objects.equals(UDFRes[ans[i]][3], "0")) {
+            assertNull(topK);
+          } else {
+            assertEquals(topK, UDFRes[ans[i]][3]);
+          }
+
+          if (Objects.equals(UDFRes[ans[i]][2], "0")) {
+            assertNull(bottomK);
+          } else {
+            assertEquals(bottomK, UDFRes[ans[i]][2]);
+          }
+
+          i++;
+        }
+        assertEquals(i, 15);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Ignore
+  @Test
+  public void orderByUDFTest1() {
+    String sql =
+        "select num, top_k(num, 'k'='2'), bottom_k(bigNum, 'k'='2') from root.sg.d order by top_k(num, 'k'='2') nulls first, bottom_k(bigNum, 'k'='2') nulls first";
+    int[] ans = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 11, 12, 14};
+    orderByUDFTest(sql, ans);
+  }
+
+  @Ignore
+  @Test
+  public void orderByUDFTest2() {
+    String sql =
+        "select num, top_k(num, 'k'='2'), bottom_k(bigNum, 'k'='2') from root.sg.d order by top_k(num, 'k'='2'), bottom_k(bigNum, 'k'='2')";
+    int[] ans = {12, 14, 13, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+    orderByUDFTest(sql, ans);
+  }
+
+  private void errorTest(String sql, String error) {
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      statement.executeQuery(sql);
+    } catch (Exception e) {
+      assertEquals(error, e.getMessage());
+    }
+  }
+
+  @Ignore
+  @Test
+  public void errorTest1() {
+    errorTest(
+        "select num from root.sg.d order by avg(bigNum)",
+        "701: Raw data and aggregation hybrid query is not supported.");
+  }
+
+  @Ignore
+  @Test
+  public void errorTest2() {
+    errorTest(
+        "select avg(num) from root.sg.d order by bigNum",
+        "701: Raw data and aggregation hybrid query is not supported.");
+  }
+
+  @Test
+  public void errorTest3() {
+    errorTest(
+        "select bigNum,floatNum from table0 order by s1",
+        "700: Error occurred while parsing SQL to physical plan: line 1:28 no viable alternative at input 'select bigNum,floatNum from table0'");
+  }
+
+  @Ignore
+  @Test
+  public void errorTest4() {
+    errorTest(
+        "select bigNum,floatNum from root.** order by bigNum",
+        "701: root.**.bigNum in order by clause shouldn't refer to more than one timeseries.");
+  }
+
+  @Ignore
+  @Test
+  public void errorTest7() {
+    errorTest(
+        "select last bigNum,floatNum from root.** order by root.sg.d.bigNum",
+        "701: root.sg.d.bigNum in order by clause doesn't exist in the result of last query.");
+  }
+
+  // last query
+  public void testLastQueryOrderBy(String sql, String[][] ans) {
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      try (ResultSet resultSet = statement.executeQuery(sql)) {
+        int i = 0;
+        while (resultSet.next()) {
+          String time = resultSet.getString(1);
+          String num = resultSet.getString(2);
+          String value = resultSet.getString(3);
+          String dataType = resultSet.getString(4);
+
+          assertEquals(time, ans[0][i]);
+          assertEquals(num, ans[1][i]);
+          assertEquals(value, ans[2][i]);
+          assertEquals(dataType, ans[3][i]);
+
+          i++;
+        }
+        assertEquals(i, 4);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Ignore
+  @Test
+  public void lastQueryOrderBy() {
+    String[][] ans =
+        new String[][] {
+          {"51536000000", "51536000000", "51536000000", "51536000000"},
+          {"root.sg.d.num", "root.sg.d2.num", "root.sg.d.bigNum", "root.sg.d2.bigNum"},
+          {"15", "15", "3147483648", "3147483648"},
+          {"INT32", "INT32", "INT64", "INT64"}
+        };
+    String sql = "select last bigNum,num from root.** order by value, timeseries";
+    testLastQueryOrderBy(sql, ans);
+  }
+
+  @Ignore
+  @Test
+  public void lastQueryOrderBy2() {
+    String[][] ans =
+        new String[][] {
+          {"51536000000", "51536000000", "51536000000", "51536000000"},
+          {"root.sg.d2.num", "root.sg.d2.bigNum", "root.sg.d.num", "root.sg.d.bigNum"},
+          {"15", "3147483648", "15", "3147483648"},
+          {"INT32", "INT64", "INT32", "INT64"}
+        };
+    String sql = "select last bigNum,num from root.** order by timeseries desc";
+    testLastQueryOrderBy(sql, ans);
+  }
+
+  @Ignore
+  @Test
+  public void lastQueryOrderBy3() {
+    String[][] ans =
+        new String[][] {
+          {"51536000000", "51536000000", "51536000000", "51536000000"},
+          {"root.sg.d2.num", "root.sg.d2.bigNum", "root.sg.d.num", "root.sg.d.bigNum"},
+          {"15", "3147483648", "15", "3147483648"},
+          {"INT32", "INT64", "INT32", "INT64"}
+        };
+    String sql = "select last bigNum,num from root.** order by timeseries desc, value asc";
+    testLastQueryOrderBy(sql, ans);
+  }
+
+  @Ignore
+  @Test
+  public void lastQueryOrderBy4() {
+    String[][] ans =
+        new String[][] {
+          {"51536000000", "51536000000", "51536000000", "51536000000"},
+          {"root.sg.d2.num", "root.sg.d.num", "root.sg.d2.bigNum", "root.sg.d.bigNum"},
+          {"15", "15", "3147483648", "3147483648"},
+          {"INT32", "INT32", "INT64", "INT64"}
+        };
+    String sql = "select last bigNum,num from root.** order by value, timeseries desc";
+    testLastQueryOrderBy(sql, ans);
+  }
+
+  @Ignore
+  @Test
+  public void lastQueryOrderBy5() {
+    String[][] ans =
+        new String[][] {
+          {"51536000000", "51536000000", "51536000000", "51536000000"},
+          {"root.sg.d2.num", "root.sg.d.num", "root.sg.d2.bigNum", "root.sg.d.bigNum"},
+          {"15", "15", "3147483648", "3147483648"},
+          {"INT32", "INT32", "INT64", "INT64"}
+        };
+    String sql = "select last bigNum,num from root.** order by datatype, timeseries desc";
+    testLastQueryOrderBy(sql, ans);
+  }
+
+  private static List<Long> TIMES =
+      Arrays.asList(
+          0L,
+          20L,
+          40L,
+          80L,
+          100L,
+          31536000000L,
+          31536000100L,
+          31536000500L,
+          31536001000L,
+          31536010000L,
+          31536100000L,
+          41536000000L,
+          41536000020L,
+          41536900000L,
+          51536000000L);
+
+  protected static void insertData1() {
+    try (ISession session = EnvFactory.getEnv().getSessionConnection(TABLE_SQL_DIALECT)) {
+
+      session.open();
+      session.executeNonQueryStatement("CREATE DATABASE \"db0\"");
+      session.executeNonQueryStatement("USE \"db0\"");
+
+      List<IMeasurementSchema> schemaList = new ArrayList<>();
+      schemaList.add(new MeasurementSchema("device", TSDataType.STRING));
+      schemaList.add(new MeasurementSchema("attr1", TSDataType.STRING));
+      schemaList.add(new MeasurementSchema("num", TSDataType.INT32));
+      schemaList.add(new MeasurementSchema("bigNum", TSDataType.INT64));
+      schemaList.add(new MeasurementSchema("floatNum", TSDataType.DOUBLE));
+      schemaList.add(new MeasurementSchema("str", TSDataType.TEXT));
+      schemaList.add(new MeasurementSchema("bool", TSDataType.BOOLEAN));
+      final List<Tablet.ColumnType> columnTypes =
+          Arrays.asList(
+              Tablet.ColumnType.ID,
+              Tablet.ColumnType.ATTRIBUTE,
+              Tablet.ColumnType.MEASUREMENT,
+              Tablet.ColumnType.MEASUREMENT,
+              Tablet.ColumnType.MEASUREMENT,
+              Tablet.ColumnType.MEASUREMENT,
+              Tablet.ColumnType.MEASUREMENT);
+      List<String> measurementIds =
+          schemaList.stream()
+              .map(IMeasurementSchema::getMeasurementId)
+              .collect(Collectors.toList());
+      List<TSDataType> dataTypes =
+          schemaList.stream().map(IMeasurementSchema::getType).collect(Collectors.toList());
+
+      List<Object[]> values =
+          Arrays.asList(
+              new Object[] {"d1", "a1", 3, 2947483648L, 231.2121, "coconut", false},
+              new Object[] {"d1", "a1", 2, 2147483648L, 434.12, "pineapple", true},
+              new Object[] {"d1", "a1", 1, 2247483648L, 12.123, "apricot", true},
+              new Object[] {"d1", "a1", 9, 2147483646L, 43.12, "apple", false},
+              new Object[] {"d1", "a1", 8, 2147483964L, 4654.231, "papaya", true},
+              new Object[] {"d1", "a1", 6, 2147483650L, 1231.21, "banana", true},
+              new Object[] {"d1", "a1", 10, 3147483648L, 231.55, "pumelo", false},
+              new Object[] {"d1", "a1", 4, 2147493648L, 213.1, "peach", false},
+              new Object[] {"d1", "a1", 5, 2149783648L, 56.32, "orange", false},
+              new Object[] {"d1", "a1", 7, 2147983648L, 213.112, "lemon", true},
+              new Object[] {"d1", "a1", 11, 2147468648L, 54.121, "pitaya", false},
+              new Object[] {"d1", "a1", 12, 2146483648L, 45.231, "strawberry", false},
+              new Object[] {"d1", "a1", 14, 2907483648L, 231.34, "cherry", false},
+              new Object[] {"d1", "a1", 13, 2107483648L, 54.12, "lychee", true},
+              new Object[] {"d1", "a1", 15, 3147483648L, 235.213, "watermelon", true});
+      for (int i = 0; i < TIMES.size(); i++) {
+        session.insertRelationalRecord(
+            "table0", TIMES.get(i), measurementIds, dataTypes, columnTypes, values.get(i));
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  protected static void insertData2() {
+    try (ISession session = EnvFactory.getEnv().getSessionConnection(TABLE_SQL_DIALECT)) {
+
+      session.open();
+      session.executeNonQueryStatement("USE \"db0\"");
+
+      List<IMeasurementSchema> schemaList = new ArrayList<>();
+      schemaList.add(new MeasurementSchema("device", TSDataType.STRING));
+      schemaList.add(new MeasurementSchema("attr1", TSDataType.STRING));
+      schemaList.add(new MeasurementSchema("num", TSDataType.INT32));
+      schemaList.add(new MeasurementSchema("bigNum", TSDataType.INT64));
+      schemaList.add(new MeasurementSchema("floatNum", TSDataType.DOUBLE));
+      schemaList.add(new MeasurementSchema("str", TSDataType.TEXT));
+      schemaList.add(new MeasurementSchema("bool", TSDataType.BOOLEAN));
+      final List<Tablet.ColumnType> columnTypes =
+          Arrays.asList(
+              Tablet.ColumnType.ID,
+              Tablet.ColumnType.ATTRIBUTE,
+              Tablet.ColumnType.MEASUREMENT,
+              Tablet.ColumnType.MEASUREMENT,
+              Tablet.ColumnType.MEASUREMENT,
+              Tablet.ColumnType.MEASUREMENT,
+              Tablet.ColumnType.MEASUREMENT);
+      List<String> measurementIds =
+          schemaList.stream()
+              .map(IMeasurementSchema::getMeasurementId)
+              .collect(Collectors.toList());
+      List<TSDataType> dataTypes =
+          schemaList.stream().map(IMeasurementSchema::getType).collect(Collectors.toList());
+      List<Object[]> values =
+          Arrays.asList(
+              new Object[] {"d2", "a2", 3, 2947483648L, 231.2121, "coconut", false},
+              new Object[] {"d2", "a2", 2, 2147483648L, 434.12, "pineapple", true},
+              new Object[] {"d2", "a2", 1, 2247483648L, 12.123, "apricot", true},
+              new Object[] {"d2", "a2", 9, 2147483646L, 43.12, "apple", false},
+              new Object[] {"d2", "a2", 8, 2147483964L, 4654.231, "papaya", true},
+              new Object[] {"d2", "a2", 6, 2147483650L, 1231.21, "banana", true},
+              new Object[] {"d2", "a2", 10, 3147483648L, 231.55, "pumelo", false},
+              new Object[] {"d2", "a2", 4, 2147493648L, 213.1, "peach", false},
+              new Object[] {"d2", "a2", 5, 2149783648L, 56.32, "orange", false},
+              new Object[] {"d2", "a2", 7, 2147983648L, 213.112, "lemon", true},
+              new Object[] {"d2", "a2", 11, 2147468648L, 54.121, "pitaya", false},
+              new Object[] {"d2", "a2", 12, 2146483648L, 45.231, "strawberry", false},
+              new Object[] {"d2", "a2", 14, 2907483648L, 231.34, "cherry", false},
+              new Object[] {"d2", "a2", 13, 2107483648L, 54.12, "lychee", true},
+              new Object[] {"d2", "a2", 15, 3147483648L, 235.213, "watermelon", true});
+      for (int i = 0; i < TIMES.size(); i++) {
+        session.insertRelationalRecord(
+            "table0", TIMES.get(i), measurementIds, dataTypes, columnTypes, values.get(i));
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+}
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
index fbc40f319ae..19f30401198 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
@@ -417,7 +417,7 @@ public class TableOperatorGenerator extends PlanVisitor<Operator, LocalExecution
             filterExpressionColumnTransformerMap,
             commonTransformerList,
             filterOutputDataTypes,
-            inputLocations.size() - 1,
+            inputLocations.size(),
             context.getTypeProvider(),
             metadata);
 
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/NormalizeOrExpressionRewriter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/NormalizeOrExpressionRewriter.java
index 3823406d1c3..1f7442cf538 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/NormalizeOrExpressionRewriter.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/NormalizeOrExpressionRewriter.java
@@ -57,11 +57,9 @@ public final class NormalizeOrExpressionRewriter {
           node.getTerms().stream()
               .map(expression -> process(expression, context))
               .collect(toImmutableList());
-
       if (node.getOperator() == AND) {
         return and(terms);
       }
-
       ImmutableList.Builder<InPredicate> inPredicateBuilder = ImmutableList.builder();
       ImmutableSet.Builder<Expression> expressionToSkipBuilder = ImmutableSet.builder();
       ImmutableList.Builder<Expression> othersExpressionBuilder = ImmutableList.builder();
@@ -74,12 +72,10 @@ public final class NormalizeOrExpressionRewriter {
                   expressionToSkipBuilder.add(expression);
                 }
               });
-
       Set<Expression> expressionToSkip = expressionToSkipBuilder.build();
       for (Expression expression : terms) {
         if (expression instanceof ComparisonExpression
             && ((ComparisonExpression) expression).getOperator() == EQUAL) {
-
           if (!expressionToSkip.contains(((ComparisonExpression) expression).getLeft())) {
             othersExpressionBuilder.add(expression);
           }
@@ -91,7 +87,6 @@ public final class NormalizeOrExpressionRewriter {
           othersExpressionBuilder.add(expression);
         }
       }
-
       return or(
           ImmutableList.<Expression>builder()
               .addAll(othersExpressionBuilder.build())
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/StreamSortNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/StreamSortNode.java
index 7ee9dd322fa..df80e7901e6 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/StreamSortNode.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/node/StreamSortNode.java
@@ -91,7 +91,7 @@ public class StreamSortNode extends SortNode {
   public static SortNode deserialize(ByteBuffer byteBuffer) {
     OrderingScheme orderingScheme = OrderingScheme.deserialize(byteBuffer);
     boolean partial = ReadWriteIOUtils.readBool(byteBuffer);
-    int streamCompareKeyEndIndex = ReadWriteIOUtils.read(byteBuffer);
+    int streamCompareKeyEndIndex = ReadWriteIOUtils.readInt(byteBuffer);
     PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
     return new StreamSortNode(planNodeId, null, orderingScheme, partial, streamCompareKeyEndIndex);
   }