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

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


The following commit(s) were added to refs/heads/master by this push:
     new c379c51043 [IOTDB-3800]Add Node Type Column to 'SHOW CHILD PATHS' 
query (#6654)
c379c51043 is described below

commit c379c51043c17cd70b6d2f1eb2046ed5f2fc7bff
Author: Yifu Zhou <[email protected]>
AuthorDate: Fri Jul 15 17:10:28 2022 +0800

    [IOTDB-3800]Add Node Type Column to 'SHOW CHILD PATHS' query (#6654)
    
    [IOTDB-3800]Add Node Type Column to 'SHOW CHILD PATHS' query (#6654)
---
 .../response/SchemaNodeManagementResp.java         |  5 +-
 .../confignode/persistence/ClusterSchemaInfo.java  |  6 +-
 .../persistence/executor/ConfigPlanExecutor.java   |  8 ++-
 docs/UserGuide/Operate-Metadata/Node.md            | 17 +++--
 docs/zh/UserGuide/Operate-Metadata/Node.md         | 18 +++--
 .../iotdb/db/it/schema/IoTDBMetadataFetchIT.java   |  2 +-
 .../versionadaption/IoTDBDDLVersionAdaptionIT.java |  3 +-
 .../apache/iotdb/commons/conf/IoTDBConstant.java   |  1 +
 .../partition/SchemaNodeManagementPartition.java   |  9 +--
 .../commons/utils/ThriftCommonsSerDeUtils.java     | 33 +++++++++
 .../schemaregion/rocksdb/RSchemaRegion.java        | 17 +++--
 .../schemaregion/rocksdb/mnode/REntityMNode.java   |  6 ++
 .../schemaregion/rocksdb/mnode/RInternalMNode.java |  6 ++
 .../rocksdb/mnode/RMeasurementMNode.java           |  6 ++
 .../rocksdb/mnode/RStorageGroupMNode.java          |  6 ++
 .../iotdb/db/localconfignode/LocalConfigNode.java  |  5 +-
 .../iotdb/db/metadata/LocalSchemaProcessor.java    |  8 ++-
 .../idtable/entry/InsertMeasurementMNode.java      |  6 ++
 .../iotdb/db/metadata/mnode/EntityMNode.java       |  5 ++
 .../org/apache/iotdb/db/metadata/mnode/IMNode.java |  2 +
 .../iotdb/db/metadata/mnode/InternalMNode.java     |  5 ++
 .../apache/iotdb/db/metadata/mnode/MNodeType.java  | 82 ++++++++++++++++++++++
 .../iotdb/db/metadata/mnode/MeasurementMNode.java  |  5 ++
 .../db/metadata/mnode/StorageGroupEntityMNode.java |  5 ++
 .../iotdb/db/metadata/mnode/StorageGroupMNode.java |  5 ++
 .../iotdb/db/metadata/mtree/ConfigMTree.java       | 14 ++--
 .../iotdb/db/metadata/mtree/IMTreeBelowSG.java     |  5 +-
 .../db/metadata/mtree/MTreeBelowSGCachedImpl.java  | 13 ++--
 .../db/metadata/mtree/MTreeBelowSGMemoryImpl.java  | 13 ++--
 .../db/metadata/schemaregion/ISchemaRegion.java    |  3 +-
 .../schemaregion/SchemaRegionMemoryImpl.java       |  4 +-
 .../schemaregion/SchemaRegionSchemaFileImpl.java   |  4 +-
 .../storagegroup/IStorageGroupSchemaManager.java   |  3 +-
 .../storagegroup/StorageGroupSchemaManager.java    |  5 +-
 .../iotdb/db/mpp/common/header/HeaderConstant.java |  6 +-
 .../schema/NodeManageMemoryMergeOperator.java      | 47 +++++++++----
 .../schema/NodePathsSchemaScanOperator.java        | 39 ++++++----
 .../apache/iotdb/db/mpp/plan/analyze/Analysis.java |  7 +-
 .../plan/analyze/StandalonePartitionFetcher.java   | 12 +++-
 .../memory/StatementMemorySourceVisitor.java       | 37 ++++++++--
 .../db/mpp/plan/planner/LogicalPlanBuilder.java    |  3 +-
 .../read/NodeManagementMemoryMergeNode.java        | 18 ++---
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  | 32 +++++++--
 .../apache/iotdb/db/metadata/SchemaBasicTest.java  | 16 ++---
 .../NodeManagementMemoryMergeNodeSerdeTest.java    |  8 ++-
 .../db/protocol/rest/IoTDBRestServiceTest.java     |  1 +
 .../iotdb/db/query/dataset/ListDataSetTest.java    |  7 +-
 thrift-commons/src/main/thrift/common.thrift       |  6 ++
 .../src/main/thrift/confignode.thrift              |  2 +-
 49 files changed, 450 insertions(+), 126 deletions(-)

diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/SchemaNodeManagementResp.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/SchemaNodeManagementResp.java
index 4706636171..8fc684554b 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/SchemaNodeManagementResp.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/SchemaNodeManagementResp.java
@@ -22,6 +22,7 @@ package org.apache.iotdb.confignode.consensus.response;
 import org.apache.iotdb.common.rpc.thrift.TConsensusGroupId;
 import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.common.rpc.thrift.TSeriesPartitionSlot;
 import org.apache.iotdb.commons.partition.SchemaPartitionTable;
 import org.apache.iotdb.confignode.rpc.thrift.TSchemaNodeManagementResp;
@@ -40,7 +41,7 @@ public class SchemaNodeManagementResp implements DataSet {
   // TODO: Replace this map with new SchemaPartition
   private Map<String, SchemaPartitionTable> schemaPartition;
 
-  private Set<String> matchedNode;
+  private Set<TSchemaNode> matchedNode;
 
   public SchemaNodeManagementResp() {
     // empty constructor
@@ -58,7 +59,7 @@ public class SchemaNodeManagementResp implements DataSet {
     this.schemaPartition = schemaPartition;
   }
 
-  public void setMatchedNode(Set<String> matchedNode) {
+  public void setMatchedNode(Set<TSchemaNode> matchedNode) {
     this.matchedNode = matchedNode;
   }
 
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ClusterSchemaInfo.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ClusterSchemaInfo.java
index 74620ce2ef..1d9b9182f3 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ClusterSchemaInfo.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ClusterSchemaInfo.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.confignode.persistence;
 
 import org.apache.iotdb.common.rpc.thrift.TConsensusGroupType;
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
@@ -529,8 +530,9 @@ public class ClusterSchemaInfo implements SnapshotProcessor 
{
     return matchedPathsInNextLevel;
   }
 
-  public Pair<Set<String>, Set<PartialPath>> 
getChildNodePathInNextLevel(PartialPath partialPath) {
-    Pair<Set<String>, Set<PartialPath>> matchedPathsInNextLevel =
+  public Pair<Set<TSchemaNode>, Set<PartialPath>> getChildNodePathInNextLevel(
+      PartialPath partialPath) {
+    Pair<Set<TSchemaNode>, Set<PartialPath>> matchedPathsInNextLevel =
         new Pair<>(new HashSet<>(), new HashSet<>());
     storageGroupReadWriteLock.readLock().lock();
     try {
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
index fb43be7787..40294339a7 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
@@ -19,6 +19,7 @@
 package org.apache.iotdb.confignode.persistence.executor;
 
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.auth.AuthException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.snapshot.SnapshotProcessor;
@@ -67,6 +68,7 @@ import 
org.apache.iotdb.confignode.persistence.partition.PartitionInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TShowRegionReq;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
 import org.apache.iotdb.consensus.common.DataSet;
+import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.tsfile.utils.Pair;
 
@@ -295,7 +297,7 @@ public class ConfigPlanExecutor {
   private DataSet getSchemaNodeManagementPartition(ConfigPhysicalPlan req) {
     int level;
     PartialPath partialPath;
-    Set<String> alreadyMatchedNode;
+    Set<TSchemaNode> alreadyMatchedNode;
     Set<PartialPath> needMatchedNode;
     List<String> matchedStorageGroups = new ArrayList<>();
 
@@ -304,7 +306,7 @@ public class ConfigPlanExecutor {
     level = getNodePathsPartitionPlan.getLevel();
     if (-1 == level) {
       // get child paths
-      Pair<Set<String>, Set<PartialPath>> matchedChildInNextLevel =
+      Pair<Set<TSchemaNode>, Set<PartialPath>> matchedChildInNextLevel =
           clusterSchemaInfo.getChildNodePathInNextLevel(partialPath);
       alreadyMatchedNode = matchedChildInNextLevel.left;
       needMatchedNode = matchedChildInNextLevel.right;
@@ -314,7 +316,7 @@ public class ConfigPlanExecutor {
           clusterSchemaInfo.getNodesListInGivenLevel(partialPath, level);
       alreadyMatchedNode =
           matchedChildInNextLevel.left.stream()
-              .map(PartialPath::getFullPath)
+              .map(path -> new TSchemaNode(path.getFullPath(), 
MNodeType.UNIMPLEMENT.getNodeType()))
               .collect(Collectors.toSet());
       needMatchedNode = matchedChildInNextLevel.right;
     }
diff --git a/docs/UserGuide/Operate-Metadata/Node.md 
b/docs/UserGuide/Operate-Metadata/Node.md
index 2af63ca5d4..8887633ea7 100644
--- a/docs/UserGuide/Operate-Metadata/Node.md
+++ b/docs/UserGuide/Operate-Metadata/Node.md
@@ -26,19 +26,22 @@
 SHOW CHILD PATHS pathPattern
 ```
 
-Return all child paths of all the paths matching pathPattern.
+Return all child paths and their node types of all the paths matching 
pathPattern.
+
+node types: ROOT -> SG INTERNAL -> STORAGE GROUP -> INTERNAL -> DEVICE -> 
TIMESERIES
+
 
 Example:
 
 * return the child paths of root.ln:show child paths root.ln
 
 ```
-+------------+
-| child paths|
-+------------+
-|root.ln.wf01|
-|root.ln.wf02|
-+------------+
++------------+----------+
+| child paths|node types|
++------------+----------+
+|root.ln.wf01|  INTERNAL|
+|root.ln.wf02|  INTERNAL|
++------------+----------+
 Total line number = 2
 It costs 0.002s
 ```
diff --git a/docs/zh/UserGuide/Operate-Metadata/Node.md 
b/docs/zh/UserGuide/Operate-Metadata/Node.md
index a8671eee52..80c96635d4 100644
--- a/docs/zh/UserGuide/Operate-Metadata/Node.md
+++ b/docs/zh/UserGuide/Operate-Metadata/Node.md
@@ -27,19 +27,23 @@
 SHOW CHILD PATHS pathPattern
 ```
 
-可以查看此路径模式所匹配的所有路径的下一层的所有路径,即pathPattern.*所匹配的路径。
+可以查看此路径模式所匹配的所有路径的下一层的所有路径和它对应的节点类型,即pathPattern.*所匹配的路径及其节点类型。
+
+节点类型:ROOT -> SG INTERNAL -> STORAGE GROUP -> INTERNAL -> DEVICE -> TIMESERIES
 
 示例:
 
 * 查询 root.ln 的下一层:show child paths root.ln
 
 ```
-+------------+
-| child paths|
-+------------+
-|root.ln.wf01|
-|root.ln.wf02|
-+------------+
++------------+----------+
+| child paths|node types|
++------------+----------+
+|root.ln.wf01|  INTERNAL|
+|root.ln.wf02|  INTERNAL|
++------------+----------+
+Total line number = 2
+It costs 0.002s
 ```
 
 * 查询形如 root.xx.xx.xx 的路径:show child paths root.\*.\*
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBMetadataFetchIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBMetadataFetchIT.java
index 70d589fc6c..98b216e71e 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBMetadataFetchIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBMetadataFetchIT.java
@@ -278,7 +278,7 @@ public class IoTDBMetadataFetchIT {
     try (Connection connection = EnvFactory.getEnv().getConnection();
         Statement statement = connection.createStatement()) {
       String[] sqls = new String[] {"show child paths root.ln"};
-      String[] standards = new String[] {"root.ln.wf01,\n"};
+      String[] standards = new String[] {"root.ln.wf01,SG INTERNAL,\n"};
       for (int n = 0; n < sqls.length; n++) {
         String sql = sqls[n];
         String standard = standards[n];
diff --git 
a/integration/src/test/java/org/apache/iotdb/db/integration/versionadaption/IoTDBDDLVersionAdaptionIT.java
 
b/integration/src/test/java/org/apache/iotdb/db/integration/versionadaption/IoTDBDDLVersionAdaptionIT.java
index cf45460cc8..e835183d5e 100644
--- 
a/integration/src/test/java/org/apache/iotdb/db/integration/versionadaption/IoTDBDDLVersionAdaptionIT.java
+++ 
b/integration/src/test/java/org/apache/iotdb/db/integration/versionadaption/IoTDBDDLVersionAdaptionIT.java
@@ -189,7 +189,8 @@ public class IoTDBDDLVersionAdaptionIT {
   @Test
   public void showChildPaths() throws SQLException {
     String[] sqls = new String[] {"show child paths root.ln"};
-    Set<String>[] standards = new Set[] {new 
HashSet<>(Collections.singletonList("root.ln.wf01,"))};
+    Set<String>[] standards =
+        new Set[] {new HashSet<>(Collections.singletonList("root.ln.wf01,SG 
INTERNAL,"))};
     executeAndCheckResult(sqls, standards);
   }
 
diff --git 
a/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java 
b/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
index 313a7850f5..41013228ac 100644
--- 
a/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
+++ 
b/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
@@ -93,6 +93,7 @@ public class IoTDBConstant {
   public static final String COLUMN_TIMESERIES_COMPRESSION = "compression";
   public static final String COLUMN_TIMESERIES_COMPRESSOR = "compressor";
   public static final String COLUMN_CHILD_PATHS = "child paths";
+  public static final String COLUMN_CHILD_PATHS_TYPES = "node types";
   public static final String COLUMN_CHILD_NODES = "child nodes";
   public static final String COLUMN_DEVICES = "devices";
   public static final String COLUMN_COLUMN = "column";
diff --git 
a/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaNodeManagementPartition.java
 
b/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaNodeManagementPartition.java
index abd1930f58..2d31d211a9 100644
--- 
a/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaNodeManagementPartition.java
+++ 
b/node-commons/src/main/java/org/apache/iotdb/commons/partition/SchemaNodeManagementPartition.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.commons.partition;
 
 import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.common.rpc.thrift.TSeriesPartitionSlot;
 
 import java.util.Map;
@@ -28,13 +29,13 @@ import java.util.Set;
 public class SchemaNodeManagementPartition {
   SchemaPartition schemaPartition;
 
-  Set<String> matchedNode;
+  Set<TSchemaNode> matchedNode;
 
   public SchemaNodeManagementPartition(
       Map<String, Map<TSeriesPartitionSlot, TRegionReplicaSet>> 
schemaPartitionMap,
       String seriesSlotExecutorName,
       int seriesPartitionSlotNum,
-      Set<String> matchedNode) {
+      Set<TSchemaNode> matchedNode) {
     this.schemaPartition =
         new SchemaPartition(schemaPartitionMap, seriesSlotExecutorName, 
seriesPartitionSlotNum);
     this.matchedNode = matchedNode;
@@ -48,11 +49,11 @@ public class SchemaNodeManagementPartition {
     this.schemaPartition = schemaPartition;
   }
 
-  public Set<String> getMatchedNode() {
+  public Set<TSchemaNode> getMatchedNode() {
     return matchedNode;
   }
 
-  public void setMatchedNode(Set<String> matchedNode) {
+  public void setMatchedNode(Set<TSchemaNode> matchedNode) {
     this.matchedNode = matchedNode;
   }
 }
diff --git 
a/node-commons/src/main/java/org/apache/iotdb/commons/utils/ThriftCommonsSerDeUtils.java
 
b/node-commons/src/main/java/org/apache/iotdb/commons/utils/ThriftCommonsSerDeUtils.java
index 42e95dd11d..10090022f6 100644
--- 
a/node-commons/src/main/java/org/apache/iotdb/commons/utils/ThriftCommonsSerDeUtils.java
+++ 
b/node-commons/src/main/java/org/apache/iotdb/commons/utils/ThriftCommonsSerDeUtils.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.common.rpc.thrift.TDataNodeInfo;
 import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
 import org.apache.iotdb.common.rpc.thrift.TEndPoint;
 import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.common.rpc.thrift.TSeriesPartitionSlot;
 import org.apache.iotdb.common.rpc.thrift.TTimePartitionSlot;
 import org.apache.iotdb.commons.exception.runtime.ThriftSerDeException;
@@ -50,6 +51,12 @@ public class ThriftCommonsSerDeUtils {
     return new TBinaryProtocol(transport);
   }
 
+  private static TBinaryProtocol generateWriteProtocol(ByteBuffer buffer)
+      throws TTransportException {
+    TTransport transport = new TByteBuffer(buffer);
+    return new TBinaryProtocol(transport);
+  }
+
   private static TBinaryProtocol generateReadProtocol(ByteBuffer buffer)
       throws TTransportException {
     TTransport transport = new TByteBuffer(buffer);
@@ -186,4 +193,30 @@ public class ThriftCommonsSerDeUtils {
     }
     return regionReplicaSet;
   }
+
+  public static void serializeTSchemaNode(TSchemaNode schemaNode, 
DataOutputStream stream) {
+    try {
+      schemaNode.write(generateWriteProtocol(stream));
+    } catch (TException e) {
+      throw new ThriftSerDeException("Write TSchemaNode failed: ", e);
+    }
+  }
+
+  public static void serializeTSchemaNode(TSchemaNode schemaNode, ByteBuffer 
buffer) {
+    try {
+      schemaNode.write(generateWriteProtocol(buffer));
+    } catch (TException e) {
+      throw new ThriftSerDeException("Write TSchemaNode failed: ", e);
+    }
+  }
+
+  public static TSchemaNode deserializeTSchemaNode(ByteBuffer buffer) {
+    TSchemaNode schemaNode = new TSchemaNode();
+    try {
+      schemaNode.read(generateReadProtocol(buffer));
+    } catch (TException e) {
+      throw new ThriftSerDeException("Read TSchemaNode failed: ", e);
+    }
+    return schemaNode;
+  }
 }
diff --git 
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java
 
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java
index da467999ae..b693c9b512 100644
--- 
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java
+++ 
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/RSchemaRegion.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.metadata.schemaregion.rocksdb;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.consensus.SchemaRegionId;
 import org.apache.iotdb.commons.exception.IllegalPathException;
@@ -44,6 +45,7 @@ import org.apache.iotdb.db.metadata.idtable.IDTableManager;
 import org.apache.iotdb.db.metadata.mnode.IMNode;
 import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
 import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
+import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.db.metadata.path.MeasurementPath;
 import org.apache.iotdb.db.metadata.schemaregion.ISchemaRegion;
 import org.apache.iotdb.db.metadata.schemaregion.SchemaRegionUtils;
@@ -113,6 +115,7 @@ import java.util.concurrent.locks.ReentrantLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.function.BiFunction;
 import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import static 
org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaConstants.ALL_NODE_TYPE_ARRAY;
 import static 
org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaConstants.DEFAULT_ALIGNED_ENTITY_VALUE;
@@ -995,14 +998,15 @@ public class RSchemaRegion implements ISchemaRegion {
   }
 
   @Override
-  public Set<String> getChildNodePathInNextLevel(PartialPath pathPattern) 
throws MetadataException {
+  public Set<TSchemaNode> getChildNodePathInNextLevel(PartialPath pathPattern)
+      throws MetadataException {
     // todo support wildcard
     if 
(pathPattern.getFullPath().contains(IoTDBConstant.ONE_LEVEL_PATH_WILDCARD)) {
       throw new MetadataException(
           "Wildcards are not currently supported for this operation"
               + " [SHOW CHILD PATHS pathPattern].");
     }
-    Set<String> result = Collections.synchronizedSet(new HashSet<>());
+    Set<TSchemaNode> result = Collections.synchronizedSet(new HashSet<>());
     String innerNameByLevel =
         RSchemaUtils.getLevelPath(
                 pathPattern.getNodes(),
@@ -1012,7 +1016,9 @@ public class RSchemaRegion implements ISchemaRegion {
             + pathPattern.getNodeLength();
     Function<String, Boolean> function =
         s -> {
-          result.add(RSchemaUtils.getPathByInnerName(s));
+          result.add(
+              new TSchemaNode(
+                  RSchemaUtils.getPathByInnerName(s), 
MNodeType.UNIMPLEMENT.getNodeType()));
           return true;
         };
 
@@ -1024,7 +1030,10 @@ public class RSchemaRegion implements ISchemaRegion {
 
   @Override
   public Set<String> getChildNodeNameInNextLevel(PartialPath pathPattern) 
throws MetadataException {
-    Set<String> childPath = getChildNodePathInNextLevel(pathPattern);
+    Set<String> childPath =
+        getChildNodePathInNextLevel(pathPattern).stream()
+            .map(node -> node.getNodeName())
+            .collect(Collectors.toSet());
     Set<String> childName = new HashSet<>();
     for (String str : childPath) {
       
childName.add(str.substring(str.lastIndexOf(RSchemaConstants.PATH_SEPARATOR) + 
1));
diff --git 
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/REntityMNode.java
 
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/REntityMNode.java
index 1f64dce044..15e397f926 100644
--- 
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/REntityMNode.java
+++ 
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/REntityMNode.java
@@ -24,6 +24,7 @@ import 
org.apache.iotdb.db.metadata.lastCache.container.ILastCacheContainer;
 import org.apache.iotdb.db.metadata.logfile.MLogWriter;
 import org.apache.iotdb.db.metadata.mnode.IEntityMNode;
 import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
+import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaConstants;
 import 
org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaReadWriteHandler;
 import org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaUtils;
@@ -119,6 +120,11 @@ public class REntityMNode extends RInternalMNode 
implements IEntityMNode {
     return true;
   }
 
+  @Override
+  public MNodeType getMNodeType(Boolean isConfig) {
+    return MNodeType.DEVICE;
+  }
+
   @Override
   public void serializeTo(MLogWriter logWriter) throws IOException {}
 }
diff --git 
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RInternalMNode.java
 
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RInternalMNode.java
index f7c2d47879..2ee98b909d 100644
--- 
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RInternalMNode.java
+++ 
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RInternalMNode.java
@@ -22,6 +22,7 @@ package 
org.apache.iotdb.db.metadata.schemaregion.rocksdb.mnode;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.db.metadata.logfile.MLogWriter;
 import org.apache.iotdb.db.metadata.mnode.IMNode;
+import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.db.metadata.mnode.container.IMNodeContainer;
 import org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaConstants;
 import 
org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaReadWriteHandler;
@@ -180,6 +181,11 @@ public class RInternalMNode extends RMNode {
     this.schemaTemplate = schemaTemplate;
   }
 
+  @Override
+  public MNodeType getMNodeType(Boolean isConfig) {
+    return isConfig ? MNodeType.SG_INTERNAL : MNodeType.INTERNAL;
+  }
+
   @Override
   public boolean isUseTemplate() {
     return useTemplate;
diff --git 
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RMeasurementMNode.java
 
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RMeasurementMNode.java
index eab9ba710a..fe52cb7207 100644
--- 
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RMeasurementMNode.java
+++ 
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RMeasurementMNode.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.db.metadata.logfile.MLogWriter;
 import org.apache.iotdb.db.metadata.mnode.IEntityMNode;
 import org.apache.iotdb.db.metadata.mnode.IMNode;
 import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
+import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.db.metadata.mnode.container.IMNodeContainer;
 import org.apache.iotdb.db.metadata.path.MeasurementPath;
 import org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaConstants;
@@ -240,6 +241,11 @@ public class RMeasurementMNode extends RMNode implements 
IMeasurementMNode {
     return true;
   }
 
+  @Override
+  public MNodeType getMNodeType(Boolean isConfig) {
+    return MNodeType.MEASUREMENT;
+  }
+
   public Map<String, String> getTags() {
     return tags;
   }
diff --git 
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RStorageGroupMNode.java
 
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RStorageGroupMNode.java
index e76ab216d8..0d78ff1112 100644
--- 
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RStorageGroupMNode.java
+++ 
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RStorageGroupMNode.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
 import org.apache.iotdb.db.metadata.logfile.MLogWriter;
 import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
+import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaConstants;
 import 
org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaReadWriteHandler;
 import org.apache.iotdb.db.metadata.schemaregion.rocksdb.RSchemaUtils;
@@ -86,6 +87,11 @@ public class RStorageGroupMNode extends RInternalMNode 
implements IStorageGroupM
     return false;
   }
 
+  @Override
+  public MNodeType getMNodeType(Boolean isConfig) {
+    return MNodeType.STORAGE_GROUP;
+  }
+
   @Override
   public void serializeTo(MLogWriter logWriter) throws IOException {
     throw new UnsupportedOperationException();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/localconfignode/LocalConfigNode.java 
b/server/src/main/java/org/apache/iotdb/db/localconfignode/LocalConfigNode.java
index 19e813a3c5..8584677ab0 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/localconfignode/LocalConfigNode.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/localconfignode/LocalConfigNode.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.common.rpc.thrift.TEndPoint;
 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.TSchemaNode;
 import org.apache.iotdb.common.rpc.thrift.TSeriesPartitionSlot;
 import org.apache.iotdb.common.rpc.thrift.TTimePartitionSlot;
 import org.apache.iotdb.commons.auth.AuthException;
@@ -536,8 +537,8 @@ public class LocalConfigNode {
    * @param pathPattern The given path
    * @return All child nodes' seriesPath(s) of given seriesPath.
    */
-  public Pair<Set<String>, Set<PartialPath>> 
getChildNodePathInNextLevel(PartialPath pathPattern)
-      throws MetadataException {
+  public Pair<Set<TSchemaNode>, Set<PartialPath>> getChildNodePathInNextLevel(
+      PartialPath pathPattern) throws MetadataException {
     return storageGroupSchemaManager.getChildNodePathInNextLevel(pathPattern);
   }
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/LocalSchemaProcessor.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/LocalSchemaProcessor.java
index e365c90b57..32518a6239 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/LocalSchemaProcessor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/LocalSchemaProcessor.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.metadata;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.consensus.SchemaRegionId;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
@@ -607,10 +608,11 @@ public class LocalSchemaProcessor {
    * @param pathPattern The given path
    * @return All child nodes' seriesPath(s) of given seriesPath.
    */
-  public Set<String> getChildNodePathInNextLevel(PartialPath pathPattern) 
throws MetadataException {
-    Pair<Set<String>, Set<PartialPath>> pair =
+  public Set<TSchemaNode> getChildNodePathInNextLevel(PartialPath pathPattern)
+      throws MetadataException {
+    Pair<Set<TSchemaNode>, Set<PartialPath>> pair =
         configManager.getChildNodePathInNextLevel(pathPattern);
-    Set<String> result = pair.left;
+    Set<TSchemaNode> result = pair.left;
     for (PartialPath storageGroup : pair.right) {
       for (ISchemaRegion schemaRegion : 
getSchemaRegionsByStorageGroup(storageGroup)) {
         result.addAll(schemaRegion.getChildNodePathInNextLevel(pathPattern));
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/idtable/entry/InsertMeasurementMNode.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/idtable/entry/InsertMeasurementMNode.java
index 2ce29d882e..eb3b6e8e47 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/idtable/entry/InsertMeasurementMNode.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/idtable/entry/InsertMeasurementMNode.java
@@ -28,6 +28,7 @@ import org.apache.iotdb.db.metadata.mnode.IEntityMNode;
 import org.apache.iotdb.db.metadata.mnode.IMNode;
 import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
 import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
+import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.db.metadata.mnode.container.IMNodeContainer;
 import org.apache.iotdb.db.metadata.mnode.visitor.MNodeVisitor;
 import org.apache.iotdb.db.metadata.mtree.store.disk.cache.CacheEntry;
@@ -245,6 +246,11 @@ public class InsertMeasurementMNode implements 
IMeasurementMNode {
     return true;
   }
 
+  @Override
+  public MNodeType getMNodeType(Boolean isConfig) {
+    return MNodeType.MEASUREMENT;
+  }
+
   @Override
   public IStorageGroupMNode getAsStorageGroupMNode() {
     throw new UnsupportedOperationException("insert measurement mnode doesn't 
support this method");
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/EntityMNode.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/EntityMNode.java
index 9dda06ed98..76dc8cda2d 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/EntityMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/EntityMNode.java
@@ -162,6 +162,11 @@ public class EntityMNode extends InternalMNode implements 
IEntityMNode {
     return true;
   }
 
+  @Override
+  public MNodeType getMNodeType(Boolean isConfig) {
+    return MNodeType.DEVICE;
+  }
+
   @Override
   public <R, C> R accept(MNodeVisitor<R, C> visitor, C context) {
     return visitor.visitEntityMNode(this, context);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
index 4f8f7b5887..4093e209a9 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
@@ -88,6 +88,8 @@ public interface IMNode extends Serializable {
 
   boolean isMeasurement();
 
+  MNodeType getMNodeType(Boolean isConfig);
+
   IStorageGroupMNode getAsStorageGroupMNode();
 
   IEntityMNode getAsEntityMNode();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
index f5daa4392e..224c5551cd 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
@@ -215,6 +215,11 @@ public class InternalMNode extends MNode {
     this.schemaTemplateId = schemaTemplateId;
   }
 
+  @Override
+  public MNodeType getMNodeType(Boolean isConfig) {
+    return isConfig ? MNodeType.SG_INTERNAL : MNodeType.INTERNAL;
+  }
+
   @Override
   public Template getSchemaTemplate() {
     return schemaTemplate;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNodeType.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNodeType.java
new file mode 100644
index 0000000000..ebc2f1d204
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNodeType.java
@@ -0,0 +1,82 @@
+/*
+ * 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.metadata.mnode;
+
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public enum MNodeType {
+  ROOT((byte) 0, "ROOT"),
+  SG_INTERNAL((byte) 1, "SG INTERNAL"),
+  STORAGE_GROUP((byte) 2, "STORAGE GROUP"),
+  INTERNAL((byte) 3, "INTERNAL"),
+  DEVICE((byte) 4, "DEVICE"),
+  MEASUREMENT((byte) 5, "TIMESERIES"),
+  UNIMPLEMENT((byte) 6, "");
+
+  private final byte nodeType;
+
+  private final String typeName;
+
+  MNodeType(byte nodeType, String typeName) {
+    this.nodeType = nodeType;
+    this.typeName = typeName;
+  }
+
+  public static MNodeType getMNodeType(byte type) {
+    switch (type) {
+      case 0:
+        return MNodeType.ROOT;
+      case 1:
+        return MNodeType.SG_INTERNAL;
+      case 2:
+        return MNodeType.STORAGE_GROUP;
+      case 3:
+        return MNodeType.INTERNAL;
+      case 4:
+        return MNodeType.DEVICE;
+      case 5:
+        return MNodeType.MEASUREMENT;
+      case 6:
+        return MNodeType.UNIMPLEMENT;
+      default:
+        throw new IllegalArgumentException("Invalid input: " + type);
+    }
+  }
+
+  public void serialize(ByteBuffer buffer) {
+    ReadWriteIOUtils.write(nodeType, buffer);
+  }
+
+  public void serialize(DataOutputStream stream) throws IOException {
+    ReadWriteIOUtils.write(nodeType, stream);
+  }
+
+  public byte getNodeType() {
+    return nodeType;
+  }
+
+  public String getNodeTypeName() {
+    return typeName;
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
index 9103d96c87..da8e92bffb 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
@@ -253,4 +253,9 @@ public class MeasurementMNode extends MNode implements 
IMeasurementMNode {
   public boolean isMeasurement() {
     return true;
   }
+
+  @Override
+  public MNodeType getMNodeType(Boolean isConfig) {
+    return MNodeType.MEASUREMENT;
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/StorageGroupEntityMNode.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/StorageGroupEntityMNode.java
index 6de14c8297..675927b304 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/StorageGroupEntityMNode.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/StorageGroupEntityMNode.java
@@ -81,6 +81,11 @@ public class StorageGroupEntityMNode extends EntityMNode 
implements IStorageGrou
     return true;
   }
 
+  @Override
+  public MNodeType getMNodeType(Boolean isConfig) {
+    return MNodeType.STORAGE_GROUP;
+  }
+
   @Override
   public void serializeTo(MLogWriter logWriter) throws IOException {
     serializeChildren(logWriter);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/StorageGroupMNode.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/StorageGroupMNode.java
index 617505a645..d14171550c 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/StorageGroupMNode.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/StorageGroupMNode.java
@@ -94,6 +94,11 @@ public class StorageGroupMNode extends InternalMNode 
implements IStorageGroupMNo
     return true;
   }
 
+  @Override
+  public MNodeType getMNodeType(Boolean isConfig) {
+    return MNodeType.STORAGE_GROUP;
+  }
+
   @Override
   public void serializeTo(MLogWriter logWriter) throws IOException {
     serializeChildren(logWriter);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/ConfigMTree.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/ConfigMTree.java
index 994096de16..f9b49b4834 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/ConfigMTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/ConfigMTree.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.metadata.mtree;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.IllegalPathException;
@@ -515,15 +516,18 @@ public class ConfigMTree {
    * @param pathPattern The given path
    * @return All child nodes' seriesPath(s) of given seriesPath.
    */
-  public Pair<Set<String>, Set<PartialPath>> 
getChildNodePathInNextLevel(PartialPath pathPattern)
-      throws MetadataException {
+  public Pair<Set<TSchemaNode>, Set<PartialPath>> getChildNodePathInNextLevel(
+      PartialPath pathPattern) throws MetadataException {
     try {
-      MNodeAboveSGCollector<Set<String>> collector =
-          new MNodeAboveSGCollector<Set<String>>(
+      MNodeAboveSGCollector<Set<TSchemaNode>> collector =
+          new MNodeAboveSGCollector<Set<TSchemaNode>>(
               root, pathPattern.concatNode(ONE_LEVEL_PATH_WILDCARD), store) {
             @Override
             protected void transferToResult(IMNode node) {
-              resultSet.add(getCurrentPartialPath(node).getFullPath());
+              resultSet.add(
+                  new TSchemaNode(
+                      getCurrentPartialPath(node).getFullPath(),
+                      node.getMNodeType(true).getNodeType()));
             }
           };
       collector.setResultSet(new TreeSet<>());
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/IMTreeBelowSG.java 
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/IMTreeBelowSG.java
index 759c841ee8..7c4fff16bc 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/IMTreeBelowSG.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/IMTreeBelowSG.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.metadata.mtree;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.LocalSchemaProcessor;
@@ -136,7 +137,7 @@ public interface IMTreeBelowSG {
    *
    * @param pathPattern a path pattern or a full path, may contain wildcard
    * @param isPrefixMatch if true, the path pattern is used to match prefix 
path
-   * @return Pair.left contains all the satisfied paths Pair.right means the 
current offset or zero
+   * @return Pair.left contains all the satisfied path Pair.right means the 
current offset or zero
    *     if we don't set offset.
    */
   Pair<List<MeasurementPath>, Integer> getMeasurementPathsWithAlias(
@@ -163,7 +164,7 @@ public interface IMTreeBelowSG {
    * @param pathPattern The given path
    * @return All child nodes' seriesPath(s) of given seriesPath.
    */
-  Set<String> getChildNodePathInNextLevel(PartialPath pathPattern) throws 
MetadataException;
+  Set<TSchemaNode> getChildNodePathInNextLevel(PartialPath pathPattern) throws 
MetadataException;
 
   /**
    * Get child node in the next level of the given path.
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
index 87773a7f3d..8d19efa765 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.metadata.mtree;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.exception.MetadataException;
@@ -762,14 +763,18 @@ public class MTreeBelowSGCachedImpl implements 
IMTreeBelowSG {
    * @return All child nodes' seriesPath(s) of given seriesPath.
    */
   @Override
-  public Set<String> getChildNodePathInNextLevel(PartialPath pathPattern) 
throws MetadataException {
+  public Set<TSchemaNode> getChildNodePathInNextLevel(PartialPath pathPattern)
+      throws MetadataException {
     try {
-      MNodeCollector<Set<String>> collector =
-          new MNodeCollector<Set<String>>(
+      MNodeCollector<Set<TSchemaNode>> collector =
+          new MNodeCollector<Set<TSchemaNode>>(
               storageGroupMNode, 
pathPattern.concatNode(ONE_LEVEL_PATH_WILDCARD), store) {
             @Override
             protected void transferToResult(IMNode node) {
-              resultSet.add(getCurrentPartialPath(node).getFullPath());
+              resultSet.add(
+                  new TSchemaNode(
+                      getCurrentPartialPath(node).getFullPath(),
+                      node.getMNodeType(false).getNodeType()));
             }
           };
       collector.setResultSet(new TreeSet<>());
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
index 87b44df95c..7a3705b758 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.metadata.mtree;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.exception.MetadataException;
@@ -747,14 +748,18 @@ public class MTreeBelowSGMemoryImpl implements 
IMTreeBelowSG {
    * @return All child nodes' seriesPath(s) of given seriesPath.
    */
   @Override
-  public Set<String> getChildNodePathInNextLevel(PartialPath pathPattern) 
throws MetadataException {
+  public Set<TSchemaNode> getChildNodePathInNextLevel(PartialPath pathPattern)
+      throws MetadataException {
     try {
-      MNodeCollector<Set<String>> collector =
-          new MNodeCollector<Set<String>>(
+      MNodeCollector<Set<TSchemaNode>> collector =
+          new MNodeCollector<Set<TSchemaNode>>(
               storageGroupMNode, 
pathPattern.concatNode(ONE_LEVEL_PATH_WILDCARD), store) {
             @Override
             protected void transferToResult(IMNode node) {
-              resultSet.add(getCurrentPartialPath(node).getFullPath());
+              resultSet.add(
+                  new TSchemaNode(
+                      getCurrentPartialPath(node).getFullPath(),
+                      node.getMNodeType(false).getNodeType()));
             }
           };
       collector.setResultSet(new TreeSet<>());
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
index 4ec058a0c0..d64544cfde 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.metadata.schemaregion;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.consensus.SchemaRegionId;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
@@ -181,7 +182,7 @@ public interface ISchemaRegion {
    * @param pathPattern The given path
    * @return All child nodes' seriesPath(s) of given seriesPath.
    */
-  Set<String> getChildNodePathInNextLevel(PartialPath pathPattern) throws 
MetadataException;
+  Set<TSchemaNode> getChildNodePathInNextLevel(PartialPath pathPattern) throws 
MetadataException;
 
   /**
    * Get child node in the next level of the given path pattern.
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
index a34bd22cad..cecd0bd7c0 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.metadata.schemaregion;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.consensus.SchemaRegionId;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.file.SystemFileFactory;
@@ -968,7 +969,8 @@ public class SchemaRegionMemoryImpl implements 
ISchemaRegion {
    * @param pathPattern The given path
    * @return All child nodes' seriesPath(s) of given seriesPath.
    */
-  public Set<String> getChildNodePathInNextLevel(PartialPath pathPattern) 
throws MetadataException {
+  public Set<TSchemaNode> getChildNodePathInNextLevel(PartialPath pathPattern)
+      throws MetadataException {
     return mtree.getChildNodePathInNextLevel(pathPattern);
   }
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
index 86ec1229f0..7cd6458a98 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.metadata.schemaregion;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.consensus.SchemaRegionId;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.file.SystemFileFactory;
@@ -921,7 +922,8 @@ public class SchemaRegionSchemaFileImpl implements 
ISchemaRegion {
    * @param pathPattern The given path
    * @return All child nodes' seriesPath(s) of given seriesPath.
    */
-  public Set<String> getChildNodePathInNextLevel(PartialPath pathPattern) 
throws MetadataException {
+  public Set<TSchemaNode> getChildNodePathInNextLevel(PartialPath pathPattern)
+      throws MetadataException {
     return mtree.getChildNodePathInNextLevel(pathPattern);
   }
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/storagegroup/IStorageGroupSchemaManager.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/storagegroup/IStorageGroupSchemaManager.java
index e8611221bf..050854f1f2 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/storagegroup/IStorageGroupSchemaManager.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/storagegroup/IStorageGroupSchemaManager.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.metadata.storagegroup;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.exception.metadata.StorageGroupNotSetException;
@@ -189,7 +190,7 @@ public interface IStorageGroupSchemaManager {
    * @param pathPattern The given path
    * @return All child nodes' seriesPath(s) of given seriesPath.
    */
-  Pair<Set<String>, Set<PartialPath>> getChildNodePathInNextLevel(PartialPath 
pathPattern)
+  Pair<Set<TSchemaNode>, Set<PartialPath>> 
getChildNodePathInNextLevel(PartialPath pathPattern)
       throws MetadataException;
 
   /**
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/storagegroup/StorageGroupSchemaManager.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/storagegroup/StorageGroupSchemaManager.java
index d1b6fe516e..3883a913aa 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/storagegroup/StorageGroupSchemaManager.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/storagegroup/StorageGroupSchemaManager.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.metadata.storagegroup;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.conf.IoTDBConfig;
@@ -269,8 +270,8 @@ public class StorageGroupSchemaManager implements 
IStorageGroupSchemaManager {
   }
 
   @Override
-  public Pair<Set<String>, Set<PartialPath>> 
getChildNodePathInNextLevel(PartialPath pathPattern)
-      throws MetadataException {
+  public Pair<Set<TSchemaNode>, Set<PartialPath>> getChildNodePathInNextLevel(
+      PartialPath pathPattern) throws MetadataException {
     return mtree.getChildNodePathInNextLevel(pathPattern);
   }
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/HeaderConstant.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/HeaderConstant.java
index b7bbeff924..7bfef19234 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/HeaderConstant.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/HeaderConstant.java
@@ -48,6 +48,7 @@ public class HeaderConstant {
   public static final String COLUMN_DATA_REPLICATION_FACTOR = 
"data_replication_factor";
   public static final String COLUMN_TIME_PARTITION_INTERVAL = 
"time_partition_interval";
   public static final String COLUMN_CHILDPATHS = "child paths";
+  public static final String COLUMN_NODETYPES = "node types";
   public static final String COLUMN_CHILDNODES = "child nodes";
   public static final String COLUMN_VERSION = "version";
   public static final String COLUMN_PATHS = "paths";
@@ -195,7 +196,10 @@ public class HeaderConstant {
             true);
     showChildPathsHeader =
         new DatasetHeader(
-            Collections.singletonList(new ColumnHeader(COLUMN_CHILDPATHS, 
TSDataType.TEXT)), true);
+            Arrays.asList(
+                new ColumnHeader(COLUMN_CHILDPATHS, TSDataType.TEXT),
+                new ColumnHeader(COLUMN_NODETYPES, TSDataType.TEXT)),
+            true);
     showChildNodesHeader =
         new DatasetHeader(
             Collections.singletonList(new ColumnHeader(COLUMN_CHILDNODES, 
TSDataType.TEXT)), true);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodeManageMemoryMergeOperator.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodeManageMemoryMergeOperator.java
index 255cd0c4b5..f97f299279 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodeManageMemoryMergeOperator.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodeManageMemoryMergeOperator.java
@@ -19,6 +19,8 @@
 
 package org.apache.iotdb.db.mpp.execution.operator.schema;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
+import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
 import org.apache.iotdb.db.mpp.execution.operator.Operator;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
@@ -29,21 +31,25 @@ import org.apache.iotdb.tsfile.utils.Binary;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
+import java.util.HashSet;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.stream.Collectors;
 
 import static java.util.Objects.requireNonNull;
 
 public class NodeManageMemoryMergeOperator implements ProcessOperator {
   private final OperatorContext operatorContext;
-  private final Set<String> data;
+  private final Set<TSchemaNode> data;
+  private final Set<String> nameSet;
   private final Operator child;
   private boolean isReadingMemory;
 
   public NodeManageMemoryMergeOperator(
-      OperatorContext operatorContext, Set<String> data, Operator child) {
+      OperatorContext operatorContext, Set<TSchemaNode> data, Operator child) {
     this.operatorContext = requireNonNull(operatorContext, "operatorContext is 
null");
     this.data = data;
+    nameSet = data.stream().map(schemaNode -> 
schemaNode.getNodeName()).collect(Collectors.toSet());
     this.child = requireNonNull(child, "child operator is null");
     isReadingMemory = true;
   }
@@ -69,27 +75,42 @@ public class NodeManageMemoryMergeOperator implements 
ProcessOperator {
         return null;
       }
 
-      Set<String> nodePaths = new TreeSet<>();
-      String nodePath;
+      Set<TSchemaNode> nodePaths = new HashSet<>();
       for (int i = 0; i < block.getPositionCount(); i++) {
-        nodePath = block.getColumn(0).getBinary(i).toString();
-        if (!data.contains(nodePath)) {
-          nodePaths.add(nodePath);
-          data.add(nodePath);
+        TSchemaNode schemaNode =
+            new TSchemaNode(
+                block.getColumn(0).getBinary(i).toString(),
+                Byte.parseByte(block.getColumn(1).getBinary(i).toString()));
+        if (!nameSet.contains(schemaNode.getNodeName())) {
+          nodePaths.add(schemaNode);
+          nameSet.add(schemaNode.getNodeName());
         }
       }
       return transferToTsBlock(nodePaths);
     }
   }
 
-  private TsBlock transferToTsBlock(Set<String> nodePaths) {
+  private TsBlock transferToTsBlock(Set<TSchemaNode> nodePaths) {
     TsBlockBuilder tsBlockBuilder =
         new 
TsBlockBuilder(HeaderConstant.showChildPathsHeader.getRespDataTypes());
-
-    nodePaths.forEach(
-        path -> {
+    // sort by node type
+    Set<TSchemaNode> sortSet =
+        new TreeSet<>(
+            (o1, o2) -> {
+              if (o1.getNodeType() == o2.getNodeType()) {
+                return o1.getNodeName().compareTo(o2.getNodeName());
+              }
+              return o1.getNodeType() - o2.getNodeType();
+            });
+    sortSet.addAll(nodePaths);
+    sortSet.forEach(
+        node -> {
           tsBlockBuilder.getTimeColumnBuilder().writeLong(0L);
-          tsBlockBuilder.getColumnBuilder(0).writeBinary(new Binary(path));
+          tsBlockBuilder.getColumnBuilder(0).writeBinary(new 
Binary(node.getNodeName()));
+          tsBlockBuilder
+              .getColumnBuilder(1)
+              .writeBinary(
+                  new 
Binary(MNodeType.getMNodeType(node.getNodeType()).getNodeTypeName()));
           tsBlockBuilder.declarePosition();
         });
     return tsBlockBuilder.build();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsSchemaScanOperator.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsSchemaScanOperator.java
index 374368aae5..2db64f704c 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsSchemaScanOperator.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsSchemaScanOperator.java
@@ -19,8 +19,10 @@
 
 package org.apache.iotdb.db.mpp.execution.operator.schema;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
 import org.apache.iotdb.db.mpp.execution.driver.SchemaDriverContext;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
@@ -62,34 +64,45 @@ public class NodePathsSchemaScanOperator implements 
SourceOperator {
     isFinished = true;
     TsBlockBuilder tsBlockBuilder =
         new 
TsBlockBuilder(HeaderConstant.showChildPathsHeader.getRespDataTypes());
-    Set<String> nodePaths;
-
     try {
       if (-1 == level) {
-        // show child paths
-        nodePaths =
+        // show child paths and show child nodes
+        Set<TSchemaNode> nodePaths =
             ((SchemaDriverContext) 
operatorContext.getInstanceContext().getDriverContext())
                 .getSchemaRegion()
                 .getChildNodePathInNextLevel(partialPath);
+        nodePaths.forEach(
+            node -> {
+              tsBlockBuilder.getTimeColumnBuilder().writeLong(0L);
+              tsBlockBuilder.getColumnBuilder(0).writeBinary(new 
Binary(node.getNodeName()));
+              tsBlockBuilder
+                  .getColumnBuilder(1)
+                  .writeBinary(new Binary(String.valueOf(node.getNodeType())));
+              tsBlockBuilder.declarePosition();
+            });
       } else {
-        nodePaths =
+        // show nodes with level
+        Set<String> childNodes;
+        childNodes =
             ((SchemaDriverContext) 
operatorContext.getInstanceContext().getDriverContext())
                 .getSchemaRegion().getNodesListInGivenLevel(partialPath, 
level, false, null)
                     .stream()
                     .map(PartialPath::getFullPath)
                     .collect(Collectors.toSet());
-      }
 
+        childNodes.forEach(
+            (path) -> {
+              tsBlockBuilder.getTimeColumnBuilder().writeLong(0L);
+              tsBlockBuilder.getColumnBuilder(0).writeBinary(new Binary(path));
+              tsBlockBuilder
+                  .getColumnBuilder(1)
+                  .writeBinary(new 
Binary(String.valueOf(MNodeType.UNIMPLEMENT.getNodeType())));
+              tsBlockBuilder.declarePosition();
+            });
+      }
     } catch (MetadataException e) {
       throw new RuntimeException(e.getMessage(), e);
     }
-
-    nodePaths.forEach(
-        (path) -> {
-          tsBlockBuilder.getTimeColumnBuilder().writeLong(0L);
-          tsBlockBuilder.getColumnBuilder(0).writeBinary(new Binary(path));
-          tsBlockBuilder.declarePosition();
-        });
     return tsBlockBuilder.build();
   }
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
index 2a7137dd22..bc5af81d7b 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.db.mpp.plan.analyze;
 
 import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.partition.DataPartition;
 import org.apache.iotdb.commons.partition.SchemaPartition;
 import org.apache.iotdb.commons.path.PartialPath;
@@ -141,7 +142,7 @@ public class Analysis {
   
/////////////////////////////////////////////////////////////////////////////////////////////////
 
   // extra mesaage from config node, used for node management
-  private Set<String> matchedNodes;
+  private Set<TSchemaNode> matchedNodes;
 
   public Analysis() {
     this.finishQueryAfterAnalyze = false;
@@ -396,11 +397,11 @@ public class Analysis {
     this.deviceToIsRawDataSource = deviceToIsRawDataSource;
   }
 
-  public Set<String> getMatchedNodes() {
+  public Set<TSchemaNode> getMatchedNodes() {
     return matchedNodes;
   }
 
-  public void setMatchedNodes(Set<String> matchedNodes) {
+  public void setMatchedNodes(Set<TSchemaNode> matchedNodes) {
     this.matchedNodes = matchedNodes;
   }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandalonePartitionFetcher.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandalonePartitionFetcher.java
index 59bd18ec6f..dab21c0fe2 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandalonePartitionFetcher.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandalonePartitionFetcher.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.mpp.plan.analyze;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.partition.DataPartition;
 import org.apache.iotdb.commons.partition.DataPartitionQueryParam;
@@ -32,6 +33,7 @@ import org.apache.iotdb.db.engine.StorageEngineV2;
 import org.apache.iotdb.db.exception.DataRegionException;
 import org.apache.iotdb.db.exception.sql.StatementAnalyzeException;
 import org.apache.iotdb.db.localconfignode.LocalConfigNode;
+import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.db.metadata.utils.MetaUtils;
 import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
 import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq;
@@ -94,12 +96,12 @@ public class StandalonePartitionFetcher implements 
IPartitionFetcher {
       PathPatternTree patternTree, Integer level) {
     try {
       patternTree.constructTree();
-      Set<String> matchedNodes = new HashSet<>();
+      Set<TSchemaNode> matchedNodes = new HashSet<>();
       Set<PartialPath> involvedStorageGroup = new HashSet<>();
       if (level == null) {
         // Get Child
         for (PartialPath pathPattern : patternTree.getAllPathPatterns()) {
-          Pair<Set<String>, Set<PartialPath>> result =
+          Pair<Set<TSchemaNode>, Set<PartialPath>> result =
               localConfigNode.getChildNodePathInNextLevel(pathPattern);
           matchedNodes.addAll(result.left);
           involvedStorageGroup.addAll(result.right);
@@ -109,7 +111,11 @@ public class StandalonePartitionFetcher implements 
IPartitionFetcher {
           Pair<List<PartialPath>, Set<PartialPath>> result =
               localConfigNode.getNodesListInGivenLevel(pathPattern, level, 
false, null);
           matchedNodes.addAll(
-              
result.left.stream().map(PartialPath::getFullPath).collect(Collectors.toList()));
+              result.left.stream()
+                  .map(
+                      path ->
+                          new TSchemaNode(path.getFullPath(), 
MNodeType.UNIMPLEMENT.getNodeType()))
+                  .collect(Collectors.toList()));
           involvedStorageGroup.addAll(result.right);
         }
       }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/memory/StatementMemorySourceVisitor.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/memory/StatementMemorySourceVisitor.java
index 40927caf1a..1fcca2f319 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/memory/StatementMemorySourceVisitor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/memory/StatementMemorySourceVisitor.java
@@ -19,9 +19,11 @@
 
 package org.apache.iotdb.db.mpp.plan.execution.memory;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
 import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
@@ -49,6 +51,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.stream.Collectors;
 
 public class StatementMemorySourceVisitor
     extends StatementVisitor<StatementMemorySource, 
StatementMemorySourceContext> {
@@ -91,11 +94,26 @@ public class StatementMemorySourceVisitor
       ShowChildPathsStatement showChildPathsStatement, 
StatementMemorySourceContext context) {
     TsBlockBuilder tsBlockBuilder =
         new 
TsBlockBuilder(HeaderConstant.showChildPathsHeader.getRespDataTypes());
-    Set<String> matchedChildPaths = new 
TreeSet<>(context.getAnalysis().getMatchedNodes());
-    matchedChildPaths.forEach(
-        path -> {
+    Set<TSchemaNode> matchedChildPaths = 
context.getAnalysis().getMatchedNodes();
+
+    // sort by node type
+    Set<TSchemaNode> sortSet =
+        new TreeSet<>(
+            (o1, o2) -> {
+              if (o1.getNodeType() == o2.getNodeType()) {
+                return o1.getNodeName().compareTo(o2.getNodeName());
+              }
+              return o1.getNodeType() - o2.getNodeType();
+            });
+    sortSet.addAll(matchedChildPaths);
+    sortSet.forEach(
+        node -> {
           tsBlockBuilder.getTimeColumnBuilder().writeLong(0L);
-          tsBlockBuilder.getColumnBuilder(0).writeBinary(new Binary(path));
+          tsBlockBuilder.getColumnBuilder(0).writeBinary(new 
Binary(node.getNodeName()));
+          tsBlockBuilder
+              .getColumnBuilder(1)
+              .writeBinary(
+                  new 
Binary(MNodeType.getMNodeType(node.getNodeType()).getNodeTypeName()));
           tsBlockBuilder.declarePosition();
         });
     return new StatementMemorySource(
@@ -107,7 +125,11 @@ public class StatementMemorySourceVisitor
       ShowChildNodesStatement showChildNodesStatement, 
StatementMemorySourceContext context) {
     TsBlockBuilder tsBlockBuilder =
         new 
TsBlockBuilder(HeaderConstant.showChildNodesHeader.getRespDataTypes());
-    Set<String> matchedChildNodes = new 
TreeSet<>(context.getAnalysis().getMatchedNodes());
+    Set<String> matchedChildNodes =
+        new TreeSet<>(
+            context.getAnalysis().getMatchedNodes().stream()
+                .map(node -> node.getNodeName())
+                .collect(Collectors.toSet()));
     matchedChildNodes.forEach(
         node -> {
           try {
@@ -141,7 +163,10 @@ public class StatementMemorySourceVisitor
       CountNodesStatement countStatement, StatementMemorySourceContext 
context) {
     TsBlockBuilder tsBlockBuilder =
         new TsBlockBuilder(HeaderConstant.countNodesHeader.getRespDataTypes());
-    Set<String> matchedChildNodes = new 
TreeSet<>(context.getAnalysis().getMatchedNodes());
+    Set<String> matchedChildNodes =
+        context.getAnalysis().getMatchedNodes().stream()
+            .map(node -> node.getNodeName())
+            .collect(Collectors.toSet());
     tsBlockBuilder.getTimeColumnBuilder().writeLong(0L);
     tsBlockBuilder.getColumnBuilder(0).writeInt(matchedChildNodes.size());
     tsBlockBuilder.declarePosition();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
index 2eb94df12f..83b06b310f 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanBuilder.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.mpp.plan.planner;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.path.AlignedPath;
@@ -790,7 +791,7 @@ public class LogicalPlanBuilder {
     return this;
   }
 
-  public LogicalPlanBuilder planNodeManagementMemoryMerge(Set<String> data) {
+  public LogicalPlanBuilder planNodeManagementMemoryMerge(Set<TSchemaNode> 
data) {
     NodeManagementMemoryMergeNode memorySourceNode =
         new 
NodeManagementMemoryMergeNode(context.getQueryId().genPlanNodeId(), data);
     memorySourceNode.addChild(this.getRoot());
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/NodeManagementMemoryMergeNode.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/NodeManagementMemoryMergeNode.java
index a83518d6f1..9756a08e39 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/NodeManagementMemoryMergeNode.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/NodeManagementMemoryMergeNode.java
@@ -19,6 +19,8 @@
 
 package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.read;
 
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
+import org.apache.iotdb.commons.utils.ThriftCommonsSerDeUtils;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
@@ -36,16 +38,16 @@ import java.util.List;
 import java.util.Set;
 
 public class NodeManagementMemoryMergeNode extends ProcessNode {
-  private final Set<String> data;
+  private final Set<TSchemaNode> data;
 
   private PlanNode child;
 
-  public NodeManagementMemoryMergeNode(PlanNodeId id, Set<String> data) {
+  public NodeManagementMemoryMergeNode(PlanNodeId id, Set<TSchemaNode> data) {
     super(id);
     this.data = data;
   }
 
-  public Set<String> getData() {
+  public Set<TSchemaNode> getData() {
     return data;
   }
 
@@ -88,7 +90,7 @@ public class NodeManagementMemoryMergeNode extends 
ProcessNode {
     PlanNodeType.NODE_MANAGEMENT_MEMORY_MERGE.serialize(byteBuffer);
     int size = data.size();
     ReadWriteIOUtils.write(size, byteBuffer);
-    data.forEach(node -> ReadWriteIOUtils.write(node, byteBuffer));
+    data.forEach(node -> ThriftCommonsSerDeUtils.serializeTSchemaNode(node, 
byteBuffer));
   }
 
   @Override
@@ -96,16 +98,14 @@ public class NodeManagementMemoryMergeNode extends 
ProcessNode {
     PlanNodeType.NODE_MANAGEMENT_MEMORY_MERGE.serialize(stream);
     int size = data.size();
     ReadWriteIOUtils.write(size, stream);
-    for (String node : data) {
-      ReadWriteIOUtils.write(node, stream);
-    }
+    data.forEach(node -> ThriftCommonsSerDeUtils.serializeTSchemaNode(node, 
stream));
   }
 
   public static NodeManagementMemoryMergeNode deserialize(ByteBuffer 
byteBuffer) {
-    Set<String> data = new HashSet<>();
+    Set<TSchemaNode> data = new HashSet<>();
     int size = byteBuffer.getInt();
     for (int i = 0; i < size; i++) {
-      data.add(ReadWriteIOUtils.readString(byteBuffer));
+      data.add(ThriftCommonsSerDeUtils.deserializeTSchemaNode(byteBuffer));
     }
     PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
     return new NodeManagementMemoryMergeNode(planNodeId, data);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java 
b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index 2bb776a8df..28d82bc6b4 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -19,6 +19,7 @@
 package org.apache.iotdb.db.qp.executor;
 
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.auth.AuthException;
 import org.apache.iotdb.commons.auth.entity.PathPrivilege;
 import org.apache.iotdb.commons.auth.entity.PrivilegeType;
@@ -64,6 +65,7 @@ import org.apache.iotdb.db.exception.sync.PipeServerException;
 import org.apache.iotdb.db.exception.sync.PipeSinkException;
 import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
 import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
+import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.db.metadata.path.MeasurementPath;
 import org.apache.iotdb.db.metadata.utils.MetaUtils;
 import org.apache.iotdb.db.qp.logical.Operator;
@@ -208,11 +210,13 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.TreeSet;
 import java.util.concurrent.Future;
 import java.util.concurrent.ThreadPoolExecutor;
 
 import static org.apache.iotdb.commons.conf.IoTDBConstant.COLUMN_CHILD_NODES;
 import static org.apache.iotdb.commons.conf.IoTDBConstant.COLUMN_CHILD_PATHS;
+import static 
org.apache.iotdb.commons.conf.IoTDBConstant.COLUMN_CHILD_PATHS_TYPES;
 import static org.apache.iotdb.commons.conf.IoTDBConstant.COLUMN_COLUMN;
 import static 
org.apache.iotdb.commons.conf.IoTDBConstant.COLUMN_CONTINUOUS_QUERY_BOUNDARY;
 import static 
org.apache.iotdb.commons.conf.IoTDBConstant.COLUMN_CONTINUOUS_QUERY_EVERY_INTERVAL;
@@ -892,22 +896,38 @@ public class PlanExecutor implements IPlanExecutor {
 
   private QueryDataSet processShowChildPaths(ShowChildPathsPlan 
showChildPathsPlan)
       throws MetadataException {
-    Set<String> childPathsList = 
getPathNextChildren(showChildPathsPlan.getPath());
+    Set<TSchemaNode> childPathsList = 
getPathNextChildren(showChildPathsPlan.getPath());
+
+    // sort by node type
+    Set<TSchemaNode> sortSet =
+        new TreeSet<>(
+            (o1, o2) -> {
+              if (o1.getNodeType() == o2.getNodeType()) {
+                return o1.getNodeName().compareTo(o2.getNodeName());
+              }
+              return o1.getNodeType() - o2.getNodeType();
+            });
+    sortSet.addAll(childPathsList);
     ListDataSet listDataSet =
         new ListDataSet(
-            Collections.singletonList(new PartialPath(COLUMN_CHILD_PATHS, 
false)),
-            Collections.singletonList(TSDataType.TEXT));
-    for (String s : childPathsList) {
+            Arrays.asList(
+                new PartialPath(COLUMN_CHILD_PATHS, false),
+                new PartialPath(COLUMN_CHILD_PATHS_TYPES, false)),
+            Arrays.asList(TSDataType.TEXT, TSDataType.TEXT));
+    for (TSchemaNode node : sortSet) {
       RowRecord record = new RowRecord(0);
       Field field = new Field(TSDataType.TEXT);
-      field.setBinaryV(new Binary(s));
+      field.setBinaryV(new Binary(node.getNodeName()));
+      record.addField(field);
+      field = new Field(TSDataType.TEXT);
+      field.setBinaryV(new 
Binary(MNodeType.getMNodeType(node.getNodeType()).getNodeTypeName()));
       record.addField(field);
       listDataSet.putRecord(record);
     }
     return listDataSet;
   }
 
-  protected Set<String> getPathNextChildren(PartialPath path) throws 
MetadataException {
+  protected Set<TSchemaNode> getPathNextChildren(PartialPath path) throws 
MetadataException {
     return IoTDB.schemaProcessor.getChildNodePathInNextLevel(path);
   }
 
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/SchemaBasicTest.java 
b/server/src/test/java/org/apache/iotdb/db/metadata/SchemaBasicTest.java
index 3e56b1ba4a..a74cf73a4e 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/SchemaBasicTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/SchemaBasicTest.java
@@ -783,14 +783,14 @@ public abstract class SchemaBasicTest {
     LocalSchemaProcessor schemaProcessor = IoTDB.schemaProcessor;
     String[] res =
         new String[] {
-          "[root.laptop, root.vehicle]",
-          "[root.laptop.b1, root.laptop.b2]",
-          "[root.laptop.b1.d1, root.laptop.b1.d2]",
-          "[root.laptop.b1, root.laptop.b2, root.vehicle.b1, root.vehicle.b2]",
-          "[root.laptop.b1.d1, root.laptop.b1.d2, root.vehicle.b1.d0, 
root.vehicle.b1.d2, root.vehicle.b1.d3]",
-          "[root.laptop.b1.d1, root.laptop.b1.d2]",
-          "[root.vehicle.b1.d0, root.vehicle.b1.d2, root.vehicle.b1.d3, 
root.vehicle.b2.d0]",
-          "[root.laptop.b1.d1.s0, root.laptop.b1.d1.s1, root.laptop.b1.d2.s0, 
root.laptop.b2.d1.s1, root.laptop.b2.d1.s3, root.laptop.b2.d2.s2]",
+          "[TSchemaNode(nodeName:root.laptop, nodeType:2), 
TSchemaNode(nodeName:root.vehicle, nodeType:2)]",
+          "[TSchemaNode(nodeName:root.laptop.b1, nodeType:3), 
TSchemaNode(nodeName:root.laptop.b2, nodeType:3)]",
+          "[TSchemaNode(nodeName:root.laptop.b1.d1, nodeType:4), 
TSchemaNode(nodeName:root.laptop.b1.d2, nodeType:4)]",
+          "[TSchemaNode(nodeName:root.laptop.b1, nodeType:3), 
TSchemaNode(nodeName:root.laptop.b2, nodeType:3), 
TSchemaNode(nodeName:root.vehicle.b1, nodeType:3), 
TSchemaNode(nodeName:root.vehicle.b2, nodeType:3)]",
+          "[TSchemaNode(nodeName:root.laptop.b1.d1, nodeType:4), 
TSchemaNode(nodeName:root.laptop.b1.d2, nodeType:4), 
TSchemaNode(nodeName:root.vehicle.b1.d0, nodeType:4), 
TSchemaNode(nodeName:root.vehicle.b1.d2, nodeType:4), 
TSchemaNode(nodeName:root.vehicle.b1.d3, nodeType:4)]",
+          "[TSchemaNode(nodeName:root.laptop.b1.d1, nodeType:4), 
TSchemaNode(nodeName:root.laptop.b1.d2, nodeType:4)]",
+          "[TSchemaNode(nodeName:root.vehicle.b1.d0, nodeType:4), 
TSchemaNode(nodeName:root.vehicle.b1.d2, nodeType:4), 
TSchemaNode(nodeName:root.vehicle.b1.d3, nodeType:4), 
TSchemaNode(nodeName:root.vehicle.b2.d0, nodeType:4)]",
+          "[TSchemaNode(nodeName:root.laptop.b1.d1.s0, nodeType:5), 
TSchemaNode(nodeName:root.laptop.b1.d1.s1, nodeType:5), 
TSchemaNode(nodeName:root.laptop.b1.d2.s0, nodeType:5), 
TSchemaNode(nodeName:root.laptop.b2.d1.s1, nodeType:5), 
TSchemaNode(nodeName:root.laptop.b2.d1.s3, nodeType:5), 
TSchemaNode(nodeName:root.laptop.b2.d2.s2, nodeType:5)]",
           "[]"
         };
 
diff --git 
a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/read/NodeManagementMemoryMergeNodeSerdeTest.java
 
b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/read/NodeManagementMemoryMergeNodeSerdeTest.java
index 21ed8442e2..c885919c74 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/read/NodeManagementMemoryMergeNodeSerdeTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/read/NodeManagementMemoryMergeNodeSerdeTest.java
@@ -20,8 +20,10 @@
 package org.apache.iotdb.db.mpp.plan.plan.node.metadata.read;
 
 import org.apache.iotdb.common.rpc.thrift.TEndPoint;
+import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.db.mpp.common.FragmentInstanceId;
 import org.apache.iotdb.db.mpp.common.PlanFragmentId;
 import org.apache.iotdb.db.mpp.plan.plan.node.PlanNodeDeserializeHelper;
@@ -82,9 +84,9 @@ public class NodeManagementMemoryMergeNodeSerdeTest {
 
   private NodeManagementMemoryMergeNode createNodeManagementMemoryMergeNode()
       throws IllegalPathException {
-    Set<String> data = new HashSet<>();
-    data.add("root.ln");
-    data.add("root.abc");
+    Set<TSchemaNode> data = new HashSet<>();
+    data.add(new TSchemaNode("root.ln", 
MNodeType.STORAGE_GROUP.getNodeType()));
+    data.add(new TSchemaNode("root.abc", 
MNodeType.STORAGE_GROUP.getNodeType()));
     NodeManagementMemoryMergeNode memorySourceNode =
         new NodeManagementMemoryMergeNode(new 
PlanNodeId("nodeManagementMerge"), data);
     SchemaQueryMergeNode schemaMergeNode = new SchemaQueryMergeNode(new 
PlanNodeId("schemaMerge"));
diff --git 
a/server/src/test/java/org/apache/iotdb/db/protocol/rest/IoTDBRestServiceTest.java
 
b/server/src/test/java/org/apache/iotdb/db/protocol/rest/IoTDBRestServiceTest.java
index 2416712b98..aa19aec39d 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/protocol/rest/IoTDBRestServiceTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/protocol/rest/IoTDBRestServiceTest.java
@@ -467,6 +467,7 @@ public class IoTDBRestServiceTest {
         new ArrayList<Object>() {
           {
             add("child paths");
+            add("node types");
           }
         };
     List<Object> values1 =
diff --git 
a/server/src/test/java/org/apache/iotdb/db/query/dataset/ListDataSetTest.java 
b/server/src/test/java/org/apache/iotdb/db/query/dataset/ListDataSetTest.java
index 74e93ab8c4..01ee5e5e99 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/query/dataset/ListDataSetTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/query/dataset/ListDataSetTest.java
@@ -93,11 +93,14 @@ public class ListDataSetTest {
       throws QueryProcessException, TException, StorageEngineException,
           QueryFilterOptimizationException, MetadataException, IOException, 
InterruptedException,
           SQLException {
-    String[] results = new String[] {"0\troot.test.d0", "0\troot.test.d1", 
"0\troot.test.d2"};
+    String[] results =
+        new String[] {
+          "0\troot.test.d0\tDEVICE", "0\troot.test.d1\tDEVICE", 
"0\troot.test.d2\tDEVICE"
+        };
     PhysicalPlan plan = processor.parseSQLToPhysicalPlan("show child paths 
root.test");
     QueryDataSet dataSet = queryExecutor.processQuery(plan, 
EnvironmentUtils.TEST_QUERY_CONTEXT);
     Assert.assertTrue(dataSet instanceof ListDataSet);
-    Assert.assertEquals("[child paths]", dataSet.getPaths().toString());
+    Assert.assertEquals("[child paths, node types]", 
dataSet.getPaths().toString());
     int i = 0;
     while (dataSet.hasNext()) {
       RowRecord record = dataSet.next();
diff --git a/thrift-commons/src/main/thrift/common.thrift 
b/thrift-commons/src/main/thrift/common.thrift
index b83bd1e437..00df635f8c 100644
--- a/thrift-commons/src/main/thrift/common.thrift
+++ b/thrift-commons/src/main/thrift/common.thrift
@@ -123,3 +123,9 @@ struct TSetTTLReq {
   1: required string storageGroup
   2: required i64 TTL
 }
+
+// for node management
+struct TSchemaNode {
+  1: required string nodeName
+  2: required byte nodeType
+}
diff --git a/thrift-confignode/src/main/thrift/confignode.thrift 
b/thrift-confignode/src/main/thrift/confignode.thrift
index 4b9aca0af7..9f1676baf7 100644
--- a/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/thrift-confignode/src/main/thrift/confignode.thrift
@@ -147,7 +147,7 @@ struct TSchemaNodeManagementResp {
   1: required common.TSStatus status
   // map<StorageGroupName, map<TSeriesPartitionSlot, TRegionReplicaSet>>
   2: optional map<string, map<common.TSeriesPartitionSlot, 
common.TRegionReplicaSet>> schemaRegionMap
-  3: optional set<string> matchedNode
+  3: optional set<common.TSchemaNode> matchedNode
 }
 
 // Data

Reply via email to