You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ca...@apache.org on 2024/06/03 07:10:20 UTC
(iotdb) 01/02: merge ty/TableModelGrammar
This is an automated email from the ASF dual-hosted git repository.
caogaofei pushed a commit to branch beyyes-tmp/table-model-debug
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 7f2d8d814a0d6945803a2ed4e6e3adac3a1f2ab3
Merge: b3d8e15f251 2cfa04d38c7
Author: Beyyes <cg...@foxmail.com>
AuthorDate: Mon Jun 3 15:09:40 2024 +0800
merge ty/TableModelGrammar
.asf.yaml | 2 +-
.git-blame-ignore-revs | 1 +
.github/workflows/client-cpp.yml | 106 -
.github/workflows/client-go.yml | 56 -
.github/workflows/client-python.yml | 58 -
.github/workflows/cluster-it-1c1d.yml | 6 +-
.github/workflows/cluster-it-1c3d.yml | 1 +
.github/workflows/grafana-plugin.yml | 68 -
.github/workflows/multi-language-client.yml | 129 +
.github/workflows/pipe-it-2cluster.yml | 8 +-
.github/workflows/unit-test.yml | 3 +-
.gitignore | 7 -
.mvn/wrapper/maven-wrapper.properties | 8 +-
Jenkinsfile | 2 +-
README.md | 4 +-
README_ZH.md | 6 +-
codecov.yml | 1 -
distribution/pom.xml | 133 -
distribution/src/assembly/all.xml | 7 +
distribution/src/assembly/cli.xml | 7 +
distribution/src/assembly/flink-sql-connector.xml | 41 -
distribution/src/assembly/grafana-connector.xml | 48 -
distribution/src/assembly/grafana-plugin.xml | 38 -
distribution/src/assembly/spark-connector.xml | 48 -
docker/ReadMe.md | 44 -
.../GrafanaPlugin/Dockerfile-0.14.0-iotdb | 42 -
.../DockerCompose/GrafanaPlugin/docker-compose.yml | 48 -
.../main/DockerCompose/docker-compose-grafana.yml | 50 -
docker/src/main/Dockerfile-0.12.6-grafana | 41 -
.../src/main/Dockerfile-0.13.3-grafana-connector | 41 -
example/flink-sql/pom.xml | 99 -
.../org/apache/iotdb/example/BatchSinkExample.java | 74 -
.../apache/iotdb/example/BoundedScanExample.java | 52 -
.../java/org/apache/iotdb/example/CDCExample.java | 54 -
.../org/apache/iotdb/example/LookupExample.java | 77 -
.../apache/iotdb/example/StreamingSinkExample.java | 68 -
example/flink/README.md | 40 -
example/flink/pom.xml | 61 -
.../org/apache/iotdb/flink/FlinkIoTDBSink.java | 101 -
.../org/apache/iotdb/flink/FlinkIoTDBSource.java | 93 -
.../apache/iotdb/flink/FlinkTsFileBatchSink.java | 128 -
.../apache/iotdb/flink/FlinkTsFileBatchSource.java | 81 -
.../apache/iotdb/flink/FlinkTsFileStreamSink.java | 129 -
.../iotdb/flink/FlinkTsFileStreamSource.java | 84 -
.../java/org/apache/iotdb/flink/TsFileUtils.java | 107 -
example/hadoop/pom.xml | 38 -
.../org/apache/iotdb/hadoop/tsfile/Constant.java | 32 -
.../iotdb/hadoop/tsfile/TSFMRReadExample.java | 136 -
.../iotdb/hadoop/tsfile/TSMRWriteExample.java | 185 -
.../apache/iotdb/hadoop/tsfile/TsFileHelper.java | 139 -
.../iotdb/hadoop/tsfile/TsFileWriteToHDFS.java | 77 -
.../main/java/org/apache/iotdb/JDBCExample.java | 25 +-
example/kafka/pom.xml | 48 -
example/kafka/readme.md | 75 -
.../main/java/org/apache/iotdb/kafka/Constant.java | 68 -
.../main/java/org/apache/iotdb/kafka/Consumer.java | 136 -
.../org/apache/iotdb/kafka/ConsumerThread.java | 164 -
.../main/java/org/apache/iotdb/kafka/Producer.java | 63 -
example/odbc/.gitignore | 344 +
example/odbc/ODBC-Example.sln | 35 +
example/odbc/ODBC-Example/ODBC-Example.csproj | 40 +
example/odbc/ODBC-Example/ODBC_Example.cs | 84 +
example/odbc/README.md | 81 +
.../java/org/apache/iotdb/CountPointProcessor.java | 2 +-
example/pom.xml | 15 +-
example/pulsar/pom.xml | 55 -
.../java/org/apache/iotdb/pulsar/Constant.java | 67 -
.../org/apache/iotdb/pulsar/PulsarConsumer.java | 111 -
.../apache/iotdb/pulsar/PulsarConsumerThread.java | 161 -
.../org/apache/iotdb/pulsar/PulsarProducer.java | 55 -
example/rabbitmq/pom.xml | 47 -
example/rabbitmq/readme.md | 63 -
.../java/org/apache/iotdb/rabbitmq/Constant.java | 72 -
.../iotdb/rabbitmq/RabbitMQChannelUtils.java | 52 -
.../apache/iotdb/rabbitmq/RabbitMQConsumer.java | 139 -
.../apache/iotdb/rabbitmq/RabbitMQProducer.java | 49 -
example/rocketmq/pom.xml | 48 -
example/rocketmq/readme.md | 83 -
.../java/org/apache/iotdb/rocketmq/Constant.java | 70 -
.../apache/iotdb/rocketmq/RocketMQConsumer.java | 208 -
.../apache/iotdb/rocketmq/RocketMQProducer.java | 100 -
.../main/java/org/apache/iotdb/rocketmq/Utils.java | 39 -
.../iotdb/AlignedTimeseriesSessionExample.java | 13 +-
.../org/apache/iotdb/DataMigrationExample.java | 14 +-
.../iotdb/HybridTimeseriesSessionExample.java | 4 +-
.../org/apache/iotdb/SessionConcurrentExample.java | 3 +-
.../main/java/org/apache/iotdb/SessionExample.java | 13 +-
.../apache/iotdb/SubscriptionSessionExample.java | 188 +-
.../iotdb/SyntaxConventionRelatedExample.java | 1 +
.../main/java/org/apache/iotdb/TabletExample.java | 3 +-
.../org/apache/iotdb/trigger/LoggerTrigger.java | 4 +-
integration-test/pom.xml | 61 +-
.../iotdb/it/env/cluster/ClusterConstant.java | 1 +
.../it/env/cluster/config/MppCommonConfig.java | 12 +
.../it/env/cluster/config/MppConfigNodeConfig.java | 6 -
.../iotdb/it/env/cluster/config/MppJVMConfig.java | 18 +
.../env/cluster/config/MppSharedCommonConfig.java | 14 +
.../iotdb/it/env/cluster/env/AbstractEnv.java | 16 +-
.../it/env/cluster/node/AbstractNodeWrapper.java | 1 +
.../it/env/cluster/node/ConfigNodeWrapper.java | 1 +
.../it/env/remote/config/RemoteCommonConfig.java | 10 +
.../env/remote/config/RemoteConfigNodeConfig.java | 5 -
.../iotdb/it/framework/IoTDBTestReporter.java | 9 +-
.../org/apache/iotdb/it/utils/TsFileGenerator.java | 16 +-
.../org/apache/iotdb/itbase/env/CommonConfig.java | 4 +
.../apache/iotdb/itbase/env/ConfigNodeConfig.java | 2 -
.../iotdb/itbase/runtime/ClusterTestStatement.java | 38 +-
.../iotdb/itbase/runtime/RequestDelegate.java | 26 +-
.../it/database/IoTDBDatabaseSetAndDeleteIT.java | 8 +-
.../IoTDBRegionMigrateReliabilityITFramework.java | 8 +-
.../org/apache/iotdb/db/it/IOTDBLoadTsFileIT.java | 5 +-
.../org/apache/iotdb/db/it/IoTDBFlushQueryIT.java | 7 +-
.../org/apache/iotdb/db/it/IoTDBNestedQueryIT.java | 40 +-
.../iotdb/db/it/IoTDBPartialInsertionIT.java | 3 +-
.../org/apache/iotdb/db/it/IoTDBRepairDataIT.java | 4 +-
.../org/apache/iotdb/db/it/IoTDBRestServiceIT.java | 21 +-
.../org/apache/iotdb/db/it/IoTDBSimpleQueryIT.java | 64 +
.../db/it/IoTDBSyntaxConventionIdentifierIT.java | 4 +-
.../it/IoTDBSyntaxConventionStringLiteralIT.java | 4 +-
.../db/it/aggregation/IoTDBAggregationIT.java | 387 +-
.../aggregation/IoTDBAggregationSmallDataIT.java | 4 +-
.../iotdb/db/it/aggregation/IoTDBVarianceIT.java | 74 +-
.../maxby/IoTDBMaxByAlignedSeriesIT.java | 28 +-
.../db/it/aggregation/maxby/IoTDBMaxByIT.java | 66 +-
.../minby/IoTDBMinByAlignedSeriesIT.java | 16 +-
.../db/it/aggregation/minby/IoTDBMinByIT.java | 54 +-
...oTDBAlignByDeviceWithTemplateAggregationIT.java | 542 +
.../org/apache/iotdb/db/it/auth/IoTDBAuthIT.java | 29 +
.../iotdb/db/it/auth/IoTDBClusterAuthorityIT.java | 4 +-
.../iotdb/db/it/auth/IoTDBSeriesPermissionIT.java | 10 +-
.../scalar/IoTDBReplaceFunctionIT.java | 47 +-
.../scalar/IoTDBSubStringFunctionIT.java | 67 +-
.../iotdb/db/it/query/IoTDBCaseWhenThenIT.java | 2 +-
.../query/IoTDBQueryWithComplexValueFilterIT.java | 235 +-
.../apache/iotdb/db/it/query/IoTDBResultSetIT.java | 2 +
.../it/query/IoTDBSelectCompareExpressionIT.java | 10 +-
.../db/it/schema/IoTDBAutoCreateSchemaIT.java | 57 +
.../db/it/schema/IoTDBCreateStorageGroupIT.java | 1 +
.../iotdb/db/it/schema/IoTDBMetadataFetchIT.java | 35 +-
.../apache/iotdb/db/it/schema/IoTDBTagLimitIT.java | 150 +
.../db/it/udf/IoTDBUDTFBuiltinFunctionIT.java | 226 +-
.../org/apache/iotdb/flink/it/AbstractTest.java | 46 -
.../java/org/apache/iotdb/flink/it/SinkTest.java | 163 -
.../java/org/apache/iotdb/flink/it/SourceTest.java | 192 -
.../test/java/org/apache/iotdb/flink/it/Utils.java | 94 -
.../apache/iotdb/it/framework/IoTDBTestRunner.java | 3 +
.../pipe/it/autocreate/AbstractPipeDualAutoIT.java | 4 +-
.../pipe/it/autocreate/IoTDBPipeAutoDropIT.java | 80 +
.../pipe/it/autocreate/IoTDBPipeClusterIT.java | 66 +-
.../IoTDBPipeConnectorCompressionIT.java | 182 +
.../pipe/it/autocreate/IoTDBPipeDataSinkIT.java | 17 +-
.../pipe/it/autocreate/IoTDBPipeExtractorIT.java | 73 +-
.../pipe/it/autocreate/IoTDBPipeIdempotentIT.java | 4 +-
.../pipe/it/autocreate/IoTDBPipeProcessorIT.java | 4 +-
.../pipe/it/autocreate/IoTDBPipeProtocolIT.java | 12 +-
.../pipe/it/manual/AbstractPipeDualManualIT.java | 4 +-
.../iotdb/pipe/it/manual/IoTDBPipeInclusionIT.java | 56 +-
.../pipe/it/manual/IoTDBPipeMetaHistoricalIT.java | 41 +-
.../it/manual/IoTDBPipeMetaLeaderChangeIT.java | 36 +-
.../pipe/it/manual/IoTDBPipeMetaRestartIT.java | 28 +-
.../iotdb/pipe/it/single/AbstractPipeSingleIT.java | 2 +-
.../session/it/IoTDBSessionAlignedInsertIT.java | 3 +-
.../iotdb/session/it/IoTDBSessionComplexIT.java | 5 +-
.../it/IoTDBSessionDisableMemControlIT.java | 5 +-
.../IoTDBSessionInsertWithTriggerExecutionIT.java | 3 +-
.../iotdb/session/it/IoTDBSessionSimpleIT.java | 155 +-
.../session/it/IoTDBSessionSyntaxConventionIT.java | 3 +-
.../org/apache/iotdb/session/it/SessionIT.java | 226 +-
.../org/apache/iotdb/spark/it/AbstractTest.java | 55 -
.../java/org/apache/iotdb/spark/it/ReadTest.java | 145 -
.../test/java/org/apache/iotdb/spark/it/Utils.java | 95 -
.../java/org/apache/iotdb/spark/it/WriteTest.java | 116 -
.../it/IoTDBSubscriptionITConstant.java | 30 +
.../it/dual/AbstractSubscriptionDualIT.java | 7 +-
.../it/dual/IoTDBSubscriptionConsumerGroupIT.java | 331 +-
.../it/dual/IoTDBSubscriptionTopicIT.java | 271 +-
.../it/local/IoTDBSubscriptionBasicIT.java | 227 +-
.../it/local/IoTDBSubscriptionRestartIT.java | 103 +-
.../iotdb/zeppelin/it/IoTDBInterpreterIT.java | 390 -
.../parameter/PipeParameterValidator.java | 4 +-
.../main/java/org/apache/iotdb/udf/api/State.java | 3 +-
.../main/java/org/apache/iotdb/udf/api/UDAF.java | 3 +-
.../java/org/apache/iotdb/udf/api/type/Type.java | 19 +-
.../src/assembly/resources/conf/logback-backup.xml | 49 +
.../cli/src/assembly/resources/sbin/start-cli.bat | 2 +-
.../cli/src/assembly/resources/tools/backup.bat | 14 +-
.../cli/src/assembly/resources/tools/backup.sh | 6 +-
.../src/assembly/resources/tools/export-data.bat | 6 +-
.../src/assembly/resources/tools/export-tsfile.bat | 6 +-
.../src/assembly/resources/tools/import-data.bat | 6 +-
.../src/assembly/resources/tools/load-tsfile.bat | 2 +-
.../java/org/apache/iotdb/cli/AbstractCli.java | 3 +-
.../java/org/apache/iotdb/tool/ExportData.java | 7 +-
.../java/org/apache/iotdb/tool/ExportTsFile.java | 40 +-
.../java/org/apache/iotdb/tool/ImportData.java | 44 +-
.../org/apache/iotdb/tool/IoTDBDataBackTool.java | 329 +-
iotdb-client/client-cpp/src/main/Session.cpp | 4 +-
iotdb-client/client-py/requirements_dev.txt | 2 +-
.../org/apache/iotdb/isession/INodeSupplier.java | 3 +
.../java/org/apache/iotdb/isession/ISession.java | 36 +-
.../org/apache/iotdb/isession/SessionConfig.java | 1 +
.../org/apache/iotdb/isession/SessionDataSet.java | 27 +-
.../apache/iotdb/isession/pool/ISessionPool.java | 52 +-
.../iotdb/isession/pool/SessionDataSetWrapper.java | 1 +
.../iotdb/jdbc/AbstractIoTDBJDBCResultSet.java | 17 +-
.../main/java/org/apache/iotdb/jdbc/Config.java | 1 +
.../iotdb/jdbc/GroupedLSBWatermarkEncoder.java | 2 +
.../org/apache/iotdb/jdbc/IoTDBConnection.java | 3 +-
.../apache/iotdb/jdbc/IoTDBDatabaseMetadata.java | 95 +-
.../java/org/apache/iotdb/jdbc/IoTDBDriver.java | 1 +
.../org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java | 35 +-
.../iotdb/jdbc/IoTDBNonAlignJDBCResultSet.java | 8 +-
.../java/org/apache/iotdb/jdbc/IoTDBStatement.java | 17 +-
.../iotdb/jdbc/IoTDBDatabaseMetadataTest.java | 2 +-
.../org/apache/iotdb/jdbc/IoTDBStatementTest.java | 2 +-
iotdb-client/service-rpc/pom.xml | 4 +
.../org/apache/iotdb/rpc/IoTDBJDBCDataSet.java | 39 +-
.../java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java | 26 +-
.../main/java/org/apache/iotdb/rpc/RpcUtils.java | 1 +
.../java/org/apache/iotdb/rpc/TSStatusCode.java | 2 +
.../rpc/subscription/config/ConsumerConfig.java | 19 +-
.../rpc/subscription/config/ConsumerConstant.java | 22 +-
.../iotdb/rpc/subscription/config/TopicConfig.java | 37 +-
.../rpc/subscription/config/TopicConstant.java | 5 +-
.../exception/SubscriptionConnectionException.java | 40 +
.../exception/SubscriptionException.java | 8 +-
.../SubscriptionIncompatibleHandlerException.java | 42 +
.../SubscriptionParameterNotValidException.java | 13 +-
.../SubscriptionPollTimeOutException.java | 45 -
.../SubscriptionRuntimeCriticalException.java | 41 +
.../exception/SubscriptionRuntimeException.java | 40 +
.../SubscriptionRuntimeNonCriticalException.java | 42 +
.../rpc/subscription/payload/EnrichedTablets.java | 104 -
.../subscription/payload/poll/ErrorPayload.java | 85 +
.../subscription/payload/poll/FileInitPayload.java | 75 +
.../payload/poll/FilePiecePayload.java | 123 +
.../subscription/payload/poll/FileSealPayload.java | 85 +
.../subscription/payload/poll/PollFilePayload.java | 103 +
.../rpc/subscription/payload/poll/PollPayload.java | 79 +
.../payload/poll/SubscriptionCommitContext.java | 152 +
.../payload/poll/SubscriptionPollPayload.java | 31 +
.../payload/poll/SubscriptionPollRequest.java | 111 +
.../payload/poll/SubscriptionPollRequestType.java | 55 +
.../payload/poll/SubscriptionPollResponse.java | 122 +
.../payload/poll/SubscriptionPollResponseType.java | 60 +
.../subscription/payload/poll/TabletsPayload.java | 92 +
.../payload/request/PipeSubscribeCloseReq.java | 6 +-
.../payload/request/PipeSubscribeCommitReq.java | 48 +-
.../payload/request/PipeSubscribeHandshakeReq.java | 19 +-
.../payload/request/PipeSubscribeHeartbeatReq.java | 7 +-
.../payload/request/PipeSubscribePollReq.java | 46 +-
.../payload/request/PipeSubscribeRequestType.java | 8 +-
.../request/PipeSubscribeRequestVersion.java | 2 +-
.../payload/request/PipeSubscribeSubscribeReq.java | 9 +-
.../request/PipeSubscribeUnsubscribeReq.java | 8 +-
.../payload/response/PipeSubscribeCloseResp.java | 8 +-
.../payload/response/PipeSubscribeCommitResp.java | 9 +-
.../response/PipeSubscribeHandshakeResp.java | 47 +-
.../response/PipeSubscribeHeartbeatResp.java | 8 +-
.../payload/response/PipeSubscribePollResp.java | 88 +-
.../response/PipeSubscribeResponseType.java | 9 +-
.../response/PipeSubscribeResponseVersion.java | 2 +-
.../response/PipeSubscribeSubscribeResp.java | 8 +-
.../response/PipeSubscribeUnsubscribeResp.java | 8 +-
.../apache/iotdb/session/DummyNodesSupplier.java | 12 +
.../org/apache/iotdb/session/NodesSupplier.java | 26 +-
.../apache/iotdb/session/QueryEndPointPolicy.java | 29 +
.../org/apache/iotdb/session/RoundRobinPolicy.java | 39 +
.../java/org/apache/iotdb/session/Session.java | 90 +-
.../apache/iotdb/session/SessionConnection.java | 15 +-
.../org/apache/iotdb/session/ThriftConnection.java | 5 +-
.../org/apache/iotdb/session/pool/SessionPool.java | 21 +-
.../session/subscription/AsyncCommitCallback.java | 2 +-
.../session/subscription/ConsumeListener.java | 2 +
.../subscription/ConsumerHeartbeatWorker.java | 63 -
.../subscription/PullConsumerAutoCommitWorker.java | 60 -
.../session/subscription/SubscriptionConsumer.java | 900 +-
.../subscription/SubscriptionEndpointsSyncer.java | 131 -
.../session/subscription/SubscriptionMessage.java | 85 -
.../subscription/SubscriptionMessagePayload.java | 22 -
.../session/subscription/SubscriptionProvider.java | 306 +-
.../subscription/SubscriptionProviders.java | 339 +
.../subscription/SubscriptionPullConsumer.java | 147 +-
.../subscription/SubscriptionPushConsumer.java | 112 +-
.../session/subscription/SubscriptionSession.java | 48 +-
.../SubscriptionSessionConnection.java | 75 +-
.../subscription/SubscriptionSessionDataSet.java | 176 -
.../subscription/SubscriptionSessionDataSets.java | 53 -
.../payload/SubscriptionFileHandler.java | 105 +
.../subscription/payload/SubscriptionMessage.java | 106 +
.../payload/SubscriptionMessageHandler.java | 27 +
.../payload/SubscriptionMessageType.java | 55 +
.../payload/SubscriptionSessionDataSet.java | 181 +
.../SubscriptionSessionDataSetsHandler.java | 62 +
.../payload/SubscriptionTsFileHandler.java | 41 +
.../subscription/util/RandomStringGenerator.java | 37 +
.../subscription/util/SubscriptionPollTimer.java | 79 +
.../apache/iotdb/session/util/SessionUtils.java | 33 +-
.../iotdb/session/SessionCacheLeaderTest.java | 7 +-
.../java/org/apache/iotdb/session/SessionTest.java | 31 +-
.../java/org/apache/iotdb/session/TabletTest.java | 3 +-
.../session/pool/SessionPoolExceptionTest.java | 7 +-
.../apache/iotdb/session/pool/SessionPoolTest.java | 25 +-
.../iotdb/session/util/SessionUtilsTest.java | 5 +-
iotdb-connector/flink-iotdb-connector/README.md | 58 -
iotdb-connector/flink-iotdb-connector/pom.xml | 84 -
.../iotdb/flink/DefaultIoTSerializationSchema.java | 130 -
.../main/java/org/apache/iotdb/flink/Event.java | 70 -
.../java/org/apache/iotdb/flink/IoTDBSink.java | 213 -
.../java/org/apache/iotdb/flink/IoTDBSource.java | 100 -
.../apache/iotdb/flink/IoTSerializationSchema.java | 32 -
.../apache/iotdb/flink/options/IoTDBOptions.java | 70 -
.../iotdb/flink/options/IoTDBSinkOptions.java | 106 -
.../iotdb/flink/options/IoTDBSourceOptions.java | 51 -
.../flink/DefaultIoTSerializationSchemaTest.java | 54 -
.../iotdb/flink/IoTDBSinkBatchInsertTest.java | 116 -
.../iotdb/flink/IoTDBSinkBatchTimerTest.java | 83 -
.../apache/iotdb/flink/IoTDBSinkInsertTest.java | 72 -
iotdb-connector/flink-sql-iotdb-connector/pom.xml | 124 -
.../flink/sql/client/IoTDBWebSocketClient.java | 92 -
.../org/apache/iotdb/flink/sql/common/Options.java | 64 -
.../org/apache/iotdb/flink/sql/common/Utils.java | 177 -
.../sql/exception/IllegalIoTDBPathException.java | 25 -
.../sql/exception/IllegalOptionException.java | 25 -
.../sql/exception/IllegalSchemaException.java | 25 -
.../sql/exception/IllegalUrlPathException.java | 25 -
.../exception/UnsupportedDataTypeException.java | 25 -
.../sql/factory/IoTDBDynamicTableFactory.java | 230 -
.../sql/function/IoTDBBoundedScanFunction.java | 167 -
.../flink/sql/function/IoTDBCDCSourceFunction.java | 297 -
.../flink/sql/function/IoTDBLookupFunction.java | 149 -
.../flink/sql/function/IoTDBSinkFunction.java | 143 -
.../flink/sql/provider/IoTDBDynamicTableSink.java | 64 -
.../sql/provider/IoTDBDynamicTableSource.java | 76 -
.../iotdb/flink/sql/wrapper/SchemaWrapper.java | 46 -
.../iotdb/flink/sql/wrapper/TabletWrapper.java | 47 -
.../org.apache.flink.table.factories.Factory | 20 -
iotdb-connector/flink-tsfile-connector/README.md | 177 -
iotdb-connector/flink-tsfile-connector/pom.xml | 158 -
.../apache/iotdb/flink/tsfile/RowRecordParser.java | 46 -
.../iotdb/flink/tsfile/RowRowRecordParser.java | 121 -
.../iotdb/flink/tsfile/RowTSRecordConverter.java | 166 -
.../iotdb/flink/tsfile/TSRecordConverter.java | 60 -
.../iotdb/flink/tsfile/TSRecordOutputFormat.java | 98 -
.../iotdb/flink/tsfile/TsFileInputFormat.java | 174 -
.../iotdb/flink/tsfile/TsFileOutputFormat.java | 136 -
.../iotdb/flink/tsfile/util/TSFileConfigUtil.java | 65 -
.../RowTSRecordOutputFormatIntegrationTest.java | 54 -
.../flink/tsfile/RowTSRecordOutputFormatTest.java | 75 -
.../flink/tsfile/RowTsFileConnectorTestBase.java | 77 -
.../RowTsFileInputFormatIntegrationTest.java | 108 -
.../flink/tsfile/RowTsFileInputFormatTest.java | 88 -
.../flink/tsfile/RowTsFileInputFormatTestBase.java | 49 -
.../tsfile/RowTsFileOutputFormatTestBase.java | 119 -
.../util/TSFileConfigUtilCompletenessTest.java | 102 -
.../apache/iotdb/flink/util/TsFileWriteUtil.java | 233 -
.../src/test/resources/log4j.properties | 28 -
.../grafana-connector/img/add_data_source.png | Bin 108927 -> 0 bytes
.../grafana-connector/img/add_graph.png | Bin 364163 -> 0 bytes
.../grafana-connector/img/edit_data_source.png | Bin 177869 -> 0 bytes
iotdb-connector/grafana-connector/pom.xml | 257 -
iotdb-connector/grafana-connector/readme.md | 192 -
iotdb-connector/grafana-connector/readme_zh.md | 195 -
.../web/grafana/TsfileWebDemoApplication.java | 30 -
.../apache/iotdb/web/grafana/bean/TimeValues.java | 47 -
.../iotdb/web/grafana/conf/MyConfiguration.java | 47 -
.../controller/DatabaseConnectController.java | 196 -
.../org/apache/iotdb/web/grafana/dao/BasicDao.java | 34 -
.../iotdb/web/grafana/dao/impl/BasicDaoImpl.java | 208 -
.../web/grafana/interceptor/LoginInterceptor.java | 64 -
.../grafana/service/DatabaseConnectService.java | 33 -
.../service/impl/DatabaseConnectServiceImpl.java | 46 -
.../src/main/resources/application.properties | 39 -
.../web/grafana/dao/impl/BasicDaoImplTest.java | 53 -
iotdb-connector/grafana-plugin/.gitignore | 33 -
iotdb-connector/grafana-plugin/.prettierrc.js | 20 -
iotdb-connector/grafana-plugin/CHANGELOG.md | 24 -
iotdb-connector/grafana-plugin/LICENSE | 201 -
iotdb-connector/grafana-plugin/Magefile.go | 32 -
iotdb-connector/grafana-plugin/README.md | 177 -
iotdb-connector/grafana-plugin/backend-compile.bat | 31 -
iotdb-connector/grafana-plugin/backend-compile.sh | 48 -
iotdb-connector/grafana-plugin/go.mod | 107 -
iotdb-connector/grafana-plugin/jest.config.js | 24 -
iotdb-connector/grafana-plugin/package.json | 31 -
iotdb-connector/grafana-plugin/pkg/main.go | 40 -
.../pkg/plugin/iotdb_resource_handler.go | 170 -
.../grafana-plugin/pkg/plugin/plugin.go | 430 -
iotdb-connector/grafana-plugin/pom.xml | 116 -
.../grafana-plugin/src/ConfigEditor.tsx | 108 -
iotdb-connector/grafana-plugin/src/QueryEditor.tsx | 343 -
.../src/componments/AggregateFun.tsx | 44 -
.../src/componments/ControlValue.tsx | 38 -
.../grafana-plugin/src/componments/FillValue.tsx | 38 -
.../grafana-plugin/src/componments/Form.tsx | 42 -
.../grafana-plugin/src/componments/FromValue.tsx | 110 -
.../grafana-plugin/src/componments/GroupBy.tsx | 58 -
.../grafana-plugin/src/componments/SelectValue.tsx | 110 -
.../grafana-plugin/src/componments/TimeSeries.tsx | 82 -
.../grafana-plugin/src/componments/WhereValue.tsx | 39 -
iotdb-connector/grafana-plugin/src/datasource.ts | 106 -
iotdb-connector/grafana-plugin/src/functions.ts | 20 -
.../grafana-plugin/src/img/addIoTDBDataSource.png | Bin 43760 -> 0 bytes
iotdb-connector/grafana-plugin/src/img/logo.svg | 271 -
.../grafana-plugin/src/img/showData.png | Bin 170827 -> 0 bytes
iotdb-connector/grafana-plugin/src/module.ts | 25 -
iotdb-connector/grafana-plugin/src/plugin.json | 50 -
iotdb-connector/grafana-plugin/src/types.ts | 68 -
iotdb-connector/grafana-plugin/tsconfig.json | 9 -
iotdb-connector/grafana-plugin/yarn.lock | 11194 -------------------
iotdb-connector/hadoop/README.md | 212 -
iotdb-connector/hadoop/pom.xml | 191 -
.../iotdb/hadoop/fileSystem/HDFSConfUtil.java | 115 -
.../apache/iotdb/hadoop/fileSystem/HDFSFile.java | 455 -
.../apache/iotdb/hadoop/fileSystem/HDFSInput.java | 114 -
.../apache/iotdb/hadoop/fileSystem/HDFSOutput.java | 108 -
.../org/apache/iotdb/hadoop/tsfile/IReaderSet.java | 38 -
.../iotdb/hadoop/tsfile/TSFHadoopException.java | 45 -
.../apache/iotdb/hadoop/tsfile/TSFInputFormat.java | 297 -
.../apache/iotdb/hadoop/tsfile/TSFInputSplit.java | 39 -
.../iotdb/hadoop/tsfile/TSFOutputFormat.java | 58 -
.../iotdb/hadoop/tsfile/TSFRecordReader.java | 260 -
.../iotdb/hadoop/tsfile/TSFRecordWriter.java | 62 -
.../iotdb/hadoop/tsfile/record/HDFSTSRecord.java | 202 -
.../apache/iotdb/hadoop/tsfile/TSFHadoopTest.java | 229 -
.../iotdb/hadoop/tsfile/TSFInputSplitTest.java | 71 -
.../iotdb/hadoop/tsfile/TsFileTestHelper.java | 121 -
.../iotdb/hadoop/tsfile/constant/TestConstant.java | 28 -
.../hadoop/src/test/resources/logback.xml | 41 -
iotdb-connector/hive-connector/pom.xml | 139 -
.../org/apache/iotdb/hive/TSFHiveInputFormat.java | 56 -
.../org/apache/iotdb/hive/TSFHiveOutputFormat.java | 75 -
.../org/apache/iotdb/hive/TSFHiveRecordReader.java | 158 -
.../org/apache/iotdb/hive/TSFHiveRecordWriter.java | 71 -
.../org/apache/iotdb/hive/TsFileDeserializer.java | 159 -
.../java/org/apache/iotdb/hive/TsFileSerDe.java | 169 -
.../apache/iotdb/hive/TsFileSerDeException.java | 40 -
.../apache/iotdb/hive/TSFHiveInputFormatTest.java | 111 -
.../apache/iotdb/hive/TSFHiveRecordReaderTest.java | 159 -
.../apache/iotdb/hive/TsFileDeserializerTest.java | 126 -
.../org/apache/iotdb/hive/TsFileSerDeTest.java | 149 -
.../org/apache/iotdb/hive/TsFileTestHelper.java | 126 -
.../apache/iotdb/hive/constant/TestConstant.java | 28 -
.../hive-connector/src/test/resources/logback.xml | 39 -
iotdb-connector/pom.xml | 66 -
iotdb-connector/spark-iotdb-connector/pom.xml | 140 -
.../spark-iotdb-connector/scala_2.11/pom.xml | 50 -
.../spark-iotdb-connector/scala_2.12/pom.xml | 51 -
.../org/apache/iotdb/spark/db/Converter.scala | 89 -
.../org/apache/iotdb/spark/db/DataFrameTools.scala | 131 -
.../org/apache/iotdb/spark/db/DefaultSource.scala | 61 -
.../org/apache/iotdb/spark/db/IoTDBOptions.scala | 43 -
.../scala/org/apache/iotdb/spark/db/IoTDBRDD.scala | 137 -
.../org/apache/iotdb/spark/db/IoTDBRelation.scala | 117 -
.../org/apache/iotdb/spark/db/SQLConstant.scala | 27 -
.../org/apache/iotdb/spark/db/Transformer.scala | 172 -
.../scala/org/apache/iotdb/spark/db/package.scala | 36 -
iotdb-connector/spark-tsfile/pom.xml | 114 -
.../iotdb/spark/tsfile/io/TsFileOutputFormat.java | 45 -
.../iotdb/spark/tsfile/io/TsFileRecordWriter.java | 61 -
.../org/apache/iotdb/spark/tsfile/qp/Executor.java | 51 -
.../iotdb/spark/tsfile/qp/QueryProcessor.java | 195 -
.../spark/tsfile/qp/common/BasicOperator.java | 66 -
.../spark/tsfile/qp/common/FilterOperator.java | 161 -
.../iotdb/spark/tsfile/qp/common/Operator.java | 44 -
.../iotdb/spark/tsfile/qp/common/SQLConstant.java | 138 -
.../iotdb/spark/tsfile/qp/common/SingleQuery.java | 65 -
.../iotdb/spark/tsfile/qp/common/TSQueryPlan.java | 68 -
.../qp/exception/BasicOperatorException.java | 29 -
.../tsfile/qp/exception/DNFOptimizeException.java | 29 -
.../qp/exception/LogicalOptimizeException.java | 29 -
.../tsfile/qp/exception/MergeFilterException.java | 28 -
.../qp/exception/QueryOperatorException.java | 28 -
.../qp/exception/QueryProcessorException.java | 37 -
.../tsfile/qp/exception/RemoveNotException.java | 29 -
.../tsfile/qp/optimizer/DNFFilterOptimizer.java | 154 -
.../tsfile/qp/optimizer/IFilterOptimizer.java | 31 -
.../qp/optimizer/MergeSingleFilterOptimizer.java | 133 -
.../tsfile/qp/optimizer/PhysicalOptimizer.java | 251 -
.../tsfile/qp/optimizer/RemoveNotOptimizer.java | 92 -
.../org/apache/iotdb/spark/tsfile/Converter.scala | 144 -
.../apache/iotdb/spark/tsfile/DefaultSource.scala | 293 -
.../iotdb/spark/tsfile/NarrowConverter.scala | 596 -
.../spark/tsfile/NarrowTsFileOutputWriter.scala | 50 -
.../apache/iotdb/spark/tsfile/Transformer.scala | 175 -
.../iotdb/spark/tsfile/TsFileWriterFactory.scala | 42 -
.../apache/iotdb/spark/tsfile/WideConverter.scala | 504 -
.../spark/tsfile/WideTsFileOutputWriter.scala | 53 -
.../org/apache/iotdb/spark/tsfile/package.scala | 62 -
.../apache/iotdb/spark/constant/TestConstant.java | 28 -
.../org/apache/iotdb/spark/tool/TsFileExample.java | 111 -
.../apache/iotdb/spark/tool/TsFileWriteTool.java | 280 -
.../apache/iotdb/spark/tsfile/ConverterTest.scala | 270 -
.../apache/iotdb/spark/tsfile/HDFSInputTest.java | 81 -
.../org/apache/iotdb/spark/tsfile/TSFileSuit.scala | 641 --
.../zeppelin-interpreter/IoTDB-Zeppelin-Demo.zpln | 377 -
iotdb-connector/zeppelin-interpreter/pom.xml | 90 -
.../apache/zeppelin/iotdb/IoTDBInterpreter.java | 296 -
.../src/main/resources/interpreter-setting.json | 70 -
.../org/apache/iotdb/db/qp/sql/IdentifierParser.g4 | 1 +
.../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 23 +-
.../antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 | 10 +
iotdb-core/confignode/pom.xml | 4 +
.../src/assembly/resources/conf/confignode-env.bat | 14 +-
.../assembly/resources/sbin/remove-confignode.bat | 14 +-
.../assembly/resources/sbin/remove-confignode.sh | 11 +
.../assembly/resources/sbin/start-confignode.bat | 10 +-
.../assembly/resources/sbin/stop-confignode.bat | 4 +-
.../confignode/client/DataNodeRequestType.java | 1 +
.../heartbeat/DataNodeHeartbeatHandler.java | 7 +-
.../iotdb/confignode/conf/ConfigNodeConfig.java | 2 +-
.../consensus/request/ConfigPhysicalPlan.java | 4 +
.../consensus/request/ConfigPhysicalPlanType.java | 2 +
.../consensus/request/auth/AuthorPlan.java | 21 +-
.../consensus/request/read/ttl/ShowTTLPlan.java | 38 +
.../request/write/database/SetTTLPlan.java | 52 +-
.../pipe/payload/PipeDeleteLogicalViewPlan.java | 11 +-
.../pipe/payload/PipeDeleteTimeSeriesPlan.java | 11 +-
.../request/write/pipe/payload/PipeSetTTLPlan.java | 103 +
.../response/pipe/task/PipeTableResp.java | 95 +-
.../consensus/response/ttl/ShowTTLResp.java | 61 +
.../iotdb/confignode/manager/ClusterManager.java | 2 +
.../iotdb/confignode/manager/ConfigManager.java | 78 +-
.../apache/iotdb/confignode/manager/IManager.java | 10 +
.../iotdb/confignode/manager/ProcedureManager.java | 47 +-
.../iotdb/confignode/manager/TTLManager.java | 150 +
.../manager/consensus/ConsensusManager.java | 21 +-
.../iotdb/confignode/manager/load/LoadManager.java | 58 +-
.../manager/load/balancer/RouteBalancer.java | 9 +-
.../router/leader/AbstractLeaderBalancer.java | 48 +-
.../router/leader/GreedyLeaderBalancer.java | 14 +-
.../router/leader/MinCostFlowLeaderBalancer.java | 142 +-
.../confignode/manager/load/cache/LoadCache.java | 183 +-
.../consensus/ConsensusGroupHeartbeatSample.java | 7 +
.../cache/consensus/ConsensusGroupStatistics.java | 7 +
.../manager/load/cache/node/BaseNodeCache.java | 8 +-
.../manager/load/cache/node/NodeStatistics.java | 4 +-
.../manager/load/cache/region/RegionCache.java | 3 +-
.../load/cache/region/RegionGroupCache.java | 30 +-
.../load/cache/region/RegionHeartbeatSample.java | 7 +
.../manager/load/service/EventService.java | 133 +-
.../manager/load/service/HeartbeatService.java | 16 +-
.../load/subscriber/NodeStatisticsChangeEvent.java | 31 +
.../iotdb/confignode/manager/node/NodeManager.java | 20 +-
.../manager/partition/PartitionManager.java | 6 +-
.../pipe/agent/task/PipeConfigNodeTaskAgent.java | 48 +-
.../payload/PipeTransferConfigSnapshotSealReq.java | 33 +-
.../protocol/IoTDBConfigRegionAirGapConnector.java | 22 +-
.../protocol/IoTDBConfigRegionConnector.java | 48 +-
.../coordinator/runtime/PipeHeartbeatParser.java | 267 -
.../runtime/PipeHeartbeatScheduler.java | 137 -
.../runtime/PipeRuntimeCoordinator.java | 24 +-
.../runtime/heartbeat/PipeHeartbeat.java | 85 +
.../runtime/heartbeat/PipeHeartbeatParser.java | 279 +
.../runtime/heartbeat/PipeHeartbeatScheduler.java | 145 +
.../pipe/event/PipeConfigRegionSnapshotEvent.java | 8 +-
.../pipe/execution/PipeConfigNodeSubtask.java | 122 +-
.../execution/PipeConfigNodeSubtaskExecutor.java | 4 +-
.../extractor/ConfigRegionListeningFilter.java | 10 +-
.../pipe/extractor/IoTDBConfigRegionExtractor.java | 54 +-
.../PipeConfigPhysicalPlanPatternParseVisitor.java | 287 +
.../pipe/metric/PipeConfigNodeListenerMetrics.java | 67 +
.../manager/pipe/metric/PipeConfigNodeMetrics.java | 16 +-
.../metric/PipeConfigNodeRemainingTimeMetrics.java | 178 +
.../PipeConfigNodeRemainingTimeOperator.java | 113 +
.../metric/PipeConfigRegionConnectorMetrics.java | 157 +
.../metric/PipeConfigRegionExtractorMetrics.java | 153 +
.../pipe/metric/PipeTemporaryMetaMetrics.java | 175 +
.../receiver/protocol/IoTDBConfigNodeReceiver.java | 51 +-
.../PipeConfigPhysicalPlanTSStatusVisitor.java | 55 +-
.../manager/schema/ClusterSchemaManager.java | 118 +-
.../iotdb/confignode/persistence/AuthorInfo.java | 10 +-
.../iotdb/confignode/persistence/TTLInfo.java | 200 +
.../persistence/executor/ConfigPlanExecutor.java | 29 +-
.../confignode/persistence/node/NodeInfo.java | 31 +-
.../partition/DatabasePartitionTable.java | 4 +-
.../persistence/partition/PartitionInfo.java | 1 +
.../persistence/partition/RegionGroup.java | 4 +-
.../partition/maintainer/RegionCreateTask.java | 29 +-
.../confignode/persistence/pipe/PipeInfo.java | 75 +-
.../confignode/persistence/pipe/PipeTaskInfo.java | 94 +-
.../schema/CNPhysicalPlanGenerator.java | 35 +-
.../persistence/schema/CNSnapshotFileType.java | 3 +-
.../persistence/schema/ClusterSchemaInfo.java | 33 +-
.../confignode/persistence/schema/ConfigMTree.java | 2 -
.../schema/ConfignodeSnapshotParser.java | 9 +
.../schema/mnode/factory/ConfigMNodeFactory.java | 10 +-
.../schema/mnode/info/ConfigDatabaseInfo.java | 10 -
.../iotdb/confignode/procedure/Procedure.java | 32 +-
.../confignode/procedure/ProcedureExecutor.java | 4 +-
.../procedure/env/ConfigNodeProcedureEnv.java | 64 +-
.../procedure/env/RegionMaintainHandler.java | 64 +-
.../impl/node/AddConfigNodeProcedure.java | 2 +-
.../impl/region/AddRegionPeerProcedure.java | 47 +-
.../impl/region/CreateRegionGroupsProcedure.java | 18 +-
.../impl/region/RemoveRegionPeerProcedure.java | 14 +-
.../procedure/impl/schema/SetTTLProcedure.java | 189 +
.../procedure/scheduler/ProcedureScheduler.java | 4 +-
.../procedure/state/schema/SetTTLState.java | 24 +
.../procedure/store/ProcedureFactory.java | 9 +
.../confignode/procedure/store/ProcedureType.java | 4 +
.../iotdb/confignode/service/ConfigNode.java | 44 +-
.../thrift/ConfigNodeRPCServiceProcessor.java | 84 +-
.../request/ConfigPhysicalPlanSerDeTest.java | 115 +-
.../consensus/response/pipe/PipeTableRespTest.java | 4 +-
.../confignode/manager/load/FakeSubscriber.java | 92 +
.../confignode/manager/load/LoadManagerTest.java | 295 +
.../router/leader/CFDLeaderBalancerTest.java | 34 +-
.../router/leader/GreedyLeaderBalancerTest.java | 30 +-
.../leader/LeaderBalancerComparisonTest.java | 39 +-
.../manager/load/cache/RegionGroupCacheTest.java | 23 +-
.../connector/PipeConfigNodeThriftRequestTest.java | 2 +-
.../extractor/IoTDBConfigRegionExtractorTest.java | 7 +-
...eConfigPhysicalPlanPatternParseVisitorTest.java | 408 +
.../persistence/CNPhysicalPlanGeneratorTest.java | 117 +-
.../confignode/persistence/PartitionInfoTest.java | 2 +-
.../iotdb/confignode/persistence/TTLInfoTest.java | 256 +
.../persistence/schema/ClusterSchemaInfoTest.java | 1 -
.../persistence/schema/ConfigMTreeTest.java | 2 -
.../pipe/receiver/PipeEnrichedProcedureTest.java | 33 +
.../procedure/impl/schema/SetTTLProcedureTest.java | 68 +
.../org/apache/iotdb/consensus/IConsensus.java | 11 +-
.../apache/iotdb/consensus/iot/IoTConsensus.java | 37 +-
.../consensus/iot/IoTConsensusServerImpl.java | 53 +-
.../consensus/iot/logdispatcher/LogDispatcher.java | 3 +-
.../iot/service/IoTConsensusRPCService.java | 7 +-
.../service/IoTConsensusRPCServiceProcessor.java | 2 +-
.../iot/snapshot/IoTConsensusRateLimiter.java | 5 +-
.../apache/iotdb/consensus/ratis/DiskGuardian.java | 65 +-
.../iotdb/consensus/ratis/RatisConsensus.java | 118 +-
.../ratis/metrics/IoTDBMetricRegistry.java | 9 +
.../iotdb/consensus/ratis/utils/RetryPolicy.java | 1 +
.../iotdb/consensus/simple/SimpleConsensus.java | 5 +
.../apache/iotdb/consensus/iot/ReplicateTest.java | 55 +-
.../iotdb/consensus/ratis/DiskGuardianTest.java | 28 +-
.../iotdb/consensus/ratis/RatisConsensusTest.java | 15 +
.../apache/iotdb/consensus/ratis/TestUtils.java | 21 +
iotdb-core/datanode/pom.xml | 6 +-
.../src/assembly/resources/conf/datanode-env.bat | 17 +-
.../assembly/resources/sbin/remove-datanode.bat | 14 +-
.../src/assembly/resources/sbin/remove-datanode.sh | 11 +
.../src/assembly/resources/sbin/start-datanode.bat | 41 +-
.../src/assembly/resources/sbin/start-datanode.sh | 1 +
.../src/assembly/resources/sbin/stop-datanode.bat | 4 +-
.../org/apache/iotdb/db/audit/AuditLogger.java | 6 +-
.../org/apache/iotdb/db/auth/AuthorityChecker.java | 22 +-
.../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 111 +-
.../org/apache/iotdb/db/conf/IoTDBDescriptor.java | 162 +-
.../org/apache/iotdb/db/conf/IoTDBStartCheck.java | 2 +
.../iotdb/db/conf/rest/IoTDBRestServiceConfig.java | 1 +
.../db/consensus/DataRegionConsensusImpl.java | 257 +-
.../dataregion/DataRegionStateMachine.java | 65 +-
.../schemaregion/SchemaExecutionVisitor.java | 27 +-
.../metadata/DataTypeMismatchException.java | 7 +-
.../PipeDataRegionProcessorConstructor.java | 4 +
.../runtime/PipeSchemaRegionListenerManager.java | 44 +-
.../db/pipe/agent/task/PipeDataNodeTaskAgent.java | 263 +-
.../client/IoTDBDataNodeAsyncClientManager.java | 16 +-
.../IoTDBDataNodeCacheLeaderClientManager.java | 6 +-
.../client/IoTDBDataNodeSyncClientManager.java | 11 +-
...oTDBThriftAsyncPipeTransferBatchReqBuilder.java | 36 -
...IoTDBThriftSyncPipeTransferBatchReqBuilder.java | 29 -
.../payload/evolvable/builder/PipeEventBatch.java | 233 +
.../builder/PipeTransferBatchReqBuilder.java | 216 +-
.../evolvable/request/PipeTransferPlanNodeReq.java | 1 +
.../request/PipeTransferSchemaSnapshotSealReq.java | 32 +-
.../request/PipeTransferTabletBatchReq.java | 23 +-
.../request/PipeTransferTabletBinaryReq.java | 57 +-
.../request/PipeTransferTabletInsertNodeReq.java | 13 +-
.../request/PipeTransferTabletRawReq.java | 2 +-
.../airgap/IoTDBDataNodeAirGapConnector.java | 8 +-
.../airgap/IoTDBDataRegionAirGapConnector.java | 31 +-
.../airgap/IoTDBSchemaRegionAirGapConnector.java | 15 +-
.../connector/protocol/opcua/OpcUaConnector.java | 2 +-
.../async/IoTDBDataRegionAsyncConnector.java | 211 +-
.../PipeTransferTabletBatchEventHandler.java | 37 +-
.../PipeTransferTabletInsertNodeEventHandler.java | 9 +-
.../PipeTransferTabletInsertionEventHandler.java | 5 +
.../PipeTransferTsFileInsertionEventHandler.java | 66 +-
.../thrift/sync/IoTDBDataNodeSyncConnector.java | 16 +-
.../thrift/sync/IoTDBDataRegionSyncConnector.java | 158 +-
.../thrift/sync/IoTDBSchemaRegionConnector.java | 33 +-
.../db/pipe/connector/util/LeaderCacheUtils.java | 69 +
.../event/common/heartbeat/PipeHeartbeatEvent.java | 34 +-
.../iotdb/db/pipe/event/common/row/PipeRow.java | 8 +-
.../db/pipe/event/common/row/PipeRowCollector.java | 6 +-
.../schema/PipeSchemaRegionSnapshotEvent.java | 2 +-
.../schema/PipeSchemaRegionWritePlanEvent.java | 4 +-
.../tablet/PipeInsertNodeTabletInsertionEvent.java | 22 +-
.../common/tablet/PipeRawTabletInsertionEvent.java | 9 +-
.../tablet/TabletInsertionDataContainer.java | 65 +-
.../event/common/terminate/PipeTerminateEvent.java | 94 +
.../common/tsfile/PipeTsFileInsertionEvent.java | 4 +-
.../tsfile/TsFileInsertionDataContainer.java | 41 +-
.../tsfile/TsFileInsertionDataTabletIterator.java | 14 +-
.../common/tsfile/TsFileInsertionPointCounter.java | 18 +-
.../db/pipe/event/realtime/PipeRealtimeEvent.java | 10 +-
.../event/realtime/PipeRealtimeEventFactory.java | 1 +
.../dataregion/DataRegionWatermarkInjector.java | 2 +-
.../dataregion/IoTDBDataRegionExtractor.java | 55 +-
.../PipeHistoricalDataRegionTsFileExtractor.java | 56 +-
.../realtime/PipeRealtimeDataRegionExtractor.java | 54 +-
.../PipeRealtimeDataRegionHybridExtractor.java | 74 +-
.../dataregion/realtime/epoch/TsFileEpoch.java | 4 +-
.../realtime/epoch/TsFileEpochManager.java | 31 +-
.../schemaregion/IoTDBSchemaRegionExtractor.java | 34 +-
.../schemaregion/PipePlanPatternParseVisitor.java | 288 +
.../schemaregion/SchemaRegionListeningFilter.java | 2 +-
.../iotdb/db/pipe/metric/PipeConnectorMetrics.java | 335 -
.../iotdb/db/pipe/metric/PipeDataNodeMetrics.java | 20 +-
.../PipeDataNodeRemainingEventAndTimeMetrics.java | 230 +
.../PipeDataNodeRemainingEventAndTimeOperator.java | 190 +
.../metric/PipeDataRegionConnectorMetrics.java | 336 +
.../metric/PipeDataRegionExtractorMetrics.java | 389 +
.../iotdb/db/pipe/metric/PipeExtractorMetrics.java | 386 -
.../iotdb/db/pipe/metric/PipeProcessorMetrics.java | 57 +-
.../metric/PipeSchemaRegionConnectorMetrics.java | 159 +
.../metric/PipeSchemaRegionExtractorMetrics.java | 144 +
.../metric/PipeSchemaRegionListenerMetrics.java | 135 +
.../pipe/pattern/CachedSchemaPatternMatcher.java | 17 +-
.../downsampling/changing/ChangingValueFilter.java | 95 +
.../changing/ChangingValueSamplingProcessor.java | 199 +
.../sdt/SwingingDoorTrendingFilter.java | 5 +-
.../exchange/sender/TwoStageAggregateSender.java | 2 +-
.../twostage/plugin/TwoStageCountProcessor.java | 2 +-
.../protocol/airgap/IoTDBAirGapReceiver.java | 13 +-
.../protocol/thrift/IoTDBDataNodeReceiver.java | 67 +-
.../visitor/PipePlanToStatementVisitor.java | 2 +-
.../visitor/PipeStatementExceptionVisitor.java | 39 +-
.../visitor/PipeStatementPatternParseVisitor.java | 139 +
.../visitor/PipeStatementTSStatusVisitor.java | 22 +
.../db/pipe/resource/memory/PipeMemoryManager.java | 8 +-
.../pipe/resource/tsfile/PipeTsFileResource.java | 33 +-
.../resource/tsfile/PipeTsFileResourceManager.java | 35 +-
.../iotdb/db/pipe/task/PipeDataNodeTask.java | 20 +-
.../pipe/task/connection/PipeEventCollector.java | 131 +-
.../db/pipe/task/stage/PipeTaskConnectorStage.java | 4 +-
.../db/pipe/task/stage/PipeTaskExtractorStage.java | 13 +
.../db/pipe/task/stage/PipeTaskProcessorStage.java | 4 +-
.../subtask/connector/PipeConnectorSubtask.java | 88 +-
.../connector/PipeConnectorSubtaskLifeCycle.java | 8 +-
.../connector/PipeConnectorSubtaskManager.java | 68 +-
.../PipeRealtimePriorityBlockingQueue.java | 136 +
.../subtask/processor/PipeProcessorSubtask.java | 53 +-
.../iotdb/db/protocol/client/ConfigNodeClient.java | 41 +-
.../iotdb/db/protocol/client/ConfigNodeInfo.java | 1 +
.../db/protocol/rest/utils/InsertRowDataUtils.java | 4 +
.../rest/utils/InsertTabletSortDataUtils.java | 1 +
.../v1/handler/StatementConstructionHandler.java | 4 +
.../v2/handler/StatementConstructionHandler.java | 4 +
.../iotdb/db/protocol/session/SessionManager.java | 1 +
.../protocol/thrift/impl/ClientRPCServiceImpl.java | 32 +-
.../impl/DataNodeInternalRPCServiceImpl.java | 28 +-
.../thrift/impl/DataNodeRegionManager.java | 11 +-
.../db/queryengine/common/MPPQueryContext.java | 60 +
.../queryengine/common/TimeseriesSchemaInfo.java | 123 +
.../common/header/ColumnHeaderConstant.java | 29 +-
.../common/schematree/ClusterSchemaTree.java | 32 +-
.../common/schematree/DeviceSchemaInfo.java | 8 +-
.../queryengine/common/schematree/ISchemaTree.java | 2 +
.../common/schematree/node/SchemaInternalNode.java | 5 +
.../schematree/node/SchemaMeasurementNode.java | 6 +
.../common/schematree/node/SchemaNode.java | 2 +
.../exception/MemoryNotEnoughException.java | 7 +-
.../execution/MemoryEstimationHelper.java | 89 +
.../aggregation/FirstValueAccumulator.java | 24 +
.../aggregation/LastValueAccumulator.java | 24 +
.../execution/aggregation/MaxByAccumulator.java | 6 +
.../aggregation/MaxMinByBaseAccumulator.java | 65 +-
.../execution/aggregation/MaxValueAccumulator.java | 50 +
.../execution/aggregation/MinByAccumulator.java | 6 +
.../execution/aggregation/MinValueAccumulator.java | 50 +
.../timerangeiterator/ITimeRangeIterator.java | 4 +-
.../queryengine/execution/driver/DataDriver.java | 25 +-
.../execution/driver/DataDriverContext.java | 12 +-
.../queryengine/execution/exchange/sink/ISink.java | 3 +-
.../execution/exchange/sink/LocalSinkChannel.java | 11 +
.../execution/exchange/sink/ShuffleSinkHandle.java | 14 +
.../execution/exchange/sink/SinkChannel.java | 16 +
.../execution/exchange/source/ISourceHandle.java | 3 +-
.../exchange/source/LocalSourceHandle.java | 14 +-
.../execution/exchange/source/SourceHandle.java | 13 +
.../fragment/FragmentInstanceContext.java | 169 +-
.../execution/fragment/QueryContext.java | 85 +-
.../execution/load/AlignedChunkData.java | 3 +
.../execution/load/LoadTsFileManager.java | 75 +-
.../execution/load/LoadTsFileRateLimiter.java | 85 +
.../execution/load/NonAlignedChunkData.java | 3 +
.../queryengine/execution/load/TsFileSplitter.java | 13 +-
.../queryengine/execution/memory/MemoryPool.java | 8 +-
.../execution/operator/AggregationUtil.java | 4 +
.../execution/operator/ExplainAnalyzeOperator.java | 21 +-
.../queryengine/execution/operator/Operator.java | 3 +-
.../execution/operator/OperatorContext.java | 15 +-
.../process/AbstractConsumeAllOperator.java | 5 +-
.../process/AggregationMergeSortOperator.java | 17 +
.../operator/process/AggregationOperator.java | 16 +
.../operator/process/ColumnInjectOperator.java | 12 +
.../operator/process/DeviceViewIntoOperator.java | 16 +-
.../operator/process/DeviceViewOperator.java | 14 +
.../execution/operator/process/FillOperator.java | 11 +
.../operator/process/FilterAndProjectOperator.java | 13 +
.../execution/operator/process/IntoOperator.java | 23 +-
.../execution/operator/process/LimitOperator.java | 11 +
.../operator/process/LinearFillOperator.java | 13 +
.../operator/process/MergeSortOperator.java | 21 +-
.../execution/operator/process/OffsetOperator.java | 11 +
.../operator/process/ProjectOperator.java | 11 +
.../process/RawDataAggregationOperator.java | 13 +
.../operator/process/SingleDeviceViewOperator.java | 11 +
.../process/SlidingWindowAggregationOperator.java | 12 +
.../execution/operator/process/SortOperator.java | 14 +
.../operator/process/TagAggregationOperator.java | 19 +
.../execution/operator/process/TopKOperator.java | 16 +
.../operator/process/TransformOperator.java | 18 +
.../filter/AbstractMonthIntervalFillFilter.java | 5 -
.../fill/filter/MonthIntervalMSFillFilter.java | 8 +-
.../fill/filter/MonthIntervalNSFillFilter.java | 12 +-
.../fill/filter/MonthIntervalUSFillFilter.java | 10 +-
.../process/join/FullOuterTimeJoinOperator.java | 24 +-
.../process/join/HorizontallyConcatOperator.java | 17 +
.../process/join/InnerTimeJoinOperator.java | 18 +
.../process/join/LeftOuterTimeJoinOperator.java | 14 +
.../last/AlignedUpdateLastCacheOperator.java | 16 +
.../AlignedUpdateViewPathLastCacheOperator.java | 6 +
.../process/last/LastQueryCollectOperator.java | 16 +
.../process/last/LastQueryMergeOperator.java | 18 +
.../operator/process/last/LastQueryOperator.java | 17 +
.../process/last/LastQuerySortOperator.java | 17 +
.../process/last/LastQueryTransformOperator.java | 15 +
.../process/last/UpdateLastCacheOperator.java | 16 +
.../last/UpdateViewPathLastCacheOperator.java | 6 +
.../process/relational/StreamSortOperator.java | 382 +
.../schema/CountGroupByLevelMergeOperator.java | 14 +
.../schema/CountGroupByLevelScanOperator.java | 18 +-
.../operator/schema/CountMergeOperator.java | 12 +
.../schema/NodeManageMemoryMergeOperator.java | 12 +
.../operator/schema/NodePathsConvertOperator.java | 12 +
.../operator/schema/NodePathsCountOperator.java | 12 +
.../operator/schema/SchemaCountOperator.java | 12 +
.../operator/schema/SchemaFetchMergeOperator.java | 15 +
.../operator/schema/SchemaFetchScanOperator.java | 12 +
.../operator/schema/SchemaQueryMergeOperator.java | 13 +
.../schema/SchemaQueryOrderByHeatOperator.java | 14 +
.../operator/schema/SchemaQueryScanOperator.java | 14 +
.../operator/schema/source/DeviceSchemaSource.java | 7 +
.../schema/source/TimeSeriesSchemaSource.java | 2 +-
.../operator/sink/IdentitySinkOperator.java | 16 +
.../operator/sink/ShuffleHelperOperator.java | 16 +
.../source/AbstractDataSourceOperator.java | 5 +-
.../AbstractSeriesAggregationScanOperator.java | 13 +-
.../AlignedSeriesAggregationScanOperator.java | 34 +-
.../operator/source/AlignedSeriesScanOperator.java | 22 +-
.../operator/source/AlignedSeriesScanUtil.java | 16 +-
.../operator/source/DataSourceOperator.java | 4 +-
.../operator/source/ExchangeOperator.java | 13 +
.../execution/operator/source/FileLoaderUtils.java | 38 +-
.../operator/source/LastCacheScanOperator.java | 12 +
.../source/SeriesAggregationScanOperator.java | 34 +-
.../operator/source/SeriesScanOperator.java | 17 +-
.../execution/operator/source/SeriesScanUtil.java | 34 +-
.../operator/source/ShowQueriesOperator.java | 12 +
.../source/relational/TableScanOperator.java | 38 +-
.../relational/ColumnTransformerBuilder.java | 66 +-
.../metric/DataExchangeCostMetricSet.java | 1 +
.../metric/QueryExecutionMetricSet.java | 3 +
.../iotdb/db/queryengine/plan/Coordinator.java | 25 +-
.../db/queryengine/plan/analyze/Analysis.java | 54 +-
.../queryengine/plan/analyze/AnalyzeVisitor.java | 421 +-
.../plan/analyze/ConcatPathRewriter.java | 33 +-
.../plan/analyze/ExpressionAnalyzer.java | 50 +-
.../plan/analyze/ExpressionTypeAnalyzer.java | 41 +-
.../queryengine/plan/analyze/ExpressionUtils.java | 69 +-
.../plan/analyze/GroupByLevelHelper.java | 3 +-
.../plan/analyze/LoadTsfileAnalyzer.java | 72 +-
.../queryengine/plan/analyze/PredicateUtils.java | 12 +-
.../plan/analyze/TemplatedAggregationAnalyze.java | 260 +
.../queryengine/plan/analyze/TemplatedAnalyze.java | 160 +-
.../db/queryengine/plan/analyze/TemplatedInfo.java | 215 +-
.../analyze/cache/partition/PartitionCache.java | 6 +-
.../cache/partition/StorageGroupCacheResult.java | 2 +
.../analyze/cache/schema/DataNodeTTLCache.java | 124 +
.../schema/DeviceUsingTemplateSchemaCache.java | 2 +-
.../plan/analyze/schema/ClusterSchemaFetcher.java | 13 +-
.../plan/analyze/schema/ISchemaComputation.java | 8 +-
.../plan/analyze/schema/ISchemaFetcher.java | 16 +
.../plan/analyze/schema/SchemaValidator.java | 2 +-
.../plan/execution/IQueryExecution.java | 4 +-
.../queryengine/plan/execution/QueryExecution.java | 7 +-
.../execution/config/TableConfigTaskVisitor.java | 26 +-
.../config/executor/ClusterConfigTaskExecutor.java | 86 +-
.../config/executor/IConfigTaskExecutor.java | 8 +-
.../execution/config/metadata/ShowTTLTask.java | 9 +-
.../config/metadata/relational/CreateDBTask.java | 2 +-
.../config/metadata/relational/DropDBTask.java | 2 +-
.../config/metadata/relational/ShowDBTask.java | 2 +-
.../config/metadata/relational/UseDBTask.java | 2 +-
.../execution/config/sys/pipe/ShowPipeTask.java | 45 +-
.../plan/execution/memory/MemorySourceHandle.java | 9 +
.../db/queryengine/plan/expression/Expression.java | 3 +-
.../plan/expression/binary/BinaryExpression.java | 12 +
.../plan/expression/leaf/ConstantOperand.java | 9 +
.../plan/expression/leaf/NullOperand.java | 10 +
.../plan/expression/leaf/TimeSeriesOperand.java | 10 +
.../plan/expression/leaf/TimestampOperand.java | 10 +
.../plan/expression/multi/FunctionExpression.java | 26 +
.../builtin/helper/ReplaceFunctionHelper.java | 4 +-
.../builtin/helper/SubStringFunctionHelper.java | 4 +-
.../expression/other/CaseWhenThenExpression.java | 16 +
.../expression/other/GroupByTimeExpression.java | 9 +
.../plan/expression/ternary/BetweenExpression.java | 14 +
.../plan/expression/unary/InExpression.java | 12 +-
.../plan/expression/unary/IsNullExpression.java | 10 +
.../plan/expression/unary/LikeExpression.java | 12 +
.../plan/expression/unary/LogicNotExpression.java | 11 +
.../plan/expression/unary/NegationExpression.java | 11 +
.../plan/expression/unary/RegularExpression.java | 12 +
.../visitor/ExpressionNormalizeVisitor.java | 17 +-
.../visitor/TransformToViewExpressionVisitor.java | 6 +
.../cartesian/BindSchemaForExpressionVisitor.java | 50 +-
.../cartesian/BindSchemaForPredicateVisitor.java | 43 +-
.../visitor/cartesian/CartesianProductVisitor.java | 23 +-
...catDeviceAndBindSchemaForExpressionVisitor.java | 27 +-
...ncatDeviceAndBindSchemaForPredicateVisitor.java | 30 +-
.../ConcatExpressionWithSuffixPathsVisitor.java | 28 +-
.../visitor/cartesian/QueryContextProvider.java | 26 +
.../predicate/ConvertPredicateToFilterVisitor.java | 20 +-
.../plan/optimization/AggregationPushDown.java | 699 ++
.../plan/optimization/ColumnInjectionPushDown.java | 30 +-
.../plan/optimization/PredicatePushDown.java | 16 +-
.../db/queryengine/plan/parser/ASTVisitor.java | 118 +-
.../plan/parser/StatementGenerator.java | 6 +-
.../plan/planner/LocalExecutionPlanContext.java | 67 +-
.../plan/planner/LocalExecutionPlanner.java | 55 +-
.../plan/planner/LogicalPlanBuilder.java | 487 +-
.../plan/planner/LogicalPlanVisitor.java | 240 +-
.../queryengine/plan/planner/LogicalPlanner.java | 6 +-
.../plan/planner/OperatorTreeGenerator.java | 592 +-
.../plan/planner/SubPlanTypeExtractor.java | 9 +
.../plan/planner/TableOperatorGenerator.java | 6 +-
.../plan/planner/TemplatedLogicalPlan.java | 261 +-
.../plan/planner/TemplatedLogicalPlanBuilder.java | 72 +-
.../queryengine/plan/planner/TreeModelPlanner.java | 11 +-
.../distribution/DistributionPlanContext.java | 10 +
.../planner/distribution/DistributionPlanner.java | 1 +
.../planner/distribution/ExchangeNodeAdder.java | 18 +
.../plan/planner/distribution/SourceRewriter.java | 104 +-
.../ConsumeAllChildrenPipelineMemoryEstimator.java | 38 +
...umeChildrenOneByOnePipelineMemoryEstimator.java | 69 +
.../planner/memory/PipelineMemoryEstimator.java | 79 +
.../memory/PipelineMemoryEstimatorFactory.java | 51 +
.../plan/planner/plan/PlanFragment.java | 6 +-
.../plan/planner/plan/TableModelTimePredicate.java | 2 +-
.../plan/planner/plan/TimePredicate.java | 3 +-
.../plan/planner/plan/node/PlanGraphPrinter.java | 32 +-
.../plan/planner/plan/node/PlanNodeId.java | 12 +-
.../plan/planner/plan/node/PlanNodeType.java | 44 +-
.../plan/planner/plan/node/PlanVisitor.java | 30 +
.../node/metedata/write/AlterTimeSeriesNode.java | 2 +-
.../node/metedata/write/CreateTimeSeriesNode.java | 2 +-
.../metedata/write/view/CreateLogicalViewNode.java | 5 +-
.../planner/plan/node/process/DeviceViewNode.java | 41 +
.../plan/planner/plan/node/process/FilterNode.java | 59 +-
.../planner/plan/node/process/ProjectNode.java | 6 +-
.../plan/node/process/RawDataAggregationNode.java | 343 +
.../planner/plan/node/process/RegionMergeNode.java | 128 +
.../plan/node/process/SingleDeviceViewNode.java | 2 +-
.../node/process/join/FullOuterTimeJoinNode.java | 5 +
.../plan/node/source/AlignedLastQueryScanNode.java | 15 +-
.../source/AlignedSeriesAggregationScanNode.java | 87 +-
.../plan/node/source/AlignedSeriesScanNode.java | 14 +-
.../plan/node/source/DeviceRegionScanNode.java | 175 +
.../plan/node/source/LastQueryScanNode.java | 13 +
.../planner/plan/node/source/RegionScanNode.java | 94 +
.../node/source/SeriesAggregationScanNode.java | 12 +
.../planner/plan/node/source/SeriesScanNode.java | 12 +
.../planner/plan/node/source/SeriesSourceNode.java | 4 +-
.../plan/node/source/TimeseriesRegionScanNode.java | 329 +
.../planner/plan/node/write/DeleteDataNode.java | 21 +
.../plan/planner/plan/node/write/InsertNode.java | 2 +
.../planner/plan/node/write/InsertRowNode.java | 56 +-
.../planner/plan/node/write/InsertRowsNode.java | 85 +-
.../planner/plan/node/write/InsertTabletNode.java | 28 +
.../plan/parameter/AggregationDescriptor.java | 4 +-
.../CrossSeriesAggregationDescriptor.java | 4 +
.../planner/plan/parameter/SeriesScanOptions.java | 19 +-
.../relational/analyzer/AggregationAnalyzer.java | 66 +-
.../plan/relational/analyzer/Analysis.java | 38 +-
.../plan/relational/analyzer/Analyzer.java | 6 +-
.../relational/analyzer/CanonicalizationAware.java | 8 +-
.../relational/analyzer/ExpressionAnalysis.java | 10 +-
.../relational/analyzer/ExpressionAnalyzer.java | 99 +-
.../relational/analyzer/ExpressionTreeUtils.java | 14 +-
.../plan/relational/analyzer/Field.java | 2 +-
.../plan/relational/analyzer/NodeRef.java | 2 +-
.../plan/relational/analyzer/RelationId.java | 2 +-
.../plan/relational/analyzer/RelationType.java | 2 +-
.../plan/relational/analyzer/Scope.java | 8 +-
.../analyzer/ScopeReferenceExtractor.java | 6 +-
.../relational/analyzer/StatementAnalyzer.java | 144 +-
.../analyzer/StatementAnalyzerFactory.java | 2 +-
.../predicate/ConvertPredicateToFilterVisitor.java | 38 +-
.../ConvertPredicateToTimeFilterVisitor.java | 32 +-
.../ConvertSchemaPredicateToFilterVisitor.java | 32 +-
.../PredicatePushIntoIndexScanChecker.java | 30 +-
.../predicate/PredicatePushIntoScanChecker.java | 30 +-
.../analyzer/predicate/PredicateVisitor.java | 28 +-
.../analyzer/schema/TableModelSchemaFetcher.java | 2 +-
.../plan/relational/metadata/DeviceEntry.java | 14 +-
.../plan/relational/metadata/Metadata.java | 2 +-
.../plan/relational/metadata/MetadataUtil.java | 4 +-
.../relational/metadata/TableMetadataImpl.java | 2 +-
.../plan/relational/planner/Assignments.java | 2 +-
.../plan/relational/planner/LogicalPlanner.java | 15 +-
.../relational/planner/OrderingTranslator.java | 2 +-
.../plan/relational/planner/PlanBuilder.java | 4 +-
.../plan/relational/planner/PredicateUtils.java | 23 +-
.../plan/relational/planner/QueryPlanner.java | 20 +-
.../plan/relational/planner/RelationPlanner.java | 26 +-
.../relational/planner/RelationalModelPlanner.java | 17 +-
.../plan/relational/planner/ScopeAware.java | 10 +-
.../plan/relational/planner/Symbol.java | 4 +-
.../distribute/FragmentInstanceGenerator.java | 4 +-
.../distribute/RelationalDistributionPlanner.java | 155 -
.../distribute/TableDistributionPlanner.java | 155 +
.../TableModelTypeProviderExtractor.java | 2 +-
.../planner/ir/DefaultTraversalVisitor.java | 32 +-
.../planner/ir/DeterminismEvaluator.java | 4 +-
.../relational/planner/ir/ExpressionRewriter.java | 32 +-
.../planner/ir/ExpressionTranslateVisitor.java | 32 +-
.../planner/ir/ExpressionTreeRewriter.java | 38 +-
.../ExtractCommonPredicatesExpressionRewriter.java | 6 +-
.../ir/GlobalTimePredicateExtractVisitor.java | 44 +-
.../plan/relational/planner/ir/IrUtils.java | 8 +-
.../plan/relational/planner/ir/IrVisitor.java | 34 +-
.../planner/ir/NormalizeOrExpressionRewriter.java | 12 +-
.../relational/planner/ir/RewritingVisitor.java | 32 +-
.../relational/planner/ir/SerializeVisitor.java | 19 +
.../plan/relational/planner/node/FilterNode.java | 17 +-
.../plan/relational/planner/node/LimitNode.java | 18 +-
.../plan/relational/planner/node/OffsetNode.java | 17 +-
.../plan/relational/planner/node/ProjectNode.java | 32 +-
.../relational/planner/node/StreamSortNode.java | 63 +
.../relational/planner/node/TableScanNode.java | 8 +-
.../planner/optimizations/IndexScan.java | 57 +-
.../optimizations/PruneTableScanColumns.java | 6 +-
.../optimizations/RelationalPlanOptimizer.java | 2 +
.../RemoveRedundantIdentityProjections.java | 2 +
.../planner/optimizations/SimplifyExpressions.java | 4 +-
.../relational/sql/parser/AntlrATNCacheFields.java | 70 +
.../plan/relational/sql/parser/AstBuilder.java | 1711 +++
.../sql/parser/CaseInsensitiveStream.java | 85 +
.../plan/relational/sql/parser/ErrorHandler.java | 438 +
.../relational/sql/parser/ParsingException.java | 69 +
.../RefreshableSqlBaseParserInitializer.java | 52 +
.../plan/relational/sql/parser/SqlParser.java | 254 +
.../plan/relational/sql/tree/AddColumn.java | 88 +
.../plan/relational/sql/tree/AliasedRelation.java | 112 +
.../plan/relational/sql/tree/AllColumns.java | 130 +
.../plan/relational/sql/tree/AllRows.java | 67 +
.../sql/tree/ArithmeticBinaryExpression.java | 142 +
.../sql/tree/ArithmeticUnaryExpression.java | 135 +
.../plan/relational/sql/tree/AstVisitor.java | 449 +
.../plan/relational/sql/tree/BetweenPredicate.java | 128 +
.../plan/relational/sql/tree/BinaryLiteral.java | 133 +
.../plan/relational/sql/tree/BooleanLiteral.java | 107 +
.../queryengine/plan/relational/sql/tree/Cast.java | 159 +
.../relational/sql/tree/CoalesceExpression.java | 92 +
.../plan/relational/sql/tree/ColumnDefinition.java | 125 +
.../relational/sql/tree/ComparisonExpression.java | 195 +
.../plan/relational/sql/tree/CreateDB.java | 114 +
.../plan/relational/sql/tree/CreateFunction.java | 104 +
.../plan/relational/sql/tree/CreateIndex.java | 110 +
.../plan/relational/sql/tree/CreateTable.java | 132 +
.../plan/relational/sql/tree/CurrentDatabase.java | 70 +
.../plan/relational/sql/tree/CurrentTime.java | 113 +
.../plan/relational/sql/tree/CurrentUser.java | 70 +
.../plan/relational/sql/tree/DataType.java | 29 +
.../relational/sql/tree/DataTypeParameter.java | 34 +
.../plan/relational/sql/tree/DecimalLiteral.java | 96 +
.../tree/DefaultExpressionTraversalVisitor.java | 29 +
.../sql/tree/DefaultTraversalVisitor.java | 490 +
.../plan/relational/sql/tree/Delete.java | 94 +
.../relational/sql/tree/DereferenceExpression.java | 151 +
.../plan/relational/sql/tree/DescribeTable.java | 80 +
.../plan/relational/sql/tree/DoubleLiteral.java | 101 +
.../plan/relational/sql/tree/DropColumn.java | 86 +
.../plan/relational/sql/tree/DropDB.java | 86 +
.../plan/relational/sql/tree/DropFunction.java | 74 +
.../plan/relational/sql/tree/DropIndex.java | 88 +
.../plan/relational/sql/tree/DropTable.java | 86 +
.../plan/relational/sql/tree/Except.java | 107 +
.../plan/relational/sql/tree/ExistsPredicate.java | 80 +
.../plan/relational/sql/tree/Explain.java | 79 +
.../plan/relational/sql/tree/ExplainAnalyze.java | 86 +
.../plan/relational/sql/tree/Expression.java | 155 +
.../plan/relational/sql/tree/FieldReference.java | 80 +
.../plan/relational/sql/tree/FunctionCall.java | 145 +
.../plan/relational/sql/tree/GenericDataType.java | 111 +
.../plan/relational/sql/tree/GenericLiteral.java | 125 +
.../plan/relational/sql/tree/GroupBy.java | 100 +
.../plan/relational/sql/tree/GroupingElement.java | 36 +
.../plan/relational/sql/tree/GroupingSets.java | 114 +
.../plan/relational/sql/tree/Identifier.java | 168 +
.../plan/relational/sql/tree/IfExpression.java | 105 +
.../plan/relational/sql/tree/InListExpression.java | 110 +
.../plan/relational/sql/tree/InPredicate.java | 106 +
.../plan/relational/sql/tree/Insert.java | 107 +
.../plan/relational/sql/tree/Intersect.java | 91 +
.../relational/sql/tree/IsNotNullPredicate.java | 97 +
.../plan/relational/sql/tree/IsNullPredicate.java | 97 +
.../queryengine/plan/relational/sql/tree/Join.java | 165 +
.../plan/relational/sql/tree/JoinCriteria.java | 37 +
.../plan/relational/sql/tree/JoinOn.java | 68 +
.../plan/relational/sql/tree/JoinUsing.java | 70 +
.../plan/relational/sql/tree/LikePredicate.java | 134 +
.../plan/relational/sql/tree/Limit.java | 96 +
.../plan/relational/sql/tree/Literal.java | 42 +
.../relational/sql/tree/LogicalExpression.java | 148 +
.../plan/relational/sql/tree/LongLiteral.java | 132 +
.../plan/relational/sql/tree/NaturalJoin.java | 51 +
.../queryengine/plan/relational/sql/tree/Node.java | 71 +
.../plan/relational/sql/tree/NodeLocation.java | 68 +
.../plan/relational/sql/tree/NotExpression.java | 97 +
.../plan/relational/sql/tree/NullIfExpression.java | 86 +
.../plan/relational/sql/tree/NullLiteral.java | 76 +
.../plan/relational/sql/tree/NumericParameter.java | 88 +
.../plan/relational/sql/tree/Offset.java | 94 +
.../plan/relational/sql/tree/OrderBy.java | 89 +
.../plan/relational/sql/tree/Parameter.java | 82 +
.../plan/relational/sql/tree/Property.java | 120 +
.../plan/relational/sql/tree/QualifiedName.java | 206 +
.../sql/tree/QuantifiedComparisonExpression.java | 123 +
.../plan/relational/sql/tree/Query.java | 146 +
.../plan/relational/sql/tree/QueryBody.java | 34 +
.../relational/sql/tree/QuerySpecification.java | 169 +
.../plan/relational/sql/tree/Relation.java | 32 +
.../plan/relational/sql/tree/RenameColumn.java | 92 +
.../plan/relational/sql/tree/RenameTable.java | 85 +
.../queryengine/plan/relational/sql/tree/Row.java | 77 +
.../sql/tree/SearchedCaseExpression.java | 107 +
.../plan/relational/sql/tree/Select.java | 100 +
.../plan/relational/sql/tree/SelectItem.java | 27 +
.../plan/relational/sql/tree/SetOperation.java | 42 +
.../plan/relational/sql/tree/SetProperties.java | 107 +
.../plan/relational/sql/tree/ShowDB.java | 64 +
.../plan/relational/sql/tree/ShowFunctions.java | 65 +
.../plan/relational/sql/tree/ShowIndex.java | 78 +
.../plan/relational/sql/tree/ShowTables.java | 92 +
.../relational/sql/tree/SimpleCaseExpression.java | 124 +
.../plan/relational/sql/tree/SimpleGroupBy.java | 89 +
.../plan/relational/sql/tree/SingleColumn.java | 114 +
.../plan/relational/sql/tree/SortItem.java | 122 +
.../relational/sql/tree/StackableAstVisitor.java | 65 +
.../plan/relational/sql/tree/Statement.java | 34 +
.../plan/relational/sql/tree/StringLiteral.java | 105 +
.../relational/sql/tree/SubqueryExpression.java | 79 +
.../plan/relational/sql/tree/SymbolReference.java | 87 +
.../plan/relational/sql/tree/Table.java | 89 +
.../relational/sql/tree/TableExpressionType.java | 57 +
.../plan/relational/sql/tree/TableSubquery.java | 85 +
.../queryengine/plan/relational/sql/tree/Trim.java | 141 +
.../plan/relational/sql/tree/TypeParameter.java | 78 +
.../plan/relational/sql/tree/Union.java | 92 +
.../plan/relational/sql/tree/Update.java | 109 +
.../plan/relational/sql/tree/UpdateAssignment.java | 84 +
.../queryengine/plan/relational/sql/tree/Use.java | 81 +
.../plan/relational/sql/tree/Values.java | 83 +
.../plan/relational/sql/tree/WhenClause.java | 86 +
.../queryengine/plan/relational/sql/tree/With.java | 100 +
.../plan/relational/sql/tree/WithQuery.java | 130 +
.../plan/relational/sql/util/AstUtil.java | 99 +
.../relational/sql/util/ExpressionFormatter.java | 673 ++
.../plan/relational/sql/util/QueryUtil.java | 208 +
.../relational/sql/util/ReservedIdentifiers.java | 48 +
.../plan/relational/sql/util/SqlFormatter.java | 783 ++
.../relational/type/TypeSignatureTranslator.java | 12 +-
.../plan/relational/utils/NodeUtils.java | 4 +-
.../scheduler/FragmentInstanceDispatcherImpl.java | 4 +-
.../scheduler/load/LoadTsFileDispatcherImpl.java | 195 +-
.../plan/scheduler/load/LoadTsFileScheduler.java | 49 +-
.../plan/statement/crud/InsertBaseStatement.java | 21 +-
.../crud/InsertMultiTabletsStatement.java | 18 +-
.../plan/statement/crud/InsertRowStatement.java | 25 +-
.../crud/InsertRowsOfOneDeviceStatement.java | 12 +-
.../plan/statement/crud/InsertRowsStatement.java | 12 +-
.../plan/statement/crud/InsertStatement.java | 35 +-
.../plan/statement/crud/InsertTableStatement.java | 19 +-
.../plan/statement/crud/InsertTabletStatement.java | 11 +
.../plan/statement/crud/LoadTsFileStatement.java | 4 +-
.../plan/statement/literal/BinaryLiteral.java | 93 +
.../plan/statement/literal/Literal.java | 5 +-
.../statement/metadata/CountDevicesStatement.java | 16 +
.../metadata/CountTimeSeriesStatement.java | 15 +
.../metadata/CreateAlignedTimeSeriesStatement.java | 55 +
.../plan/statement/metadata/SetTTLStatement.java | 14 +-
.../statement/metadata/ShowDatabaseStatement.java | 22 +-
.../statement/metadata/ShowDevicesStatement.java | 14 +
.../metadata/ShowTimeSeriesStatement.java | 16 +-
.../plan/statement/metadata/UnSetTTLStatement.java | 3 +-
.../metadata/view/AlterLogicalViewStatement.java | 1 +
.../dag/column/unary/InColumnTransformer.java | 10 +-
.../multi/MappableUDFQueryRowTransformer.java | 4 +
.../multi/UniversalUDFQueryTransformer.java | 4 +
.../dag/transformer/unary/InTransformer.java | 6 +
.../transformation/dag/util/LayerCacheUtils.java | 4 +
.../row/ElasticSerializableRowRecordList.java | 1 +
.../row/SerializableRowRecordList.java | 4 +
.../tv/ElasticSerializableTVList.java | 1 +
.../datastructure/tv/SerializableTVList.java | 8 +
.../schemaengine/metric/SchemaEngineMemMetric.java | 15 +-
.../schemaengine/metric/SchemaRegionMemMetric.java | 21 +
.../rescon/ISchemaEngineStatistics.java | 2 +
.../rescon/MemSchemaEngineStatistics.java | 14 +
.../rescon/MemSchemaRegionStatistics.java | 3 +
.../schemaengine/schemaregion/ISchemaRegion.java | 4 +
.../schemaregion/impl/SchemaRegionMemoryImpl.java | 64 +-
.../schemaregion/impl/SchemaRegionPBTreeImpl.java | 59 +-
.../mtree/impl/mem/MTreeBelowSGMemoryImpl.java | 2 +
.../schemaregion/mtree/impl/mem/MemMTreeStore.java | 9 +-
.../impl/mem/mnode/factory/MemMNodeFactory.java | 10 +-
.../mtree/impl/mem/mnode/impl/DatabaseMNode.java | 6 -
.../impl/mem/mnode/info/DatabaseDeviceInfo.java | 16 +-
.../mtree/impl/mem/mnode/info/DatabaseInfo.java | 15 +-
.../mtree/impl/mem/mnode/info/LogicalViewInfo.java | 6 +-
.../mtree/impl/mem/mnode/info/MeasurementInfo.java | 3 +
.../impl/mem/snapshot/MemMTreeSnapshotUtil.java | 2 +-
.../mtree/impl/pbtree/MTreeBelowSGCachedImpl.java | 1 +
.../mtree/impl/pbtree/flush/Scheduler.java | 1 +
.../pbtree/mnode/factory/CacheMNodeFactory.java | 10 +-
.../pbtree/mnode/impl/CachedDatabaseMNode.java | 6 -
.../impl/pbtree/schemafile/MockSchemaFile.java | 16 +-
.../mtree/impl/pbtree/schemafile/SchemaFile.java | 9 +-
.../impl/pbtree/schemafile/SegmentedPage.java | 1 +
.../schemafile/pagemgr/BTreePageManager.java | 4 +-
.../pbtree/schemafile/pagemgr/PageManager.java | 5 +-
.../reader/impl/TimeseriesReaderWithViewFetch.java | 1 +
.../schemaengine/schemaregion/tag/TagLogFile.java | 203 +-
.../schemaengine/schemaregion/tag/TagManager.java | 162 +-
.../schemaengine/schemaregion/utils/MetaUtils.java | 22 +-
.../schemaregion/utils/ResourceByPathUtils.java | 196 +-
.../view/visitor/TransformToExpressionVisitor.java | 6 +
.../write/req/view/ICreateLogicalViewPlan.java | 8 +-
.../java/org/apache/iotdb/db/service/DataNode.java | 19 +-
.../db/service/DataNodeServerCommandLine.java | 7 +-
.../apache/iotdb/db/service/IoTDBShutdownHook.java | 4 +-
.../org/apache/iotdb/db/service/RPCService.java | 7 +-
.../iotdb/db/service/RegionMigrateService.java | 8 +
.../db/service/metrics/CompactionMetrics.java | 153 +
.../db/service/metrics/DataNodeMetricsHelper.java | 4 +
.../metrics/file/CompactionFileMetrics.java | 2 +-
.../iotdb/db/storageengine/StorageEngine.java | 108 +-
.../buffer/TimeSeriesMetadataCache.java | 15 +-
.../db/storageengine/dataregion/DataRegion.java | 584 +-
.../dataregion/IDataRegionForQuery.java | 27 +-
.../dataregion/ILastFlushTimeMap.java | 3 +
.../dataregion/VirtualDataRegion.java | 32 +-
.../compaction/constant/CompactionTaskType.java | 4 +-
.../CompactionTableSchemaNotMatchException.java | 26 +
.../performer/impl/FastCompactionPerformer.java | 54 +-
.../impl/ReadChunkCompactionPerformer.java | 9 +-
.../impl/ReadPointCompactionPerformer.java | 27 +-
.../RepairUnsortedFileCompactionPerformer.java | 4 +-
.../execute/recover/CompactionRecoverManager.java | 129 +-
.../execute/task/AbstractCompactionTask.java | 91 +-
.../execute/task/CompactionTaskPriorityType.java | 42 -
.../execute/task/CrossSpaceCompactionTask.java | 144 +-
.../execute/task/InnerSpaceCompactionTask.java | 344 +-
.../task/InsertionCrossSpaceCompactionTask.java | 22 +-
.../task/RepairUnsortedFileCompactionTask.java | 21 +-
.../execute/task/SettleCompactionTask.java | 387 +
.../subtask/FastCompactionPerformerSubTask.java | 23 +-
.../execute/utils/CompactionPathUtils.java | 18 +-
.../execute/utils/CompactionTableSchema.java | 86 +
.../utils/CompactionTableSchemaCollector.java | 97 +
.../compaction/execute/utils/CompactionUtils.java | 33 +-
.../execute/utils/MultiTsFileDeviceIterator.java | 66 +-
.../fast/AlignedSeriesCompactionExecutor.java | 5 +-
.../fast/NonAlignedSeriesCompactionExecutor.java | 5 +-
.../executor/fast/SeriesCompactionExecutor.java | 31 +-
.../fast/element/NonAlignedPageElement.java | 2 +-
.../readchunk/AlignedSeriesCompactionExecutor.java | 3 +-
.../ReadChunkAlignedSeriesCompactionExecutor.java | 3 +-
.../readchunk/SingleSeriesCompactionExecutor.java | 9 +-
.../execute/utils/log/CompactionLogger.java | 34 +
.../execute/utils/log/SimpleCompactionLogger.java | 4 +
.../utils/reader/SeriesDataBlockReader.java | 25 +-
.../utils/writer/AbstractCompactionWriter.java | 28 +-
.../writer/AbstractCrossCompactionWriter.java | 5 +
.../writer/AbstractInnerCompactionWriter.java | 7 +
.../compaction/io/CompactionTsFileReader.java | 2 +-
.../compaction/io/CompactionTsFileWriter.java | 18 +
.../compaction/repair/RepairDataFileScanUtil.java | 25 +-
.../schedule/CompactionScheduleSummary.java | 46 +
.../schedule/CompactionScheduleTaskManager.java | 29 +-
.../schedule/CompactionScheduleTaskWorker.java | 4 +-
.../compaction/schedule/CompactionScheduler.java | 97 +-
.../compaction/schedule/CompactionTaskManager.java | 68 +-
.../compaction/schedule/CompactionTaskQueue.java | 2 +
.../compaction/schedule/TTLScheduleTask.java | 73 +
.../DefaultCompactionTaskComparatorImpl.java | 56 +-
.../compaction/selector/ICompactionSelector.java | 6 +-
.../compaction/selector/ISettleSelector.java | 29 +
.../estimator/AbstractCompactionEstimator.java | 19 +-
.../compaction/selector/estimator/FileInfo.java | 1 +
.../impl/RewriteCrossSpaceCompactionSelector.java | 5 +-
.../selector/impl/SettleSelectorImpl.java | 326 +
.../impl/SizeTieredCompactionSelector.java | 51 +-
.../selector/utils/TsFileResourceCandidate.java | 4 +-
.../compaction/tool/ListTimeRangeImpl.java | 1 +
.../dataregion/memtable/AbstractMemTable.java | 339 +-
.../memtable/AlignedReadOnlyMemChunk.java | 8 +-
.../memtable/AlignedWritableMemChunk.java | 10 +-
.../dataregion/memtable/DeviceIDFactory.java | 18 +-
.../dataregion/memtable/IMemTable.java | 30 +-
.../dataregion/memtable/IWritableMemChunk.java | 4 +-
.../dataregion/memtable/ReadOnlyMemChunk.java | 7 +-
.../dataregion/memtable/TsFileProcessor.java | 592 +-
.../dataregion/memtable/WritableMemChunk.java | 16 +-
.../dataregion/memtable/WritableMemChunkGroup.java | 3 +
.../dataregion/modification/Modification.java | 2 +-
.../dataregion/read/IQueryDataSource.java | 25 +
.../dataregion/read/QueryDataSource.java | 16 +-
.../read/QueryDataSourceForRegionScan.java | 52 +
.../dataregion/read/QueryDataSourceType.java | 25 +
.../dataregion/read/control/FileReaderManager.java | 6 +-
.../dataregion/read/filescan/IChunkHandle.java | 49 +
.../dataregion/read/filescan/IFileScanHandle.java | 99 +
.../filescan/impl/ClosedFileScanHandleImpl.java | 211 +
.../filescan/impl/DiskAlignedChunkHandleImpl.java | 81 +
.../read/filescan/impl/DiskChunkHandleImpl.java | 137 +
.../filescan/impl/MemAlignedChunkHandleImpl.java | 72 +
.../read/filescan/impl/MemChunkHandleImpl.java | 56 +
.../filescan/impl/UnclosedFileScanHandleImpl.java | 180 +
.../read/filescan/model/AbstractChunkOffset.java | 49 +
.../model/AbstractDeviceChunkMetaData.java | 36 +
.../read/filescan/model/AlignedChunkOffset.java | 52 +
.../filescan/model/AlignedDeviceChunkMetaData.java | 44 +
.../read/filescan/model/ChunkOffset.java | 48 +
.../read/filescan/model/DeviceChunkMetaData.java | 45 +
.../read/filescan/model/DeviceStartEndTime.java | 46 +
.../read/reader/chunk/MemPageReader.java | 4 +
.../metadata/MemAlignedChunkMetadataLoader.java | 6 +-
.../chunk/metadata/MemChunkMetadataLoader.java | 6 +-
.../dataregion/tsfile/TsFileResource.java | 155 +-
.../dataregion/tsfile/TsFileResourceBlockType.java | 1 +
.../generator/SimpleFileVersionController.java | 2 +
.../tsfile/generator/TsFileNameGenerator.java | 45 +
.../tsfile/timeindex/ArrayDeviceTimeIndex.java | 445 +
.../tsfile/timeindex/DeviceTimeIndex.java | 447 -
.../dataregion/tsfile/timeindex/FileTimeIndex.java | 16 +-
.../dataregion/tsfile/timeindex/ITimeIndex.java | 16 +-
.../tsfile/timeindex/PlainDeviceTimeIndex.java | 111 +
.../tsfile/timeindex/TimeIndexLevel.java | 15 +-
.../dataregion/utils/SharedTimeDataBuffer.java | 91 +
.../utils/TsFileDeviceStartEndTimeIterator.java | 52 +
.../dataregion/utils/TsFileResourceUtils.java | 36 +-
.../utils/validate/TsFileResourceValidator.java | 3 +-
.../dataregion/wal/allocation/ElasticStrategy.java | 1 +
.../wal/allocation/FirstCreateStrategy.java | 1 +
.../wal/allocation/RoundRobinStrategy.java | 1 +
.../dataregion/wal/buffer/WALBuffer.java | 6 +
.../dataregion/wal/buffer/WALEntry.java | 6 +
.../dataregion/wal/buffer/WALEntryType.java | 7 +-
.../dataregion/wal/buffer/WALInfoEntry.java | 1 +
.../wal/checkpoint/CheckpointManager.java | 5 +
.../dataregion/wal/node/IWALNode.java | 4 +
.../dataregion/wal/node/WALFakeNode.java | 6 +
.../storageengine/dataregion/wal/node/WALNode.java | 16 +
.../dataregion/wal/recover/WALNodeRecoverTask.java | 23 +-
.../dataregion/wal/recover/WALRecoverManager.java | 2 +
.../wal/recover/file/TsFilePlanRedoer.java | 25 +
.../file/UnsealedTsFileRecoverPerformer.java | 4 +
.../dataregion/wal/utils/WALWriteUtils.java | 9 +-
.../wal/utils/listener/AbstractResultListener.java | 1 +
.../db/storageengine/rescon/disk/TierManager.java | 5 +
.../rescon/memory/PrimitiveArrayManager.java | 27 +-
.../db/storageengine/rescon/memory/SystemInfo.java | 48 +
.../rescon/memory/TimePartitionManager.java | 14 +
.../agent/SubscriptionBrokerAgent.java | 98 +-
.../agent/SubscriptionConsumerAgent.java | 7 +-
.../subscription/agent/SubscriptionTopicAgent.java | 20 +-
.../broker/EnrichedTabletsBinaryCache.java | 62 -
.../broker/SerializedEnrichedEvent.java | 124 -
.../db/subscription/broker/SubscriptionBroker.java | 103 +-
.../broker/SubscriptionPrefetchingQueue.java | 271 +-
.../SubscriptionPrefetchingTabletsQueue.java | 244 +
.../broker/SubscriptionPrefetchingTsFileQueue.java | 377 +
.../db/subscription/event/SubscriptionEvent.java | 148 +
.../event/SubscriptionEventBinaryCache.java | 140 +
.../event/SubscriptionTsFileEvent.java | 247 +
.../subscription/metric/SubscriptionMetrics.java | 57 +
.../SubscriptionPrefetchingQueueMetrics.java | 197 +
.../receiver/SubscriptionReceiverV1.java | 362 +-
.../task/stage/SubscriptionTaskConnectorStage.java | 4 +-
.../task/subtask/SubscriptionConnectorSubtask.java | 6 +-
.../SubscriptionConnectorSubtaskLifeCycle.java | 4 +-
.../SubscriptionConnectorSubtaskManager.java | 71 +-
.../subscription/timer/SubscriptionPollTimer.java | 79 -
.../iotdb/db/tools/TsFileResourcePrinter.java | 4 +-
.../apache/iotdb/db/tools/TsFileSelfCheckTool.java | 44 +-
.../apache/iotdb/db/tools/TsFileSketchTool.java | 106 +-
.../iotdb/db/tools/TsFileSplitByPartitionTool.java | 16 +-
.../org/apache/iotdb/db/tools/TsFileSplitTool.java | 4 +
.../java/org/apache/iotdb/db/tools/WalChecker.java | 4 +-
.../db/tools/schema/SRStatementGenerator.java | 71 +-
.../db/tools/settle/TsFileAndModSettleTool.java | 1 +
.../TsFileOverlapValidationAndRepairTool.java | 3 +-
.../db/tools/validate/TsFileValidationTool.java | 9 +-
.../db/trigger/executor/TriggerFireVisitor.java | 5 +-
.../org/apache/iotdb/db/utils/CommonUtils.java | 97 +-
.../org/apache/iotdb/db/utils/DateTimeUtils.java | 53 +-
.../iotdb/db/utils/EncodingInferenceUtils.java | 4 +
.../apache/iotdb/db/utils/ErrorHandlingUtils.java | 3 +
.../java/org/apache/iotdb/db/utils/MathUtils.java | 1 +
.../java/org/apache/iotdb/db/utils/MemUtils.java | 26 +-
.../apache/iotdb/db/utils/ModificationUtils.java | 96 +
.../apache/iotdb/db/utils/QueryDataSetUtils.java | 12 +
.../org/apache/iotdb/db/utils/SchemaUtils.java | 4 +
.../apache/iotdb/db/utils/TimeValuePairUtils.java | 32 +-
.../apache/iotdb/db/utils/TypeInferenceUtils.java | 37 +-
.../db/utils/datastructure/AlignedTVList.java | 45 +-
.../iotdb/db/utils/datastructure/BinaryTVList.java | 3 +-
.../db/utils/datastructure/BooleanTVList.java | 3 +-
.../iotdb/db/utils/datastructure/DoubleTVList.java | 3 +-
.../iotdb/db/utils/datastructure/FloatTVList.java | 3 +-
.../iotdb/db/utils/datastructure/IntTVList.java | 3 +-
.../iotdb/db/utils/datastructure/LongTVList.java | 3 +-
.../iotdb/db/utils/datastructure/TVList.java | 26 +-
.../db/utils/windowing/window/WindowImpl.java | 4 +
.../dataregion/DataRegionStateMachineTest.java | 46 +-
.../apache/iotdb/db/metadata/MetaUtilsTest.java | 3 +-
.../mtree/schemafile/SchemaFileLogTest.java | 2 +-
.../metadata/mtree/schemafile/SchemaFileTest.java | 29 +-
.../iotdb/db/metadata/path/PatternTreeMapTest.java | 55 +
.../schemaRegion/SchemaRegionAliasAndTagTest.java | 1 +
.../schemaRegion/SchemaStatisticsTest.java | 37 +-
.../connector/PipeDataNodeThriftRequestTest.java | 7 +-
.../PipeStatementPatternParseVisitorTest.java | 161 +
.../event/TsFileInsertionDataContainerTest.java | 5 +-
.../PipeConnectorSubtaskExecutorTest.java | 4 +-
.../extractor/IoTDBDataRegionExtractorTest.java | 18 +-
.../extractor/PipePlanPatternParseVisitorTest.java | 428 +
.../db/pipe/extractor/PipeRealtimeExtractTest.java | 6 +-
.../pattern/CachedSchemaPatternMatcherTest.java | 21 +-
.../db/pipe/pattern/IoTDBPipePatternTest.java | 48 +-
.../db/pipe/pattern/PrefixPipePatternTest.java | 48 +-
.../resource/PipeTsFileResourceManagerTest.java | 16 +-
.../org/apache/iotdb/db/qp/sql/ASTVisitorTest.java | 12 +-
.../common/schematree/ClusterSchemaTreeTest.java | 5 +-
.../exception/MemoryNotEnoughExceptionTest.java | 37 -
.../db/queryengine/execution/DataDriverTest.java | 28 +-
.../aggregation/TimeRangeIteratorTest.java | 229 +-
.../queryengine/execution/exchange/StubSink.java | 8 +
.../operator/AggregationOperatorTest.java | 18 +-
.../AlignedSeriesAggregationScanOperatorTest.java | 25 +-
.../operator/AlignedSeriesScanOperatorTest.java | 121 +-
.../execution/operator/AlignedSeriesTestUtil.java | 29 +-
.../execution/operator/DeviceViewOperatorTest.java | 18 +-
.../execution/operator/FillOperatorTest.java | 15 +
.../operator/HorizontallyConcatOperatorTest.java | 28 +-
.../operator/LastQueryMergeOperatorTest.java | 20 +
.../execution/operator/LastQueryOperatorTest.java | 25 +-
.../operator/LastQuerySortOperatorTest.java | 25 +-
.../execution/operator/LimitOperatorTest.java | 19 +-
.../execution/operator/LinearFillOperatorTest.java | 35 +
.../execution/operator/MergeSortOperatorTest.java | 1503 ++-
.../execution/operator/OffsetOperatorTest.java | 55 +-
.../execution/operator/OperatorMemoryTest.java | 36 +-
.../operator/RawDataAggregationOperatorTest.java | 20 +-
.../SeriesAggregationScanOperatorTest.java | 15 +-
.../execution/operator/SeriesScanOperatorTest.java | 13 +-
.../operator/SingleDeviceViewOperatorTest.java | 22 +-
.../SlidingWindowAggregationOperatorTest.java | 15 +-
.../execution/operator/SortOperatorTest.java | 186 +-
.../execution/operator/TopKOperatorTest.java | 1828 +--
.../operator/UpdateLastCacheOperatorTest.java | 10 +-
.../process/join/InnerTimeJoinOperatorTest.java | 60 +
.../join/LeftOuterTimeJoinOperatorTest.java | 30 +
.../schema/SchemaFetchScanOperatorTest.java | 2 +-
.../schema/SchemaQueryScanOperatorTest.java | 7 +-
.../operator/sink/IdentitySinkOperatorTest.java | 31 +-
.../schedule/DefaultDriverSchedulerTest.java | 3 +-
.../plan/analyze/ExpressionAnalyzerTest.java | 8 +-
.../plan/optimization/AggregationPushDownTest.java | 334 +
.../optimization/ColumnInjectionPushDownTest.java | 214 +-
.../plan/optimization/LimitOffsetPushDownTest.java | 6 +-
.../plan/optimization/OptimizationTestUtil.java | 36 +-
.../plan/optimization/PredicatePushDownTest.java | 6 +-
.../plan/optimization/TestPlanBuilder.java | 53 +-
.../plan/planner/PipelineBuilderTest.java | 572 +
.../distribution/AggregationAlignByDeviceTest.java | 70 +-
.../distribution/AggregationDistributionTest.java | 4 +-
.../AlignByDeviceOrderByLimitOffsetTest.java | 18 +-
.../planner/distribution/AlignedByDeviceTest.java | 435 +-
.../distribution/RegionScanPlanningTest.java | 149 +
.../logical/DataQueryLogicalPlannerTest.java | 412 +-
.../logical/RegionScanLogicalPlannerTest.java | 206 +
.../logical/SchemaQueryLogicalPlannerTest.java | 23 +-
.../planner/node/process/FilterNodeSerdeTest.java | 3 +-
.../node/write/InsertRowsNodeSerdeTest.java | 58 +
.../plan/relational/analyzer/AnalyzerTest.java | 160 +-
.../relational/analyzer/MockTablePartition.java | 174 +
.../plan/relational/analyzer/TestMatadata.java | 6 +-
.../relational/planner/PredicateUtilsTest.java | 2 +-
.../builder/EvaluationDAGBuilderTest.java | 1 -
.../storageengine/buffer/BloomFilterCacheTest.java | 3 +-
.../db/storageengine/buffer/ChunkCacheTest.java | 11 +-
.../storageengine/dataregion/DataRegionTest.java | 198 +-
.../dataregion/LastFlushTimeMapTest.java | 47 +-
.../db/storageengine/dataregion/TTLQueryTest.java | 190 +
.../iotdb/db/storageengine/dataregion/TTLTest.java | 133 +-
.../TsFileResourceProgressIndexTest.java | 15 +-
.../compaction/AbstractCompactionTest.java | 72 +-
.../compaction/CompactionDataTypeNotMatchTest.java | 9 +-
.../compaction/CompactionOverlapCheckTest.java | 6 +
.../compaction/CompactionSchedulerTest.java | 8 +
.../CompactionSchedulerWithFastPerformerTest.java | 8 +
.../compaction/CompactionTaskComparatorTest.java | 81 +-
.../compaction/CompactionValidationTest.java | 59 +-
.../CrossSpaceCompactionWithUnusualCasesTest.java | 16 +-
.../compaction/FastAlignedCrossCompactionTest.java | 1597 ++-
.../FastCompactionPerformerWithEmptyPageTest.java | 3 +-
.../FastCrossCompactionPerformerTest.java | 1098 +-
.../FastInnerCompactionPerformerTest.java | 283 +-
.../FastNonAlignedCrossCompactionTest.java | 1597 ++-
.../compaction/ReadChunkInnerCompactionTest.java | 75 +-
.../ReadPointAlignedCrossCompactionTest.java | 1597 ++-
.../ReadPointCompactionPerformerTest.java | 1545 ++-
.../ReadPointNonAlignedCrossCompactionTest.java | 1597 ++-
.../compaction/TestUtilsForAlignedSeries.java | 23 +-
.../TsFileValidationCorrectnessTests.java | 27 +-
.../cross/CrossSpaceCompactionExceptionTest.java | 13 +-
.../cross/CrossSpaceCompactionSelectorTest.java | 44 +-
...eCompactionWithFastPerformerValidationTest.java | 100 +-
...actionWithReadPointPerformerValidationTest.java | 96 +-
.../InsertionCrossSpaceCompactionRecoverTest.java | 105 +-
.../InsertionCrossSpaceCompactionSelectorTest.java | 158 +-
.../dataregion/compaction/cross/MergeTest.java | 9 +-
.../compaction/cross/MergeUpgradeTest.java | 6 +-
.../cross/RewriteCompactionFileSelectorTest.java | 15 +-
.../RewriteCrossSpaceCompactionRecoverTest.java | 15 +-
...eCrossSpaceCompactionWithFastPerformerTest.java | 32 +-
...sSpaceCompactionWithReadPointPerformerTest.java | 32 +-
.../inner/AbstractInnerSpaceCompactionTest.java | 9 +-
.../inner/FastCompactionPerformerAlignedTest.java | 113 +-
.../FastCompactionPerformerNoAlignedTest.java | 75 +-
.../inner/InnerCompactionMoreDataTest.java | 20 +-
.../compaction/inner/InnerCompactionTest.java | 9 +-
.../InnerSeqCompactionWithFastPerformerTest.java | 13 +-
...nerSeqCompactionWithReadChunkPerformerTest.java | 13 +-
.../inner/InnerSpaceCompactionExceptionTest.java | 35 +-
.../inner/InnerSpaceCompactionSelectorTest.java | 24 +-
.../InnerUnseqCompactionWithFastPerformerTest.java | 5 +-
...rUnseqCompactionWithReadPointPerformerTest.java | 5 +-
...nkCompactionPerformerWithAlignedSeriesTest.java | 104 +-
.../ReadChunkCompactionPerformerAlignedTest.java | 115 +-
.../ReadChunkCompactionPerformerNoAlignedTest.java | 99 +-
.../inner/ReadChunkCompactionPerformerOldTest.java | 5 +-
.../SizeTieredCompactionRecoverTest.java | 94 +-
.../SizeTieredCompactionSelectorTest.java | 8 +-
.../inner/sizetiered/SizeTieredCompactionTest.java | 9 +-
.../recover/SizeTieredCompactionRecoverTest.java | 65 +-
.../repair/RepairUnsortedFileCompactionTest.java | 5 +-
.../settle/SettleCompactionRecoverTest.java | 1138 ++
.../settle/SettleCompactionSelectorTest.java | 1169 ++
.../settle/SettleCompactionTaskTest.java | 481 +
.../settle/SettleRequestHandlerTest.java | 3 +-
.../CompactionTableModelTestFileWriter.java | 78 +
.../TableModelFastCompactionPerformerTest.java | 256 +
...TableModelReadChunkCompactionPerformerTest.java | 329 +
...TableModelReadPointCompactionPerformerTest.java | 268 +
.../compaction/tools/UnseqSpaceStatisticsTest.java | 40 +-
.../compaction/utils/CompactionCheckerUtils.java | 22 +-
.../compaction/utils/CompactionConfigRestorer.java | 2 +-
.../utils/CompactionFileGeneratorUtils.java | 7 +-
.../compaction/utils/CompactionTestFileWriter.java | 12 +-
.../utils/MultiTsFileDeviceIteratorTest.java | 222 +-
.../compaction/utils/TsFileGeneratorUtils.java | 48 +-
.../dataregion/memtable/MemTableTestUtils.java | 3 +-
.../dataregion/memtable/PrimitiveMemTableTest.java | 118 +-
.../dataregion/memtable/TsFileProcessorTest.java | 230 +-
.../MemAlignedChunkMetadataLoaderTest.java | 7 +-
.../chunk/metadata/MemChunkMetadataLoaderTest.java | 4 +-
.../series/AbstractAlignedSeriesScanTest.java | 10 +-
.../read/reader/series/AbstractSeriesScanTest.java | 6 +-
.../AlignedSeriesScanLimitOffsetPushDownTest.java | 9 +-
.../AlignedSeriesScanPredicatePushDownTest.java | 9 +-
...gleColumnSeriesScanLimitOffsetPushDownTest.java | 9 +-
.../read/reader/series/SeriesReaderTestUtil.java | 21 +-
.../series/SeriesScanLimitOffsetPushDownTest.java | 3 +-
.../series/SeriesScanPredicatePushDownTest.java | 3 +-
.../dataregion/snapshot/IoTDBSnapshotTest.java | 9 +-
.../dataregion/tsfile/TsFileResourceTest.java | 24 +-
.../dataregion/wal/io/WALFileTest.java | 66 +
.../wal/node/ConsensusReqReaderTest.java | 89 +-
.../dataregion/wal/node/WALEntryHandlerTest.java | 271 +-
.../wal/recover/WALRecoverManagerTest.java | 62 +-
.../wal/recover/WALRecoverWriterTest.java | 93 +-
.../file/SealedTsFileRecoverPerformerTest.java | 7 +-
.../wal/recover/file/TsFilePlanRedoerTest.java | 62 +-
.../file/UnsealedTsFileRecoverPerformerTest.java | 12 +-
.../rescon/memory/ResourceManagerTest.java | 35 +-
.../rescon/memory/TimePartitionManagerTest.java | 3 +
.../iotdb/db/tools/PBTreeFileSketchTest.java | 2 +-
.../iotdb/db/tools/TsFileAndModSettleToolTest.java | 1 +
.../TsFileOverlapValidationAndRepairToolTest.java | 98 +-
.../iotdb/db/tools/TsFileSelfCheckToolTest.java | 7 +-
.../iotdb/db/tools/TsFileSketchToolTest.java | 17 +-
.../org/apache/iotdb/db/tools/WalCheckerTest.java | 2 +
.../org/apache/iotdb/db/utils/BlobParserTest.java | 60 +
.../org/apache/iotdb/db/utils/MemUtilsTest.java | 5 +-
.../org/apache/iotdb/db/utils/SchemaTestUtils.java | 13 +
.../apache/iotdb/db/utils/SerializeUtilsTest.java | 3 +
.../iotdb/db/utils/TypeInferenceUtilsTest.java | 2 +-
.../datastructure/PrimitiveArrayManagerTest.java | 4 +
.../test/resources/v3tsfile/compaction-test-tsfile | Bin 0 -> 51432 bytes
.../v3tsfile/compaction-test-tsfile-resource | Bin 0 -> 103 bytes
.../iotdb/metrics/core/IoTDBMetricManager.java | 1 +
.../metrics/core/reporter/IoTDBJmxReporter.java | 9 +-
.../apache/iotdb/metrics/core/type/IoTDBRate.java | 2 +-
.../iotdb/metrics/core/uitls/IoTDBCachedGauge.java | 111 -
.../metrics/core/uitls/IoTDBCachedGaugeMBean.java | 28 -
.../core/uitls/IoTDBMetricObjNameFactory.java | 104 -
.../metrics/core/uitls/IoTDBMovingAverage.java | 86 -
.../metrics/core/uitls/ObjectNameFactory.java | 34 -
.../iotdb/metrics/core/utils/IoTDBCachedGauge.java | 116 +
.../metrics/core/utils/IoTDBCachedGaugeMBean.java | 28 +
.../core/utils/IoTDBMetricObjNameFactory.java | 104 +
.../metrics/core/utils/IoTDBMovingAverage.java | 86 +
.../metrics/core/utils/ObjectNameFactory.java | 34 +
.../iotdb/metrics/AbstractMetricManager.java | 3 +
.../iotdb/metrics/AbstractMetricService.java | 5 +
.../apache/iotdb/metrics/config/MetricConfig.java | 11 +
.../reporter/iotdb/IoTDBSessionReporter.java | 1 +
.../org/apache/iotdb/metrics/utils/MetricInfo.java | 4 +
iotdb-core/node-commons/pom.xml | 7 +-
.../resources/conf/iotdb-common.properties | 36 +-
.../assembly/resources/sbin/destroy-confignode.bat | 2 +-
.../assembly/resources/sbin/destroy-datanode.bat | 2 +-
.../src/assembly/resources/sbin/health_check.bat | 38 +-
.../src/assembly/resources/sbin/health_check.sh | 24 +-
.../assembly/resources/sbin/start-standalone.bat | 4 +-
.../assembly/resources/sbin/stop-standalone.bat | 4 +-
.../org/apache/iotdb/commons/auth/entity/Role.java | 1 +
.../iotdb/commons/auth/user/BasicUserManager.java | 1 +
.../commons/auth/user/LocalFileUserAccessor.java | 1 +
.../iotdb/commons/client/ClientPoolFactory.java | 2 +-
.../async/AsyncPipeDataTransferServiceClient.java | 17 +-
.../client/property/ThriftClientProperty.java | 2 +
.../iotdb/commons/concurrent/ThreadName.java | 2 -
.../apache/iotdb/commons/conf/CommonConfig.java | 143 +-
.../iotdb/commons/conf/CommonDescriptor.java | 58 +-
.../apache/iotdb/commons/conf/IoTDBConstant.java | 6 +-
.../commons/consensus/index/ProgressIndex.java | 4 +-
.../index/impl/TimeWindowStateProgressIndex.java | 4 +-
.../iotdb/commons/exception/IoTDBException.java | 1 +
.../commons/executable/ExecutableManager.java | 1 +
.../apache/iotdb/commons/path/AlignedFullPath.java | 76 +
.../org/apache/iotdb/commons/path/AlignedPath.java | 37 +-
.../org/apache/iotdb/commons/path/IFullPath.java | 47 +
.../apache/iotdb/commons/path/MeasurementPath.java | 16 +-
.../iotdb/commons/path/NonAlignedFullPath.java | 95 +
.../org/apache/iotdb/commons/path/PartialPath.java | 77 +-
.../apache/iotdb/commons/path/PathPatternNode.java | 5 +-
.../apache/iotdb/commons/path/PatternTreeMap.java | 56 +
.../org/apache/iotdb/commons/path/fa/IFAState.java | 12 +-
.../iotdb/commons/path/fa/IFATransition.java | 4 +-
.../apache/iotdb/commons/path/fa/IPatternFA.java | 12 +-
.../commons/path/fa/match/IStateMatchInfo.java | 28 +-
.../commons/pipe/agent/plugin/PipePluginAgent.java | 10 +-
.../commons/pipe/agent/task/PipeTaskAgent.java | 75 +-
.../iotdb/commons/pipe/config/PipeConfig.java | 47 +-
.../config/constant/PipeConnectorConstant.java | 26 +
.../config/constant/PipeExtractorConstant.java | 8 +
.../config/constant/PipeProcessorConstant.java | 11 +
.../pipe/connector/client/IoTDBClientManager.java | 45 +
.../pipe/connector/client/IoTDBSyncClient.java | 7 +
.../connector/client/IoTDBSyncClientManager.java | 4 +-
.../pipe/connector/compressor/PipeCompressor.java | 57 +
.../compressor/PipeCompressorFactory.java | 80 +
.../connector/compressor/PipeGZIPCompressor.java | 47 +
.../connector/compressor/PipeLZ4Compressor.java | 47 +
.../connector/compressor/PipeLZMA2Compressor.java | 47 +
.../connector/compressor/PipeSnappyCompressor.java | 47 +
.../connector/compressor/PipeZSTDCompressor.java | 47 +
.../pipe/connector/limiter/GlobalRateLimiter.java | 70 +
.../connector/limiter/PipeEndPointRateLimiter.java | 59 +
.../payload/thrift/request/PipeRequestType.java | 3 +
.../thrift/request/PipeTransferCompressedReq.java | 146 +
.../connector/protocol/IoTDBAirGapConnector.java | 43 +-
.../pipe/connector/protocol/IoTDBConnector.java | 103 +
.../connector/protocol/IoTDBSslSyncConnector.java | 22 +-
.../queue/ConcurrentIterableLinkedQueue.java | 20 +-
.../listening/AbstractPipeListeningQueue.java | 11 +-
.../AbstractSerializableListeningQueue.java | 35 +-
.../iotdb/commons/pipe/event/EnrichedEvent.java | 1 +
.../commons/pipe/event/PipeWritePlanEvent.java | 20 +-
.../commons/pipe/event/ProgressReportEvent.java | 83 +
.../commons/pipe/extractor/IoTDBExtractor.java | 23 +-
.../extractor/IoTDBNonDataRegionExtractor.java | 89 +-
.../pipe/metric/PipeEventCommitMetrics.java | 32 +-
.../commons/pipe/pattern/IoTDBPipePattern.java | 104 +-
.../iotdb/commons/pipe/pattern/PipePattern.java | 16 +-
.../commons/pipe/pattern/PrefixPipePattern.java | 36 +-
.../pipe/plugin/builtin/BuiltinPipePlugin.java | 4 +
.../ChangingValueSamplingProcessor.java | 30 +
.../pipe/progress/PipeEventCommitManager.java | 58 +-
.../commons/pipe/progress/PipeEventCommitter.java | 29 +-
.../iotdb/commons/pipe/task/meta/PipeMeta.java | 45 +-
.../iotdb/commons/pipe/task/meta/PipeTaskMeta.java | 2 +-
.../commons/pipe/task/meta/PipeTemporaryMeta.java | 87 +
.../task/subtask/PipeAbstractConnectorSubtask.java | 4 +-
.../pipe/task/subtask/PipeReportableSubtask.java | 2 +-
.../schema/node/common/AbstractDatabaseMNode.java | 10 -
.../commons/schema/node/info/IDatabaseInfo.java | 4 -
.../commons/schema/node/info/IDeviceInfo.java | 8 +-
.../commons/schema/node/role/IDatabaseMNode.java | 4 +-
.../commons/schema/node/role/IDeviceMNode.java | 8 +-
.../commons/schema/node/utils/IMNodeFactory.java | 4 +-
.../table/column/MeasurementColumnSchema.java | 3 +-
.../apache/iotdb/commons/schema/ttl/TTLCache.java | 279 +
.../schema/view/viewExpression/ViewExpression.java | 4 +-
.../binary/BinaryViewExpression.java | 2 +
.../binary/arithmetic/AdditionViewExpression.java | 1 +
.../arithmetic/ArithmeticBinaryViewExpression.java | 1 +
.../binary/arithmetic/DivisionViewExpression.java | 1 +
.../binary/arithmetic/ModuloViewExpression.java | 1 +
.../arithmetic/MultiplicationViewExpression.java | 1 +
.../arithmetic/SubtractionViewExpression.java | 1 +
.../compare/CompareBinaryViewExpression.java | 1 +
.../binary/logic/LogicBinaryViewExpression.java | 1 +
.../view/viewExpression/leaf/NullViewOperand.java | 4 +-
.../viewExpression/leaf/TimeSeriesViewOperand.java | 2 +
.../viewExpression/leaf/TimestampViewOperand.java | 4 +-
.../multi/FunctionViewExpression.java | 2 +
.../ternary/BetweenViewExpression.java | 2 +
.../ternary/TernaryViewExpression.java | 2 +
.../viewExpression/unary/InViewExpression.java | 2 +
.../viewExpression/unary/IsNullViewExpression.java | 2 +
.../viewExpression/unary/LikeViewExpression.java | 2 +
.../unary/LogicNotViewExpression.java | 1 +
.../unary/NegationViewExpression.java | 1 +
.../unary/RegularViewExpression.java | 2 +
.../viewExpression/unary/UnaryViewExpression.java | 1 +
.../visitor/ViewExpressionVisitor.java | 6 +
.../iotdb/commons/service/StartupChecks.java | 1 +
.../iotdb/commons/service/ThriftService.java | 7 +-
.../iotdb/commons/service/metric/enums/Metric.java | 15 +
.../subscription/config/SubscriptionConfig.java | 18 +-
.../meta/consumer/ConsumerGroupMeta.java | 4 +-
.../commons/subscription/meta/topic/TopicMeta.java | 41 +-
.../iotdb/commons/trigger/TriggerInformation.java | 2 +
.../apache/iotdb/commons/trigger/TriggerTable.java | 1 +
.../udf/builtin/BuiltinAggregationFunction.java | 8 +-
.../commons/udf/builtin/String/UDTFConcat.java | 2 +-
.../commons/udf/builtin/String/UDTFEndsWith.java | 2 +-
.../commons/udf/builtin/String/UDTFLower.java | 2 +-
.../commons/udf/builtin/String/UDTFStartsWith.java | 2 +-
.../commons/udf/builtin/String/UDTFStrCompare.java | 4 +-
.../commons/udf/builtin/String/UDTFStrLength.java | 2 +-
.../commons/udf/builtin/String/UDTFStrLocate.java | 2 +-
.../iotdb/commons/udf/builtin/String/UDTFTrim.java | 2 +-
.../commons/udf/builtin/String/UDTFUpper.java | 2 +-
.../iotdb/commons/udf/builtin/UDTFBottomK.java | 8 +-
.../iotdb/commons/udf/builtin/UDTFConst.java | 26 +
.../apache/iotdb/commons/udf/builtin/UDTFJexl.java | 6 +-
.../iotdb/commons/udf/builtin/UDTFSelectK.java | 27 +-
.../apache/iotdb/commons/udf/builtin/UDTFTopK.java | 8 +-
.../commons/udf/utils/UDFDataTypeTransformer.java | 12 +
.../org/apache/iotdb/commons/utils/AuthUtils.java | 2 +
.../org/apache/iotdb/commons/utils/BlobUtils.java | 60 +
.../org/apache/iotdb/commons/utils/IOUtils.java | 1 +
.../apache/iotdb/commons/utils/NodeUrlUtils.java | 1 +
.../apache/iotdb/commons/path/PartialPathTest.java | 8 +
.../ConcurrentIterableLinkedQueueTest.java | 84 +-
.../utils/ThriftConfigNodeSerDeUtilsTest.java | 1 -
iotdb-core/pom.xml | 1 -
iotdb-core/relational-parser/pom.xml | 66 -
.../relational/sql/parser/AntlrATNCacheFields.java | 70 -
.../iotdb/db/relational/sql/parser/AstBuilder.java | 1711 ---
.../sql/parser/CaseInsensitiveStream.java | 85 -
.../db/relational/sql/parser/ErrorHandler.java | 438 -
.../db/relational/sql/parser/ParsingException.java | 69 -
.../RefreshableSqlBaseParserInitializer.java | 52 -
.../iotdb/db/relational/sql/parser/SqlParser.java | 254 -
.../iotdb/db/relational/sql/tree/AddColumn.java | 88 -
.../db/relational/sql/tree/AliasedRelation.java | 112 -
.../iotdb/db/relational/sql/tree/AllColumns.java | 130 -
.../iotdb/db/relational/sql/tree/AllRows.java | 67 -
.../sql/tree/ArithmeticBinaryExpression.java | 119 -
.../sql/tree/ArithmeticUnaryExpression.java | 114 -
.../iotdb/db/relational/sql/tree/AstVisitor.java | 449 -
.../db/relational/sql/tree/BetweenPredicate.java | 106 -
.../db/relational/sql/tree/BinaryLiteral.java | 106 -
.../db/relational/sql/tree/BooleanLiteral.java | 87 -
.../apache/iotdb/db/relational/sql/tree/Cast.java | 133 -
.../db/relational/sql/tree/CoalesceExpression.java | 92 -
.../db/relational/sql/tree/ColumnDefinition.java | 125 -
.../relational/sql/tree/ComparisonExpression.java | 196 -
.../iotdb/db/relational/sql/tree/CreateDB.java | 114 -
.../db/relational/sql/tree/CreateFunction.java | 104 -
.../iotdb/db/relational/sql/tree/CreateIndex.java | 110 -
.../iotdb/db/relational/sql/tree/CreateTable.java | 132 -
.../db/relational/sql/tree/CurrentDatabase.java | 70 -
.../iotdb/db/relational/sql/tree/CurrentTime.java | 113 -
.../iotdb/db/relational/sql/tree/CurrentUser.java | 70 -
.../iotdb/db/relational/sql/tree/DataType.java | 29 -
.../db/relational/sql/tree/DataTypeParameter.java | 34 -
.../db/relational/sql/tree/DecimalLiteral.java | 76 -
.../tree/DefaultExpressionTraversalVisitor.java | 29 -
.../sql/tree/DefaultTraversalVisitor.java | 490 -
.../iotdb/db/relational/sql/tree/Delete.java | 94 -
.../relational/sql/tree/DereferenceExpression.java | 151 -
.../db/relational/sql/tree/DescribeTable.java | 80 -
.../db/relational/sql/tree/DoubleLiteral.java | 80 -
.../iotdb/db/relational/sql/tree/DropColumn.java | 86 -
.../iotdb/db/relational/sql/tree/DropDB.java | 86 -
.../iotdb/db/relational/sql/tree/DropFunction.java | 74 -
.../iotdb/db/relational/sql/tree/DropIndex.java | 88 -
.../iotdb/db/relational/sql/tree/DropTable.java | 86 -
.../iotdb/db/relational/sql/tree/Except.java | 107 -
.../db/relational/sql/tree/ExistsPredicate.java | 80 -
.../iotdb/db/relational/sql/tree/Explain.java | 79 -
.../db/relational/sql/tree/ExplainAnalyze.java | 86 -
.../iotdb/db/relational/sql/tree/Expression.java | 154 -
.../db/relational/sql/tree/FieldReference.java | 80 -
.../iotdb/db/relational/sql/tree/FunctionCall.java | 113 -
.../db/relational/sql/tree/GenericDataType.java | 88 -
.../db/relational/sql/tree/GenericLiteral.java | 103 -
.../iotdb/db/relational/sql/tree/GroupBy.java | 100 -
.../db/relational/sql/tree/GroupingElement.java | 36 -
.../iotdb/db/relational/sql/tree/GroupingSets.java | 114 -
.../iotdb/db/relational/sql/tree/Identifier.java | 146 -
.../iotdb/db/relational/sql/tree/IfExpression.java | 105 -
.../db/relational/sql/tree/InListExpression.java | 83 -
.../iotdb/db/relational/sql/tree/InPredicate.java | 86 -
.../iotdb/db/relational/sql/tree/Insert.java | 107 -
.../iotdb/db/relational/sql/tree/Intersect.java | 91 -
.../db/relational/sql/tree/IsNotNullPredicate.java | 79 -
.../db/relational/sql/tree/IsNullPredicate.java | 79 -
.../apache/iotdb/db/relational/sql/tree/Join.java | 165 -
.../iotdb/db/relational/sql/tree/JoinCriteria.java | 37 -
.../iotdb/db/relational/sql/tree/JoinOn.java | 68 -
.../iotdb/db/relational/sql/tree/JoinUsing.java | 70 -
.../db/relational/sql/tree/LikePredicate.java | 112 -
.../apache/iotdb/db/relational/sql/tree/Limit.java | 96 -
.../iotdb/db/relational/sql/tree/Literal.java | 42 -
.../db/relational/sql/tree/LogicalExpression.java | 119 -
.../iotdb/db/relational/sql/tree/LongLiteral.java | 131 -
.../iotdb/db/relational/sql/tree/NaturalJoin.java | 51 -
.../apache/iotdb/db/relational/sql/tree/Node.java | 71 -
.../iotdb/db/relational/sql/tree/NodeLocation.java | 68 -
.../db/relational/sql/tree/NotExpression.java | 79 -
.../db/relational/sql/tree/NullIfExpression.java | 86 -
.../iotdb/db/relational/sql/tree/NullLiteral.java | 60 -
.../db/relational/sql/tree/NumericParameter.java | 88 -
.../iotdb/db/relational/sql/tree/Offset.java | 94 -
.../iotdb/db/relational/sql/tree/OrderBy.java | 89 -
.../iotdb/db/relational/sql/tree/Parameter.java | 82 -
.../iotdb/db/relational/sql/tree/Property.java | 120 -
.../db/relational/sql/tree/QualifiedName.java | 139 -
.../sql/tree/QuantifiedComparisonExpression.java | 123 -
.../apache/iotdb/db/relational/sql/tree/Query.java | 146 -
.../iotdb/db/relational/sql/tree/QueryBody.java | 34 -
.../db/relational/sql/tree/QuerySpecification.java | 169 -
.../iotdb/db/relational/sql/tree/Relation.java | 32 -
.../iotdb/db/relational/sql/tree/RenameColumn.java | 92 -
.../iotdb/db/relational/sql/tree/RenameTable.java | 85 -
.../apache/iotdb/db/relational/sql/tree/Row.java | 77 -
.../sql/tree/SearchedCaseExpression.java | 107 -
.../iotdb/db/relational/sql/tree/Select.java | 100 -
.../iotdb/db/relational/sql/tree/SelectItem.java | 27 -
.../iotdb/db/relational/sql/tree/SetOperation.java | 42 -
.../db/relational/sql/tree/SetProperties.java | 107 -
.../iotdb/db/relational/sql/tree/ShowDB.java | 64 -
.../db/relational/sql/tree/ShowFunctions.java | 65 -
.../iotdb/db/relational/sql/tree/ShowIndex.java | 78 -
.../iotdb/db/relational/sql/tree/ShowTables.java | 92 -
.../relational/sql/tree/SimpleCaseExpression.java | 124 -
.../db/relational/sql/tree/SimpleGroupBy.java | 89 -
.../iotdb/db/relational/sql/tree/SingleColumn.java | 114 -
.../iotdb/db/relational/sql/tree/SortItem.java | 122 -
.../relational/sql/tree/StackableAstVisitor.java | 65 -
.../iotdb/db/relational/sql/tree/Statement.java | 34 -
.../db/relational/sql/tree/StringLiteral.java | 82 -
.../db/relational/sql/tree/SubqueryExpression.java | 79 -
.../db/relational/sql/tree/SymbolReference.java | 88 -
.../apache/iotdb/db/relational/sql/tree/Table.java | 89 -
.../relational/sql/tree/TableExpressionType.java | 57 -
.../db/relational/sql/tree/TableSubquery.java | 85 -
.../apache/iotdb/db/relational/sql/tree/Trim.java | 141 -
.../db/relational/sql/tree/TypeParameter.java | 78 -
.../apache/iotdb/db/relational/sql/tree/Union.java | 92 -
.../iotdb/db/relational/sql/tree/Update.java | 109 -
.../db/relational/sql/tree/UpdateAssignment.java | 84 -
.../apache/iotdb/db/relational/sql/tree/Use.java | 81 -
.../iotdb/db/relational/sql/tree/Values.java | 83 -
.../iotdb/db/relational/sql/tree/WhenClause.java | 86 -
.../apache/iotdb/db/relational/sql/tree/With.java | 100 -
.../iotdb/db/relational/sql/tree/WithQuery.java | 130 -
.../iotdb/db/relational/sql/util/AstUtil.java | 99 -
.../relational/sql/util/ExpressionFormatter.java | 673 --
.../iotdb/db/relational/sql/util/QueryUtil.java | 208 -
.../relational/sql/util/ReservedIdentifiers.java | 48 -
.../iotdb/db/relational/sql/util/SqlFormatter.java | 783 --
.../thrift-commons/src/main/thrift/common.thrift | 3 +-
.../src/main/thrift/confignode.thrift | 35 +-
.../src/main/thrift/datanode.thrift | 14 +-
.../iotdb/library/anomaly/util/MissDetector.java | 56 +-
.../library/anomaly/util/StreamMissDetector.java | 4 +-
.../iotdb/library/anomaly/util/WindowDetect.java | 8 +-
.../library/dquality/util/TimeSeriesQuality.java | 8 +-
.../iotdb/library/frequency/util/DWTUtil.java | 2 +
pom.xml | 57 +-
1915 files changed, 76852 insertions(+), 73843 deletions(-)
diff --cc iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index d840690031d,5b6caf403af..e4b12eb06eb
--- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@@ -44,9 -44,9 +44,10 @@@ import org.apache.iotdb.commons.path.Pa
import org.apache.iotdb.commons.path.PathPatternUtil;
import org.apache.iotdb.commons.pipe.connector.payload.airgap.AirGapPseudoTPipeTransferRequest;
import org.apache.iotdb.commons.schema.SchemaConstant;
+import org.apache.iotdb.commons.schema.table.AlterTableOperationType;
import org.apache.iotdb.commons.schema.table.TsTable;
import org.apache.iotdb.commons.schema.table.TsTableInternalRPCUtil;
+ import org.apache.iotdb.commons.schema.ttl.TTLCache;
import org.apache.iotdb.commons.service.metric.MetricService;
import org.apache.iotdb.commons.utils.AuthUtils;
import org.apache.iotdb.commons.utils.PathUtils;
diff --cc iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
index 37c4e4ca469,1df15ebb0e7..4e6103eafb5
--- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
+++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
@@@ -76,11 -75,10 +77,12 @@@ import org.apache.iotdb.confignode.proc
import org.apache.iotdb.confignode.procedure.impl.schema.DeleteDatabaseProcedure;
import org.apache.iotdb.confignode.procedure.impl.schema.DeleteLogicalViewProcedure;
import org.apache.iotdb.confignode.procedure.impl.schema.DeleteTimeSeriesProcedure;
+ import org.apache.iotdb.confignode.procedure.impl.schema.SetTTLProcedure;
import org.apache.iotdb.confignode.procedure.impl.schema.SetTemplateProcedure;
import org.apache.iotdb.confignode.procedure.impl.schema.UnsetTemplateProcedure;
+import org.apache.iotdb.confignode.procedure.impl.schema.table.AddTableColumnProcedure;
import org.apache.iotdb.confignode.procedure.impl.schema.table.CreateTableProcedure;
+import org.apache.iotdb.confignode.procedure.impl.schema.table.DropTableProcedure;
import org.apache.iotdb.confignode.procedure.impl.subscription.consumer.CreateConsumerProcedure;
import org.apache.iotdb.confignode.procedure.impl.subscription.consumer.DropConsumerProcedure;
import org.apache.iotdb.confignode.procedure.impl.subscription.consumer.runtime.ConsumerGroupMetaSyncProcedure;
diff --cc iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
index 23f232cb4df,8faf8595ab0..c253fefb307
--- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
+++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
@@@ -28,10 -28,9 +28,11 @@@ import org.apache.iotdb.commons.excepti
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.path.PathPatternTree;
import org.apache.iotdb.commons.schema.SchemaConstant;
+import org.apache.iotdb.commons.schema.table.TsTable;
import org.apache.iotdb.commons.schema.table.TsTableInternalRPCUtil;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
import org.apache.iotdb.commons.service.metric.MetricService;
+ import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
import org.apache.iotdb.commons.utils.PathUtils;
import org.apache.iotdb.commons.utils.StatusUtils;
import org.apache.iotdb.confignode.client.DataNodeRequestType;
@@@ -51,10 -50,8 +52,9 @@@ import org.apache.iotdb.confignode.cons
import org.apache.iotdb.confignode.consensus.request.write.database.DeleteDatabasePlan;
import org.apache.iotdb.confignode.consensus.request.write.database.SetDataReplicationFactorPlan;
import org.apache.iotdb.confignode.consensus.request.write.database.SetSchemaReplicationFactorPlan;
- import org.apache.iotdb.confignode.consensus.request.write.database.SetTTLPlan;
import org.apache.iotdb.confignode.consensus.request.write.database.SetTimePartitionIntervalPlan;
import org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeEnrichedPlan;
+import org.apache.iotdb.confignode.consensus.request.write.table.AddTableColumnPlan;
import org.apache.iotdb.confignode.consensus.request.write.template.CreateSchemaTemplatePlan;
import org.apache.iotdb.confignode.consensus.request.write.template.DropSchemaTemplatePlan;
import org.apache.iotdb.confignode.consensus.request.write.template.ExtendSchemaTemplatePlan;
diff --cc iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
index eb0fa53e02d,db3487c8344..06d6970bdab
--- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
+++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
@@@ -43,15 -43,10 +43,14 @@@ import org.apache.iotdb.confignode.cons
import org.apache.iotdb.confignode.consensus.request.write.database.DeleteDatabasePlan;
import org.apache.iotdb.confignode.consensus.request.write.database.SetDataReplicationFactorPlan;
import org.apache.iotdb.confignode.consensus.request.write.database.SetSchemaReplicationFactorPlan;
- import org.apache.iotdb.confignode.consensus.request.write.database.SetTTLPlan;
import org.apache.iotdb.confignode.consensus.request.write.database.SetTimePartitionIntervalPlan;
+import org.apache.iotdb.confignode.consensus.request.write.table.AddTableColumnPlan;
import org.apache.iotdb.confignode.consensus.request.write.table.CommitCreateTablePlan;
+import org.apache.iotdb.confignode.consensus.request.write.table.CommitDropTablePlan;
import org.apache.iotdb.confignode.consensus.request.write.table.PreCreateTablePlan;
+import org.apache.iotdb.confignode.consensus.request.write.table.PreDropTablePlan;
import org.apache.iotdb.confignode.consensus.request.write.table.RollbackCreateTablePlan;
+import org.apache.iotdb.confignode.consensus.request.write.table.RollbackDropTablePlan;
import org.apache.iotdb.confignode.consensus.request.write.template.CommitSetSchemaTemplatePlan;
import org.apache.iotdb.confignode.consensus.request.write.template.CreateSchemaTemplatePlan;
import org.apache.iotdb.confignode.consensus.request.write.template.DropSchemaTemplatePlan;
diff --cc iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
index 99dd350d05a,30caa199e03..a985350fbea
--- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
+++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
@@@ -43,11 -43,10 +43,12 @@@ import org.apache.iotdb.confignode.proc
import org.apache.iotdb.confignode.procedure.impl.schema.DeleteDatabaseProcedure;
import org.apache.iotdb.confignode.procedure.impl.schema.DeleteLogicalViewProcedure;
import org.apache.iotdb.confignode.procedure.impl.schema.DeleteTimeSeriesProcedure;
+ import org.apache.iotdb.confignode.procedure.impl.schema.SetTTLProcedure;
import org.apache.iotdb.confignode.procedure.impl.schema.SetTemplateProcedure;
import org.apache.iotdb.confignode.procedure.impl.schema.UnsetTemplateProcedure;
+import org.apache.iotdb.confignode.procedure.impl.schema.table.AddTableColumnProcedure;
import org.apache.iotdb.confignode.procedure.impl.schema.table.CreateTableProcedure;
+import org.apache.iotdb.confignode.procedure.impl.schema.table.DropTableProcedure;
import org.apache.iotdb.confignode.procedure.impl.subscription.consumer.AlterConsumerGroupProcedure;
import org.apache.iotdb.confignode.procedure.impl.subscription.consumer.CreateConsumerProcedure;
import org.apache.iotdb.confignode.procedure.impl.subscription.consumer.DropConsumerProcedure;
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java
index c67cef06101,e82ed922045..54a4b05fd90
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java
@@@ -527,32 -525,9 +527,32 @@@ public class SchemaExecutionVisitor ext
}
}
+ @Override
+ public TSStatus visitCreateTableDevice(CreateTableDeviceNode node, ISchemaRegion schemaRegion) {
+ try {
+ schemaRegion.createTableDevice(
+ node.getDevicePathList(), node.getAttributeNameList(), node.getAttributeValueList());
+ return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+ } catch (MetadataException e) {
+ logger.error(e.getMessage(), e);
+ return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
+ }
+ }
+
+ @Override
+ public TSStatus visitDeleteTableDevice(DeleteTableDeviceNode node, ISchemaRegion schemaRegion) {
+ try {
+ schemaRegion.deleteTableDevice(node.getTable());
+ return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+ } catch (MetadataException e) {
+ logger.error(e.getMessage(), e);
+ return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
+ }
+ }
+
@Override
public TSStatus visitPipeEnrichedWritePlanNode(
- PipeEnrichedWritePlanNode node, ISchemaRegion schemaRegion) {
+ final PipeEnrichedWritePlanNode node, final ISchemaRegion schemaRegion) {
return node.getWritePlanNode().accept(this, schemaRegion);
}
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
index acdff0628ea,d057b07579a..2599a13f51a
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
@@@ -83,6 -84,7 +84,8 @@@ import org.apache.iotdb.db.queryengine.
import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.InputLocation;
import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions;
import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.SqlParser;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Insert;
import org.apache.iotdb.db.queryengine.plan.statement.Statement;
import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
index 3307329accf,3a42ee805b0..2744462666e
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
@@@ -75,8 -76,19 +76,21 @@@ public class MPPQueryContext
QueryPlanStatistics queryPlanStatistics = null;
+ private boolean skipSchemaValidate = false;
+
+ // To avoid query front-end from consuming too much memory, it needs to reserve memory when
+ // constructing some Expression and PlanNode.
+ private long reservedBytesInTotalForFrontEnd = 0;
+
+ private long bytesToBeReservedForFrontEnd = 0;
+
+ // To avoid reserving memory too frequently, we choose to do it in batches. This is the lower
+ // bound
+ // for each batch.
+ private static final long MEMORY_BATCH_THRESHOLD = 1024L * 1024L;
+
+ private final LocalExecutionPlanner LOCAL_EXECUTION_PLANNER = LocalExecutionPlanner.getInstance();
+
public MPPQueryContext(QueryId queryId) {
this.queryId = queryId;
this.endPointBlackList = new LinkedList<>();
@@@ -293,11 -306,48 +308,56 @@@
queryPlanStatistics.setLogicalOptimizationCost(logicalOptimizeCost);
}
+ public boolean isSkipSchemaValidate() {
+ return skipSchemaValidate;
+ }
+
+ public void setSkipSchemaValidate(boolean skipSchemaValidate) {
+ this.skipSchemaValidate = skipSchemaValidate;
+ }
++
+ // region =========== FE memory related, make sure its not called concurrently ===========
+
+ /**
+ * This method does not require concurrency control because the query plan is generated in a
+ * single-threaded manner.
+ */
+ public void reserveMemoryForFrontEnd(final long bytes) {
+ this.bytesToBeReservedForFrontEnd += bytes;
+ if (this.bytesToBeReservedForFrontEnd >= MEMORY_BATCH_THRESHOLD) {
+ reserveMemoryForFrontEndImmediately();
+ }
+ }
+
+ public void reserveMemoryForFrontEndImmediately() {
+ if (bytesToBeReservedForFrontEnd != 0) {
+ LOCAL_EXECUTION_PLANNER.reserveMemoryForQueryFrontEnd(
+ bytesToBeReservedForFrontEnd, reservedBytesInTotalForFrontEnd, queryId.getId());
+ this.reservedBytesInTotalForFrontEnd += bytesToBeReservedForFrontEnd;
+ this.bytesToBeReservedForFrontEnd = 0;
+ }
+ }
+
+ public void releaseMemoryForFrontEnd() {
+ if (reservedBytesInTotalForFrontEnd != 0) {
+ LOCAL_EXECUTION_PLANNER.releaseToFreeMemoryForOperators(reservedBytesInTotalForFrontEnd);
+ reservedBytesInTotalForFrontEnd = 0;
+ }
+ }
+
+ public void releaseMemoryForFrontEnd(final long bytes) {
+ if (bytes != 0) {
+ long bytesToRelease;
+ if (bytes <= bytesToBeReservedForFrontEnd) {
+ bytesToBeReservedForFrontEnd -= bytes;
+ } else {
+ bytesToRelease = bytes - bytesToBeReservedForFrontEnd;
+ bytesToBeReservedForFrontEnd = 0;
+ LOCAL_EXECUTION_PLANNER.releaseToFreeMemoryForOperators(bytesToRelease);
+ reservedBytesInTotalForFrontEnd -= bytesToRelease;
+ }
+ }
+ }
+
+ // endregion
}
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index 732ee3c8f92,2e38747370d..f0396f5bc7b
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@@ -42,13 -42,11 +42,14 @@@ import org.apache.iotdb.commons.pipe.co
import org.apache.iotdb.commons.pipe.plugin.service.PipePluginClassLoader;
import org.apache.iotdb.commons.pipe.plugin.service.PipePluginExecutableManager;
import org.apache.iotdb.commons.pipe.task.meta.PipeStaticMeta;
+import org.apache.iotdb.commons.schema.table.AlterTableOperationType;
import org.apache.iotdb.commons.schema.table.TsTable;
import org.apache.iotdb.commons.schema.table.TsTableInternalRPCUtil;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchemaUtil;
import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
+ import org.apache.iotdb.commons.subscription.meta.topic.TopicMeta;
import org.apache.iotdb.commons.trigger.service.TriggerExecutableManager;
import org.apache.iotdb.commons.udf.service.UDFClassLoader;
import org.apache.iotdb.commons.udf.service.UDFExecutableManager;
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
index 6c7e80c260f,de448bc1c6c..31df5bbb4f3
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanBuilder.java
@@@ -30,8 -29,9 +29,10 @@@ import org.apache.iotdb.commons.path.Pa
import org.apache.iotdb.commons.path.PathPatternTree;
import org.apache.iotdb.commons.schema.filter.SchemaFilter;
import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
+ import org.apache.iotdb.db.queryengine.common.TimeseriesSchemaInfo;
+import org.apache.iotdb.db.queryengine.common.header.ColumnHeader;
import org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant;
+ import org.apache.iotdb.db.queryengine.execution.MemoryEstimationHelper;
import org.apache.iotdb.db.queryengine.execution.aggregation.AccumulatorFactory;
import org.apache.iotdb.db.queryengine.execution.operator.AggregationUtil;
import org.apache.iotdb.db.queryengine.plan.analyze.Analysis;
@@@ -57,9 -57,6 +58,8 @@@ import org.apache.iotdb.db.queryengine.
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.SchemaQueryOrderByHeatNode;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesCountNode;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.TimeSeriesSchemaScanNode;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.table.TableDeviceFetchNode;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.metedata.read.table.TableDeviceScanNode;
- import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.AggregationNode;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.ColumnInjectNode;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.DeviceViewIntoNode;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.DeviceViewNode;
@@@ -1648,37 -1349,32 +1352,66 @@@ public class LogicalPlanBuilder
return this;
}
+ public LogicalPlanBuilder planTableDeviceSource(
+ String database,
+ String tableName,
+ List<List<SchemaFilter>> idDeterminedFilterList,
+ SchemaFilter idFuzzyFilter,
+ List<ColumnHeader> columnHeaderList) {
+ this.root =
+ new TableDeviceScanNode(
+ context.getQueryId().genPlanNodeId(),
+ database,
+ tableName,
+ idDeterminedFilterList,
+ idFuzzyFilter,
+ columnHeaderList,
+ null);
+ return this;
+ }
+
+ public LogicalPlanBuilder planTableDeviceFetchSource(
+ String database,
+ String tableName,
+ List<String[]> deviceIdList,
+ List<ColumnHeader> columnHeaderList) {
+ this.root =
+ new TableDeviceFetchNode(
+ context.getQueryId().genPlanNodeId(),
+ database,
+ tableName,
+ deviceIdList,
+ columnHeaderList,
+ null);
+ return this;
+ }
++
+ public LogicalPlanBuilder planDeviceRegionScan(
+ Map<PartialPath, Boolean> devicePathToAlignedStatus, boolean outputCount) {
+ this.root =
+ new DeviceRegionScanNode(
+ context.getQueryId().genPlanNodeId(), devicePathToAlignedStatus, outputCount, null);
+ return this;
+ }
+
+ public LogicalPlanBuilder planTimeseriesRegionScan(
+ Map<PartialPath, Map<PartialPath, List<TimeseriesSchemaInfo>>> deviceToTimeseriesSchemaInfo,
+ boolean outputCount) {
+ TimeseriesRegionScanNode timeseriesRegionScanNode =
+ new TimeseriesRegionScanNode(context.getQueryId().genPlanNodeId(), outputCount, null);
+ timeseriesRegionScanNode.setDeviceToTimeseriesSchemaInfo(deviceToTimeseriesSchemaInfo);
+ this.root = timeseriesRegionScanNode;
+ return this;
+ }
+
+ /**
+ * There could be a lot of SeriesSourceNodes if there are too many series involved in one query.
+ * We need to check the memory used by SeriesSourceNodes.(Number of other PlanNodes are rather
+ * small compared to SourceNodes and could be safely ignored for now.)
+ */
+ private PlanNode reserveMemoryForSeriesSourceNode(final SeriesSourceNode sourceNode) {
+ this.context.reserveMemoryForFrontEnd(
+ MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(sourceNode));
+ return sourceNode;
+ }
}
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
index f1aa9c07725,98f544c75f5..f10fc9a3b89
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
@@@ -18,22 -18,12 +18,16 @@@
*/
package org.apache.iotdb.db.queryengine.plan.planner;
- import org.apache.iotdb.commons.path.AlignedPath;
- import org.apache.iotdb.commons.path.MeasurementPath;
import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
- import org.apache.iotdb.commons.udf.builtin.BuiltinAggregationFunction;
import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
+import org.apache.iotdb.db.queryengine.common.header.ColumnHeader;
import org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant;
+import org.apache.iotdb.db.queryengine.common.header.DatasetHeader;
import org.apache.iotdb.db.queryengine.plan.analyze.Analysis;
- import org.apache.iotdb.db.queryengine.plan.analyze.ExpressionAnalyzer;
import org.apache.iotdb.db.queryengine.plan.expression.Expression;
- import org.apache.iotdb.db.queryengine.plan.expression.leaf.TimeSeriesOperand;
- import org.apache.iotdb.db.queryengine.plan.expression.multi.FunctionExpression;
import org.apache.iotdb.db.queryengine.plan.expression.visitor.TransformToViewExpressionVisitor;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.ExplainAnalyzeNode;
import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
@@@ -96,13 -85,8 +90,12 @@@ import org.apache.iotdb.db.queryengine.
import org.apache.iotdb.db.queryengine.plan.statement.pipe.PipeEnrichedStatement;
import org.apache.iotdb.db.queryengine.plan.statement.sys.ExplainAnalyzeStatement;
import org.apache.iotdb.db.queryengine.plan.statement.sys.ShowQueriesStatement;
+import org.apache.iotdb.db.queryengine.plan.statement.table.CreateTableDeviceStatement;
+import org.apache.iotdb.db.queryengine.plan.statement.table.FetchTableDevicesStatement;
+import org.apache.iotdb.db.queryengine.plan.statement.table.ShowTableDevicesStatement;
+import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
import org.apache.iotdb.db.schemaengine.template.Template;
- import org.apache.commons.lang3.StringUtils;
import org.apache.tsfile.enums.TSDataType;
import org.apache.tsfile.utils.Pair;
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/TableModelTimePredicate.java
index a79fabd435b,b4d1337b16e..fa7a82f484e
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/TableModelTimePredicate.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/TableModelTimePredicate.java
@@@ -20,10 -20,9 +20,10 @@@
package org.apache.iotdb.db.queryengine.plan.planner.plan;
import org.apache.iotdb.db.queryengine.plan.analyze.PredicateUtils;
- import org.apache.iotdb.db.relational.sql.tree.Expression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Expression;
import org.apache.tsfile.read.filter.basic.Filter;
+import org.apache.tsfile.utils.ReadWriteIOUtils;
import java.io.DataOutputStream;
import java.io.IOException;
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/TimePredicate.java
index 0bccff5f6a1,04cf67ed3aa..348fa1bfe5e
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/TimePredicate.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/TimePredicate.java
@@@ -35,13 -34,7 +35,14 @@@ public interface TimePredicate
Filter convertPredicateToTimeFilter();
static TimePredicate deserialize(ByteBuffer byteBuffer) {
- // TODO will return another kind of TimePredicate like TableModelTimePredicate in the future
- return new TreeModelTimePredicate(Expression.deserialize(byteBuffer));
+ // 0 for tree model, 1 for table model
+ byte type = ReadWriteIOUtils.readByte(byteBuffer);
+ if (type == 0) {
+ return new TreeModelTimePredicate(Expression.deserialize(byteBuffer));
+ } else {
+ return new TableModelTimePredicate(
- org.apache.iotdb.db.relational.sql.tree.Expression.deserialize(byteBuffer));
++ org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Expression.deserialize(
++ byteBuffer));
+ }
}
}
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java
index 0e52538126b,af31f08474a..dc0c2e87d48
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java
@@@ -460,13 -470,13 +474,21 @@@ public enum PlanNodeType
case 91:
return PipeOperateSchemaQueueNode.deserialize(buffer);
case 92:
- return CreateTableDeviceNode.deserialize(buffer);
+ return RawDataAggregationNode.deserialize(buffer);
case 93:
- return TableDeviceScanNode.deserialize(buffer);
+ return DeviceRegionScanNode.deserialize(buffer);
case 94:
- return TableDeviceFetchNode.deserialize(buffer);
+ return TimeseriesRegionScanNode.deserialize(buffer);
case 95:
+ return RegionMergeNode.deserialize(buffer);
++ case 900:
++ return CreateTableDeviceNode.deserialize(buffer);
++ case 901:
++ return TableDeviceScanNode.deserialize(buffer);
++ case 902:
++ return TableDeviceFetchNode.deserialize(buffer);
++ case 903:
+ return DeleteTableDeviceNode.deserialize(buffer);
case 1000:
return org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableScanNode
.deserialize(buffer);
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertSchemaPredicateToFilterVisitor.java
index d4811ae4ad8,00000000000..dc7ed6b01eb
mode 100644,000000..100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertSchemaPredicateToFilterVisitor.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertSchemaPredicateToFilterVisitor.java
@@@ -1,184 -1,0 +1,184 @@@
+/*
+ * 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.db.queryengine.plan.relational.analyzer.predicate;
+
+import org.apache.iotdb.commons.schema.filter.SchemaFilter;
+import org.apache.iotdb.commons.schema.filter.impl.DeviceAttributeFilter;
+import org.apache.iotdb.commons.schema.filter.impl.DeviceIdFilter;
+import org.apache.iotdb.commons.schema.filter.impl.OrFilter;
+import org.apache.iotdb.commons.schema.table.TsTable;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
- import org.apache.iotdb.db.relational.sql.tree.BetweenPredicate;
- import org.apache.iotdb.db.relational.sql.tree.ComparisonExpression;
- import org.apache.iotdb.db.relational.sql.tree.Identifier;
- import org.apache.iotdb.db.relational.sql.tree.IfExpression;
- import org.apache.iotdb.db.relational.sql.tree.InPredicate;
- import org.apache.iotdb.db.relational.sql.tree.IsNotNullPredicate;
- import org.apache.iotdb.db.relational.sql.tree.IsNullPredicate;
- import org.apache.iotdb.db.relational.sql.tree.LikePredicate;
- import org.apache.iotdb.db.relational.sql.tree.Literal;
- import org.apache.iotdb.db.relational.sql.tree.LogicalExpression;
- import org.apache.iotdb.db.relational.sql.tree.NotExpression;
- import org.apache.iotdb.db.relational.sql.tree.NullIfExpression;
- import org.apache.iotdb.db.relational.sql.tree.SearchedCaseExpression;
- import org.apache.iotdb.db.relational.sql.tree.SimpleCaseExpression;
- import org.apache.iotdb.db.relational.sql.tree.StringLiteral;
- import org.apache.iotdb.db.relational.sql.tree.SymbolReference;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.BetweenPredicate;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.ComparisonExpression;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Identifier;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.IfExpression;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.InPredicate;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.IsNotNullPredicate;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.IsNullPredicate;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.LikePredicate;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Literal;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.LogicalExpression;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.NotExpression;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.NullIfExpression;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.SearchedCaseExpression;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.SimpleCaseExpression;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.StringLiteral;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.SymbolReference;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ConvertSchemaPredicateToFilterVisitor
+ extends PredicateVisitor<SchemaFilter, ConvertSchemaPredicateToFilterVisitor.Context> {
+
+ @Override
+ protected SchemaFilter visitInPredicate(InPredicate node, Context context) {
+ return visitExpression(node, context);
+ }
+
+ @Override
+ protected SchemaFilter visitIsNullPredicate(IsNullPredicate node, Context context) {
+ String columnName = ((SymbolReference) node.getValue()).getName();
+ if (context
+ .table
+ .getColumnSchema(columnName)
+ .getColumnCategory()
+ .equals(TsTableColumnCategory.ID)) {
+ return new DeviceIdFilter(context.idColumeIndexMap.get(columnName), null);
+ } else {
+ context.hasAttribute = true;
+ return new DeviceAttributeFilter(columnName, null);
+ }
+ }
+
+ @Override
+ protected SchemaFilter visitIsNotNullPredicate(IsNotNullPredicate node, Context context) {
+ return visitExpression(node, context);
+ }
+
+ @Override
+ protected SchemaFilter visitLikePredicate(LikePredicate node, Context context) {
+ return visitExpression(node, context);
+ }
+
+ @Override
+ protected SchemaFilter visitLogicalExpression(LogicalExpression node, Context context) {
+ // the operator of the logical expression shall be OR
+ return new OrFilter(
+ node.getTerms().get(0).accept(this, context), node.getTerms().get(1).accept(this, context));
+ }
+
+ @Override
+ protected SchemaFilter visitNotExpression(NotExpression node, Context context) {
+ return visitExpression(node, context);
+ }
+
+ @Override
+ protected SchemaFilter visitComparisonExpression(ComparisonExpression node, Context context) {
+ String columnName;
+ String value;
+ if (node.getLeft() instanceof Literal) {
+ value = ((StringLiteral) (node.getLeft())).getValue();
+ if (node.getRight() instanceof Identifier) {
+ columnName = ((Identifier) (node.getRight())).getValue();
+ } else {
+ columnName = ((SymbolReference) (node.getRight())).getName();
+ }
+ } else {
+ value = ((StringLiteral) (node.getRight())).getValue();
+ if (node.getLeft() instanceof Identifier) {
+ columnName = ((Identifier) (node.getLeft())).getValue();
+ } else {
+ columnName = ((SymbolReference) (node.getLeft())).getName();
+ }
+ }
+ if (context
+ .table
+ .getColumnSchema(columnName)
+ .getColumnCategory()
+ .equals(TsTableColumnCategory.ID)) {
+ return new DeviceIdFilter(context.idColumeIndexMap.get(columnName), value);
+ } else {
+ context.hasAttribute = true;
+ return new DeviceAttributeFilter(columnName, value);
+ }
+ }
+
+ @Override
+ protected SchemaFilter visitSimpleCaseExpression(SimpleCaseExpression node, Context context) {
+ return visitExpression(node, context);
+ }
+
+ @Override
+ protected SchemaFilter visitSearchedCaseExpression(SearchedCaseExpression node, Context context) {
+ return visitExpression(node, context);
+ }
+
+ @Override
+ protected SchemaFilter visitIfExpression(IfExpression node, Context context) {
+ return visitExpression(node, context);
+ }
+
+ @Override
+ protected SchemaFilter visitNullIfExpression(NullIfExpression node, Context context) {
+ return visitExpression(node, context);
+ }
+
+ @Override
+ protected SchemaFilter visitBetweenPredicate(BetweenPredicate node, Context context) {
+ return visitExpression(node, context);
+ }
+
+ public static class Context {
+
+ private final TsTable table;
+ private final Map<String, Integer> idColumeIndexMap;
+
+ private boolean hasAttribute = false;
+
+ public Context(TsTable table) {
+ this.table = table;
+ this.idColumeIndexMap = getIdColumnIndex(table);
+ }
+
+ private Map<String, Integer> getIdColumnIndex(TsTable table) {
+ Map<String, Integer> map = new HashMap<>();
+ List<TsTableColumnSchema> columnSchemaList = table.getColumnList();
+ int idIndex = 0;
+ for (TsTableColumnSchema columnSchema : columnSchemaList) {
+ if (columnSchema.getColumnCategory().equals(TsTableColumnCategory.ID)) {
+ map.put(columnSchema.getColumnName(), idIndex);
+ idIndex++;
+ }
+ }
+ return map;
+ }
+
+ public boolean hasAttribute() {
+ return hasAttribute;
+ }
+
+ public void reset() {
+ hasAttribute = false;
+ }
+ }
+}
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/schema/TableModelSchemaFetcher.java
index 784bcc743ee,00000000000..91b147411ea
mode 100644,000000..100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/schema/TableModelSchemaFetcher.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/schema/TableModelSchemaFetcher.java
@@@ -1,701 -1,0 +1,701 @@@
+/*
+ * 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.db.queryengine.plan.relational.analyzer.schema;
+
+import org.apache.iotdb.commons.exception.IoTDBException;
+import org.apache.iotdb.commons.schema.filter.SchemaFilter;
+import org.apache.iotdb.commons.schema.filter.impl.AndFilter;
+import org.apache.iotdb.commons.schema.filter.impl.DeviceFilterUtil;
+import org.apache.iotdb.commons.schema.filter.impl.DeviceIdFilter;
+import org.apache.iotdb.commons.schema.table.TsTable;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
+import org.apache.iotdb.db.conf.IoTDBConfig;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.exception.metadata.table.TableNotExistsException;
+import org.apache.iotdb.db.exception.sql.SemanticException;
+import org.apache.iotdb.db.protocol.session.SessionManager;
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
+import org.apache.iotdb.db.queryengine.common.header.ColumnHeader;
+import org.apache.iotdb.db.queryengine.plan.Coordinator;
+import org.apache.iotdb.db.queryengine.plan.analyze.ClusterPartitionFetcher;
+import org.apache.iotdb.db.queryengine.plan.analyze.QueryType;
+import org.apache.iotdb.db.queryengine.plan.analyze.schema.ClusterSchemaFetcher;
+import org.apache.iotdb.db.queryengine.plan.execution.ExecutionResult;
+import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
+import org.apache.iotdb.db.queryengine.plan.execution.config.executor.ClusterConfigTaskExecutor;
+import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.AlterTableAddColumnTask;
+import org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.ConvertSchemaPredicateToFilterVisitor;
+import org.apache.iotdb.db.queryengine.plan.relational.analyzer.schema.cache.TableDeviceId;
+import org.apache.iotdb.db.queryengine.plan.relational.analyzer.schema.cache.TableDeviceSchemaCache;
+import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnSchema;
+import org.apache.iotdb.db.queryengine.plan.relational.metadata.DeviceEntry;
+import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableSchema;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Expression;
+import org.apache.iotdb.db.queryengine.plan.statement.table.CreateTableDeviceStatement;
+import org.apache.iotdb.db.queryengine.plan.statement.table.FetchTableDevicesStatement;
+import org.apache.iotdb.db.queryengine.plan.statement.table.ShowTableDevicesStatement;
- import org.apache.iotdb.db.relational.sql.tree.Expression;
+import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
+import org.apache.iotdb.rpc.TSStatusCode;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.file.metadata.IDeviceID;
+import org.apache.tsfile.file.metadata.StringArrayDeviceID;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.type.TypeFactory;
+import org.apache.tsfile.read.common.type.UnknownType;
+import org.apache.tsfile.utils.Pair;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import static org.apache.iotdb.commons.conf.IoTDBConstant.PATH_SEPARATOR;
+
+public class TableModelSchemaFetcher {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(TableModelSchemaFetcher.class);
+
+ private final IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
+
+ private final Coordinator coordinator = Coordinator.getInstance();
+
+ private final TableDeviceSchemaCache cache = new TableDeviceSchemaCache();
+
+ private final ClusterConfigTaskExecutor configTaskExecutor =
+ ClusterConfigTaskExecutor.getInstance();
+
+ private static class TableModelSchemaFetcherHolder {
+ private static final TableModelSchemaFetcher INSTANCE = new TableModelSchemaFetcher();
+ }
+
+ public static TableModelSchemaFetcher getInstance() {
+ return TableModelSchemaFetcherHolder.INSTANCE;
+ }
+
+ private TableModelSchemaFetcher() {
+ // do nothing
+ }
+
+ public void invalidateDeviceCache(String database, String tableName) {
+ cache.invalidate(database, tableName);
+ }
+
+ // This method return all the existing column schemas in the target table.
+ // When table or column is missing, this method will execute auto creation.
+ // When using SQL, the columnSchemaList could be null and there won't be any validation.
+ // All input column schemas will be validated and auto created when necessary.
+ // When the input dataType or category of one column is null, the column cannot be auto created.
+ public TableSchema validateTableHeaderSchema(
+ String database, TableSchema tableSchema, MPPQueryContext context) {
+ List<ColumnSchema> inputColumnList = tableSchema.getColumns();
+ TsTable table = DataNodeTableCache.getInstance().getTable(database, tableSchema.getTableName());
+ List<ColumnSchema> missingColumnList = new ArrayList<>();
+ List<ColumnSchema> resultColumnList = new ArrayList<>();
+
+ // first round validate, check existing schema
+ if (table == null) {
+ if (inputColumnList == null) {
+ throw new SemanticException("Unknown column names. Cannot auto create table.");
+ }
+ // check arguments for table auto creation
+ for (ColumnSchema columnSchema : inputColumnList) {
+ if (columnSchema.getColumnCategory() == null) {
+ throw new SemanticException("Unknown column category. Cannot auto create table.");
+ }
+ if (columnSchema.getType() == null) {
+ throw new IllegalArgumentException("Unknown column data type. Cannot auto create table.");
+ }
+ missingColumnList.add(columnSchema);
+ }
+ } else if (inputColumnList == null) {
+ // SQL insert without columnName, nothing to check
+ } else {
+ for (int i = 0; i < inputColumnList.size(); i++) {
+ ColumnSchema columnSchema = inputColumnList.get(i);
+ TsTableColumnSchema existingColumn = table.getColumnSchema(columnSchema.getName());
+ if (existingColumn == null) {
+ // check arguments for column auto creation
+ if (columnSchema.getColumnCategory() == null) {
+ throw new IllegalArgumentException(
+ "Unknown column category. Cannot auto create column.");
+ }
+ if (columnSchema.getType() == null) {
+ throw new IllegalArgumentException(
+ "Unknown column data type. Cannot auto create column.");
+ }
+ missingColumnList.add(columnSchema);
+ } else {
+ // check and validate column data type and category
+ if (!columnSchema.getType().equals(UnknownType.UNKNOWN)
+ && !TypeFactory.getType(existingColumn.getDataType())
+ .equals(columnSchema.getType())) {
+ throw new SemanticException(
+ String.format("Wrong data type at column %s.", columnSchema.getName()));
+ }
+ if (columnSchema.getColumnCategory() != null
+ && !existingColumn.getColumnCategory().equals(columnSchema.getColumnCategory())) {
+ throw new SemanticException(
+ String.format("Wrong category at column %s.", columnSchema.getName()));
+ }
+ }
+ }
+ }
+
+ // auto create missing table or columns
+ if (table == null) {
+ autoCreateTable(database, tableSchema, context);
+ table = DataNodeTableCache.getInstance().getTable(database, tableSchema.getTableName());
+ } else if (inputColumnList == null) {
+ // do nothing
+ } else {
+ if (!missingColumnList.isEmpty()) {
+ autoCreateColumn(database, tableSchema.getTableName(), missingColumnList, context);
+ }
+ }
+ table
+ .getColumnList()
+ .forEach(
+ o ->
+ resultColumnList.add(
+ new ColumnSchema(
+ o.getColumnName(),
+ TypeFactory.getType(o.getDataType()),
+ false,
+ o.getColumnCategory())));
+ return new TableSchema(tableSchema.getTableName(), resultColumnList);
+ }
+
+ public void autoCreateTable(String database, TableSchema tableSchema, MPPQueryContext context) {
+ throw new SemanticException(new TableNotExistsException(database, tableSchema.getTableName()));
+ }
+
+ private void autoCreateColumn(
+ String database,
+ String tableName,
+ List<ColumnSchema> inputColumnList,
+ MPPQueryContext context) {
+ AlterTableAddColumnTask task =
+ new AlterTableAddColumnTask(
+ database, tableName, inputColumnList, context.getQueryId().getId());
+ try {
+ ListenableFuture<ConfigTaskResult> future = task.execute(configTaskExecutor);
+ ConfigTaskResult result = future.get();
+ if (result.getStatusCode().getStatusCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ throw new RuntimeException(
+ new IoTDBException(
+ "Auto add table column failed.", result.getStatusCode().getStatusCode()));
+ }
+ } catch (ExecutionException | InterruptedException e) {
+ LOGGER.warn("Auto add table column failed.", e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void validateDeviceSchema(
+ ITableDeviceSchemaValidation schemaValidation, MPPQueryContext context) {
+ ValidateResult validateResult = validateDeviceSchemaInCache(schemaValidation);
+
+ if (!validateResult.missingDeviceIndexList.isEmpty()
+ || !validateResult.attributeMissingInCacheDeviceIndexList.isEmpty()) {
+ validateResult = fetchAndValidateDeviceSchema(schemaValidation, validateResult, context);
+ }
+
+ if (!validateResult.missingDeviceIndexList.isEmpty()
+ || !validateResult.attributeUpdateDeviceIndexList.isEmpty()) {
+ autoCreateDeviceSchema(schemaValidation, validateResult, context);
+ }
+ }
+
+ private ValidateResult validateDeviceSchemaInCache(
+ ITableDeviceSchemaValidation schemaValidation) {
+ ValidateResult result = new ValidateResult();
+ String database = schemaValidation.getDatabase();
+ String tableName = schemaValidation.getTableName();
+ List<String[]> deviceIdList = schemaValidation.getDeviceIdList();
+ List<String> attributeKeyList = schemaValidation.getAttributeColumnNameList();
+ List<List<String>> attributeValueList = schemaValidation.getAttributeValue();
+
+ for (int i = 0, size = deviceIdList.size(); i < size; i++) {
+ Map<String, String> attributeMap =
+ cache.getDeviceAttribute(database, tableName, deviceIdList.get(i));
+ if (attributeMap == null) {
+ result.missingDeviceIndexList.add(i);
+ continue;
+ }
+ List<String> deviceAttributeValueList = attributeValueList.get(i);
+ for (int j = 0; j < attributeKeyList.size(); j++) {
+ String value = attributeMap.get(attributeKeyList.get(j));
+ if (value == null) {
+ result.attributeMissingInCacheDeviceIndexList.add(i);
+ break;
+ } else if (!value.equals(deviceAttributeValueList.get(j))) {
+ result.attributeUpdateDeviceIndexList.add(i);
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+ private ValidateResult fetchAndValidateDeviceSchema(
+ ITableDeviceSchemaValidation schemaValidation,
+ ValidateResult previousValidateResult,
+ MPPQueryContext context) {
+ List<String[]> targetDeviceList =
+ new ArrayList<>(
+ previousValidateResult.missingDeviceIndexList.size()
+ + previousValidateResult.attributeMissingInCacheDeviceIndexList.size());
+ for (int index : previousValidateResult.missingDeviceIndexList) {
+ targetDeviceList.add(schemaValidation.getDeviceIdList().get(index));
+ }
+ for (int index : previousValidateResult.attributeMissingInCacheDeviceIndexList) {
+ targetDeviceList.add(schemaValidation.getDeviceIdList().get(index));
+ }
+
+ Map<TableDeviceId, Map<String, String>> fetchedDeviceSchema =
+ fetchMissingDeviceSchema(
+ new FetchTableDevicesStatement(
+ schemaValidation.getDatabase(), schemaValidation.getTableName(), targetDeviceList),
+ context);
+
+ for (Map.Entry<TableDeviceId, Map<String, String>> entry : fetchedDeviceSchema.entrySet()) {
+ cache.put(
+ schemaValidation.getDatabase(),
+ schemaValidation.getTableName(),
+ entry.getKey().getIdValues(),
+ entry.getValue());
+ }
+
+ ValidateResult result = new ValidateResult();
+ for (int index : previousValidateResult.missingDeviceIndexList) {
+ String[] deviceId = schemaValidation.getDeviceIdList().get(index);
+ Map<String, String> attributeMap = fetchedDeviceSchema.get(new TableDeviceId(deviceId));
+ if (attributeMap == null) {
+ result.missingDeviceIndexList.add(index);
+ } else {
+ for (int j = 0; j < schemaValidation.getAttributeColumnNameList().size(); j++) {
+ String key = schemaValidation.getAttributeColumnNameList().get(j);
+ String value = attributeMap.get(key);
+ if (value == null
+ || !value.equals(schemaValidation.getAttributeValue().get(index).get(j))) {
+ result.attributeUpdateDeviceIndexList.add(index);
+ break;
+ }
+ }
+ }
+ }
+
+ for (int index : previousValidateResult.attributeMissingInCacheDeviceIndexList) {
+ String[] deviceId = schemaValidation.getDeviceIdList().get(index);
+ Map<String, String> attributeMap = fetchedDeviceSchema.get(new TableDeviceId(deviceId));
+ if (attributeMap == null) {
+ throw new IllegalStateException("Device shall exist but not exist.");
+ } else {
+ for (int j = 0; j < schemaValidation.getAttributeColumnNameList().size(); j++) {
+ String key = schemaValidation.getAttributeColumnNameList().get(j);
+ String value = attributeMap.get(key);
+ if (value == null
+ || !value.equals(schemaValidation.getAttributeValue().get(index).get(j))) {
+ result.attributeUpdateDeviceIndexList.add(index);
+ break;
+ }
+ }
+ }
+ }
+
+ result.attributeUpdateDeviceIndexList.addAll(
+ previousValidateResult.attributeUpdateDeviceIndexList);
+
+ return result;
+ }
+
+ private Map<TableDeviceId, Map<String, String>> fetchMissingDeviceSchema(
+ FetchTableDevicesStatement statement, MPPQueryContext context) {
+ long queryId = SessionManager.getInstance().requestQueryId();
+ Throwable t = null;
+
+ String database = statement.getDatabase();
+ String table = statement.getTableName();
+ TsTable tableInstance = DataNodeTableCache.getInstance().getTable(database, table);
+
+ ExecutionResult executionResult =
+ Coordinator.getInstance()
+ .executeForTreeModel(
+ statement,
+ queryId,
+ SessionManager.getInstance()
+ .getSessionInfo(SessionManager.getInstance().getCurrSession()),
+ "",
+ ClusterPartitionFetcher.getInstance(),
+ ClusterSchemaFetcher.getInstance(),
+ config.getQueryTimeoutThreshold());
+ if (executionResult.status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ throw new RuntimeException(
+ new IoTDBException(
+ executionResult.status.getMessage(), executionResult.status.getCode()));
+ }
+
+ List<ColumnHeader> columnHeaderList =
+ coordinator.getQueryExecution(queryId).getDatasetHeader().getColumnHeaders();
+ int idLength = DataNodeTableCache.getInstance().getTable(database, table).getIdNums();
+ Map<TableDeviceId, Map<String, String>> fetchedDeviceSchema = new HashMap<>();
+
+ try {
+ while (coordinator.getQueryExecution(queryId).hasNextResult()) {
+ Optional<TsBlock> tsBlock;
+ try {
+ tsBlock = coordinator.getQueryExecution(queryId).getBatchResult();
+ } catch (IoTDBException e) {
+ t = e;
+ throw new RuntimeException("Fetch Table Device Schema failed. ", e);
+ }
+ if (!tsBlock.isPresent() || tsBlock.get().isEmpty()) {
+ break;
+ }
+ Column[] columns = tsBlock.get().getValueColumns();
+ for (int i = 0; i < tsBlock.get().getPositionCount(); i++) {
+ String[] nodes = new String[idLength];
+ int idIndex = 0;
+ Map<String, String> attributeMap = new HashMap<>();
+ for (int j = 0; j < columnHeaderList.size(); j++) {
+ TsTableColumnSchema columnSchema =
+ tableInstance.getColumnSchema(columnHeaderList.get(j).getColumnName());
+ if (columnSchema.getColumnCategory().equals(TsTableColumnCategory.ID)) {
+ if (columns[j].isNull(i)) {
+ nodes[idIndex] = null;
+ } else {
+ nodes[idIndex] = columns[j].getBinary(i).toString();
+ }
+ idIndex++;
+ } else {
+ if (columns[j].isNull(i)) {
+ attributeMap.put(columnSchema.getColumnName(), null);
+ } else {
+ attributeMap.put(columnSchema.getColumnName(), columns[j].getBinary(i).toString());
+ }
+ }
+ }
+ fetchedDeviceSchema.put(new TableDeviceId(nodes), attributeMap);
+ }
+ }
+ } catch (Throwable throwable) {
+ t = throwable;
+ throw throwable;
+ } finally {
+ coordinator.cleanupQueryExecution(queryId, null, t);
+ }
+ return fetchedDeviceSchema;
+ }
+
+ private void autoCreateDeviceSchema(
+ ITableDeviceSchemaValidation schemaValidation,
+ ValidateResult previousValidateResult,
+ MPPQueryContext context) {
+ List<String[]> deviceIdList =
+ new ArrayList<>(
+ previousValidateResult.missingDeviceIndexList.size()
+ + previousValidateResult.attributeUpdateDeviceIndexList.size());
+ List<List<String>> attributeValueList = new ArrayList<>(deviceIdList.size());
+ for (int index : previousValidateResult.missingDeviceIndexList) {
+ deviceIdList.add(schemaValidation.getDeviceIdList().get(index));
+ attributeValueList.add(schemaValidation.getAttributeValue().get(index));
+ }
+ for (int index : previousValidateResult.attributeUpdateDeviceIndexList) {
+ deviceIdList.add(schemaValidation.getDeviceIdList().get(index));
+ attributeValueList.add(schemaValidation.getAttributeValue().get(index));
+ }
+
+ CreateTableDeviceStatement statement =
+ new CreateTableDeviceStatement(
+ schemaValidation.getDatabase(),
+ schemaValidation.getTableName(),
+ deviceIdList,
+ schemaValidation.getAttributeColumnNameList(),
+ attributeValueList);
+ ExecutionResult executionResult =
+ Coordinator.getInstance()
+ .executeForTreeModel(
+ statement,
+ SessionManager.getInstance().requestQueryId(),
+ context == null ? null : context.getSession(),
+ "",
+ ClusterPartitionFetcher.getInstance(),
+ ClusterSchemaFetcher.getInstance(),
+ context == null || context.getQueryType().equals(QueryType.WRITE)
+ ? config.getQueryTimeoutThreshold()
+ : context.getTimeOut());
+ if (executionResult.status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ throw new RuntimeException(
+ new IoTDBException(
+ executionResult.status.getMessage(), executionResult.status.getCode()));
+ }
+ }
+
+ private static class ValidateResult {
+ final List<Integer> missingDeviceIndexList = new ArrayList<>();
+ final List<Integer> attributeMissingInCacheDeviceIndexList = new ArrayList<>();
+ final List<Integer> attributeUpdateDeviceIndexList = new ArrayList<>();
+ }
+
+ public List<DeviceEntry> fetchDeviceSchema(
+ String database,
+ String table,
+ List<Expression> expressionList,
+ List<String> attributeColumns) {
+ List<DeviceEntry> deviceEntryList = new ArrayList<>();
+
+ TsTable tableInstance = DataNodeTableCache.getInstance().getTable(database, table);
+ Pair<List<SchemaFilter>, List<SchemaFilter>> filters =
+ transformExpression(expressionList, tableInstance);
+ List<SchemaFilter> idFilters = filters.getLeft();
+ List<SchemaFilter> attributeFilters = filters.getRight();
+ DeviceInCacheFilterVisitor filterVisitor = new DeviceInCacheFilterVisitor(attributeColumns);
+ SchemaFilter attributeFilter = getAttributeFilter(attributeFilters);
+
+ List<List<SchemaFilter>> idPatternList =
+ DeviceFilterUtil.convertSchemaFilterToOrConcatList(idFilters);
+ List<List<SchemaFilter>> idFilterListForFetch = new ArrayList<>();
+ boolean cacheFetchedDevice = true;
+ for (int i = 0; i < idPatternList.size(); i++) {
+ SchemaFilterCheckResult checkResult =
+ checkIdFilterAndTryGetDeviceInCache(
+ deviceEntryList,
+ database,
+ tableInstance,
+ idPatternList.get(i),
+ o -> attributeFilter == null || filterVisitor.process(attributeFilter, o),
+ attributeColumns);
+ if (checkResult.needFetch) {
+ idFilterListForFetch.add(idPatternList.get(i));
+ if (!checkResult.isIdDetermined) {
+ cacheFetchedDevice = false;
+ }
+ }
+ }
+
+ if (!idFilterListForFetch.isEmpty()) {
+ fetchMissingDeviceSchemaForQuery(
+ database,
+ tableInstance,
+ attributeColumns,
+ idFilterListForFetch,
+ attributeFilter,
+ deviceEntryList,
+ cacheFetchedDevice);
+ }
+
+ Set<DeviceEntry> set = new LinkedHashSet<>(deviceEntryList);
+ return new ArrayList<>(set);
+ }
+
+ private Pair<List<SchemaFilter>, List<SchemaFilter>> transformExpression(
+ List<Expression> expressionList, TsTable table) {
+ List<SchemaFilter> idDeterminedFilters = new ArrayList<>();
+ List<SchemaFilter> idFuzzyFilters = new ArrayList<>();
+ ConvertSchemaPredicateToFilterVisitor visitor = new ConvertSchemaPredicateToFilterVisitor();
+ ConvertSchemaPredicateToFilterVisitor.Context context =
+ new ConvertSchemaPredicateToFilterVisitor.Context(table);
+ for (Expression expression : expressionList) {
+ if (expression == null) {
+ continue;
+ }
+ context.reset();
+ SchemaFilter schemaFilter = expression.accept(visitor, context);
+ if (context.hasAttribute()) {
+ idFuzzyFilters.add(schemaFilter);
+ } else {
+ idDeterminedFilters.add(schemaFilter);
+ }
+ }
+ return new Pair<>(idDeterminedFilters, idFuzzyFilters);
+ }
+
+ // return whether this condition shall be used for remote fetch
+ private SchemaFilterCheckResult checkIdFilterAndTryGetDeviceInCache(
+ List<DeviceEntry> deviceEntryList,
+ String database,
+ TsTable tableInstance,
+ List<SchemaFilter> idFilters,
+ Predicate<DeviceEntry> check,
+ List<String> attributeColumns) {
+ String[] idValues = new String[tableInstance.getIdNums()];
+ for (SchemaFilter schemaFilter : idFilters) {
+ DeviceIdFilter idFilter = (DeviceIdFilter) schemaFilter;
+ if (idValues[idFilter.getIndex()] == null) {
+ idValues[idFilter.getIndex()] = idFilter.getValue();
+ } else {
+ // conflict filter
+ return new SchemaFilterCheckResult(false, false);
+ }
+ }
+ if (idFilters.size() < idValues.length) {
+ return new SchemaFilterCheckResult(true, false);
+ }
+ Map<String, String> attributeMap =
+ cache.getDeviceAttribute(database, tableInstance.getTableName(), idValues);
+ if (attributeMap == null) {
+ return new SchemaFilterCheckResult(true, true);
+ }
+ List<String> attributeValues = new ArrayList<>(attributeColumns.size());
+ for (String attributeKey : attributeColumns) {
+ String value = attributeMap.get(attributeKey);
+ if (value == null) {
+ return new SchemaFilterCheckResult(true, true);
+ } else {
+ attributeValues.add(value);
+ }
+ }
+ String[] deviceIdNodes = new String[idValues.length + 1];
+ deviceIdNodes[0] = database + PATH_SEPARATOR + tableInstance.getTableName();
+ System.arraycopy(idValues, 0, deviceIdNodes, 1, idValues.length);
+ DeviceEntry deviceEntry =
+ new DeviceEntry(new StringArrayDeviceID(deviceIdNodes), attributeValues);
+ if (check.test(deviceEntry)) {
+ deviceEntryList.add(deviceEntry);
+ }
+ return new SchemaFilterCheckResult(false, true);
+ }
+
+ private static class SchemaFilterCheckResult {
+ boolean needFetch;
+ boolean isIdDetermined;
+
+ SchemaFilterCheckResult(boolean needFetch, boolean isIdDetermined) {
+ this.needFetch = needFetch;
+ this.isIdDetermined = isIdDetermined;
+ }
+ }
+
+ private void fetchMissingDeviceSchemaForQuery(
+ String database,
+ TsTable tableInstance,
+ List<String> attributeColumns,
+ List<List<SchemaFilter>> idPatternList,
+ SchemaFilter attributeFilter,
+ List<DeviceEntry> deviceEntryList,
+ boolean cacheFetchedDevice) {
+
+ String table = tableInstance.getTableName();
+
+ long queryId = SessionManager.getInstance().requestQueryId();
+ ShowTableDevicesStatement statement =
+ new ShowTableDevicesStatement(database, table, idPatternList, attributeFilter);
+ ExecutionResult executionResult =
+ Coordinator.getInstance()
+ .executeForTreeModel(
+ statement,
+ queryId,
+ SessionManager.getInstance()
+ .getSessionInfo(SessionManager.getInstance().getCurrSession()),
+ "",
+ ClusterPartitionFetcher.getInstance(),
+ ClusterSchemaFetcher.getInstance(),
+ config.getQueryTimeoutThreshold());
+ if (executionResult.status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ throw new RuntimeException(
+ new IoTDBException(
+ executionResult.status.getMessage(), executionResult.status.getCode()));
+ }
+
+ List<ColumnHeader> columnHeaderList =
+ coordinator.getQueryExecution(queryId).getDatasetHeader().getColumnHeaders();
+ int idLength = DataNodeTableCache.getInstance().getTable(database, table).getIdNums();
+ Map<String, String> attributeMap;
+
+ Throwable t = null;
+ try {
+ while (coordinator.getQueryExecution(queryId).hasNextResult()) {
+ Optional<TsBlock> tsBlock;
+ try {
+ tsBlock = coordinator.getQueryExecution(queryId).getBatchResult();
+ } catch (IoTDBException e) {
+ t = e;
+ throw new RuntimeException("Fetch Table Device Schema failed. ", e);
+ }
+ if (!tsBlock.isPresent() || tsBlock.get().isEmpty()) {
+ break;
+ }
+ Column[] columns = tsBlock.get().getValueColumns();
+ for (int i = 0; i < tsBlock.get().getPositionCount(); i++) {
+ String[] nodes = new String[idLength + 1];
+ nodes[0] = database + PATH_SEPARATOR + table;
+ int idIndex = 0;
+ attributeMap = new HashMap<>();
+ for (int j = 0; j < columnHeaderList.size(); j++) {
+ TsTableColumnSchema columnSchema =
+ tableInstance.getColumnSchema(columnHeaderList.get(j).getColumnName());
+ if (columnSchema.getColumnCategory().equals(TsTableColumnCategory.ID)) {
+ if (columns[j].isNull(i)) {
+ nodes[idIndex + 1] = null;
+ } else {
+ nodes[idIndex + 1] = columns[j].getBinary(i).toString();
+ }
+ idIndex++;
+ } else {
+ if (columns[j].isNull(i)) {
+ attributeMap.put(columnSchema.getColumnName(), null);
+ } else {
+ attributeMap.put(columnSchema.getColumnName(), columns[j].getBinary(i).toString());
+ }
+ }
+ }
+ IDeviceID deviceID = new StringArrayDeviceID(nodes);
+ deviceEntryList.add(
+ new DeviceEntry(
+ deviceID,
+ attributeColumns.stream().map(attributeMap::get).collect(Collectors.toList())));
+ if (cacheFetchedDevice) {
+ cache.put(database, table, Arrays.copyOfRange(nodes, 1, nodes.length), attributeMap);
+ }
+ }
+ }
+ } catch (Throwable throwable) {
+ t = throwable;
+ throw throwable;
+ } finally {
+ coordinator.cleanupQueryExecution(queryId, null, t);
+ }
+ }
+
+ private SchemaFilter getAttributeFilter(List<SchemaFilter> filterList) {
+ if (filterList.isEmpty()) {
+ return null;
+ }
+ AndFilter andFilter;
+ SchemaFilter latestFilter = filterList.get(0);
+ for (int i = 1; i < filterList.size(); i++) {
+ andFilter = new AndFilter(latestFilter, filterList.get(i));
+ latestFilter = andFilter;
+ }
+ return latestFilter;
+ }
+}
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/DeviceEntry.java
index 09bb03daf88,8eba1ba4f17..56d68f9fec3
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/DeviceEntry.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/DeviceEntry.java
@@@ -28,9 -30,11 +30,12 @@@ import java.io.IOException
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
- public class DeviceEntry {
+ public class DeviceEntry implements Accountable {
+
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(DeviceEntry.class);
private final IDeviceID deviceID;
private final List<String> attributeColumnValues;
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
index 0b5ec9f4458,8d622c8dc02..9e97d98dc9f
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
@@@ -19,26 -19,25 +19,26 @@@
package org.apache.iotdb.db.queryengine.plan.relational.metadata;
+import org.apache.iotdb.commons.schema.table.TsTable;
import org.apache.iotdb.commons.udf.builtin.BuiltinAggregationFunction;
import org.apache.iotdb.commons.udf.builtin.BuiltinScalarFunction;
+import org.apache.iotdb.db.exception.metadata.table.TableNotExistsException;
import org.apache.iotdb.db.exception.sql.SemanticException;
import org.apache.iotdb.db.queryengine.common.SessionInfo;
+import org.apache.iotdb.db.queryengine.plan.relational.analyzer.schema.TableModelSchemaFetcher;
import org.apache.iotdb.db.queryengine.plan.relational.function.OperatorType;
import org.apache.iotdb.db.queryengine.plan.relational.security.AccessControl;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Expression;
import org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager;
import org.apache.iotdb.db.queryengine.plan.relational.type.TypeManager;
import org.apache.iotdb.db.queryengine.plan.relational.type.TypeNotFoundException;
import org.apache.iotdb.db.queryengine.plan.relational.type.TypeSignature;
- import org.apache.iotdb.db.relational.sql.tree.Expression;
+import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
import org.apache.iotdb.db.utils.constant.SqlConstant;
-import org.apache.tsfile.file.metadata.IDeviceID;
-import org.apache.tsfile.file.metadata.StringArrayDeviceID;
import org.apache.tsfile.read.common.type.Type;
+import org.apache.tsfile.read.common.type.TypeFactory;
-import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
index 00000000000,0e5f4ee0d01..dc8108d531b
mode 000000,100644..100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
@@@ -1,0 -1,1716 +1,1711 @@@
+ /*
+ * 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.db.queryengine.plan.relational.sql.parser;
+
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.AddColumn;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.AliasedRelation;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.AllColumns;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.AllRows;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.ArithmeticBinaryExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.ArithmeticUnaryExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.BetweenPredicate;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.BinaryLiteral;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.BooleanLiteral;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Cast;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.CoalesceExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.ColumnDefinition;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.ComparisonExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.CreateDB;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.CreateIndex;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.CreateTable;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.CurrentDatabase;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.CurrentTime;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.CurrentUser;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.DataType;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.DataTypeParameter;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Delete;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.DereferenceExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.DescribeTable;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.DoubleLiteral;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.DropColumn;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.DropDB;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.DropIndex;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.DropTable;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Except;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.ExistsPredicate;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Expression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.FunctionCall;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.GenericDataType;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.GroupBy;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.GroupingElement;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.GroupingSets;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Identifier;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.IfExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.InListExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.InPredicate;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Insert;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Intersect;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.IsNotNullPredicate;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.IsNullPredicate;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Join;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.JoinCriteria;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.JoinOn;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.JoinUsing;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.LikePredicate;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Limit;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.LogicalExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.LongLiteral;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.NaturalJoin;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Node;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.NodeLocation;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.NotExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.NullIfExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.NullLiteral;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.NumericParameter;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Offset;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.OrderBy;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Parameter;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Property;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.QualifiedName;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.QuantifiedComparisonExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Query;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.QueryBody;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.QuerySpecification;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Relation;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.RenameColumn;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.RenameTable;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Row;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.SearchedCaseExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Select;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.SelectItem;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.SetProperties;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.ShowDB;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.ShowIndex;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.ShowTables;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.SimpleCaseExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.SimpleGroupBy;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.SingleColumn;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.SortItem;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.StringLiteral;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.SubqueryExpression;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Table;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.TableSubquery;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Trim;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.TypeParameter;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Union;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Update;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.UpdateAssignment;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Use;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Values;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.WhenClause;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.With;
+ import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.WithQuery;
+ import org.apache.iotdb.db.relational.grammar.sql.RelationalSqlBaseVisitor;
+ import org.apache.iotdb.db.relational.grammar.sql.RelationalSqlLexer;
+ import org.apache.iotdb.db.relational.grammar.sql.RelationalSqlParser;
+
+ import com.google.common.collect.ImmutableList;
+ import org.antlr.v4.runtime.ParserRuleContext;
+ import org.antlr.v4.runtime.Token;
+ import org.antlr.v4.runtime.tree.ParseTree;
+ import org.antlr.v4.runtime.tree.TerminalNode;
+
+ import javax.annotation.Nullable;
+
+ import java.util.ArrayDeque;
+ import java.util.ArrayList;
+ import java.util.Deque;
+ import java.util.Iterator;
+ import java.util.List;
+ import java.util.Optional;
+ import java.util.function.Function;
+
+ import static com.google.common.collect.ImmutableList.toImmutableList;
+ import static java.util.Objects.requireNonNull;
+ import static java.util.stream.Collectors.toList;
+ import static org.apache.iotdb.db.queryengine.plan.relational.sql.tree.GroupingSets.Type.CUBE;
+ import static org.apache.iotdb.db.queryengine.plan.relational.sql.tree.GroupingSets.Type.EXPLICIT;
+ import static org.apache.iotdb.db.queryengine.plan.relational.sql.tree.GroupingSets.Type.ROLLUP;
+
+ public class AstBuilder extends RelationalSqlBaseVisitor<Node> {
+
+ private int parameterPosition;
+
+ @Nullable private final NodeLocation baseLocation;
+
+ AstBuilder(@Nullable NodeLocation baseLocation) {
+ this.baseLocation = baseLocation;
+ }
+
+ @Override
+ public Node visitSingleStatement(RelationalSqlParser.SingleStatementContext ctx) {
+ return visit(ctx.statement());
+ }
+
+ @Override
+ public Node visitStandaloneExpression(RelationalSqlParser.StandaloneExpressionContext context) {
+ return visit(context.expression());
+ }
+
+ @Override
+ public Node visitStandaloneType(RelationalSqlParser.StandaloneTypeContext context) {
+ return visit(context.type());
+ }
+
+ // ******************* statements **********************
+ @Override
+ public Node visitUseDatabaseStatement(RelationalSqlParser.UseDatabaseStatementContext ctx) {
+ return new Use(getLocation(ctx), (Identifier) visit(ctx.database));
+ }
+
+ @Override
+ public Node visitShowDatabasesStatement(RelationalSqlParser.ShowDatabasesStatementContext ctx) {
+ return new ShowDB(getLocation(ctx));
+ }
+
+ @Override
+ public Node visitCreateDbStatement(RelationalSqlParser.CreateDbStatementContext ctx) {
+ List<Property> properties = ImmutableList.of();
+ if (ctx.properties() != null) {
+ properties = visit(ctx.properties().propertyAssignments().property(), Property.class);
+ }
+
+ return new CreateDB(
+ getLocation(ctx),
+ ctx.EXISTS() != null,
+ ((Identifier) visit(ctx.database)).getValue(),
+ properties);
+ }
+
+ @Override
+ public Node visitDropDbStatement(RelationalSqlParser.DropDbStatementContext ctx) {
+ return new DropDB(getLocation(ctx), (Identifier) visit(ctx.database), ctx.EXISTS() != null);
+ }
+
+ @Override
+ public Node visitCreateTableStatement(RelationalSqlParser.CreateTableStatementContext ctx) {
+ List<Property> properties = ImmutableList.of();
+ if (ctx.properties() != null) {
+ properties = visit(ctx.properties().propertyAssignments().property(), Property.class);
+ }
+ return new CreateTable(
+ getLocation(ctx),
+ getQualifiedName(ctx.qualifiedName()),
+ visit(ctx.columnDefinition(), ColumnDefinition.class),
+ ctx.EXISTS() != null,
+ ctx.charsetDesc() == null
+ ? null
+ : ((Identifier) visit(ctx.charsetDesc().identifierOrString())).getValue(),
+ properties);
+ }
+
+ @Override
+ public Node visitColumnDefinition(RelationalSqlParser.ColumnDefinitionContext ctx) {
+ return new ColumnDefinition(
+ getLocation(ctx),
+ (Identifier) visit(ctx.identifier()),
+ (DataType) visit(ctx.type()),
+ getColumnCategory(ctx.columnCategory),
+ ctx.charsetName() == null
+ ? null
+ : ((Identifier) visit(ctx.charsetName().identifier())).getValue());
+ }
+
+ @Override
+ public Node visitDropTableStatement(RelationalSqlParser.DropTableStatementContext ctx) {
+ return new DropTable(
+ getLocation(ctx), getQualifiedName(ctx.qualifiedName()), ctx.EXISTS() != null);
+ }
+
+ @Override
+ public Node visitShowTableStatement(RelationalSqlParser.ShowTableStatementContext ctx) {
+ if (ctx.database == null) {
+ return new ShowTables(getLocation(ctx));
+ } else {
+ return new ShowTables(getLocation(ctx), (Identifier) visit(ctx.database));
+ }
+ }
+
+ @Override
+ public Node visitDescTableStatement(RelationalSqlParser.DescTableStatementContext ctx) {
+ return new DescribeTable(getLocation(ctx), getQualifiedName(ctx.table));
+ }
+
+ @Override
+ public Node visitRenameTable(RelationalSqlParser.RenameTableContext ctx) {
+ return new RenameTable(
+ getLocation(ctx), getQualifiedName(ctx.from), (Identifier) visit(ctx.to));
+ }
+
+ @Override
+ public Node visitAddColumn(RelationalSqlParser.AddColumnContext ctx) {
+ return new AddColumn(getQualifiedName(ctx.tableName), (ColumnDefinition) visit(ctx.column));
+ }
+
+ @Override
+ public Node visitRenameColumn(RelationalSqlParser.RenameColumnContext ctx) {
+ return new RenameColumn(
+ getLocation(ctx),
+ getQualifiedName(ctx.tableName),
+ (Identifier) visit(ctx.from),
+ (Identifier) visit(ctx.to));
+ }
+
+ @Override
+ public Node visitDropColumn(RelationalSqlParser.DropColumnContext ctx) {
+ return new DropColumn(
+ getLocation(ctx), getQualifiedName(ctx.tableName), (Identifier) visit(ctx.column));
+ }
+
+ @Override
+ public Node visitSetTableProperties(RelationalSqlParser.SetTablePropertiesContext ctx) {
+ List<Property> properties = ImmutableList.of();
+ if (ctx.propertyAssignments() != null) {
+ properties = visit(ctx.propertyAssignments().property(), Property.class);
+ }
+ return new SetProperties(
+ getLocation(ctx),
+ SetProperties.Type.TABLE,
+ getQualifiedName(ctx.qualifiedName()),
+ properties);
+ }
+
+ @Override
+ public Node visitCreateIndexStatement(RelationalSqlParser.CreateIndexStatementContext ctx) {
+ return new CreateIndex(
+ getLocation(ctx),
+ getQualifiedName(ctx.tableName),
+ (Identifier) visit(ctx.indexName),
+ visit(ctx.identifierList().identifier(), Identifier.class));
+ }
+
+ @Override
+ public Node visitDropIndexStatement(RelationalSqlParser.DropIndexStatementContext ctx) {
+ return new DropIndex(
+ getLocation(ctx), getQualifiedName(ctx.tableName), (Identifier) visit(ctx.indexName));
+ }
+
+ @Override
+ public Node visitShowIndexStatement(RelationalSqlParser.ShowIndexStatementContext ctx) {
+ return new ShowIndex(getLocation(ctx), getQualifiedName(ctx.tableName));
+ }
+
+ @Override
+ public Node visitInsertStatement(RelationalSqlParser.InsertStatementContext ctx) {
+ if (ctx.columnAliases() != null) {
+ return new Insert(
+ new Table(getQualifiedName(ctx.tableName)),
+ visit(ctx.columnAliases().identifier(), Identifier.class),
+ (Query) visit(ctx.query()));
+ } else {
+ return new Insert(new Table(getQualifiedName(ctx.tableName)), (Query) visit(ctx.query()));
+ }
+ }
+
+ @Override
+ public Node visitDeleteStatement(RelationalSqlParser.DeleteStatementContext ctx) {
+ if (ctx.booleanExpression() != null) {
+ return new Delete(
+ getLocation(ctx),
+ new Table(getLocation(ctx), getQualifiedName(ctx.tableName)),
+ (Expression) visit(ctx.booleanExpression()));
+ } else {
+ return new Delete(
+ getLocation(ctx), new Table(getLocation(ctx), getQualifiedName(ctx.tableName)));
+ }
+ }
+
+ @Override
+ public Node visitUpdateStatement(RelationalSqlParser.UpdateStatementContext ctx) {
+ if (ctx.booleanExpression() != null) {
+ return new Update(
+ getLocation(ctx),
+ new Table(getLocation(ctx), getQualifiedName(ctx.qualifiedName())),
+ visit(ctx.updateAssignment(), UpdateAssignment.class),
+ (Expression) visit(ctx.booleanExpression()));
+ } else {
+ return new Update(
+ getLocation(ctx),
+ new Table(getLocation(ctx), getQualifiedName(ctx.qualifiedName())),
+ visit(ctx.updateAssignment(), UpdateAssignment.class));
+ }
+ }
+
+ @Override
+ public Node visitUpdateAssignment(RelationalSqlParser.UpdateAssignmentContext ctx) {
+ return new UpdateAssignment(
+ (Identifier) visit(ctx.identifier()), (Expression) visit(ctx.expression()));
+ }
+
+ @Override
+ public Node visitCreateFunctionStatement(RelationalSqlParser.CreateFunctionStatementContext ctx) {
+ return super.visitCreateFunctionStatement(ctx);
+ }
+
+ @Override
+ public Node visitUriClause(RelationalSqlParser.UriClauseContext ctx) {
+ return super.visitUriClause(ctx);
+ }
+
+ @Override
+ public Node visitDropFunctionStatement(RelationalSqlParser.DropFunctionStatementContext ctx) {
+ return super.visitDropFunctionStatement(ctx);
+ }
+
+ @Override
+ public Node visitShowFunctionsStatement(RelationalSqlParser.ShowFunctionsStatementContext ctx) {
+ return super.visitShowFunctionsStatement(ctx);
+ }
+
+ @Override
+ public Node visitLoadTsFileStatement(RelationalSqlParser.LoadTsFileStatementContext ctx) {
+ return super.visitLoadTsFileStatement(ctx);
+ }
+
- @Override
- public Node visitShowDevicesStatement(RelationalSqlParser.ShowDevicesStatementContext ctx) {
- return super.visitShowDevicesStatement(ctx);
- }
-
+ @Override
+ public Node visitCountDevicesStatement(RelationalSqlParser.CountDevicesStatementContext ctx) {
+ return super.visitCountDevicesStatement(ctx);
+ }
+
+ @Override
+ public Node visitShowClusterStatement(RelationalSqlParser.ShowClusterStatementContext ctx) {
+ return super.visitShowClusterStatement(ctx);
+ }
+
+ @Override
+ public Node visitShowRegionsStatement(RelationalSqlParser.ShowRegionsStatementContext ctx) {
+ return super.visitShowRegionsStatement(ctx);
+ }
+
+ @Override
+ public Node visitShowDataNodesStatement(RelationalSqlParser.ShowDataNodesStatementContext ctx) {
+ return super.visitShowDataNodesStatement(ctx);
+ }
+
+ @Override
+ public Node visitShowConfigNodesStatement(
+ RelationalSqlParser.ShowConfigNodesStatementContext ctx) {
+ return super.visitShowConfigNodesStatement(ctx);
+ }
+
+ @Override
+ public Node visitShowClusterIdStatement(RelationalSqlParser.ShowClusterIdStatementContext ctx) {
+ return super.visitShowClusterIdStatement(ctx);
+ }
+
+ @Override
+ public Node visitShowRegionIdStatement(RelationalSqlParser.ShowRegionIdStatementContext ctx) {
+ return super.visitShowRegionIdStatement(ctx);
+ }
+
+ @Override
+ public Node visitShowTimeSlotListStatement(
+ RelationalSqlParser.ShowTimeSlotListStatementContext ctx) {
+ return super.visitShowTimeSlotListStatement(ctx);
+ }
+
+ @Override
+ public Node visitCountTimeSlotListStatement(
+ RelationalSqlParser.CountTimeSlotListStatementContext ctx) {
+ return super.visitCountTimeSlotListStatement(ctx);
+ }
+
+ @Override
+ public Node visitShowSeriesSlotListStatement(
+ RelationalSqlParser.ShowSeriesSlotListStatementContext ctx) {
+ return super.visitShowSeriesSlotListStatement(ctx);
+ }
+
+ @Override
+ public Node visitMigrateRegionStatement(RelationalSqlParser.MigrateRegionStatementContext ctx) {
+ return super.visitMigrateRegionStatement(ctx);
+ }
+
+ @Override
+ public Node visitShowVariablesStatement(RelationalSqlParser.ShowVariablesStatementContext ctx) {
+ return super.visitShowVariablesStatement(ctx);
+ }
+
+ @Override
+ public Node visitFlushStatement(RelationalSqlParser.FlushStatementContext ctx) {
+ return super.visitFlushStatement(ctx);
+ }
+
+ @Override
+ public Node visitClearCacheStatement(RelationalSqlParser.ClearCacheStatementContext ctx) {
+ return super.visitClearCacheStatement(ctx);
+ }
+
+ @Override
+ public Node visitRepairDataStatement(RelationalSqlParser.RepairDataStatementContext ctx) {
+ return super.visitRepairDataStatement(ctx);
+ }
+
+ @Override
+ public Node visitSetSystemStatusStatement(
+ RelationalSqlParser.SetSystemStatusStatementContext ctx) {
+ return super.visitSetSystemStatusStatement(ctx);
+ }
+
+ @Override
+ public Node visitShowVersionStatement(RelationalSqlParser.ShowVersionStatementContext ctx) {
+ return super.visitShowVersionStatement(ctx);
+ }
+
+ @Override
+ public Node visitShowQueriesStatement(RelationalSqlParser.ShowQueriesStatementContext ctx) {
+ return super.visitShowQueriesStatement(ctx);
+ }
+
+ @Override
+ public Node visitKillQueryStatement(RelationalSqlParser.KillQueryStatementContext ctx) {
+ return super.visitKillQueryStatement(ctx);
+ }
+
+ @Override
+ public Node visitLoadConfigurationStatement(
+ RelationalSqlParser.LoadConfigurationStatementContext ctx) {
+ return super.visitLoadConfigurationStatement(ctx);
+ }
+
+ @Override
+ public Node visitLocalOrClusterMode(RelationalSqlParser.LocalOrClusterModeContext ctx) {
+ return super.visitLocalOrClusterMode(ctx);
+ }
+
+ @Override
+ public Node visitStatementDefault(RelationalSqlParser.StatementDefaultContext ctx) {
+ return super.visitStatementDefault(ctx);
+ }
+
+ @Override
+ public Node visitExplain(RelationalSqlParser.ExplainContext ctx) {
+ return super.visitExplain(ctx);
+ }
+
+ @Override
+ public Node visitExplainAnalyze(RelationalSqlParser.ExplainAnalyzeContext ctx) {
+ return super.visitExplainAnalyze(ctx);
+ }
+
+ // ********************** query expressions ********************
+ @Override
+ public Node visitQuery(RelationalSqlParser.QueryContext ctx) {
+ Query body = (Query) visit(ctx.queryNoWith());
+
+ return new Query(
+ getLocation(ctx),
+ visitIfPresent(ctx.with(), With.class),
+ body.getQueryBody(),
+ body.getOrderBy(),
+ body.getOffset(),
+ body.getLimit());
+ }
+
+ @Override
+ public Node visitWith(RelationalSqlParser.WithContext ctx) {
+ return new With(
+ getLocation(ctx), ctx.RECURSIVE() != null, visit(ctx.namedQuery(), WithQuery.class));
+ }
+
+ @Override
+ public Node visitNamedQuery(RelationalSqlParser.NamedQueryContext ctx) {
+ if (ctx.columnAliases() != null) {
+ List<Identifier> columns = visit(ctx.columnAliases().identifier(), Identifier.class);
+ return new WithQuery(
+ getLocation(ctx), (Identifier) visit(ctx.name), (Query) visit(ctx.query()), columns);
+ } else {
+ return new WithQuery(
+ getLocation(ctx), (Identifier) visit(ctx.name), (Query) visit(ctx.query()));
+ }
+ }
+
+ @Override
+ public Node visitQueryNoWith(RelationalSqlParser.QueryNoWithContext ctx) {
+ QueryBody term = (QueryBody) visit(ctx.queryTerm());
+
+ Optional<OrderBy> orderBy = Optional.empty();
+ if (ctx.ORDER() != null) {
+ orderBy =
+ Optional.of(new OrderBy(getLocation(ctx.ORDER()), visit(ctx.sortItem(), SortItem.class)));
+ }
+
+ Optional<Offset> offset = Optional.empty();
+ if (ctx.OFFSET() != null) {
+ Expression rowCount;
+ if (ctx.offset.INTEGER_VALUE() != null) {
+ rowCount = new LongLiteral(getLocation(ctx.offset.INTEGER_VALUE()), ctx.offset.getText());
+ } else {
+ rowCount = new Parameter(getLocation(ctx.offset.QUESTION_MARK()), parameterPosition);
+ parameterPosition++;
+ }
+ offset = Optional.of(new Offset(getLocation(ctx.OFFSET()), rowCount));
+ }
+
+ Optional<Node> limit = Optional.empty();
+ if (ctx.LIMIT() != null) {
+ if (ctx.limit == null) {
+ throw new IllegalStateException("Missing LIMIT value");
+ }
+ Expression rowCount;
+ if (ctx.limit.ALL() != null) {
+ rowCount = new AllRows(getLocation(ctx.limit.ALL()));
+ } else if (ctx.limit.rowCount().INTEGER_VALUE() != null) {
+ rowCount =
+ new LongLiteral(getLocation(ctx.limit.rowCount().INTEGER_VALUE()), ctx.limit.getText());
+ } else {
+ rowCount =
+ new Parameter(getLocation(ctx.limit.rowCount().QUESTION_MARK()), parameterPosition);
+ parameterPosition++;
+ }
+
+ limit = Optional.of(new Limit(getLocation(ctx.LIMIT()), rowCount));
+ }
+
+ if (term instanceof QuerySpecification) {
+ // When we have a simple query specification
+ // followed by order by, offset, limit or fetch,
+ // fold the order by, limit, offset or fetch clauses
+ // into the query specification (analyzer/planner
+ // expects this structure to resolve references with respect
+ // to columns defined in the query specification)
+ QuerySpecification query = (QuerySpecification) term;
+
+ return new Query(
+ getLocation(ctx),
+ Optional.empty(),
+ new QuerySpecification(
+ getLocation(ctx),
+ query.getSelect(),
+ query.getFrom(),
+ query.getWhere(),
+ query.getGroupBy(),
+ query.getHaving(),
+ orderBy,
+ offset,
+ limit),
+ Optional.empty(),
+ Optional.empty(),
+ Optional.empty());
+ }
+
+ return new Query(getLocation(ctx), Optional.empty(), term, orderBy, offset, limit);
+ }
+
+ @Override
+ public Node visitQuerySpecification(RelationalSqlParser.QuerySpecificationContext ctx) {
+ Optional<Relation> from = Optional.empty();
+ List<SelectItem> selectItems = visit(ctx.selectItem(), SelectItem.class);
+
+ List<Relation> relations = visit(ctx.relation(), Relation.class);
+ if (!relations.isEmpty()) {
+ // synthesize implicit join nodes
+ Iterator<Relation> iterator = relations.iterator();
+ Relation relation = iterator.next();
+
+ while (iterator.hasNext()) {
+ relation = new Join(getLocation(ctx), Join.Type.IMPLICIT, relation, iterator.next());
+ }
+
+ from = Optional.of(relation);
+ }
+
+ return new QuerySpecification(
+ getLocation(ctx),
+ new Select(getLocation(ctx.SELECT()), isDistinct(ctx.setQuantifier()), selectItems),
+ from,
+ visitIfPresent(ctx.where, Expression.class),
+ visitIfPresent(ctx.groupBy(), GroupBy.class),
+ visitIfPresent(ctx.having, Expression.class),
+ Optional.empty(),
+ Optional.empty(),
+ Optional.empty());
+ }
+
+ @Override
+ public Node visitSelectSingle(RelationalSqlParser.SelectSingleContext ctx) {
+ if (ctx.identifier() != null) {
+ return new SingleColumn(
+ getLocation(ctx),
+ (Expression) visit(ctx.expression()),
+ (Identifier) visit(ctx.identifier()));
+ } else {
+ return new SingleColumn(getLocation(ctx), (Expression) visit(ctx.expression()));
+ }
+ }
+
+ @Override
+ public Node visitSelectAll(RelationalSqlParser.SelectAllContext ctx) {
+ List<Identifier> aliases = ImmutableList.of();
+ if (ctx.columnAliases() != null) {
+ aliases = visit(ctx.columnAliases().identifier(), Identifier.class);
+ }
+
+ if (ctx.primaryExpression() != null) {
+ return new AllColumns(getLocation(ctx), (Expression) visit(ctx.primaryExpression()), aliases);
+ } else {
+ return new AllColumns(getLocation(ctx), aliases);
+ }
+ }
+
+ @Override
+ public Node visitGroupBy(RelationalSqlParser.GroupByContext ctx) {
+ return new GroupBy(
+ getLocation(ctx),
+ isDistinct(ctx.setQuantifier()),
+ visit(ctx.groupingElement(), GroupingElement.class));
+ }
+
+ @Override
+ public Node visitSingleGroupingSet(RelationalSqlParser.SingleGroupingSetContext ctx) {
+ return new SimpleGroupBy(
+ getLocation(ctx), visit(ctx.groupingSet().expression(), Expression.class));
+ }
+
+ @Override
+ public Node visitRollup(RelationalSqlParser.RollupContext ctx) {
+ return new GroupingSets(
+ getLocation(ctx),
+ ROLLUP,
+ ctx.groupingSet().stream()
+ .map(groupingSet -> visit(groupingSet.expression(), Expression.class))
+ .collect(toList()));
+ }
+
+ @Override
+ public Node visitCube(RelationalSqlParser.CubeContext ctx) {
+ return new GroupingSets(
+ getLocation(ctx),
+ CUBE,
+ ctx.groupingSet().stream()
+ .map(groupingSet -> visit(groupingSet.expression(), Expression.class))
+ .collect(toList()));
+ }
+
+ @Override
+ public Node visitMultipleGroupingSets(RelationalSqlParser.MultipleGroupingSetsContext ctx) {
+ return new GroupingSets(
+ getLocation(ctx),
+ EXPLICIT,
+ ctx.groupingSet().stream()
+ .map(groupingSet -> visit(groupingSet.expression(), Expression.class))
+ .collect(toList()));
+ }
+
+ @Override
+ public Node visitSetOperation(RelationalSqlParser.SetOperationContext ctx) {
+ QueryBody left = (QueryBody) visit(ctx.left);
+ QueryBody right = (QueryBody) visit(ctx.right);
+
+ boolean distinct = ctx.setQuantifier() == null || ctx.setQuantifier().DISTINCT() != null;
+
+ switch (ctx.operator.getType()) {
+ case RelationalSqlLexer.UNION:
+ return new Union(getLocation(ctx.UNION()), ImmutableList.of(left, right), distinct);
+ case RelationalSqlLexer.INTERSECT:
+ return new Intersect(getLocation(ctx.INTERSECT()), ImmutableList.of(left, right), distinct);
+ case RelationalSqlLexer.EXCEPT:
+ return new Except(getLocation(ctx.EXCEPT()), left, right, distinct);
+ default:
+ throw new IllegalArgumentException("Unsupported set operation: " + ctx.operator.getText());
+ }
+ }
+
+ @Override
+ public Node visitProperty(RelationalSqlParser.PropertyContext ctx) {
+ NodeLocation location = getLocation(ctx);
+ Identifier name = (Identifier) visit(ctx.identifier());
+ RelationalSqlParser.PropertyValueContext valueContext = ctx.propertyValue();
+ if (valueContext instanceof RelationalSqlParser.DefaultPropertyValueContext) {
+ return new Property(location, name);
+ }
+ Expression value =
+ (Expression)
+ visit(((RelationalSqlParser.NonDefaultPropertyValueContext) valueContext).expression());
+ return new Property(location, name, value);
+ }
+
+ @Override
+ public Node visitTable(RelationalSqlParser.TableContext ctx) {
+ return new Table(getLocation(ctx), getQualifiedName(ctx.qualifiedName()));
+ }
+
+ @Override
+ public Node visitInlineTable(RelationalSqlParser.InlineTableContext ctx) {
+ return new Values(getLocation(ctx), visit(ctx.expression(), Expression.class));
+ }
+
+ @Override
+ public Node visitSubquery(RelationalSqlParser.SubqueryContext ctx) {
+ return new TableSubquery(getLocation(ctx), (Query) visit(ctx.queryNoWith()));
+ }
+
+ @Override
+ public Node visitSortItem(RelationalSqlParser.SortItemContext ctx) {
+ return new SortItem(
+ getLocation(ctx),
+ (Expression) visit(ctx.expression()),
+ Optional.ofNullable(ctx.ordering)
+ .map(AstBuilder::getOrderingType)
+ .orElse(SortItem.Ordering.ASCENDING),
+ Optional.ofNullable(ctx.nullOrdering)
+ .map(AstBuilder::getNullOrderingType)
+ .orElse(SortItem.NullOrdering.UNDEFINED));
+ }
+
+ @Override
+ public Node visitUnquotedIdentifier(RelationalSqlParser.UnquotedIdentifierContext ctx) {
+ return new Identifier(getLocation(ctx), ctx.getText(), false);
+ }
+
+ @Override
+ public Node visitQuotedIdentifier(RelationalSqlParser.QuotedIdentifierContext ctx) {
+ String token = ctx.getText();
+ String identifier = token.substring(1, token.length() - 1).replace("\"\"", "\"");
+
+ return new Identifier(getLocation(ctx), identifier, true);
+ }
+
+ @Override
+ public Node visitTimenGrouping(RelationalSqlParser.TimenGroupingContext ctx) {
+ return super.visitTimenGrouping(ctx);
+ }
+
+ @Override
+ public Node visitVariationGrouping(RelationalSqlParser.VariationGroupingContext ctx) {
+ return super.visitVariationGrouping(ctx);
+ }
+
+ @Override
+ public Node visitConditionGrouping(RelationalSqlParser.ConditionGroupingContext ctx) {
+ return super.visitConditionGrouping(ctx);
+ }
+
+ @Override
+ public Node visitSessionGrouping(RelationalSqlParser.SessionGroupingContext ctx) {
+ return super.visitSessionGrouping(ctx);
+ }
+
+ @Override
+ public Node visitCountGrouping(RelationalSqlParser.CountGroupingContext ctx) {
+ return super.visitCountGrouping(ctx);
+ }
+
+ @Override
+ public Node visitLeftClosedRightOpen(RelationalSqlParser.LeftClosedRightOpenContext ctx) {
+ return super.visitLeftClosedRightOpen(ctx);
+ }
+
+ @Override
+ public Node visitLeftOpenRightClosed(RelationalSqlParser.LeftOpenRightClosedContext ctx) {
+ return super.visitLeftOpenRightClosed(ctx);
+ }
+
+ @Override
+ public Node visitTimeValue(RelationalSqlParser.TimeValueContext ctx) {
+ return super.visitTimeValue(ctx);
+ }
+
+ @Override
+ public Node visitDateExpression(RelationalSqlParser.DateExpressionContext ctx) {
+ return super.visitDateExpression(ctx);
+ }
+
+ @Override
+ public Node visitDatetimeLiteral(RelationalSqlParser.DatetimeLiteralContext ctx) {
+ return super.visitDatetimeLiteral(ctx);
+ }
+
+ @Override
+ public Node visitKeepExpression(RelationalSqlParser.KeepExpressionContext ctx) {
+ return super.visitKeepExpression(ctx);
+ }
+
+ // ***************** boolean expressions ******************
+ @Override
+ public Node visitLogicalNot(RelationalSqlParser.LogicalNotContext ctx) {
+ return new NotExpression(getLocation(ctx), (Expression) visit(ctx.booleanExpression()));
+ }
+
+ @Override
+ public Node visitOr(RelationalSqlParser.OrContext ctx) {
+ List<ParserRuleContext> terms =
+ flatten(
+ ctx,
+ element -> {
+ if (element instanceof RelationalSqlParser.OrContext) {
+ RelationalSqlParser.OrContext or = (RelationalSqlParser.OrContext) element;
+ return Optional.of(or.booleanExpression());
+ }
+
+ return Optional.empty();
+ });
+
+ return new LogicalExpression(
+ getLocation(ctx), LogicalExpression.Operator.OR, visit(terms, Expression.class));
+ }
+
+ @Override
+ public Node visitAnd(RelationalSqlParser.AndContext ctx) {
+ List<ParserRuleContext> terms =
+ flatten(
+ ctx,
+ element -> {
+ if (element instanceof RelationalSqlParser.AndContext) {
+ RelationalSqlParser.AndContext and = (RelationalSqlParser.AndContext) element;
+ return Optional.of(and.booleanExpression());
+ }
+
+ return Optional.empty();
+ });
+
+ return new LogicalExpression(
+ getLocation(ctx), LogicalExpression.Operator.AND, visit(terms, Expression.class));
+ }
+
+ private static List<ParserRuleContext> flatten(
+ ParserRuleContext root,
+ Function<ParserRuleContext, Optional<List<? extends ParserRuleContext>>> extractChildren) {
+ List<ParserRuleContext> result = new ArrayList<>();
+ Deque<ParserRuleContext> pending = new ArrayDeque<>();
+ pending.push(root);
+
+ while (!pending.isEmpty()) {
+ ParserRuleContext next = pending.pop();
+
+ Optional<List<? extends ParserRuleContext>> children = extractChildren.apply(next);
+ if (!children.isPresent()) {
+ result.add(next);
+ } else {
+ for (int i = children.get().size() - 1; i >= 0; i--) {
+ pending.push(children.get().get(i));
+ }
+ }
+ }
+
+ return result;
+ }
+
+ // *************** from clause *****************
+ @Override
+ public Node visitJoinRelation(RelationalSqlParser.JoinRelationContext ctx) {
+ Relation left = (Relation) visit(ctx.left);
+ Relation right;
+
+ if (ctx.CROSS() != null) {
+ right = (Relation) visit(ctx.right);
+ return new Join(getLocation(ctx), Join.Type.CROSS, left, right);
+ }
+
+ JoinCriteria criteria;
+ if (ctx.NATURAL() != null) {
+ right = (Relation) visit(ctx.right);
+ criteria = new NaturalJoin();
+ } else {
+ right = (Relation) visit(ctx.rightRelation);
+ if (ctx.joinCriteria().ON() != null) {
+ criteria = new JoinOn((Expression) visit(ctx.joinCriteria().booleanExpression()));
+ } else if (ctx.joinCriteria().USING() != null) {
+ criteria = new JoinUsing(visit(ctx.joinCriteria().identifier(), Identifier.class));
+ } else {
+ throw new IllegalArgumentException("Unsupported join criteria");
+ }
+ }
+
+ Join.Type joinType;
+ if (ctx.joinType().LEFT() != null) {
+ joinType = Join.Type.LEFT;
+ } else if (ctx.joinType().RIGHT() != null) {
+ joinType = Join.Type.RIGHT;
+ } else if (ctx.joinType().FULL() != null) {
+ joinType = Join.Type.FULL;
+ } else {
+ joinType = Join.Type.INNER;
+ }
+
+ return new Join(getLocation(ctx), joinType, left, right, criteria);
+ }
+
+ @Override
+ public Node visitAliasedRelation(RelationalSqlParser.AliasedRelationContext ctx) {
+ Relation child = (Relation) visit(ctx.relationPrimary());
+
+ if (ctx.identifier() == null) {
+ return child;
+ }
+
+ List<Identifier> aliases = null;
+ if (ctx.columnAliases() != null) {
+ aliases = visit(ctx.columnAliases().identifier(), Identifier.class);
+ }
+
+ return new AliasedRelation(
+ getLocation(ctx), child, (Identifier) visit(ctx.identifier()), aliases);
+ }
+
+ @Override
+ public Node visitTableName(RelationalSqlParser.TableNameContext ctx) {
+ return new Table(getLocation(ctx), getQualifiedName(ctx.qualifiedName()));
+ }
+
+ @Override
+ public Node visitSubqueryRelation(RelationalSqlParser.SubqueryRelationContext ctx) {
+ return new TableSubquery(getLocation(ctx), (Query) visit(ctx.query()));
+ }
+
+ @Override
+ public Node visitParenthesizedRelation(RelationalSqlParser.ParenthesizedRelationContext ctx) {
+ return visit(ctx.relation());
+ }
+
+ // ********************* predicates *******************
+
+ @Override
+ public Node visitPredicated(RelationalSqlParser.PredicatedContext ctx) {
+ if (ctx.predicate() != null) {
+ return visit(ctx.predicate());
+ }
+
+ return visit(ctx.valueExpression);
+ }
+
+ @Override
+ public Node visitComparison(RelationalSqlParser.ComparisonContext ctx) {
+ return new ComparisonExpression(
+ getLocation(ctx.comparisonOperator()),
+ getComparisonOperator(((TerminalNode) ctx.comparisonOperator().getChild(0)).getSymbol()),
+ (Expression) visit(ctx.value),
+ (Expression) visit(ctx.right));
+ }
+
+ @Override
+ public Node visitQuantifiedComparison(RelationalSqlParser.QuantifiedComparisonContext ctx) {
+ return new QuantifiedComparisonExpression(
+ getLocation(ctx.comparisonOperator()),
+ getComparisonOperator(((TerminalNode) ctx.comparisonOperator().getChild(0)).getSymbol()),
+ getComparisonQuantifier(
+ ((TerminalNode) ctx.comparisonQuantifier().getChild(0)).getSymbol()),
+ (Expression) visit(ctx.value),
+ new SubqueryExpression(getLocation(ctx.query()), (Query) visit(ctx.query())));
+ }
+
+ @Override
+ public Node visitBetween(RelationalSqlParser.BetweenContext ctx) {
+ Expression expression =
+ new BetweenPredicate(
+ getLocation(ctx),
+ (Expression) visit(ctx.value),
+ (Expression) visit(ctx.lower),
+ (Expression) visit(ctx.upper));
+
+ if (ctx.NOT() != null) {
+ expression = new NotExpression(getLocation(ctx), expression);
+ }
+
+ return expression;
+ }
+
+ @Override
+ public Node visitInList(RelationalSqlParser.InListContext ctx) {
+ Expression result =
+ new InPredicate(
+ getLocation(ctx),
+ (Expression) visit(ctx.value),
+ new InListExpression(getLocation(ctx), visit(ctx.expression(), Expression.class)));
+
+ if (ctx.NOT() != null) {
+ result = new NotExpression(getLocation(ctx), result);
+ }
+
+ return result;
+ }
+
+ @Override
+ public Node visitInSubquery(RelationalSqlParser.InSubqueryContext ctx) {
+ Expression result =
+ new InPredicate(
+ getLocation(ctx),
+ (Expression) visit(ctx.value),
+ new SubqueryExpression(getLocation(ctx), (Query) visit(ctx.query())));
+
+ if (ctx.NOT() != null) {
+ result = new NotExpression(getLocation(ctx), result);
+ }
+
+ return result;
+ }
+
+ @Override
+ public Node visitLike(RelationalSqlParser.LikeContext ctx) {
+ Expression result;
+ if (ctx.escape != null) {
+ result =
+ new LikePredicate(
+ getLocation(ctx),
+ (Expression) visit(ctx.value),
+ (Expression) visit(ctx.pattern),
+ (Expression) visit(ctx.escape));
+ } else {
+ result =
+ new LikePredicate(
+ getLocation(ctx), (Expression) visit(ctx.value), (Expression) visit(ctx.pattern));
+ }
+
+ if (ctx.NOT() != null) {
+ result = new NotExpression(getLocation(ctx), result);
+ }
+
+ return result;
+ }
+
+ @Override
+ public Node visitNullPredicate(RelationalSqlParser.NullPredicateContext ctx) {
+ Expression child = (Expression) visit(ctx.value);
+
+ if (ctx.NOT() == null) {
+ return new IsNullPredicate(getLocation(ctx), child);
+ }
+
+ return new IsNotNullPredicate(getLocation(ctx), child);
+ }
+
+ @Override
+ public Node visitDistinctFrom(RelationalSqlParser.DistinctFromContext ctx) {
+ Expression expression =
+ new ComparisonExpression(
+ getLocation(ctx),
+ ComparisonExpression.Operator.IS_DISTINCT_FROM,
+ (Expression) visit(ctx.value),
+ (Expression) visit(ctx.right));
+
+ if (ctx.NOT() != null) {
+ expression = new NotExpression(getLocation(ctx), expression);
+ }
+
+ return expression;
+ }
+
+ @Override
+ public Node visitExists(RelationalSqlParser.ExistsContext ctx) {
+ return new ExistsPredicate(
+ getLocation(ctx), new SubqueryExpression(getLocation(ctx), (Query) visit(ctx.query())));
+ }
+
+ // ************** value expressions **************
+ @Override
+ public Node visitArithmeticUnary(RelationalSqlParser.ArithmeticUnaryContext ctx) {
+ Expression child = (Expression) visit(ctx.valueExpression());
+
+ switch (ctx.operator.getType()) {
+ case RelationalSqlLexer.MINUS:
+ return ArithmeticUnaryExpression.negative(getLocation(ctx), child);
+ case RelationalSqlLexer.PLUS:
+ return ArithmeticUnaryExpression.positive(getLocation(ctx), child);
+ default:
+ throw new UnsupportedOperationException("Unsupported sign: " + ctx.operator.getText());
+ }
+ }
+
+ @Override
+ public Node visitArithmeticBinary(RelationalSqlParser.ArithmeticBinaryContext ctx) {
+ return new ArithmeticBinaryExpression(
+ getLocation(ctx.operator),
+ getArithmeticBinaryOperator(ctx.operator),
+ (Expression) visit(ctx.left),
+ (Expression) visit(ctx.right));
+ }
+
+ @Override
+ public Node visitConcatenation(RelationalSqlParser.ConcatenationContext ctx) {
+ return new FunctionCall(
+ getLocation(ctx.CONCAT()),
+ QualifiedName.of("concat"),
+ ImmutableList.of((Expression) visit(ctx.left), (Expression) visit(ctx.right)));
+ }
+
+ // ********************* primary expressions **********************
+ @Override
+ public Node visitParenthesizedExpression(RelationalSqlParser.ParenthesizedExpressionContext ctx) {
+ return visit(ctx.expression());
+ }
+
+ @Override
+ public Node visitRowConstructor(RelationalSqlParser.RowConstructorContext context) {
+ return new Row(getLocation(context), visit(context.expression(), Expression.class));
+ }
+
+ @Override
+ public Node visitCast(RelationalSqlParser.CastContext ctx) {
+ return new Cast(
+ getLocation(ctx), (Expression) visit(ctx.expression()), (DataType) visit(ctx.type()));
+ }
+
+ @Override
+ public Node visitSpecialDateTimeFunction(RelationalSqlParser.SpecialDateTimeFunctionContext ctx) {
+ CurrentTime.Function function = getDateTimeFunctionType(ctx.name);
+ return new CurrentTime(getLocation(ctx), function);
+ }
+
+ @Override
+ public Node visitTrim(RelationalSqlParser.TrimContext ctx) {
+ if (ctx.FROM() != null && ctx.trimsSpecification() == null && ctx.trimChar == null) {
+ throw parseError(
+ "The 'trim' function must have specification, char or both arguments when it takes FROM",
+ ctx);
+ }
+
+ Trim.Specification specification =
+ ctx.trimsSpecification() == null
+ ? Trim.Specification.BOTH
+ : toTrimSpecification((Token) ctx.trimsSpecification().getChild(0).getPayload());
+ if (ctx.trimChar != null) {
+ return new Trim(
+ getLocation(ctx),
+ specification,
+ (Expression) visit(ctx.trimSource),
+ (Expression) visit(ctx.trimChar));
+ } else {
+ return new Trim(getLocation(ctx), specification, (Expression) visit(ctx.trimSource));
+ }
+ }
+
+ private static Trim.Specification toTrimSpecification(Token token) {
+ switch (token.getType()) {
+ case RelationalSqlLexer.BOTH:
+ return Trim.Specification.BOTH;
+ case RelationalSqlLexer.LEADING:
+ return Trim.Specification.LEADING;
+ case RelationalSqlLexer.TRAILING:
+ return Trim.Specification.TRAILING;
+ default:
+ throw new IllegalArgumentException("Unsupported trim specification: " + token.getText());
+ }
+ }
+
+ @Override
+ public Node visitSubstring(RelationalSqlParser.SubstringContext ctx) {
+ return new FunctionCall(
+ getLocation(ctx),
+ QualifiedName.of("substr"),
+ visit(ctx.valueExpression(), Expression.class));
+ }
+
+ @Override
+ public Node visitCurrentDatabase(RelationalSqlParser.CurrentDatabaseContext ctx) {
+ return new CurrentDatabase(getLocation(ctx));
+ }
+
+ @Override
+ public Node visitCurrentUser(RelationalSqlParser.CurrentUserContext ctx) {
+ return new CurrentUser(getLocation(ctx));
+ }
+
+ @Override
+ public Node visitSubqueryExpression(RelationalSqlParser.SubqueryExpressionContext ctx) {
+ return new SubqueryExpression(getLocation(ctx), (Query) visit(ctx.query()));
+ }
+
+ @Override
+ public Node visitDereference(RelationalSqlParser.DereferenceContext ctx) {
+ return new DereferenceExpression(
+ getLocation(ctx), (Expression) visit(ctx.base), (Identifier) visit(ctx.fieldName));
+ }
+
+ @Override
+ public Node visitColumnReference(RelationalSqlParser.ColumnReferenceContext ctx) {
+ return visit(ctx.identifier());
+ }
+
+ @Override
+ public Node visitSimpleCase(RelationalSqlParser.SimpleCaseContext ctx) {
+ if (ctx.elseExpression != null) {
+ return new SimpleCaseExpression(
+ getLocation(ctx),
+ (Expression) visit(ctx.operand),
+ visit(ctx.whenClause(), WhenClause.class),
+ (Expression) visit(ctx.elseExpression));
+ } else {
+ return new SimpleCaseExpression(
+ getLocation(ctx),
+ (Expression) visit(ctx.operand),
+ visit(ctx.whenClause(), WhenClause.class));
+ }
+ }
+
+ @Override
+ public Node visitSearchedCase(RelationalSqlParser.SearchedCaseContext ctx) {
+ if (ctx.elseExpression != null) {
+ return new SearchedCaseExpression(
+ getLocation(ctx),
+ visit(ctx.whenClause(), WhenClause.class),
+ (Expression) visit(ctx.elseExpression));
+ } else {
+ return new SearchedCaseExpression(
+ getLocation(ctx), visit(ctx.whenClause(), WhenClause.class));
+ }
+ }
+
+ @Override
+ public Node visitWhenClause(RelationalSqlParser.WhenClauseContext ctx) {
+ return new WhenClause(
+ getLocation(ctx), (Expression) visit(ctx.condition), (Expression) visit(ctx.result));
+ }
+
+ @Override
+ public Node visitFunctionCall(RelationalSqlParser.FunctionCallContext ctx) {
+
+ QualifiedName name = getQualifiedName(ctx.qualifiedName());
+
+ boolean distinct = isDistinct(ctx.setQuantifier());
+
+ if (name.toString().equalsIgnoreCase("if")) {
+ check(
+ ctx.expression().size() == 2 || ctx.expression().size() == 3,
+ "Invalid number of arguments for 'if' function",
+ ctx);
+ check(!distinct, "DISTINCT not valid for 'if' function", ctx);
+
+ Expression elseExpression = null;
+ if (ctx.expression().size() == 3) {
+ elseExpression = (Expression) visit(ctx.expression(2));
+ }
+
+ return new IfExpression(
+ getLocation(ctx),
+ (Expression) visit(ctx.expression(0)),
+ (Expression) visit(ctx.expression(1)),
+ elseExpression);
+ }
+
+ if (name.toString().equalsIgnoreCase("nullif")) {
+ check(ctx.expression().size() == 2, "Invalid number of arguments for 'nullif' function", ctx);
+ check(!distinct, "DISTINCT not valid for 'nullif' function", ctx);
+
+ return new NullIfExpression(
+ getLocation(ctx),
+ (Expression) visit(ctx.expression(0)),
+ (Expression) visit(ctx.expression(1)));
+ }
+
+ if (name.toString().equalsIgnoreCase("coalesce")) {
+ check(
+ ctx.expression().size() >= 2,
+ "The 'coalesce' function must have at least two arguments",
+ ctx);
+ check(!distinct, "DISTINCT not valid for 'coalesce' function", ctx);
+
+ return new CoalesceExpression(getLocation(ctx), visit(ctx.expression(), Expression.class));
+ }
+
+ List<Expression> arguments = visit(ctx.expression(), Expression.class);
+ if (ctx.label != null) {
+ arguments =
+ ImmutableList.of(
+ new DereferenceExpression(getLocation(ctx.label), (Identifier) visit(ctx.label)));
+ }
+
+ return new FunctionCall(getLocation(ctx), name, distinct, arguments);
+ }
+
+ // ************** literals **************
+
+ @Override
+ public Node visitNullLiteral(RelationalSqlParser.NullLiteralContext ctx) {
+ return new NullLiteral(getLocation(ctx));
+ }
+
+ @Override
+ public Node visitBasicStringLiteral(RelationalSqlParser.BasicStringLiteralContext ctx) {
+ return new StringLiteral(getLocation(ctx), unquote(ctx.STRING().getText()));
+ }
+
+ @Override
+ public Node visitUnicodeStringLiteral(RelationalSqlParser.UnicodeStringLiteralContext ctx) {
+ return new StringLiteral(getLocation(ctx), decodeUnicodeLiteral(ctx));
+ }
+
+ @Override
+ public Node visitBinaryLiteral(RelationalSqlParser.BinaryLiteralContext ctx) {
+ String raw = ctx.BINARY_LITERAL().getText();
+ return new BinaryLiteral(getLocation(ctx), unquote(raw.substring(1)));
+ }
+
+ @Override
+ public Node visitDecimalLiteral(RelationalSqlParser.DecimalLiteralContext ctx) {
+ return new DoubleLiteral(getLocation(ctx), ctx.getText());
+ }
+
+ @Override
+ public Node visitDoubleLiteral(RelationalSqlParser.DoubleLiteralContext ctx) {
+ return new DoubleLiteral(getLocation(ctx), ctx.getText());
+ }
+
+ @Override
+ public Node visitIntegerLiteral(RelationalSqlParser.IntegerLiteralContext ctx) {
+ return new LongLiteral(getLocation(ctx), ctx.getText());
+ }
+
+ @Override
+ public Node visitBooleanLiteral(RelationalSqlParser.BooleanLiteralContext ctx) {
+ return new BooleanLiteral(getLocation(ctx), ctx.getText());
+ }
+
+ @Override
+ public Node visitParameter(RelationalSqlParser.ParameterContext ctx) {
+ Parameter parameter = new Parameter(getLocation(ctx), parameterPosition);
+ parameterPosition++;
+ return parameter;
+ }
+
+ @Override
+ public Node visitIdentifierOrString(RelationalSqlParser.IdentifierOrStringContext ctx) {
+ String s = null;
+ if (ctx.identifier() != null) {
+ return visit(ctx.identifier());
+ } else if (ctx.string() != null) {
+ s = ((StringLiteral) visit(ctx.string())).getValue();
+ }
+
+ return new Identifier(getLocation(ctx), s);
+ }
+
+ @Override
+ public Node visitIntervalField(RelationalSqlParser.IntervalFieldContext ctx) {
+ return super.visitIntervalField(ctx);
+ }
+
+ @Override
+ public Node visitTimeDuration(RelationalSqlParser.TimeDurationContext ctx) {
+ return super.visitTimeDuration(ctx);
+ }
+
+ // ***************** arguments *****************
+ @Override
+ public Node visitGenericType(RelationalSqlParser.GenericTypeContext ctx) {
+ List<DataTypeParameter> parameters =
+ ctx.typeParameter().stream()
+ .map(this::visit)
+ .map(DataTypeParameter.class::cast)
+ .collect(toImmutableList());
+
+ return new GenericDataType(getLocation(ctx), (Identifier) visit(ctx.identifier()), parameters);
+ }
+
+ @Override
+ public Node visitTypeParameter(RelationalSqlParser.TypeParameterContext ctx) {
+ if (ctx.INTEGER_VALUE() != null) {
+ return new NumericParameter(getLocation(ctx), ctx.getText());
+ }
+
+ return new TypeParameter((DataType) visit(ctx.type()));
+ }
+
+ // ***************** helpers *****************
+
+ private enum UnicodeDecodeState {
+ EMPTY,
+ ESCAPED,
+ UNICODE_SEQUENCE
+ }
+
+ private static String decodeUnicodeLiteral(
+ RelationalSqlParser.UnicodeStringLiteralContext context) {
+ char escape;
+ if (context.UESCAPE() != null) {
+ String escapeString = unquote(context.STRING().getText());
+ check(!escapeString.isEmpty(), "Empty Unicode escape character", context);
+ check(
+ escapeString.length() == 1, "Invalid Unicode escape character: " + escapeString, context);
+ escape = escapeString.charAt(0);
+ check(
+ isValidUnicodeEscape(escape),
+ "Invalid Unicode escape character: " + escapeString,
+ context);
+ } else {
+ escape = '\\';
+ }
+
+ String rawContent = unquote(context.UNICODE_STRING().getText().substring(2));
+ StringBuilder unicodeStringBuilder = new StringBuilder();
+ StringBuilder escapedCharacterBuilder = new StringBuilder();
+ int charactersNeeded = 0;
+ UnicodeDecodeState state = UnicodeDecodeState.EMPTY;
+ for (int i = 0; i < rawContent.length(); i++) {
+ char ch = rawContent.charAt(i);
+ switch (state) {
+ case EMPTY:
+ if (ch == escape) {
+ state = UnicodeDecodeState.ESCAPED;
+ } else {
+ unicodeStringBuilder.append(ch);
+ }
+ break;
+ case ESCAPED:
+ if (ch == escape) {
+ unicodeStringBuilder.append(escape);
+ state = UnicodeDecodeState.EMPTY;
+ } else if (ch == '+') {
+ state = UnicodeDecodeState.UNICODE_SEQUENCE;
+ charactersNeeded = 6;
+ } else if (isHexDigit(ch)) {
+ state = UnicodeDecodeState.UNICODE_SEQUENCE;
+ charactersNeeded = 4;
+ escapedCharacterBuilder.append(ch);
+ } else {
+ throw parseError("Invalid hexadecimal digit: " + ch, context);
+ }
+ break;
+ case UNICODE_SEQUENCE:
+ check(isHexDigit(ch), "Incomplete escape sequence: " + escapedCharacterBuilder, context);
+ escapedCharacterBuilder.append(ch);
+ if (charactersNeeded == escapedCharacterBuilder.length()) {
+ String currentEscapedCode = escapedCharacterBuilder.toString();
+ escapedCharacterBuilder.setLength(0);
+ int codePoint = Integer.parseInt(currentEscapedCode, 16);
+ check(
+ Character.isValidCodePoint(codePoint),
+ "Invalid escaped character: " + currentEscapedCode,
+ context);
+ if (Character.isSupplementaryCodePoint(codePoint)) {
+ unicodeStringBuilder.appendCodePoint(codePoint);
+ } else {
+ char currentCodePoint = (char) codePoint;
+ if (Character.isSurrogate(currentCodePoint)) {
+ throw parseError(
+ String.format(
+ "Invalid escaped character: %s. Escaped character is a surrogate. Use '\\+123456' instead.",
+ currentEscapedCode),
+ context);
+ }
+ unicodeStringBuilder.append(currentCodePoint);
+ }
+ state = UnicodeDecodeState.EMPTY;
+ charactersNeeded = -1;
+ } else {
+ check(
+ charactersNeeded > escapedCharacterBuilder.length(),
+ "Unexpected escape sequence length: " + escapedCharacterBuilder.length(),
+ context);
+ }
+ break;
+ default:
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ check(
+ state == UnicodeDecodeState.EMPTY,
+ "Incomplete escape sequence: " + escapedCharacterBuilder.toString(),
+ context);
+ return unicodeStringBuilder.toString();
+ }
+
+ private <T> Optional<T> visitIfPresent(ParserRuleContext context, Class<T> clazz) {
+ return Optional.ofNullable(context).map(this::visit).map(clazz::cast);
+ }
+
+ private <T> List<T> visit(List<? extends ParserRuleContext> contexts, Class<T> clazz) {
+ return contexts.stream().map(this::visit).map(clazz::cast).collect(toList());
+ }
+
+ private static String unquote(String value) {
+ return value.substring(1, value.length() - 1).replace("''", "'");
+ }
+
+ private QualifiedName getQualifiedName(RelationalSqlParser.QualifiedNameContext context) {
+ return QualifiedName.of(visit(context.identifier(), Identifier.class));
+ }
+
+ private static boolean isDistinct(RelationalSqlParser.SetQuantifierContext setQuantifier) {
+ return setQuantifier != null && setQuantifier.DISTINCT() != null;
+ }
+
+ private static boolean isHexDigit(char c) {
+ return ((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'F')) || ((c >= 'a') && (c <= 'f'));
+ }
+
+ private static boolean isValidUnicodeEscape(char c) {
+ return c < 0x7F && c > 0x20 && !isHexDigit(c) && c != '"' && c != '+' && c != '\'';
+ }
+
+ private static Optional<String> getTextIfPresent(ParserRuleContext context) {
+ return Optional.ofNullable(context).map(ParseTree::getText);
+ }
+
+ private Optional<Identifier> getIdentifierIfPresent(ParserRuleContext context) {
+ return Optional.ofNullable(context).map(c -> (Identifier) visit(c));
+ }
+
+ private static ColumnDefinition.ColumnCategory getColumnCategory(Token category) {
+ if (category == null) {
+ return ColumnDefinition.ColumnCategory.MEASUREMENT;
+ }
+ switch (category.getType()) {
+ case RelationalSqlLexer.ID:
+ return ColumnDefinition.ColumnCategory.ID;
+ case RelationalSqlLexer.ATTRIBUTE:
+ return ColumnDefinition.ColumnCategory.ATTRIBUTE;
+ case RelationalSqlLexer.TIME:
+ return ColumnDefinition.ColumnCategory.TIME;
+ case RelationalSqlLexer.MEASUREMENT:
+ return ColumnDefinition.ColumnCategory.MEASUREMENT;
+ default:
+ throw new UnsupportedOperationException(
+ "Unsupported ColumnCategory: " + category.getText());
+ }
+ }
+
+ private static ArithmeticBinaryExpression.Operator getArithmeticBinaryOperator(Token operator) {
+ switch (operator.getType()) {
+ case RelationalSqlLexer.PLUS:
+ return ArithmeticBinaryExpression.Operator.ADD;
+ case RelationalSqlLexer.MINUS:
+ return ArithmeticBinaryExpression.Operator.SUBTRACT;
+ case RelationalSqlLexer.ASTERISK:
+ return ArithmeticBinaryExpression.Operator.MULTIPLY;
+ case RelationalSqlLexer.SLASH:
+ return ArithmeticBinaryExpression.Operator.DIVIDE;
+ case RelationalSqlLexer.PERCENT:
+ return ArithmeticBinaryExpression.Operator.MODULUS;
+ default:
+ throw new UnsupportedOperationException("Unsupported operator: " + operator.getText());
+ }
+ }
+
+ private static ComparisonExpression.Operator getComparisonOperator(Token symbol) {
+ switch (symbol.getType()) {
+ case RelationalSqlLexer.EQ:
+ return ComparisonExpression.Operator.EQUAL;
+ case RelationalSqlLexer.NEQ:
+ return ComparisonExpression.Operator.NOT_EQUAL;
+ case RelationalSqlLexer.LT:
+ return ComparisonExpression.Operator.LESS_THAN;
+ case RelationalSqlLexer.LTE:
+ return ComparisonExpression.Operator.LESS_THAN_OR_EQUAL;
+ case RelationalSqlLexer.GT:
+ return ComparisonExpression.Operator.GREATER_THAN;
+ case RelationalSqlLexer.GTE:
+ return ComparisonExpression.Operator.GREATER_THAN_OR_EQUAL;
+ default:
+ throw new IllegalArgumentException("Unsupported operator: " + symbol.getText());
+ }
+ }
+
+ private static CurrentTime.Function getDateTimeFunctionType(Token token) {
+ switch (token.getType()) {
+ case RelationalSqlLexer.CURRENT_DATE:
+ return CurrentTime.Function.DATE;
+ case RelationalSqlLexer.CURRENT_TIME:
+ return CurrentTime.Function.TIME;
+ case RelationalSqlLexer.CURRENT_TIMESTAMP:
+ case RelationalSqlLexer.NOW:
+ return CurrentTime.Function.TIMESTAMP;
+ case RelationalSqlLexer.LOCALTIME:
+ return CurrentTime.Function.LOCALTIME;
+ case RelationalSqlLexer.LOCALTIMESTAMP:
+ return CurrentTime.Function.LOCALTIMESTAMP;
+ default:
+ throw new IllegalArgumentException("Unsupported special function: " + token.getText());
+ }
+ }
+
+ private static SortItem.NullOrdering getNullOrderingType(Token token) {
+ switch (token.getType()) {
+ case RelationalSqlLexer.FIRST:
+ return SortItem.NullOrdering.FIRST;
+ case RelationalSqlLexer.LAST:
+ return SortItem.NullOrdering.LAST;
+ default:
+ throw new IllegalArgumentException("Unsupported ordering: " + token.getText());
+ }
+ }
+
+ private static SortItem.Ordering getOrderingType(Token token) {
+ switch (token.getType()) {
+ case RelationalSqlLexer.ASC:
+ return SortItem.Ordering.ASCENDING;
+ case RelationalSqlLexer.DESC:
+ return SortItem.Ordering.DESCENDING;
+ default:
+ throw new IllegalArgumentException("Unsupported ordering: " + token.getText());
+ }
+ }
+
+ private static QuantifiedComparisonExpression.Quantifier getComparisonQuantifier(Token symbol) {
+ switch (symbol.getType()) {
+ case RelationalSqlLexer.ALL:
+ return QuantifiedComparisonExpression.Quantifier.ALL;
+ case RelationalSqlLexer.ANY:
+ return QuantifiedComparisonExpression.Quantifier.ANY;
+ case RelationalSqlLexer.SOME:
+ return QuantifiedComparisonExpression.Quantifier.SOME;
+ default:
+ throw new IllegalArgumentException("Unsupported quantifier: " + symbol.getText());
+ }
+ }
+
+ private List<Identifier> getIdentifiers(List<RelationalSqlParser.IdentifierContext> identifiers) {
+ return identifiers.stream().map(context -> (Identifier) visit(context)).collect(toList());
+ }
+
+ private static void check(boolean condition, String message, ParserRuleContext context) {
+ if (!condition) {
+ throw parseError(message, context);
+ }
+ }
+
+ private NodeLocation getLocation(TerminalNode terminalNode) {
+ requireNonNull(terminalNode, "terminalNode is null");
+ return getLocation(terminalNode.getSymbol());
+ }
+
+ private NodeLocation getLocation(ParserRuleContext parserRuleContext) {
+ requireNonNull(parserRuleContext, "parserRuleContext is null");
+ return getLocation(parserRuleContext.getStart());
+ }
+
+ private NodeLocation getLocation(Token token) {
+ requireNonNull(token, "token is null");
+ return baseLocation != null
+ ? new NodeLocation(
+ token.getLine() + baseLocation.getLineNumber() - 1,
+ token.getCharPositionInLine()
+ + 1
+ + (token.getLine() == 1 ? baseLocation.getColumnNumber() : 0))
+ : new NodeLocation(token.getLine(), token.getCharPositionInLine() + 1);
+ }
+
+ private static ParsingException parseError(String message, ParserRuleContext context) {
+ return new ParsingException(
+ message,
+ null,
+ context.getStart().getLine(),
+ context.getStart().getCharPositionInLine() + 1);
+ }
+
+ private static void validateArgumentAlias(Identifier alias, ParserRuleContext context) {
+ check(
+ alias.isDelimited() || !alias.getValue().equalsIgnoreCase("COPARTITION"),
+ "The word \"COPARTITION\" is ambiguous in this context. "
+ + "To alias an argument, precede the alias with \"AS\". "
+ + "To specify co-partitioning, change the argument order so that the last argument cannot be aliased.",
+ context);
+ }
+ }
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertTableStatement.java
index 4fe5fac42ab,00000000000..c6082401b14
mode 100644,000000..100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertTableStatement.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertTableStatement.java
@@@ -1,252 -1,0 +1,253 @@@
+/*
+ * 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.db.queryengine.plan.statement.crud;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.schema.table.TsTable;
+import org.apache.iotdb.commons.schema.table.column.MeasurementColumnSchema;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
+import org.apache.iotdb.db.exception.sql.SemanticException;
+import org.apache.iotdb.db.protocol.session.IClientSession;
+import org.apache.iotdb.db.queryengine.plan.relational.analyzer.schema.ITableDeviceSchemaValidation;
+import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnSchema;
+import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableSchema;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Expression;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Identifier;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Insert;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.LongLiteral;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.NullLiteral;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Row;
++import org.apache.iotdb.db.queryengine.plan.relational.sql.tree.Values;
+import org.apache.iotdb.db.queryengine.plan.statement.Statement;
+import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor;
- import org.apache.iotdb.db.relational.sql.tree.Expression;
- import org.apache.iotdb.db.relational.sql.tree.Identifier;
- import org.apache.iotdb.db.relational.sql.tree.Insert;
- import org.apache.iotdb.db.relational.sql.tree.LongLiteral;
- import org.apache.iotdb.db.relational.sql.tree.NullLiteral;
- import org.apache.iotdb.db.relational.sql.tree.Row;
- import org.apache.iotdb.db.relational.sql.tree.Values;
+import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
+import org.apache.iotdb.db.utils.TimestampPrecisionUtils;
+
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.type.UnknownType;
+import org.apache.tsfile.write.schema.MeasurementSchema;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static org.apache.iotdb.commons.conf.IoTDBConstant.PATH_ROOT;
+
+public class InsertTableStatement extends Statement implements ITableDeviceSchemaValidation {
+
+ private final Insert insert;
+
+ private final String database;
+
+ private List<String[]> deviceIdList;
+
+ private List<String> attributeNameList;
+
+ private List<List<String>> attributeValueList;
+
+ private InsertRowStatement insertRowStatement;
+
+ private TableSchema tableSchema;
+
+ public InsertTableStatement(IClientSession clientSession, Insert insert) {
+ this.insert = insert;
+ this.database = parseDatabase(clientSession);
+ this.tableSchema = parseTable();
+ }
+
+ private String parseDatabase(IClientSession clientSession) {
+ String database = clientSession.getDatabaseName();
+ if (database == null) {
+ database = insert.getTable().getName().getPrefix().get().getSuffix();
+ }
+ return database;
+ }
+
+ private TableSchema parseTable() {
+ String tableName = insert.getTable().getName().getSuffix().toString();
+ List<ColumnSchema> columnSchemaList = new ArrayList<>();
+ boolean hasColumn = insert.getColumns().isPresent();
+ if (!hasColumn) {
+ return new TableSchema(tableName, null);
+ }
+ int size = insert.getColumns().get().size();
+ List<Identifier> columnNameList = insert.getColumns().get();
+ for (int i = 0; i < size; i++) {
+ String columnName = columnNameList.get(i).getValue();
+ if (columnName.equalsIgnoreCase("time")) {
+ continue;
+ }
+ columnSchemaList.add(new ColumnSchema(columnName, UnknownType.UNKNOWN, false, null));
+ }
+ return new TableSchema(tableName, columnSchemaList);
+ }
+
+ private InsertRowStatement parseInsert() {
+ InsertRowStatement insertStatement = new InsertRowStatement();
+ String tableName = tableSchema.getTableName();
+ TsTable table = DataNodeTableCache.getInstance().getTable(database, tableName);
+ List<Expression> values =
+ ((Row) (((Values) (insert.getQuery().getQueryBody())).getRows().get(0))).getItems();
+ Map<String, String> idColumnMap = new HashMap<>();
+ Map<String, String> attrColumnMap = new HashMap<>();
+ Map<String, Object> measurementColumnMap = new HashMap<>();
+ long time = 0L;
+ boolean hasColumn = insert.getColumns().isPresent();
+ int size = hasColumn ? insert.getColumns().get().size() : table.getColumnNum();
+ List<Identifier> columnNameList = hasColumn ? insert.getColumns().get() : null;
+ for (int i = 0; i < size; i++) {
+ String columnName =
+ hasColumn
+ ? columnNameList.get(i).getValue()
+ : table.getColumnList().get(i).getColumnName();
+ if (columnName.equalsIgnoreCase("time")) {
+ columnName = "Time";
+ }
+ TsTableColumnSchema columnSchema = table.getColumnSchema(columnName);
+ if (columnSchema == null) {
+ throw new SemanticException(String.format("Unknown Column %s", columnName));
+ }
+ TsTableColumnCategory category = table.getColumnSchema(columnName).getColumnCategory();
+ if (values.get(i) instanceof NullLiteral) {
+ continue;
+ }
+ if (category.equals(TsTableColumnCategory.ID)) {
+ idColumnMap.put(columnName, ((Identifier) values.get(i)).getValue());
+ } else if (category.equals(TsTableColumnCategory.ATTRIBUTE)) {
+ attrColumnMap.put(columnName, ((Identifier) values.get(i)).getValue());
+ } else if (category.equals(TsTableColumnCategory.MEASUREMENT)) {
+ measurementColumnMap.put(columnName, ((LongLiteral) values.get(i)).getValue());
+ } else {
+ time = Long.parseLong(((LongLiteral) values.get(i)).getValue());
+ }
+ }
+ String[] deviceIds = new String[table.getIdNums() + 3];
+ deviceIds[0] = PATH_ROOT;
+ deviceIds[1] = database;
+ deviceIds[2] = tableName;
+ String[] measurements = new String[measurementColumnMap.size()];
+ Object[] valueList = new Object[measurements.length];
+ MeasurementSchema[] schemas = new MeasurementSchema[measurements.length];
+ TSDataType[] dataTypes = new TSDataType[measurements.length];
+ int idIndex = 0;
+ int measurementIndex = 0;
+ for (int i = 0; i < table.getColumnNum(); i++) {
+ TsTableColumnCategory category = table.getColumnList().get(i).getColumnCategory();
+ if (category.equals(TsTableColumnCategory.ID)) {
+ String id = idColumnMap.get(table.getColumnList().get(i).getColumnName());
+ deviceIds[3 + idIndex] = id;
+ idIndex++;
+ } else if (category.equals(TsTableColumnCategory.MEASUREMENT)) {
+ String measurement = table.getColumnList().get(i).getColumnName();
+ if (measurementColumnMap.containsKey(measurement)) {
+ measurements[measurementIndex] = measurement;
+ valueList[measurementIndex] = measurementColumnMap.get(measurement);
+ schemas[measurementIndex] =
- ((MeasurementColumnSchema) table.getColumnList().get(i)).getMeasurementSchema();
++ (MeasurementSchema)
++ ((MeasurementColumnSchema) table.getColumnList().get(i)).getMeasurementSchema();
+ dataTypes[measurementIndex] = schemas[measurementIndex].getType();
+ measurementIndex++;
+ }
+ }
+ }
+
+ this.deviceIdList =
+ Collections.singletonList(Arrays.copyOfRange(deviceIds, 3, deviceIds.length));
+ this.attributeNameList = new ArrayList<>(attrColumnMap.keySet());
+ this.attributeValueList =
+ Collections.singletonList(
+ attributeNameList.stream().map(attrColumnMap::get).collect(Collectors.toList()));
+
+ insertStatement.setDevicePath(new PartialPath(deviceIds));
+ TimestampPrecisionUtils.checkTimestampPrecision(time);
+ insertStatement.setTime(time);
+ insertStatement.setMeasurements(measurements);
+ insertStatement.setDataTypes(new TSDataType[insertStatement.getMeasurements().length]);
+ insertStatement.setValues(valueList);
+ insertStatement.setNeedInferType(true);
+ insertStatement.setAligned(true);
+ insertStatement.setMeasurementSchemas(schemas);
+ insertStatement.setDataTypes(dataTypes);
+ try {
+ for (int i = 0; i < measurements.length; i++) {
+ insertStatement.selfCheckDataTypes(i);
+ }
- insertStatement.updateAfterSchemaValidation();
++ insertStatement.updateAfterSchemaValidation(null);
+ } catch (Exception e) {
+ throw new SemanticException(e);
+ }
+ return insertStatement;
+ }
+
+ public TableSchema getTableSchema() {
+ return tableSchema;
+ }
+
+ public void setTableSchema(TableSchema tableSchema) {
+ this.tableSchema = tableSchema;
+ }
+
+ public InsertRowStatement getInsertRowStatement() {
+ if (insertRowStatement == null) {
+ insertRowStatement = parseInsert();
+ }
+ return insertRowStatement;
+ }
+
+ @Override
+ public List<PartialPath> getPaths() {
+ return insertRowStatement.getPaths();
+ }
+
+ @Override
+ public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
+ return visitor.visitInsertTable(this, context);
+ }
+
+ @Override
+ public String getDatabase() {
+ return database;
+ }
+
+ @Override
+ public String getTableName() {
+ return tableSchema.getTableName();
+ }
+
+ @Override
+ public List<String[]> getDeviceIdList() {
+ return deviceIdList;
+ }
+
+ @Override
+ public List<String> getAttributeColumnNameList() {
+ return attributeNameList;
+ }
+
+ @Override
+ public List<List<String>> getAttributeValue() {
+ return attributeValueList;
+ }
+}
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
index ad7eedb237f,d5b7f58cfd4..4b8f550ebfb
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
@@@ -92,9 -85,9 +92,10 @@@ import org.apache.iotdb.db.schemaengine
import org.apache.iotdb.db.schemaengine.schemaregion.write.req.view.IPreDeleteLogicalViewPlan;
import org.apache.iotdb.db.schemaengine.schemaregion.write.req.view.IRollbackPreDeleteLogicalViewPlan;
import org.apache.iotdb.db.schemaengine.template.Template;
+ import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
import org.apache.iotdb.db.utils.SchemaUtils;
+import com.google.common.util.concurrent.ListenableFuture;
import org.apache.tsfile.enums.TSDataType;
import org.apache.tsfile.file.metadata.enums.TSEncoding;
import org.apache.tsfile.utils.Pair;
@@@ -207,8 -209,7 +220,9 @@@ public class SchemaRegionMemoryImpl imp
// do not write log when recover
isRecovering = true;
+ deviceAttributeStore = new DeviceAttributeStore();
- tagManager = new TagManager(schemaRegionDirPath);
+ tagManager = new TagManager(schemaRegionDirPath, regionStatistics);
++
mtree =
new MTreeBelowSGMemoryImpl(
new PartialPath(storageGroupFullPath),
@@@ -473,16 -471,9 +491,17 @@@
isRecovering = true;
+ long deviceAttributeSnapshotStartTime = System.currentTimeMillis();
+ deviceAttributeStore = new DeviceAttributeStore();
+ deviceAttributeStore.loadFromSnapshot(latestSnapshotRootDir, schemaRegionDirPath);
+ logger.info(
+ "Device attribute snapshot loading of schemaRegion {} costs {}ms.",
+ schemaRegionId,
+ System.currentTimeMillis() - deviceAttributeSnapshotStartTime);
+
long tagSnapshotStartTime = System.currentTimeMillis();
- tagManager = TagManager.loadFromSnapshot(latestSnapshotRootDir, schemaRegionDirPath);
+ tagManager =
+ TagManager.loadFromSnapshot(latestSnapshotRootDir, schemaRegionDirPath, regionStatistics);
logger.info(
"Tag snapshot loading of schemaRegion {} costs {}ms.",
schemaRegionId,
diff --cc iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java
index dec75300cb0,e76c3931d6b..21166659ea7
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java
@@@ -1331,49 -1252,5 +1332,50 @@@ public class MTreeBelowSGMemoryImpl
}
return result;
}
++
+ // endregion
+
+ // region table device management
+
+ public void createTableDevice(
+ PartialPath devicePath, IntSupplier attributePointerGetter, IntConsumer attributeUppdater)
+ throws MetadataException {
+ String[] nodeNames = devicePath.getNodes();
+ IMemMNode cur = storageGroupMNode;
+ IMemMNode child;
+ for (int i = levelOfSG + 1; i < nodeNames.length; i++) {
+ child = cur.getChild(nodeNames[i]);
+ if (child == null) {
+ child =
+ store.addChild(cur, nodeNames[i], nodeFactory.createInternalMNode(cur, nodeNames[i]));
+ }
+ cur = child;
+ }
+
+ IDeviceMNode<IMemMNode> entityMNode;
+
+ synchronized (this) {
+ if (cur.isDevice()) {
+ entityMNode = cur.getAsDeviceMNode();
+ if (!(entityMNode.getDeviceInfo() instanceof TableDeviceInfo)) {
+ throw new MetadataException("Table device shall not create under tree model");
+ }
+ TableDeviceInfo<IMemMNode> deviceInfo =
+ (TableDeviceInfo<IMemMNode>) entityMNode.getDeviceInfo();
+ attributeUppdater.accept(deviceInfo.getAttributePointer());
+ } else {
+ entityMNode = store.setToEntity(cur);
+ TableDeviceInfo<IMemMNode> deviceInfo = new TableDeviceInfo<>();
+ deviceInfo.setAttributePointer(attributePointerGetter.getAsInt());
+ entityMNode.getAsInternalMNode().setDeviceInfo(deviceInfo);
+ regionStatistics.addDevice();
+ }
+ }
+ }
+
+ public void deleteTableDevice(String tableName) {
+ storageGroupMNode.deleteChild(tableName);
+ }
+
// endregion
}