fix
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 0a003d6..d335ff6 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 @@ | 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 e58d78d..13fcd52 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 @@ : 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 062cb6a..2c2a766 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 @@ : 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 65540a3..24fcaff 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 @@ 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 @@ // ---- 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 @@ 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 @@ } 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 @@ } 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 @@ // 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 @@ // 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 8774db3..236a939 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 @@ 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 7ee7002..6cd7296 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 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 9da2cdc..93ebba6 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.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.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; @@ -117,6 +121,35 @@ 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 = new TSRawDataQueryReq(
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 14f751b..4d0ce6e 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 static org.junit.Assert.assertEquals; -public class PlanNodeSerdeTest { +public class SourceNodeSerdeTest { @Test public void testLastQueryScanNode() throws IllegalPathException { LastQueryScanNode node =