From 134696c0bdfef7d39a7d0af5609e166d22bdbc07 Mon Sep 17 00:00:00 2001 From: Weihao Li <18110526956@163.com> Date: Thu, 5 Feb 2026 15:51:12 +0800 Subject: [PATCH 1/6] FE Signed-off-by: Weihao Li <18110526956@163.com> --- .../legacy/IoTDBLegacyPipeReceiverAgent.java | 1 + .../legacy/loader/DeletionLoader.java | 3 +- .../protocol/legacy/loader/TsFileLoader.java | 3 +- .../thrift/IoTDBDataNodeReceiver.java | 6 ++- .../protocol/writeback/WriteBackSink.java | 3 +- .../thrift/impl/ClientRPCServiceImpl.java | 40 +++++++++++++------ .../impl/DataNodeInternalRPCServiceImpl.java | 1 + .../queryengine/common/MPPQueryContext.java | 10 +++++ .../db/queryengine/plan/Coordinator.java | 25 ++++++++++-- .../TreeSchemaAutoCreatorAndVerifier.java | 1 + .../schema/AutoCreateSchemaExecutor.java | 1 + .../schema/ClusterSchemaFetchExecutor.java | 1 + .../executor/ClusterConfigTaskExecutor.java | 1 + .../fetcher/TableDeviceSchemaFetcher.java | 2 + .../fetcher/TableDeviceSchemaValidator.java | 1 + .../relational/planner/CteMaterializer.java | 1 + ...correlatedScalarSubqueryReconstructor.java | 3 +- .../plan/relational/sql/ast/Statement.java | 9 +++++ .../relational/sql/parser/AstBuilder.java | 4 +- .../load/active/ActiveLoadTsFileLoader.java | 3 +- .../LoadTsFileDataTypeConverter.java | 1 + .../relational/grammar/sql/RelationalSql.g4 | 2 +- 22 files changed, 96 insertions(+), 26 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/IoTDBLegacyPipeReceiverAgent.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/IoTDBLegacyPipeReceiverAgent.java index 2c45c42a45582..ea7baae792775 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/IoTDBLegacyPipeReceiverAgent.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/IoTDBLegacyPipeReceiverAgent.java @@ -165,6 +165,7 @@ private boolean registerDatabase( partitionFetcher, schemaFetcher, IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(), + false, false); if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode() && result.status.code != TSStatusCode.DATABASE_ALREADY_EXISTS.getStatusCode() diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/DeletionLoader.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/DeletionLoader.java index 244ec579206b6..56875a840ed36 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/DeletionLoader.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/DeletionLoader.java @@ -76,7 +76,8 @@ public void load() throws PipeException { PARTITION_FETCHER, SCHEMA_FETCHER, IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(), - false); + false, + statement.isDebug()); if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { LOGGER.error("Delete {} error, statement: {}.", deletion, statement); LOGGER.error("Delete result status : {}.", result.status); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/TsFileLoader.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/TsFileLoader.java index d3698e97d0797..e4a1c079a2146 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/TsFileLoader.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/TsFileLoader.java @@ -79,7 +79,8 @@ public void load() { PARTITION_FETCHER, SCHEMA_FETCHER, IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(), - false); + false, + statement.isDebug()); if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { LOGGER.error("Load TsFile {} error, statement: {}.", tsFile.getPath(), statement); LOGGER.error("Load TsFile result status : {}.", result.status); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java index f0796a3b1a038..4670d7eac2a83 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java @@ -1050,7 +1050,8 @@ private TSStatus executeStatementForTreeModel(final Statement statement) { ClusterPartitionFetcher.getInstance(), ClusterSchemaFetcher.getInstance(), IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(), - false) + false, + statement.isDebug()) .status; } @@ -1075,7 +1076,8 @@ private TSStatus executeStatementForTableModelWithPermissionCheck( "", LocalExecutionPlanner.getInstance().metadata, IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(), - false) + false, + statement.isDebug()) .status; // Delete data & Update device attribute is itself idempotent diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/writeback/WriteBackSink.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/writeback/WriteBackSink.java index c47e00ff92e52..9d476c542941b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/writeback/WriteBackSink.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/writeback/WriteBackSink.java @@ -512,7 +512,8 @@ private TSStatus executeStatementForTreeModel(final Statement statement, final S ClusterPartitionFetcher.getInstance(), ClusterSchemaFetcher.getInstance(), IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(), - false) + false, + statement.isDebug()) .status; } catch (final IoTDBRuntimeException e) { if (e.getErrorCode() == TSStatusCode.NO_PERMISSION.getStatusCode()) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java index 167a1fa914fd2..45eb4f027a7ac 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java @@ -343,7 +343,8 @@ private TSExecuteStatementResp executeStatementInternal( statement, LocalExecutionPlanner.getInstance().metadata, config.getQueryTimeoutThreshold(), - false); + false, + s.isDebug()); } else { // permission check TSStatus status = @@ -387,7 +388,8 @@ private TSExecuteStatementResp executeStatementInternal( partitionFetcher, schemaFetcher, req.getTimeout(), - true); + true, + false); } } } else { @@ -434,7 +436,8 @@ private TSExecuteStatementResp executeStatementInternal( statement, metadata, req.getTimeout(), - true); + true, + false); } } @@ -583,7 +586,8 @@ private TSExecuteStatementResp executeRawDataQueryInternal( partitionFetcher, schemaFetcher, req.getTimeout(), - true); + true, + s.isDebug()); if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { finished = true; @@ -678,7 +682,8 @@ private TSExecuteStatementResp executeLastDataQueryInternal( partitionFetcher, schemaFetcher, req.getTimeout(), - true); + true, + s.isDebug()); if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { finished = true; @@ -775,7 +780,8 @@ private TSExecuteStatementResp executeAggregationQueryInternal( partitionFetcher, schemaFetcher, req.getTimeout(), - true); + true, + s.isDebug()); if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { finished = true; @@ -1234,7 +1240,8 @@ public TSExecuteStatementResp executeFastLastDataQueryForOneDeviceV2( partitionFetcher, schemaFetcher, req.getTimeout(), - true); + true, + s.isDebug()); if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { finished = true; @@ -1863,7 +1870,8 @@ public TSStatus executeBatchStatement(TSExecuteBatchStatementReq req) { statement, LocalExecutionPlanner.getInstance().metadata, config.getQueryTimeoutThreshold(), - false); + false, + s.isDebug()); } else { // permission check TSStatus status = @@ -1908,7 +1916,8 @@ public TSStatus executeBatchStatement(TSExecuteBatchStatementReq req) { partitionFetcher, schemaFetcher, config.getQueryTimeoutThreshold(), - false); + false, + s.isDebug()); } } } else { @@ -1954,7 +1963,8 @@ public TSStatus executeBatchStatement(TSExecuteBatchStatementReq req) { statement, metadata, config.getQueryTimeoutThreshold(), - false); + false, + s.isDebug()); } } @@ -2876,7 +2886,8 @@ private TSQueryTemplateResp executeTemplateQueryStatement( partitionFetcher, schemaFetcher, config.getQueryTimeoutThreshold(), - true); + true, + statement.isDebug()); if (executionResult.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode() && executionResult.status.code != TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()) { @@ -3286,6 +3297,7 @@ private ExecutionResult executeBatchStatement( ExecutionResult result = null; final List subStatements = statement.getSubStatements(); final int totalSubStatements = subStatements.size(); + boolean debug = statement.isDebug(); LOGGER.info( "Start batch executing {} sub-statement(s) in tree model, queryId: {}", @@ -3310,7 +3322,8 @@ private ExecutionResult executeBatchStatement( partitionFetcher, schemaFetcher, timeoutMs, - userQuery); + userQuery, + debug); // Exit early if any sub-statement execution fails if (result != null @@ -3400,7 +3413,8 @@ private ExecutionResult executeBatchTableStatement( statementStr, metadata, timeoutMs, - userQuery); + userQuery, + statement.isDebug()); // Exit early if any sub-statement execution fails if (result != null diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java index 46d377be0a1bd..24a2ff7e9e78a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java @@ -1683,6 +1683,7 @@ public TSStatus executeCQ(TExecuteCQ req) { partitionFetcher, schemaFetcher, req.getTimeout(), + false, false); if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode() diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java index fac3afff8b0b0..3bd1f28e6ba6e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java @@ -125,6 +125,8 @@ public enum ExplainType { private boolean userQuery = false; + private boolean debug = false; + private Map, Query> cteQueries = new HashMap<>(); // Stores the EXPLAIN/EXPLAIN ANALYZE results for Common Table Expressions (CTEs) @@ -503,6 +505,14 @@ public void setUserQuery(boolean userQuery) { this.userQuery = userQuery; } + public boolean isDebug() { + return debug; + } + + public void setDebug(boolean debug) { + this.debug = debug; + } + public boolean isInnerTriggeredQuery() { return innerTriggeredQuery; } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java index 0007f5dc79749..af5f208d3318a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java @@ -297,6 +297,7 @@ private ExecutionResult execution( SessionInfo session, String sql, boolean userQuery, + boolean debug, BiFunction iQueryExecutionFactory) { long startTime = System.currentTimeMillis(); QueryId globalQueryId = queryIdGenerator.createNextQueryId(); @@ -314,6 +315,7 @@ private ExecutionResult execution( DataNodeEndPoints.LOCAL_HOST_DATA_BLOCK_ENDPOINT, DataNodeEndPoints.LOCAL_HOST_INTERNAL_ENDPOINT); queryContext.setUserQuery(userQuery); + queryContext.setDebug(debug); IQueryExecution execution = iQueryExecutionFactory.apply(queryContext, startTime); if (execution.isQuery()) { queryExecutionMap.put(queryId, execution); @@ -345,7 +347,15 @@ public ExecutionResult executeForTreeModel( IPartitionFetcher partitionFetcher, ISchemaFetcher schemaFetcher) { return executeForTreeModel( - statement, queryId, session, sql, partitionFetcher, schemaFetcher, Long.MAX_VALUE, false); + statement, + queryId, + session, + sql, + partitionFetcher, + schemaFetcher, + Long.MAX_VALUE, + false, + false); } public ExecutionResult executeForTreeModel( @@ -356,12 +366,14 @@ public ExecutionResult executeForTreeModel( IPartitionFetcher partitionFetcher, ISchemaFetcher schemaFetcher, long timeOut, - boolean userQuery) { + boolean userQuery, + boolean debug) { return execution( queryId, session, sql, userQuery, + debug, ((queryContext, startTime) -> createQueryExecutionForTreeModel( statement, @@ -425,12 +437,14 @@ public ExecutionResult executeForTableModel( Map, Query> cteQueries, ExplainType explainType, long timeOut, - boolean userQuery) { + boolean userQuery, + boolean debug) { return execution( queryId, session, sql, userQuery, + debug, ((queryContext, startTime) -> { queryContext.setInnerTriggeredQuery(true); queryContext.setCteQueries(cteQueries); @@ -455,12 +469,14 @@ public ExecutionResult executeForTableModel( String sql, Metadata metadata, long timeOut, - boolean userQuery) { + boolean userQuery, + boolean debug) { return execution( queryId, session, sql, userQuery, + debug, ((queryContext, startTime) -> createQueryExecutionForTableModel( statement, @@ -486,6 +502,7 @@ public ExecutionResult executeForTableModel( session, sql, false, + false, ((queryContext, startTime) -> createQueryExecutionForTableModel( statement, diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/TreeSchemaAutoCreatorAndVerifier.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/TreeSchemaAutoCreatorAndVerifier.java index 29d4f1be07b9e..cf2aedc6c19f2 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/TreeSchemaAutoCreatorAndVerifier.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/load/TreeSchemaAutoCreatorAndVerifier.java @@ -373,6 +373,7 @@ private void executeSetDatabaseStatement(Statement statement) loadTsFileAnalyzer.partitionFetcher, loadTsFileAnalyzer.schemaFetcher, IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(), + false, false); if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode() && result.status.code != TSStatusCode.DATABASE_ALREADY_EXISTS.getStatusCode() diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java index ef0ad80306aa1..2c6ed30cd75ec 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java @@ -93,6 +93,7 @@ private ExecutionResult executeStatement(Statement statement, MPPQueryContext co schemaFetcher, // Never timeout for write statement Long.MAX_VALUE, + false, false); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java index d6f5fd74fa985..5d6d36d460920 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java @@ -98,6 +98,7 @@ private ExecutionResult executionStatement( ClusterPartitionFetcher.getInstance(), schemaFetcher, timeout, + false, false); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java index 3627e3f82af6b..0fa527448169d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java @@ -3039,6 +3039,7 @@ public SettableFuture renameLogicalView( ClusterPartitionFetcher.getInstance(), ClusterSchemaFetcher.getInstance(), IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(), + false, false); if (executionResult.status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { future.setException( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java index 049db7dec9342..b9b59636b092d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java @@ -135,6 +135,7 @@ Map> fetchMissingDeviceSchemaForDataInsertion( LocalExecutionPlanner.getInstance().metadata, // Never timeout for insert Long.MAX_VALUE, + false, false); if (executionResult.status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { @@ -502,6 +503,7 @@ private void fetchMissingDeviceSchemaForQuery( LocalExecutionPlanner.getInstance().metadata, mppQueryContext.getTimeOut() - (System.currentTimeMillis() - mppQueryContext.getStartTime()), + false, false); if (executionResult.status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaValidator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaValidator.java index 122d352d33293..2331d0e4ffcc4 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaValidator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaValidator.java @@ -242,6 +242,7 @@ private void autoCreateOrUpdateDeviceSchema( LocalExecutionPlanner.getInstance().metadata, // Never timeout for write statement Long.MAX_VALUE, + false, false); if (executionResult.status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { throw new IoTDBRuntimeException( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializer.java index a6ac7a4224648..db030146a0425 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializer.java @@ -142,6 +142,7 @@ public CteDataStore fetchCteQueryResult( context.getCteQueries(), context.getExplainType(), context.getTimeOut(), + false, false); if (executionResult.status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { return null; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/PredicateWithUncorrelatedScalarSubqueryReconstructor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/PredicateWithUncorrelatedScalarSubqueryReconstructor.java index 56c4671fd7377..0d023b85ce142 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/PredicateWithUncorrelatedScalarSubqueryReconstructor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/PredicateWithUncorrelatedScalarSubqueryReconstructor.java @@ -153,7 +153,8 @@ public Optional fetchUncorrelatedSubqueryResultForPredicate( context.getCteQueries(), ExplainType.NONE, context.getTimeOut(), - false); + false, + q.isDebug()); // This may occur when the subquery cannot be executed in advance (for example, with // correlated scalar subqueries). diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Statement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Statement.java index 7ba19b972a29d..6548748f7c159 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Statement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Statement.java @@ -25,6 +25,7 @@ import java.util.List; public abstract class Statement extends Node { + private boolean debug; protected Statement(final @Nullable NodeLocation location) { super(location); @@ -56,4 +57,12 @@ public boolean shouldSplit() { public List getSubStatements() { return Collections.emptyList(); } + + public void setDebug(boolean debug) { + this.debug = debug; + } + + public boolean isDebug() { + return debug; + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java index 83105468a0204..f46b356423ddc 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java @@ -354,7 +354,9 @@ public class AstBuilder extends RelationalSqlBaseVisitor { @Override public Node visitSingleStatement(RelationalSqlParser.SingleStatementContext ctx) { - return visit(ctx.statement()); + Statement statement = (Statement) visit(ctx.statement()); + statement.setDebug(ctx.DEBUG() != null); + return statement; } @Override diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadTsFileLoader.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadTsFileLoader.java index 0e565afd70cd3..d0be2ead5cb22 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadTsFileLoader.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadTsFileLoader.java @@ -257,7 +257,8 @@ private TSStatus executeStatement(final Statement statement, final IClientSessio ClusterPartitionFetcher.getInstance(), ClusterSchemaFetcher.getInstance(), IOTDB_CONFIG.getQueryTimeoutThreshold(), - false) + false, + statement.isDebug()) .status; } finally { SESSION_MANAGER.removeCurrSession(); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/converter/LoadTsFileDataTypeConverter.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/converter/LoadTsFileDataTypeConverter.java index b45c05a3f3077..383ac4a306497 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/converter/LoadTsFileDataTypeConverter.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/converter/LoadTsFileDataTypeConverter.java @@ -178,6 +178,7 @@ private TSStatus executeForTreeModel(final Statement statement) { ClusterPartitionFetcher.getInstance(), ClusterSchemaFetcher.getInstance(), IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(), + false, false) .status; } finally { diff --git a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4 b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4 index 07186fd422219..2982e506ea99d 100644 --- a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4 +++ b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4 @@ -26,7 +26,7 @@ tokens { } singleStatement - : statement EOF + : DEBUG? statement EOF ; From f6d0748ff376b5330ad5334f37054b507350052f Mon Sep 17 00:00:00 2001 From: Weihao Li <18110526956@163.com> Date: Thu, 5 Feb 2026 17:57:58 +0800 Subject: [PATCH 2/6] BE and verify passed Signed-off-by: Weihao Li <18110526956@163.com> --- .../thrift/impl/ClientRPCServiceImpl.java | 4 +- .../FakedFragmentInstanceContext.java | 2 +- .../fragment/FragmentInstanceContext.java | 48 +++++++++++++------ .../fragment/FragmentInstanceManager.java | 8 +++- .../execution/fragment/QueryContext.java | 10 ++-- .../db/queryengine/plan/Coordinator.java | 2 +- .../schema/ClusterSchemaFetchExecutor.java | 2 +- .../SimpleFragmentParallelPlanner.java | 1 + .../WriteFragmentParallelPlanner.java | 3 +- .../plan/planner/plan/FragmentInstance.java | 32 ++++++++++--- .../fetcher/TableDeviceSchemaFetcher.java | 2 +- .../relational/planner/CteMaterializer.java | 2 +- .../TableModelQueryFragmentPlanner.java | 1 + .../scheduler/load/LoadTsFileScheduler.java | 6 ++- .../planner/FragmentInstanceSerdeTest.java | 6 ++- .../planner/CteMaterializerTest.java | 3 +- .../relational/planner/CteSubqueryTest.java | 3 +- .../memtable/MemChunkDeserializeTest.java | 4 +- .../memtable/PrimitiveMemTableTest.java | 19 ++++---- .../chunk/MemAlignedChunkLoaderTest.java | 2 +- .../read/reader/chunk/MemChunkLoaderTest.java | 12 ++--- .../recover/file/TsFilePlanRedoerTest.java | 21 ++++---- .../iotdb/db/utils/EnvironmentUtils.java | 4 +- .../relational/grammar/sql/RelationalSql.g4 | 3 +- 24 files changed, 131 insertions(+), 69 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java index 45eb4f027a7ac..ec7fa33e96fba 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java @@ -389,7 +389,7 @@ private TSExecuteStatementResp executeStatementInternal( schemaFetcher, req.getTimeout(), true, - false); + s.isDebug()); } } } else { @@ -437,7 +437,7 @@ private TSExecuteStatementResp executeStatementInternal( metadata, req.getTimeout(), true, - false); + s.isDebug()); } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FakedFragmentInstanceContext.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FakedFragmentInstanceContext.java index 26bfb723917ff..bdebbc9f28964 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FakedFragmentInstanceContext.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FakedFragmentInstanceContext.java @@ -35,7 +35,7 @@ public class FakedFragmentInstanceContext extends FragmentInstanceContext { public FakedFragmentInstanceContext(Filter timeFilter, DataRegion dataRegion) { - super(0, new FakedMemoryReservationManager(), timeFilter, dataRegion); + super(0, new FakedMemoryReservationManager(), timeFilter, dataRegion, false); } public QueryDataSource getSharedQueryDataSource(IFullPath sourcePath) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceContext.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceContext.java index 1a1b426006a11..bb16bf73c16f5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceContext.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceContext.java @@ -163,9 +163,12 @@ public class FragmentInstanceContext extends QueryContext { private long closedUnseqFileNum = 0; public static FragmentInstanceContext createFragmentInstanceContext( - FragmentInstanceId id, FragmentInstanceStateMachine stateMachine, SessionInfo sessionInfo) { + FragmentInstanceId id, + FragmentInstanceStateMachine stateMachine, + SessionInfo sessionInfo, + boolean debug) { FragmentInstanceContext instanceContext = - new FragmentInstanceContext(id, stateMachine, sessionInfo); + new FragmentInstanceContext(id, stateMachine, sessionInfo, debug); instanceContext.initialize(); instanceContext.start(); return instanceContext; @@ -177,9 +180,10 @@ public static FragmentInstanceContext createFragmentInstanceContext( FragmentInstanceStateMachine stateMachine, SessionInfo sessionInfo, IDataRegionForQuery dataRegion, - Filter timeFilter) { + Filter timeFilter, + boolean debug) { FragmentInstanceContext instanceContext = - new FragmentInstanceContext(id, stateMachine, sessionInfo, dataRegion, timeFilter); + new FragmentInstanceContext(id, stateMachine, sessionInfo, dataRegion, timeFilter, debug); instanceContext.initialize(); instanceContext.start(); return instanceContext; @@ -191,7 +195,8 @@ public static FragmentInstanceContext createFragmentInstanceContext( SessionInfo sessionInfo, IDataRegionForQuery dataRegion, TimePredicate globalTimePredicate, - Map dataNodeQueryContextMap) { + Map dataNodeQueryContextMap, + boolean debug) { FragmentInstanceContext instanceContext = new FragmentInstanceContext( id, @@ -199,14 +204,15 @@ public static FragmentInstanceContext createFragmentInstanceContext( sessionInfo, dataRegion, globalTimePredicate, - dataNodeQueryContextMap); + dataNodeQueryContextMap, + debug); instanceContext.initialize(); instanceContext.start(); return instanceContext; } public static FragmentInstanceContext createFragmentInstanceContextForCompaction(long queryId) { - return new FragmentInstanceContext(queryId, null, null, null); + return new FragmentInstanceContext(queryId, null, null, null, false); } public void setQueryDataSourceType(QueryDataSourceType queryDataSourceType) { @@ -220,7 +226,8 @@ public static FragmentInstanceContext createFragmentInstanceContext( new FragmentInstanceContext( id, stateMachine, - new SessionInfo(1, new UserEntity(666, "test", "127.0.0.1"), ZoneId.systemDefault())); + new SessionInfo(1, new UserEntity(666, "test", "127.0.0.1"), ZoneId.systemDefault()), + false); instanceContext.initialize(); instanceContext.start(); return instanceContext; @@ -236,7 +243,8 @@ public static FragmentInstanceContext createFragmentInstanceContext( id, stateMachine, new SessionInfo(1, new UserEntity(666, "test", "127.0.0.1"), ZoneId.systemDefault()), - memoryReservationManager); + memoryReservationManager, + false); instanceContext.initialize(); instanceContext.start(); return instanceContext; @@ -248,7 +256,9 @@ private FragmentInstanceContext( SessionInfo sessionInfo, IDataRegionForQuery dataRegion, TimePredicate globalTimePredicate, - Map dataNodeQueryContextMap) { + Map dataNodeQueryContextMap, + boolean debug) { + super(debug); this.id = id; this.stateMachine = stateMachine; this.executionEndTime.set(END_TIME_INITIAL_VALUE); @@ -266,7 +276,11 @@ private FragmentInstanceContext( } private FragmentInstanceContext( - FragmentInstanceId id, FragmentInstanceStateMachine stateMachine, SessionInfo sessionInfo) { + FragmentInstanceId id, + FragmentInstanceStateMachine stateMachine, + SessionInfo sessionInfo, + boolean debug) { + super(debug); this.id = id; this.stateMachine = stateMachine; this.executionEndTime.set(END_TIME_INITIAL_VALUE); @@ -281,7 +295,9 @@ private FragmentInstanceContext( FragmentInstanceId id, FragmentInstanceStateMachine stateMachine, SessionInfo sessionInfo, - MemoryReservationManager memoryReservationManager) { + MemoryReservationManager memoryReservationManager, + boolean debug) { + super(debug); this.id = id; this.stateMachine = stateMachine; this.executionEndTime.set(END_TIME_INITIAL_VALUE); @@ -296,7 +312,9 @@ private FragmentInstanceContext( FragmentInstanceStateMachine stateMachine, SessionInfo sessionInfo, IDataRegionForQuery dataRegion, - Filter globalTimeFilter) { + Filter globalTimeFilter, + boolean debug) { + super(debug); this.id = id; this.stateMachine = stateMachine; this.executionEndTime.set(END_TIME_INITIAL_VALUE); @@ -318,7 +336,9 @@ protected FragmentInstanceContext( long queryId, MemoryReservationManager memoryReservationManager, Filter timeFilter, - DataRegion dataRegion) { + DataRegion dataRegion, + boolean debug) { + super(debug); this.queryId = queryId; this.id = null; this.stateMachine = null; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceManager.java index 82ec29cc77c54..7b5fbe3757140 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceManager.java @@ -159,7 +159,8 @@ public FragmentInstanceInfo execDataQueryFragmentInstance( instance.getSessionInfo(), dataRegion, instance.getGlobalTimePredicate(), - dataNodeQueryContextMap)); + dataNodeQueryContextMap, + instance.isDebug())); try { List driverFactories = @@ -269,7 +270,10 @@ public FragmentInstanceInfo execSchemaQueryFragmentInstance( instanceId, fragmentInstanceId -> createFragmentInstanceContext( - fragmentInstanceId, stateMachine, instance.getSessionInfo())); + fragmentInstanceId, + stateMachine, + instance.getSessionInfo(), + instance.isDebug())); try { List driverFactories = diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/QueryContext.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/QueryContext.java index 2abb5ac517932..f165db769e99f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/QueryContext.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/QueryContext.java @@ -63,7 +63,7 @@ public class QueryContext { protected long queryId; - private boolean debug; + private final boolean debug; private long startTime; private long timeout; @@ -79,10 +79,12 @@ public class QueryContext { protected Set tables; - public QueryContext() {} + public QueryContext(boolean debug) { + this.debug = debug; + } - public QueryContext(long queryId) { - this(queryId, false, System.currentTimeMillis(), 0); + public QueryContext(long queryId, boolean debug) { + this(queryId, debug, System.currentTimeMillis(), 0); } /** Every time we generate the queryContext, register it to queryTimeManager. */ diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java index af5f208d3318a..ed251f91e7e61 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java @@ -355,7 +355,7 @@ public ExecutionResult executeForTreeModel( schemaFetcher, Long.MAX_VALUE, false, - false); + statement.isDebug()); } public ExecutionResult executeForTreeModel( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java index 5d6d36d460920..779503a5dc504 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java @@ -99,7 +99,7 @@ private ExecutionResult executionStatement( schemaFetcher, timeout, false, - false); + statement.isDebug()); } /** diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SimpleFragmentParallelPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SimpleFragmentParallelPlanner.java index 334d1973f5345..86fa1211911f1 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SimpleFragmentParallelPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/SimpleFragmentParallelPlanner.java @@ -144,6 +144,7 @@ private void produceFragmentInstance(PlanFragment fragment) { queryContext.getTimeOut() - (System.currentTimeMillis() - queryContext.getStartTime()), queryContext.getSession(), queryContext.isExplainAnalyze(), + queryContext.isDebug(), fragment.isRoot()); selectExecutorAndHost( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/WriteFragmentParallelPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/WriteFragmentParallelPlanner.java index 1e5c0567825c2..a5d4a33cac011 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/WriteFragmentParallelPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/distribution/WriteFragmentParallelPlanner.java @@ -81,7 +81,8 @@ public List parallelPlan() { queryContext.getQueryType(), // Never timeout for write Long.MAX_VALUE, - queryContext.getSession()); + queryContext.getSession(), + false); if (split.getRegionReplicaSet() != null) { final TRegionReplicaSet validSet = topology.getValidatedReplicaSet(split.getRegionReplicaSet()); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/FragmentInstance.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/FragmentInstance.java index 69d2a77fe3e0c..6bf584145cf81 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/FragmentInstance.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/FragmentInstance.java @@ -79,6 +79,8 @@ public class FragmentInstance implements IConsensusRequest { // We need to cache and calculate the statistics of this FragmentInstance if it is. private boolean isExplainAnalyze = false; + private final boolean debug; + // We can add some more params for a specific FragmentInstance // So that we can make different FragmentInstance owns different data range. @@ -88,7 +90,8 @@ public FragmentInstance( TimePredicate globalTimePredicate, QueryType type, long timeOut, - SessionInfo sessionInfo) { + SessionInfo sessionInfo, + boolean debug) { this.fragment = fragment; this.globalTimePredicate = globalTimePredicate; this.id = id; @@ -96,6 +99,7 @@ public FragmentInstance( this.timeOut = timeOut > 0 ? timeOut : CONFIG.getQueryTimeoutThreshold(); this.isRoot = false; this.sessionInfo = sessionInfo; + this.debug = debug; } public FragmentInstance( @@ -106,8 +110,9 @@ public FragmentInstance( long timeOut, SessionInfo sessionInfo, boolean isExplainAnalyze, + boolean debug, boolean isRoot) { - this(fragment, id, globalTimePredicate, type, timeOut, sessionInfo); + this(fragment, id, globalTimePredicate, type, timeOut, sessionInfo, debug); this.isRoot = isRoot; this.isExplainAnalyze = isExplainAnalyze; } @@ -119,8 +124,9 @@ public FragmentInstance( long timeOut, SessionInfo sessionInfo, boolean isExplainAnalyze, + boolean debug, boolean isRoot) { - this(fragment, id, null, type, timeOut, sessionInfo); + this(fragment, id, null, type, timeOut, sessionInfo, debug); this.isRoot = isRoot; this.isExplainAnalyze = isExplainAnalyze; } @@ -132,8 +138,9 @@ public FragmentInstance( QueryType type, long timeOut, SessionInfo sessionInfo, - int dataNodeFINum) { - this(fragment, id, globalTimePredicate, type, timeOut, sessionInfo); + int dataNodeFINum, + boolean debug) { + this(fragment, id, globalTimePredicate, type, timeOut, sessionInfo, debug); this.dataNodeFINum = dataNodeFINum; } @@ -200,6 +207,10 @@ public void setDataNodeFINum(int dataNodeFINum) { this.dataNodeFINum = dataNodeFINum; } + public boolean isDebug() { + return debug; + } + public String toString() { StringBuilder ret = new StringBuilder(); ret.append(String.format("FragmentInstance-%s:", getId())); @@ -229,9 +240,17 @@ public static FragmentInstance deserializeFrom(ByteBuffer buffer) { TimePredicate globalTimePredicate = hasTimePredicate ? TimePredicate.deserialize(buffer) : null; QueryType queryType = QueryType.values()[ReadWriteIOUtils.readInt(buffer)]; int dataNodeFINum = ReadWriteIOUtils.readInt(buffer); + boolean debug = ReadWriteIOUtils.readBool(buffer); FragmentInstance fragmentInstance = new FragmentInstance( - planFragment, id, globalTimePredicate, queryType, timeOut, sessionInfo, dataNodeFINum); + planFragment, + id, + globalTimePredicate, + queryType, + timeOut, + sessionInfo, + dataNodeFINum, + debug); boolean hasHostDataNode = ReadWriteIOUtils.readBool(buffer); fragmentInstance.hostDataNode = hasHostDataNode ? ThriftCommonsSerDeUtils.deserializeTDataNodeLocation(buffer) : null; @@ -255,6 +274,7 @@ public ByteBuffer serializeToByteBuffer() { } ReadWriteIOUtils.write(type.ordinal(), outputStream); ReadWriteIOUtils.write(dataNodeFINum, outputStream); + ReadWriteIOUtils.write(debug, outputStream); ReadWriteIOUtils.write(hostDataNode != null, outputStream); if (hostDataNode != null) { ThriftCommonsSerDeUtils.serializeTDataNodeLocation(hostDataNode, outputStream); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java index b9b59636b092d..b4761d3f29c8f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java @@ -504,7 +504,7 @@ private void fetchMissingDeviceSchemaForQuery( mppQueryContext.getTimeOut() - (System.currentTimeMillis() - mppQueryContext.getStartTime()), false, - false); + mppQueryContext.isDebug()); if (executionResult.status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { throw new IoTDBRuntimeException( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializer.java index db030146a0425..e83103a50e745 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializer.java @@ -143,7 +143,7 @@ public CteDataStore fetchCteQueryResult( context.getExplainType(), context.getTimeOut(), false, - false); + context.isDebug()); if (executionResult.status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { return null; } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableModelQueryFragmentPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableModelQueryFragmentPlanner.java index 40ed57a7fa25a..8a5ce92714031 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableModelQueryFragmentPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableModelQueryFragmentPlanner.java @@ -183,6 +183,7 @@ private void produceFragmentInstance( queryContext.getTimeOut() - (System.currentTimeMillis() - queryContext.getStartTime()), queryContext.getSession(), queryContext.isExplainAnalyze(), + queryContext.isDebug(), fragment.isRoot()); selectExecutorAndHost( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/load/LoadTsFileScheduler.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/load/LoadTsFileScheduler.java index cf7ab8faeddaf..98d683284119c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/load/LoadTsFileScheduler.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/load/LoadTsFileScheduler.java @@ -347,7 +347,8 @@ private boolean dispatchOnePieceNode( null, queryContext.getQueryType(), queryContext.getTimeOut() - (System.currentTimeMillis() - queryContext.getStartTime()), - queryContext.getSession()); + queryContext.getSession(), + queryContext.isDebug()); instance.setExecutorAndHost(new StorageExecutor(replicaSet)); Future dispatchResultFuture = dispatcher.dispatch(null, Collections.singletonList(instance)); @@ -500,7 +501,8 @@ private boolean loadLocally(LoadSingleTsFileNode node) throws IoTDBException { queryContext.getQueryType(), queryContext.getTimeOut() - (System.currentTimeMillis() - queryContext.getStartTime()), - queryContext.getSession()); + queryContext.getSession(), + queryContext.isDebug()); instance.setExecutorAndHost(new StorageExecutor(node.getLocalRegionReplicaSet())); dispatcher.dispatchLocally(instance); } catch (FragmentInstanceDispatchException e) { diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/FragmentInstanceSerdeTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/FragmentInstanceSerdeTest.java index 711e67682ca1f..3596ea550c774 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/FragmentInstanceSerdeTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/FragmentInstanceSerdeTest.java @@ -76,7 +76,8 @@ public void testSerializeAndDeserializeForTree1() throws IllegalPathException { new TreeModelTimePredicate(ExpressionFactory.groupByTime(1, 2, 3, 4)), QueryType.READ, config.getQueryTimeoutThreshold(), - sessionInfo); + sessionInfo, + false); // test FI with StorageExecutor TRegionReplicaSet regionReplicaSet = new TRegionReplicaSet( @@ -118,7 +119,8 @@ public void testSerializeAndDeserializeWithNullFilter() throws IllegalPathExcept null, QueryType.READ, config.getQueryTimeoutThreshold(), - sessionInfo); + sessionInfo, + false); TRegionReplicaSet regionReplicaSet = new TRegionReplicaSet( new TConsensusGroupId(TConsensusGroupType.DataRegion, 1), diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializerTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializerTest.java index 3394b1fbb58cc..d568583a1924a 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializerTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializerTest.java @@ -116,7 +116,8 @@ public static void prepareEnv() { Mockito.anyMap(), // Map, CteDataStore> Mockito.any(), // ExplainType Mockito.anyLong(), // timeOut - Mockito.anyBoolean())) // userQuery + Mockito.anyBoolean(), + false)) // userQuery .thenReturn(mockResult); } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteSubqueryTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteSubqueryTest.java index bff1d7c93dd02..1d91d6fda0677 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteSubqueryTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteSubqueryTest.java @@ -139,7 +139,8 @@ private void mockExecuteForTableModel() throws IoTDBException { Mockito.anyMap(), // Map, CteDataStore> Mockito.any(), // ExplainType Mockito.anyLong(), // timeOut - Mockito.anyBoolean())) // userQuery + Mockito.anyBoolean(), + false)) // userQuery .thenReturn(mockResult); // Create QueryExecution mock diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/MemChunkDeserializeTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/MemChunkDeserializeTest.java index d0edfdab33002..e043da9125134 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/MemChunkDeserializeTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/MemChunkDeserializeTest.java @@ -301,7 +301,7 @@ private ReadOnlyMemChunk getReadOnlyChunk(WritableMemChunk memChunk, TSDataType memTableMap.put(deviceID, memChunkGroup); IMemTable memTable = new PrimitiveMemTable(storageGroup, dataRegionId, memTableMap); - QueryContext context = new QueryContext(); + QueryContext context = new QueryContext(false); NonAlignedFullPath nonAlignedFullPath = new NonAlignedFullPath( deviceID, @@ -325,7 +325,7 @@ private ReadOnlyMemChunk getAlignedReadOnlyChunk( memTableMap.put(deviceID, memChunkGroup); IMemTable memTable = new PrimitiveMemTable(storageGroup, dataRegionId, memTableMap); - QueryContext context = new QueryContext(); + QueryContext context = new QueryContext(false); AlignedFullPath alignedFullPath = new AlignedFullPath(deviceID, measurementList, schemaList); return memTable.query(context, alignedFullPath, Long.MIN_VALUE, null, null); } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/PrimitiveMemTableTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/PrimitiveMemTableTest.java index b16e20d4f857b..7e77abca29e18 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/PrimitiveMemTableTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/PrimitiveMemTableTest.java @@ -142,7 +142,7 @@ public void memSeriesSortIteratorTest() throws IOException, QueryProcessExceptio tvListQueryMap.put(series.getWorkingTVList(), series.getWorkingTVList().rowCount()); ReadOnlyMemChunk readableChunk = new ReadOnlyMemChunk( - new QueryContext(), "s1", dataType, TSEncoding.PLAIN, tvListQueryMap, null, null); + new QueryContext(false), "s1", dataType, TSEncoding.PLAIN, tvListQueryMap, null, null); IPointReader it = readableChunk.getPointReader(); int i = 0; while (it.hasNextTimeValuePair()) { @@ -190,7 +190,7 @@ public void testWriteDuringPrepareTVListAndActualQueryExecution() measurementSchemas)); ReadOnlyMemChunk readOnlyMemChunk = resourcesByPathUtils.getReadOnlyMemChunkFromMemTable( - new QueryContext(1), memTable, null, Long.MAX_VALUE, null); + new QueryContext(1, false), memTable, null, Long.MAX_VALUE, null); for (int i = 1; i <= 50; i++) { memTable.writeAlignedRow( @@ -259,7 +259,7 @@ public void simpleTest() throws IOException, QueryProcessException, MetadataExce } ReadOnlyMemChunk memChunk = - memTable.query(new QueryContext(), nonAlignedFullPath, Long.MIN_VALUE, null, null); + memTable.query(new QueryContext(false), nonAlignedFullPath, Long.MIN_VALUE, null, null); IPointReader iterator = memChunk.getPointReader(); for (int i = 0; i < dataSize; i++) { iterator.hasNextTimeValuePair(); @@ -355,7 +355,7 @@ public void queryWithDeletionTest() throws IOException, QueryProcessException, M modsToMemtable.add(new Pair<>(deletion, memTable)); ReadOnlyMemChunk memChunk = memTable.query( - new QueryContext(), nonAlignedFullPath, Long.MIN_VALUE, modsToMemtable, null); + new QueryContext(false), nonAlignedFullPath, Long.MIN_VALUE, modsToMemtable, null); IPointReader iterator = memChunk.getPointReader(); int cnt = 0; while (iterator.hasNextTimeValuePair()) { @@ -400,7 +400,8 @@ public void queryAlignChuckWithDeletionTest() new TreeDeletionEntry(new MeasurementPath(deviceID, measurementId[0]), 10, dataSize); modsToMemtable.add(new Pair<>(deletion, memTable)); ReadOnlyMemChunk memChunk = - memTable.query(new QueryContext(), alignedFullPath, Long.MIN_VALUE, modsToMemtable, null); + memTable.query( + new QueryContext(false), alignedFullPath, Long.MIN_VALUE, modsToMemtable, null); IPointReader iterator = memChunk.getPointReader(); int cnt = 0; while (iterator.hasNextTimeValuePair()) { @@ -439,7 +440,9 @@ private void write( CompressionType.UNCOMPRESSED, Collections.emptyMap())); IPointReader tvPair = - memTable.query(new QueryContext(), fullPath, Long.MIN_VALUE, null, null).getPointReader(); + memTable + .query(new QueryContext(false), fullPath, Long.MIN_VALUE, null, null) + .getPointReader(); Arrays.sort(ret); TimeValuePair last = null; for (int i = 0; i < ret.length; i++) { @@ -488,7 +491,7 @@ private void writeVector(IMemTable memTable) Collections.emptyMap()))); IPointReader tvPair = memTable - .query(new QueryContext(), tmpAlignedFullPath, Long.MIN_VALUE, null, null) + .query(new QueryContext(false), tmpAlignedFullPath, Long.MIN_VALUE, null, null) .getPointReader(); for (int i = 0; i < 100; i++) { tvPair.hasNextTimeValuePair(); @@ -517,7 +520,7 @@ private void writeVector(IMemTable memTable) tvPair = memTable - .query(new QueryContext(), tmpAlignedFullPath, Long.MIN_VALUE, null, null) + .query(new QueryContext(false), tmpAlignedFullPath, Long.MIN_VALUE, null, null) .getPointReader(); for (int i = 0; i < 100; i++) { tvPair.hasNextTimeValuePair(); diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoaderTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoaderTest.java index e8d16912896dc..72406a2e4a74b 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoaderTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemAlignedChunkLoaderTest.java @@ -63,7 +63,7 @@ public class MemAlignedChunkLoaderTest { public void testMemAlignedChunkLoader() throws IOException { AlignedReadOnlyMemChunk chunk = Mockito.mock(AlignedReadOnlyMemChunk.class); ChunkMetadata chunkMetadata = Mockito.mock(ChunkMetadata.class); - QueryContext ctx = new QueryContext(); + QueryContext ctx = new QueryContext(false); MemAlignedChunkLoader memAlignedChunkLoader = new MemAlignedChunkLoader(ctx, chunk); try { diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemChunkLoaderTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemChunkLoaderTest.java index 1a3ccc21bcc77..986b88ec11269 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemChunkLoaderTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/read/reader/chunk/MemChunkLoaderTest.java @@ -75,7 +75,7 @@ public void testBooleanMemChunkLoader() throws IOException { Mockito.when(chunk.getMemPointIterator()).thenReturn(timeValuePairIterator); ChunkMetadata chunkMetadata = Mockito.mock(ChunkMetadata.class); - MemChunkLoader memChunkLoader = new MemChunkLoader(new QueryContext(), chunk); + MemChunkLoader memChunkLoader = new MemChunkLoader(new QueryContext(false), chunk); try { memChunkLoader.loadChunk(chunkMetadata); fail(); @@ -155,7 +155,7 @@ public void testInt32MemChunkLoader() throws IOException { Mockito.when(chunk.getMemPointIterator()).thenReturn(timeValuePairIterator); ChunkMetadata chunkMetadata = Mockito.mock(ChunkMetadata.class); - MemChunkLoader memChunkLoader = new MemChunkLoader(new QueryContext(), chunk); + MemChunkLoader memChunkLoader = new MemChunkLoader(new QueryContext(false), chunk); try { memChunkLoader.loadChunk(chunkMetadata); fail(); @@ -235,7 +235,7 @@ public void testInt64MemChunkLoader() throws IOException { Mockito.when(chunk.getMemPointIterator()).thenReturn(timeValuePairIterator); ChunkMetadata chunkMetadata = Mockito.mock(ChunkMetadata.class); - MemChunkLoader memChunkLoader = new MemChunkLoader(new QueryContext(), chunk); + MemChunkLoader memChunkLoader = new MemChunkLoader(new QueryContext(false), chunk); try { memChunkLoader.loadChunk(chunkMetadata); fail(); @@ -315,7 +315,7 @@ public void testFloatMemChunkLoader() throws IOException { Mockito.when(chunk.getMemPointIterator()).thenReturn(timeValuePairIterator); ChunkMetadata chunkMetadata = Mockito.mock(ChunkMetadata.class); - MemChunkLoader memChunkLoader = new MemChunkLoader(new QueryContext(), chunk); + MemChunkLoader memChunkLoader = new MemChunkLoader(new QueryContext(false), chunk); try { memChunkLoader.loadChunk(chunkMetadata); fail(); @@ -395,7 +395,7 @@ public void testDoubleMemChunkLoader() throws IOException { Mockito.when(chunk.getMemPointIterator()).thenReturn(timeValuePairIterator); ChunkMetadata chunkMetadata = Mockito.mock(ChunkMetadata.class); - MemChunkLoader memChunkLoader = new MemChunkLoader(new QueryContext(), chunk); + MemChunkLoader memChunkLoader = new MemChunkLoader(new QueryContext(false), chunk); try { memChunkLoader.loadChunk(chunkMetadata); fail(); @@ -475,7 +475,7 @@ public void testTextMemChunkLoader() throws IOException { Mockito.when(chunk.getMemPointIterator()).thenReturn(timeValuePairIterator); ChunkMetadata chunkMetadata = Mockito.mock(ChunkMetadata.class); - MemChunkLoader memChunkLoader = new MemChunkLoader(new QueryContext(), chunk); + MemChunkLoader memChunkLoader = new MemChunkLoader(new QueryContext(false), chunk); try { memChunkLoader.loadChunk(chunkMetadata); fail(); diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/TsFilePlanRedoerTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/TsFilePlanRedoerTest.java index 6c02cc4ba1885..a86f814041afd 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/TsFilePlanRedoerTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/TsFilePlanRedoerTest.java @@ -162,7 +162,7 @@ public void testRedoInsertRowPlan() throws Exception { new NonAlignedFullPath( DEVICE2_NAME, new MeasurementSchema("s1", TSDataType.FLOAT, TSEncoding.RLE)); ReadOnlyMemChunk memChunk = - recoveryMemTable.query(new QueryContext(), fullPath, Long.MIN_VALUE, null, null); + recoveryMemTable.query(new QueryContext(false), fullPath, Long.MIN_VALUE, null, null); IPointReader iterator = memChunk.getPointReader(); time = 5; while (iterator.hasNextTimeValuePair()) { @@ -176,7 +176,8 @@ public void testRedoInsertRowPlan() throws Exception { fullPath = new NonAlignedFullPath( DEVICE2_NAME, new MeasurementSchema("s2", TSDataType.DOUBLE, TSEncoding.RLE)); - memChunk = recoveryMemTable.query(new QueryContext(), fullPath, Long.MIN_VALUE, null, null); + memChunk = + recoveryMemTable.query(new QueryContext(false), fullPath, Long.MIN_VALUE, null, null); iterator = memChunk.getPointReader(); time = 5; while (iterator.hasNextTimeValuePair()) { @@ -262,7 +263,7 @@ public void testRedoInsertAlignedRowPlan() throws Exception { new MeasurementSchema("s4", TSDataType.FLOAT, TSEncoding.RLE), new MeasurementSchema("s5", TSDataType.TEXT, TSEncoding.PLAIN))); ReadOnlyMemChunk memChunk = - recoveryMemTable.query(new QueryContext(), fullPath, Long.MIN_VALUE, null, null); + recoveryMemTable.query(new QueryContext(false), fullPath, Long.MIN_VALUE, null, null); IPointReader iterator = memChunk.getPointReader(); int time = 6; while (iterator.hasNextTimeValuePair()) { @@ -342,7 +343,7 @@ public void testRedoInsertTabletPlan() throws Exception { new NonAlignedFullPath( DEVICE1_NAME, new MeasurementSchema("s1", TSDataType.INT32, TSEncoding.RLE)); ReadOnlyMemChunk memChunk = - recoveryMemTable.query(new QueryContext(), fullPath, Long.MIN_VALUE, null, null); + recoveryMemTable.query(new QueryContext(false), fullPath, Long.MIN_VALUE, null, null); IPointReader iterator = memChunk.getPointReader(); int time = 5; while (iterator.hasNextTimeValuePair()) { @@ -356,7 +357,8 @@ public void testRedoInsertTabletPlan() throws Exception { fullPath = new NonAlignedFullPath( DEVICE1_NAME, new MeasurementSchema("s2", TSDataType.INT64, TSEncoding.RLE)); - memChunk = recoveryMemTable.query(new QueryContext(), fullPath, Long.MIN_VALUE, null, null); + memChunk = + recoveryMemTable.query(new QueryContext(false), fullPath, Long.MIN_VALUE, null, null); iterator = memChunk.getPointReader(); time = 5; while (iterator.hasNextTimeValuePair()) { @@ -455,7 +457,7 @@ public void testRedoInsertAlignedTabletPlan() throws Exception { new MeasurementSchema("s4", TSDataType.FLOAT, TSEncoding.RLE), new MeasurementSchema("s5", TSDataType.TEXT, TSEncoding.PLAIN))); ReadOnlyMemChunk memChunk = - recoveryMemTable.query(new QueryContext(), fullPath, Long.MIN_VALUE, null, null); + recoveryMemTable.query(new QueryContext(false), fullPath, Long.MIN_VALUE, null, null); IPointReader iterator = memChunk.getPointReader(); int time = 6; while (iterator.hasNextTimeValuePair()) { @@ -577,13 +579,14 @@ public void testRedoOverLapPlanIntoUnseqFile() throws Exception { new NonAlignedFullPath( DEVICE1_NAME, new MeasurementSchema("s1", TSDataType.INT32, TSEncoding.RLE)); ReadOnlyMemChunk memChunk = - recoveryMemTable.query(new QueryContext(), fullPath, Long.MIN_VALUE, null, null); + recoveryMemTable.query(new QueryContext(false), fullPath, Long.MIN_VALUE, null, null); assertTrue(memChunk == null || memChunk.isEmpty()); // check d1.s2 fullPath = new NonAlignedFullPath( DEVICE1_NAME, new MeasurementSchema("s2", TSDataType.INT64, TSEncoding.RLE)); - memChunk = recoveryMemTable.query(new QueryContext(), fullPath, Long.MIN_VALUE, null, null); + memChunk = + recoveryMemTable.query(new QueryContext(false), fullPath, Long.MIN_VALUE, null, null); assertTrue(memChunk == null || memChunk.isEmpty()); } @@ -788,7 +791,7 @@ public void testRedoAlignedInsertAfterDeleteTimeseries() throws Exception { new MeasurementSchema("s4", TSDataType.FLOAT, TSEncoding.RLE), new MeasurementSchema("s5", TSDataType.TEXT, TSEncoding.PLAIN))); ReadOnlyMemChunk memChunk = - recoveryMemTable.query(new QueryContext(), fullPath, Long.MIN_VALUE, null, null); + recoveryMemTable.query(new QueryContext(false), fullPath, Long.MIN_VALUE, null, null); IPointReader iterator = memChunk.getPointReader(); time = 6; while (iterator.hasNextTimeValuePair()) { diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java index ebd4d3b7ae036..91149d027fb9d 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java @@ -84,7 +84,7 @@ public class EnvironmentUtils { private static final TierManager tierManager = TierManager.getInstance(); public static long TEST_QUERY_JOB_ID = 1; - public static QueryContext TEST_QUERY_CONTEXT = new QueryContext(TEST_QUERY_JOB_ID); + public static QueryContext TEST_QUERY_CONTEXT = new QueryContext(TEST_QUERY_JOB_ID, false); public static FragmentInstanceContext TEST_QUERY_FI_CONTEXT = FragmentInstanceContext.createFragmentInstanceContextForCompaction(TEST_QUERY_JOB_ID); @@ -278,7 +278,7 @@ public static void envSetUp() { } TEST_QUERY_JOB_ID = QueryResourceManager.getInstance().assignQueryId(); - TEST_QUERY_CONTEXT = new QueryContext(TEST_QUERY_JOB_ID); + TEST_QUERY_CONTEXT = new QueryContext(TEST_QUERY_JOB_ID, false); } private static void createAllDir() { diff --git a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4 b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4 index 2982e506ea99d..08a8b4c2e82a1 100644 --- a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4 +++ b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4 @@ -1454,7 +1454,7 @@ nonReserved : ABSENT | ADD | ADMIN | AFTER | ALL | ANALYZE | ANY | ARRAY | ASC | AT | ATTRIBUTE | AUDIT | AUTHORIZATION | AVAILABLE | BEGIN | BERNOULLI | BOTH | CACHE | CALL | CALLED | CASCADE | CATALOG | CATALOGS | CHAR | CHARACTER | CHARSET | CLEAR | CLUSTER | CLUSTERID | COLUMN | COLUMNS | COMMENT | COMMIT | COMMITTED | CONDITION | CONDITIONAL | CONFIGNODES | CONFIGNODE | CONFIGURATION | CONNECTOR | CONSTANT | COPARTITION | COUNT | CURRENT - | DATA | DATABASE | DATABASES | DATANODE | DATANODES | DATASET | DATE | DAY | DECLARE | DEFAULT | DEFINE | DEFINER | DENY | DESC | DESCRIPTOR | DETAILS| DETERMINISTIC | DEVICES | DISTRIBUTED | DO | DOUBLE + | DATA | DATABASE | DATABASES | DATANODE | DATANODES | DATASET | DATE | DAY | DEBUG | DECLARE | DEFAULT | DEFINE | DEFINER | DENY | DESC | DESCRIPTOR | DETAILS| DETERMINISTIC | DEVICES | DISTRIBUTED | DO | DOUBLE | ELSEIF | EMPTY | ENCODING | ERROR | EXCLUDING | EXPLAIN | EXTRACTOR | FETCH | FIELD | FILTER | FINAL | FIRST | FLUSH | FOLLOWING | FORCEDLY | FORMAT | FUNCTION | FUNCTIONS | GRACE | GRANT | GRANTED | GRANTS | GRAPHVIZ | GROUPS @@ -1561,6 +1561,7 @@ DATE_BIN: 'DATE_BIN'; DATE_BIN_GAPFILL: 'DATE_BIN_GAPFILL'; DAY: 'DAY' | 'D'; DEALLOCATE: 'DEALLOCATE'; +DEBUG: 'DEBUG'; DECLARE: 'DECLARE'; DEFAULT: 'DEFAULT'; DEFINE: 'DEFINE'; From 4640774700e40b41d704ce72cb216b83cd8c7563 Mon Sep 17 00:00:00 2001 From: Weihao Li <18110526956@163.com> Date: Fri, 6 Feb 2026 12:44:24 +0800 Subject: [PATCH 3/6] perfect it Signed-off-by: Weihao Li <18110526956@163.com> --- .../env/cluster/node/AbstractNodeWrapper.java | 15 +++ .../it/query/recent/IoTDBDebugQueryIT.java | 104 ++++++++++++++++++ .../db/queryengine/plan/Coordinator.java | 53 +++++++++ 3 files changed, 172 insertions(+) create mode 100644 integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBDebugQueryIT.java diff --git a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AbstractNodeWrapper.java b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AbstractNodeWrapper.java index cbcf4ca3fd59e..14ef8b36ef7a6 100644 --- a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AbstractNodeWrapper.java +++ b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AbstractNodeWrapper.java @@ -57,6 +57,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; @@ -834,4 +835,18 @@ public Process getInstance() { public int[] getPortList() { return portList; } + + public void clearLogContent() throws IOException { + Files.newOutputStream(Paths.get(getLogPath()), StandardOpenOption.TRUNCATE_EXISTING).close(); + } + + public boolean logContains(String content) throws IOException { + List lines = Files.readAllLines(Paths.get(getLogPath()), StandardCharsets.UTF_8); + for (String line : lines) { + if (line.contains(content)) { + return true; + } + } + return false; + } } diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBDebugQueryIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBDebugQueryIT.java new file mode 100644 index 0000000000000..35993fa6a08ae --- /dev/null +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBDebugQueryIT.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.relational.it.query.recent; + +import org.apache.iotdb.it.env.EnvFactory; +import org.apache.iotdb.it.env.cluster.node.DataNodeWrapper; +import org.apache.iotdb.it.framework.IoTDBTestRunner; +import org.apache.iotdb.itbase.category.TableLocalStandaloneIT; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; + +import java.io.IOException; + +import static org.apache.iotdb.db.it.utils.TestUtils.prepareData; +import static org.apache.iotdb.db.it.utils.TestUtils.prepareTableData; +import static org.apache.iotdb.db.it.utils.TestUtils.resultSetEqualTest; +import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest; + +@RunWith(IoTDBTestRunner.class) +@Category({TableLocalStandaloneIT.class}) +public class IoTDBDebugQueryIT { + private static final String DATABASE_NAME = "test_db"; + private static final String[] createTableSqls = + new String[] { + "CREATE DATABASE " + DATABASE_NAME, + "USE " + DATABASE_NAME, + "create table table1(device string tag, value int32 field)", + "insert into table1(time,device,value) values(2020-01-01 00:00:01.000,'d1',1)", + "FLUSH", + }; + private static final String[] createTreeSqls = + new String[] { + "create timeseries root.test.departments.department_id TEXT", + "create timeseries root.test.departments.dep_name TEXT", + "insert into root.test.departments(time, department_id, dep_name) values(1, 'D001', '研发部')", + "FLUSH", + }; + private static DataNodeWrapper dataNodeWrapper; + + @BeforeClass + public static void setUp() throws Exception { + EnvFactory.getEnv().initClusterEnvironment(); + dataNodeWrapper = EnvFactory.getEnv().getDataNodeWrapperList().get(0); + prepareTableData(createTableSqls); + prepareData(createTreeSqls); + } + + @AfterClass + public static void tearDown() throws Exception { + EnvFactory.getEnv().cleanClusterEnvironment(); + } + + @Test + public void treeTest() throws IOException { + // clear log content to reduce lines spanned in logContains check + dataNodeWrapper.clearLogContent(); + + String[] expectedHeader = new String[] {"time", "device", "value"}; + String[] retArray = new String[] {"2020-01-01T00:00:01.000Z,d1,1,"}; + tableResultSetEqualTest( + "debug select time,device,value from table1", expectedHeader, retArray, DATABASE_NAME); + + dataNodeWrapper.logContains("Cache miss: table1.d1"); + } + + @Test + public void tableTest() throws IOException { + // clear log content to reduce lines spanned in logContains check + dataNodeWrapper.clearLogContent(); + + String[] expectedHeader = + new String[] { + "Time", "root.test.departments.department_id", "root.test.departments.dep_name" + }; + String[] retArray = new String[] {"1,D001,研发部,"}; + resultSetEqualTest( + "debug select department_id, dep_name from root.test.departments", + expectedHeader, + retArray); + + dataNodeWrapper.logContains("Cache miss: root.test.departments"); + } +} diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java index ed251f91e7e61..d8ed2a320ac8b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java @@ -306,6 +306,9 @@ private ExecutionResult execution( if (LOGGER.isDebugEnabled() && sql != null && !sql.isEmpty()) { LOGGER.debug("[QueryStart] sql: {}", sql); } + if (userQuery) { + System.out.println("--------------" + debug); + } queryContext = new MPPQueryContext( sql, @@ -488,6 +491,8 @@ public ExecutionResult executeForTableModel( startTime))); } + /** For compatibility of MQTT and REST, this method should never be called. */ + @Deprecated public ExecutionResult executeForTableModel( Statement statement, SqlParser sqlParser, @@ -514,6 +519,54 @@ public ExecutionResult executeForTableModel( startTime))); } + /** For compatibility of MQTT and REST, this method should never be called. */ + @Deprecated + public ExecutionResult executeForTreeModel( + Statement statement, + long queryId, + SessionInfo sessionInfo, + String s, + IPartitionFetcher partitionFetcher, + ISchemaFetcher schemaFetcher, + long queryTimeoutThreshold, + boolean isUserQuery) { + return executeForTreeModel( + statement, + queryId, + sessionInfo, + s, + partitionFetcher, + schemaFetcher, + queryTimeoutThreshold, + isUserQuery, + false); + } + + /** For compatibility of MQTT and REST, this method should never be called. */ + @Deprecated + public ExecutionResult executeForTableModel( + org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement statement, + SqlParser sqlParser, + IClientSession currSession, + Long queryId, + SessionInfo sessionInfo, + String sql, + Metadata metadata, + long queryTimeoutThreshold, + boolean isUserQuery) { + return executeForTableModel( + statement, + sqlParser, + currSession, + queryId, + sessionInfo, + sql, + metadata, + queryTimeoutThreshold, + isUserQuery, + false); + } + private IQueryExecution createQueryExecutionForTableModel( Statement statement, SqlParser sqlParser, From 4bd8967c94bdf4030b750b2d3cf201b66e92c2be Mon Sep 17 00:00:00 2001 From: Weihao Li <18110526956@163.com> Date: Fri, 6 Feb 2026 14:47:31 +0800 Subject: [PATCH 4/6] perfect some Signed-off-by: Weihao Li <18110526956@163.com> --- .../it/query/recent/IoTDBDebugQueryIT.java | 5 +- .../thrift/impl/ClientRPCServiceImpl.java | 279 ++++++++++++++++-- .../planner/CteMaterializerTest.java | 4 +- .../relational/planner/CteSubqueryTest.java | 4 +- 4 files changed, 268 insertions(+), 24 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBDebugQueryIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBDebugQueryIT.java index 35993fa6a08ae..096be8091e39a 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBDebugQueryIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBDebugQueryIT.java @@ -36,6 +36,7 @@ import static org.apache.iotdb.db.it.utils.TestUtils.prepareTableData; import static org.apache.iotdb.db.it.utils.TestUtils.resultSetEqualTest; import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest; +import static org.junit.Assert.assertTrue; @RunWith(IoTDBTestRunner.class) @Category({TableLocalStandaloneIT.class}) @@ -81,7 +82,7 @@ public void treeTest() throws IOException { tableResultSetEqualTest( "debug select time,device,value from table1", expectedHeader, retArray, DATABASE_NAME); - dataNodeWrapper.logContains("Cache miss: table1.d1"); + assertTrue(dataNodeWrapper.logContains("Cache miss: table1.d1")); } @Test @@ -99,6 +100,6 @@ public void tableTest() throws IOException { expectedHeader, retArray); - dataNodeWrapper.logContains("Cache miss: root.test.departments"); + assertTrue(dataNodeWrapper.logContains("Cache miss: root.test.departments")); } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java index ec7fa33e96fba..9f6efb3fbfcdf 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java @@ -75,6 +75,7 @@ import org.apache.iotdb.db.queryengine.plan.analyze.schema.ISchemaFetcher; import org.apache.iotdb.db.queryengine.plan.execution.ExecutionResult; import org.apache.iotdb.db.queryengine.plan.execution.IQueryExecution; +import org.apache.iotdb.db.queryengine.plan.execution.config.session.PreparedStatementHelper; import org.apache.iotdb.db.queryengine.plan.parser.ASTVisitor; import org.apache.iotdb.db.queryengine.plan.parser.StatementGenerator; import org.apache.iotdb.db.queryengine.plan.planner.LocalExecutionPlanner; @@ -89,7 +90,17 @@ import org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.TableId; import org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.TreeDeviceSchemaCacheManager; import org.apache.iotdb.db.queryengine.plan.relational.security.TreeAccessCheckContext; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ParameterExtractor; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BinaryLiteral; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BooleanLiteral; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DoubleLiteral; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Execute; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Identifier; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Literal; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LongLiteral; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.NullLiteral; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SetSqlDialect; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.StringLiteral; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Use; import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.ParsingException; import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.SqlParser; @@ -129,6 +140,8 @@ import org.apache.iotdb.db.utils.SetThreadName; import org.apache.iotdb.rpc.RpcUtils; import org.apache.iotdb.rpc.TSStatusCode; +import org.apache.iotdb.rpc.stmt.PreparedParameterSerde; +import org.apache.iotdb.rpc.stmt.PreparedParameterSerde.DeserializedParam; import org.apache.iotdb.service.rpc.thrift.ServerProperties; import org.apache.iotdb.service.rpc.thrift.TCreateTimeseriesUsingSchemaTemplateReq; import org.apache.iotdb.service.rpc.thrift.TPipeSubscribeReq; @@ -146,9 +159,11 @@ import org.apache.iotdb.service.rpc.thrift.TSCreateMultiTimeseriesReq; import org.apache.iotdb.service.rpc.thrift.TSCreateSchemaTemplateReq; import org.apache.iotdb.service.rpc.thrift.TSCreateTimeseriesReq; +import org.apache.iotdb.service.rpc.thrift.TSDeallocatePreparedReq; import org.apache.iotdb.service.rpc.thrift.TSDeleteDataReq; import org.apache.iotdb.service.rpc.thrift.TSDropSchemaTemplateReq; import org.apache.iotdb.service.rpc.thrift.TSExecuteBatchStatementReq; +import org.apache.iotdb.service.rpc.thrift.TSExecutePreparedReq; import org.apache.iotdb.service.rpc.thrift.TSExecuteStatementReq; import org.apache.iotdb.service.rpc.thrift.TSExecuteStatementResp; import org.apache.iotdb.service.rpc.thrift.TSFastLastDataQueryForOneDeviceReq; @@ -169,6 +184,8 @@ import org.apache.iotdb.service.rpc.thrift.TSLastDataQueryReq; import org.apache.iotdb.service.rpc.thrift.TSOpenSessionReq; import org.apache.iotdb.service.rpc.thrift.TSOpenSessionResp; +import org.apache.iotdb.service.rpc.thrift.TSPrepareReq; +import org.apache.iotdb.service.rpc.thrift.TSPrepareResp; import org.apache.iotdb.service.rpc.thrift.TSProtocolVersion; import org.apache.iotdb.service.rpc.thrift.TSPruneSchemaTemplateReq; import org.apache.iotdb.service.rpc.thrift.TSQueryDataSet; @@ -216,6 +233,7 @@ import java.util.Objects; import java.util.Optional; import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; import static org.apache.iotdb.commons.partition.DataPartition.NOT_ASSIGNED; import static org.apache.iotdb.db.queryengine.common.DataNodeEndPoints.isSameNode; @@ -298,18 +316,19 @@ public ClientRPCServiceImpl() { } private TSExecuteStatementResp executeStatementInternal( - TSExecuteStatementReq req, SelectResult setResult) { + NativeStatementRequest request, SelectResult setResult) { + IClientSession clientSession = SESSION_MANAGER.getCurrSessionAndUpdateIdleTime(); + if (!SESSION_MANAGER.checkLogin(clientSession)) { + return RpcUtils.getTSExecuteStatementResp(getNotLoggedInStatus()); + } + boolean finished = false; - Long statementId = req.getStatementId(); + Long statementId = request.getStatementId(); long queryId = Long.MIN_VALUE; - String statement = req.getStatement(); - IClientSession clientSession = SESSION_MANAGER.getCurrSessionAndUpdateIdleTime(); + String statement = request.getSql(); // quota OperationQuota quota = null; - if (!SESSION_MANAGER.checkLogin(clientSession)) { - return RpcUtils.getTSExecuteStatementResp(getNotLoggedInStatus()); - } long startTime = System.nanoTime(); StatementType statementType = null; @@ -321,7 +340,7 @@ private TSExecuteStatementResp executeStatementInternal( // create and cache dataset ExecutionResult result; if (clientSession.getSqlDialect() == IClientSession.SqlDialect.TREE) { - Statement s = StatementGenerator.createStatement(statement, clientSession.getZoneId()); + Statement s = request.getTreeStatement(clientSession.getZoneId()); if (s instanceof SetSqlDialectStatement) { setSqlDialect = true; } @@ -364,7 +383,7 @@ private TSExecuteStatementResp executeStatementInternal( .checkQuota(SESSION_MANAGER.getCurrSession().getUsername(), s); statementType = s.getType(); - queryId = SESSION_MANAGER.requestQueryId(clientSession, req.statementId); + queryId = SESSION_MANAGER.requestQueryId(clientSession, statementId); // Split statement if needed to limit resource consumption during statement analysis if (s.shouldSplit()) { @@ -387,14 +406,14 @@ private TSExecuteStatementResp executeStatementInternal( statement, partitionFetcher, schemaFetcher, - req.getTimeout(), + request.getTimeout(), true, s.isDebug()); } } } else { org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement s = - relationSqlParser.createStatement(statement, clientSession.getZoneId(), clientSession); + request.getTableStatement(relationSqlParser, clientSession.getZoneId(), clientSession); if (s instanceof Use) { useDatabase = true; @@ -410,7 +429,7 @@ private TSExecuteStatementResp executeStatementInternal( TSStatusCode.SQL_PARSE_ERROR, "This operation type is not supported")); } - queryId = SESSION_MANAGER.requestQueryId(clientSession, req.statementId); + queryId = SESSION_MANAGER.requestQueryId(clientSession, statementId); // Split statement if needed to limit resource consumption during statement analysis if (s.shouldSplit()) { @@ -435,7 +454,7 @@ private TSExecuteStatementResp executeStatementInternal( SESSION_MANAGER.getSessionInfo(clientSession), statement, metadata, - req.getTimeout(), + request.getTimeout(), true, s.isDebug()); } @@ -460,7 +479,7 @@ private TSExecuteStatementResp executeStatementInternal( statementType = statementType == null ? StatementType.QUERY : statementType; resp = createResponse(queryExecution.getDatasetHeader(), queryId); resp.setStatus(result.status); - finished = setResult.apply(resp, queryExecution, req.fetchSize); + finished = setResult.apply(resp, queryExecution, request.getFetchSize()); resp.setMoreData(!finished); if (quota != null) { quota.addReadResult(resp.getQueryResult()); @@ -524,7 +543,7 @@ private TSExecuteStatementResp executeStatementInternal( long executionTime = COORDINATOR.getTotalExecutionTime(queryId); CommonUtils.addQueryLatency( statementType, executionTime > 0 ? executionTime : currentOperationCost); - clearUp(clientSession, statementId, queryId, req, t); + clearUp(clientSession, statementId, queryId, request, t); } SESSION_MANAGER.updateIdleTime(); if (quota != null) { @@ -533,6 +552,16 @@ private TSExecuteStatementResp executeStatementInternal( } } + private void clearUp( + IClientSession clientSession, + Long statementId, + Long queryId, + Supplier contentSupplier, + Throwable t) { + COORDINATOR.cleanupQueryExecution(queryId, contentSupplier, t); + clientSession.removeQueryId(statementId, queryId); + } + private void clearUp( IClientSession clientSession, Long statementId, @@ -540,10 +569,155 @@ private void clearUp( org.apache.thrift.TBase req, Throwable t) { COORDINATOR.cleanupQueryExecution(queryId, req, t); - // clear up queryId Map in clientSession clientSession.removeQueryId(statementId, queryId); } + /** Adapter that wraps TSExecuteStatementReq to implement NativeStatementRequest. */ + private static class TSExecuteStatementReqAdapter implements NativeStatementRequest { + private final TSExecuteStatementReq req; + + TSExecuteStatementReqAdapter(TSExecuteStatementReq req) { + this.req = req; + } + + @Override + public Long getStatementId() { + return req.getStatementId(); + } + + @Override + public long getTimeout() { + return req.getTimeout(); + } + + @Override + public int getFetchSize() { + return req.getFetchSize(); + } + + @Override + public Statement getTreeStatement(ZoneId zoneId) { + return StatementGenerator.createStatement(req.getStatement(), zoneId); + } + + @Override + public org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement getTableStatement( + SqlParser parser, ZoneId zoneId, IClientSession clientSession) { + return parser.createStatement(req.getStatement(), zoneId, clientSession); + } + + @Override + public String getSql() { + return req.getStatement(); + } + } + + /** Adapter that wraps TSExecutePreparedReq to implement NativeStatementRequest. */ + private static class TSExecutePreparedReqAdapter implements NativeStatementRequest { + private final TSExecutePreparedReq req; + + // Lazily computed fields + private String fullStatement; + private Execute executeStatement; + + TSExecutePreparedReqAdapter(TSExecutePreparedReq req) { + this.req = req; + } + + @Override + public Long getStatementId() { + return req.getStatementId(); + } + + @Override + public long getTimeout() { + return req.getTimeout(); + } + + @Override + public int getFetchSize() { + return req.getFetchSize(); + } + + @Override + public Statement getTreeStatement(ZoneId zoneId) { + throw new UnsupportedOperationException("PreparedStatement is not supported for Tree model"); + } + + @Override + public org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement getTableStatement( + SqlParser parser, ZoneId zoneId, IClientSession clientSession) { + ensureParsed(); + return executeStatement; + } + + @Override + public String getSql() { + ensureParsed(); + return fullStatement; + } + + /** Lazily parse parameters and build the Execute statement. */ + private void ensureParsed() { + if (fullStatement != null) { + return; + } + + String statementName = req.getStatementName(); + + // Deserialize parameters and build Execute statement + List rawParams = + PreparedParameterSerde.deserialize(ByteBuffer.wrap(req.getParameters())); + List parameters = new ArrayList<>(rawParams.size()); + List paramStrings = new ArrayList<>(rawParams.size()); + for (DeserializedParam param : rawParams) { + Pair literalAndString = convertToLiteralWithString(param); + parameters.add(literalAndString.left); + paramStrings.add(literalAndString.right); + } + + executeStatement = new Execute(new Identifier(statementName), parameters); + fullStatement = + paramStrings.isEmpty() + ? "EXECUTE " + statementName + : "EXECUTE " + statementName + " USING " + String.join(", ", paramStrings); + } + + private static Pair convertToLiteralWithString(DeserializedParam param) { + if (param.isNull()) { + return new Pair<>(new NullLiteral(), "NULL"); + } + + switch (param.type) { + case BOOLEAN: + String boolStr = (Boolean) param.value ? "true" : "false"; + return new Pair<>(new BooleanLiteral(boolStr), boolStr); + case INT32: + case INT64: + String numStr = String.valueOf(param.value); + return new Pair<>(new LongLiteral(numStr), numStr); + case FLOAT: + String floatStr = String.valueOf(param.value); + return new Pair<>(new DoubleLiteral((Float) param.value), floatStr); + case DOUBLE: + String doubleStr = String.valueOf(param.value); + return new Pair<>(new DoubleLiteral((Double) param.value), doubleStr); + case TEXT: + case STRING: + String strVal = (String) param.value; + // Escape single quotes for SQL + String escapedStr = "'" + strVal.replace("'", "''") + "'"; + return new Pair<>(new StringLiteral(strVal), escapedStr); + case BLOB: + byte[] bytes = (byte[]) param.value; + String hexStr = "X'" + PreparedParameterSerde.bytesToHex(bytes) + "'"; + return new Pair<>(new BinaryLiteral(bytes), hexStr); + default: + throw new IllegalArgumentException("Unknown parameter type: " + param.type); + } + } + } + private TSExecuteStatementResp executeRawDataQueryInternal( TSRawDataQueryReq req, SelectResult setResult) { boolean finished = false; @@ -968,7 +1142,7 @@ public TSExecuteStatementResp executeUpdateStatementV2(TSExecuteStatementReq req @Override public TSExecuteStatementResp executeStatementV2(TSExecuteStatementReq req) { - return executeStatementInternal(req, SELECT_RESULT); + return executeStatementInternal(new TSExecuteStatementReqAdapter(req), SELECT_RESULT); } @Override @@ -1495,6 +1669,75 @@ public TSStatus closeOperation(TSCloseOperationReq req) { COORDINATOR::cleanupQueryExecution); } + // ========================= PreparedStatement RPC Methods ========================= + + @Override + public TSPrepareResp prepareStatement(TSPrepareReq req) { + IClientSession clientSession = SESSION_MANAGER.getCurrSessionAndUpdateIdleTime(); + if (!SESSION_MANAGER.checkLogin(clientSession)) { + return new TSPrepareResp(getNotLoggedInStatus()); + } + + try { + String sql = req.getSql(); + String statementName = req.getStatementName(); + + org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement statement = + relationSqlParser.createStatement(sql, clientSession.getZoneId(), clientSession); + + if (statement == null) { + return new TSPrepareResp( + RpcUtils.getStatus(TSStatusCode.SQL_PARSE_ERROR, "Failed to parse SQL: " + sql)); + } + + int parameterCount = ParameterExtractor.getParameterCount(statement); + + PreparedStatementHelper.register(clientSession, statementName, statement); + + TSPrepareResp resp = new TSPrepareResp(RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS)); + resp.setParameterCount(parameterCount); + return resp; + } catch (Exception e) { + return new TSPrepareResp( + onQueryException( + e, OperationType.PREPARE_STATEMENT.getName(), TSStatusCode.INTERNAL_SERVER_ERROR)); + } + } + + @Override + public TSExecuteStatementResp executePreparedStatement(TSExecutePreparedReq req) { + return executeStatementInternal(new TSExecutePreparedReqAdapter(req), setResultForPrepared); + } + + @Override + public TSStatus deallocatePreparedStatement(TSDeallocatePreparedReq req) { + IClientSession clientSession = SESSION_MANAGER.getCurrSessionAndUpdateIdleTime(); + if (!SESSION_MANAGER.checkLogin(clientSession)) { + return getNotLoggedInStatus(); + } + + try { + PreparedStatementHelper.unregister(clientSession, req.getStatementName()); + return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS); + } catch (Exception e) { + return onQueryException( + e, + OperationType.DEALLOCATE_PREPARED_STATEMENT.getName(), + TSStatusCode.INTERNAL_SERVER_ERROR); + } + } + + private final SelectResult setResultForPrepared = + (resp, queryExecution, fetchSize) -> { + // Use V2 format (queryResult) to match IoTDBTablePreparedStatement client + Pair, Boolean> pair = + QueryDataSetUtils.convertQueryResultByFetchSize(queryExecution, fetchSize); + resp.setQueryResult(pair.left); + return pair.right; + }; + + // ========================= End PreparedStatement RPC Methods ========================= + @Override public TSGetTimeZoneResp getTimeZone(long sessionId) { try { @@ -1828,7 +2071,7 @@ public TSFetchMetadataResp fetchMetadata(TSFetchMetadataReq req) { @Override public TSExecuteStatementResp executeStatement(TSExecuteStatementReq req) { - return executeStatementInternal(req, OLD_SELECT_RESULT); + return executeStatementInternal(new TSExecuteStatementReqAdapter(req), OLD_SELECT_RESULT); } @Override diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializerTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializerTest.java index d568583a1924a..26dcb5b4d0463 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializerTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializerTest.java @@ -116,8 +116,8 @@ public static void prepareEnv() { Mockito.anyMap(), // Map, CteDataStore> Mockito.any(), // ExplainType Mockito.anyLong(), // timeOut - Mockito.anyBoolean(), - false)) // userQuery + Mockito.anyBoolean(), // userQuery + false)) // debug .thenReturn(mockResult); } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteSubqueryTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteSubqueryTest.java index 1d91d6fda0677..2e22ff869fb2e 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteSubqueryTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteSubqueryTest.java @@ -139,8 +139,8 @@ private void mockExecuteForTableModel() throws IoTDBException { Mockito.anyMap(), // Map, CteDataStore> Mockito.any(), // ExplainType Mockito.anyLong(), // timeOut - Mockito.anyBoolean(), - false)) // userQuery + Mockito.anyBoolean(), // userQuery + false)) // debug .thenReturn(mockResult); // Create QueryExecution mock From 75ee442d67a76d6952c7bc1f4d82e77c168e4946 Mon Sep 17 00:00:00 2001 From: Weihao Li <18110526956@163.com> Date: Fri, 6 Feb 2026 15:08:13 +0800 Subject: [PATCH 5/6] fix according review Signed-off-by: Weihao Li <18110526956@163.com> --- .../iotdb/relational/it/query/recent/IoTDBDebugQueryIT.java | 4 ++-- .../org/apache/iotdb/db/queryengine/plan/Coordinator.java | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBDebugQueryIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBDebugQueryIT.java index 096be8091e39a..2885b62f676d2 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBDebugQueryIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBDebugQueryIT.java @@ -73,7 +73,7 @@ public static void tearDown() throws Exception { } @Test - public void treeTest() throws IOException { + public void tableTest() throws IOException { // clear log content to reduce lines spanned in logContains check dataNodeWrapper.clearLogContent(); @@ -86,7 +86,7 @@ public void treeTest() throws IOException { } @Test - public void tableTest() throws IOException { + public void treeTest() throws IOException { // clear log content to reduce lines spanned in logContains check dataNodeWrapper.clearLogContent(); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java index 76307e34e65e7..531cfb1e369d8 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java @@ -306,9 +306,6 @@ private ExecutionResult execution( if (LOGGER.isDebugEnabled() && sql != null && !sql.isEmpty()) { LOGGER.debug("[QueryStart] sql: {}", sql); } - if (userQuery) { - System.out.println("--------------" + debug); - } queryContext = new MPPQueryContext( sql, From 136abea61fcbd5451a4adde7a7a45e9374b55ce6 Mon Sep 17 00:00:00 2001 From: Weihao Li <18110526956@163.com> Date: Sat, 7 Feb 2026 21:47:32 +0800 Subject: [PATCH 6/6] fix UT Signed-off-by: Weihao Li <18110526956@163.com> --- .../plan/relational/planner/CteMaterializerTest.java | 2 +- .../db/queryengine/plan/relational/planner/CteSubqueryTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializerTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializerTest.java index 26dcb5b4d0463..3ea888057ccb7 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializerTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteMaterializerTest.java @@ -117,7 +117,7 @@ public static void prepareEnv() { Mockito.any(), // ExplainType Mockito.anyLong(), // timeOut Mockito.anyBoolean(), // userQuery - false)) // debug + Mockito.anyBoolean())) // debug .thenReturn(mockResult); } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteSubqueryTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteSubqueryTest.java index 2e22ff869fb2e..25b00fd66acdf 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteSubqueryTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/CteSubqueryTest.java @@ -140,7 +140,7 @@ private void mockExecuteForTableModel() throws IoTDBException { Mockito.any(), // ExplainType Mockito.anyLong(), // timeOut Mockito.anyBoolean(), // userQuery - false)) // debug + Mockito.anyBoolean())) // debug .thenReturn(mockResult); // Create QueryExecution mock