This is an automated email from the ASF dual-hosted git repository. JackieTien97 pushed a commit to branch codex/backport-pr-18179-dev-1.3 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit d0a07334d64c919816509d2bd73c57e2a262cda2 Author: JackieTien97 <[email protected]> AuthorDate: Mon Jul 13 14:11:37 2026 +0800 Address query retry review feedback --- .../plan/statement/crud/QueryStatement.java | 1 - .../plan/planner/LogicalPlanBuilderTest.java | 47 ++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/QueryStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/QueryStatement.java index 58f48cd12df..6d36d4fd64e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/QueryStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/QueryStatement.java @@ -86,7 +86,6 @@ public class QueryStatement extends AuthorityInformationStatement { private SelectComponent selectComponent; private FromComponent fromComponent; private WhereCondition whereCondition; - private HavingCondition havingCondition; // row limit for result set. The default value is 0, which means no limit diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilderTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilderTest.java index bc3f7b8018a..07e7baa99fc 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilderTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilderTest.java @@ -22,15 +22,22 @@ import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.common.QueryId; import org.apache.iotdb.db.queryengine.plan.analyze.Analysis; import org.apache.iotdb.db.queryengine.plan.parser.StatementGenerator; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.SortNode; +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.SortItem; import org.apache.iotdb.db.queryengine.plan.statement.crud.QueryStatement; import org.junit.Test; import java.time.ZonedDateTime; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.List; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; public class LogicalPlanBuilderTest { @@ -52,6 +59,46 @@ public class LogicalPlanBuilderTest { Arrays.asList(sortItemCountAfterFirstPlan, queryStatement.getSortItemList().size())); } + @Test + public void testPlanOrderByUsesDeviceViewMergeKeysWithoutMutatingStatement() { + QueryStatement queryStatement = + (QueryStatement) + StatementGenerator.createStatement( + "select s1 from root.sg.* order by s1 desc align by device", + ZonedDateTime.now().getOffset()); + List<SortItem> originalSortItems = new ArrayList<>(queryStatement.getSortItemList()); + String originalOrderByClause = queryStatement.getOrderByComponent().toSQLString(); + List<SortItem> expectedSortItems = new ArrayList<>(originalSortItems); + expectedSortItems.add(new SortItem(OrderByKey.DEVICE, Ordering.ASC)); + expectedSortItems.add(new SortItem(OrderByKey.TIME, Ordering.ASC)); + + Analysis analysis = new Analysis(); + analysis.setOrderByExpressions(Collections.emptySet()); + analysis.setSelectExpressions(Collections.emptySet()); + LogicalPlanBuilder builder = + new LogicalPlanBuilder(analysis, new MPPQueryContext(new QueryId("two_stage_plan"))) + .planDeviceView( + Collections.emptyMap(), + Collections.emptySet(), + Collections.emptyMap(), + Collections.emptySet(), + queryStatement, + analysis) + .planOrderBy(queryStatement, analysis); + + assertTrue(builder.getRoot() instanceof SortNode); + assertTrue( + ((SortNode) builder.getRoot()) + .getOrderByParameter() + .getSortItemList() + .get(0) + .isExpression()); + assertEquals( + expectedSortItems, ((SortNode) builder.getRoot()).getOrderByParameter().getSortItemList()); + assertEquals(originalSortItems, queryStatement.getSortItemList()); + assertEquals(originalOrderByClause, queryStatement.getOrderByComponent().toSQLString()); + } + private static void planDeviceView(QueryStatement queryStatement, String queryId) { Analysis analysis = new Analysis(); new LogicalPlanBuilder(analysis, new MPPQueryContext(new QueryId(queryId)))
