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