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

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


The following commit(s) were added to refs/heads/UserDefinedTime by this push:
     new 4fe5f1a9420 add more IT (#17100)
4fe5f1a9420 is described below

commit 4fe5f1a942032aa352c5ec5cd05274fbad85d73e
Author: alpass163 <[email protected]>
AuthorDate: Wed Jan 28 16:52:50 2026 +0800

    add more IT (#17100)
---
 .../db/it/query/IoTDBAggregationFirstByIT.java     | 109 ++++++++++
 .../it/query/IoTDBAggregationFirstByInGroupIT.java |  38 ++++
 .../iotdb/db/it/query/IoTDBAggregationFirstIT.java | 164 +++++++++++++++
 .../it/query/IoTDBAggregationFirstInGroupIT.java   |  38 ++++
 .../db/it/query/IoTDBAggregationLastByIT.java      | 108 ++++++++++
 .../it/query/IoTDBAggregationLastByInGroupIT.java  |  34 +++
 .../iotdb/db/it/query/IoTDBAggregationLastIT.java  | 157 ++++++++++++++
 .../db/it/query/IoTDBAggregationLastInGroupIT.java |  38 ++++
 .../it/schema/IoTDBTableWithDefinedTimeIT.java     | 228 +++++++++++++++++++++
 .../relational/aggregation/AccumulatorFactory.java |  17 +-
 .../plan/planner/TableOperatorGenerator.java       |  16 +-
 .../process/window/function/FunctionTestUtils.java |   8 +-
 .../distribution/AggregationTableScanTest.java     |  11 +-
 .../schema/table/TsFileTableSchemaUtil.java        |   8 +
 .../schema/table/TsFileTableSchemaUtilTest.java    |  16 +-
 15 files changed, 940 insertions(+), 50 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstByIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstByIT.java
index 490f8f52262..2ae5c20b56f 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstByIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstByIT.java
@@ -18,10 +18,12 @@
  */
 package org.apache.iotdb.db.it.query;
 
+import org.apache.iotdb.isession.SessionConfig;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.TableClusterIT;
 import org.apache.iotdb.itbase.category.TableLocalStandaloneIT;
+import org.apache.iotdb.itbase.env.BaseEnv;
 
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -29,8 +31,14 @@ import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.junit.runner.RunWith;
 
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+
 import static org.apache.iotdb.db.it.utils.TestUtils.prepareTableData;
 import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({TableLocalStandaloneIT.class, TableClusterIT.class})
@@ -103,11 +111,65 @@ public class IoTDBAggregationFirstByIT {
     EnvFactory.getEnv().cleanClusterEnvironment();
   }
 
+  @Test
+  public void TestPriority() {
+    String[] expectedHeader = {"_col0", "_col1", "_col2", "_col3", "_col4", 
"_col5"};
+    String[] retArray = {"1,1,1.0,1.0,true,1s,"};
+    tableResultSetEqualTest(
+        "select "
+            + "first_by(s_int, y_criteria), "
+            + "first_by(s_long, y_criteria), "
+            + "first_by(s_float, y_criteria), "
+            + "first_by(s_double, y_criteria), "
+            + "first_by(s_bool, y_criteria), "
+            + "first_by(s_string, y_criteria) "
+            + "from table_a "
+            + "where table_a.device='d1'",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+  }
+
+  @Test
+  public void testNoTimeStamp() {
+
+    String sql =
+        "select "
+            + "first_by(s_int,  y_criteria)"
+            + "  from ("
+            + "   select "
+            + "    s_int,"
+            + "    s_long,"
+            + "    s_float,"
+            + "    y_criteria"
+            + "  from table_a"
+            + ") AS t";
+    try (Connection connection =
+        EnvFactory.getEnv()
+            .getConnection(
+                SessionConfig.DEFAULT_USER,
+                SessionConfig.DEFAULT_PASSWORD,
+                BaseEnv.TABLE_SQL_DIALECT)) {
+      connection.setClientInfo("time_zone", "+00:00");
+      try (Statement statement = connection.createStatement()) {
+        statement.execute("use " + DATABASE_NAME);
+        statement.executeQuery(sql);
+      }
+      fail("Missing valid time column, the query should fail");
+    } catch (SQLException e) {
+      assertEquals(
+          "701: Missing valid time column. The table must contain either a 
column with the TIME category or at least one TIMESTAMP column.",
+          e.getMessage());
+    }
+  }
+
   @Test
   public void testFirstBy_d1_NoNulls() {
     String[] expectedHeader = {"_col0", "_col1", "_col2", "_col3", "_col4", 
"_col5"};
     String[] retArray = {"5,5,5.0,5.0,false,5s,"};
     runTest("d1", expectedHeader, retArray);
+    runTest2("d1", expectedHeader, retArray);
+    runTest3("d1", expectedHeader, retArray);
   }
 
   @Test
@@ -115,6 +177,8 @@ public class IoTDBAggregationFirstByIT {
     String[] expectedHeader = {"_col0", "_col1", "_col2", "_col3", "_col4", 
"_col5"};
     String[] retArray = {"10,10,10.0,10.0,true,10s,"};
     runTest("d2", expectedHeader, retArray);
+    runTest2("d2", expectedHeader, retArray);
+    runTest3("d2", expectedHeader, retArray);
   }
 
   @Test
@@ -122,6 +186,8 @@ public class IoTDBAggregationFirstByIT {
     String[] expectedHeader = {"_col0", "_col1", "_col2", "_col3", "_col4", 
"_col5"};
     String[] retArray = {"5,5,null,null,null,null,"};
     runTest("d3", expectedHeader, retArray);
+    runTest2("d3", expectedHeader, retArray);
+    runTest3("d3", expectedHeader, retArray);
   }
 
   @Test
@@ -130,6 +196,8 @@ public class IoTDBAggregationFirstByIT {
     // Expected: No valid s2 found.
     String[] retArray = {"null,null,null,null,null,null,"};
     runTest("d4", expectedHeader, retArray);
+    runTest2("d4", expectedHeader, retArray);
+    runTest3("d4", expectedHeader, retArray);
   }
 
   @Test
@@ -138,6 +206,8 @@ public class IoTDBAggregationFirstByIT {
     // Expected: The row with y_criteria=NULL is skipped. The row with 
y_criteria=50 is picked.
     String[] retArray = {"50,50,50.0,50.0,false,50s,"};
     runTest("d5", expectedHeader, retArray);
+    runTest2("d5", expectedHeader, retArray);
+    runTest3("d5", expectedHeader, retArray);
   }
 
   private void runTest(String deviceId, String[] expectedHeader, String[] 
retArray) {
@@ -159,4 +229,43 @@ public class IoTDBAggregationFirstByIT {
         retArray,
         DATABASE_NAME);
   }
+
+  private void runTest2(String deviceId, String[] expectedHeader, String[] 
retArray) {
+    tableResultSetEqualTest(
+        "select "
+            + "first_by(s_int, y_criteria), "
+            + "first_by(s_long, y_criteria), "
+            + "first_by(s_float, y_criteria), "
+            + "first_by(s_double, y_criteria), "
+            + "first_by(s_bool, y_criteria), "
+            + "first_by(s_string, y_criteria) "
+            + "from "
+            + "(select s_int, s_long, s_float, s_double, s_bool, s_string, 
y_criteria, time_type "
+            + "from table_a left join table_b on table_a.time=table_b.time "
+            + "where table_a.device='"
+            + deviceId
+            + "') ",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+  }
+
+  /** Test 3: Raw table query with explicit time_type column, 3 arguments */
+  private void runTest3(String deviceId, String[] expectedHeader, String[] 
retArray) {
+    tableResultSetEqualTest(
+        "select "
+            + "first_by(s_int, y_criteria, time_type), "
+            + "first_by(s_long, y_criteria, time_type), "
+            + "first_by(s_float, y_criteria, time_type), "
+            + "first_by(s_double, y_criteria, time_type), "
+            + "first_by(s_bool, y_criteria, time_type), "
+            + "first_by(s_string, y_criteria, time_type) "
+            + "from table_a "
+            + "where table_a.device='"
+            + deviceId
+            + "'",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+  }
 }
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstByInGroupIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstByInGroupIT.java
index 1045d76eba8..f2f3496cd8a 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstByInGroupIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstByInGroupIT.java
@@ -117,6 +117,7 @@ public class IoTDBAggregationFirstByInGroupIT {
       "p5,50,50,50.0,50.0,false,50s,"
     };
 
+    // 1. eliminate the identity of time column
     tableResultSetEqualTest(
         "select "
             + "partition, "
@@ -135,5 +136,42 @@ public class IoTDBAggregationFirstByInGroupIT {
         expectedHeader,
         retArray,
         DATABASE_NAME);
+
+    // 2. lack of the third argument, supply with timestamp column
+    tableResultSetEqualTest(
+        "select "
+            + "partition, "
+            + "first_by(s_int, y_criteria), "
+            + "first_by(s_long, y_criteria), "
+            + "first_by(s_float, y_criteria), "
+            + "first_by(s_double, y_criteria), "
+            + "first_by(s_bool, y_criteria), "
+            + "first_by(s_string, y_criteria) "
+            + "from "
+            // SubQuery: Rename time_type to 'ts' to avoid ambiguity with 
physical 'time'
+            + "(select s_int, s_long, s_float, s_double, s_bool, s_string, 
y_criteria, partition, time_type "
+            + "from table_a left join table_b on table_a.time=table_b.time) "
+            + "group by partition "
+            + "order by partition",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    // 3. base table query with column that with timestamp datatype
+    tableResultSetEqualTest(
+        "select "
+            + "partition, "
+            + "first_by(s_int, y_criteria, time_type), "
+            + "first_by(s_long, y_criteria, time_type), "
+            + "first_by(s_float, y_criteria, time_type), "
+            + "first_by(s_double, y_criteria, time_type), "
+            + "first_by(s_bool, y_criteria, time_type), "
+            + "first_by(s_string, y_criteria, time_type) "
+            + "from table_a  "
+            + "group by partition "
+            + "order by partition",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
   }
 }
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstIT.java
index 92fc15127b3..1ce994a2823 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstIT.java
@@ -19,10 +19,12 @@
 
 package org.apache.iotdb.db.it.query;
 
+import org.apache.iotdb.isession.SessionConfig;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.TableClusterIT;
 import org.apache.iotdb.itbase.category.TableLocalStandaloneIT;
+import org.apache.iotdb.itbase.env.BaseEnv;
 
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -30,8 +32,14 @@ import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.junit.runner.RunWith;
 
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+
 import static org.apache.iotdb.db.it.utils.TestUtils.prepareTableData;
 import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({TableLocalStandaloneIT.class, TableClusterIT.class})
@@ -90,6 +98,59 @@ public class IoTDBAggregationFirstIT {
     EnvFactory.getEnv().cleanClusterEnvironment();
   }
 
+  // time column prior to field column with timestamp column
+  @Test
+  public void testPriority() {
+
+    String[] expectedHeader = {"_col0", "_col1", "_col2", "_col3", "_col4", 
"_col5"};
+    String[] retArray = {"-50,-50,-50.0,-50.0,false,-50s,"};
+    tableResultSetEqualTest(
+        "select "
+            + "first(s_int), "
+            + "first(s_long), "
+            + "first(s_float), "
+            + "first(s_double), "
+            + "first(s_bool), "
+            + "first(s_string) "
+            + "from table_a "
+            + "where table_a.device='d1' ",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+  }
+
+  @Test
+  public void testNoTimeStamp() {
+
+    String sql =
+        "select "
+            + "first(s_int)"
+            + "  from ("
+            + "   select "
+            + "    s_int,"
+            + "    s_long,"
+            + "    s_float"
+            + "  from table_a"
+            + ") AS t";
+    try (Connection connection =
+        EnvFactory.getEnv()
+            .getConnection(
+                SessionConfig.DEFAULT_USER,
+                SessionConfig.DEFAULT_PASSWORD,
+                BaseEnv.TABLE_SQL_DIALECT)) {
+      connection.setClientInfo("time_zone", "+00:00");
+      try (Statement statement = connection.createStatement()) {
+        statement.execute("use " + DATABASE_NAME);
+        statement.executeQuery(sql);
+      }
+      fail("Missing valid time column, the query should fail");
+    } catch (SQLException e) {
+      assertEquals(
+          "701: Missing valid time column. The table must contain either a 
column with the TIME category or at least one TIMESTAMP column.",
+          e.getMessage());
+    }
+  }
+
   @Test
   public void testAggregation() {
 
@@ -102,6 +163,7 @@ public class IoTDBAggregationFirstIT {
     // Corresponding values at time_type=5: s_int=5, s_long=5, ..., 
s_bool=false, s_string='5s'
     String[] retArray = {"5,5,5.0,5.0,false,5s,"};
 
+    // 1. through join, eliminate the identity of time column
     tableResultSetEqualTest(
         "select "
             + "first(s_int, time), "
@@ -121,6 +183,41 @@ public class IoTDBAggregationFirstIT {
         expectedHeader,
         retArray,
         DATABASE_NAME);
+
+    // 2. lack of the second the argument
+    tableResultSetEqualTest(
+        "select "
+            + "first(s_int), "
+            + "first(s_long), "
+            + "first(s_float), "
+            + "first(s_double), "
+            + "first(s_bool), "
+            + "first(s_string) "
+            + "from "
+            + "(select "
+            + "  time_type, "
+            + "  s_int, s_long, s_float, s_double, s_bool, s_string "
+            + "from table_a "
+            + "left join table_b on table_a.time=table_b.time "
+            + "where table_a.device='d1') ",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    // 3. through field column that with timestamp datatype
+    tableResultSetEqualTest(
+        "select "
+            + "first(s_int, time_type), "
+            + "first(s_long, time_type), "
+            + "first(s_float, time_type), "
+            + "first(s_double, time_type), "
+            + "first(s_bool, time_type), "
+            + "first(s_string, time_type) "
+            + "from table_a "
+            + "where table_a.device='d1' ",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
   }
 
   @Test
@@ -154,6 +251,40 @@ public class IoTDBAggregationFirstIT {
         expectedHeader,
         retArray,
         DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "first(s_int), "
+            + "first(s_long), "
+            + "first(s_float), "
+            + "first(s_double), "
+            + "first(s_bool), "
+            + "first(s_string) "
+            + "from "
+            // subQuery: project all the column needed and rename the 
time_type to the time
+            + "(select "
+            + "  time_type, "
+            + "  s_int, s_long, s_float, s_double, s_bool, s_string "
+            + "from table_a "
+            + "left join table_b on table_a.time=table_b.time "
+            + "where table_a.device='d2') ",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "first(s_int, time_type), "
+            + "first(s_long, time_type), "
+            + "first(s_float, time_type), "
+            + "first(s_double, time_type), "
+            + "first(s_bool, time_type), "
+            + "first(s_string, time_type) "
+            + "from table_a "
+            + "where table_a.device='d2'",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
   }
 
   @Test
@@ -181,5 +312,38 @@ public class IoTDBAggregationFirstIT {
         expectedHeader,
         retArray,
         DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "first(s_int), "
+            + "first(s_long), "
+            + "first(s_float), "
+            + "first(s_double), "
+            + "first(s_bool), "
+            + "first(s_string) "
+            + "from "
+            + "(select "
+            + "  time_type, "
+            + "  s_int, s_long, s_float, s_double, s_bool, s_string "
+            + "from table_a "
+            + "left join table_b on table_a.time=table_b.time "
+            + "where table_a.device='d3') ",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "first(s_int, time_type), "
+            + "first(s_long, time_type), "
+            + "first(s_float, time_type), "
+            + "first(s_double, time_type), "
+            + "first(s_bool, time_type), "
+            + "first(s_string, time_type) "
+            + "from table_a "
+            + "where table_a.device='d3'",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
   }
 }
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstInGroupIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstInGroupIT.java
index 48decb65b82..c6fa3510230 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstInGroupIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationFirstInGroupIT.java
@@ -130,5 +130,43 @@ public class IoTDBAggregationFirstInGroupIT {
         expectedHeader,
         retArray,
         DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "partition, "
+            + "first(s_int), "
+            + "first(s_long), "
+            + "first(s_float), "
+            + "first(s_double), "
+            + "first(s_bool), "
+            + "first(s_string) "
+            + "from "
+            + "(select "
+            + "  time_type, "
+            + "  partition, "
+            + "  s_int, s_long, s_float, s_double, s_bool, s_string "
+            + "from table_a "
+            + "left join table_b on table_a.time=table_b.time) "
+            + "group by partition "
+            + "order by partition",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "partition, "
+            + "first(s_int, time_type), "
+            + "first(s_long, time_type), "
+            + "first(s_float, time_type), "
+            + "first(s_double, time_type), "
+            + "first(s_bool, time_type), "
+            + "first(s_string, time_type) "
+            + "from table_a "
+            + "group by partition "
+            + "order by partition",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
   }
 }
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastByIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastByIT.java
index 42bef69eb44..1f30cbf30e2 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastByIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastByIT.java
@@ -19,10 +19,12 @@
 
 package org.apache.iotdb.db.it.query;
 
+import org.apache.iotdb.isession.SessionConfig;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.TableClusterIT;
 import org.apache.iotdb.itbase.category.TableLocalStandaloneIT;
+import org.apache.iotdb.itbase.env.BaseEnv;
 
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -30,8 +32,14 @@ import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.junit.runner.RunWith;
 
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+
 import static org.apache.iotdb.db.it.utils.TestUtils.prepareTableData;
 import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({TableLocalStandaloneIT.class, TableClusterIT.class})
@@ -105,11 +113,65 @@ public class IoTDBAggregationLastByIT {
     EnvFactory.getEnv().cleanClusterEnvironment();
   }
 
+  @Test
+  public void TestPriority() {
+    String[] expectedHeader = {"_col0", "_col1", "_col2", "_col3", "_col4", 
"_col5"};
+    String[] retArray = {"99,99,99.0,99.0,true,99s,"};
+    tableResultSetEqualTest(
+        "select "
+            + "last_by(s_int, y_criteria), "
+            + "last_by(s_long, y_criteria), "
+            + "last_by(s_float, y_criteria), "
+            + "last_by(s_double, y_criteria), "
+            + "last_by(s_bool, y_criteria), "
+            + "last_by(s_string, y_criteria) "
+            + "from table_a "
+            + "where table_a.device='d1'",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+  }
+
+  @Test
+  public void testNoTimeStamp() {
+
+    String sql =
+        "select "
+            + "last_by(s_int,  y_criteria)"
+            + "  from ("
+            + "   select "
+            + "    s_int,"
+            + "    s_long,"
+            + "    s_float,"
+            + "    y_criteria"
+            + "  from table_a"
+            + ") AS t";
+    try (Connection connection =
+        EnvFactory.getEnv()
+            .getConnection(
+                SessionConfig.DEFAULT_USER,
+                SessionConfig.DEFAULT_PASSWORD,
+                BaseEnv.TABLE_SQL_DIALECT)) {
+      connection.setClientInfo("time_zone", "+00:00");
+      try (Statement statement = connection.createStatement()) {
+        statement.execute("use " + DATABASE_NAME);
+        statement.executeQuery(sql);
+      }
+      fail("Missing valid time column, the query should fail");
+    } catch (SQLException e) {
+      assertEquals(
+          "701: Missing valid time column. The table must contain either a 
column with the TIME category or at least one TIMESTAMP column.",
+          e.getMessage());
+    }
+  }
+
   @Test
   public void testLastBy_d1_NoNulls() {
     String[] expectedHeader = {"_col0", "_col1", "_col2", "_col3", "_col4", 
"_col5"};
     String[] retArray = {"-5,-5,-5.0,-5.0,false,-5s,"};
     runTest("d1", expectedHeader, retArray);
+    runTest2("d1", expectedHeader, retArray);
+    runTest3("d1", expectedHeader, retArray);
   }
 
   @Test
@@ -117,6 +179,8 @@ public class IoTDBAggregationLastByIT {
     String[] expectedHeader = {"_col0", "_col1", "_col2", "_col3", "_col4", 
"_col5"};
     String[] retArray = {"-10,-10,-10.0,-10.0,true,-10s,"};
     runTest("d2", expectedHeader, retArray);
+    runTest2("d2", expectedHeader, retArray);
+    runTest3("d2", expectedHeader, retArray);
   }
 
   @Test
@@ -124,6 +188,8 @@ public class IoTDBAggregationLastByIT {
     String[] expectedHeader = {"_col0", "_col1", "_col2", "_col3", "_col4", 
"_col5"};
     String[] retArray = {"-5,-5,null,null,null,null,"};
     runTest("d3", expectedHeader, retArray);
+    runTest2("d3", expectedHeader, retArray);
+    runTest3("d3", expectedHeader, retArray);
   }
 
   @Test
@@ -132,6 +198,8 @@ public class IoTDBAggregationLastByIT {
     // Expected: No valid s2 found.
     String[] retArray = {"null,null,null,null,null,null,"};
     runTest("d4", expectedHeader, retArray);
+    runTest2("d4", expectedHeader, retArray);
+    runTest3("d4", expectedHeader, retArray);
   }
 
   @Test
@@ -140,6 +208,8 @@ public class IoTDBAggregationLastByIT {
     // Expected: The row with y_criteria=NULL is skipped. The row with 
y_criteria=50 is picked.
     String[] retArray = {"50,50,50.0,50.0,false,50s,"};
     runTest("d5", expectedHeader, retArray);
+    runTest2("d5", expectedHeader, retArray);
+    runTest3("d5", expectedHeader, retArray);
   }
 
   private void runTest(String deviceId, String[] expectedHeader, String[] 
retArray) {
@@ -161,4 +231,42 @@ public class IoTDBAggregationLastByIT {
         retArray,
         DATABASE_NAME);
   }
+
+  private void runTest2(String deviceId, String[] expectedHeader, String[] 
retArray) {
+    tableResultSetEqualTest(
+        "select "
+            + "last_by(s_int, y_criteria), "
+            + "last_by(s_long, y_criteria), "
+            + "last_by(s_float, y_criteria), "
+            + "last_by(s_double, y_criteria), "
+            + "last_by(s_bool, y_criteria), "
+            + "last_by(s_string, y_criteria) "
+            + "from "
+            + "(select s_int, s_long, s_float, s_double, s_bool, s_string, 
y_criteria, time_type "
+            + "from table_a left join table_b on table_a.time=table_b.time "
+            + "where table_a.device='"
+            + deviceId
+            + "') ",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+  }
+
+  private void runTest3(String deviceId, String[] expectedHeader, String[] 
retArray) {
+    tableResultSetEqualTest(
+        "select "
+            + "last_by(s_int, y_criteria, time_type), "
+            + "last_by(s_long, y_criteria, time_type), "
+            + "last_by(s_float, y_criteria, time_type), "
+            + "last_by(s_double, y_criteria, time_type), "
+            + "last_by(s_bool, y_criteria, time_type), "
+            + "last_by(s_string, y_criteria, time_type) "
+            + "from table_a  "
+            + "where table_a.device='"
+            + deviceId
+            + "'",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+  }
 }
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastByInGroupIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastByInGroupIT.java
index 5b59e0875ed..570e16535de 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastByInGroupIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastByInGroupIT.java
@@ -132,5 +132,39 @@ public class IoTDBAggregationLastByInGroupIT {
         expectedHeader,
         retArray,
         DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "partition, "
+            + "last_by(s_int, y_criteria), "
+            + "last_by(s_long, y_criteria), "
+            + "last_by(s_float, y_criteria), "
+            + "last_by(s_double, y_criteria), "
+            + "last_by(s_bool, y_criteria), "
+            + "last_by(s_string, y_criteria) "
+            + "from "
+            + "(select time_type, s_int, s_long, s_float, s_double, s_bool, 
s_string, y_criteria, partition "
+            + "from table_a left join table_b on table_a.time=table_b.time) "
+            + "group by partition "
+            + "order by partition",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "partition, "
+            + "last_by(s_int, y_criteria, time_type), "
+            + "last_by(s_long, y_criteria, time_type), "
+            + "last_by(s_float, y_criteria, time_type), "
+            + "last_by(s_double, y_criteria, time_type), "
+            + "last_by(s_bool, y_criteria, time_type), "
+            + "last_by(s_string, y_criteria, time_type) "
+            + "from table_a "
+            + "group by partition "
+            + "order by partition",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
   }
 }
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastIT.java
index e9e860010f5..3e132ab0845 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastIT.java
@@ -19,10 +19,12 @@
 
 package org.apache.iotdb.db.it.query;
 
+import org.apache.iotdb.isession.SessionConfig;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.TableClusterIT;
 import org.apache.iotdb.itbase.category.TableLocalStandaloneIT;
+import org.apache.iotdb.itbase.env.BaseEnv;
 
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -30,8 +32,14 @@ import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.junit.runner.RunWith;
 
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+
 import static org.apache.iotdb.db.it.utils.TestUtils.prepareTableData;
 import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
 @Category({TableLocalStandaloneIT.class, TableClusterIT.class})
@@ -87,6 +95,57 @@ public class IoTDBAggregationLastIT {
     EnvFactory.getEnv().cleanClusterEnvironment();
   }
 
+  @Test
+  public void TestPriority() {
+    String[] expectedHeader = {"_col0", "_col1", "_col2", "_col3", "_col4", 
"_col5"};
+    String[] retArray = {"50,50,50.0,50.0,false,50s,"};
+    tableResultSetEqualTest(
+        "select "
+            + "last(s_int), "
+            + "last(s_long), "
+            + "last(s_float), "
+            + "last(s_double), "
+            + "last(s_bool), "
+            + "last(s_string) "
+            + "from table_a "
+            + "where table_a.device='d1' ",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+  }
+
+  @Test
+  public void testNoTimeStamp() {
+
+    String sql =
+        "select "
+            + "last(s_int)"
+            + " from ("
+            + "  select "
+            + "    s_int,"
+            + "    s_long,"
+            + "    s_float"
+            + "  from table_a"
+            + ") AS t";
+    try (Connection connection =
+        EnvFactory.getEnv()
+            .getConnection(
+                SessionConfig.DEFAULT_USER,
+                SessionConfig.DEFAULT_PASSWORD,
+                BaseEnv.TABLE_SQL_DIALECT)) {
+      connection.setClientInfo("time_zone", "+00:00");
+      try (Statement statement = connection.createStatement()) {
+        statement.execute("use " + DATABASE_NAME);
+        statement.executeQuery(sql);
+      }
+      fail("Missing valid time column, the query should fail");
+    } catch (SQLException e) {
+      assertEquals(
+          "701: Missing valid time column. The table must contain either a 
column with the TIME category or at least one TIMESTAMP column.",
+          e.getMessage());
+    }
+  }
+
   @Test
   public void testAggregation() {
 
@@ -114,6 +173,38 @@ public class IoTDBAggregationLastIT {
         expectedHeader,
         retArray,
         DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "last(s_int), "
+            + "last(s_long), "
+            + "last(s_float), "
+            + "last(s_double), "
+            + "last(s_bool), "
+            + "last(s_string) "
+            + "from "
+            + "(select "
+            + "  s_int, s_long, s_float, s_double, s_bool, s_string, time_type 
"
+            + "from table_a "
+            + "left join table_b on table_a.time=table_b.time "
+            + "where table_a.device='d1') ",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "last(s_int, time_type), "
+            + "last(s_long, time_type), "
+            + "last(s_float, time_type), "
+            + "last(s_double, time_type), "
+            + "last(s_bool, time_type), "
+            + "last(s_string, time_type) "
+            + "from table_a "
+            + "where table_a.device='d1' ",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
   }
 
   @Test
@@ -143,6 +234,38 @@ public class IoTDBAggregationLastIT {
         expectedHeader,
         retArray,
         DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "last(s_int), "
+            + "last(s_long), "
+            + "last(s_float), "
+            + "last(s_double), "
+            + "last(s_bool), "
+            + "last(s_string) "
+            + "from "
+            + "(select "
+            + "  s_int, s_long, s_float, s_double, s_bool, s_string, time_type 
"
+            + "from table_a "
+            + "left join table_b on table_a.time=table_b.time "
+            + "where table_a.device='d2') ",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "last(s_int, time_type), "
+            + "last(s_long, time_type), "
+            + "last(s_float, time_type), "
+            + "last(s_double, time_type), "
+            + "last(s_bool, time_type), "
+            + "last(s_string, time_type) "
+            + "from table_a "
+            + "where table_a.device='d2'",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
   }
 
   @Test
@@ -172,5 +295,39 @@ public class IoTDBAggregationLastIT {
         expectedHeader,
         retArray,
         DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "last(s_int), "
+            + "last(s_long), "
+            + "last(s_float), "
+            + "last(s_double), "
+            + "last(s_bool), "
+            + "last(s_string) "
+            + "from "
+            + "(select "
+            + "  time_type, "
+            + "  s_int, s_long, s_float, s_double, s_bool, s_string "
+            + "from table_a "
+            + "left join table_b on table_a.time=table_b.time "
+            + "where table_a.device='d3') ",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    // 3. through field column
+    tableResultSetEqualTest(
+        "select "
+            + "last(s_int, time_type), "
+            + "last(s_long, time_type), "
+            + "last(s_float, time_type), "
+            + "last(s_double, time_type), "
+            + "last(s_bool, time_type), "
+            + "last(s_string, time_type) "
+            + "from table_a "
+            + "where table_a.device='d3'",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
   }
 }
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastInGroupIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastInGroupIT.java
index 1f6b2c680ff..b065200021d 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastInGroupIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBAggregationLastInGroupIT.java
@@ -124,5 +124,43 @@ public class IoTDBAggregationLastInGroupIT {
         expectedHeader,
         retArray,
         DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "partition, "
+            + "last(s_int), "
+            + "last(s_long), "
+            + "last(s_float), "
+            + "last(s_double), "
+            + "last(s_bool), "
+            + "last(s_string) "
+            + "from "
+            + "(select "
+            + "  time_type, "
+            + "  partition, "
+            + "  s_int, s_long, s_float, s_double, s_bool, s_string "
+            + "from table_a "
+            + "left join table_b on table_a.time=table_b.time) "
+            + "group by partition "
+            + "order by partition",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select "
+            + "partition, "
+            + "last(s_int, time_type), "
+            + "last(s_long, time_type), "
+            + "last(s_float, time_type), "
+            + "last(s_double, time_type), "
+            + "last(s_bool, time_type), "
+            + "last(s_string, time_type) "
+            + "from table_a "
+            + "group by partition "
+            + "order by partition",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
   }
 }
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableWithDefinedTimeIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableWithDefinedTimeIT.java
new file mode 100644
index 00000000000..4055e8fb5d9
--- /dev/null
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableWithDefinedTimeIT.java
@@ -0,0 +1,228 @@
+/*
+ * 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.schema;
+
+import org.apache.iotdb.db.it.utils.TestUtils;
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.TableClusterIT;
+import org.apache.iotdb.itbase.category.TableLocalStandaloneIT;
+import org.apache.iotdb.itbase.env.BaseEnv;
+
+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.SQLException;
+import java.sql.Statement;
+import java.util.Arrays;
+
+import static org.apache.iotdb.db.it.utils.TestUtils.prepareTableData;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({TableLocalStandaloneIT.class, TableClusterIT.class})
+public class IoTDBTableWithDefinedTimeIT {
+
+  private static final String TABLE_DATABASE = "user_defined_time";
+  private static final String VIEW_DATABASE = "user_defined_time_for_view";
+  private static final String[] SQLS =
+      new String[] {"CREATE DATABASE " + TABLE_DATABASE, "CREATE DATABASE " + 
VIEW_DATABASE};
+  private final String header = "ColumnName,DataType,Category,";
+
+  @BeforeClass
+  public static void setUp() throws Exception {
+    EnvFactory.getEnv().initClusterEnvironment();
+    prepareTableData(SQLS);
+  }
+
+  @AfterClass
+  public static void tearDown() throws Exception {
+    EnvFactory.getEnv().cleanClusterEnvironment();
+  }
+
+  @Test
+  public void testCreateTable() {
+    try (final Connection connection =
+            EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
+        final Statement statement = connection.createStatement()) {
+      statement.execute("use " + TABLE_DATABASE);
+
+      // create table and do not assign the time column name
+      try {
+        statement.execute(
+            "create table default_not_assign_time(device string tag, s1 int32 
field)");
+        TestUtils.assertResultSetEqual(
+            statement.executeQuery("describe default_not_assign_time"),
+            header,
+            Arrays.asList("time,TIMESTAMP,TIME,", "device,STRING,TAG,", 
"s1,INT32,FIELD,"));
+      } catch (SQLException e) {
+        fail("create table without time info fails, the specific message:  " + 
e.getMessage());
+      }
+
+      // create table and assign the time column name
+      try {
+        statement.execute(
+            "create table time_in_first(date_time timestamp time, device 
string tag, s1 int32 field)");
+        TestUtils.assertResultSetEqual(
+            statement.executeQuery("describe time_in_first"),
+            header,
+            Arrays.asList("date_time,TIMESTAMP,TIME,", "device,STRING,TAG,", 
"s1,INT32,FIELD,"));
+      } catch (SQLException e) {
+        fail("assign the name of time column fails, the specific message:  " + 
e.getMessage());
+      }
+
+      // create table which of the time column not at the first column
+      try {
+        statement.execute(
+            "create table time_not_in_first(device string tag, date_time 
timestamp time,  s1 int32 field)");
+        TestUtils.assertResultSetEqual(
+            statement.executeQuery("describe time_not_in_first"),
+            header,
+            Arrays.asList("device,STRING,TAG,", "date_time,TIMESTAMP,TIME,", 
"s1,INT32,FIELD,"));
+      } catch (SQLException e) {
+        fail("assign the name of time column fails, the specific message:  " + 
e.getMessage());
+      }
+
+      // create table with multi time-column
+      try {
+        statement.execute(
+            "create table with_multi_time(time_type timestamp time, device 
string tag, date_time timestamp time,  s1 int32 field)");
+        fail("Creating table is not be allowed to assign two time columns");
+      } catch (SQLException e) {
+        assertEquals("701: A table cannot have more than one time column", 
e.getMessage());
+      }
+
+      // create table with time column that is not timestamp data type
+      try {
+        statement.execute(
+            "create table time_other_type(device string tag, date_time int64 
time,  s1 int32 field)");
+        fail("The time column has to be assigned a timestamp data type when 
creating table");
+      } catch (SQLException e) {
+        assertEquals("701: The time column's type shall be 'timestamp'.", 
e.getMessage());
+      }
+
+      // Columns in table shall not share the same name time when creating 
table
+      try {
+        statement.execute(
+            "create table shared_time_name(device string tag, time int64 
field,  s1 int32 field)");
+        fail("Columns in table shall not share the same name time when 
creating table");
+      } catch (SQLException e) {
+        assertEquals("701: Columns in table shall not share the same name 
time.", e.getMessage());
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  private void prepareTreeData() {
+    try (final Connection connection = 
EnvFactory.getEnv().getConnection(BaseEnv.TREE_SQL_DIALECT);
+        final Statement statement = connection.createStatement()) {
+      statement.execute("create timeseries root.tt.device.s1 with 
datatype=int32");
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void testCreateView() {
+    prepareTreeData();
+
+    try (final Connection connection =
+            EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
+        final Statement statement = connection.createStatement()) {
+      statement.execute("use " + VIEW_DATABASE);
+
+      // create view and do not assign the time column name
+      try {
+        statement.execute(
+            "create view default_not_assign_time(device string tag, s1 int32 
field) as root.tt.**");
+        TestUtils.assertResultSetEqual(
+            statement.executeQuery("describe default_not_assign_time"),
+            header,
+            Arrays.asList("time,TIMESTAMP,TIME,", "device,STRING,TAG,", 
"s1,INT32,FIELD,"));
+      } catch (SQLException e) {
+        fail("create table without time info fails, the specific message:  " + 
e.getMessage());
+      }
+
+      // create view which of the time column at the first column
+      try {
+        statement.execute(
+            "create view time_in_first(date_time timestamp time, device string 
tag, s1 int32 field) as root.tt.**");
+        TestUtils.assertResultSetEqual(
+            statement.executeQuery("describe time_in_first"),
+            header,
+            Arrays.asList("date_time,TIMESTAMP,TIME,", "device,STRING,TAG,", 
"s1,INT32,FIELD,"));
+      } catch (SQLException e) {
+        fail("assign the name of time column fails, the specific message:  " + 
e.getMessage());
+      }
+
+      // create view which of the time column not at the first column
+      try {
+        statement.execute(
+            "create view time_not_in_first(device string tag, date_time 
timestamp time,  s1 int32 field) as root.tt.**");
+        TestUtils.assertResultSetEqual(
+            statement.executeQuery("describe time_not_in_first"),
+            header,
+            Arrays.asList("device,STRING,TAG,", "date_time,TIMESTAMP,TIME,", 
"s1,INT32,FIELD,"));
+      } catch (SQLException e) {
+        fail("assign the name of time column fails, the specific message:  " + 
e.getMessage());
+      }
+
+      // create view with multi time-column
+      try {
+        statement.execute(
+            "create view with_multi_time(time_type timestamp time, device 
string tag, date_time timestamp time,  s1 int32 field) as root.tt.**");
+        fail("Creating view is not be allowed to assign two time columns");
+      } catch (SQLException e) {
+        assertEquals("701: A table cannot have more than one time column", 
e.getMessage());
+      }
+
+      // create table with time column that is not timestamp data type
+      try {
+        statement.execute(
+            "create view time_other_type(device string tag, date_time int64 
time,  s1 int32 field) as root.tt.**");
+        fail("The time column has to be assigned a timestamp data type when 
creating view");
+      } catch (SQLException e) {
+        assertEquals("701: The time column's type shall be 'timestamp'.", 
e.getMessage());
+      }
+
+      // Columns in table shall not share the same name time when creating 
table
+      try {
+        statement.execute(
+            "create view shared_time_time(device string tag, time int64 field, 
 s1 int32 field) as root.tt.**");
+        fail("Columns in view shall not share the same name time when creating 
table");
+      } catch (SQLException e) {
+        assertEquals("701: Columns in table shall not share the same name 
time.", e.getMessage());
+      }
+
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+}
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/AccumulatorFactory.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/AccumulatorFactory.java
index 90dcb82c2f0..81106f8645a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/AccumulatorFactory.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/AccumulatorFactory.java
@@ -151,19 +151,13 @@ public class AccumulatorFactory {
                   isAggTableScan);
     } else if (FIRST.getFunctionName().equals(functionName)) {
       boolean orderKeyIsTimeColumn = isTimeColumn(inputExpressions.get(1), 
timeColumnName);
+
       result =
           ascending && orderKeyIsTimeColumn
               ? new FirstAccumulator(inputDataTypes.get(0), isAggTableScan)
               : new FirstDescAccumulator(inputDataTypes.get(0));
     } else {
-      result =
-          createBuiltinAccumulator(
-              aggregationType,
-              inputDataTypes,
-              inputExpressions,
-              inputAttributes,
-              ascending,
-              isAggTableScan);
+      result = createBuiltinAccumulator(aggregationType, inputDataTypes);
     }
 
     if (distinct) {
@@ -301,12 +295,7 @@ public class AccumulatorFactory {
   }
 
   public static TableAccumulator createBuiltinAccumulator(
-      TAggregationType aggregationType,
-      List<TSDataType> inputDataTypes,
-      List<Expression> inputExpressions,
-      Map<String, String> inputAttributes,
-      boolean ascending,
-      boolean isAggTableScan) {
+      TAggregationType aggregationType, List<TSDataType> inputDataTypes) {
     switch (aggregationType) {
       case COUNT:
         return new CountAccumulator();
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 e4d549cf444..1bc788251a7 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
@@ -3463,13 +3463,7 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
             .collect(Collectors.toList());
 
     TableAccumulator accumulator =
-        createBuiltinAccumulator(
-            getAggregationTypeByFuncName(functionName),
-            originalArgumentTypes,
-            
arguments.stream().map(Map.Entry::getKey).collect(Collectors.toList()),
-            Collections.emptyMap(),
-            true,
-            false);
+        createBuiltinAccumulator(getAggregationTypeByFuncName(functionName), 
originalArgumentTypes);
 
     BoundSignature signature = resolvedFunction.getSignature();
 
@@ -4219,13 +4213,7 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
             .map(InternalTypeManager::getTSDataType)
             .collect(Collectors.toList());
     TableAccumulator accumulator =
-        createBuiltinAccumulator(
-            getAggregationTypeByFuncName(functionName),
-            originalArgumentTypes,
-            function.getArguments(),
-            Collections.emptyMap(),
-            true,
-            false);
+        createBuiltinAccumulator(getAggregationTypeByFuncName(functionName), 
originalArgumentTypes);
 
     // Create aggregator by accumulator
     return new WindowAggregator(
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/process/window/function/FunctionTestUtils.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/process/window/function/FunctionTestUtils.java
index 47f9063d899..bad56bba9b8 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/process/window/function/FunctionTestUtils.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/process/window/function/FunctionTestUtils.java
@@ -32,7 +32,6 @@ import org.apache.tsfile.read.common.block.TsBlock;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 
 public class FunctionTestUtils {
@@ -101,12 +100,7 @@ public class FunctionTestUtils {
     // inputExpressions and inputAttributes are not used in this method
     TableAccumulator accumulator =
         AccumulatorFactory.createBuiltinAccumulator(
-            aggregationType,
-            Collections.singletonList(inputDataType),
-            new ArrayList<>(),
-            new HashMap<>(),
-            ascending,
-            false);
+            aggregationType, Collections.singletonList(inputDataType));
     WindowAggregator aggregator =
         new WindowAggregator(accumulator, outputDataType, 
Collections.singletonList(0));
     return new AggregationWindowFunction(aggregator);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/AggregationTableScanTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/AggregationTableScanTest.java
index c03e5e9c0ce..698af137f3c 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/AggregationTableScanTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/AggregationTableScanTest.java
@@ -19,11 +19,6 @@
 
 package org.apache.iotdb.db.queryengine.plan.planner.distribution;
 
-import static 
org.apache.iotdb.db.queryengine.execution.fragment.FragmentInstanceContext.createFragmentInstanceContext;
-
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
-import java.util.concurrent.ExecutorService;
 import org.apache.iotdb.common.rpc.thrift.TEndPoint;
 import org.apache.iotdb.commons.concurrent.IoTDBThreadPoolFactory;
 import org.apache.iotdb.db.protocol.session.IClientSession;
@@ -47,9 +42,15 @@ import 
org.apache.iotdb.db.queryengine.plan.planner.plan.LogicalQueryPlan;
 import org.apache.iotdb.db.queryengine.plan.statement.Statement;
 import org.apache.iotdb.db.storageengine.dataregion.DataRegion;
 import org.apache.iotdb.db.storageengine.dataregion.IDataRegionForQuery;
+
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.concurrent.ExecutorService;
+
+import static 
org.apache.iotdb.db.queryengine.execution.fragment.FragmentInstanceContext.createFragmentInstanceContext;
 public class AggregationTableScanTest {
 
   @Test
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/TsFileTableSchemaUtil.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/TsFileTableSchemaUtil.java
index eaa1b6a6a9e..1536dce04c2 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/TsFileTableSchemaUtil.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/TsFileTableSchemaUtil.java
@@ -90,6 +90,14 @@ public class TsFileTableSchemaUtil {
       final String columnName = ReadWriteIOUtils.readString(tsTableBuffer);
       final TSDataType dataType = ReadWriteIOUtils.readDataType(tsTableBuffer);
 
+      // if the time column position in first column and named as "time", skip 
it
+      if (i == 0
+          && category == TsTableColumnCategory.TIME
+          && columnName.equalsIgnoreCase(TIME_COLUMN_NAME)) {
+        skipMap(tsTableBuffer);
+        continue;
+      }
+
       if (category == TsTableColumnCategory.FIELD) {
         ReadWriteIOUtils.readEncoding(tsTableBuffer);
         ReadWriteIOUtils.readCompressionType(tsTableBuffer);
diff --git 
a/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/schema/table/TsFileTableSchemaUtilTest.java
 
b/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/schema/table/TsFileTableSchemaUtilTest.java
index 4966b436a6e..f39eca4348d 100644
--- 
a/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/schema/table/TsFileTableSchemaUtilTest.java
+++ 
b/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/schema/table/TsFileTableSchemaUtilTest.java
@@ -325,9 +325,6 @@ public class TsFileTableSchemaUtilTest {
     final TsFileTableSchemaUtil.ColumnCategoryFilter filter =
         TsFileTableSchemaUtil.ColumnCategoryFilter.NO_ATTRIBUTE;
 
-    // TIME should be filtered out
-    Assert.assertFalse("TIME should be filtered out", 
filter.test(TsTableColumnCategory.TIME));
-
     // ATTRIBUTE should be filtered out
     Assert.assertFalse(
         "ATTRIBUTE should be filtered out", 
filter.test(TsTableColumnCategory.ATTRIBUTE));
@@ -340,8 +337,7 @@ public class TsFileTableSchemaUtilTest {
 
     // Test all enum values
     for (TsTableColumnCategory category : TsTableColumnCategory.values()) {
-      final boolean shouldInclude =
-          category != TsTableColumnCategory.TIME && category != 
TsTableColumnCategory.ATTRIBUTE;
+      final boolean shouldInclude = category != 
TsTableColumnCategory.ATTRIBUTE;
       Assert.assertEquals(
           "Category " + category + " filter result mismatch", shouldInclude, 
filter.test(category));
     }
@@ -641,11 +637,10 @@ public class TsFileTableSchemaUtilTest {
   public void testToTsFileTableSchemaNoAttributeWithMixedOrder() {
     // Test with columns in mixed order (TIME, TAG, ATTRIBUTE, FIELD, etc.)
     final TsTable table = new TsTable("mixedOrderTable");
-    table.addColumnSchema(new TimeColumnSchema("time", TSDataType.INT64));
     table.addColumnSchema(new TagColumnSchema("tag1", TSDataType.STRING));
     table.addColumnSchema(new AttributeColumnSchema("attr1", 
TSDataType.STRING));
     table.addColumnSchema(new FieldColumnSchema("field1", TSDataType.DOUBLE));
-    table.addColumnSchema(new TimeColumnSchema("time2", TSDataType.INT64));
+    table.addColumnSchema(new TimeColumnSchema("time2", TSDataType.TIMESTAMP));
     table.addColumnSchema(new TagColumnSchema("tag2", TSDataType.STRING));
     table.addColumnSchema(new AttributeColumnSchema("attr2", 
TSDataType.STRING));
     table.addColumnSchema(new FieldColumnSchema("field2", TSDataType.INT32));
@@ -653,7 +648,7 @@ public class TsFileTableSchemaUtilTest {
     final TableSchema result = 
TsFileTableSchemaUtil.toTsFileTableSchemaNoAttribute(table);
 
     // Should have 2 TAG + 2 FIELD = 4 columns
-    Assert.assertEquals("Should have 4 columns", 4, 
result.getColumnSchemas().size());
+    Assert.assertEquals("Should have 5 columns", 5, 
result.getColumnSchemas().size());
 
     // Verify order: tag1, tag2, field1, field2 (original order preserved)
     final List<String> columnNames =
@@ -662,8 +657,9 @@ public class TsFileTableSchemaUtilTest {
             .collect(Collectors.toList());
     Assert.assertEquals("tag1", columnNames.get(0));
     Assert.assertEquals("field1", columnNames.get(1));
-    Assert.assertEquals("tag2", columnNames.get(2));
-    Assert.assertEquals("field2", columnNames.get(3));
+    Assert.assertEquals("time2", columnNames.get(2));
+    Assert.assertEquals("tag2", columnNames.get(3));
+    Assert.assertEquals("field2", columnNames.get(4));
   }
 
   @Test

Reply via email to