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

jackietien 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 1d116161506 Fixed multiple bugs related to schema (#17405)
1d116161506 is described below

commit 1d116161506a9263d569c74b061671b954618228
Author: Caideyipi <[email protected]>
AuthorDate: Thu Apr 2 09:09:34 2026 +0800

    Fixed multiple bugs related to schema (#17405)
---
 .../persistence/schema/mnode/impl/ConfigTableNode.java   |  4 ++++
 .../impl/schema/table/DeleteDevicesProcedure.java        |  1 -
 .../plan/analyze/schema/ClusterSchemaFetcher.java        |  8 +++++---
 .../plan/analyze/schema/NormalSchemaFetcher.java         | 16 +++++++---------
 .../metadata/fetcher/TableDeviceSchemaFetcher.java       | 12 ++++++------
 .../{ => fetcher}/cache/DeviceSchemaRequestCache.java    |  2 +-
 .../metadata/fetcher/cache/TableDeviceSchemaCache.java   |  4 +++-
 .../queryengine/plan/relational/sql/ast/Expression.java  |  2 ++
 .../relational/sql/ast/RelationalAuthorStatement.java    |  2 +-
 .../schemaengine/rescon/MemSchemaRegionStatistics.java   |  4 +++-
 .../schemaengine/schemaregion/SchemaRegionPlanType.java  |  2 +-
 .../schemaregion/impl/SchemaRegionMemoryImpl.java        |  2 +-
 .../mem/mnode/iterator/AbstractTraverserIterator.java    |  3 +++
 .../impl/mem/mnode/iterator/MemoryTraverserIterator.java | 14 ++++++++++----
 .../pbtree/mnode/iterator/CachedTraverserIterator.java   |  7 +++++++
 .../mtree/impl/pbtree/schemafile/WrappedSegment.java     | 12 +++++-------
 .../schemaRegion/SchemaRegionManagementTest.java         | 12 ++++++++++++
 .../apache/iotdb/commons/schema/filter/SchemaFilter.java |  3 +++
 .../org/apache/iotdb/commons/schema/ttl/TTLCache.java    |  3 +++
 19 files changed, 77 insertions(+), 36 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/impl/ConfigTableNode.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/impl/ConfigTableNode.java
index b95b50ff0be..196a0ed47e9 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/impl/ConfigTableNode.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/impl/ConfigTableNode.java
@@ -101,6 +101,10 @@ public class ConfigTableNode implements IConfigMNode {
   @Override
   public void setName(final String name) {
     tableNodeInfo.setName(name);
+
+    // Full path ends with name, so it needs to be updated when name changes
+    // Clear cache and compute again when fullPath is next accessed
+    this.fullPath = null;
   }
 
   @Override
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DeleteDevicesProcedure.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DeleteDevicesProcedure.java
index b78b99539ed..89b81613172 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DeleteDevicesProcedure.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DeleteDevicesProcedure.java
@@ -204,7 +204,6 @@ public class DeleteDevicesProcedure extends 
AbstractAlterOrDropTableProcedure<De
             };
     deleteDevicesExecutor.execute();
 
-    setNextState(CONSTRUCT_BLACK_LIST);
     deletedDevicesNum =
         !isFailed()
             ? deleteDevicesExecutor.getSuccessResult().stream()
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetcher.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetcher.java
index 1be03d479b6..f4ae6c679d0 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetcher.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetcher.java
@@ -329,9 +329,11 @@ public class ClusterSchemaFetcher implements 
ISchemaFetcher {
       if (!config.isAutoCreateSchemaEnabled()) {
         // disable auto-create for non-system series
         indexOfDevicesWithMissingMeasurements.removeIf(
-            i -> !devicePathList.get(i).startsWith("root." + 
SystemConstant.SYSTEM_PREFIX_KEY));
-        indexOfDevicesWithMissingMeasurements.removeIf(
-            i -> !devicePathList.get(i).startsWith("root." + 
SystemConstant.AUDIT_PREFIX_KEY));
+            i ->
+                !devicePathList.get(i).startsWith("root." + 
SystemConstant.SYSTEM_PREFIX_KEY)
+                    && !devicePathList
+                        .get(i)
+                        .startsWith("root." + 
SystemConstant.AUDIT_PREFIX_KEY));
         if (indexOfDevicesWithMissingMeasurements.isEmpty()) {
           return schemaTree;
         }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/NormalSchemaFetcher.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/NormalSchemaFetcher.java
index 59bb199acf0..d7d5275ef55 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/NormalSchemaFetcher.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/NormalSchemaFetcher.java
@@ -330,15 +330,13 @@ class NormalSchemaFetcher {
       indexOfDevicesNeedAutoCreateSchema.removeIf(
           i ->
               !schemaComputationWithAutoCreationList
-                  .get(i)
-                  .getDevicePath()
-                  .startsWith("root." + SystemConstant.SYSTEM_PREFIX_KEY));
-      indexOfDevicesNeedAutoCreateSchema.removeIf(
-          i ->
-              !schemaComputationWithAutoCreationList
-                  .get(i)
-                  .getDevicePath()
-                  .startsWith("root." + SystemConstant.AUDIT_PREFIX_KEY));
+                      .get(i)
+                      .getDevicePath()
+                      .startsWith("root." + SystemConstant.SYSTEM_PREFIX_KEY)
+                  && !schemaComputationWithAutoCreationList
+                      .get(i)
+                      .getDevicePath()
+                      .startsWith("root." + SystemConstant.AUDIT_PREFIX_KEY));
     }
 
     // [Step 5] Auto Create and process the missing schema
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
index e6c6048fa6b..be8ddca051b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
@@ -38,7 +38,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.schema
 import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.AlignedDeviceEntry;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.DeviceEntry;
 import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.NonAlignedDeviceEntry;
-import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.cache.DeviceSchemaRequestCache;
+import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.DeviceSchemaRequestCache;
 import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.IDeviceSchema;
 import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.TableDeviceSchemaCache;
 import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache.TreeDeviceNormalSchema;
@@ -169,7 +169,7 @@ public class TableDeviceSchemaFetcher {
         for (int i = 0; i < tsBlock.get().getPositionCount(); i++) {
           final String[] nodes = new String[tagLength + 1];
           final Map<String, Binary> attributeMap = new HashMap<>();
-          constructNodsArrayAndAttributeMap(
+          constructNodesArrayAndAttributeMap(
               attributeMap, nodes, table, columnHeaderList, columns, 
tableInstance, i);
 
           
fetchedDeviceSchema.put(IDeviceID.Factory.DEFAULT_FACTORY.create(nodes), 
attributeMap);
@@ -566,7 +566,7 @@ public class TableDeviceSchemaFetcher {
     for (int i = 0; i < tsBlock.getPositionCount(); i++) {
       final String[] nodes = new String[tableInstance.getTagNum() + 1];
       final Map<String, Binary> attributeMap = new HashMap<>();
-      constructNodsArrayAndAttributeMap(
+      constructNodesArrayAndAttributeMap(
           attributeMap,
           nodes,
           tableInstance.getTableName(),
@@ -597,7 +597,7 @@ public class TableDeviceSchemaFetcher {
     final Column[] columns = tsBlock.getValueColumns();
     for (int i = 0; i < tsBlock.getPositionCount(); i++) {
       final String[] nodes = new String[tableInstance.getTagNum()];
-      constructNodsArrayAndAttributeMap(
+      constructNodesArrayAndAttributeMap(
           Collections.emptyMap(), nodes, null, columnHeaderList, columns, 
tableInstance, i);
       final IDeviceID deviceID =
           DataNodeTreeViewSchemaUtils.convertToIDeviceID(tableInstance, nodes);
@@ -608,13 +608,13 @@ public class TableDeviceSchemaFetcher {
       mppQueryContext.reserveMemoryForFrontEnd(deviceEntry.ramBytesUsed());
       deviceEntryMap
           .computeIfAbsent(
-              columns[columns.length - 
1].getBinary(0).getStringValue(TSFileConfig.STRING_CHARSET),
+              columns[columns.length - 
1].getBinary(i).getStringValue(TSFileConfig.STRING_CHARSET),
               k -> new ArrayList<>())
           .add(deviceEntry);
     }
   }
 
-  private void constructNodsArrayAndAttributeMap(
+  private void constructNodesArrayAndAttributeMap(
       final Map<String, Binary> attributeMap,
       final String[] nodes,
       final String tableName,
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/cache/DeviceSchemaRequestCache.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/DeviceSchemaRequestCache.java
similarity index 99%
rename from 
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/cache/DeviceSchemaRequestCache.java
rename to 
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/DeviceSchemaRequestCache.java
index b2711779fcc..e612d633653 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/cache/DeviceSchemaRequestCache.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/DeviceSchemaRequestCache.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.queryengine.plan.relational.metadata.cache;
+package org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher.cache;
 
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.FetchDevice;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java
index ebbb137a2d8..3e599355098 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java
@@ -37,6 +37,7 @@ import 
org.apache.iotdb.db.queryengine.plan.analyze.cache.schema.dualkeycache.im
 import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.QualifiedObjectName;
 import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegion;
 import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
+import org.apache.iotdb.rpc.subscription.annotation.TableModel;
 
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.IDeviceID;
@@ -667,6 +668,7 @@ public class TableDeviceSchemaCache {
     }
   }
 
+  @TableModel
   public void invalidate(
       final String database,
       final String tableName,
@@ -680,7 +682,7 @@ public class TableDeviceSchemaCache {
           isAttributeColumn
               ? entry -> -entry.invalidateAttributeColumn(columnName)
               : entry -> -entry.invalidateLastCache(columnName);
-      dualKeyCache.update(new TableId(null, tableName), deviceID -> true, 
updateFunction);
+      dualKeyCache.update(new TableId(database, tableName), deviceID -> true, 
updateFunction);
     } finally {
       readWriteLock.writeLock().unlock();
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Expression.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Expression.java
index 26d12beecb1..9ebe61cdb35 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Expression.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/Expression.java
@@ -158,6 +158,8 @@ public abstract class Expression extends Node {
       case 28:
         expression = new WhenClause(byteBuffer);
         break;
+      // 29: CurrentDatabase, 30: CurrentUser
+      // Do not deserialize here and throw exception because it's unexpected
       case 31:
         expression = new Row(byteBuffer);
         break;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RelationalAuthorStatement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RelationalAuthorStatement.java
index 638de594395..8fbf1339e41 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RelationalAuthorStatement.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RelationalAuthorStatement.java
@@ -380,7 +380,7 @@ public class RelationalAuthorStatement extends Statement {
         }
         break;
       case DROP_ROLE:
-        if (AuthorityChecker.SUPER_USER.equals(userName)) {
+        if (AuthorityChecker.SUPER_USER.equals(roleName)) {
           return AuthorityChecker.getTSStatus(false, "Cannot drop role with 
admin name");
         }
         break;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/MemSchemaRegionStatistics.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/MemSchemaRegionStatistics.java
index e5ab6e7ba95..79babd53909 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/MemSchemaRegionStatistics.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/MemSchemaRegionStatistics.java
@@ -214,10 +214,12 @@ public class MemSchemaRegionStatistics implements 
ISchemaRegionStatistics {
     memoryUsage.getAndSet(0);
     measurementNumber.getAndSet(0);
     devicesNumber.getAndSet(0);
-    viewNumber.getAndAdd(0);
+    viewNumber.getAndSet(0);
     templateUsage.forEach(
         (templateId, cnt) -> 
schemaEngineStatistics.deactivateTemplate(templateId, cnt));
     templateUsage.clear();
+    tableDeviceNumber.clear();
+    tableAttributeMemory.clear();
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanType.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanType.java
index b0d41c725ee..ff1d118d545 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanType.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanType.java
@@ -39,7 +39,7 @@ public enum SchemaRegionPlanType {
   ACTIVATE_TEMPLATE_IN_CLUSTER((byte) 63),
   PRE_DELETE_TIMESERIES_IN_CLUSTER((byte) 64),
   ROLLBACK_PRE_DELETE_TIMESERIES((byte) 65),
-  ALTER_ENCODING_COMPRESSOR((byte) 66),
+  ALTER_ENCODING_COMPRESSOR((byte) 80),
 
   // endregion
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
index 0719835fe7a..c5c3b7f57b8 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
@@ -1002,7 +1002,7 @@ public class SchemaRegionMemoryImpl implements 
ISchemaRegion {
       writeToMLog(plan);
     }
     // update statistics
-    regionStatistics.addView(1L);
+    regionStatistics.addView(pathList.size());
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/AbstractTraverserIterator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/AbstractTraverserIterator.java
index 5f72358418b..5e5788fa5f9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/AbstractTraverserIterator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/AbstractTraverserIterator.java
@@ -107,12 +107,15 @@ public abstract class AbstractTraverserIterator<N extends 
IMNode<N>> implements
       if (skipPreDeletedSchema
           && nextMatchedNode.isMeasurement()
           && nextMatchedNode.getAsMeasurementMNode().isPreDeleted()) {
+        releaseSkippedNode(nextMatchedNode);
         nextMatchedNode = null;
       }
     }
     return true;
   }
 
+  protected abstract void releaseSkippedNode(final N node);
+
   @Override
   public N next() {
     if (!hasNext()) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/MemoryTraverserIterator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/MemoryTraverserIterator.java
index c222d5ecd86..8a0dd8da31b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/MemoryTraverserIterator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/MemoryTraverserIterator.java
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.iterator;
 
 import org.apache.iotdb.commons.exception.MetadataException;
@@ -30,11 +31,16 @@ import java.util.Map;
 // only use for IConfigMNode and IMemMNode
 public class MemoryTraverserIterator<N extends IMNode<N>> extends 
AbstractTraverserIterator<N> {
   public MemoryTraverserIterator(
-      IMTreeStore<N> store,
-      IDeviceMNode<N> parent,
-      Map<Integer, Template> templateMap,
-      IMNodeFactory<N> nodeFactory)
+      final IMTreeStore<N> store,
+      final IDeviceMNode<N> parent,
+      final Map<Integer, Template> templateMap,
+      final IMNodeFactory<N> nodeFactory)
       throws MetadataException {
     super(store, parent, templateMap, nodeFactory);
   }
+
+  @Override
+  protected void releaseSkippedNode(final N node) {
+    // Do nothing
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/iterator/CachedTraverserIterator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/iterator/CachedTraverserIterator.java
index 529ddd44658..0075e7da6e6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/iterator/CachedTraverserIterator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/iterator/CachedTraverserIterator.java
@@ -48,4 +48,11 @@ public class CachedTraverserIterator extends 
AbstractTraverserIterator<ICachedMN
     }
     super.close();
   }
+
+  @Override
+  protected void releaseSkippedNode(final ICachedMNode node) {
+    if (usingDirectChildrenIterator) {
+      store.unPin(node);
+    }
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/schemafile/WrappedSegment.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/schemafile/WrappedSegment.java
index 8d9d4032883..0e77214afa7 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/schemafile/WrappedSegment.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/schemafile/WrappedSegment.java
@@ -105,17 +105,16 @@ public class WrappedSegment implements 
ISegment<ByteBuffer, ICachedMNode> {
     }
   }
 
-  public WrappedSegment(ByteBuffer buffer) throws RecordDuplicatedException {
+  public WrappedSegment(ByteBuffer buffer) {
     this(buffer, true);
   }
 
   @TestOnly
-  public WrappedSegment(int size) throws RecordDuplicatedException {
+  public WrappedSegment(int size) {
     this(ByteBuffer.allocate(size));
   }
 
-  public static ISegment<ByteBuffer, ICachedMNode> initAsSegment(ByteBuffer 
buffer)
-      throws RecordDuplicatedException {
+  public static ISegment<ByteBuffer, ICachedMNode> initAsSegment(ByteBuffer 
buffer) {
     if (buffer == null) {
       return null;
     }
@@ -559,7 +558,6 @@ public class WrappedSegment implements ISegment<ByteBuffer, 
ICachedMNode> {
 
   @Override
   public int updateRecord(String key, ByteBuffer uBuffer) throws 
MetadataException {
-
     int idx = binarySearchOnKeys(key);
     if (idx < 0) {
       throw new MetadataException(String.format("Record[key:%s] Not Existed.", 
key));
@@ -614,8 +612,8 @@ public class WrappedSegment implements ISegment<ByteBuffer, 
ICachedMNode> {
     }
 
     // shift offsets forward
-    if (idx != recordNum) {
-      int shift = recordNum - idx;
+    if (idx != recordNum - 1) {
+      int shift = recordNum - idx - 1;
       this.buffer.position(SchemaFileConfig.SEG_HEADER_SIZE + idx * 2);
       ShortBuffer lb = this.buffer.asReadOnlyBuffer().asShortBuffer();
       lb.get();
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaRegionManagementTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaRegionManagementTest.java
index 4fae0f9fc0f..38f56b66dd9 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaRegionManagementTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaRegionManagementTest.java
@@ -29,6 +29,7 @@ import org.apache.iotdb.consensus.ConsensusFactory;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegion;
+import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanType;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.ISchemaInfo;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.ITimeSeriesSchemaInfo;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.write.req.SchemaRegionWritePlanFactory;
@@ -41,6 +42,7 @@ import org.junit.Ignore;
 import org.junit.Test;
 
 import java.io.File;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -230,4 +232,14 @@ public class SchemaRegionManagementTest extends 
AbstractSchemaRegionTest {
       
config.setSchemaRegionConsensusProtocolClass(schemaRegionConsensusProtocolClass);
     }
   }
+
+  @Test
+  public void testSchemaRegionPlanType() throws Exception {
+    Assert.assertEquals(
+        SchemaRegionPlanType.values().length,
+        Arrays.stream(SchemaRegionPlanType.values())
+            .map(SchemaRegionPlanType::getPlanType)
+            .distinct()
+            .count());
+  }
 }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/filter/SchemaFilter.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/filter/SchemaFilter.java
index bb993c172e6..cdfd4164b8e 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/filter/SchemaFilter.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/filter/SchemaFilter.java
@@ -119,6 +119,9 @@ public abstract class SchemaFilter implements Accountable {
       final List<SchemaFilter> result,
       final SchemaFilter schemaFilter,
       final SchemaFilterType filterType) {
+    if (schemaFilter == null) {
+      return;
+    }
     if (schemaFilter.getSchemaFilterType().equals(filterType)) {
       result.add(schemaFilter);
     }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/ttl/TTLCache.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/ttl/TTLCache.java
index 3bc72ed0472..d8640bceaa0 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/ttl/TTLCache.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/ttl/TTLCache.java
@@ -339,6 +339,9 @@ public class TTLCache {
   public void clear() {
     ttlCacheTree.removeAllChildren();
     ttlCacheTree.addChild(IoTDBConstant.MULTI_LEVEL_PATH_WILDCARD, 
Long.MAX_VALUE);
+
+    // root.**
+    ttlCount = 1;
   }
 
   static class CacheNode {

Reply via email to