This is an automated email from the ASF dual-hosted git repository.
shuwenwei pushed a commit to branch table_disk_usage_statistics
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/table_disk_usage_statistics by
this push:
new 880718f393a fix
880718f393a is described below
commit 880718f393a48c9852cf7744a32c3e5873a082f6
Author: shuwenwei <[email protected]>
AuthorDate: Wed Dec 10 18:06:14 2025 +0800
fix
---
.../org/apache/iotdb/db/qp/sql/IdentifierParser.g4 | 1 +
.../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 8 +++++
.../antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 | 4 +++
.../db/queryengine/plan/parser/ASTVisitor.java | 39 ++++++++++++++++++----
.../plan/statement/component/OrderByComponent.java | 10 ++++++
.../plan/statement/component/OrderByKey.java | 5 +++
.../plan/parser/StatementGeneratorTest.java | 33 ++++++++++++++++++
...NodeSerdeTest.java => SourceNodeSerdeTest.java} | 2 +-
8 files changed, 95 insertions(+), 7 deletions(-)
diff --git
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
index 0a003d6fb71..d335ff61f5c 100644
---
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
+++
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
@@ -220,6 +220,7 @@ keyWords
| SGLEVEL
| SHOW
| SINK
+ | SIZEINBYTES
| SLIMIT
| SOFFSET
| SOURCE
diff --git
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
index e58d78deccf..13fcd52a458 100644
---
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
+++
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
@@ -963,6 +963,14 @@ sortKey
: TIME
| TIMESERIES
| DEVICE
+ | QUERYID
+ | DATANODEID
+ | ELAPSEDTIME
+ | STATEMENT
+ | DATABASE
+ | REGIONID
+ | TIMEPARTITION
+ | SIZEINBYTES
;
// ---- Fill Clause
diff --git
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
index 062cb6ae082..2c2a7664f56 100644
--- a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
+++ b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
@@ -802,6 +802,10 @@ SINK
: S I N K
;
+SIZEINBYTES
+ : S I Z E I N B Y T E S
+ ;
+
SLIMIT
: S L I M I T
;
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
index 65540a3a3c6..24fcaff853c 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
@@ -1634,7 +1634,8 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
queryStatement.setOrderByComponent(
parseOrderByClause(
ctx.orderByClause(),
- ImmutableSet.of(OrderByKey.TIME, OrderByKey.DEVICE,
OrderByKey.TIMESERIES)));
+ ImmutableSet.of(OrderByKey.TIME, OrderByKey.DEVICE,
OrderByKey.TIMESERIES),
+ true));
}
// parse FILL
@@ -1937,7 +1938,9 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
// ---- Order By Clause
// all SortKeys should be contained by limitSet
private OrderByComponent parseOrderByClause(
- IoTDBSqlParser.OrderByClauseContext ctx, ImmutableSet<String> limitSet) {
+ IoTDBSqlParser.OrderByClauseContext ctx,
+ ImmutableSet<String> limitSet,
+ boolean allowExpression) {
OrderByComponent orderByComponent = new OrderByComponent();
Set<String> sortKeySet = new HashSet<>();
for (IoTDBSqlParser.OrderByAttributeClauseContext
orderByAttributeClauseContext :
@@ -1946,7 +1949,8 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
if (orderByComponent.isUnique()) {
break;
}
- SortItem sortItem =
parseOrderByAttributeClause(orderByAttributeClauseContext, limitSet);
+ SortItem sortItem =
+ parseOrderByAttributeClause(orderByAttributeClauseContext, limitSet,
allowExpression);
String sortKey = sortItem.getSortKey();
if (sortKeySet.contains(sortKey)) {
@@ -1965,7 +1969,9 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
}
private SortItem parseOrderByAttributeClause(
- IoTDBSqlParser.OrderByAttributeClauseContext ctx, ImmutableSet<String>
limitSet) {
+ IoTDBSqlParser.OrderByAttributeClauseContext ctx,
+ ImmutableSet<String> limitSet,
+ boolean allowExpression) {
if (ctx.sortKey() != null) {
String sortKey = ctx.sortKey().getText().toUpperCase();
if (!limitSet.contains(sortKey)) {
@@ -1974,6 +1980,11 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
}
return new SortItem(sortKey, ctx.DESC() != null ? Ordering.DESC :
Ordering.ASC);
} else {
+ if (!allowExpression) {
+ throw new SemanticException(
+ "ORDER BY expression is not supported for current statement,
supported sort key: "
+ + limitSet.toString());
+ }
Expression sortExpression = parseExpression(ctx.expression(), true);
return new SortItem(
sortExpression,
@@ -3712,7 +3723,15 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
// parse ORDER BY
if (ctx.orderByClause() != null) {
showQueriesStatement.setOrderByComponent(
- parseOrderByClause(ctx.orderByClause(),
ImmutableSet.of(OrderByKey.TIME)));
+ parseOrderByClause(
+ ctx.orderByClause(),
+ ImmutableSet.of(
+ OrderByKey.TIME,
+ OrderByKey.QUERYID,
+ OrderByKey.DATANODEID,
+ OrderByKey.ELAPSEDTIME,
+ OrderByKey.STATEMENT),
+ false));
}
// parse LIMIT & OFFSET
@@ -3740,7 +3759,15 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
// parse ORDER BY
if (ctx.orderByClause() != null) {
showDiskUsageStatement.setOrderByComponent(
- parseOrderByClause(ctx.orderByClause(), ImmutableSet.of()));
+ parseOrderByClause(
+ ctx.orderByClause(),
+ ImmutableSet.of(
+ OrderByKey.DATABASE,
+ OrderByKey.DATANODEID,
+ OrderByKey.REGIONID,
+ OrderByKey.TIMEPARTITION,
+ OrderByKey.SIZEINBYTES),
+ false));
}
// parse LIMIT & OFFSET
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/component/OrderByComponent.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/component/OrderByComponent.java
index 8774db378f5..236a939dc9a 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/component/OrderByComponent.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/component/OrderByComponent.java
@@ -63,6 +63,16 @@ public class OrderByComponent extends StatementNode {
orderByDevice = true;
deviceOrderPriority = sortItemList.size() - 1;
break;
+ case OrderByKey.QUERYID:
+ case OrderByKey.DATANODEID:
+ case OrderByKey.ELAPSEDTIME:
+ case OrderByKey.STATEMENT:
+ case OrderByKey.DATABASE:
+ case OrderByKey.REGIONID:
+ case OrderByKey.TIMEPARTITION:
+ case OrderByKey.SIZEINBYTES:
+ // show queries statement or show disk usage statement
+ break;
default:
throw new IllegalArgumentException(
String.format("Unknown sort key %s", sortItem.getSortKey()));
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/component/OrderByKey.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/component/OrderByKey.java
index 7ee7002495f..6cd7296fd24 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/component/OrderByKey.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/component/OrderByKey.java
@@ -27,6 +27,11 @@ public class OrderByKey {
public static final String DATANODEID = "DATANODEID";
public static final String ELAPSEDTIME = "ELAPSEDTIME";
public static final String STATEMENT = "STATEMENT";
+ public static final String DATABASE = "DATABASE";
+ public static final String REGIONID = "REGIONID";
+ public static final String TIMEPARTITION = "TIMEPARTITION";
+ public static final String TIMESERIESPARTITION = "TIMESERIESPARTITION";
+ public static final String SIZEINBYTES = "SIZEINBYTES";
private OrderByKey() {
// forbidding instantiation
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGeneratorTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGeneratorTest.java
index 9da2cdcf8a4..93ebba65222 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGeneratorTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/parser/StatementGeneratorTest.java
@@ -39,7 +39,10 @@ import
org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager;
import org.apache.iotdb.db.queryengine.plan.statement.Statement;
import org.apache.iotdb.db.queryengine.plan.statement.StatementTestUtils;
import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
+import org.apache.iotdb.db.queryengine.plan.statement.component.OrderByKey;
+import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
import org.apache.iotdb.db.queryengine.plan.statement.component.ResultColumn;
+import org.apache.iotdb.db.queryengine.plan.statement.component.SortItem;
import org.apache.iotdb.db.queryengine.plan.statement.crud.DeleteDataStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.crud.InsertMultiTabletsStatement;
import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowStatement;
@@ -60,6 +63,7 @@ import
org.apache.iotdb.db.queryengine.plan.statement.metadata.template.ShowNode
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.template.UnsetSchemaTemplateStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.view.CreateLogicalViewStatement;
import org.apache.iotdb.db.queryengine.plan.statement.sys.AuthorStatement;
+import
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowDiskUsageStatement;
import org.apache.iotdb.isession.template.TemplateNode;
import org.apache.iotdb.rpc.StatementExecutionException;
import org.apache.iotdb.service.rpc.thrift.TSAggregationQueryReq;
@@ -116,6 +120,35 @@ import static org.junit.Assert.assertTrue;
public class StatementGeneratorTest {
+ @Test
+ public void testShowQueries() {
+ Statement showDiskUsage =
+ StatementGenerator.createStatement(
+ "show disk_usage from root.test.** order by database, datanodeid,
regionid, timepartition, sizeinbytes",
+ ZonedDateTime.now().getOffset());
+ Assert.assertTrue(showDiskUsage instanceof ShowDiskUsageStatement);
+ Assert.assertEquals(
+ ((ShowDiskUsageStatement) showDiskUsage).getSortItemList().get(0),
+ new SortItem(OrderByKey.DATABASE, Ordering.ASC));
+ Assert.assertEquals(
+ ((ShowDiskUsageStatement) showDiskUsage).getSortItemList().get(1),
+ new SortItem(OrderByKey.DATANODEID, Ordering.ASC));
+ Assert.assertEquals(
+ ((ShowDiskUsageStatement) showDiskUsage).getSortItemList().get(2),
+ new SortItem(OrderByKey.REGIONID, Ordering.ASC));
+ Assert.assertEquals(
+ ((ShowDiskUsageStatement) showDiskUsage).getSortItemList().get(3),
+ new SortItem(OrderByKey.TIMEPARTITION, Ordering.ASC));
+ Assert.assertEquals(
+ ((ShowDiskUsageStatement) showDiskUsage).getSortItemList().get(4),
+ new SortItem(OrderByKey.SIZEINBYTES, Ordering.ASC));
+ Assert.assertThrows(
+ SemanticException.class,
+ () ->
+ StatementGenerator.createStatement(
+ "show disk_usage from root.test.** order by a",
ZonedDateTime.now().getOffset()));
+ }
+
@Test
public void testRawDataQuery() throws IllegalPathException {
TSRawDataQueryReq req =
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/source/PlanNodeSerdeTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/source/SourceNodeSerdeTest.java
similarity index 98%
rename from
iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/source/PlanNodeSerdeTest.java
rename to
iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/source/SourceNodeSerdeTest.java
index 14f751b69bf..4d0ce6e362d 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/source/PlanNodeSerdeTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/source/SourceNodeSerdeTest.java
@@ -35,7 +35,7 @@ import java.util.Arrays;
import static org.junit.Assert.assertEquals;
-public class PlanNodeSerdeTest {
+public class SourceNodeSerdeTest {
@Test
public void testLastQueryScanNode() throws IllegalPathException {
LastQueryScanNode node =