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

shuwenwei pushed a commit to branch showConfigurationSQL
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit ccb68fef9a7d2bd55ab62c4214ff13f69a21edec
Author: shuwenwei <[email protected]>
AuthorDate: Thu Aug 28 21:57:09 2025 +0800

    add sql
---
 .../confignode/client/CnToCnNodeRequestType.java   |   1 +
 .../client/sync/CnToDnSyncRequestType.java         |   1 +
 .../client/sync/SyncConfigNodeClientPool.java      |   2 +
 .../client/sync/SyncDataNodeClientPool.java        |   3 +
 .../confignode/conf/ConfigNodeDescriptor.java      |   6 +-
 .../iotdb/confignode/manager/ConfigManager.java    |  18 +++
 .../apache/iotdb/confignode/manager/IManager.java  |   4 +
 .../iotdb/confignode/manager/node/NodeManager.java |  34 ++++++
 .../thrift/ConfigNodeRPCServiceProcessor.java      |   6 +
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |   3 +-
 .../iotdb/db/protocol/client/ConfigNodeClient.java |   8 ++
 .../impl/DataNodeInternalRPCServiceImpl.java       |  14 +++
 .../iotdb/db/queryengine/plan/Coordinator.java     |   2 +
 .../execution/config/TableConfigTaskVisitor.java   |  10 ++
 .../execution/config/TreeConfigTaskVisitor.java    |   8 ++
 .../config/executor/ClusterConfigTaskExecutor.java |  36 ++++++
 .../config/executor/IConfigTaskExecutor.java       |   4 +
 .../config/sys/ShowConfigurationTask.java          |  99 +++++++++++++++
 .../plan/relational/sql/ast/AstVisitor.java        |   4 +
 .../relational/sql/ast/ShowConfiguration.java}     |  28 ++---
 .../plan/relational/sql/parser/AstBuilder.java     |  16 +++
 .../plan/statement/StatementVisitor.java           |   6 +
 .../statement/sys/ShowConfigurationStatement.java  |  70 +++++++++++
 .../iotdb/commons/conf/ConfigurationFileUtils.java | 133 ++++++++++++++++-----
 .../schema/column/ColumnHeaderConstant.java        |  18 +++
 .../db/relational/grammar/sql/RelationalSql.g4     |   5 +
 .../thrift-commons/src/main/thrift/common.thrift   |   5 +
 .../src/main/thrift/confignode.thrift              |   3 +
 .../src/main/thrift/datanode.thrift                |   2 +
 29 files changed, 503 insertions(+), 46 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/CnToCnNodeRequestType.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/CnToCnNodeRequestType.java
index e422e45dff0..80941872320 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/CnToCnNodeRequestType.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/CnToCnNodeRequestType.java
@@ -30,6 +30,7 @@ public enum CnToCnNodeRequestType {
   STOP_AND_CLEAR_CONFIG_NODE,
   SET_CONFIGURATION,
   SHOW_CONFIGURATION,
+  SHOW_APPLIED_CONFIGURATIONS,
   SUBMIT_TEST_CONNECTION_TASK,
   TEST_CONNECTION,
 }
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/CnToDnSyncRequestType.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/CnToDnSyncRequestType.java
index 21263612af2..4055398ddb7 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/CnToDnSyncRequestType.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/CnToDnSyncRequestType.java
@@ -25,6 +25,7 @@ public enum CnToDnSyncRequestType {
   STOP_AND_CLEAR_DATA_NODE,
   SET_SYSTEM_STATUS,
   SHOW_CONFIGURATION,
+  SHOW_APPLIED_CONFIGURATIONS,
 
   // Region Maintenance
   CREATE_DATA_REGION,
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/SyncConfigNodeClientPool.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/SyncConfigNodeClientPool.java
index 6282924d0a0..96c9f775526 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/SyncConfigNodeClientPool.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/SyncConfigNodeClientPool.java
@@ -98,6 +98,8 @@ public class SyncConfigNodeClientPool {
             return client.submitTestConnectionTask((TNodeLocations) req);
           case TEST_CONNECTION:
             return client.testConnectionEmptyRPC();
+          case SHOW_APPLIED_CONFIGURATIONS:
+            return client.showAppliedConfigurations((int) req);
           default:
             return RpcUtils.getStatus(
                 TSStatusCode.EXECUTE_STATEMENT_ERROR, "Unknown request type: " 
+ requestType);
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/SyncDataNodeClientPool.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/SyncDataNodeClientPool.java
index 9a063900c0e..902793ffbb4 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/SyncDataNodeClientPool.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/SyncDataNodeClientPool.java
@@ -135,6 +135,9 @@ public class SyncDataNodeClientPool {
         (req, client) -> client.resetPeerList((TResetPeerListReq) req));
     actionMapBuilder.put(
         CnToDnSyncRequestType.SHOW_CONFIGURATION, (req, client) -> 
client.showConfiguration());
+    actionMapBuilder.put(
+        CnToDnSyncRequestType.SHOW_APPLIED_CONFIGURATIONS,
+        (req, client) -> client.showAppliedConfigurations());
     actionMap = actionMapBuilder.build();
   }
 
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeDescriptor.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeDescriptor.java
index f26ec199d8f..64b71199eb7 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeDescriptor.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeDescriptor.java
@@ -147,7 +147,7 @@ public class ConfigNodeDescriptor {
   }
 
   private void loadProperties(TrimProperties properties) throws 
BadNodeUrlException, IOException {
-    conf.setClusterName(properties.getProperty(IoTDBConstant.CLUSTER_NAME, 
conf.getClusterName()));
+    loadHotModifiedProps(properties);
 
     conf.setInternalAddress(
         properties.getProperty(IoTDBConstant.CN_INTERNAL_ADDRESS, 
conf.getInternalAddress()));
@@ -765,8 +765,8 @@ public class ConfigNodeDescriptor {
   }
 
   public void loadHotModifiedProps(TrimProperties properties) {
-    Optional.ofNullable(properties.getProperty(IoTDBConstant.CLUSTER_NAME))
-        .ifPresent(conf::setClusterName);
+    ConfigurationFileUtils.updateLastAppliedProperties(properties);
+    conf.setClusterName(properties.getProperty(IoTDBConstant.CLUSTER_NAME, 
conf.getClusterName()));
   }
 
   public static ConfigNodeDescriptor getInstance() {
diff --git 
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
index 3071830be60..d0f77f613d2 100644
--- 
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
@@ -37,6 +37,7 @@ import 
org.apache.iotdb.common.rpc.thrift.TSeriesPartitionSlot;
 import org.apache.iotdb.common.rpc.thrift.TSetConfigurationReq;
 import org.apache.iotdb.common.rpc.thrift.TSetSpaceQuotaReq;
 import org.apache.iotdb.common.rpc.thrift.TSetThrottleQuotaReq;
+import org.apache.iotdb.common.rpc.thrift.TShowAppliedConfigurationsResp;
 import org.apache.iotdb.common.rpc.thrift.TShowConfigurationResp;
 import org.apache.iotdb.common.rpc.thrift.TTimePartitionSlot;
 import org.apache.iotdb.commons.auth.AuthException;
@@ -1789,6 +1790,23 @@ public class ConfigManager implements IManager {
         : new TShowConfigurationResp(status, "");
   }
 
+  public TShowAppliedConfigurationsResp showAppliedConfigurations(int nodeId) {
+    if (ConfigNodeDescriptor.getInstance().getConf().getConfigNodeId() == 
nodeId) {
+      TShowAppliedConfigurationsResp resp = new 
TShowAppliedConfigurationsResp();
+      resp.setStatus(RpcUtils.SUCCESS_STATUS);
+      try {
+        resp.setData(ConfigurationFileUtils.getLastAppliedProperties());
+      } catch (Exception e) {
+        
resp.setStatus(RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR, 
e.getMessage()));
+      }
+      return resp;
+    }
+    TSStatus status = confirmLeader();
+    return status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()
+        ? nodeManager.showAppliedConfigurations(nodeId)
+        : new TShowAppliedConfigurationsResp(status, null);
+  }
+
   @Override
   public TSStatus setSystemStatus(String systemStatus) {
     TSStatus status = confirmLeader();
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
index bc080198cb6..7402d29673d 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
@@ -27,6 +27,7 @@ import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.common.rpc.thrift.TSeriesPartitionSlot;
 import org.apache.iotdb.common.rpc.thrift.TSetConfigurationReq;
 import org.apache.iotdb.common.rpc.thrift.TSetSpaceQuotaReq;
+import org.apache.iotdb.common.rpc.thrift.TShowAppliedConfigurationsResp;
 import org.apache.iotdb.common.rpc.thrift.TShowConfigurationResp;
 import org.apache.iotdb.commons.auth.entity.PrivilegeUnion;
 import org.apache.iotdb.commons.cluster.NodeStatus;
@@ -598,6 +599,9 @@ public interface IManager {
   /** Show content of configuration file on specified node */
   TShowConfigurationResp showConfiguration(int nodeId);
 
+  /** Show configuration on specified node by TsBlock */
+  TShowAppliedConfigurationsResp showAppliedConfigurations(int nodeId);
+
   /** Set system status on all DataNodes. */
   TSStatus setSystemStatus(String status);
 
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
index 15f05f2ba06..716722817ac 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
@@ -27,6 +27,7 @@ import org.apache.iotdb.common.rpc.thrift.TFlushReq;
 import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.common.rpc.thrift.TSetConfigurationReq;
+import org.apache.iotdb.common.rpc.thrift.TShowAppliedConfigurationsResp;
 import org.apache.iotdb.common.rpc.thrift.TShowConfigurationResp;
 import org.apache.iotdb.commons.cluster.NodeStatus;
 import org.apache.iotdb.commons.cluster.NodeType;
@@ -1124,6 +1125,39 @@ public class NodeManager {
     return resp;
   }
 
+  public TShowAppliedConfigurationsResp showAppliedConfigurations(int nodeId) {
+    TShowAppliedConfigurationsResp resp = new TShowAppliedConfigurationsResp();
+
+    // data node
+    Map<Integer, TDataNodeLocation> dataNodeLocationMap =
+        configManager.getNodeManager().getRegisteredDataNodeLocations();
+    if (dataNodeLocationMap.containsKey(nodeId)) {
+      TDataNodeLocation dataNodeLocation = dataNodeLocationMap.get(nodeId);
+      return (TShowAppliedConfigurationsResp)
+          SyncDataNodeClientPool.getInstance()
+              .sendSyncRequestToDataNodeWithRetry(
+                  dataNodeLocation.getInternalEndPoint(),
+                  null,
+                  CnToDnSyncRequestType.SHOW_APPLIED_CONFIGURATIONS);
+    }
+
+    // other config node
+    for (TConfigNodeLocation registeredConfigNode : 
getRegisteredConfigNodes()) {
+      if (registeredConfigNode.getConfigNodeId() != nodeId) {
+        continue;
+      }
+      resp =
+          (TShowAppliedConfigurationsResp)
+              SyncConfigNodeClientPool.getInstance()
+                  .sendSyncRequestToConfigNodeWithRetry(
+                      registeredConfigNode.getInternalEndPoint(),
+                      nodeId,
+                      CnToCnNodeRequestType.SHOW_APPLIED_CONFIGURATIONS);
+      return resp;
+    }
+    return resp;
+  }
+
   public List<TSStatus> setSystemStatus(String status) {
     Map<Integer, TDataNodeLocation> dataNodeLocationMap =
         configManager.getNodeManager().getRegisteredDataNodeLocations();
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
index 958324c0b51..1267fb1dd30 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
@@ -30,6 +30,7 @@ import 
org.apache.iotdb.common.rpc.thrift.TSetConfigurationReq;
 import org.apache.iotdb.common.rpc.thrift.TSetSpaceQuotaReq;
 import org.apache.iotdb.common.rpc.thrift.TSetTTLReq;
 import org.apache.iotdb.common.rpc.thrift.TSetThrottleQuotaReq;
+import org.apache.iotdb.common.rpc.thrift.TShowAppliedConfigurationsResp;
 import org.apache.iotdb.common.rpc.thrift.TShowConfigurationResp;
 import org.apache.iotdb.common.rpc.thrift.TShowTTLReq;
 import org.apache.iotdb.common.rpc.thrift.TTestConnectionResp;
@@ -989,6 +990,11 @@ public class ConfigNodeRPCServiceProcessor implements 
IConfigNodeRPCService.Ifac
     return configManager.showConfiguration(nodeId);
   }
 
+  @Override
+  public TShowAppliedConfigurationsResp showAppliedConfigurations(int nodeId) 
throws TException {
+    return configManager.showAppliedConfigurations(nodeId);
+  }
+
   @Override
   public TSStatus setSystemStatus(String status) {
     return configManager.setSystemStatus(status);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
index 738c8f58ec6..2b24ee972af 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
@@ -182,7 +182,7 @@ public class IoTDBDescriptor {
    * @return url object if location exit, otherwise null.
    */
   public static URL getPropsUrl(String configFileName) {
-    String urlString = commonDescriptor.getConfDir();
+    String urlString = 
"/Users/shuww/IdeaProjects/iotdb2/iotdb-core/datanode/src/test/resources";
     if (urlString == null) {
       // If urlString wasn't provided, try to find a default config in the 
root of the classpath.
       URL uri = IoTDBConfig.class.getResource("/" + configFileName);
@@ -1961,6 +1961,7 @@ public class IoTDBDescriptor {
 
   public synchronized void loadHotModifiedProps(TrimProperties properties)
       throws QueryProcessException {
+    ConfigurationFileUtils.updateLastAppliedProperties(properties);
     try {
       // update data dirs
       String dataDirs = properties.getProperty("dn_data_dirs", null);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java
index 6a27ad10f93..d977b829d4f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java
@@ -31,6 +31,7 @@ import 
org.apache.iotdb.common.rpc.thrift.TSetConfigurationReq;
 import org.apache.iotdb.common.rpc.thrift.TSetSpaceQuotaReq;
 import org.apache.iotdb.common.rpc.thrift.TSetTTLReq;
 import org.apache.iotdb.common.rpc.thrift.TSetThrottleQuotaReq;
+import org.apache.iotdb.common.rpc.thrift.TShowAppliedConfigurationsResp;
 import org.apache.iotdb.common.rpc.thrift.TShowConfigurationResp;
 import org.apache.iotdb.common.rpc.thrift.TShowTTLReq;
 import org.apache.iotdb.common.rpc.thrift.TTestConnectionResp;
@@ -818,6 +819,13 @@ public class ConfigNodeClient implements 
IConfigNodeRPCService.Iface, ThriftClie
         () -> client.showConfiguration(nodeId), resp -> 
!updateConfigNodeLeader(resp.getStatus()));
   }
 
+  @Override
+  public TShowAppliedConfigurationsResp showAppliedConfigurations(int nodeId) 
throws TException {
+    return executeRemoteCallWithRetry(
+        () -> client.showAppliedConfigurations(nodeId),
+        resp -> !updateConfigNodeLeader(resp.getStatus()));
+  }
+
   @Override
   public TSStatus setSystemStatus(String systemStatus) throws TException {
     return executeRemoteCallWithRetry(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
index a45bc9b18db..0d08cce15e2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
@@ -35,6 +35,7 @@ import org.apache.iotdb.common.rpc.thrift.TSetSpaceQuotaReq;
 import org.apache.iotdb.common.rpc.thrift.TSetTTLReq;
 import org.apache.iotdb.common.rpc.thrift.TSetThrottleQuotaReq;
 import org.apache.iotdb.common.rpc.thrift.TSettleReq;
+import org.apache.iotdb.common.rpc.thrift.TShowAppliedConfigurationsResp;
 import org.apache.iotdb.common.rpc.thrift.TShowConfigurationResp;
 import org.apache.iotdb.common.rpc.thrift.TTestConnectionResp;
 import org.apache.iotdb.common.rpc.thrift.TTestConnectionResult;
@@ -2403,6 +2404,19 @@ public class DataNodeInternalRPCServiceImpl implements 
IDataNodeRPCService.Iface
     return resp;
   }
 
+  @Override
+  public TShowAppliedConfigurationsResp showAppliedConfigurations() throws 
TException {
+    TShowAppliedConfigurationsResp resp = new TShowAppliedConfigurationsResp();
+    resp.setStatus(RpcUtils.SUCCESS_STATUS);
+    try {
+      resp.setData(ConfigurationFileUtils.getLastAppliedProperties());
+
+    } catch (Exception e) {
+      resp.setStatus(RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR, 
e.getMessage()));
+    }
+    return resp;
+  }
+
   @Override
   public TSStatus setSystemStatus(String status) throws TException {
     try {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
index ebb843735e9..e9f952f2eed 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
@@ -97,6 +97,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowAINodes;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCluster;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowClusterId;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfigNodes;
+import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfiguration;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentDatabase;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentSqlDialect;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentTimestamp;
@@ -436,6 +437,7 @@ public class Coordinator {
         || statement instanceof Flush
         || statement instanceof ClearCache
         || statement instanceof SetConfiguration
+        || statement instanceof ShowConfiguration
         || statement instanceof LoadConfiguration
         || statement instanceof SetSystemStatus
         || statement instanceof StartRepairData
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
index b40096a562d..72e07e6330d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
@@ -101,6 +101,7 @@ import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.KillQueryTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.LoadConfigurationTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.SetConfigurationTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.SetSystemStatusTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.ShowConfigurationTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.StartRepairDataTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.StopRepairDataTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.pipe.AlterPipeTask;
@@ -177,6 +178,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowAINodes;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCluster;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowClusterId;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfigNodes;
+import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfiguration;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentDatabase;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentSqlDialect;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentTimestamp;
@@ -212,6 +214,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.sys.FlushStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.LoadConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetSystemStatusStatement;
+import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.StartRepairDataStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.StopRepairDataStatement;
 import org.apache.iotdb.db.utils.DataNodeAuthUtils;
@@ -914,6 +917,13 @@ public class TableConfigTaskVisitor extends 
AstVisitor<IConfigTask, MPPQueryCont
     return new SetConfigurationTask(((SetConfigurationStatement) 
node.getInnerTreeStatement()));
   }
 
+  @Override
+  protected IConfigTask visitShowConfigurations(ShowConfiguration node, 
MPPQueryContext context) {
+    context.setQueryType(QueryType.READ);
+    accessControl.checkUserIsAdmin(context.getSession().getUserName());
+    return new ShowConfigurationTask((ShowConfigurationStatement) 
node.getInnerTreeStatement());
+  }
+
   @Override
   protected IConfigTask visitStartRepairData(StartRepairData node, 
MPPQueryContext context) {
     context.setQueryType(QueryType.WRITE);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TreeConfigTaskVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TreeConfigTaskVisitor.java
index 5be65a433d8..b2ea4a2330f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TreeConfigTaskVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TreeConfigTaskVisitor.java
@@ -93,6 +93,7 @@ import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.LoadConfigurati
 import org.apache.iotdb.db.queryengine.plan.execution.config.sys.MergeTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.SetConfigurationTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.SetSystemStatusTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.ShowConfigurationTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.StartRepairDataTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.StopRepairDataTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.TestConnectionTask;
@@ -189,6 +190,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.sys.MergeStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetSqlDialectStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetSystemStatusStatement;
+import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowCurrentSqlDialectStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowCurrentUserStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.StartRepairDataStatement;
@@ -335,6 +337,12 @@ public class TreeConfigTaskVisitor extends 
StatementVisitor<IConfigTask, MPPQuer
     return new SetConfigurationTask(setConfigurationStatement);
   }
 
+  @Override
+  public IConfigTask visitShowConfiguration(
+      ShowConfigurationStatement showConfigurationStatement, MPPQueryContext 
context) {
+    return new ShowConfigurationTask(showConfigurationStatement);
+  }
+
   @Override
   public IConfigTask visitStartRepairData(
       StartRepairDataStatement startRepairDataStatement, MPPQueryContext 
context) {
diff --git 
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
index 9e57532ad26..3344453db51 100644
--- 
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
@@ -30,6 +30,7 @@ import 
org.apache.iotdb.common.rpc.thrift.TSetConfigurationReq;
 import org.apache.iotdb.common.rpc.thrift.TSetSpaceQuotaReq;
 import org.apache.iotdb.common.rpc.thrift.TSetTTLReq;
 import org.apache.iotdb.common.rpc.thrift.TSetThrottleQuotaReq;
+import org.apache.iotdb.common.rpc.thrift.TShowConfigurationResp;
 import org.apache.iotdb.common.rpc.thrift.TShowTTLReq;
 import org.apache.iotdb.common.rpc.thrift.TSpaceQuota;
 import org.apache.iotdb.common.rpc.thrift.TTestConnectionResp;
@@ -220,6 +221,7 @@ import 
org.apache.iotdb.db.queryengine.plan.execution.config.session.ShowCurrent
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.session.ShowCurrentTimestampTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.session.ShowCurrentUserTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.session.ShowVersionTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.ShowConfigurationTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.TestConnectionTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.pipe.ShowPipeTask;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.sys.quota.ShowSpaceQuotaTask;
@@ -280,6 +282,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.view.CreateLogica
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.view.DeleteLogicalViewStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.view.RenameLogicalViewStatement;
 import org.apache.iotdb.db.queryengine.plan.statement.sys.KillQueryStatement;
+import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.quota.SetSpaceQuotaStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.quota.SetThrottleQuotaStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.quota.ShowSpaceQuotaStatement;
@@ -1269,6 +1272,39 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
     return future;
   }
 
+  @Override
+  public SettableFuture<ConfigTaskResult> showAppliedConfigurations(
+      ShowConfigurationStatement showConfigurationStatement) {
+    SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+    int nodeId = showConfigurationStatement.getNodeId();
+    try {
+      boolean onLocal =
+          nodeId == -1 || 
IoTDBDescriptor.getInstance().getConfig().getDataNodeId() == nodeId;
+      Map<String, String> lastAppliedProperties;
+      if (onLocal) {
+        lastAppliedProperties = 
ConfigurationFileUtils.getLastAppliedProperties();
+      } else {
+        try (ConfigNodeClient client =
+            
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
+          TShowConfigurationResp resp = client.showConfiguration(nodeId);
+          if (resp.getStatus().getCode() != 
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+            future.setException(new IoTDBException(resp.getStatus()));
+            return future;
+          }
+          lastAppliedProperties = 
client.showAppliedConfigurations(nodeId).getData();
+        }
+      }
+      ShowConfigurationTask.buildTsBlock(
+          lastAppliedProperties,
+          showConfigurationStatement.isShowAllConfigurations(),
+          showConfigurationStatement.withDescription(),
+          future);
+    } catch (Exception e) {
+      future.setException(e);
+    }
+    return future;
+  }
+
   @Override
   public SettableFuture<ConfigTaskResult> startRepairData(boolean onCluster) {
     SettableFuture<ConfigTaskResult> future = SettableFuture.create();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
index 8ad06a41c51..781d704af51 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
@@ -90,6 +90,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.view.AlterLogical
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.view.DeleteLogicalViewStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.view.RenameLogicalViewStatement;
 import org.apache.iotdb.db.queryengine.plan.statement.sys.KillQueryStatement;
+import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.quota.SetSpaceQuotaStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.quota.SetThrottleQuotaStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.quota.ShowSpaceQuotaStatement;
@@ -157,6 +158,9 @@ public interface IConfigTaskExecutor {
 
   SettableFuture<ConfigTaskResult> setConfiguration(TSetConfigurationReq 
tSetConfigurationReq);
 
+  SettableFuture<ConfigTaskResult> showAppliedConfigurations(
+      ShowConfigurationStatement showConfigurationStatement);
+
   SettableFuture<ConfigTaskResult> loadConfiguration(boolean onCluster);
 
   SettableFuture<ConfigTaskResult> setSystemStatus(boolean onCluster, 
NodeStatus status);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/sys/ShowConfigurationTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/sys/ShowConfigurationTask.java
new file mode 100644
index 00000000000..f37952cf345
--- /dev/null
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/sys/ShowConfigurationTask.java
@@ -0,0 +1,99 @@
+/*
+ * 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.execution.config.sys;
+
+import org.apache.iotdb.commons.conf.ConfigurationFileUtils;
+import org.apache.iotdb.commons.schema.column.ColumnHeader;
+import org.apache.iotdb.commons.schema.column.ColumnHeaderConstant;
+import org.apache.iotdb.db.queryengine.common.header.DatasetHeader;
+import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
+import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask;
+import 
org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
+import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowConfigurationStatement;
+import org.apache.iotdb.rpc.TSStatusCode;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+import org.apache.tsfile.common.conf.TSFileConfig;
+import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.utils.Binary;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class ShowConfigurationTask implements IConfigTask {
+  private final ShowConfigurationStatement showConfigurationStatement;
+
+  public ShowConfigurationTask(ShowConfigurationStatement 
showConfigurationStatement) {
+    this.showConfigurationStatement = showConfigurationStatement;
+  }
+
+  @Override
+  public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor 
configTaskExecutor)
+      throws InterruptedException {
+    return 
configTaskExecutor.showAppliedConfigurations(showConfigurationStatement);
+  }
+
+  public static void buildTsBlock(
+      Map<String, String> lastAppliedProperties,
+      boolean showAllConfigurations,
+      boolean withDescription,
+      SettableFuture<ConfigTaskResult> future)
+      throws IOException {
+    List<ColumnHeader> columnHeaders =
+        withDescription
+            ? 
ColumnHeaderConstant.SHOW_CONFIGURATIONS_COLUMN_HEADERS_WITH_DESCRIPTION
+            : ColumnHeaderConstant.SHOW_CONFIGURATIONS_COLUMN_HEADERS;
+    TsBlockBuilder builder =
+        new TsBlockBuilder(
+            
columnHeaders.stream().map(ColumnHeader::getColumnType).collect(Collectors.toList()));
+    for (ConfigurationFileUtils.DefaultConfigurationItem item :
+        
ConfigurationFileUtils.getConfigurationItemsFromTemplate(withDescription).values())
 {
+      String name = item.name;
+      String value = lastAppliedProperties.get(name);
+      if (!showAllConfigurations && value == null) {
+        continue;
+      }
+      builder.getTimeColumnBuilder().writeLong(0L);
+      String defaultValue = item.value;
+      String description = item.description;
+      addValueToTsBlockBuilder(builder, 0, name);
+      addValueToTsBlockBuilder(builder, 1, value);
+      addValueToTsBlockBuilder(builder, 2, defaultValue);
+      if (withDescription) {
+        addValueToTsBlockBuilder(builder, 3, description);
+      }
+      builder.declarePosition();
+    }
+    future.set(
+        new ConfigTaskResult(
+            TSStatusCode.SUCCESS_STATUS, builder.build(), new 
DatasetHeader(columnHeaders, true)));
+  }
+
+  private static void addValueToTsBlockBuilder(TsBlockBuilder builder, int 
index, String value) {
+    if (value == null) {
+      builder.getColumnBuilder(index).appendNull();
+    } else {
+      builder.getColumnBuilder(index).writeBinary(new Binary(value, 
TSFileConfig.STRING_CHARSET));
+    }
+  }
+}
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
index 80b5642fd6e..159f7573b72 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
@@ -477,6 +477,10 @@ public abstract class AstVisitor<R, C> {
     return visitStatement(node, context);
   }
 
+  protected R visitShowConfigurations(ShowConfiguration node, C context) {
+    return visitStatement(node, context);
+  }
+
   protected R visitStartRepairData(StartRepairData node, C context) {
     return visitStatement(node, context);
   }
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/CnToCnNodeRequestType.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ShowConfiguration.java
similarity index 60%
copy from 
iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/CnToCnNodeRequestType.java
copy to 
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ShowConfiguration.java
index e422e45dff0..fc9237d5fe9 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/CnToCnNodeRequestType.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ShowConfiguration.java
@@ -17,19 +17,19 @@
  * under the License.
  */
 
-package org.apache.iotdb.confignode.client;
+package org.apache.iotdb.db.queryengine.plan.relational.sql.ast;
 
-public enum CnToCnNodeRequestType {
-  ADD_CONSENSUS_GROUP,
-  NOTIFY_REGISTER_SUCCESS,
-  REGISTER_CONFIG_NODE,
-  RESTART_CONFIG_NODE,
-  REMOVE_CONFIG_NODE,
-  DELETE_CONFIG_NODE_PEER,
-  REPORT_CONFIG_NODE_SHUTDOWN,
-  STOP_AND_CLEAR_CONFIG_NODE,
-  SET_CONFIGURATION,
-  SHOW_CONFIGURATION,
-  SUBMIT_TEST_CONNECTION_TASK,
-  TEST_CONNECTION,
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
+import org.apache.iotdb.db.queryengine.plan.statement.Statement;
+
+public class ShowConfiguration extends WrappedStatement {
+
+  public ShowConfiguration(Statement innerTreeStatement, MPPQueryContext 
context) {
+    super(innerTreeStatement, context);
+  }
+
+  @Override
+  public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
+    return visitor.visitShowConfigurations(this, context);
+  }
 }
diff --git 
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
index 215ee2b4715..d0f3100a85e 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
@@ -177,6 +177,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowAINodes;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCluster;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowClusterId;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfigNodes;
+import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfiguration;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentDatabase;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentSqlDialect;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentTimestamp;
@@ -244,6 +245,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.sys.FlushStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.LoadConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetSystemStatusStatement;
+import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.StartRepairDataStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.StopRepairDataStatement;
 import org.apache.iotdb.db.relational.grammar.sql.RelationalSqlBaseVisitor;
@@ -1647,6 +1649,20 @@ public class AstBuilder extends 
RelationalSqlBaseVisitor<Node> {
     return new SetConfiguration(setConfigurationStatement, null);
   }
 
+  @Override
+  public Node visitShowConfigurationStatement(
+      RelationalSqlParser.ShowConfigurationStatementContext ctx) {
+    ShowConfigurationStatement showConfigurationStatement;
+    boolean withDescription = ctx.DESC() != null;
+    if (ctx.ALL() != null) {
+      showConfigurationStatement = new ShowConfigurationStatement(true, -1, 
withDescription);
+    } else {
+      int nodeId = ctx.nodeId == null ? -1 : 
Integer.parseInt(ctx.nodeId.getText());
+      showConfigurationStatement = new ShowConfigurationStatement(false, 
nodeId, withDescription);
+    }
+    return new ShowConfiguration(showConfigurationStatement, null);
+  }
+
   @Override
   public Node visitStartRepairDataStatement(
       RelationalSqlParser.StartRepairDataStatementContext ctx) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementVisitor.java
index 588c4dd9892..3fb12232a97 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementVisitor.java
@@ -128,6 +128,7 @@ import 
org.apache.iotdb.db.queryengine.plan.statement.sys.MergeStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetSqlDialectStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.SetSystemStatusStatement;
+import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowConfigurationStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowCurrentSqlDialectStatement;
 import 
org.apache.iotdb.db.queryengine.plan.statement.sys.ShowCurrentUserStatement;
 import org.apache.iotdb.db.queryengine.plan.statement.sys.ShowQueriesStatement;
@@ -436,6 +437,11 @@ public abstract class StatementVisitor<R, C> {
     return visitStatement(setConfigurationStatement, context);
   }
 
+  public R visitShowConfiguration(
+      ShowConfigurationStatement showConfigurationStatement, C context) {
+    return visitStatement(showConfigurationStatement, context);
+  }
+
   public R visitStartRepairData(StartRepairDataStatement 
startRepairDataStatement, C context) {
     return visitStatement(startRepairDataStatement, context);
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/sys/ShowConfigurationStatement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/sys/ShowConfigurationStatement.java
new file mode 100644
index 00000000000..7442ca44d7e
--- /dev/null
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/sys/ShowConfigurationStatement.java
@@ -0,0 +1,70 @@
+/*
+ * 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.sys;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.queryengine.plan.analyze.QueryType;
+import org.apache.iotdb.db.queryengine.plan.statement.IConfigStatement;
+import org.apache.iotdb.db.queryengine.plan.statement.Statement;
+import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor;
+
+import java.util.Collections;
+import java.util.List;
+
+public class ShowConfigurationStatement extends Statement implements 
IConfigStatement {
+
+  private final boolean showAllConfigurations;
+  private final int nodeId;
+  private final boolean withDescription;
+
+  public ShowConfigurationStatement(
+      boolean showAllConfigurations, int nodeId, boolean withDescription) {
+    this.showAllConfigurations = showAllConfigurations;
+    this.nodeId = nodeId;
+    this.withDescription = withDescription;
+  }
+
+  public boolean isShowAllConfigurations() {
+    return showAllConfigurations;
+  }
+
+  public int getNodeId() {
+    return nodeId;
+  }
+
+  public boolean withDescription() {
+    return withDescription;
+  }
+
+  @Override
+  public QueryType getQueryType() {
+    return QueryType.READ;
+  }
+
+  @Override
+  public List<? extends PartialPath> getPaths() {
+    return Collections.emptyList();
+  }
+
+  @Override
+  public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
+    return visitor.visitShowConfiguration(this, context);
+  }
+}
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigurationFileUtils.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigurationFileUtils.java
index f5702143dd9..61ea506face 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigurationFileUtils.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigurationFileUtils.java
@@ -40,14 +40,13 @@ import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import java.util.StringJoiner;
 import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 public class ConfigurationFileUtils {
 
@@ -75,7 +74,12 @@ public class ConfigurationFileUtils {
           .add("# specific language governing permissions and limitations")
           .add("# under the License.")
           .toString();
-  private static Map<String, String> configuration2DefaultValue;
+  private static final String EFFECTIVE_MODE = "effectiveMode:";
+  private static final String DATATYPE = "Datatype:";
+  private static final String EFFECTIVE_MODE_HOT_RELOAD = "hot_reload";
+  private static final String EFFECTIVE_MODE_RESTART = "restart";
+  private static final String EFFECTIVE_MODE_FIRST_START = "first_start";
+  private static Map<String, DefaultConfigurationItem> 
configuration2DefaultValue;
 
   // This is a temporary implementations
   private static final Set<String> ignoreConfigKeys =
@@ -107,6 +111,20 @@ public class ConfigurationFileUtils {
               "iotdb_server_encrypt_decrypt_provider_parameter",
               "pipe_lib_dir"));
 
+  private static final Map<String, String> lastAppliedProperties = new 
HashMap<>();
+
+  public static void updateLastAppliedProperties(TrimProperties properties) {
+    for (Map.Entry<Object, Object> entry : properties.entrySet()) {
+      String key = entry.getKey().toString();
+      String value = entry.getValue() == null ? null : 
entry.getValue().toString();
+      lastAppliedProperties.put(key, value);
+    }
+  }
+
+  public static Map<String, String> getLastAppliedProperties() {
+    return lastAppliedProperties;
+  }
+
   public static void checkAndMayUpdate(
       URL systemUrl, URL configNodeUrl, URL dataNodeUrl, URL commonUrl)
       throws IOException, InterruptedException {
@@ -163,30 +181,9 @@ public class ConfigurationFileUtils {
     if (configuration2DefaultValue != null) {
       return;
     }
-    configuration2DefaultValue = new HashMap<>();
-    try (InputStream inputStream =
-            ConfigurationFileUtils.class
-                .getClassLoader()
-                .getResourceAsStream(CommonConfig.SYSTEM_CONFIG_TEMPLATE_NAME);
-        InputStreamReader isr = new InputStreamReader(inputStream);
-        BufferedReader reader = new BufferedReader(isr)) {
-      String line;
-      Pattern pattern = Pattern.compile("^[^#].*?=.*$");
-      while ((line = reader.readLine()) != null) {
-        Matcher matcher = pattern.matcher(line);
-        if (matcher.find()) {
-          String[] parts = line.split("=");
-          if (parts.length == 2) {
-            configuration2DefaultValue.put(parts[0].trim(), parts[1].trim());
-          } else if (parts.length == 1) {
-            configuration2DefaultValue.put(parts[0].trim(), null);
-          } else {
-            logger.error("Failed to parse configuration template: {}", line);
-          }
-        }
-      }
+    try {
+      configuration2DefaultValue = getConfigurationItemsFromTemplate(false);
     } catch (IOException e) {
-      configuration2DefaultValue = null;
       logger.warn("Failed to read configuration template", e);
       throw e;
     }
@@ -197,10 +194,12 @@ public class ConfigurationFileUtils {
   public static String getConfigurationDefaultValue(String parameterName) 
throws IOException {
     parameterName = parameterName.trim();
     if (configuration2DefaultValue != null) {
-      return configuration2DefaultValue.get(parameterName);
+      return configuration2DefaultValue.get(parameterName).value;
     } else {
       loadConfigurationDefaultValueFromTemplate();
-      return configuration2DefaultValue.getOrDefault(parameterName, null);
+      DefaultConfigurationItem defaultConfigurationItem =
+          configuration2DefaultValue.get(parameterName);
+      return defaultConfigurationItem == null ? null : 
defaultConfigurationItem.value;
     }
   }
 
@@ -361,4 +360,82 @@ public class ConfigurationFileUtils {
     void loadHotModifiedProperties(TrimProperties properties)
         throws IOException, InterruptedException;
   }
+
+  public static Map<String, DefaultConfigurationItem> 
getConfigurationItemsFromTemplate(
+      boolean withDesc) throws IOException {
+    if (configuration2DefaultValue != null && !withDesc) {
+      return configuration2DefaultValue;
+    }
+    Map<String, DefaultConfigurationItem> items = new LinkedHashMap<>();
+    try (InputStream inputStream =
+            ConfigurationFileUtils.class
+                .getClassLoader()
+                .getResourceAsStream(CommonConfig.SYSTEM_CONFIG_TEMPLATE_NAME);
+        InputStreamReader isr = new InputStreamReader(inputStream);
+        BufferedReader reader = new BufferedReader(isr)) {
+      String effectiveMode = null;
+      String dataType = null;
+      StringBuilder description = new StringBuilder();
+      String line;
+      while ((line = reader.readLine()) != null) {
+        line = line.trim();
+        if (line.isEmpty()) {
+          description = new StringBuilder();
+          dataType = null;
+          effectiveMode = null;
+          continue;
+        }
+        if (line.startsWith("#")) {
+          String comment = line.substring(1).trim();
+          if (description.length() > 0) {
+            if (comment.startsWith(EFFECTIVE_MODE)) {
+              effectiveMode = 
comment.substring(EFFECTIVE_MODE.length()).trim();
+              continue;
+            } else if (comment.startsWith(DATATYPE)) {
+              dataType = comment.substring(DATATYPE.length()).trim();
+              continue;
+            } else {
+              description.append(" ");
+            }
+          }
+          if (withDesc) {
+            description.append(comment);
+          }
+        } else {
+          int equalsIndex = line.indexOf('=');
+          String key = line.substring(0, equalsIndex).trim();
+          String value = line.substring(equalsIndex + 1).trim();
+          items.put(
+              key,
+              new DefaultConfigurationItem(
+                  key,
+                  value,
+                  withDesc ? description.toString().trim() : null,
+                  effectiveMode,
+                  dataType));
+        }
+      }
+    } catch (IOException e) {
+      logger.warn("Failed to read configuration template", e);
+      throw e;
+    }
+    return items;
+  }
+
+  public static class DefaultConfigurationItem {
+    public String name;
+    public String value;
+    public String description;
+    public String effectiveMode;
+    public String dataType;
+
+    public DefaultConfigurationItem(
+        String name, String value, String description, String effectiveMode, 
String dataType) {
+      this.name = name;
+      this.value = value;
+      this.description = description;
+      this.effectiveMode = effectiveMode;
+      this.dataType = dataType;
+    }
+  }
 }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/column/ColumnHeaderConstant.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/column/ColumnHeaderConstant.java
index ff6e9bc42a6..567df04301d 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/column/ColumnHeaderConstant.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/column/ColumnHeaderConstant.java
@@ -315,6 +315,11 @@ public class ColumnHeaderConstant {
 
   public static final String CURRENT_SQL_DIALECT = "CurrentSqlDialect";
 
+  public static final String SHOW_CONFIGURATIONS_NAME = "name";
+  public static final String SHOW_CONFIGURATIONS_VALUE = "value";
+  public static final String SHOW_CONFIGURATIONS_DEFAULT_VALUE = 
"default_value";
+  public static final String SHOW_CONFIGURATIONS_DESCRIPTION = "description";
+
   public static final List<ColumnHeader> lastQueryColumnHeaders =
       ImmutableList.of(
           new ColumnHeader(TIMESERIES, TSDataType.TEXT),
@@ -704,4 +709,17 @@ public class ColumnHeaderConstant {
 
   public static final List<ColumnHeader> SHOW_CURRENT_TIMESTAMP_COLUMN_HEADERS 
=
       ImmutableList.of(new ColumnHeader(CURRENT_TIMESTAMP, 
TSDataType.TIMESTAMP));
+
+  public static final List<ColumnHeader> SHOW_CONFIGURATIONS_COLUMN_HEADERS =
+      ImmutableList.of(
+          new ColumnHeader(SHOW_CONFIGURATIONS_NAME, TSDataType.TEXT),
+          new ColumnHeader(SHOW_CONFIGURATIONS_VALUE, TSDataType.TEXT),
+          new ColumnHeader(SHOW_CONFIGURATIONS_DEFAULT_VALUE, 
TSDataType.TEXT));
+
+  public static final List<ColumnHeader> 
SHOW_CONFIGURATIONS_COLUMN_HEADERS_WITH_DESCRIPTION =
+      ImmutableList.of(
+          new ColumnHeader(SHOW_CONFIGURATIONS_NAME, TSDataType.TEXT),
+          new ColumnHeader(SHOW_CONFIGURATIONS_VALUE, TSDataType.TEXT),
+          new ColumnHeader(SHOW_CONFIGURATIONS_DEFAULT_VALUE, TSDataType.TEXT),
+          new ColumnHeader(SHOW_CONFIGURATIONS_DESCRIPTION, TSDataType.TEXT));
 }
diff --git 
a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
 
b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
index 1d5d8dcecad..80a869d2644 100644
--- 
a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
+++ 
b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
@@ -140,6 +140,7 @@ statement
     | killQueryStatement
     | loadConfigurationStatement
     | setConfigurationStatement
+    | showConfigurationStatement
     | showCurrentSqlDialectStatement
     | setSqlDialectStatement
     | showCurrentUserStatement
@@ -676,6 +677,10 @@ showCurrentTimestampStatement
     : SHOW CURRENT_TIMESTAMP
     ;
 
+showConfigurationStatement
+    : SHOW (ALL)? CONFIGURATION (ON nodeId=INTEGER_VALUE)? (WITH DESC)?
+    ;
+
 
 // ------------------------------------------- Authority Statement 
-----------------------------------------------------
 
diff --git a/iotdb-protocol/thrift-commons/src/main/thrift/common.thrift 
b/iotdb-protocol/thrift-commons/src/main/thrift/common.thrift
index 26f621a6239..e34455034c1 100644
--- a/iotdb-protocol/thrift-commons/src/main/thrift/common.thrift
+++ b/iotdb-protocol/thrift-commons/src/main/thrift/common.thrift
@@ -307,6 +307,11 @@ struct TShowConfigurationResp {
   2: required string content
 }
 
+struct TShowAppliedConfigurationsResp {
+  1: required TSStatus status
+  2: required map<string, string> data
+}
+
 // for AINode
 enum TrainingState {
   PENDING,
diff --git a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift 
b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
index 99e11d8116d..436687d0e94 100644
--- a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
@@ -1702,6 +1702,9 @@ service IConfigNodeRPCService {
   /** Show content of configuration file */
   common.TShowConfigurationResp showConfiguration(1: i32 nodeId)
 
+  /** Show applied configurations by TsBlock */
+  common.TShowAppliedConfigurationsResp showAppliedConfigurations(1: i32 
nodeId)
+
   /** Check and repair unsorted tsfile by compaction */
   common.TSStatus startRepairData()
 
diff --git a/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift 
b/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift
index 5be8808db50..6b44d1a6ef2 100644
--- a/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift
+++ b/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift
@@ -989,6 +989,8 @@ service IDataNodeRPCService {
 
   common.TShowConfigurationResp showConfiguration()
 
+  common.TShowAppliedConfigurationsResp showAppliedConfigurations()
+
   common.TSStatus setConfiguration(common.TSetConfigurationReq req)
 
   common.TSStatus loadConfiguration()

Reply via email to