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

commit 687bc24d7403834847276e986d66805cf178032d
Author: shuwenwei <[email protected]>
AuthorDate: Fri Oct 31 16:42:45 2025 +0800

    add pushdown limit offset
---
 .../InformationSchemaContentSupplierFactory.java   | 25 ++++++++++++++++---
 .../db/queryengine/plan/analyze/Analysis.java      |  5 ++--
 .../queryengine/plan/analyze/AnalyzeVisitor.java   |  1 +
 .../queryengine/plan/execution/QueryExecution.java |  5 ++--
 .../plan/planner/TableOperatorGenerator.java       |  6 ++++-
 .../plan/AbstractFragmentParallelPlanner.java      |  2 +-
 .../plan/relational/analyzer/Analyzer.java         |  3 ++-
 .../plan/relational/planner/RelationPlanner.java   | 28 ++++++++++++++--------
 .../rule/PushDownOffsetIntoTableScan.java          | 19 +++++++--------
 .../PushLimitOffsetIntoTableScan.java              | 10 ++++----
 .../optimizations/PushPredicateIntoTableScan.java  |  8 +------
 .../plan/relational/sql/rewrite/ShowRewrite.java   | 21 ++++++++++------
 .../relational/sql/rewrite/StatementRewrite.java   | 15 +++++++++---
 .../commons/schema/table/InformationSchema.java    | 14 ++++++++++-
 14 files changed, 109 insertions(+), 53 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java
index 34916639f40..d2a5cb21ca3 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java
@@ -94,6 +94,7 @@ import org.apache.tsfile.read.common.block.TsBlock;
 import org.apache.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn;
 import org.apache.tsfile.read.filter.basic.Filter;
+import org.apache.tsfile.read.reader.series.PaginationController;
 import org.apache.tsfile.utils.Binary;
 import org.apache.tsfile.utils.BytesUtils;
 import org.apache.tsfile.utils.Pair;
@@ -140,7 +141,8 @@ public class InformationSchemaContentSupplierFactory {
       final String tableName,
       final List<TSDataType> dataTypes,
       final UserEntity userEntity,
-      final Filter pushDownFilter) {
+      final Filter pushDownFilter,
+      final PaginationController paginationController) {
     try {
       switch (tableName) {
         case InformationSchema.QUERIES:
@@ -178,7 +180,8 @@ public class InformationSchemaContentSupplierFactory {
         case InformationSchema.DATA_NODES:
           return new DataNodesSupplier(dataTypes, userEntity);
         case InformationSchema.TABLE_DISK_USAGE:
-          return new TableDiskUsageSupplier(dataTypes, userEntity, 
pushDownFilter);
+          return new TableDiskUsageSupplier(
+              dataTypes, userEntity, pushDownFilter, paginationController);
         default:
           throw new UnsupportedOperationException("Unknown table: " + 
tableName);
       }
@@ -1242,6 +1245,7 @@ public class InformationSchemaContentSupplierFactory {
     private final List<TSDataType> dataTypes;
     private final Map<String, List<TTableInfo>> databaseTableInfoMap;
     private final Filter pushDownFilter;
+    private final PaginationController paginationController;
 
     private DataRegion currentDataRegion;
     private long currentTimePartition;
@@ -1251,10 +1255,14 @@ public class InformationSchemaContentSupplierFactory {
     private final StorageEngineTimePartitionIterator timePartitionIterator;
 
     private TableDiskUsageSupplier(
-        final List<TSDataType> dataTypes, final UserEntity userEntity, Filter 
pushDownFilter)
+        final List<TSDataType> dataTypes,
+        final UserEntity userEntity,
+        Filter pushDownFilter,
+        PaginationController paginationController)
         throws TException, ClientManagerException {
       this.dataTypes = dataTypes;
       this.pushDownFilter = pushDownFilter;
+      this.paginationController = paginationController;
       
AuthorityChecker.getAccessControl().checkUserGlobalSysPrivilege(userEntity);
       try (final ConfigNodeClient client =
           
ConfigNodeClientManager.getInstance().borrowClient(ConfigNodeInfo.CONFIG_REGION_ID))
 {
@@ -1280,6 +1288,9 @@ public class InformationSchemaContentSupplierFactory {
 
     @Override
     public boolean hasNext() {
+      if (!paginationController.hasCurLimit()) {
+        return false;
+      }
       if (statisticUtil != null) {
         return true;
       }
@@ -1347,6 +1358,13 @@ public class InformationSchemaContentSupplierFactory {
       long[] resultArr = statisticUtil.getResult();
 
       for (int i = 0; i < currentTablesToScan.size(); i++) {
+        if (paginationController.hasCurOffset()) {
+          paginationController.consumeOffset();
+          continue;
+        }
+        if (!paginationController.hasCurLimit()) {
+          break;
+        }
         builder.getTimeColumnBuilder().writeLong(0);
         ColumnBuilder[] columns = builder.getValueColumnBuilders();
 
@@ -1358,6 +1376,7 @@ public class InformationSchemaContentSupplierFactory {
         columns[4].writeLong(currentTimePartition);
         columns[5].writeLong(resultArr[i]);
         builder.declarePosition();
+        paginationController.consumeLimit();
       }
       closeStatisticUtil();
       return builder.build();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
index 1aef8ca3982..72a7afdee3b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analysis.java
@@ -509,8 +509,9 @@ public class Analysis implements IAnalysis {
 
   @Override
   public boolean needSetHighestPriority() {
-    // if is this Statement is ShowQueryStatement, set its instances to the 
highest priority, so
-    // that the sub-tasks of the ShowQueries instances could be executed first.
+    // if is this Statement is ShowQueryStatement or ShowDiskUsageStatement, 
set its instances to
+    // the highest priority, so
+    // that the sub-tasks of the instances could be executed first.
     return StatementType.SHOW_QUERIES.equals(statement.getType())
         || StatementType.SHOW_DISK_USAGE.equals(statement.getType());
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
index 4ec8fe588dc..47435364c2a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
@@ -3790,6 +3790,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   @Override
   public Analysis visitShowDiskUsage(
       ShowDiskUsageStatement showDiskUsageStatement, MPPQueryContext context) {
+    context.setTimeOut(Long.MAX_VALUE);
     Analysis analysis = new Analysis();
     analysis.setRealStatement(showDiskUsageStatement);
     
analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowDiskUsageHeader());
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
index 2c1657e839e..e71b10b4416 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
@@ -286,8 +286,9 @@ public class QueryExecution implements IQueryExecution {
   public void doDistributedPlan() {
     this.distributedPlan = planner.doDistributionPlan(analysis, logicalPlan, 
context);
 
-    // if is this Statement is ShowQueryStatement, set its instances to the 
highest priority, so
-    // that the sub-tasks of the ShowQueries instances could be executed first.
+    // if is this Statement is ShowQueryStatement or ShowDiskUsageStatement, 
set its instances to
+    // the highest priority, so
+    // that the sub-tasks of the instances could be executed first.
     if (analysis.needSetHighestPriority()) {
       distributedPlan.getInstances().forEach(instance -> 
instance.setHighestPriority(true));
     }
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 1890d58d006..0db3dd3d557 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
@@ -270,6 +270,7 @@ import org.apache.tsfile.read.common.type.BooleanType;
 import org.apache.tsfile.read.common.type.Type;
 import org.apache.tsfile.read.common.type.TypeFactory;
 import org.apache.tsfile.read.filter.basic.Filter;
+import org.apache.tsfile.read.reader.series.PaginationController;
 import org.apache.tsfile.utils.Binary;
 import org.apache.tsfile.utils.Pair;
 import org.apache.tsfile.utils.TsPrimitiveType;
@@ -1299,6 +1300,8 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
               context.getZoneId(),
               TimestampPrecisionUtils.currPrecision);
     }
+    PaginationController paginationController =
+        new PaginationController(node.getPushDownLimit(), 
node.getPushDownOffset());
 
     final List<TSDataType> dataTypes =
         node.getOutputSymbols().stream()
@@ -1316,7 +1319,8 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
                 .getFragmentInstanceContext()
                 .getSessionInfo()
                 .getUserEntity(),
-            pushDownFilter));
+            pushDownFilter,
+            paginationController));
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/AbstractFragmentParallelPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/AbstractFragmentParallelPlanner.java
index d7415320e04..0dcc7018fc6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/AbstractFragmentParallelPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/AbstractFragmentParallelPlanner.java
@@ -85,7 +85,7 @@ public abstract class AbstractFragmentParallelPlanner 
implements IFragmentParall
     if (regionReplicaSet == null || regionReplicaSet.getRegionId() == null) {
       TDataNodeLocation dataNodeLocation = fragment.getTargetLocation();
       if (dataNodeLocation != null) {
-        // now only the case ShowQueries will enter here
+        // now only the case ShowQueries and ShowDiskUsage will enter here
         fragmentInstance.setExecutorAndHost(new 
QueryExecutor(dataNodeLocation));
       } else {
         // no data region && no dataNodeLocation, we need to execute this FI 
on local
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java
index 3f7c5322c8e..5b21d8ffecf 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java
@@ -77,7 +77,8 @@ public class Analyzer {
             statement,
             parameters,
             parameterLookup,
-            warningCollector);
+            warningCollector,
+            context);
 
     Analysis analysis = new Analysis(rewrittenStatement, parameterLookup);
     Statement innerStatement =
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
index af823554b7b..af42677b565 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.queryengine.plan.relational.planner;
 
+import org.apache.iotdb.commons.schema.table.InformationSchema;
 import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
 import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
@@ -311,16 +312,23 @@ public class RelationPlanner extends 
AstVisitor<RelationPlan, Void> {
           outerContext);
     }
 
-    TableScanNode tableScanNode =
-        qualifiedObjectName.getDatabaseName().equals(INFORMATION_DATABASE)
-            ? new InformationSchemaTableScanNode(
-                idAllocator.genPlanNodeId(), qualifiedObjectName, 
outputSymbols, tableColumnSchema)
-            : new DeviceTableScanNode(
-                idAllocator.genPlanNodeId(),
-                qualifiedObjectName,
-                outputSymbols,
-                tableColumnSchema,
-                tagAndAttributeIndexMap);
+    TableScanNode tableScanNode;
+    if (qualifiedObjectName.getDatabaseName().equals(INFORMATION_DATABASE)) {
+      tableScanNode =
+          new InformationSchemaTableScanNode(
+              idAllocator.genPlanNodeId(), qualifiedObjectName, outputSymbols, 
tableColumnSchema);
+      if 
(InformationSchema.hasUnlimitedQueryTimeOut(qualifiedObjectName.getObjectName()))
 {
+        queryContext.setTimeOut(Long.MAX_VALUE);
+      }
+    } else {
+      tableScanNode =
+          new DeviceTableScanNode(
+              idAllocator.genPlanNodeId(),
+              qualifiedObjectName,
+              outputSymbols,
+              tableColumnSchema,
+              tagAndAttributeIndexMap);
+    }
     return new RelationPlan(tableScanNode, scope, outputSymbols, outerContext);
 
     // Collection<Field> fields = 
analysis.getMaterializedViewStorageTableFields(node);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/PushDownOffsetIntoTableScan.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/PushDownOffsetIntoTableScan.java
index d683dbe3fdb..03bdc9d94ba 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/PushDownOffsetIntoTableScan.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/iterative/rule/PushDownOffsetIntoTableScan.java
@@ -54,16 +54,15 @@ public class PushDownOffsetIntoTableScan implements 
Rule<OffsetNode> {
   public Result apply(OffsetNode parent, Captures captures, Context context) {
     TableScanNode tableScanNode = captures.get(CHILD);
     if (tableScanNode instanceof DeviceTableScanNode
-        && !((DeviceTableScanNode) tableScanNode).isPushLimitToEachDevice()) {
-      tableScanNode.setPushDownOffset(parent.getCount());
-      // consider case that there is no limit
-      tableScanNode.setPushDownLimit(
-          tableScanNode.getPushDownLimit() == 0
-              ? 0
-              : tableScanNode.getPushDownLimit() - parent.getCount());
-      return Result.ofPlanNode(tableScanNode);
+        && ((DeviceTableScanNode) tableScanNode).isPushLimitToEachDevice()) {
+      return Result.empty();
     }
-
-    return Result.empty();
+    tableScanNode.setPushDownOffset(parent.getCount());
+    // consider case that there is no limit
+    tableScanNode.setPushDownLimit(
+        tableScanNode.getPushDownLimit() == 0
+            ? 0
+            : tableScanNode.getPushDownLimit() - parent.getCount());
+    return Result.ofPlanNode(tableScanNode);
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushLimitOffsetIntoTableScan.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushLimitOffsetIntoTableScan.java
index b58ee1874ac..70daf444bf2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushLimitOffsetIntoTableScan.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushLimitOffsetIntoTableScan.java
@@ -186,6 +186,11 @@ public class PushLimitOffsetIntoTableScan implements 
PlanOptimizer {
 
       TableScanNode tableScanNode = subContext.tableScanNode;
       context.tableScanNode = tableScanNode;
+
+      if (!(tableScanNode instanceof DeviceTableScanNode)) {
+        context.enablePushDown = false;
+        return node;
+      }
       OrderingScheme orderingScheme = node.getOrderingScheme();
       Map<Symbol, ColumnSchema> tableColumnSchema =
           
analysis.getTableColumnSchema(tableScanNode.getQualifiedObjectName());
@@ -205,11 +210,6 @@ public class PushLimitOffsetIntoTableScan implements 
PlanOptimizer {
         sortSymbols.add(orderBy);
       }
 
-      if (!(tableScanNode instanceof DeviceTableScanNode)) {
-        context.enablePushDown = false;
-        return node;
-      }
-
       boolean pushLimitToEachDevice = false;
       for (Map.Entry<Symbol, ColumnSchema> entry : 
tableColumnSchema.entrySet()) {
         if (entry.getValue().getColumnCategory() == TsTableColumnCategory.TAG
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
index 39449a5a191..363d8f7da87 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
@@ -449,13 +449,7 @@ public class PushPredicateIntoTableScan implements 
PlanOptimizer {
       if (TRUE_LITERAL.equals(context.inheritedPredicate)) {
         return node;
       }
-      switch (node.getQualifiedObjectName().getObjectName()) {
-          // information tables that supports pushdown predicate
-        case InformationSchema.TABLE_DISK_USAGE:
-          return combineFilterAndScan(node, context.inheritedPredicate);
-        default:
-          return node;
-      }
+      return combineFilterAndScan(node, context.inheritedPredicate);
     }
 
     @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/ShowRewrite.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/ShowRewrite.java
index 3ab705341f6..f3235f2f304 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/ShowRewrite.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/ShowRewrite.java
@@ -21,6 +21,7 @@ package 
org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite;
 
 import org.apache.iotdb.commons.schema.column.ColumnHeaderConstant;
 import 
org.apache.iotdb.commons.udf.builtin.relational.TableBuiltinAggregationFunction;
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector;
 import org.apache.iotdb.db.queryengine.plan.relational.analyzer.NodeRef;
@@ -63,20 +64,24 @@ public final class ShowRewrite implements 
StatementRewrite.Rewrite {
       final Statement node,
       final List<Expression> parameters,
       final Map<NodeRef<Parameter>, Expression> parameterLookup,
-      final WarningCollector warningCollector) {
+      final WarningCollector warningCollector,
+      final MPPQueryContext queryContext) {
     final Visitor visitor = new Visitor();
     return (Statement) visitor.process(node, null);
   }
 
-  private static class Visitor extends AstVisitor<Node, Void> {
+  private static class Visitor extends AstVisitor<Node, MPPQueryContext> {
 
     @Override
-    protected Node visitShowQueriesStatement(ShowQueriesStatement node, Void 
context) {
+    protected Node visitShowQueriesStatement(ShowQueriesStatement node, 
MPPQueryContext context) {
       return visitShowStatement(node, context);
     }
 
     @Override
-    protected Node visitShowDiskUsageOfTable(ShowDiskUsageOfTable node, Void 
context) {
+    protected Node visitShowDiskUsageOfTable(ShowDiskUsageOfTable node, 
MPPQueryContext context) {
+      if (context != null) {
+        context.setTimeOut(Long.MAX_VALUE);
+      }
       return simpleQuery(
           selectList(
               new SingleColumn(new 
Identifier(ColumnHeaderConstant.NODE_ID_TABLE_MODEL)),
@@ -103,7 +108,8 @@ public final class ShowRewrite implements 
StatementRewrite.Rewrite {
     }
 
     @Override
-    protected Node visitShowStatement(final ShowStatement showStatement, final 
Void context) {
+    protected Node visitShowStatement(
+        final ShowStatement showStatement, final MPPQueryContext context) {
       return simpleQuery(
           selectList(new AllColumns()),
           from(INFORMATION_DATABASE, showStatement.getTableName()),
@@ -117,7 +123,8 @@ public final class ShowRewrite implements 
StatementRewrite.Rewrite {
     }
 
     @Override
-    protected Node visitCountStatement(final CountStatement countStatement, 
final Void context) {
+    protected Node visitCountStatement(
+        final CountStatement countStatement, final MPPQueryContext context) {
       return simpleQuery(
           new Select(
               false,
@@ -142,7 +149,7 @@ public final class ShowRewrite implements 
StatementRewrite.Rewrite {
     }
 
     @Override
-    protected Node visitNode(final Node node, final Void context) {
+    protected Node visitNode(final Node node, final MPPQueryContext context) {
       return node;
     }
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/StatementRewrite.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/StatementRewrite.java
index 66bcd5f4ef1..000341fb6cb 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/StatementRewrite.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/rewrite/StatementRewrite.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite;
 
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector;
 import org.apache.iotdb.db.queryengine.plan.relational.analyzer.NodeRef;
@@ -48,12 +49,19 @@ public final class StatementRewrite {
       Statement node,
       List<Expression> parameters,
       Map<NodeRef<Parameter>, Expression> parameterLookup,
-      WarningCollector warningCollector) {
+      WarningCollector warningCollector,
+      MPPQueryContext queryContext) {
     for (Rewrite rewrite : rewrites) {
       node =
           requireNonNull(
               rewrite.rewrite(
-                  analyzerFactory, session, node, parameters, parameterLookup, 
warningCollector),
+                  analyzerFactory,
+                  session,
+                  node,
+                  parameters,
+                  parameterLookup,
+                  warningCollector,
+                  queryContext),
               "Statement rewrite returned null");
     }
     return node;
@@ -66,7 +74,8 @@ public final class StatementRewrite {
         Statement node,
         List<Expression> parameters,
         Map<NodeRef<Parameter>, Expression> parameterLookup,
-        WarningCollector warningCollector);
+        WarningCollector warningCollector,
+        MPPQueryContext queryContext);
   }
 
   public static final StatementRewrite NOOP = new 
StatementRewrite(ImmutableSet.of());
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/InformationSchema.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/InformationSchema.java
index a237b7c6dd5..4a1200c33d7 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/InformationSchema.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/InformationSchema.java
@@ -24,11 +24,12 @@ import 
org.apache.iotdb.commons.schema.table.column.AttributeColumnSchema;
 import org.apache.iotdb.commons.schema.table.column.FieldColumnSchema;
 import org.apache.iotdb.commons.schema.table.column.TagColumnSchema;
 
-import org.apache.ratis.thirdparty.com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSet;
 import org.apache.tsfile.enums.TSDataType;
 
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
@@ -38,6 +39,7 @@ public class InformationSchema {
   private static final Map<String, TsTable> schemaTables = new HashMap<>();
   private static final Map<String, Set<String>> 
columnsThatSupportPushDownPredicate =
       new HashMap<>();
+  private static final Set<String> tablesThatSupportPushDownLimitOffset = new 
HashSet<>();
 
   public static final String QUERIES = "queries";
   public static final String DATABASES = "databases";
@@ -396,6 +398,8 @@ public class InformationSchema {
             ColumnHeaderConstant.NODE_ID_TABLE_MODEL,
             ColumnHeaderConstant.REGION_ID_TABLE_MODEL,
             ColumnHeaderConstant.TIME_PARTITION_TABLE_MODEL));
+
+    tablesThatSupportPushDownLimitOffset.add(TABLE_DISK_USAGE);
   }
 
   public static Map<String, TsTable> getSchemaTables() {
@@ -406,6 +410,14 @@ public class InformationSchema {
     return columnsThatSupportPushDownPredicate.getOrDefault(tableName, 
Collections.emptySet());
   }
 
+  public static boolean supportsPushDownLimitOffset(String tableName) {
+    return columnsThatSupportPushDownPredicate.containsKey(tableName);
+  }
+
+  public static boolean hasUnlimitedQueryTimeOut(String tableName) {
+    return tableName.equals(TABLE_DISK_USAGE);
+  }
+
   private InformationSchema() {
     // Utils
   }

Reply via email to