This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch force_ci/prepstm in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit ab853e8c9b97869bf15815e7f029e10908ecaa07 Merge: 43a754c4009 0bb9e96ece7 Author: JackieTien97 <[email protected]> AuthorDate: Mon Dec 8 14:29:12 2025 +0800 Resolve conflicts .github/workflows/cluster-it-1c1d1a.yml | 2 +- LICENSE-binary | 4 +- dependencies.json | 16 +- integration-test/src/assembly/mpp-test.xml | 2 +- .../iotdb/it/env/cluster/node/AINodeWrapper.java | 25 +- .../ainode/it/AINodeConcurrentInferenceIT.java | 62 +- .../org/apache/iotdb/db/it/IoTDBDeletionIT.java | 21 + .../org/apache/iotdb/db/it/IoTDBLoadTsFileIT.java | 145 ++ .../iotdb/db/it/IoTDBLoadTsFileWithModIT.java | 60 +- .../org/apache/iotdb/db/it/auth/IoTDBAuthIT.java | 16 + .../iotdb/db/it/auth/IoTDBSystemPermissionIT.java | 3 +- .../it/auth/IoTDBSystemPermissionRelationalIT.java | 3 +- .../it/schema/IoTDBCreateAlignedTimeseriesIT.java | 22 + .../db/it/schema/IoTDBCreateTimeseriesIT.java | 8 + .../iotdb/db/it/selectinto/IoTDBSelectIntoIT.java | 13 +- .../iotdb/db/it/utils/TSDataTypeTestUtils.java | 113 + .../pipe/it/dual/tablemodel/TableModelUtils.java | 8 +- .../treemodel/auto/basic/IoTDBPipeSyntaxIT.java | 61 + .../auto/basic/IoTDBTreePatternFormatIT.java | 616 +++--- .../treemodel/manual/IoTDBPipeInclusionIT.java | 72 + .../pipe/it/single/IoTDBPipePermissionIT.java | 27 +- .../relational/it/db/it/IoTDBDeletionTableIT.java | 8 +- .../relational/it/db/it/IoTDBInsertTableIT.java | 6 + .../scalar/IoTDBScalarFunctionTableIT.java | 23 +- .../it/query/recent/IoTDBExceptTableIT.java | 159 ++ .../it/query/recent/IoTDBLengthFunctionIT.java | 119 ++ .../it/query/recent/IoTDBMaintainAuthIT.java | 8 +- .../relational/it/schema/IoTDBDatabaseIT.java | 12 +- .../iotdb/relational/it/schema/IoTDBDeviceIT.java | 44 +- .../iotdb/relational/it/schema/IoTDBTableIT.java | 16 + .../it/session/IoTDBSessionRelationalIT.java | 12 +- .../iotdb/session/it/IoTDBConnectionsIT.java | 364 ++++ .../apache/iotdb/jdbc/IoTDBPreparedStatement.java | 17 +- .../iotdb/jdbc/IoTDBPreparedStatementTest.java | 154 +- .../apache/iotdb/rpc/TElasticFramedTransport.java | 5 + .../java/org/apache/iotdb/rpc/TSStatusCode.java | 2 +- iotdb-client/session/pom.xml | 14 + .../org/apache/iotdb/session/NodesSupplier.java | 49 +- iotdb-core/ainode/.gitignore | 9 +- iotdb-core/ainode/ainode.spec | 199 ++ iotdb-core/ainode/ainode.xml | 17 +- iotdb-core/ainode/build_binary.py | 602 ++++++ iotdb-core/ainode/iotdb/ainode/core/ai_node.py | 10 +- iotdb-core/ainode/iotdb/ainode/core/config.py | 28 +- iotdb-core/ainode/iotdb/ainode/core/constant.py | 18 +- .../iotdb/ainode/core/inference/pool_controller.py | 49 +- .../pool_scheduler/basic_pool_scheduler.py | 7 +- iotdb-core/ainode/iotdb/ainode/core/log.py | 4 +- .../iotdb/ainode/core/manager/inference_manager.py | 4 +- .../ainode/core/model/sundial/modeling_sundial.py | 13 +- .../ainode/core/model/timerxl/modeling_timer.py | 6 +- iotdb-core/ainode/iotdb/ainode/core/rpc/handler.py | 2 +- iotdb-core/ainode/iotdb/ainode/core/rpc/service.py | 1 + iotdb-core/ainode/iotdb/ainode/core/script.py | 80 +- iotdb-core/ainode/poetry.lock | 2226 -------------------- iotdb-core/ainode/pom.xml | 92 +- iotdb-core/ainode/pyproject.toml | 29 +- .../ainode/resources/syncPythonVersion.groovy | 33 - .../org/apache/iotdb/db/qp/sql/IdentifierParser.g4 | 2 + .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 7 +- .../antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 | 8 + iotdb-core/confignode/pom.xml | 2 +- .../async/AsyncAINodeHeartbeatClientPool.java | 7 +- .../request/read/model/ShowModelPlan.java | 4 +- .../iotdb/confignode/manager/ConfigManager.java | 26 +- .../apache/iotdb/confignode/manager/IManager.java | 18 +- .../iotdb/confignode/manager/ModelManager.java | 37 +- .../pipe/agent/task/PipeConfigNodeSubtask.java | 6 +- .../receiver/protocol/IoTDBConfigNodeReceiver.java | 13 +- .../sink/protocol/IoTDBConfigRegionAirGapSink.java | 6 +- .../pipe/sink/protocol/IoTDBConfigRegionSink.java | 6 +- .../pipe/source/IoTDBConfigRegionSource.java | 6 +- ...eConfigPhysicalPlanTreePatternParseVisitor.java | 46 +- .../procedure/CompletedProcedureRecycler.java | 21 +- .../iotdb/confignode/procedure/Procedure.java | 27 +- .../confignode/procedure/ProcedureExecutor.java | 88 +- .../procedure/TimeoutExecutorThread.java | 12 +- .../procedure/impl/model/CreateModelProcedure.java | 4 +- .../procedure/impl/model/DropModelProcedure.java | 7 +- .../procedure/impl/node/RemoveAINodeProcedure.java | 4 +- .../procedure/store/ConfigProcedureStore.java | 26 +- .../procedure/store/IProcedureStore.java | 10 +- .../thrift/ConfigNodeRPCServiceProcessor.java | 69 +- ...figPhysicalPlanTreePatternParseVisitorTest.java | 7 +- iotdb-core/consensus/pom.xml | 14 +- iotdb-core/datanode/pom.xml | 4 +- .../assembly/resources/conf/logback-datanode.xml | 15 - .../org/apache/iotdb/db/auth/AuthorityChecker.java | 9 +- .../apache/iotdb/db/conf/DataNodeMemoryConfig.java | 10 +- .../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 12 +- .../org/apache/iotdb/db/conf/IoTDBDescriptor.java | 6 - .../db/consensus/DataRegionConsensusImpl.java | 6 + .../dataregion/DataRegionStateMachine.java | 15 +- .../schemaregion/SchemaExecutionVisitor.java | 44 +- .../db/pipe/agent/task/PipeDataNodeTaskAgent.java | 4 +- .../agent/task/connection/PipeEventCollector.java | 4 +- .../subtask/processor/PipeProcessorSubtask.java | 7 + .../agent/task/subtask/sink/PipeSinkSubtask.java | 11 +- .../tablet/PipeInsertNodeTabletInsertionEvent.java | 73 +- .../common/tsfile/PipeTsFileInsertionEvent.java | 2 +- .../parser/TsFileInsertionEventParserProvider.java | 6 +- .../protocol/airgap/IoTDBAirGapReceiverAgent.java | 5 +- .../protocol/thrift/IoTDBDataNodeReceiver.java | 29 +- .../visitor/PipeStatementExceptionVisitor.java | 8 +- .../visitor/PipeStatementTSStatusVisitor.java | 43 +- .../PipeStatementTreePatternParseVisitor.java | 22 +- ...leStatementDataTypeConvertExecutionVisitor.java | 4 +- ...eeStatementDataTypeConvertExecutionVisitor.java | 4 +- .../resource/memory/InsertNodeMemoryEstimator.java | 55 +- .../pipe/resource/memory/PipeMemoryWeightUtil.java | 62 +- .../airgap/IoTDBSchemaRegionAirGapSink.java | 6 +- .../handler/PipeConsensusDeleteEventHandler.java | 2 +- .../thrift/async/IoTDBDataRegionAsyncSink.java | 18 +- .../handler/PipeTransferTrackableHandler.java | 16 +- .../async/handler/PipeTransferTsFileHandler.java | 15 +- .../thrift/sync/IoTDBDataRegionSyncSink.java | 3 +- .../thrift/sync/IoTDBSchemaRegionSink.java | 6 +- .../sink/util/sorter/PipeTabletEventSorter.java | 5 + .../source/dataregion/IoTDBDataRegionSource.java | 6 +- .../realtime/assigner/DisruptorQueue.java | 4 +- .../PipePlanTreePatternParseVisitor.java | 41 +- .../db/protocol/client/AINodeClientFactory.java | 133 ++ .../iotdb/db/protocol/client/ConfigNodeClient.java | 51 +- .../db/protocol}/client/ainode/AINodeClient.java | 168 +- .../client/ainode/AINodeClientManager.java | 75 + .../client/ainode/AsyncAINodeServiceClient.java | 2 +- .../iotdb/db/protocol/session/IClientSession.java | 16 + .../iotdb/db/protocol/session/SessionManager.java | 14 + .../db/queryengine/common/ConnectionInfo.java | 64 + .../common/header/DatasetHeaderFactory.java | 4 + .../execution/executor/RegionWriteExecutor.java | 4 +- .../fragment/FragmentInstanceContext.java | 2 +- .../fragment/FragmentInstanceExecution.java | 2 +- .../operator/process/ai/InferenceOperator.java | 4 +- .../process/window/TableWindowOperator.java | 2 + .../InformationSchemaContentSupplierFactory.java | 64 +- .../relational/ColumnTransformerBuilder.java | 8 +- .../iotdb/db/queryengine/plan/Coordinator.java | 19 +- .../analyze/cache/partition/PartitionCache.java | 2 +- .../dualkeycache/impl/CacheEntryGroupImpl.java | 6 + .../schema/dualkeycache/impl/DualKeyCacheImpl.java | 61 +- .../schema/dualkeycache/impl/ICacheEntryGroup.java | 3 + .../plan/analyze/load/LoadTsFileAnalyzer.java | 14 +- .../load/TreeSchemaAutoCreatorAndVerifier.java | 4 + .../analyze/schema/AutoCreateSchemaExecutor.java | 51 +- .../execution/config/TableConfigTaskVisitor.java | 24 +- .../execution/config/TreeConfigTaskVisitor.java | 8 + .../config/executor/ClusterConfigTaskExecutor.java | 142 +- .../config/executor/IConfigTaskExecutor.java | 2 + ...dModelsTask.java => ShowAvailableUrlsTask.java} | 40 +- .../config/metadata/ai/ShowAIDevicesTask.java | 2 +- .../config/metadata/ai/ShowLoadedModelsTask.java | 4 +- .../config/metadata/ai/ShowModelsTask.java | 4 +- .../db/queryengine/plan/parser/ASTVisitor.java | 18 +- .../plan/planner/plan/node/PlanGraphPrinter.java | 10 + .../plan/planner/plan/node/PlanNodeType.java | 4 + .../plan/planner/plan/node/PlanVisitor.java | 5 + .../plan/node/load/LoadSingleTsFileNode.java | 6 +- .../relational/analyzer/StatementAnalyzer.java | 64 +- .../analyzer/StatementAnalyzerFactory.java | 17 +- .../function/tvf/ForecastTableFunction.java | 8 +- .../plan/relational/metadata/Metadata.java | 10 + .../relational/metadata/TableMetadataImpl.java | 24 +- .../fetcher/TableHeaderSchemaValidator.java | 378 ++++ .../fetcher/cache/TableDeviceCacheEntry.java | 8 +- .../fetcher/cache/TableDeviceLastCache.java | 56 +- .../fetcher/cache/TableDeviceSchemaCache.java | 8 +- .../cache/TableDeviceSchemaCacheMetrics.java | 9 +- .../fetcher/cache/TreeDeviceNormalSchema.java | 6 +- .../plan/relational/planner/RelationPlanner.java | 24 +- .../plan/relational/planner/TableModelPlanner.java | 8 +- .../iterative/rule/EvaluateEmptyIntersect.java | 63 + ...istinctAsUnion.java => ImplementExceptAll.java} | 78 +- ...on.java => ImplementExceptDistinctAsUnion.java} | 52 +- .../rule/ImplementIntersectDistinctAsUnion.java | 3 +- .../planner/iterative/rule/MergeExcept.java | 47 + .../planner/iterative/rule/MergeIntersect.java | 47 + .../iterative/rule/PruneDistinctAggregation.java | 27 +- .../iterative/rule/PruneExceptSourceColumns.java | 54 + .../rule/PruneIntersectSourceColumns.java | 55 + .../iterative/rule/RemoveEmptyExceptBranches.java | 139 ++ .../planner/iterative/rule/SetOperationMerge.java | 123 +- .../iterative/rule/SetOperationNodeTranslator.java | 4 +- .../plan/relational/planner/node/ExceptNode.java | 99 + .../plan/relational/planner/node/Patterns.java | 20 +- .../DataNodeLocationSupplierFactory.java | 1 + .../optimizations/LogicalOptimizeFactory.java | 43 +- .../optimizations/UnaliasSymbolReferences.java | 31 + .../security/TreeAccessCheckVisitor.java | 26 +- .../plan/relational/sql/ast/AstVisitor.java | 4 + .../plan/relational/sql/ast/InsertRows.java | 19 +- .../plan/relational/sql/ast/RenameColumn.java | 5 +- .../plan/relational/sql/ast/RenameTable.java | 5 +- .../relational/sql/ast/ShowAvailableUrls.java} | 42 +- .../relational/sql/ast/WrappedInsertStatement.java | 414 +++- .../plan/relational/sql/parser/AstBuilder.java | 7 + .../scheduler/load/LoadTsFileDispatcherImpl.java | 12 +- .../plan/scheduler/load/LoadTsFileScheduler.java | 6 +- .../plan/statement/StatementVisitor.java | 6 + .../plan/statement/crud/InsertBaseStatement.java | 147 +- .../crud/InsertMultiTabletsStatement.java | 6 + .../plan/statement/crud/InsertRowStatement.java | 42 + .../crud/InsertRowsOfOneDeviceStatement.java | 6 + .../plan/statement/crud/InsertRowsStatement.java | 6 + .../plan/statement/crud/InsertTabletStatement.java | 68 +- .../plan/statement/crud/LoadTsFileStatement.java | 18 +- .../metadata/ShowAvailableUrlsStatement.java} | 29 +- .../db/queryengine/plan/udf/UDTFForecast.java | 9 +- .../unary/scalar/BlobLengthColumnTransformer.java | 56 + .../rescon/MemSchemaEngineStatistics.java | 3 +- .../schemaengine/schemaregion/ISchemaRegion.java | 5 +- .../schemaregion/impl/SchemaRegionMemoryImpl.java | 16 +- .../schemaregion/impl/SchemaRegionPBTreeImpl.java | 16 +- .../mtree/impl/mem/MTreeBelowSGMemoryImpl.java | 18 +- .../mtree/impl/pbtree/MTreeBelowSGCachedImpl.java | 21 +- .../schemaengine/schemaregion/utils/MetaUtils.java | 6 +- .../req/impl/CreateAlignedTimeSeriesPlanImpl.java | 10 + .../write/req/impl/CreateTimeSeriesPlanImpl.java | 10 + .../db/schemaengine/table/DataNodeTableCache.java | 17 +- .../iotdb/db/service/metrics/WritingMetrics.java | 3 +- .../iotdb/db/storageengine/StorageEngine.java | 13 +- .../db/storageengine/dataregion/DataRegion.java | 289 ++- .../dataregion/IDataRegionForQuery.java | 2 +- .../dataregion/VirtualDataRegion.java | 2 +- .../execute/task/AbstractCompactionTask.java | 3 +- .../execute/task/InnerSpaceCompactionTask.java | 17 +- .../execute/task/SettleCompactionTask.java | 5 + .../compaction/repair/RepairTimePartition.java | 2 +- .../dataregion/memtable/TsFileProcessor.java | 18 +- .../dataregion/snapshot/SnapshotTaker.java | 14 +- .../dataregion/tsfile/TsFileResource.java | 43 +- .../file/UnsealedTsFileRecoverPerformer.java | 6 +- .../db/storageengine/load/LoadTsFileManager.java | 40 +- .../load/active/ActiveLoadDirScanner.java | 43 +- .../load/active/ActiveLoadPathHelper.java | 282 +++ .../load/active/ActiveLoadPendingQueue.java | 17 +- .../load/active/ActiveLoadTsFileLoader.java | 42 +- .../load/config/LoadTsFileConfigurator.java | 18 + ...leStatementDataTypeConvertExecutionVisitor.java | 10 +- ...eeStatementDataTypeConvertExecutionVisitor.java | 10 +- .../db/storageengine/load/disk/MinIOSelector.java | 10 +- .../ActiveLoadUtil.java => util/LoadUtil.java} | 88 +- .../rescon/memory/PrimitiveArrayManager.java | 1 + .../db/utils/datastructure/AlignedTVList.java | 20 +- .../iotdb/db/utils/datastructure/TVList.java | 2 +- .../apache/iotdb/db/auth/AuthorityCheckerTest.java | 51 + .../org/apache/iotdb/db/auth/TreeAccessTest.java | 84 + .../cache/TreeDeviceSchemaCacheManagerTest.java | 14 + .../db/metadata/path/MeasurementPathTest.java | 4 +- .../db/pipe/pattern/TreePatternCoverageTest.java | 133 ++ .../PipeStatementTreePatternParseVisitorTest.java | 202 +- .../PipePlanTreePatternParseVisitorTest.java | 7 +- .../process/window/TableWindowOperatorTest.java | 51 + .../plan/relational/analyzer/AnalyzerTest.java | 40 +- .../plan/relational/analyzer/AuthTest.java | 10 +- .../analyzer/EvaluateEmptyIntersectTest.java | 48 + .../plan/relational/analyzer/ExceptTest.java | 132 ++ .../plan/relational/analyzer/MergeExceptTest.java | 147 ++ .../relational/analyzer/MergeIntersectTest.java | 112 + .../analyzer/RemoveEmptyExceptBranchesTest.java | 101 + .../analyzer/RowPatternRecognitionTest.java | 4 +- .../plan/relational/analyzer/TSBSMetadata.java | 13 + .../plan/relational/analyzer/TestMetadata.java | 25 +- .../fetcher/cache/TableDeviceSchemaCacheTest.java | 9 + .../plan/relational/planner/PlanTester.java | 4 +- .../plan/statement/InsertStatementTest.java | 97 +- .../scalar/BlobLengthColumnTransformerTest.java | 148 ++ .../DataNodeInternalRPCServiceImplTest.java | 59 +- .../iotdb/db/storageengine/StorageEngineTest.java | 4 +- .../storageengine/dataregion/DataRegionTest.java | 4 +- .../inner/InnerSpaceCompactionExceptionTest.java | 16 + .../repair/RepairUnsortedFileSchedulerTest.java | 10 +- .../compaction/utils/CompactionTestFileWriter.java | 6 +- .../memtable/AlignedTVListIteratorTest.java | 57 + .../dataregion/snapshot/IoTDBSnapshotTest.java | 2 +- .../apache/iotdb/db/utils/TSDataTypeTestUtils.java | 111 + .../datastructure/PrimitiveArrayManagerTest.java | 12 +- iotdb-core/node-commons/pom.xml | 8 +- .../apache/iotdb/commons/client/ClientManager.java | 25 + .../iotdb/commons/client/ClientPoolFactory.java | 52 - .../async/AsyncPipeDataTransferServiceClient.java | 21 +- .../apache/iotdb/commons/conf/CommonConfig.java | 165 +- .../iotdb/commons/conf/CommonDescriptor.java | 5 + .../apache/iotdb/commons/path/MeasurementPath.java | 26 - .../org/apache/iotdb/commons/path/PartialPath.java | 26 + .../task/subtask/PipeAbstractSinkSubtask.java | 13 + .../iotdb/commons/pipe/config/PipeConfig.java | 61 +- .../iotdb/commons/pipe/config/PipeDescriptor.java | 42 +- .../pipe/config/constant/PipeSourceConstant.java | 5 + .../datastructure/pattern/IoTDBTreePattern.java | 68 +- .../pattern/IoTDBTreePatternOperations.java | 52 + .../datastructure/pattern/PrefixTreePattern.java | 70 +- .../pipe/datastructure/pattern/TreePattern.java | 369 +++- .../pattern/UnionIoTDBTreePattern.java | 115 +- .../datastructure/pattern/UnionTreePattern.java | 17 +- .../pattern/WithExclusionIoTDBTreePattern.java | 213 ++ .../pattern/WithExclusionTreePattern.java | 119 ++ .../pipe/receiver/PipeReceiverStatusHandler.java | 181 +- .../pipe/source/IoTDBNonDataRegionSource.java | 14 +- .../schema/column/ColumnHeaderConstant.java | 13 + .../commons/schema/table/InformationSchema.java | 17 + .../schema/table/InsertNodeMeasurementInfo.java | 244 +++ .../schema/table/TsFileTableSchemaUtil.java | 207 ++ .../apache/iotdb/commons/schema/table/TsTable.java | 226 +- .../schema/table/column/FieldColumnSchema.java | 1 + .../schema/table/column/TsTableColumnSchema.java | 6 + .../org/apache/iotdb/commons/utils/FileUtils.java | 92 +- .../apache/iotdb/commons/utils/JVMCommonUtils.java | 7 +- .../org/apache/iotdb/commons/utils/RetryUtils.java | 59 +- .../PipeReceiverStatusHandlerTest.java | 302 +++ .../commons/pipe/task/PipeSleepIntervalTest.java | 83 + .../schema/table/TsFileTableSchemaUtilTest.java | 748 +++++++ .../apache/iotdb/commons/utils/FileUtilsTest.java | 79 + .../db/relational/grammar/sql/RelationalSql.g4 | 11 +- .../src/main/thrift/confignode.thrift | 83 +- pom.xml | 34 +- scripts/conf/ainode-env.sh | 138 -- scripts/conf/windows/ainode-env.bat | 129 -- scripts/sbin/start-ainode.sh | 56 +- scripts/sbin/windows/start-ainode.bat | 62 +- 320 files changed, 11974 insertions(+), 5415 deletions(-) diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/IClientSession.java index ff7c7acf79d,351806de099..97585673e82 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/IClientSession.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/IClientSession.java @@@ -180,37 -188,14 +188,45 @@@ public abstract class IClientSession this.databaseName = databaseName; } + /** + * Add a prepared statement to this session. + * + * @param statementName the name of the prepared statement + * @param info the prepared statement information + */ + public abstract void addPreparedStatement(String statementName, PreparedStatementInfo info); + + /** + * Remove a prepared statement from this session. + * + * @param statementName the name of the prepared statement + * @return the removed prepared statement info, or null if not found + */ + public abstract PreparedStatementInfo removePreparedStatement(String statementName); + + /** + * Get a prepared statement from this session. + * + * @param statementName the name of the prepared statement + * @return the prepared statement info, or null if not found + */ + public abstract PreparedStatementInfo getPreparedStatement(String statementName); + + /** + * Get all prepared statement names in this session. + * + * @return set of prepared statement names + */ + public abstract Set<String> getPreparedStatementNames(); + + public long getLastActiveTime() { + return lastActiveTime; + } + + public void setLastActiveTime(long lastActiveTime) { + this.lastActiveTime = lastActiveTime; + } + public enum SqlDialect { TREE((byte) 0), TABLE((byte) 1); diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/SessionManager.java index 525ebf8b009,a4a28efa5ec..e5e95d4f82c --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/SessionManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/session/SessionManager.java @@@ -38,8 -38,8 +38,9 @@@ import org.apache.iotdb.db.auth.Authori import org.apache.iotdb.db.auth.LoginLockManager; import org.apache.iotdb.db.protocol.basic.BasicOpenSessionResp; import org.apache.iotdb.db.protocol.thrift.OperationType; + import org.apache.iotdb.db.queryengine.common.ConnectionInfo; import org.apache.iotdb.db.queryengine.common.SessionInfo; +import org.apache.iotdb.db.queryengine.plan.execution.config.session.PreparedStatementMemoryManager; import org.apache.iotdb.db.storageengine.dataregion.read.control.QueryResourceManager; import org.apache.iotdb.db.utils.DataNodeAuthUtils; import org.apache.iotdb.metrics.utils.MetricLevel; diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java index 8db3ae79dcb,f10600cbda9..7708f6c18cd --- 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 @@@ -205,23 -190,11 +207,25 @@@ public class Coordinator private final List<PlanOptimizer> logicalPlanOptimizers; private final List<PlanOptimizer> distributionPlanOptimizers; private final DataNodeLocationSupplierFactory.DataNodeLocationSupplier dataNodeLocationSupplier; + private final TypeManager typeManager; + static { + coordinatorMemoryBlock = + IoTDBDescriptor.getInstance() + .getMemoryConfig() + .getCoordinatorMemoryManager() + .exactAllocate("Coordinator", MemoryBlockType.DYNAMIC); + + if (LOGGER.isDebugEnabled()) { + LOGGER.debug( + "Initialized shared MemoryBlock 'Coordinator' with all available memory: {} bytes", + coordinatorMemoryBlock.getTotalMemorySizeInBytes()); + } + } + private Coordinator() { this.queryExecutionMap = new ConcurrentHashMap<>(); + this.typeManager = new InternalTypeManager(); this.executor = getQueryExecutor(); this.writeOperationExecutor = getWriteExecutor(); this.scheduledExecutor = getScheduledExecutor(); @@@ -430,8 -401,7 +432,9 @@@ distributionPlanOptimizers, AuthorityChecker.getAccessControl(), dataNodeLocationSupplier, + Collections.emptyList(), - Collections.emptyMap()); ++ Collections.emptyMap(), + typeManager); return new QueryExecution(tableModelPlanner, queryContext, executor); } @@@ -513,49 -482,9 +517,49 @@@ executor, statement.accept( new TableConfigTaskVisitor( - clientSession, metadata, AuthorityChecker.getAccessControl()), + clientSession, metadata, AuthorityChecker.getAccessControl(), typeManager), queryContext)); } + // Initialize variables for TableModelPlanner + org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement statementToUse = statement; + List<Expression> parameters = Collections.emptyList(); + Map<NodeRef<Parameter>, Expression> parameterLookup = Collections.emptyMap(); + + if (statement instanceof Execute) { + Execute executeStatement = (Execute) statement; + String statementName = executeStatement.getStatementName().getValue(); + + // Get prepared statement from session (contains cached AST) + PreparedStatementInfo preparedInfo = clientSession.getPreparedStatement(statementName); + if (preparedInfo == null) { + throw new SemanticException( + String.format("Prepared statement '%s' does not exist", statementName)); + } + + // Use cached AST + statementToUse = preparedInfo.getSql(); + + // Bind parameters: create parameterLookup map + // Note: bindParameters() internally validates parameter count + parameterLookup = + ParameterExtractor.bindParameters(statementToUse, executeStatement.getParameters()); + parameters = new ArrayList<>(executeStatement.getParameters()); + + } else if (statement instanceof ExecuteImmediate) { + ExecuteImmediate executeImmediateStatement = (ExecuteImmediate) statement; + + // EXECUTE IMMEDIATE needs to parse SQL first + String sql = executeImmediateStatement.getSqlString(); + List<Literal> literalParameters = executeImmediateStatement.getParameters(); + + statementToUse = sqlParser.createStatement(sql, clientSession.getZoneId(), clientSession); + + if (!literalParameters.isEmpty()) { + parameterLookup = ParameterExtractor.bindParameters(statementToUse, literalParameters); + parameters = new ArrayList<>(literalParameters); + } + } + if (statement instanceof WrappedInsertStatement) { ((WrappedInsertStatement) statement).setContext(queryContext); } @@@ -574,8 -501,7 +578,9 @@@ distributionPlanOptimizers, AuthorityChecker.getAccessControl(), dataNodeLocationSupplier, + parameters, - parameterLookup); ++ parameterLookup, + typeManager); return new QueryExecution(tableModelPlanner, queryContext, executor); } diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableModelPlanner.java index ba7f6e42c24,fddff825f0d..78f9729ece3 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableModelPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableModelPlanner.java @@@ -90,9 -88,7 +91,10 @@@ public class TableModelPlanner implemen private final DataNodeLocationSupplierFactory.DataNodeLocationSupplier dataNodeLocationSupplier; + // Parameters for prepared statements (optional) + private final List<Expression> parameters; + private final Map<NodeRef<Parameter>, Expression> parameterLookup; + private final TypeManager typeManager; public TableModelPlanner( final Statement statement, @@@ -108,8 -104,7 +110,9 @@@ final List<PlanOptimizer> distributionPlanOptimizers, final AccessControl accessControl, final DataNodeLocationSupplierFactory.DataNodeLocationSupplier dataNodeLocationSupplier, + final List<Expression> parameters, - final Map<NodeRef<Parameter>, Expression> parameterLookup) { ++ final Map<NodeRef<Parameter>, Expression> parameterLookup, + final TypeManager typeManager) { this.statement = statement; this.sqlParser = sqlParser; this.metadata = metadata; @@@ -121,8 -116,7 +124,9 @@@ this.distributionPlanOptimizers = distributionPlanOptimizers; this.accessControl = accessControl; this.dataNodeLocationSupplier = dataNodeLocationSupplier; + this.parameters = parameters; + this.parameterLookup = parameterLookup; + this.typeManager = typeManager; } @Override @@@ -130,9 -124,9 +134,9 @@@ return new Analyzer( context, context.getSession(), - new StatementAnalyzerFactory(metadata, sqlParser, accessControl), + new StatementAnalyzerFactory(metadata, sqlParser, accessControl, typeManager), - Collections.emptyList(), - Collections.emptyMap(), + parameters, + parameterLookup, statementRewrite, warningCollector) .analyze(statement);
