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
  }