This is an automated email from the ASF dual-hosted git repository.

Caideyipi pushed a commit to branch codex/jdbc-driver-info
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 5db0a02a148c0d64fb7b9ab826e56f917114fc6e
Merge: 164931f42f5 f971de235ec
Author: Caideyipi <[email protected]>
AuthorDate: Mon Jun 22 11:25:36 2026 +0800

    Merge branch 'master' of https://github.com/apache/iotdb into 
codex/jdbc-driver-info
    
    # Conflicts:
    #       
iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnectionParams.java
    #       iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/Utils.java

 .codex/hooks.json                                  |    17 +
 .github/scripts/package-client-cpp-manylinux228.sh |   140 +
 .github/workflows/client-cpp-package.yml           |   465 +-
 .github/workflows/cluster-it-1c1d.yml              |     8 +
 .github/workflows/cluster-it-1c1d1a.yml            |     8 +
 .github/workflows/cluster-it-1c3d.yml              |     8 +
 .github/workflows/compile-check.yml                |    59 -
 .github/workflows/daily-it.yml                     |     4 +-
 .github/workflows/daily-ut.yml                     |    15 +-
 .github/workflows/dependency-check.yml             |     8 +
 .github/workflows/multi-language-client.yml        |    81 +-
 .github/workflows/pipe-it.yml                      |    19 +
 .github/workflows/sonar-codecov.yml                |     8 +
 .github/workflows/table-cluster-it-1c1d.yml        |     8 +
 .github/workflows/table-cluster-it-1c3d.yml        |     8 +
 .github/workflows/unit-test.yml                    |     8 +
 .gitignore                                         |    12 +-
 CLAUDE.md                                          |     2 +-
 CONTRIBUTING.md                                    |     5 +-
 Jenkinsfile                                        |     2 +-
 LICENSE-binary                                     |    43 +-
 README.md                                          |     4 +-
 README_ZH.md                                       |     4 +-
 dependencies.json                                  |   318 +-
 distribution/pom.xml                               |    66 +-
 distribution/src/assembly/client-cpp.xml           |     6 +-
 example/client-c-example/README.md                 |    68 -
 example/client-c-example/pom.xml                   |   150 -
 example/client-c-example/src/table_example.c       |   152 -
 example/client-c-example/src/tree_example.c        |   114 -
 example/client-cpp-example/pom.xml                 |   200 -
 example/client-cpp-example/src/CMakeLists.txt      |   151 -
 example/jdbc/pom.xml                               |     4 +-
 example/pipe-count-point-processor/pom.xml         |     4 +-
 example/pom.xml                                    |    13 +-
 .../ConsensusSubscriptionWalFileAnalyzer.java      |   528 +
 .../iotdb/ConsensusSubscriptionSessionExample.java |   198 +
 ...sensusTableModelSubscriptionSessionExample.java |   201 +
 external-service-impl/mqtt/pom.xml                 |     4 +-
 external-service-impl/pom.xml                      |     4 +-
 external-service-impl/rest-openapi/pom.xml         |    28 +-
 external-service-impl/rest/pom.xml                 |    32 +-
 .../java/org/apache/iotdb/rest/RestService.java    |    17 +-
 .../rest/protocol/filter/ApiOriginFilter.java      |    15 +-
 .../rest/protocol/filter/AuthorizationFilter.java  |    36 +-
 .../rest/protocol/filter/BasicSecurityContext.java |     2 +-
 .../protocol/handler/AuthorizationHandler.java     |     4 +-
 .../rest/protocol/impl/PingApiServiceImpl.java     |     4 +-
 .../table/v1/handler/ExceptionHandler.java         |     2 +-
 .../table/v1/handler/QueryDataSetHandler.java      |     2 +-
 .../protocol/table/v1/impl/RestApiServiceImpl.java |     4 +-
 .../rest/protocol/v1/handler/ExceptionHandler.java |     2 +-
 .../protocol/v1/handler/QueryDataSetHandler.java   |     2 +-
 .../protocol/v1/impl/GrafanaApiServiceImpl.java    |     4 +-
 .../rest/protocol/v1/impl/RestApiServiceImpl.java  |     4 +-
 .../rest/protocol/v2/handler/ExceptionHandler.java |     2 +-
 .../rest/protocol/v2/handler/FastLastHandler.java  |     2 +-
 .../protocol/v2/handler/QueryDataSetHandler.java   |     3 +-
 .../protocol/v2/impl/GrafanaApiServiceImpl.java    |     4 +-
 .../rest/protocol/v2/impl/RestApiServiceImpl.java  |     4 +-
 .../org/apache/iotdb/it/env/MultiEnvFactory.java   |     1 +
 .../iotdb/it/env/cluster/config/MppBaseConfig.java |     7 +-
 .../it/env/cluster/config/MppCommonConfig.java     |    70 +-
 .../env/cluster/config/MppSharedCommonConfig.java  |    69 +-
 .../org/apache/iotdb/it/env/cluster/env/AIEnv.java |    28 +-
 .../iotdb/it/env/cluster/env/AbstractEnv.java      |   421 +-
 .../iotdb/it/env/cluster/node/AINodeStarter.java   |    84 +
 .../it/env/remote/config/RemoteCommonConfig.java   |    52 +-
 .../java/org/apache/iotdb/itbase/env/BaseEnv.java  |    10 +
 .../org/apache/iotdb/itbase/env/CommonConfig.java  |    23 +-
 .../itbase/runtime/ParallelRequestDelegate.java    |    13 +-
 .../iotdb/cli/it/ExplainJsonCliOutputIT.java       |   345 +
 ...oTDBMultiDBRegionGroupLeaderDistributionIT.java |     1 -
 .../IoTDBPerDatabaseRegionGroupAllocationIT.java   |     8 +-
 .../load/IoTDBRegionGroupLeaderDistributionIT.java |     1 -
 .../partition/IoTDBPartitionInheritStrategyIT.java |     2 +-
 .../partition/IoTDBPartitionShuffleStrategyIT.java |     2 +-
 .../IoTDBRegionMigrateITFrameworkForRatis.java}    |    26 +-
 ...IoTDBRegionOperationReliabilityITFramework.java |   202 +-
 ...BRegionMigrateDataNodeCrashForIoTV2BatchIT.java |    19 +-
 ...RegionMigrateDataNodeCrashForIoTV2StreamIT.java |    19 +-
 ...oTDBRegionMigrateAddingPeerCrashForRatisIT.java |    48 +
 .../IoTDBRegionMigrateConfigNodeCrashIoTV1IT.java  |    26 +
 ...IoTDBRegionMigrateClusterCrashIoTV2BatchIT.java |     6 +-
 ...DBRegionMigrateConfigNodeCrashIoTV2BatchIT.java |    35 +-
 ...oTDBRegionMigrateClusterCrashIoTV2StreamIT.java |     9 +-
 ...BRegionMigrateConfigNodeCrashIoTV2StreamIT.java |    35 +-
 .../IoTDBRegionMigrateClusterCrashForRatisIT.java} |    35 +-
 ...TDBRegionMigrateConfigNodeCrashForRatisIT.java} |    72 +-
 .../IoTDBRemoveDataNodeRegionAllocationIT.java     |   348 +
 .../removedatanode/IoTDBRemoveLastDataNodeIT.java  |   111 +
 .../iotdb/db/it/IoTDBCustomizedClusterIT.java      |    54 +-
 .../java/org/apache/iotdb/db/it/IoTDBMiscIT.java   |    18 +-
 .../db/it/IoTDBSetConfigurationClusterIT.java      |   122 +
 .../iotdb/db/it/IoTDBSetConfigurationIT.java       |   311 +
 .../it/IoTDBSyntaxConventionStringLiteralIT.java   |     2 +-
 .../IoTDBIoTConsensusV23C3DBasicITBase.java        |    48 +-
 ...DBSingleMeasurementCheckCachePerformanceIT.java |   207 +
 .../db/it/schema/IoTDBAlterTimeSeriesTypeIT.java   |    11 +-
 .../pipe/it/dual/TypeConversionSemanticCase.java   |   315 +
 .../manual/basic/IoTDBPipeLifeCycleIT.java         |     2 +-
 .../IoTDBPipeTsFileDecompositionWithModsIT.java    |    24 +-
 .../manual/enhanced/IoTDBPipeDoubleLivingIT.java   |     8 +
 .../manual/enhanced/IoTDBPipeSinkParallelIT.java   |     1 +
 .../IoTDBPipeTypeConversionSemanticIT.java         |   255 +
 .../treemodel/auto/basic/IoTDBPipeLifeCycleIT.java |     2 +-
 .../auto/basic/IoTDBPipeSinkParallelIT.java        |     1 +
 .../IoTDBPipeTypeConversionSemanticIT.java         |   259 +
 .../manual/IoTDBPipeTypeConversionISessionIT.java  |     2 +-
 .../relational/it/db/it/IoTDBWindowTVFIT.java      |   435 +
 .../it/insertquery/IoTDBInsertQueryIT.java         |     4 +-
 .../it/query/recent/IoTDBFillTableIT.java          |   155 +
 .../it/query/recent/IoTDBGroupByAllTableIT.java    |   238 +
 .../it/query/recent/IoTDBTableAggregationIT.java   |   121 +
 .../it/query/recent/IoTExplainJsonFormatIT.java    |   855 +
 .../it/schema/IoTDBAlterColumnTypeIT.java          |    11 +-
 .../relational/it/schema/IoTDBDatabaseIT.java      |    55 +-
 .../apache/iotdb/session/it/IoTDBClientSSLIT.java  |   233 +
 .../IoTDBSubscriptionTopicOwnerPartitionIT.java    |   267 +
 .../AbstractSubscriptionConsensusLocalIT.java}     |     9 +-
 .../local/ConsensusSubscriptionITSupport.java      |   670 +
 .../local/IoTDBConsensusSubscriptionBasicIT.java   |   141 +
 .../IoTDBConsensusSubscriptionConsumerGroupIT.java |   156 +
 .../local/IoTDBConsensusSubscriptionDataIT.java    |   173 +
 .../IoTDBConsensusSubscriptionRecoveryIT.java      |    98 +
 .../local/IoTDBConsensusSubscriptionSeekIT.java    |   202 +
 .../ConsensusSubscriptionTableITSupport.java       |   516 +
 .../IoTDBConsensusSubscriptionBasicTableIT.java    |    88 +
 .../IoTDBConsensusSubscriptionDataTableIT.java     |   137 +
 .../IoTDBConsensusSubscriptionFilterTableIT.java   |   272 +
 ...usSubscriptionSubscribeBeforeRegionTableIT.java |    71 +
 .../dual/tablemodel/IoTDBSubscriptionTopicIT.java  |    86 +
 .../it/local/AbstractSubscriptionLocalIT.java      |     1 +
 .../it/local/IoTDBSubscriptionTopicOwnerIT.java    |   225 +
 .../IoTDBEncryptedPasswordPullConsumerIT.java      |     5 +-
 integration-test/src/test/resources/test-keystore  |   Bin 2710 -> 2742 bytes
 .../src/test/resources/test-truststore             |   Bin 1238 -> 1270 bytes
 .../api/customizer/parameter/PipeParameters.java   |    10 +-
 .../java/org/apache/iotdb/cli/AbstractCli.java     |    60 +-
 .../src/main/java/org/apache/iotdb/cli/Cli.java    |     4 +
 .../org/apache/iotdb/tool/common/Constants.java    |     4 +
 .../org/apache/iotdb/tool/common/OptionsUtil.java  |    10 +
 .../apache/iotdb/tool/data/AbstractDataTool.java   |    37 +
 .../apache/iotdb/tool/data/ExportDataTable.java    |     3 +-
 .../org/apache/iotdb/tool/data/ExportDataTree.java |     3 +-
 .../apache/iotdb/tool/data/ImportDataTable.java    |     3 +-
 .../org/apache/iotdb/tool/data/ImportDataTree.java |     3 +-
 .../iotdb/tool/schema/AbstractSchemaTool.java      |    28 +
 .../iotdb/tool/schema/ExportSchemaTable.java       |     3 +-
 .../apache/iotdb/tool/schema/ExportSchemaTree.java |     3 +-
 .../iotdb/tool/schema/ImportSchemaTable.java       |     3 +-
 .../apache/iotdb/tool/schema/ImportSchemaTree.java |     3 +-
 .../java/org/apache/iotdb/cli/AbstractCliTest.java |    83 +-
 iotdb-client/client-cpp/CMakeLists.txt             |   305 +
 iotdb-client/client-cpp/README.md                  |   612 +-
 iotdb-client/client-cpp/README_zh.md               |   277 +
 iotdb-client/client-cpp/cmake/CheckCxx11Abi.cmake  |    59 +
 iotdb-client/client-cpp/cmake/FetchBoost.cmake     |   130 +
 .../client-cpp/cmake/FetchBuildTools.cmake         |   266 +
 iotdb-client/client-cpp/cmake/FetchOpenSSL.cmake   |   121 +
 iotdb-client/client-cpp/cmake/FetchThrift.cmake    |   278 +
 .../client-cpp/cmake/GenerateThriftSources.cmake   |   126 +
 .../client-cpp/cmake/iotdb-session-config.cmake.in |    56 +
 iotdb-client/client-cpp/cmake/iotdb-session.pc.in  |    26 +
 .../examples}/AlignedTimeseriesSessionExample.cpp  |    25 +-
 iotdb-client/client-cpp/examples/CMakeLists.txt    |   187 +
 .../client-cpp/examples}/MultiSvrNodeClient.cpp    |     8 +-
 iotdb-client/client-cpp/examples/README.md         |   260 +
 iotdb-client/client-cpp/examples/README_zh.md      |   253 +
 .../client-cpp/examples}/SessionExample.cpp        |    33 +-
 .../examples}/TableModelSessionExample.cpp         |     0
 iotdb-client/client-cpp/examples/table_example.c   |   153 +
 iotdb-client/client-cpp/examples/tree_example.c    |   114 +
 iotdb-client/client-cpp/pom.xml                    |   368 +-
 .../client-cpp/src/assembly/client-cpp.xml         |    69 +-
 .../package-metadata/third_party/DEPENDENCIES.md   |    42 +-
 .../src/{main => include}/AbstractSessionBuilder.h |    10 +-
 .../client-cpp/src/{main => include}/Column.h      |     0
 .../src/{main => include}/ColumnDecoder.h          |     0
 .../client-cpp/src/{main => include}/Common.h      |   146 +-
 iotdb-client/client-cpp/src/include/Date.h         |    74 +
 .../client-cpp/src/{main => include}/DeviceID.h    |     0
 .../client-cpp/src/include/Endpoint.h              |    35 +-
 .../client-cpp/src/include/Export.h                |    27 +-
 iotdb-client/client-cpp/src/include/Optional.h     |    77 +
 .../client-cpp/src/{main => include}/Session.h     |   328 +-
 .../src/{main => include}/SessionBuilder.h         |     0
 .../client-cpp/src/{main => include}/SessionC.h    |    12 +
 .../client-cpp/src/include/SessionConfig.h         |    27 +-
 .../client-cpp/src/include/SessionDataSet.h        |   124 +
 .../client-cpp/src/{main => include}/SessionPool.h |     0
 .../client-cpp/src/include/Status.h                |    25 +-
 .../src/{main => include}/TableSession.h           |     0
 .../src/{main => include}/TableSessionBuilder.h    |     0
 .../client-cpp/src/{main => include}/TsBlock.h     |     0
 iotdb-client/client-cpp/src/main/CMakeLists.txt    |    90 -
 iotdb-client/client-cpp/src/main/SessionDataSet.h  |   124 -
 .../src/{main => rpc}/IoTDBRpcDataSet.cpp          |    74 +-
 .../client-cpp/src/{main => rpc}/IoTDBRpcDataSet.h |    51 +-
 .../client-cpp/src/{main => rpc}/NodesSupplier.cpp |    11 +-
 .../client-cpp/src/{main => rpc}/NodesSupplier.h   |     9 +-
 iotdb-client/client-cpp/src/rpc/RpcCommon.cpp      |   214 +
 iotdb-client/client-cpp/src/rpc/RpcCommon.h        |    81 +
 .../src/{main => rpc}/SessionConnection.cpp        |    34 +-
 .../src/{main => rpc}/SessionConnection.h          |    20 +-
 .../client-cpp/src/rpc/SessionDataSetFactory.h     |    42 +
 iotdb-client/client-cpp/src/rpc/SessionImpl.h      |   231 +
 .../src/{main => rpc}/ThriftConnection.cpp         |    16 +-
 .../src/{main => rpc}/ThriftConnection.h           |     4 +-
 iotdb-client/client-cpp/src/rpc/ThriftConvert.cpp  |    61 +
 .../client-cpp/src/rpc/ThriftConvert.h             |    36 +-
 .../client-cpp/src/{main => session}/Column.cpp    |     0
 .../src/{main => session}/ColumnDecoder.cpp        |     0
 .../client-cpp/src/{main => session}/Common.cpp    |   224 +-
 iotdb-client/client-cpp/src/session/Date.cpp       |    63 +
 .../client-cpp/src/{main => session}/Session.cpp   |   490 +-
 .../client-cpp/src/{main => session}/SessionC.cpp  |    33 +
 .../client-cpp/src/session/SessionDataSet.cpp      |   320 +
 .../src/{main => session}/SessionPool.cpp          |     0
 .../src/{main => session}/TableSession.cpp         |     0
 .../client-cpp/src/{main => session}/TsBlock.cpp   |     0
 iotdb-client/client-cpp/src/test/CMakeLists.txt    |   152 -
 iotdb-client/client-cpp/src/test/catch2/catch.hpp  | 17974 -------------------
 iotdb-client/client-cpp/test/CMakeLists.txt        |   104 +
 iotdb-client/client-cpp/test/catch2/.gitignore     |     4 +
 .../client-cpp/{src => }/test/cpp/sessionCIT.cpp   |    42 +-
 .../{src => }/test/cpp/sessionCRelationalIT.cpp    |     0
 .../client-cpp/{src => }/test/cpp/sessionIT.cpp    |     7 +-
 .../{src => }/test/cpp/sessionRelationalIT.cpp     |     7 +-
 iotdb-client/client-cpp/{src => }/test/main.cpp    |     0
 .../client-cpp/{src => }/test/main_Relational.cpp  |     0
 iotdb-client/client-cpp/{src => }/test/main_c.cpp  |     0
 .../{src => }/test/main_c_Relational.cpp           |     0
 iotdb-client/client-cpp/third-party/.gitignore     |     7 +
 iotdb-client/client-cpp/third-party/README.md      |    75 +
 .../client-cpp/third-party/linux/.gitignore        |     2 +
 iotdb-client/client-cpp/third-party/mac/.gitignore |     2 +
 .../client-cpp/third-party/windows/.gitignore      |     2 +
 .../org/apache/iotdb/isession/SessionConfig.java   |     2 +
 iotdb-client/jdbc/README.md                        |     4 +-
 .../main/java/org/apache/iotdb/jdbc/Config.java    |     4 +
 .../org/apache/iotdb/jdbc/IoTDBConnection.java     |     5 +-
 .../apache/iotdb/jdbc/IoTDBConnectionParams.java   |     9 +
 .../apache/iotdb/jdbc/IoTDBDataSourceFactory.java  |     1 +
 .../java/org/apache/iotdb/jdbc/IoTDBDriver.java    |     5 +
 .../src/main/java/org/apache/iotdb/jdbc/Utils.java |     7 +
 .../iotdb/jdbc/IoTDBDataSourceFactoryTest.java     |     2 +
 .../org/apache/iotdb/jdbc/IoTDBDriverTest.java     |     2 +
 .../test/java/org/apache/iotdb/jdbc/UtilsTest.java |    11 +
 .../apache/iotdb/rpc/BaseRpcTransportFactory.java  |    29 +-
 .../java/org/apache/iotdb/rpc/RpcSslUtils.java     |   245 +
 .../main/java/org/apache/iotdb/rpc/RpcUtils.java   |    12 +-
 .../java/org/apache/iotdb/rpc/TSStatusCode.java    |     9 +-
 .../java/org/apache/iotdb/rpc/RpcUtilsTest.java    |    32 +
 .../iotdb/session/AbstractSessionBuilder.java      |     2 +
 .../org/apache/iotdb/session/NodesSupplier.java    |     6 +
 .../java/org/apache/iotdb/session/Session.java     |    10 +
 .../apache/iotdb/session/SessionConnection.java    |    33 +-
 .../apache/iotdb/session/TableSessionBuilder.java  |    12 +
 .../org/apache/iotdb/session/ThriftConnection.java |     6 +-
 .../org/apache/iotdb/session/pool/SessionPool.java |    13 +
 .../session/pool/TableSessionPoolBuilder.java      |    12 +
 .../src/test/resources/iotdb-common.properties     |     2 +-
 iotdb-client/subscription/pom.xml                  |     5 +
 .../subscription/i18n/SubscriptionMessages.java    |    25 +
 .../subscription/i18n/SubscriptionMessages.java    |    20 +
 .../rpc/subscription/config/ConsumerConfig.java    |    10 +
 .../rpc/subscription/config/ConsumerConstant.java  |     2 +
 .../iotdb/rpc/subscription/config/TopicConfig.java |    89 +-
 .../rpc/subscription/config/TopicConstant.java     |    19 +
 .../SubscriptionOwnerFencedException.java          |    27 +-
 .../subscription/payload/poll/RegionProgress.java  |    85 +
 .../payload/poll/SubscriptionCommitContext.java    |   222 +-
 .../payload/poll/SubscriptionPollRequest.java      |    49 +-
 .../payload/poll/SubscriptionPollResponse.java     |    10 +-
 .../payload/poll/SubscriptionPollResponseType.java |     7 +
 .../subscription/payload/poll/TopicProgress.java   |    94 +
 .../payload/poll/WatermarkPayload.java             |    82 +
 .../rpc/subscription/payload/poll/WriterId.java    |    77 +
 .../subscription/payload/poll/WriterProgress.java  |    77 +
 .../payload/request/PipeSubscribeRequestType.java  |     1 +
 .../payload/request/SubscriptionHeartbeatReq.java  |   128 +
 .../payload/request/SubscriptionSeekReq.java       |   164 +
 .../payload/response/PipeSubscribeCommitResp.java  |    85 +-
 .../PipeSubscribeSeekResp.java}                    |    47 +-
 .../subscription/AbstractSubscriptionSession.java  |    99 +-
 .../subscription/ISubscriptionTableSession.java    |    43 +
 .../subscription/ISubscriptionTreeSession.java     |    43 +
 .../subscription/SubscriptionTableSession.java     |    22 +
 .../SubscriptionTableSessionBuilder.java           |     5 +
 .../subscription/SubscriptionTreeSession.java      |    22 +
 .../SubscriptionTreeSessionBuilder.java            |     5 +
 .../consumer/ISubscriptionTablePullConsumer.java   |    25 +
 .../consumer/ISubscriptionTreePullConsumer.java    |    25 +
 .../base/AbstractSubscriptionConsumer.java         |   655 +-
 .../base/AbstractSubscriptionConsumerBuilder.java  |    23 +
 .../base/AbstractSubscriptionProvider.java         |   186 +-
 .../base/AbstractSubscriptionProviders.java        |     5 +-
 .../base/AbstractSubscriptionPullConsumer.java     |   411 +-
 .../base/AbstractSubscriptionPushConsumer.java     |    16 +
 .../consumer/base/ColumnAlignProcessor.java        |   186 +
 .../base/SubscriptionMessageProcessor.java         |    82 +
 .../consumer/base/WatermarkProcessor.java          |   335 +
 .../consumer/table/SubscriptionTableProvider.java  |    11 +-
 .../table/SubscriptionTablePullConsumer.java       |    31 +
 .../SubscriptionTablePullConsumerBuilder.java      |    18 +
 .../table/SubscriptionTablePushConsumer.java       |     4 +
 .../SubscriptionTablePushConsumerBuilder.java      |    18 +
 .../consumer/tree/SubscriptionTreeProvider.java    |    11 +-
 .../tree/SubscriptionTreePullConsumer.java         |    48 +
 .../tree/SubscriptionTreePullConsumerBuilder.java  |    18 +
 .../tree/SubscriptionTreePushConsumer.java         |    21 +
 .../tree/SubscriptionTreePushConsumerBuilder.java  |    18 +
 .../session/subscription/payload/PollResult.java   |    67 +
 .../subscription/payload/SubscriptionMessage.java  |    57 +-
 .../payload/SubscriptionMessageType.java           |     1 +
 .../poll/SubscriptionCommitContextTest.java        |   148 +
 .../payload/poll/SubscriptionPollRequestTest.java  |    62 +
 .../payload/request/SubscriptionSeekReqTest.java   |    53 +
 .../consumer/base/ColumnAlignProcessorTest.java    |   255 +
 .../consumer/base/WatermarkProcessorTest.java      |   224 +
 iotdb-core/ainode/iotdb/ainode/core/constant.py    |     1 +
 iotdb-core/ainode/iotdb/ainode/core/rpc/client.py  |    11 +-
 .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4   |    15 +-
 iotdb-core/calc-commons/pom.xml                    |     5 +
 .../src/main/codegen/templates/nextFill.ftl        |   101 +
 .../org/apache/iotdb/calc/i18n/CalcMessages.java   |    10 +
 .../org/apache/iotdb/calc/i18n/CalcMessages.java   |     9 +
 .../operator/process/TableNextFillOperator.java    |    81 +
 .../process/TableNextFillWithGroupOperator.java    |   165 +
 .../fill/filter/FixedIntervalFillFilter.java       |    10 +-
 .../operator/process/fill/next/NextFill.java       |   182 +
 .../operator/source/relational/Percentile.java     |   173 +
 .../relational/aggregation/AccumulatorFactory.java |    28 +-
 .../relational/aggregation/ExtremeAccumulator.java |    32 +-
 .../aggregation/PercentileAccumulator.java         |   266 +
 .../grouped/GroupedExtremeAccumulator.java         |    70 +-
 .../grouped/GroupedPercentileAccumulator.java      |   291 +
 .../grouped/array/PercentileBigArray.java          |    73 +
 .../queue/IndexedBlockingReserveQueue.java         |    36 +-
 .../calc/plan/planner/CommonOperatorUtils.java     |   105 +-
 .../calc/plan/planner/TableOperatorGenerator.java  |   212 +-
 .../iotdb/calc/utils/constant/SqlConstant.java     |     1 +
 .../fill/filter/FixedIntervalFillFilterTest.java}  |    24 +-
 .../aggregation/ExtremeAccumulatorTest.java        |   150 +
 .../iotdb/confignode/i18n/ConfigNodeMessages.java  |     3 +
 .../iotdb/confignode/i18n/ManagerMessages.java     |    14 +-
 .../iotdb/confignode/i18n/ProcedureMessages.java   |     7 +-
 .../iotdb/confignode/i18n/ConfigNodeMessages.java  |     3 +
 .../iotdb/confignode/i18n/ManagerMessages.java     |    20 +-
 .../iotdb/confignode/i18n/ProcedureMessages.java   |     7 +-
 .../async/AsyncAINodeHeartbeatClientPool.java      |    12 +-
 .../async/AsyncConfigNodeHeartbeatClientPool.java  |    12 +-
 .../async/AsyncDataNodeHeartbeatClientPool.java    |    22 +-
 .../client/async/CnToDnAsyncRequestType.java       |     3 +
 .../CnToDnInternalServiceAsyncRequestManager.java  |    19 +
 .../handlers/heartbeat/AINodeHeartbeatHandler.java |     2 +-
 .../heartbeat/DataNodeHeartbeatHandler.java        |   125 +-
 .../rpc/CheckTimeSeriesExistenceRPCHandler.java    |     2 +-
 .../rpc/CountPathsUsingTemplateRPCHandler.java     |     2 +-
 .../rpc/DataNodeAsyncRequestRPCHandler.java        |    10 +
 .../handlers/rpc/DataNodeTSStatusRPCHandler.java   |    16 +-
 .../rpc/FetchSchemaBlackListRPCHandler.java        |     2 +-
 .../async/handlers/rpc/SchemaUpdateRPCHandler.java |     2 +-
 .../CheckSchemaRegionUsingTemplateRPCHandler.java  |     2 +-
 .../ConsumerGroupPushMetaRPCHandler.java           |    11 +-
 ...dler.java => PullCommitProgressRPCHandler.java} |    28 +-
 .../rpc/subscription/TopicPushMetaRPCHandler.java  |    11 +-
 .../iotdb/confignode/conf/ConfigNodeConfig.java    |    81 +-
 .../confignode/conf/ConfigNodeDescriptor.java      |   207 +-
 .../consensus/request/ConfigPhysicalPlan.java      |     4 +
 .../consensus/request/ConfigPhysicalPlanType.java  |     2 +
 .../CommitProgressHandleMetaChangePlan.java        |    78 +
 .../consensus/response/cq/ShowCQResp.java          |     2 +-
 .../externalservice/ShowExternalServiceResp.java   |     2 +-
 .../statemachine/ConfigRegionStateMachine.java     |   404 +-
 .../iotdb/confignode/manager/ConfigManager.java    |   160 +-
 .../apache/iotdb/confignode/manager/IManager.java  |     4 +
 .../iotdb/confignode/manager/ProcedureManager.java |   118 +-
 .../confignode/manager/RetryFailedTasksThread.java |    23 +-
 .../manager/consensus/ConsensusManager.java        |   104 +-
 .../iotdb/confignode/manager/load/LoadManager.java |    81 +
 .../manager/load/balancer/RegionBalancer.java      |    24 +-
 .../manager/load/balancer/RouteBalancer.java       |     9 +-
 .../balancer/router/leader/HashLeaderBalancer.java |     2 +-
 .../manager/load/cache/AbstractLoadCache.java      |     6 +-
 .../confignode/manager/load/cache/LoadCache.java   |    27 +
 .../load/cache/consensus/ConsensusGroupCache.java  |     2 +-
 .../manager/load/service/EventService.java         |    23 +-
 .../manager/load/service/HeartbeatService.java     |    23 +-
 .../manager/load/service/StatisticsService.java    |    23 +-
 .../manager/load/service/TopologyService.java      |    17 +-
 .../iotdb/confignode/manager/node/NodeManager.java |     8 +-
 .../manager/partition/PartitionManager.java        |    26 +-
 .../agent/runtime/PipeConfigNodeRuntimeAgent.java  |    17 +-
 .../pipe/agent/task/PipeConfigNodeSubtask.java     |    21 +-
 .../pipe/coordinator/runtime/PipeMetaSyncer.java   |    26 +-
 .../runtime/heartbeat/PipeHeartbeatParser.java     |    43 +-
 .../runtime/heartbeat/PipeHeartbeatScheduler.java  |    20 +-
 .../pipe/coordinator/task/PipeTaskCoordinator.java |     8 +-
 .../coordinator/task/PipeTaskCoordinatorLock.java  |    22 +-
 .../receiver/protocol/IoTDBConfigNodeReceiver.java |     4 +-
 .../manager/schema/ClusterSchemaManager.java       |    14 +-
 .../schema/ClusterSchemaQuotaStatistics.java       |     2 +-
 .../subscription/SubscriptionCoordinator.java      |   123 +
 .../manager/subscription/SubscriptionManager.java  |    15 +
 .../subscription/SubscriptionMetaSyncer.java       |     7 +
 .../subscription/SubscriptionOwnerLeaseSyncer.java |    97 +
 .../runtime/SubscriptionLeaderChangeHandler.java   |    43 +
 .../runtime/SubscriptionRuntimeCoordinator.java    |   160 +
 .../persistence/executor/ConfigPlanExecutor.java   |    12 +-
 .../confignode/persistence/pipe/PipeInfo.java      |     8 +-
 .../confignode/persistence/pipe/PipeTaskInfo.java  |    64 +-
 .../mnode/container/ConfigMNodeContainer.java      |     2 +-
 .../persistence/subscription/SubscriptionInfo.java |   331 +
 .../iotdb/confignode/procedure/Procedure.java      |    20 +
 .../confignode/procedure/ProcedureExecutor.java    |   134 +-
 .../procedure/TimeoutExecutorThread.java           |    32 +-
 .../procedure/env/ConfigNodeProcedureEnv.java      |   403 +-
 .../procedure/env/RegionMaintainHandler.java       |    23 +
 .../procedure/env/RemoveDataNodeHandler.java       |    52 +-
 .../procedure/impl/StateMachineProcedure.java      |     3 +-
 .../procedure/impl/cq/CreateCQProcedure.java       |     2 +-
 .../procedure/impl/node/AbstractNodeProcedure.java |    12 +
 .../impl/pipe/AbstractOperatePipeProcedureV2.java  |    45 +-
 .../pipe/plugin/CreatePipePluginProcedure.java     |     2 +-
 .../impl/pipe/plugin/DropPipePluginProcedure.java  |     2 +-
 .../runtime/PipeHandleLeaderChangeProcedure.java   |    40 +-
 .../runtime/PipeHandleMetaChangeProcedure.java     |    37 +-
 .../impl/pipe/runtime/PipeMetaSyncProcedure.java   |    12 +-
 .../impl/pipe/task/DropPipeProcedureV2.java        |     2 +-
 .../impl/pipe/task/StartPipeProcedureV2.java       |     2 +-
 .../impl/pipe/task/StopPipeProcedureV2.java        |     2 +-
 .../impl/region/AddRegionPeerProcedure.java        |    30 +-
 .../impl/region/CreateRegionGroupsProcedure.java   |    10 +-
 .../schema/AlterEncodingCompressorProcedure.java   |     2 +-
 .../schema/AlterTimeSeriesDataTypeProcedure.java   |     2 +-
 .../impl/schema/DeleteDatabaseProcedure.java       |     2 +-
 .../impl/schema/DeleteLogicalViewProcedure.java    |     2 +-
 .../impl/schema/DeleteTimeSeriesProcedure.java     |     2 +-
 .../AbstractOperateSubscriptionProcedure.java      |    21 +
 .../impl/subscription/SubscriptionOperation.java   |     2 +
 .../runtime/CommitProgressSyncProcedure.java       |   320 +
 .../runtime/ConsumerGroupMetaSyncProcedure.java    |    10 +-
 .../SubscriptionHandleLeaderChangeProcedure.java   |   445 +
 .../subscription/CreateSubscriptionProcedure.java  |    85 +-
 .../subscription/DropSubscriptionProcedure.java    |    14 +
 .../topic/runtime/TopicMetaSyncProcedure.java      |     9 +-
 .../impl/trigger/CreateTriggerProcedure.java       |     2 +-
 .../impl/trigger/DropTriggerProcedure.java         |     2 +-
 .../confignode/procedure/scheduler/LockQueue.java  |    10 +-
 .../scheduler/SimpleProcedureScheduler.java        |    37 +-
 .../procedure/store/ProcedureFactory.java          |    12 +
 .../confignode/procedure/store/ProcedureType.java  |     2 +
 .../iotdb/confignode/service/ConfigNode.java       |     8 +-
 .../thrift/ConfigNodeRPCServiceProcessor.java      |    22 +-
 .../manager/consensus/ConsensusManagerTest.java    |   116 +
 .../confignode/manager/load/LoadManagerTest.java   |    70 +
 .../router/leader/HashLeaderBalancerTest.java      |    65 +
 .../task/PipeTaskCoordinatorLockTest.java          |    60 +
 .../pipe/sink/PipeConfigNodeThriftRequestTest.java |   212 +
 .../pipe/PipeTaskInfoAutoRestartTest.java          |   169 +-
 .../pipe/PipeTaskInfoConsensusPipeTest.java        |     4 +-
 .../subscription/SubscriptionInfoTest.java         |   194 +
 .../SubscriptionInfoTopicValidationTest.java       |   248 +
 .../iotdb/confignode/procedure/TestLockRegime.java |    23 +
 .../procedure/TestProcedureExecutor.java           |    92 +
 .../procedure/entity/SimpleLockProcedure.java      |    11 +-
 .../PipeHandleLeaderChangeProcedureTest.java       |    47 +
 .../DropSubscriptionProcedureTest.java             |     3 +
 .../thrift/ConfigNodeRPCServiceProcessorTest.java  |    47 +
 iotdb-core/consensus/pom.xml                       |     4 +-
 .../org/apache/iotdb/consensus/IStateMachine.java  |    28 +-
 .../DeserializedBatchIndexedConsensusRequest.java  |    29 +-
 .../common/request/IndexedConsensusRequest.java    |    66 +-
 .../iotdb/consensus/config/IoTConsensusConfig.java |    33 +-
 .../apache/iotdb/consensus/config/RatisConfig.java |    22 +-
 .../apache/iotdb/consensus/iot/IoTConsensus.java   |    36 +
 .../consensus/iot/IoTConsensusServerImpl.java      |   371 +-
 .../iot/SubscriptionWalRetentionPolicy.java}       |    48 +-
 .../org/apache/iotdb/consensus/iot/WriterMeta.java |   112 +
 .../consensus/iot/WriterSafeFrontierTracker.java   |   145 +
 .../iot/client/AsyncIoTConsensusServiceClient.java |     2 +-
 .../consensus/iot/client/DispatchLogHandler.java   |    45 +-
 .../iot/client/SyncIoTConsensusServiceClient.java  |     3 +-
 .../consensus/iot/log/ConsensusReqReader.java      |    90 +
 .../consensus/iot/logdispatcher/LogDispatcher.java |    82 +-
 .../consensus/iot/logdispatcher/SyncStatus.java    |     4 +
 .../service/IoTConsensusRPCServiceProcessor.java   |    43 +-
 .../subscription/SubscriptionQueueRegistry.java    |   124 +
 .../SubscriptionWalRetentionCalculator.java        |   126 +
 .../ratis/ApplicationStateMachineProxy.java        |    13 +-
 .../apache/iotdb/consensus/ratis/RatisClient.java  |    31 +-
 .../iotdb/consensus/ratis/RatisConsensus.java      |     2 +-
 .../utils/NoHostnameVerificationTrustManager.java  |    88 -
 .../apache/iotdb/consensus/ratis/utils/Utils.java  |    35 +-
 .../simple/SimpleConsensusServerImpl.java          |     4 +-
 .../apache/iotdb/consensus/EmptyStateMachine.java  |     4 +-
 .../iot/AddPeerSnapshotLoadFailureTest.java        |   354 +
 .../apache/iotdb/consensus/iot/WriterMetaTest.java |    76 +
 .../iot/WriterSafeFrontierTrackerTest.java         |    56 +
 .../consensus/iot/util/FakeConsensusReqReader.java |    20 +
 .../iotdb/consensus/iot/util/TestStateMachine.java |    12 +-
 .../apache/iotdb/consensus/ratis/TestUtils.java    |     4 +-
 .../consensus/simple/SimpleConsensusTest.java      |     4 +-
 iotdb-core/datanode/pom.xml                        |     8 +-
 .../apache/iotdb/db/i18n/DataNodeMiscMessages.java |    23 +
 .../apache/iotdb/db/i18n/DataNodePipeMessages.java |    51 +
 .../iotdb/db/i18n/DataNodeQueryMessages.java       |    11 +-
 .../iotdb/db/i18n/StorageEngineMessages.java       |    16 +
 .../apache/iotdb/db/i18n/DataNodeMiscMessages.java |    22 +
 .../apache/iotdb/db/i18n/DataNodePipeMessages.java |    55 +-
 .../iotdb/db/i18n/DataNodeQueryMessages.java       |    11 +-
 .../iotdb/db/i18n/StorageEngineMessages.java       |    16 +
 .../org/apache/iotdb/db/audit/DNAuditLogger.java   |     2 +-
 .../apache/iotdb/db/conf/DataNodeMemoryConfig.java |    18 +
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |    46 +-
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |    60 +-
 .../iotdb/db/conf/rest/IoTDBRestServiceConfig.java |    13 +-
 .../db/conf/rest/IoTDBRestServiceDescriptor.java   |     4 +
 .../db/consensus/DataRegionConsensusImpl.java      |     6 +
 .../db/consensus/SchemaRegionConsensusImpl.java    |     3 +
 .../dataregion/DataExecutionVisitor.java           |     9 +-
 .../dataregion/DataRegionStateMachine.java         |    53 +-
 .../IoTConsensusDataRegionStateMachine.java        |     8 +-
 .../schemaregion/SchemaRegionStateMachine.java     |    25 +-
 .../agent/runtime/PipeDataNodeRuntimeAgent.java    |    16 +-
 .../db/pipe/agent/task/PipeDataNodeTaskAgent.java  |   129 +-
 .../task/execution/PipeSubtaskExecutorManager.java |    24 +-
 .../subtask/processor/PipeProcessorSubtask.java    |     4 +-
 .../agent/task/subtask/sink/PipeSinkSubtask.java   |    36 +-
 .../subtask/sink/PipeSinkSubtaskLifeCycle.java     |     8 +-
 .../task/subtask/sink/PipeSinkSubtaskManager.java  |    57 +-
 .../db/pipe/event/common/PipeInsertionEvent.java   |     2 +-
 .../db/pipe/event/common/row/PipeRowCollector.java |    24 +-
 .../common/tablet/PipeRawTabletEventConverter.java |    42 +-
 .../event/common/tablet/PipeTabletCollector.java   |    23 +-
 .../tablet/parser/TabletInsertionEventParser.java  |   123 +-
 .../scan/AlignedSinglePageWholeChunkReader.java    |     2 +-
 .../parser/scan/SinglePageWholeChunkReader.java    |     2 +-
 .../metric/schema/PipeSchemaRegionSinkMetrics.java |    12 +-
 .../metric/sink/PipeDataRegionSinkMetrics.java     |    15 +-
 .../processor/aggregate/AggregateProcessor.java    |    13 +-
 .../downsampling/changing/ChangingValueFilter.java |    20 +-
 .../sdt/SwingingDoorTrendingFilter.java            |    19 +-
 .../tumbling/TumblingTimeSamplingProcessor.java    |     7 +-
 .../exchange/sender/TwoStageAggregateSender.java   |     2 +-
 .../twostage/plugin/TwoStageCountProcessor.java    |     9 +-
 .../legacy/IoTDBLegacyPipeReceiverAgent.java       |     3 +-
 .../protocol/thrift/IoTDBDataNodeReceiver.java     |   126 +-
 .../statement/PipeConvertedInsertRowStatement.java |     9 +
 ...aNodeHardlinkOrCopiedFileDirStartupCleaner.java |   254 +-
 .../resource/log/PipePeriodicalLogReducer.java     |    93 -
 .../resource/memory/InsertNodeMemoryEstimator.java |    15 +-
 .../resource/memory/PipeDynamicMemoryBlock.java    |     2 +-
 .../tsfile/PipeTsFileResourceSegmentLock.java      |    10 +-
 .../evolvable/batch/PipeTabletEventPlainBatch.java |    22 +-
 .../batch/PipeTransferBatchReqBuilder.java         |    43 +-
 .../request/PipeTransferTabletBatchReq.java        |    98 +-
 .../request/PipeTransferTabletRawReq.java          |    98 +-
 .../thrift/async/IoTDBDataRegionAsyncSink.java     |   116 +
 .../handler/PipeTransferTrackableHandler.java      |    56 +-
 .../async/handler/PipeTransferTsFileHandler.java   |     2 +-
 .../pipe/sink/util/TabletStatementConverter.java   |   116 +-
 ...istoricalDataRegionTsFileAndDeletionSource.java |   136 +-
 .../PipeTsFileEpochProgressIndexKeeper.java        |     2 +-
 .../listener/PipeInsertionDataNodeListener.java    |     2 +-
 .../iotdb/db/protocol/client/ConfigNodeClient.java |    63 +-
 .../iotdb/db/protocol/client/an/AINodeClient.java  |     3 +-
 .../protocol/thrift/impl/ClientRPCServiceImpl.java |    10 +-
 .../impl/DataNodeInternalRPCServiceImpl.java       |   108 +-
 .../db/queryengine/common/MPPQueryContext.java     |    10 +
 .../db/queryengine/execution/StateMachine.java     |     8 +-
 .../execution/aggregation/ExtremeAccumulator.java  |    32 +-
 .../SlidingWindowAggregatorFactory.java            |    36 +-
 .../execution/operator/ExplainAnalyzeOperator.java |    70 +-
 .../InformationSchemaContentSupplierFactory.java   |     4 +-
 .../execution/operator/window/SessionWindow.java   |    24 +-
 .../operator/window/SessionWindowManager.java      |     2 +-
 .../execution/schedule/DriverScheduler.java        |    15 +-
 .../multilevelqueue/MultilevelPriorityQueue.java   |    10 +
 .../execution/schedule/task/DriverTask.java        |    13 +
 .../execution/schedule/task/DriverTaskId.java      |     2 +-
 .../metric/DriverSchedulerMetricSet.java           |    13 +
 .../iotdb/db/queryengine/plan/Coordinator.java     |    32 +-
 .../db/queryengine/plan/analyze/AnalyzeUtils.java  |    34 +-
 .../plan/analyze/ClusterPartitionFetcher.java      |    38 +-
 .../plan/analyze/load/LoadTsFileAnalyzer.java      |     3 +-
 .../analyze/load/LoadTsFileTableSchemaCache.java   |    31 +-
 .../load/TreeSchemaAutoCreatorAndVerifier.java     |    17 +-
 .../plan/analyze/schema/NormalSchemaFetcher.java   |     4 +-
 .../plan/execution/config/ConfigExecution.java     |     2 +-
 .../execution/config/TableConfigTaskVisitor.java   |    13 +
 .../execution/config/TreeConfigTaskVisitor.java    |    12 +
 .../config/executor/ClusterConfigTaskExecutor.java |    59 +-
 .../config/executor/IConfigTaskExecutor.java       |     3 +
 .../config/metadata/relational/ShowDBTask.java     |     4 +-
 .../config/sys/subscription/AlterTopicTask.java    |    49 +
 .../TableModelStatementMemorySourceVisitor.java    |    54 +-
 .../plan/expression/unary/InExpression.java        |     2 +-
 .../db/queryengine/plan/parser/ASTVisitor.java     |    17 +
 .../planner/DataNodeTableOperatorGenerator.java    |    12 +-
 .../plan/AbstractFragmentParallelPlanner.java      |     7 +-
 .../planner/plan/node/PlanGraphJsonPrinter.java    |   225 +
 .../plan/planner/plan/node/PlanGraphPrinter.java   |    15 +
 .../plan/node/load/LoadSingleTsFileNode.java       |    36 +-
 .../metadata/read/LevelTimeSeriesCountNode.java    |     2 +-
 .../node/metadata/read/TimeSeriesCountNode.java    |     2 +-
 .../metadata/read/TimeSeriesSchemaScanNode.java    |     2 +-
 .../plan/node/pipe/PipeEnrichedDeleteDataNode.java |    55 +
 .../plan/node/pipe/PipeEnrichedInsertNode.java     |    44 +
 .../planner/plan/node/write/DeleteDataNode.java    |     7 +-
 .../plan/node/write/InsertMultiTabletsNode.java    |    24 +
 .../plan/planner/plan/node/write/InsertNode.java   |    79 +-
 .../planner/plan/node/write/InsertRowNode.java     |   218 +-
 .../planner/plan/node/write/InsertRowsNode.java    |    24 +
 .../plan/node/write/InsertRowsOfOneDeviceNode.java |    26 +-
 .../planner/plan/node/write/InsertTabletNode.java  |   383 +-
 .../plan/node/write/RelationalDeleteDataNode.java  |    26 +-
 .../plan/node/write/RelationalInsertRowNode.java   |    63 +-
 .../plan/node/write/RelationalInsertRowsNode.java  |    48 +-
 .../node/write/RelationalInsertTabletNode.java     |   114 +-
 .../plan/planner/plan/node/write/SearchNode.java   |    65 +
 .../relational/analyzer/AggregationAnalyzer.java   |    84 +-
 .../plan/relational/analyzer/Analysis.java         |    26 +
 .../relational/analyzer/StatementAnalyzer.java     |   360 +-
 .../relational/metadata/TableMetadataImpl.java     |    28 +-
 .../fetcher/cache/TreeDeviceNormalSchema.java      |     4 +-
 .../cache/TreeDeviceSchemaCacheManager.java        |     9 +-
 .../plan/relational/planner/CteMaterializer.java   |     1 +
 .../plan/relational/planner/QueryPlanner.java      |    22 +
 .../plan/relational/planner/RelationPlanner.java   |    31 +-
 .../relational/planner/TableLogicalPlanner.java    |     3 +-
 .../distribute/TableDistributedPlanner.java        |    16 +-
 ...ithUncorrelatedScalarSubqueryReconstructor.java |     2 +
 .../planner/iterative/rule/PruneFillColumns.java   |     5 +
 .../planner/node/ExplainAnalyzeNode.java           |    39 +-
 .../PushLimitOffsetIntoTableScan.java              |     7 +
 .../optimizations/UnaliasSymbolReferences.java     |    35 +-
 .../security/TreeAccessCheckVisitor.java           |     7 +
 .../sql/ast/{PipeEnriched.java => AlterTopic.java} |    53 +-
 .../plan/relational/sql/ast/AstVisitor.java        |     4 +
 .../plan/relational/sql/ast/Explain.java           |    28 +-
 .../plan/relational/sql/ast/ExplainAnalyze.java    |    37 +-
 .../relational/sql/ast/ExplainOutputFormat.java    |    31 +-
 .../plan/relational/sql/ast/InsertRow.java         |     5 +-
 .../plan/relational/sql/ast/InsertRows.java        |    14 +-
 .../plan/relational/sql/ast/InsertTablet.java      |    13 +-
 .../plan/relational/sql/ast/PipeEnriched.java      |     2 +-
 .../relational/sql/ast/WrappedInsertStatement.java |    22 +-
 .../plan/relational/sql/parser/AstBuilder.java     |   103 +-
 .../plan/relational/sql/parser/ErrorHandler.java   |     6 +-
 .../relational/sql/util/DataNodeSqlFormatter.java  |    26 +
 .../scheduler/load/LoadTsFileDispatcherImpl.java   |     8 +-
 .../plan/scheduler/load/LoadTsFileScheduler.java   |    88 +-
 .../queryengine/plan/statement/StatementType.java  |     1 +
 .../plan/statement/StatementVisitor.java           |     5 +
 .../plan/statement/crud/InsertBaseStatement.java   |   210 +-
 .../plan/statement/crud/InsertRowStatement.java    |   128 +-
 .../crud/InsertRowsOfOneDeviceStatement.java       |    12 +
 .../plan/statement/crud/InsertTabletStatement.java |   161 +-
 .../statement/metadata/ShowDatabaseStatement.java  |     8 +-
 .../metadata/subscription/AlterTopicStatement.java |    73 +
 .../FragmentInstanceStatisticsJsonDrawer.java      |   372 +
 .../schemaengine/schemaregion/ISchemaRegion.java   |    10 +-
 .../GeneralRegionAttributeSecurityService.java     |    67 +-
 .../schemaregion/impl/SchemaRegionMemoryImpl.java  |     6 +-
 .../schemaregion/impl/SchemaRegionPBTreeImpl.java  |     6 +-
 .../logfile/FakeCRC32Deserializer.java             |     3 +-
 .../schemaregion/logfile/SchemaLogReader.java      |     2 +-
 .../mem/mnode/container/MemMNodeContainer.java     |     2 +-
 .../mtree/impl/pbtree/flush/Scheduler.java         |    69 +-
 .../mnode/container/CachedMNodeContainer.java      |     3 +-
 .../pbtree/schemafile/pagemgr/PageManager.java     |     9 +-
 .../db/schemaengine/table/DataNodeTableCache.java  |    47 +-
 .../schemaengine/table/InformationSchemaUtils.java |     7 +-
 .../iotdb/db/service/DataNodeShutdownHook.java     |    10 +-
 .../iotdb/db/storageengine/StorageEngine.java      |     3 +
 .../buffer/TimeSeriesMetadataCache.java            |    43 +-
 .../db/storageengine/dataregion/DataRegion.java    |    80 +-
 .../utils/writer/AbstractCompactionWriter.java     |   165 +-
 .../writer/AbstractCrossCompactionWriter.java      |     3 +-
 .../writer/AbstractInnerCompactionWriter.java      |     4 +-
 .../utils/writer/FastInnerCompactionWriter.java    |    10 +-
 .../writer/ReadPointCrossCompactionWriter.java     |     5 +-
 .../writer/ReadPointInnerCompactionWriter.java     |     5 +-
 .../writer/RepairUnsortedFileCompactionWriter.java |     4 +-
 .../compaction/schedule/CompactionWorker.java      |     2 +-
 .../dataregion/memtable/AbstractMemTable.java      |   120 +-
 .../memtable/AbstractWritableMemChunk.java         |    17 +
 .../memtable/AlignedWritableMemChunk.java          |     7 +-
 .../dataregion/memtable/TsFileProcessor.java       |   162 +-
 .../dataregion/memtable/WritableMemChunk.java      |     7 +-
 .../dataregion/memtable/WritableMemChunkGroup.java |     2 +-
 .../dataregion/modification/DeletionPredicate.java |     9 +-
 .../dataregion/modification/IDPredicate.java       |    13 +-
 .../dataregion/modification/ModEntry.java          |    12 +-
 .../dataregion/modification/TreeDeletionEntry.java |    11 +-
 .../dataregion/modification/v1/Deletion.java       |    10 +-
 .../dataregion/snapshot/SnapshotLoader.java        |   108 +-
 .../tableDiskUsageIndex/TableDiskUsageIndex.java   |    31 +-
 .../dataregion/wal/buffer/WALBuffer.java           |    22 +-
 .../dataregion/wal/buffer/WALInfoEntry.java        |     9 +-
 .../storageengine/dataregion/wal/io/LogWriter.java |     3 +-
 .../dataregion/wal/io/ProgressWALReader.java       |    85 +
 .../dataregion/wal/io/WALByteBufReader.java        |    73 +
 .../dataregion/wal/io/WALFileVersion.java          |     5 +-
 .../dataregion/wal/io/WALInputStream.java          |     8 +-
 .../dataregion/wal/io/WALMetaData.java             |   242 +-
 .../storageengine/dataregion/wal/io/WALWriter.java |    22 +-
 .../dataregion/wal/node/WALFakeNode.java           |    30 +
 .../storageengine/dataregion/wal/node/WALNode.java |   119 +-
 .../dataregion/wal/utils/WALFileUtils.java         |   211 +
 .../dataregion/wal/utils/WALWriteUtils.java        |    16 +-
 .../db/storageengine/load/LoadTsFileManager.java   |    13 +
 .../storageengine/load/active/ActiveLoadAgent.java |     6 +
 .../load/active/ActiveLoadDirScanner.java          |    17 +-
 .../active/ActiveLoadScheduledExecutorService.java |    21 +-
 .../load/active/ActiveLoadTsFileLoader.java        |    27 +-
 .../load/splitter/AlignedChunkData.java            |     9 +
 .../load/splitter/NonAlignedChunkData.java         |    16 +
 .../agent/SubscriptionBrokerAgent.java             |   734 +-
 .../agent/SubscriptionConsumerAgent.java           |    56 +-
 .../agent/SubscriptionRuntimeAgent.java            |     7 +-
 .../subscription/agent/SubscriptionTopicAgent.java |   114 +-
 .../broker/ConsensusSubscriptionBroker.java        |   836 +
 .../subscription/broker/ISubscriptionBroker.java   |    93 +
 .../db/subscription/broker/SubscriptionBroker.java |    64 +-
 .../broker/SubscriptionPrefetchingQueue.java       |   268 +-
 .../consensus/ConsensusLogToTabletConverter.java   |   843 +
 .../consensus/ConsensusPrefetchingQueue.java       |  3443 ++++
 .../consensus/ConsensusRegionRuntimeState.java     |    86 +
 .../ConsensusSubscriptionCommitManager.java        |  1673 ++
 .../ConsensusSubscriptionSetupHandler.java         |   694 +
 .../broker/consensus/PrefetchRoundResult.java      |    62 +
 .../broker/consensus/ProgressWALIterator.java      |   517 +
 .../consensus/SubscriptionConsensusProgress.java   |   200 +
 .../db/subscription/event/SubscriptionEvent.java   |    20 +-
 .../event/batch/SubscriptionPipeEventBatch.java    |    23 +-
 .../SubscriptionPipeEventBatchSegmentLock.java     |     4 +-
 .../event/batch/SubscriptionPipeEventBatches.java  |    29 +
 ...nsensusSubscriptionPrefetchingQueueMetrics.java |   246 +
 .../subscription/metric/SubscriptionMetrics.java   |     2 +
 .../receiver/SubscriptionReceiverV1.java           |   361 +-
 .../ConsensusSubscriptionPrefetchExecutor.java     |   160 +
 ...nsensusSubscriptionPrefetchExecutorManager.java |    74 +
 .../task/subtask/ConsensusPrefetchSubtask.java     |   244 +
 .../task/subtask/SubscriptionSinkSubtask.java      |    27 +-
 .../subtask/SubscriptionSinkSubtaskLifeCycle.java  |    11 +-
 .../db/trigger/executor/TriggerFireVisitor.java    |    53 +-
 .../java/org/apache/iotdb/db/utils/MemUtils.java   |    71 +-
 .../metadata/mtree/schemafile/SchemaFileTest.java  |    33 +
 .../schemaRegion/SchemaRegionManagementTest.java   |    28 +-
 .../agent/plugin/PipeDataNodePluginAgentTest.java  |    25 +-
 .../agent/task/PipeSinkSubtaskExecutorTest.java    |     1 +
 .../task/subtask/sink/PipeSinkSubtaskTest.java     |    44 +
 .../pipe/event/PipeTabletInsertionEventTest.java   |   113 +
 .../changing/ChangingValueFilterTest.java          |    55 +
 .../sdt/SwingingDoorTrendingFilterTest.java        |    56 +
 .../TumblingTimeSamplingProcessorTest.java         |   192 +
 .../plugin/TwoStageCountProcessorTest.java}        |    29 +-
 .../protocol/thrift/IoTDBDataNodeReceiverTest.java |    53 +-
 .../PipeConvertedInsertRowStatementTest.java       |    55 +
 .../memory/InsertNodeMemoryEstimatorTest.java      |    12 +
 .../tsfile/PipeTsFileResourceSegmentLockTest.java  |    71 +
 .../pipe/sink/PipeDataNodeThriftRequestTest.java   |   627 +
 .../handler/PipeTransferTrackableHandlerTest.java  |    38 +-
 .../sink/util/TabletStatementConverterTest.java    |    64 +
 ...ricalDataRegionTsFileAndDeletionSourceTest.java |   100 +
 .../PipeTsFileEpochProgressIndexKeeperTest.java    |    46 +-
 .../execution/aggregation/AccumulatorTest.java     |    46 +
 .../SlidingWindowAggregatorFactoryTest.java}       |    26 +-
 .../operator/ExplainAnalyzeOperatorTest.java       |    96 +
 .../operator/process/fill/NextFillTest.java        |   299 +
 .../process/window/function/FunctionTestUtils.java |     5 +-
 .../operator/window/SessionWindowTest.java         |    70 +
 .../schedule/DefaultDriverSchedulerTest.java       |    41 +
 .../queryengine/plan/analyze/AnalyzeUtilsTest.java |    74 +
 .../plan/analyze/load/LoadTsFileAnalyzerTest.java  |   133 +-
 ...TableModelStatementMemorySourceVisitorTest.java |    88 +
 .../plan/parser/StatementGeneratorTest.java        |    15 +
 .../distribution/AggregationTableScanTest.java     |     4 +-
 .../planner/node/PlanGraphJsonPrinterTest.java     |   573 +
 .../node/write/DeleteDataNodeSerdeTest.java        |    28 +
 .../planner/node/write/InsertRowNodeSerdeTest.java |   155 +-
 .../node/write/InsertRowsNodeSerdeTest.java        |    35 +
 .../write/InsertRowsOfOneDeviceNodeSerdeTest.java  |    34 +
 .../node/write/InsertTabletNodeSerdeTest.java      |   158 +-
 .../planner/node/write/WritePlanNodeSplitTest.java |    41 +
 .../write/InsertNodeIsMeasurementFailedTest.java   |   255 +
 .../node/write/RelationalDeleteDataNodeTest.java   |     9 +-
 .../analyzer/AggregationCornerCaseTest.java        |    12 +-
 .../relational/analyzer/SelectAliasReuseTest.java  |   347 +
 .../relational/analyzer/TableFunctionTest.java     |   187 +
 .../plan/relational/analyzer/TestMetadata.java     |    13 +
 .../relational/planner/CteMaterializerTest.java    |     1 +
 .../plan/relational/planner/CteSubqueryTest.java   |     1 +
 .../relational/planner/NextFillNodeSerdeTest.java  |   112 +
 .../plan/relational/sql/ExplainFormatTest.java     |   186 +
 .../relational/sql/parser/FillStatementTest.java   |    68 +
 .../relational/sql/parser/TopicStatementTest.java  |    48 +
 .../load/LoadTsFileDispatcherImplTest.java         |    98 +
 .../crud/InsertStatementPartialInsertTest.java     |   320 +
 .../FragmentInstanceStatisticsJsonDrawerTest.java  |   594 +
 .../schemaengine/table/DataNodeTableCacheTest.java |   106 +
 .../buffer/TimeSeriesMetadataCacheTest.java        |   280 +
 .../storageengine/dataregion/DataRegionTest.java   |    30 +-
 .../utils/writer/AbstractCompactionWriterTest.java |   167 +
 .../compaction/repair/AbstractRepairDataTest.java  |    11 +-
 .../AbstractMemTablePartialInsertTest.java         |   113 +
 .../memtable/MemChunkDeserializeTest.java          |    23 +
 .../dataregion/memtable/TsFileProcessorTest.java   |   172 +
 .../modification/TableDeletionEntryTest.java       |     8 +-
 .../modification/TreeDeletionEntryTest.java        |     5 +-
 .../dataregion/modification/v1/DeletionTest.java   |    52 +
 .../dataregion/snapshot/IoTDBSnapshotTest.java     |   124 +
 .../wal/compression/WALCompressionTest.java        |    37 +-
 .../dataregion/wal/io/ProgressWALReaderTest.java   |    93 +
 .../dataregion/wal/io/WALFileTest.java             |     1 +
 .../wal/io/WALMetaDataV3CompatibilityTest.java     |   185 +
 .../wal/node/ConsensusReqReaderTest.java           |    17 +
 .../dataregion/wal/node/WALNodeTest.java           |    66 +
 .../dataregion/wal/utils/WALFileUtilsTest.java     |    74 +
 .../load/splitter/ChunkDataDirectWriteTest.java    |    91 +
 .../ConsensusLogToTabletConverterTest.java         |   266 +
 .../ConsensusSubscriptionCommitStateTest.java      |   314 +
 .../broker/consensus/ProgressWALIteratorTest.java  |   323 +
 .../SubscriptionPipeEventBatchSegmentLockTest.java |    50 +
 .../receiver/SubscriptionReceiverV1Test.java       |    95 +
 .../iotdb/db/utils/ConfigurationFileUtilsTest.java |    90 +-
 .../apache/iotdb/db/utils/EnvironmentUtils.java    |    88 +-
 .../iotdb/db/utils/EnvironmentUtilsTest.java       |    52 +
 .../org/apache/iotdb/db/utils/MemUtilsTest.java    |   127 +
 .../src/test/resources/iotdb-common.properties     |     2 +-
 .../src/test/resources/iotdb-system.properties     |     3 +-
 .../resources/conf/iotdb-system.properties         |     1 -
 .../conf/iotdb-system.properties.template          |    90 +-
 .../apache/iotdb/commons/i18n/CommonMessages.java  |     8 +
 .../apache/iotdb/commons/i18n/UtilMessages.java    |     1 +
 .../apache/iotdb/commons/i18n/CommonMessages.java  |     8 +
 .../apache/iotdb/commons/i18n/UtilMessages.java    |     1 +
 .../async/AsyncAINodeInternalServiceClient.java    |     2 +-
 .../AsyncConfigNodeInternalServiceClient.java      |     2 +-
 .../async/AsyncDataNodeExternalServiceClient.java  |     2 +-
 .../async/AsyncDataNodeInternalServiceClient.java  |     2 +-
 .../AsyncDataNodeMPPDataExchangeServiceClient.java |     2 +-
 .../async/AsyncIoTConsensusV2ServiceClient.java    |     2 +-
 .../async/AsyncPipeDataTransferServiceClient.java  |     2 +-
 .../client/request/AsyncRequestManager.java        |    19 +-
 .../commons/client/sync/SyncAINodeClient.java      |     3 +-
 .../client/sync/SyncConfigNodeIServiceClient.java  |     3 +-
 .../sync/SyncDataNodeInternalServiceClient.java    |     3 +-
 .../SyncDataNodeMPPDataExchangeServiceClient.java  |     3 +-
 .../sync/SyncIoTConsensusV2ServiceClient.java      |     3 +-
 .../iotdb/commons/concurrent/ThreadName.java       |     9 +-
 .../apache/iotdb/commons/conf/CommonConfig.java    |   209 +-
 .../iotdb/commons/conf/CommonDescriptor.java       |   146 +
 .../iotdb/commons/conf/ConfigurationFileUtils.java |    16 +-
 .../commons/consensus/index/ProgressIndex.java     |    11 +
 .../iotdb/commons/partition/DataPartition.java     |    18 +-
 .../plugin/constructor/PipeSinkConstructor.java    |     8 +-
 .../agent/task/execution/PipeSubtaskExecutor.java  |    10 +-
 .../pipe/agent/task/meta/PipeStaticMeta.java       |    60 +
 .../task/subtask/PipeAbstractSinkSubtask.java      |     4 +-
 .../agent/task/subtask/PipeReportableSubtask.java  |    16 +-
 .../pipe/agent/task/subtask/PipeSubtask.java       |     6 +-
 .../iotdb/commons/pipe/config/PipeDescriptor.java  |     8 +-
 .../pipe/config/constant/PipeSinkConstant.java     |    22 +
 .../commons/pipe/resource/log/PipeLogger.java      |    18 +-
 .../resource/log/PipePeriodicalLogReducer.java     |    76 +
 .../thrift/request/PipeTransferFileSealReqV2.java  |     8 +
 .../plan/node/CommonPlanNodeDeserializer.java      |     3 +
 .../planner/plan/node/ICoreQueryPlanVisitor.java   |     5 +
 .../plan/planner/plan/node/PlanNodeType.java       |     3 +
 .../function/TableBuiltinTableFunction.java        |     4 +
 .../{PreviousFillNode.java => NextFillNode.java}   |    27 +-
 .../relational/planner/node/PreviousFillNode.java  |     5 +-
 .../queryengine/plan/relational/sql/ast/Fill.java  |    22 +-
 .../plan/relational/sql/ast/GroupBy.java           |    26 +-
 .../sql/util/CommonQuerySqlFormatter.java          |    12 +-
 .../plan/statement/component/FillPolicy.java       |     1 +
 .../schema/column/ColumnHeaderConstant.java        |    11 +-
 .../commons/schema/table/InformationSchema.java    |     6 +
 .../schema/table/InsertNodeMeasurementInfo.java    |     9 +-
 .../service/AbstractThriftServiceThread.java       |    52 +-
 .../iotdb/commons/service/metric/enums/Metric.java |     4 +
 .../subscription/config/SubscriptionConfig.java    |    77 +-
 .../meta/consumer/CommitProgressKeeper.java        |   190 +
 .../meta/consumer/ConsumerGroupMeta.java           |    25 +
 .../commons/subscription/meta/topic/TopicMeta.java |   267 +-
 .../TableBuiltinAggregationFunction.java           |     4 +-
 .../relational/tvf/CapacityTableFunction.java      |    69 +-
 .../builtin/relational/tvf/M4TableFunction.java    |   802 +
 .../org/apache/iotdb/commons/utils/FileUtils.java  |     3 +
 .../utils/KillPoint/RegionMaintainKillPoints.java  |    34 +
 .../org/apache/iotdb/commons/utils/PathUtils.java  |    56 +-
 .../apache/iotdb/commons/utils/WindowsOSUtils.java |    47 +-
 .../client/request/AsyncRequestManagerTest.java    |   226 +
 .../commons/pipe/config/PipeDescriptorTest.java    |    65 +
 .../commons/pipe/resource/PipeLoggerTest.java      |    83 +
 .../common/PipeTransferSliceReqBuilderTest.java    |    32 +
 .../thrift/request/PipeRequestTypeTest.java        |    61 +
 .../request/PipeTransferCompressedReqTest.java     |   112 +
 .../request/PipeTransferFileSealReqV2Test.java     |    65 +
 .../table/InsertNodeMeasurementInfoTest.java       |    83 +
 .../meta/consumer/CommitProgressKeeperTest.java    |   163 +
 .../commons/subscription/topic/TopicDeSerTest.java |   200 +
 .../relational/tvf/CapacityTableFunctionTest.java  |   204 +
 .../apache/iotdb/commons/utils/FileUtilsTest.java  |    16 +-
 .../iotdb/commons/utils/WindowsOSUtilsTest.java    |    12 +
 .../db/relational/grammar/sql/RelationalSql.g4     |    13 +-
 .../thrift-commons/src/main/thrift/common.thrift   |     1 +
 .../src/main/thrift/confignode.thrift              |    27 +-
 .../src/main/thrift/iotconsensus.thrift            |    16 +-
 .../src/main/thrift/datanode.thrift                |    64 +-
 library-udf/pom.xml                                |     4 +-
 library-udf/src/assembly/tools/register-UDF.bat    |     1 +
 library-udf/src/assembly/tools/register-UDF.sh     |     1 +
 pom.xml                                            |   129 +-
 scripts/conf/confignode-env.sh                     |    61 +-
 scripts/conf/datanode-env.sh                       |    70 +-
 scripts/sbin/start-cli.sh                          |    13 +-
 scripts/sbin/windows/start-cli.bat                 |    23 +-
 scripts/sbin/windows/start-confignode.bat          |    20 +-
 scripts/sbin/windows/start-datanode.bat            |    19 +-
 scripts/tools/ops/health_check.sh                  |     2 +-
 scripts/tools/windows/ops/health_check.bat         |     4 +-
 927 files changed, 61212 insertions(+), 24775 deletions(-)

diff --cc 
iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java
index 8af5bcd245a,0dc81115dd0..2d22198f780
--- a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java
+++ b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java
@@@ -623,12 -544,13 +623,13 @@@ public class IoTDBConnection implement
  
      if (params.isUseSSL()) {
        transport =
-           DeepCopyRpcTransportFactory.INSTANCE.getTransport(
+           DeepCopyRpcTransportFactory.INSTANCE.getTransportWithSSLConfig(
                params.getHost(),
                params.getPort(),
 -              getNetworkTimeout(),
 +              networkTimeout,
                params.getTrustStore(),
-               params.getTrustStorePwd());
+               params.getTrustStorePwd(),
+               params.getSslProtocol());
      } else {
        transport =
            DeepCopyRpcTransportFactory.INSTANCE.getTransport(
diff --cc 
iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnectionParams.java
index 1a8c4866bb7,8bf51379c5c..058d96145d9
--- 
a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnectionParams.java
+++ 
b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnectionParams.java
@@@ -51,7 -51,7 +51,8 @@@ public class IoTDBConnectionParams 
    private boolean useSSL = false;
    private String trustStore;
    private String trustStorePwd;
 +  private boolean rpcThriftCompressionEnabled = 
Config.rpcThriftCompressionEnable;
+   private String sslProtocol = Config.DEFAULT_SSL_PROTOCOL;
  
    private String sqlDialect = TREE;
  
@@@ -185,14 -185,14 +186,22 @@@
      this.trustStorePwd = trustStorePwd;
    }
  
 +  public boolean isRpcThriftCompressionEnabled() {
 +    return rpcThriftCompressionEnabled;
 +  }
 +
 +  public void setRpcThriftCompressionEnabled(boolean 
rpcThriftCompressionEnabled) {
 +    this.rpcThriftCompressionEnabled = rpcThriftCompressionEnabled;
 +  }
 +
+   public String getSslProtocol() {
+     return sslProtocol;
+   }
+ 
+   public void setSslProtocol(String sslProtocol) {
+     this.sslProtocol = sslProtocol;
+   }
+ 
    public String getSqlDialect() {
      return sqlDialect;
    }
diff --cc 
iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDataSourceFactory.java
index bf2ec57cc9e,2e5994ca426..4b60cdbcb3c
--- 
a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDataSourceFactory.java
+++ 
b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDataSourceFactory.java
@@@ -127,72 -76,4 +127,73 @@@ public class IoTDBDataSourceFactory imp
    public Driver createDriver(Properties properties) {
      return new IoTDBDriver();
    }
 +
 +  private static String removeStringProperty(Properties properties, String 
key) {
 +    Object value = properties.remove(key);
 +    return value == null ? null : value.toString();
 +  }
 +
 +  private static void applyConnectionProperties(IoTDBDataSource ds, 
Properties properties) {
 +    applyCredentialProperty(ds, properties, Config.AUTH_USER);
 +    applyCredentialProperty(ds, properties, Config.AUTH_PASSWORD);
 +    applyConnectionProperty(ds, properties, Config.DEFAULT_BUFFER_CAPACITY);
 +    applyConnectionProperty(ds, properties, Config.THRIFT_FRAME_MAX_SIZE);
 +    applyConnectionProperty(ds, properties, Config.VERSION);
 +    applyConnectionProperty(ds, properties, Config.NETWORK_TIMEOUT);
 +    applyConnectionProperty(ds, properties, Config.TIME_ZONE);
 +    applyConnectionProperty(ds, properties, Config.CHARSET);
 +    applyConnectionProperty(ds, properties, Config.USE_SSL);
 +    applyConnectionProperty(ds, properties, Config.TRUST_STORE);
 +    applyConnectionProperty(ds, properties, Config.TRUST_STORE_PWD);
++    applyConnectionProperty(ds, properties, Config.SSL_PROTOCOL);
 +    applyConnectionProperty(ds, properties, Utils.RPC_COMPRESS);
 +    applyConnectionProperty(ds, properties, Config.SQL_DIALECT);
 +  }
 +
 +  private static void applyCredentialProperty(
 +      IoTDBDataSource ds, Properties properties, String key) {
 +    String value = removeStringProperty(properties, key);
 +    if (value == null) {
 +      return;
 +    }
 +    if (Config.AUTH_USER.equals(key)) {
 +      ds.setUser(value);
 +    } else {
 +      ds.setPassword(value);
 +    }
 +  }
 +
 +  private static void applyConnectionProperty(
 +      IoTDBDataSource ds, Properties properties, String key) {
 +    String value = removeStringProperty(properties, key);
 +    if (value != null) {
 +      ds.setConnectionProperty(key, value);
 +    }
 +  }
 +
 +  private static Integer removeIntegerProperty(Properties properties, String 
key)
 +      throws SQLException {
 +    Object value = properties.remove(key);
 +    if (value == null) {
 +      return null;
 +    }
 +    try {
 +      int integerValue = Integer.parseInt(value.toString());
 +      if (integerValue < 0 || integerValue > 65535) {
 +        throw new NumberFormatException(value.toString());
 +      }
 +      return integerValue;
 +    } catch (NumberFormatException e) {
 +      throw new SQLException("Invalid JDBC property " + key + ": " + value, 
e);
 +    }
 +  }
 +
 +  private static void removeUnsupportedPoolProperties(Properties properties) {
 +    properties.remove(DataSourceFactory.JDBC_INITIAL_POOL_SIZE);
 +    properties.remove(DataSourceFactory.JDBC_MAX_IDLE_TIME);
 +    properties.remove(DataSourceFactory.JDBC_MAX_POOL_SIZE);
 +    properties.remove(DataSourceFactory.JDBC_MAX_STATEMENTS);
 +    properties.remove(DataSourceFactory.JDBC_MIN_POOL_SIZE);
 +    properties.remove(DataSourceFactory.JDBC_PROPERTY_CYCLE);
 +  }
  }
diff --cc iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDriver.java
index 3dcbd4fecb8,de7065c1c57..f188a1902c2
--- a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDriver.java
+++ b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDriver.java
@@@ -98,57 -91,9 +98,62 @@@ public class IoTDBDriver implements Dri
    }
  
    @Override
 -  public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) {
 -    // TODO Auto-generated method stub
 -    return new DriverPropertyInfo[0];
 +  public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) 
throws SQLException {
 +    Properties properties = info == null ? new Properties() : (Properties) 
info.clone();
 +    if (url != null && acceptsURL(url)) {
 +      Utils.parseUrl(url, properties);
 +    }
 +    return new DriverPropertyInfo[] {
 +      createProperty(
 +          Config.AUTH_USER, Config.DEFAULT_USER, "User name for 
authentication.", properties),
 +      createSensitiveProperty(Config.AUTH_PASSWORD, "Password for 
authentication."),
 +      createProperty(
 +          Config.DEFAULT_BUFFER_CAPACITY,
 +          String.valueOf(RpcUtils.THRIFT_DEFAULT_BUF_CAPACITY),
 +          "Thrift default buffer capacity in bytes.",
 +          properties),
 +      createProperty(
 +          Config.THRIFT_FRAME_MAX_SIZE,
 +          String.valueOf(RpcUtils.THRIFT_FRAME_MAX_SIZE),
 +          "Thrift max frame size in bytes.",
 +          properties),
 +      createProperty(
 +          Config.VERSION,
 +          Config.DEFAULT_VERSION.name(),
 +          VERSION_CHOICES,
 +          "Client compatibility version.",
 +          properties),
 +      createProperty(
 +          Config.NETWORK_TIMEOUT,
 +          String.valueOf(Config.DEFAULT_CONNECTION_TIMEOUT_MS),
 +          "Network timeout in milliseconds.",
 +          properties),
 +      createProperty(
 +          Config.TIME_ZONE, ZoneId.systemDefault().toString(), "Connection 
time zone.", properties),
 +      createProperty(
 +          Config.CHARSET, TSFileConfig.STRING_CHARSET.name(), "Connection 
charset.", properties),
 +      createProperty(
 +          Config.USE_SSL, "false", BOOLEAN_CHOICES, "Whether to enable SSL.", 
properties),
 +      createProperty(
 +          Utils.RPC_COMPRESS,
 +          String.valueOf(Config.rpcThriftCompressionEnable),
 +          BOOLEAN_CHOICES,
 +          "Whether to enable RPC thrift compression.",
 +          properties),
 +      createProperty(Config.TRUST_STORE, null, "SSL trust store path.", 
properties),
 +      createSensitiveProperty(Config.TRUST_STORE_PWD, "SSL trust store 
password."),
++      createProperty(
++          Config.SSL_PROTOCOL,
++          Config.DEFAULT_SSL_PROTOCOL,
++          "SSL protocol to use for the connection.",
++          properties),
 +      createProperty(
 +          Config.SQL_DIALECT,
 +          Constant.TREE,
 +          SQL_DIALECT_CHOICES,
 +          "SQL dialect for the connection.",
 +          properties)
 +    };
    }
  
    @Override
diff --cc iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/Utils.java
index 5957421d949,ea205ef7267..be893ca33a9
--- a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/Utils.java
+++ b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/Utils.java
@@@ -103,46 -103,46 +105,50 @@@ public class Utils 
                + url);
      }
  
 -    if (info.containsKey(Config.AUTH_USER)) {
 -      params.setUsername(info.getProperty(Config.AUTH_USER));
 +    if (properties.containsKey(Config.AUTH_USER)) {
 +      params.setUsername(properties.getProperty(Config.AUTH_USER));
      }
 -    if (info.containsKey(Config.AUTH_PASSWORD)) {
 -      params.setPassword(info.getProperty(Config.AUTH_PASSWORD));
 +    if (properties.containsKey(Config.AUTH_PASSWORD)) {
 +      params.setPassword(properties.getProperty(Config.AUTH_PASSWORD));
      }
 -    if (info.containsKey(Config.DEFAULT_BUFFER_CAPACITY)) {
 +    if (properties.containsKey(Config.DEFAULT_BUFFER_CAPACITY)) {
        params.setThriftDefaultBufferSize(
 -          Integer.parseInt(info.getProperty(Config.DEFAULT_BUFFER_CAPACITY)));
 +          parsePositiveIntegerProperty(properties, 
Config.DEFAULT_BUFFER_CAPACITY));
      }
 -    if (info.containsKey(Config.THRIFT_FRAME_MAX_SIZE)) {
 +    if (properties.containsKey(Config.THRIFT_FRAME_MAX_SIZE)) {
        params.setThriftMaxFrameSize(
 -          Integer.parseInt(info.getProperty(Config.THRIFT_FRAME_MAX_SIZE)));
 +          parsePositiveIntegerProperty(properties, 
Config.THRIFT_FRAME_MAX_SIZE));
      }
 -    if (info.containsKey(Config.VERSION)) {
 -      
params.setVersion(Constant.Version.valueOf(info.getProperty(Config.VERSION)));
 +    if (properties.containsKey(Config.VERSION)) {
 +      params.setVersion(parseVersionProperty(properties));
      }
 -    if (info.containsKey(Config.NETWORK_TIMEOUT)) {
 -      
params.setNetworkTimeout(Integer.parseInt(info.getProperty(Config.NETWORK_TIMEOUT)));
 +    if (properties.containsKey(Config.NETWORK_TIMEOUT)) {
 +      params.setNetworkTimeout(parseNonNegativeIntegerProperty(properties, 
Config.NETWORK_TIMEOUT));
      }
 -    if (info.containsKey(Config.TIME_ZONE)) {
 -      params.setTimeZone(info.getProperty(Config.TIME_ZONE));
 +    if (properties.containsKey(Config.TIME_ZONE)) {
 +      params.setTimeZone(validateTimeZoneProperty(properties));
      }
 -    if (info.containsKey(Config.CHARSET)) {
 -      params.setCharset(info.getProperty(Config.CHARSET));
 +    if (properties.containsKey(Config.CHARSET)) {
 +      params.setCharset(validateCharsetProperty(properties));
      }
 -    if (info.containsKey(Config.USE_SSL)) {
 -      
params.setUseSSL(Boolean.parseBoolean(info.getProperty(Config.USE_SSL)));
 +    if (properties.containsKey(Config.USE_SSL)) {
 +      params.setUseSSL(parseBooleanProperty(properties, Config.USE_SSL));
      }
 -    if (info.containsKey(Config.TRUST_STORE)) {
 -      params.setTrustStore(info.getProperty(Config.TRUST_STORE));
 +    if (properties.containsKey(Config.TRUST_STORE)) {
 +      params.setTrustStore(properties.getProperty(Config.TRUST_STORE));
      }
 -    if (info.containsKey(Config.TRUST_STORE_PWD)) {
 -      params.setTrustStorePwd(info.getProperty(Config.TRUST_STORE_PWD));
 +    if (properties.containsKey(Config.TRUST_STORE_PWD)) {
 +      params.setTrustStorePwd(properties.getProperty(Config.TRUST_STORE_PWD));
      }
 -    if (info.containsKey(Config.SSL_PROTOCOL)) {
 -      
params.setSslProtocol(RpcSslUtils.normalizeProtocol(info.getProperty(Config.SSL_PROTOCOL)));
++    if (properties.containsKey(Config.SSL_PROTOCOL)) {
++      params.setSslProtocol(
++          
RpcSslUtils.normalizeProtocol(properties.getProperty(Config.SSL_PROTOCOL)));
+     }
 -    if (info.containsKey(Config.SQL_DIALECT)) {
 -      params.setSqlDialect(info.getProperty(Config.SQL_DIALECT));
 +    if (properties.containsKey(RPC_COMPRESS)) {
 +      params.setRpcThriftCompressionEnabled(parseBooleanProperty(properties, 
RPC_COMPRESS));
 +    }
 +    if (properties.containsKey(Config.SQL_DIALECT)) {
 +      params.setSqlDialect(validateSqlDialectProperty(properties));
      }
  
      return params;
@@@ -192,38 -177,13 +198,39 @@@
              return false;
            }
            break;
 -        case Config.USE_SSL:
          case Config.TRUST_STORE:
          case Config.TRUST_STORE_PWD:
+         case Config.SSL_PROTOCOL:
 +          info.put(key, value);
 +          break;
 +        case Config.USE_SSL:
 +          if (!isBoolean(value)) {
 +            return false;
 +          }
 +          info.put(key, value);
 +          break;
          case Config.VERSION:
 +          try {
 +            Constant.Version.valueOf(value);
 +          } catch (IllegalArgumentException e) {
 +            return false;
 +          }
 +          info.put(key, value);
 +          break;
          case Config.NETWORK_TIMEOUT:
 +          try {
 +            if (Integer.parseInt(value) < 0) {
 +              return false;
 +            }
 +          } catch (NumberFormatException e) {
 +            return false;
 +          }
 +          info.put(key, value);
 +          break;
          case Config.SQL_DIALECT:
 +          if (!Constant.TREE.equals(value) && !Constant.TABLE.equals(value)) {
 +            return false;
 +          }
            info.put(key, value);
            break;
          case Config.TIME_ZONE:
diff --cc 
iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBDataSourceFactoryTest.java
index 724917d9081,00000000000..f168357a413
mode 100644,000000..100644
--- 
a/iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBDataSourceFactoryTest.java
+++ 
b/iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBDataSourceFactoryTest.java
@@@ -1,241 -1,0 +1,243 @@@
 +/*
 + * 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.jdbc;
 +
 +import org.junit.Test;
 +import org.osgi.service.jdbc.DataSourceFactory;
 +
 +import javax.sql.DataSource;
 +
 +import java.io.PrintWriter;
 +import java.io.StringWriter;
 +import java.sql.SQLException;
 +import java.sql.SQLFeatureNotSupportedException;
 +import java.util.Properties;
 +
 +import static org.junit.Assert.assertEquals;
 +import static org.junit.Assert.assertFalse;
 +import static org.junit.Assert.assertNull;
 +import static org.junit.Assert.assertSame;
 +import static org.junit.Assert.assertTrue;
 +
 +public class IoTDBDataSourceFactoryTest {
 +
 +  @Test
 +  public void testCreateDataSourceAllowsNullProperties() throws SQLException {
 +    DataSource dataSource = new 
IoTDBDataSourceFactory().createDataSource(null);
 +
 +    assertTrue(dataSource instanceof IoTDBDataSource);
 +    IoTDBDataSource iotdbDataSource = (IoTDBDataSource) dataSource;
 +    assertNull(iotdbDataSource.getUrl());
 +    assertNull(iotdbDataSource.getUser());
 +    assertNull(iotdbDataSource.getPassword());
 +  }
 +
 +  @Test
 +  public void testCreateDataSourceAllowsUrlOnlyProperties() throws 
SQLException {
 +    String url = "jdbc:iotdb://localhost:6667";
 +    Properties properties = new Properties();
 +    properties.setProperty(DataSourceFactory.JDBC_URL, url);
 +
 +    IoTDBDataSource dataSource =
 +        (IoTDBDataSource) new 
IoTDBDataSourceFactory().createDataSource(properties);
 +
 +    assertEquals(url, dataSource.getUrl());
 +    assertNull(dataSource.getUser());
 +    assertNull(dataSource.getPassword());
 +    assertEquals(url, properties.getProperty(DataSourceFactory.JDBC_URL));
 +  }
 +
 +  @Test
 +  public void 
testCreateDataSourceSupportsStandardServerPortAndDatabaseProperties()
 +      throws SQLException {
 +    Properties properties = new Properties();
 +    properties.setProperty(DataSourceFactory.JDBC_SERVER_NAME, "127.0.0.1");
 +    properties.put(DataSourceFactory.JDBC_PORT_NUMBER, 6688);
 +    properties.setProperty(DataSourceFactory.JDBC_DATABASE_NAME, "root.sg");
 +
 +    IoTDBDataSource dataSource =
 +        (IoTDBDataSource) new 
IoTDBDataSourceFactory().createDataSource(properties);
 +
 +    assertEquals("127.0.0.1", dataSource.getServerName());
 +    assertEquals(Integer.valueOf(6688), dataSource.getPortNumber());
 +    assertEquals("root.sg", dataSource.getDatabaseName());
 +    assertNull(dataSource.getUrl());
 +    assertEquals("jdbc:iotdb://127.0.0.1:6688/root.sg", 
dataSource.getConnectionUrl());
 +    assertEquals(Integer.valueOf(6688), 
properties.get(DataSourceFactory.JDBC_PORT_NUMBER));
 +  }
 +
 +  @Test
 +  public void 
testCreateDataSourceAcceptsStandardInformationalAndPoolProperties()
 +      throws SQLException {
 +    Properties properties = new Properties();
 +    properties.setProperty(DataSourceFactory.JDBC_DATASOURCE_NAME, 
"iotdb-ds");
 +    properties.setProperty(DataSourceFactory.JDBC_DESCRIPTION, "IoTDB test 
data source");
 +    properties.setProperty(DataSourceFactory.JDBC_NETWORK_PROTOCOL, "tcp");
 +    properties.setProperty(DataSourceFactory.JDBC_ROLE_NAME, "reader");
 +    properties.put(DataSourceFactory.JDBC_INITIAL_POOL_SIZE, 1);
 +    properties.put(DataSourceFactory.JDBC_MAX_POOL_SIZE, 2);
 +
 +    IoTDBDataSource dataSource =
 +        (IoTDBDataSource) new 
IoTDBDataSourceFactory().createDataSource(properties);
 +
 +    assertEquals("iotdb-ds", dataSource.getDataSourceName());
 +    assertEquals("IoTDB test data source", dataSource.getDescription());
 +    assertEquals("tcp", dataSource.getNetworkProtocol());
 +    assertEquals("reader", dataSource.getRoleName());
 +  }
 +
 +  @Test
 +  public void testCreateDataSourceAcceptsIoTDBConnectionProperties() throws 
SQLException {
 +    Properties properties = new Properties();
 +    properties.setProperty(Config.NETWORK_TIMEOUT, "1234");
 +    properties.setProperty(Config.TIME_ZONE, "Asia/Shanghai");
 +    properties.setProperty(Config.CHARSET, "UTF-8");
 +    properties.setProperty(Config.USE_SSL, "true");
 +    properties.setProperty(Config.TRUST_STORE, "trust-store");
 +    properties.setProperty(Config.TRUST_STORE_PWD, "trust-store-password");
++    properties.setProperty(Config.SSL_PROTOCOL, "TLSv1.3");
 +    properties.setProperty(Config.SQL_DIALECT, Constant.TABLE);
 +    properties.setProperty(Utils.RPC_COMPRESS, "true");
 +
 +    IoTDBDataSource dataSource =
 +        (IoTDBDataSource) new 
IoTDBDataSourceFactory().createDataSource(properties);
 +
 +    assertEquals("1234", 
dataSource.getConnectionProperty(Config.NETWORK_TIMEOUT));
 +    assertEquals("Asia/Shanghai", 
dataSource.getConnectionProperty(Config.TIME_ZONE));
 +    assertEquals("UTF-8", dataSource.getConnectionProperty(Config.CHARSET));
 +    assertEquals("true", dataSource.getConnectionProperty(Config.USE_SSL));
 +    assertEquals("trust-store", 
dataSource.getConnectionProperty(Config.TRUST_STORE));
 +    assertEquals("trust-store-password", 
dataSource.getConnectionProperty(Config.TRUST_STORE_PWD));
++    assertEquals("TLSv1.3", 
dataSource.getConnectionProperty(Config.SSL_PROTOCOL));
 +    assertEquals(Constant.TABLE, 
dataSource.getConnectionProperty(Config.SQL_DIALECT));
 +    assertEquals("true", 
dataSource.getConnectionProperty(Utils.RPC_COMPRESS));
 +  }
 +
 +  @Test(expected = SQLException.class)
 +  public void testCreateDataSourceRejectsInvalidStandardPortProperty() throws 
SQLException {
 +    Properties properties = new Properties();
 +    properties.setProperty(DataSourceFactory.JDBC_PORT_NUMBER, "bad");
 +
 +    new IoTDBDataSourceFactory().createDataSource(properties);
 +  }
 +
 +  @Test(expected = SQLException.class)
 +  public void testCreateDataSourceRejectsUnknownBeanProperty() throws 
SQLException {
 +    Properties properties = new Properties();
 +    properties.setProperty("unknownProperty", "value");
 +
 +    new IoTDBDataSourceFactory().createDataSource(properties);
 +  }
 +
 +  @Test
 +  public void 
testDataSourceExplicitUrlTakesPrecedenceOverStandardProperties() {
 +    IoTDBDataSource dataSource = new IoTDBDataSource();
 +
 +    dataSource.setUrl("jdbc:iotdb://explicit:6667/root.explicit");
 +    dataSource.setServerName("127.0.0.1");
 +    dataSource.setPortNumber(6688);
 +    dataSource.setDatabaseName("root.sg");
 +
 +    assertEquals("jdbc:iotdb://explicit:6667/root.explicit", 
dataSource.getConnectionUrl());
 +  }
 +
 +  @Test
 +  public void testDataSourceAllowsClearingUserAndPassword() {
 +    IoTDBDataSource dataSource = new IoTDBDataSource();
 +
 +    dataSource.setUser("root");
 +    dataSource.setPassword("root");
 +    dataSource.setUser(null);
 +    dataSource.setPassword(null);
 +
 +    assertNull(dataSource.getUser());
 +    assertNull(dataSource.getPassword());
 +  }
 +
 +  @Test
 +  public void testDataSourceConstructorAllowsNullPort() {
 +    IoTDBDataSource dataSource =
 +        new IoTDBDataSource("jdbc:iotdb://localhost:6667", null, null, null);
 +
 +    assertEquals(Integer.valueOf(6667), dataSource.getPort());
 +  }
 +
 +  @Test(expected = IllegalArgumentException.class)
 +  public void testDataSourceRejectsInvalidDirectPort() {
 +    new IoTDBDataSource().setPortNumber(65536);
 +  }
 +
 +  @Test
 +  public void testDataSourceWrapperMethods() throws SQLException {
 +    IoTDBDataSource dataSource = new IoTDBDataSource();
 +
 +    assertTrue(dataSource.isWrapperFor(IoTDBDataSource.class));
 +    assertTrue(dataSource.isWrapperFor(DataSource.class));
 +    assertFalse(dataSource.isWrapperFor(String.class));
 +    assertFalse(dataSource.isWrapperFor(null));
 +    assertSame(dataSource, dataSource.unwrap(IoTDBDataSource.class));
 +    assertSame(dataSource, dataSource.unwrap(DataSource.class));
 +  }
 +
 +  @Test(expected = SQLException.class)
 +  public void testDataSourceUnwrapRejectsUnsupportedClass() throws 
SQLException {
 +    new IoTDBDataSource().unwrap(String.class);
 +  }
 +
 +  @Test(expected = SQLFeatureNotSupportedException.class)
 +  public void testDataSourceParentLoggerIsUnsupported() throws SQLException {
 +    new IoTDBDataSource().getParentLogger();
 +  }
 +
 +  @Test(expected = SQLFeatureNotSupportedException.class)
 +  public void testConnectionPoolDataSourceIsUnsupported() throws SQLException 
{
 +    new IoTDBDataSourceFactory().createConnectionPoolDataSource(null);
 +  }
 +
 +  @Test(expected = SQLFeatureNotSupportedException.class)
 +  public void testXADataSourceIsUnsupported() throws SQLException {
 +    new IoTDBDataSourceFactory().createXADataSource(null);
 +  }
 +
 +  @Test
 +  public void testDataSourceStoresLogWriterAndLoginTimeout() throws 
SQLException {
 +    IoTDBDataSource dataSource = new IoTDBDataSource();
 +    PrintWriter logWriter = new PrintWriter(new StringWriter());
 +
 +    dataSource.setLogWriter(logWriter);
 +    dataSource.setLoginTimeout(10);
 +
 +    assertSame(logWriter, dataSource.getLogWriter());
 +    assertEquals(10, dataSource.getLoginTimeout());
 +  }
 +
 +  @Test(expected = SQLException.class)
 +  public void testDataSourceRejectsNegativeLoginTimeout() throws SQLException 
{
 +    new IoTDBDataSource().setLoginTimeout(-1);
 +  }
 +
 +  @Test(expected = SQLException.class)
 +  public void testDataSourceConnectionWithCredentialsThrowsInvalidUrl() 
throws SQLException {
 +    IoTDBDataSource dataSource = new IoTDBDataSource();
 +
 +    dataSource.setUrl("jdbc:iotdb://test");
 +    dataSource.getConnection("root", "root");
 +  }
 +}
diff --cc 
iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBDriverTest.java
index 7a9173186c1,00000000000..3452c8d9213
mode 100644,000000..100644
--- a/iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBDriverTest.java
+++ b/iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBDriverTest.java
@@@ -1,139 -1,0 +1,141 @@@
 +/*
 + * 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.jdbc;
 +
 +import org.junit.Test;
 +
 +import java.sql.DriverPropertyInfo;
 +import java.sql.SQLException;
 +import java.util.Arrays;
 +import java.util.Properties;
 +
 +import static org.junit.Assert.assertEquals;
 +import static org.junit.Assert.assertFalse;
 +import static org.junit.Assert.assertNotNull;
 +import static org.junit.Assert.assertNull;
 +import static org.junit.Assert.assertTrue;
 +import static org.junit.Assert.fail;
 +
 +public class IoTDBDriverTest {
 +
 +  @Test
 +  public void testAcceptsUrl() {
 +    IoTDBDriver driver = new IoTDBDriver();
 +
 +    assertTrue(driver.acceptsURL("jdbc:iotdb://localhost:6667"));
 +    assertFalse(driver.acceptsURL(null));
 +    assertFalse(driver.acceptsURL("jdbc:mysql://localhost:3306"));
 +  }
 +
 +  @Test
 +  public void testDriverVersion() {
 +    IoTDBDriver driver = new IoTDBDriver();
 +
 +    assertEquals(Config.DRIVER_MAJOR_VERSION, driver.getMajorVersion());
 +    assertEquals(Config.DRIVER_MINOR_VERSION, driver.getMinorVersion());
 +  }
 +
 +  @Test
 +  public void testGetPropertyInfo() throws SQLException {
 +    IoTDBDriver driver = new IoTDBDriver();
 +    Properties properties = new Properties();
 +    properties.setProperty(Config.AUTH_USER, "root");
 +    properties.setProperty(Config.AUTH_PASSWORD, "secret");
 +    properties.setProperty(Config.USE_SSL, "true");
++    properties.setProperty(Config.SSL_PROTOCOL, "TLSv1.3");
 +    properties.setProperty(Config.TRUST_STORE_PWD, "trust-store-secret");
 +
 +    DriverPropertyInfo[] propertyInfos =
 +        driver.getPropertyInfo("jdbc:iotdb://localhost:6667", properties);
 +
 +    assertTrue(propertyInfos.length > 0);
 +    assertEquals("root", findProperty(propertyInfos, Config.AUTH_USER).value);
 +    assertNull(findProperty(propertyInfos, Config.AUTH_PASSWORD).value);
 +    assertNull(findProperty(propertyInfos, Config.TRUST_STORE_PWD).value);
 +    assertEquals("true", findProperty(propertyInfos, Config.USE_SSL).value);
++    assertEquals("TLSv1.3", findProperty(propertyInfos, 
Config.SSL_PROTOCOL).value);
 +    assertEquals(
 +        Arrays.asList("true", "false"),
 +        Arrays.asList(findProperty(propertyInfos, Config.USE_SSL).choices));
 +    assertEquals(
 +        Arrays.asList(Constant.TREE, Constant.TABLE),
 +        Arrays.asList(findProperty(propertyInfos, 
Config.SQL_DIALECT).choices));
 +    assertEquals(Config.DEFAULT_VERSION.name(), findProperty(propertyInfos, 
Config.VERSION).value);
 +  }
 +
 +  @Test
 +  public void testGetPropertyInfoAllowsNullProperties() throws SQLException {
 +    IoTDBDriver driver = new IoTDBDriver();
 +
 +    DriverPropertyInfo[] propertyInfos =
 +        driver.getPropertyInfo("jdbc:iotdb://localhost:6667", null);
 +
 +    assertNotNull(propertyInfos);
 +    assertEquals(Config.DEFAULT_USER, findProperty(propertyInfos, 
Config.AUTH_USER).value);
 +  }
 +
 +  @Test
 +  public void testGetPropertyInfoMergesUrlPropertiesWithoutMutatingInput() 
throws SQLException {
 +    IoTDBDriver driver = new IoTDBDriver();
 +    Properties properties = new Properties();
 +    properties.setProperty(Config.USE_SSL, "false");
 +    boolean originalRpcCompression = Config.rpcThriftCompressionEnable;
 +    Config.rpcThriftCompressionEnable = false;
 +    try {
 +      DriverPropertyInfo[] propertyInfos =
 +          driver.getPropertyInfo(
 +              
"jdbc:iotdb://localhost:6667?user=url-user&thrift_default_buffer_capacity=1024&thrift_max_frame_size=2048&use_ssl=true&sql_dialect=table&network_timeout=123&rpc_compress=true",
 +              properties);
 +
 +      assertEquals("url-user", findProperty(propertyInfos, 
Config.AUTH_USER).value);
 +      assertEquals("1024", findProperty(propertyInfos, 
Config.DEFAULT_BUFFER_CAPACITY).value);
 +      assertEquals("2048", findProperty(propertyInfos, 
Config.THRIFT_FRAME_MAX_SIZE).value);
 +      assertEquals("true", findProperty(propertyInfos, Config.USE_SSL).value);
 +      assertEquals(Constant.TABLE, findProperty(propertyInfos, 
Config.SQL_DIALECT).value);
 +      assertEquals("123", findProperty(propertyInfos, 
Config.NETWORK_TIMEOUT).value);
 +      assertEquals("true", findProperty(propertyInfos, 
Utils.RPC_COMPRESS).value);
 +      assertEquals("false", properties.getProperty(Config.USE_SSL));
 +      assertFalse(Config.rpcThriftCompressionEnable);
 +    } finally {
 +      Config.rpcThriftCompressionEnable = originalRpcCompression;
 +    }
 +  }
 +
 +  @Test(expected = SQLException.class)
 +  public void testGetPropertyInfoRejectsInvalidIoTDBUrl() throws SQLException 
{
 +    new IoTDBDriver().getPropertyInfo("jdbc:iotdb://localhost", new 
Properties());
 +  }
 +
 +  @Test(expected = SQLException.class)
 +  public void testGetPropertyInfoRejectsInvalidUrlProperties() throws 
SQLException {
 +    new IoTDBDriver()
 +        .getPropertyInfo("jdbc:iotdb://localhost:6667?network_timeout=-1", 
new Properties());
 +  }
 +
 +  private static DriverPropertyInfo findProperty(DriverPropertyInfo[] 
propertyInfos, String name) {
 +    for (DriverPropertyInfo propertyInfo : propertyInfos) {
 +      if (name.equals(propertyInfo.name)) {
 +        return propertyInfo;
 +      }
 +    }
 +    fail("Missing driver property: " + name);
 +    return null;
 +  }
 +}
diff --cc iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/UtilsTest.java
index fbc7fe4831a,d201a9b2d45..c48b0e803ee
--- a/iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/UtilsTest.java
+++ b/iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/UtilsTest.java
@@@ -224,106 -155,19 +224,117 @@@ public class UtilsTest 
  
    @Test
    public void testRpcCompress() throws IoTDBURLException {
 +    boolean originalRpcCompression = Config.rpcThriftCompressionEnable;
 +    Config.rpcThriftCompressionEnable = false;
      Properties properties = new Properties();
 -    Utils.parseUrl("jdbc:iotdb://127.0.0.1:6667?rpc_compress=true", 
properties);
 -    assertTrue(Config.rpcThriftCompressionEnable);
 +    try {
 +      IoTDBConnectionParams params =
 +          Utils.parseUrl("jdbc:iotdb://127.0.0.1:6667?rpc_compress=true", 
properties);
 +
 +      assertTrue(params.isRpcThriftCompressionEnabled());
 +      assertFalse(Config.rpcThriftCompressionEnable);
 +      assertFalse(
 +          Utils.parseUrl("jdbc:iotdb://127.0.0.1:6667", new Properties())
 +              .isRpcThriftCompressionEnabled());
 +    } finally {
 +      Config.rpcThriftCompressionEnable = originalRpcCompression;
 +    }
 +  }
 +
 +  @Test
 +  public void testParseUrlParamValueAllowsEqualsSign() throws 
IoTDBURLException {
 +    Properties properties = new Properties();
 +
 +    Utils.parseUrl("jdbc:iotdb://127.0.0.1:6667?trust_store_pwd=a=b=c", 
properties);
 +
 +    assertEquals("a=b=c", properties.getProperty(Config.TRUST_STORE_PWD));
 +  }
 +
 +  @Test(expected = IoTDBURLException.class)
 +  public void testParseUrlParamRejectsEmptyValue() throws IoTDBURLException {
 +    Utils.parseUrl("jdbc:iotdb://127.0.0.1:6667?use_ssl=", new Properties());
 +  }
 +
 +  @Test(expected = IoTDBURLException.class)
 +  public void testParseUrlParamRejectsTrailingSeparator() throws 
IoTDBURLException {
 +    Utils.parseUrl("jdbc:iotdb://127.0.0.1:6667?use_ssl=true&", new 
Properties());
 +  }
 +
 +  @Test(expected = IoTDBURLException.class)
 +  public void testParseUrlParamRejectsInvalidBooleanValue() throws 
IoTDBURLException {
 +    Utils.parseUrl("jdbc:iotdb://127.0.0.1:6667?use_ssl=abc", new 
Properties());
 +  }
 +
 +  @Test(expected = IoTDBURLException.class)
 +  public void testParseUrlParamRejectsInvalidVersionValue() throws 
IoTDBURLException {
 +    Utils.parseUrl("jdbc:iotdb://127.0.0.1:6667?version=bad", new 
Properties());
 +  }
 +
 +  @Test(expected = IoTDBURLException.class)
 +  public void testParseUrlParamRejectsInvalidNetworkTimeoutValue() throws 
IoTDBURLException {
 +    Utils.parseUrl("jdbc:iotdb://127.0.0.1:6667?network_timeout=bad", new 
Properties());
 +  }
 +
 +  @Test(expected = IoTDBURLException.class)
 +  public void testParseUrlParamRejectsNegativeNetworkTimeoutValue() throws 
IoTDBURLException {
 +    Utils.parseUrl("jdbc:iotdb://127.0.0.1:6667?network_timeout=-1", new 
Properties());
 +  }
 +
 +  @Test(expected = IoTDBURLException.class)
 +  public void testParseUrlParamRejectsInvalidThriftBufferCapacityValue() 
throws IoTDBURLException {
 +    Utils.parseUrl(
 +        "jdbc:iotdb://127.0.0.1:6667?thrift_default_buffer_capacity=0", new 
Properties());
 +  }
 +
 +  @Test(expected = IoTDBURLException.class)
 +  public void testParseUrlParamRejectsInvalidThriftFrameMaxSizeValue() throws 
IoTDBURLException {
 +    Utils.parseUrl("jdbc:iotdb://127.0.0.1:6667?thrift_max_frame_size=bad", 
new Properties());
 +  }
 +
 +  @Test(expected = IoTDBURLException.class)
 +  public void testParseUrlParamRejectsInvalidSqlDialectValue() throws 
IoTDBURLException {
 +    Utils.parseUrl("jdbc:iotdb://127.0.0.1:6667?sql_dialect=bad", new 
Properties());
 +  }
 +
 +  @Test
 +  public void testParseUrlRejectsInvalidConnectionProperties() {
 +    assertInvalidProperty(Config.DEFAULT_BUFFER_CAPACITY, "bad");
 +    assertInvalidProperty(Config.THRIFT_FRAME_MAX_SIZE, "bad");
 +    assertInvalidProperty(Config.VERSION, "bad");
 +    assertInvalidProperty(Config.NETWORK_TIMEOUT, "bad");
 +    assertInvalidProperty(Config.TIME_ZONE, "bad-time-zone");
 +    assertInvalidProperty(Config.CHARSET, "bad-charset");
 +    assertInvalidProperty(Config.USE_SSL, "bad");
 +    assertInvalidProperty(Config.SQL_DIALECT, "bad");
 +  }
 +
 +  @Test
 +  public void testParseUrlRejectsInvalidIntegerRanges() {
 +    assertInvalidProperty(Config.DEFAULT_BUFFER_CAPACITY, "0");
 +    assertInvalidProperty(Config.THRIFT_FRAME_MAX_SIZE, "-1");
 +    assertInvalidProperty(Config.NETWORK_TIMEOUT, "-1");
 +  }
 +
 +  private static void assertInvalidProperty(String key, String value) {
 +    Properties properties = new Properties();
 +    properties.setProperty(key, value);
 +    try {
 +      Utils.parseUrl("jdbc:iotdb://127.0.0.1:6667", properties);
 +    } catch (IoTDBURLException e) {
 +      assertTrue(e.getMessage().contains(key));
 +      return;
 +    }
 +    fail("Expected IoTDBURLException for invalid property " + key);
    }
+ 
+   @Test
+   public void testParseSslConfig() throws IoTDBURLException {
+     Properties properties = new Properties();
+     IoTDBConnectionParams params =
+         Utils.parseUrl(
+             
"jdbc:iotdb://127.0.0.1:6667?use_ssl=true&ssl_protocol=ProviderProtocol", 
properties);
+ 
+     assertTrue(params.isUseSSL());
+     assertEquals("ProviderProtocol", params.getSslProtocol());
+   }
  }


Reply via email to