This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch force_ci/object_type in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 36cb21f4fd60f61b9c41ea1161b02d5930bb7a86 Author: shuwenwei <[email protected]> AuthorDate: Mon Dec 15 17:56:47 2025 +0800 fix showQueries (#16855) (cherry picked from commit b71401a42271cc45162ac0ffb244fa86dd1a9d8e) --- .../db/queryengine/plan/parser/ASTVisitor.java | 22 +++++++++++---- .../planner/distribution/ExchangeNodeAdder.java | 6 ++-- .../planner/plan/node/source/ShowQueriesNode.java | 2 +- .../plan/statement/component/OrderByComponent.java | 6 ++++ .../FragmentInstanceStatisticsDrawer.java | 2 +- .../plan/parser/StatementGeneratorTest.java | 33 ++++++++++++++++++++++ ...NodeSerdeTest.java => SourceNodeSerdeTest.java} | 20 +++++++++++-- 7 files changed, 80 insertions(+), 11 deletions(-) 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 7f3936af511..fafa0995db1 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, @@ -3719,7 +3730,8 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> { OrderByKey.QUERYID, OrderByKey.DATANODEID, OrderByKey.ELAPSEDTIME, - OrderByKey.STATEMENT))); + OrderByKey.STATEMENT), + false)); } // parse LIMIT & OFFSET diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/ExchangeNodeAdder.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/ExchangeNodeAdder.java index 8f36e44361a..69105a094d1 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/ExchangeNodeAdder.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/ExchangeNodeAdder.java @@ -567,10 +567,12 @@ public class ExchangeNodeAdder extends PlanVisitor<PlanNode, NodeGroupContext> { PlanNode newNode = node.clone(); PlanNode child = visit(node.getChildren().get(0), context); newNode.addChild(child); - TRegionReplicaSet dataRegion = context.getNodeDistribution(child.getPlanNodeId()).getRegion(); + NodeDistribution nodeDistribution = context.getNodeDistribution(child.getPlanNodeId()); context.putNodeDistribution( newNode.getPlanNodeId(), - new NodeDistribution(NodeDistributionType.SAME_WITH_ALL_CHILDREN, dataRegion)); + new NodeDistribution( + NodeDistributionType.SAME_WITH_ALL_CHILDREN, + nodeDistribution == null ? null : nodeDistribution.getRegion())); return newNode; } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/source/ShowQueriesNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/source/ShowQueriesNode.java index c5925f93480..25e94c0da5c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/source/ShowQueriesNode.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/source/ShowQueriesNode.java @@ -105,8 +105,8 @@ public class ShowQueriesNode extends VirtualSourceNode { } public static ShowQueriesNode deserialize(ByteBuffer byteBuffer) { - PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer); String allowedUsername = ReadWriteIOUtils.readString(byteBuffer); + PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer); return new ShowQueriesNode(planNodeId, null, allowedUsername); } 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..b6aa8c67c0a 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,12 @@ public class OrderByComponent extends StatementNode { orderByDevice = true; deviceOrderPriority = sortItemList.size() - 1; break; + case OrderByKey.QUERYID: + case OrderByKey.DATANODEID: + case OrderByKey.ELAPSEDTIME: + case OrderByKey.STATEMENT: + // show queries 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/statistics/FragmentInstanceStatisticsDrawer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/FragmentInstanceStatisticsDrawer.java index b9f1a55b5bd..7a8b7097eb9 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/FragmentInstanceStatisticsDrawer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/FragmentInstanceStatisticsDrawer.java @@ -484,7 +484,7 @@ public class FragmentInstanceStatisticsDrawer { addLineWithValueCheck( singleFragmentInstanceArea, indentNum + 2, - "Estimated Memory Size: ", + "Estimated Memory Size", operatorStatistic.getMemoryUsage()); if (operatorStatistic.getSpecifiedInfoSize() != 0) { 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..4d27792e532 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.ShowQueriesStatement; 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 showQueries = + StatementGenerator.createStatement( + "show queries order by time, queryid, datanodeid, elapsedtime, statement", + ZonedDateTime.now().getOffset()); + Assert.assertTrue(showQueries instanceof ShowQueriesStatement); + Assert.assertEquals( + ((ShowQueriesStatement) showQueries).getSortItemList().get(0), + new SortItem(OrderByKey.TIME, Ordering.ASC)); + Assert.assertEquals( + ((ShowQueriesStatement) showQueries).getSortItemList().get(1), + new SortItem(OrderByKey.QUERYID, Ordering.ASC)); + Assert.assertEquals( + ((ShowQueriesStatement) showQueries).getSortItemList().get(2), + new SortItem(OrderByKey.DATANODEID, Ordering.ASC)); + Assert.assertEquals( + ((ShowQueriesStatement) showQueries).getSortItemList().get(3), + new SortItem(OrderByKey.ELAPSEDTIME, Ordering.ASC)); + Assert.assertEquals( + ((ShowQueriesStatement) showQueries).getSortItemList().get(4), + new SortItem(OrderByKey.STATEMENT, Ordering.ASC)); + Assert.assertThrows( + SemanticException.class, + () -> + StatementGenerator.createStatement( + "show queries 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/LastQueryScanNodeSerdeTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/source/SourceNodeSerdeTest.java similarity index 76% rename from iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/source/LastQueryScanNodeSerdeTest.java rename to iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/source/SourceNodeSerdeTest.java index 68a7fa0df0d..068b2bbc4b6 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/source/LastQueryScanNodeSerdeTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/source/SourceNodeSerdeTest.java @@ -24,6 +24,7 @@ import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.db.queryengine.plan.planner.node.PlanNodeDeserializeHelper; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.LastQueryScanNode; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.ShowQueriesNode; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.write.schema.MeasurementSchema; @@ -34,9 +35,9 @@ import java.util.Arrays; import static org.junit.Assert.assertEquals; -public class LastQueryScanNodeSerdeTest { +public class SourceNodeSerdeTest { @Test - public void test() throws IllegalPathException { + public void testLastQueryScanNode() throws IllegalPathException { LastQueryScanNode node = new LastQueryScanNode( new PlanNodeId("test"), @@ -69,4 +70,19 @@ public class LastQueryScanNodeSerdeTest { byteBuffer.flip(); assertEquals(PlanNodeDeserializeHelper.deserialize(byteBuffer), node); } + + @Test + public void testShowQueriesNode() throws IllegalPathException { + ShowQueriesNode node = new ShowQueriesNode(new PlanNodeId("test"), null, "root"); + + ByteBuffer byteBuffer = ByteBuffer.allocate(2048); + node.serialize(byteBuffer); + byteBuffer.flip(); + assertEquals(PlanNodeDeserializeHelper.deserialize(byteBuffer), node); + node = new ShowQueriesNode(new PlanNodeId("test"), null, "root"); + byteBuffer = ByteBuffer.allocate(2048); + node.serialize(byteBuffer); + byteBuffer.flip(); + assertEquals(PlanNodeDeserializeHelper.deserialize(byteBuffer), node); + } }
