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()); + } }
