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

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


The following commit(s) were added to refs/heads/master by this push:
     new 2266f92cb9d [fix](hive) Key Hive partition cache by name (#64867)
2266f92cb9d is described below

commit 2266f92cb9d0e3bf32243d1cc0a72157a3ad7f17
Author: Socrates <[email protected]>
AuthorDate: Fri Jun 26 21:49:46 2026 +0800

    [fix](hive) Key Hive partition cache by name (#64867)
    
    Problem Summary: Hive external partition pruning and metadata paths used
    Doris-local partition ids inside `HivePartitionValues`. The original ids
    were generated from partition names, so different partition names could
    collide and cause partition item/value lookups to read the wrong entry.
    This PR changes the Hive external partition cache to use Hive partition
    names as the stable key instead of a local numeric id.
    
    The current implementation stores `Map<String, PartitionItem>` and
    `Map<String, List<String>>` in `HivePartitionValues`, rebuilds sorted
    partition ranges directly from the partition-name keyed items, and
    updates incremental add/drop cache operations by partition name. Callers
    that need all partition values now consume the partition-name keyed maps
    directly.
---
 .../doris/datasource/hive/HMSExternalTable.java    | 26 +++----
 .../apache/doris/datasource/hive/HiveDlaTable.java | 23 +++---
 .../datasource/hive/HiveExternalMetaCache.java     | 86 +++++++---------------
 .../org/apache/doris/planner/HiveTableSink.java    |  2 +-
 .../doris/tablefunction/MetadataGenerator.java     |  4 +-
 .../datasource/hive/HMSExternalTableTest.java      |  9 +--
 .../datasource/hive/HiveMetaStoreCacheTest.java    | 15 ++++
 .../doris/planner/ListPartitionPrunerV2Test.java   | 12 +--
 .../hive/test_hive_partition_values_tvf.out        |  3 +-
 .../hive/test_hive_partition_values_tvf.groovy     |  5 +-
 10 files changed, 74 insertions(+), 111 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSExternalTable.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSExternalTable.java
index 1e42c7878c2..1d234377d83 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSExternalTable.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSExternalTable.java
@@ -77,7 +77,6 @@ import org.apache.doris.thrift.THiveTable;
 import org.apache.doris.thrift.TTableDescriptor;
 import org.apache.doris.thrift.TTableType;
 
-import com.google.common.collect.BiMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -497,14 +496,7 @@ public class HMSExternalTable extends ExternalTable 
implements MTMVRelatedTableI
         }
         HiveExternalMetaCache.HivePartitionValues hivePartitionValues = 
getHivePartitionValues(
                 MvccUtil.getSnapshotFromContext(this));
-        Map<Long, PartitionItem> idToPartitionItem = 
hivePartitionValues.getIdToPartitionItem();
-        // transfer id to name
-        BiMap<Long, String> idToName = 
hivePartitionValues.getPartitionNameToIdMap().inverse();
-        Map<String, PartitionItem> nameToPartitionItem = 
Maps.newHashMapWithExpectedSize(idToPartitionItem.size());
-        for (Entry<Long, PartitionItem> entry : idToPartitionItem.entrySet()) {
-            nameToPartitionItem.put(idToName.get(entry.getKey()), 
entry.getValue());
-        }
-        return nameToPartitionItem;
+        return Maps.newHashMap(hivePartitionValues.getNameToPartitionItem());
     }
 
     public boolean isHiveTransactionalTable() {
@@ -1061,7 +1053,7 @@ public class HMSExternalTable extends ExternalTable 
implements MTMVRelatedTableI
         HiveExternalMetaCache cache = Env.getCurrentEnv().getExtMetaCacheMgr()
                 .hive(getCatalog().getId());
         List<HivePartition> partitionList = 
cache.getAllPartitionsWithCache(this,
-                
Lists.newArrayList(hivePartitionValues.getPartitionValuesMap().values()));
+                
Lists.newArrayList(hivePartitionValues.getNameToPartitionValues().values()));
         if (CollectionUtils.isEmpty(partitionList)) {
             return 0;
         }
@@ -1115,7 +1107,7 @@ public class HMSExternalTable extends ExternalTable 
implements MTMVRelatedTableI
                 return UNKNOWN_ROW_COUNT;
             }
 
-            int totalPartitionSize = partitionValues == null ? 1 : 
partitionValues.getIdToPartitionItem().size();
+            int totalPartitionSize = partitionValues == null ? 1 : 
partitionValues.getNameToPartitionItem().size();
             if (samplePartitionSize != 0 && samplePartitionSize < 
totalPartitionSize) {
                 LOG.info("Table {} sampled {} of {} partitions, sampled size 
is {}",
                         name, samplePartitionSize, totalPartitionSize, 
totalSize);
@@ -1144,11 +1136,11 @@ public class HMSExternalTable extends ExternalTable 
implements MTMVRelatedTableI
             // no need to worry that this call will invalid or refresh the 
cache.
             // because it has enough space to keep partition info of all 
tables in cache.
             partitionValues = getHivePartitionValues(snapshot);
-            if (partitionValues == null || 
partitionValues.getPartitionNameToIdMap() == null) {
+            if (partitionValues == null || 
partitionValues.getNameToPartitionItem() == null) {
                 LOG.warn("Partition values for hive table {} is null", name);
             } else {
                 LOG.info("Partition values size for hive table {} is {}",
-                        name, 
partitionValues.getPartitionNameToIdMap().size());
+                        name, partitionValues.getNameToPartitionItem().size());
             }
         }
         return partitionValues;
@@ -1165,18 +1157,18 @@ public class HMSExternalTable extends ExternalTable 
implements MTMVRelatedTableI
                 .hive(getCatalog().getId());
         List<HivePartition> hivePartitions = Lists.newArrayList();
         if (partitionValues != null) {
-            Map<Long, PartitionItem> idToPartitionItem = 
partitionValues.getIdToPartitionItem();
-            int totalPartitionSize = idToPartitionItem.size();
+            Map<String, PartitionItem> nameToPartitionItem = 
partitionValues.getNameToPartitionItem();
+            int totalPartitionSize = nameToPartitionItem.size();
             Collection<PartitionItem> partitionItems;
             List<List<String>> partitionValuesList;
             // If partition number is too large, randomly choose part of them 
to estimate the whole table.
             if (sampleSize > 0 && sampleSize < totalPartitionSize) {
-                List<PartitionItem> items = new 
ArrayList<>(idToPartitionItem.values());
+                List<PartitionItem> items = new 
ArrayList<>(nameToPartitionItem.values());
                 Collections.shuffle(items);
                 partitionItems = items.subList(0, sampleSize);
                 partitionValuesList = 
Lists.newArrayListWithCapacity(sampleSize);
             } else {
-                partitionItems = idToPartitionItem.values();
+                partitionItems = nameToPartitionItem.values();
                 partitionValuesList = 
Lists.newArrayListWithCapacity(totalPartitionSize);
             }
             for (PartitionItem item : partitionItems) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveDlaTable.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveDlaTable.java
index bfd39c59684..6b0a4c8e65f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveDlaTable.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveDlaTable.java
@@ -72,10 +72,10 @@ public class HiveDlaTable extends HMSDlaTable {
     public MTMVSnapshotIf getPartitionSnapshot(String partitionName, 
MTMVRefreshContext context,
             Optional<MvccSnapshot> snapshot) throws AnalysisException {
         HiveExternalMetaCache.HivePartitionValues hivePartitionValues = 
hmsTable.getHivePartitionValues(snapshot);
-        Long partitionId = 
getPartitionIdByNameOrAnalysisException(partitionName, hivePartitionValues);
+        checkPartitionExists(partitionName, hivePartitionValues);
         HiveExternalMetaCache cache = Env.getCurrentEnv().getExtMetaCacheMgr()
                 .hive(hmsTable.getCatalog().getId());
-        HivePartition hivePartition = 
getHivePartitionByIdOrAnalysisException(partitionId,
+        HivePartition hivePartition = 
getHivePartitionByNameOrAnalysisException(partitionName,
                 hivePartitionValues, cache);
         return new MTMVTimestampSnapshot(hivePartition.getLastModifiedTime());
     }
@@ -98,7 +98,7 @@ public class HiveDlaTable extends HMSDlaTable {
         HiveExternalMetaCache cache = Env.getCurrentEnv().getExtMetaCacheMgr()
                 .hive(hmsTable.getCatalog().getId());
         List<HivePartition> partitionList = 
cache.getAllPartitionsWithCache(hmsTable,
-                
Lists.newArrayList(hivePartitionValues.getPartitionValuesMap().values()));
+                
Lists.newArrayList(hivePartitionValues.getNameToPartitionValues().values()));
         if (CollectionUtils.isEmpty(partitionList)) {
             return new MTMVMaxTimestampSnapshot(hmsTable.getName(), 0L);
         }
@@ -113,26 +113,23 @@ public class HiveDlaTable extends HMSDlaTable {
                 hmsTable.getPartitionColumns()), maxVersionTime);
     }
 
-    private Long getPartitionIdByNameOrAnalysisException(String partitionName,
-            HiveExternalMetaCache.HivePartitionValues hivePartitionValues)
-            throws AnalysisException {
-        Long partitionId = 
hivePartitionValues.getPartitionNameToIdMap().get(partitionName);
-        if (partitionId == null) {
+    private void checkPartitionExists(String partitionName,
+            HiveExternalMetaCache.HivePartitionValues hivePartitionValues) 
throws AnalysisException {
+        if 
(!hivePartitionValues.getNameToPartitionValues().containsKey(partitionName)) {
             throw new AnalysisException("can not find partition: " + 
partitionName);
         }
-        return partitionId;
     }
 
-    private HivePartition getHivePartitionByIdOrAnalysisException(Long 
partitionId,
+    private HivePartition getHivePartitionByNameOrAnalysisException(String 
partitionName,
             HiveExternalMetaCache.HivePartitionValues hivePartitionValues,
             HiveExternalMetaCache cache) throws AnalysisException {
-        List<String> partitionValues = 
hivePartitionValues.getPartitionValuesMap().get(partitionId);
+        List<String> partitionValues = 
hivePartitionValues.getNameToPartitionValues().get(partitionName);
         if (CollectionUtils.isEmpty(partitionValues)) {
-            throw new AnalysisException("can not find partitionValues: " + 
partitionId);
+            throw new AnalysisException("can not find partitionValues: " + 
partitionName);
         }
         HivePartition partition = cache.getHivePartition(hmsTable, 
partitionValues);
         if (partition == null) {
-            throw new AnalysisException("can not find partition: " + 
partitionId);
+            throw new AnalysisException("can not find partition: " + 
partitionName);
         }
         return partition;
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveExternalMetaCache.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveExternalMetaCache.java
index efcde181758..abc68febcba 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveExternalMetaCache.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveExternalMetaCache.java
@@ -52,13 +52,10 @@ import org.apache.doris.fs.DirectoryLister;
 import org.apache.doris.fs.FileSystemCache;
 import org.apache.doris.fs.FileSystemDirectoryLister;
 import org.apache.doris.nereids.rules.expression.rules.SortedPartitionRanges;
-import org.apache.doris.planner.ListPartitionPrunerV2;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
-import com.google.common.collect.BiMap;
-import com.google.common.collect.HashBiMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Streams;
@@ -289,19 +286,15 @@ public class HiveExternalMetaCache extends 
AbstractExternalMetaCache {
             LOG.debug("load #{} partitions for {} in catalog {}", 
partitionNames.size(), key, catalog.getName());
         }
 
-        Map<Long, PartitionItem> idToPartitionItem = 
Maps.newHashMapWithExpectedSize(partitionNames.size());
-        BiMap<String, Long> partitionNameToIdMap = 
HashBiMap.create(partitionNames.size());
-        String localDbName = nameMapping.getLocalDbName();
-        String localTblName = nameMapping.getLocalTblName();
+        Map<String, PartitionItem> nameToPartitionItem = 
Maps.newHashMapWithExpectedSize(partitionNames.size());
+        Map<String, List<String>> nameToPartitionValues = 
Maps.newHashMapWithExpectedSize(partitionNames.size());
         for (String partitionName : partitionNames) {
-            long partitionId = Util.genIdByName(catalog.getName(), 
localDbName, localTblName, partitionName);
             ListPartitionItem listPartitionItem = 
toListPartitionItem(partitionName, key.types, catalog.getName());
-            idToPartitionItem.put(partitionId, listPartitionItem);
-            partitionNameToIdMap.put(partitionName, partitionId);
+            nameToPartitionItem.put(partitionName, listPartitionItem);
+            nameToPartitionValues.put(partitionName, 
HiveUtil.toPartitionValues(partitionName));
         }
 
-        Map<Long, List<String>> partitionValuesMap = 
ListPartitionPrunerV2.getPartitionValuesMap(idToPartitionItem);
-        return new HivePartitionValues(idToPartitionItem, 
partitionNameToIdMap, partitionValuesMap);
+        return new HivePartitionValues(nameToPartitionItem, 
nameToPartitionValues);
     }
 
     private ListPartitionItem toListPartitionItem(String partitionName, 
List<Type> types, String catalogName) {
@@ -640,12 +633,7 @@ public class HiveExternalMetaCache extends 
AbstractExternalMetaCache {
                 return;
             }
 
-            Long partitionId = 
partitionValues.partitionNameToIdMap.get(partitionName);
-            if (partitionId == null) {
-                return;
-            }
-
-            List<String> values = 
partitionValues.partitionValuesMap.get(partitionId);
+            List<String> values = 
partitionValues.nameToPartitionValues.get(partitionName);
             if (values == null) {
                 return;
             }
@@ -728,29 +716,22 @@ public class HiveExternalMetaCache extends 
AbstractExternalMetaCache {
             }
 
             HivePartitionValues copy = partitionValues.copy();
-            Map<Long, PartitionItem> idToPartitionItemBefore = 
copy.getIdToPartitionItem();
-            Map<String, Long> partitionNameToIdMapBefore = 
copy.getPartitionNameToIdMap();
-            Map<Long, PartitionItem> idToPartitionItem = new HashMap<>();
+            Map<String, PartitionItem> nameToPartitionItem = 
copy.getNameToPartitionItem();
+            Map<String, List<String>> nameToPartitionValues = 
copy.getNameToPartitionValues();
 
             HMSExternalCatalog catalog = hmsCatalog(catalogId);
-            String localDbName = nameMapping.getLocalDbName();
             String localTblName = nameMapping.getLocalTblName();
             for (String partitionName : partitionNames) {
-                if (partitionNameToIdMapBefore.containsKey(partitionName)) {
+                if (nameToPartitionItem.containsKey(partitionName)) {
                     LOG.info("addPartitionsCache partitionName:[{}] has exist 
in table:[{}]",
                             partitionName, localTblName);
                     continue;
                 }
-                long partitionId = Util.genIdByName(catalog.getName(), 
localDbName, localTblName, partitionName);
                 ListPartitionItem listPartitionItem = 
toListPartitionItem(partitionName, key.types, catalog.getName());
-                idToPartitionItemBefore.put(partitionId, listPartitionItem);
-                idToPartitionItem.put(partitionId, listPartitionItem);
-                partitionNameToIdMapBefore.put(partitionName, partitionId);
+                nameToPartitionItem.put(partitionName, listPartitionItem);
+                nameToPartitionValues.put(partitionName, 
HiveUtil.toPartitionValues(partitionName));
             }
 
-            Map<Long, List<String>> partitionValuesMapBefore = 
copy.getPartitionValuesMap();
-            Map<Long, List<String>> partitionValuesMap = 
ListPartitionPrunerV2.getPartitionValuesMap(idToPartitionItem);
-            partitionValuesMapBefore.putAll(partitionValuesMap);
             copy.rebuildSortedPartitionRanges();
 
             HivePartitionValues partitionValuesCur = 
partitionValuesEntry.getIfPresent(key);
@@ -778,19 +759,17 @@ public class HiveExternalMetaCache extends 
AbstractExternalMetaCache {
             }
 
             HivePartitionValues copy = partitionValues.copy();
-            Map<String, Long> partitionNameToIdMapBefore = 
copy.getPartitionNameToIdMap();
-            Map<Long, PartitionItem> idToPartitionItemBefore = 
copy.getIdToPartitionItem();
-            Map<Long, List<String>> partitionValuesMap = 
copy.getPartitionValuesMap();
+            Map<String, PartitionItem> nameToPartitionItem = 
copy.getNameToPartitionItem();
+            Map<String, List<String>> nameToPartitionValues = 
copy.getNameToPartitionValues();
 
             for (String partitionName : partitionNames) {
-                if (!partitionNameToIdMapBefore.containsKey(partitionName)) {
+                if (!nameToPartitionItem.containsKey(partitionName)) {
                     LOG.info("dropPartitionsCache partitionName:[{}] not exist 
in table:[{}]",
                             partitionName, nameMapping.getFullLocalName());
                     continue;
                 }
-                Long partitionId = 
partitionNameToIdMapBefore.remove(partitionName);
-                idToPartitionItemBefore.remove(partitionId);
-                partitionValuesMap.remove(partitionId);
+                nameToPartitionItem.remove(partitionName);
+                nameToPartitionValues.remove(partitionName);
 
                 if (invalidPartitionCache) {
                     invalidatePartitionCache(dorisTable, partitionName);
@@ -1060,9 +1039,8 @@ public class HiveExternalMetaCache extends 
AbstractExternalMetaCache {
 
     @Data
     public static class HivePartitionValues {
-        private BiMap<String, Long> partitionNameToIdMap;
-        private Map<Long, PartitionItem> idToPartitionItem;
-        private Map<Long, List<String>> partitionValuesMap;
+        private Map<String, PartitionItem> nameToPartitionItem;
+        private Map<String, List<String>> nameToPartitionValues;
 
         // Sorted partition ranges for binary search filtering.
         private SortedPartitionRanges<String> sortedPartitionRanges;
@@ -1070,20 +1048,18 @@ public class HiveExternalMetaCache extends 
AbstractExternalMetaCache {
         public HivePartitionValues() {
         }
 
-        public HivePartitionValues(Map<Long, PartitionItem> idToPartitionItem,
-                BiMap<String, Long> partitionNameToIdMap,
-                Map<Long, List<String>> partitionValuesMap) {
-            this.idToPartitionItem = idToPartitionItem;
-            this.partitionNameToIdMap = partitionNameToIdMap;
-            this.partitionValuesMap = partitionValuesMap;
+        public HivePartitionValues(Map<String, PartitionItem> 
nameToPartitionItem,
+                Map<String, List<String>> nameToPartitionValues) {
+            this.nameToPartitionItem = nameToPartitionItem;
+            this.nameToPartitionValues = nameToPartitionValues;
             this.sortedPartitionRanges = buildSortedPartitionRanges();
         }
 
         public HivePartitionValues copy() {
             HivePartitionValues copy = new HivePartitionValues();
-            copy.setPartitionNameToIdMap(partitionNameToIdMap == null ? null : 
HashBiMap.create(partitionNameToIdMap));
-            copy.setIdToPartitionItem(idToPartitionItem == null ? null : 
Maps.newHashMap(idToPartitionItem));
-            copy.setPartitionValuesMap(partitionValuesMap == null ? null : 
Maps.newHashMap(partitionValuesMap));
+            copy.setNameToPartitionItem(nameToPartitionItem == null ? null : 
Maps.newHashMap(nameToPartitionItem));
+            copy.setNameToPartitionValues(
+                    nameToPartitionValues == null ? null : 
Maps.newHashMap(nameToPartitionValues));
             return copy;
         }
 
@@ -1096,20 +1072,10 @@ public class HiveExternalMetaCache extends 
AbstractExternalMetaCache {
         }
 
         private SortedPartitionRanges<String> buildSortedPartitionRanges() {
-            if (partitionNameToIdMap == null || partitionNameToIdMap.isEmpty()
-                    || idToPartitionItem == null || 
idToPartitionItem.isEmpty()) {
+            if (nameToPartitionItem == null || nameToPartitionItem.isEmpty()) {
                 return null;
             }
 
-            BiMap<Long, String> idToName = partitionNameToIdMap.inverse();
-            Map<String, PartitionItem> nameToPartitionItem = 
Maps.newHashMapWithExpectedSize(idToPartitionItem.size());
-            for (Map.Entry<Long, PartitionItem> entry : 
idToPartitionItem.entrySet()) {
-                String partitionName = idToName.get(entry.getKey());
-                if (partitionName != null) {
-                    nameToPartitionItem.put(partitionName, entry.getValue());
-                }
-            }
-
             return SortedPartitionRanges.build(nameToPartitionItem);
         }
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/HiveTableSink.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/HiveTableSink.java
index a9568e225f0..dd7dc1b120a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/HiveTableSink.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/HiveTableSink.java
@@ -213,7 +213,7 @@ public class HiveTableSink extends 
BaseExternalTableDataSink {
             HiveExternalMetaCache.HivePartitionValues partitionValues =
                     
targetTable.getHivePartitionValues(MvccUtil.getSnapshotFromContext(targetTable));
             List<List<String>> partitionValuesList =
-                    new 
ArrayList<>(partitionValues.getPartitionValuesMap().values());
+                    new 
ArrayList<>(partitionValues.getNameToPartitionValues().values());
             hivePartitions = cache.getAllPartitionsWithCache(targetTable, 
partitionValuesList);
         }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java
 
b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java
index f4d9d535f84..1838085cb1f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java
@@ -2116,9 +2116,9 @@ public class MetadataGenerator {
 
         HiveExternalMetaCache.HivePartitionValues hivePartitionValues = 
tbl.getHivePartitionValues(
                 MvccUtil.getSnapshotFromContext(tbl));
-        Map<Long, List<String>> valuesMap = 
hivePartitionValues.getPartitionValuesMap();
+        Map<String, List<String>> valuesMap = 
hivePartitionValues.getNameToPartitionValues();
         List<TRow> dataBatch = Lists.newArrayList();
-        for (Map.Entry<Long, List<String>> entry : valuesMap.entrySet()) {
+        for (Map.Entry<String, List<String>> entry : valuesMap.entrySet()) {
             TRow trow = new TRow();
             List<String> values = entry.getValue();
             if (values.size() != partitionCols.size()) {
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/HMSExternalTableTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/HMSExternalTableTest.java
index 2cefa4821da..5cf4779f73e 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/HMSExternalTableTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/HMSExternalTableTest.java
@@ -29,7 +29,6 @@ import org.apache.doris.datasource.ExternalMetaCacheMgr;
 import org.apache.doris.fs.FileSystemDirectoryLister;
 import org.apache.doris.thrift.TFileFormatType;
 
-import com.google.common.collect.HashBiMap;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import org.apache.hadoop.hive.metastore.api.SerDeInfo;
@@ -43,7 +42,6 @@ import org.mockito.Mockito;
 
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 
 
 /**
@@ -299,12 +297,9 @@ public class HMSExternalTableTest {
                     Lists.newArrayList(Type.VARCHAR),
                     true);
             PartitionItem partitionItem = new 
ListPartitionItem(Lists.newArrayList(partitionKey));
-            long partitionId = 1L;
-            Map<Long, PartitionItem> idToPartitionItem = 
ImmutableMap.of(partitionId, partitionItem);
             this.partitionValues = new 
HiveExternalMetaCache.HivePartitionValues(
-                    idToPartitionItem,
-                    HashBiMap.create(ImmutableMap.of("dt=" + partitionValue, 
partitionId)),
-                    ImmutableMap.of(partitionId, 
Collections.singletonList(partitionValue)));
+                    ImmutableMap.of("dt=" + partitionValue, partitionItem),
+                    ImmutableMap.of("dt=" + partitionValue, 
Collections.singletonList(partitionValue)));
         }
 
         @Override
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/HiveMetaStoreCacheTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/HiveMetaStoreCacheTest.java
index eb4b28e9a88..931c7ac7e5a 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/HiveMetaStoreCacheTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/hive/HiveMetaStoreCacheTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.doris.datasource.hive;
 
+import org.apache.doris.catalog.PartitionItem;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.ThreadPoolManager;
 import org.apache.doris.common.util.Util;
@@ -30,6 +31,7 @@ import org.junit.jupiter.api.Test;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.atomic.AtomicLong;
@@ -123,6 +125,19 @@ public class HiveMetaStoreCacheTest {
         }
     }
 
+    @Test
+    public void testHivePartitionValuesCopyKeepsIndependentNameMaps() {
+        Map<String, PartitionItem> nameToPartitionItem = new HashMap<>();
+        Map<String, List<String>> nameToPartitionValues = new HashMap<>();
+        nameToPartitionValues.put("dt=2026-06-26", 
Collections.singletonList("2026-06-26"));
+        HiveExternalMetaCache.HivePartitionValues partitionValues =
+                new 
HiveExternalMetaCache.HivePartitionValues(nameToPartitionItem, 
nameToPartitionValues);
+
+        HiveExternalMetaCache.HivePartitionValues copy = 
partitionValues.copy();
+        copy.getNameToPartitionValues().put("dt=2026-06-27", 
Collections.singletonList("2026-06-27"));
+        
Assertions.assertFalse(partitionValues.getNameToPartitionValues().containsKey("dt=2026-06-27"));
+    }
+
     private void putCache(
             MetaCacheEntry<HiveExternalMetaCache.FileCacheKey, 
HiveExternalMetaCache.FileCacheValue> fileCache,
             MetaCacheEntry<HiveExternalMetaCache.PartitionCacheKey, 
HivePartition> partitionCache,
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/planner/ListPartitionPrunerV2Test.java
 
b/fe/fe-core/src/test/java/org/apache/doris/planner/ListPartitionPrunerV2Test.java
index c423fcd0315..e5c5c3497c0 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/planner/ListPartitionPrunerV2Test.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/planner/ListPartitionPrunerV2Test.java
@@ -104,8 +104,8 @@ public class ListPartitionPrunerV2Test {
             NameMapping nameMapping = NameMapping.createForTest(catalogId, 
dbName, tblName);
             PartitionValueCacheKey key = new 
PartitionValueCacheKey(nameMapping, types);
             HiveExternalMetaCache.HivePartitionValues partitionValues = 
cache.getPartitionValues(key);
-            Assert.assertEquals(1, 
partitionValues.getIdToPartitionItem().size());
-            List<PartitionKey> items = 
partitionValues.getIdToPartitionItem().values().iterator().next().getItems();
+            Assert.assertEquals(1, 
partitionValues.getNameToPartitionItem().size());
+            List<PartitionKey> items = 
partitionValues.getNameToPartitionItem().values().iterator().next().getItems();
             Assert.assertEquals(1, items.size());
             PartitionKey partitionKey = items.get(0);
             Assert.assertEquals("1.234", 
partitionKey.getKeys().get(0).toString());
@@ -117,9 +117,9 @@ public class ListPartitionPrunerV2Test {
             cache.addPartitionsCache(nameMapping, values, types);
             HiveExternalMetaCache.HivePartitionValues partitionValues2 = 
cache.getPartitionValues(
                 new PartitionValueCacheKey(nameMapping, types));
-            Assert.assertEquals(2, 
partitionValues2.getIdToPartitionItem().size());
+            Assert.assertEquals(2, 
partitionValues2.getNameToPartitionItem().size());
             PartitionKey partitionKey2 = null;
-            for (PartitionItem partitionItem : 
partitionValues2.getIdToPartitionItem().values()) {
+            for (PartitionItem partitionItem : 
partitionValues2.getNameToPartitionItem().values()) {
                 List<PartitionKey> partitionKeys = partitionItem.getItems();
                 Assert.assertEquals(1, partitionKeys.size());
                 if 
("5.678000".equals(partitionKeys.get(0).getOriginHiveKeys().get(0))) {
@@ -136,8 +136,8 @@ public class ListPartitionPrunerV2Test {
             cache.invalidateTableCache(nameMapping);
             HiveExternalMetaCache.HivePartitionValues partitionValues3 = 
cache.getPartitionValues(
                 new PartitionValueCacheKey(nameMapping, types));
-            Assert.assertEquals(1, 
partitionValues3.getIdToPartitionItem().size());
-            List<PartitionKey> items3 = 
partitionValues3.getIdToPartitionItem().values().iterator().next().getItems();
+            Assert.assertEquals(1, 
partitionValues3.getNameToPartitionItem().size());
+            List<PartitionKey> items3 = 
partitionValues3.getNameToPartitionItem().values().iterator().next().getItems();
             Assert.assertEquals(1, items3.size());
             PartitionKey partitionKey3 = items3.get(0);
             Assert.assertEquals("1.234", 
partitionKey3.getKeys().get(0).toString());
diff --git 
a/regression-test/data/external_table_p0/hive/test_hive_partition_values_tvf.out
 
b/regression-test/data/external_table_p0/hive/test_hive_partition_values_tvf.out
index bc69c716277..738854a43d1 100644
--- 
a/regression-test/data/external_table_p0/hive/test_hive_partition_values_tvf.out
+++ 
b/regression-test/data/external_table_p0/hive/test_hive_partition_values_tvf.out
@@ -60,9 +60,9 @@ test3
 -- !sql61 --
 
 -- !sql71 --
+\N     0.1     test1
 \N     0.2     test2
 100    0.3     test3
-\N     0.1     test1
 
 -- !sql72 --
 
@@ -117,4 +117,3 @@ p8  varchar(65533)  Yes     true    \N      NONE
 \N     \N      \N      \N      \N      \N      \N      \N
 false  -128    -32768  -2147483648     -9223372036854775808    1900-01-01      
1899-01-01T23:59:59     \N
 false  127     32767   2147483647      9223372036854775807     9999-12-31      
0001-01-01T00:00:01.321 boston
-
diff --git 
a/regression-test/suites/external_table_p0/hive/test_hive_partition_values_tvf.groovy
 
b/regression-test/suites/external_table_p0/hive/test_hive_partition_values_tvf.groovy
index c1ce220687c..bd50167725f 100644
--- 
a/regression-test/suites/external_table_p0/hive/test_hive_partition_values_tvf.groovy
+++ 
b/regression-test/suites/external_table_p0/hive/test_hive_partition_values_tvf.groovy
@@ -69,8 +69,8 @@ suite("test_hive_partition_values_tvf", "p0,external") {
         sql """drop database if exists internal.partition_values_db"""
         sql """create database if not exists internal.partition_values_db"""
         sql """create view internal.partition_values_db.v1 as select * from 
${catalog_name}.multi_catalog.orc_partitioned_columns\$partitions"""
-        qt_sql71 """select * from internal.partition_values_db.v1"""
-        qt_sql72 """select t_string, t_int from 
internal.partition_values_db.v1 where t_int != "__HIVE_DEFAULT_PARTITION__""""
+        qt_sql71 """select * from internal.partition_values_db.v1 order by 
t_int, t_float, t_string"""
+        qt_sql72 """select t_string, t_int from 
internal.partition_values_db.v1 where t_int != "__HIVE_DEFAULT_PARTITION__" 
order by t_int, t_string"""
         qt_sql73 """with v1 as (select t_string, t_int from 
internal.partition_values_db.v1 order by t_int, t_float, t_string) select c1 
from (select max(t_string) as c1 from v1) x;"""
         
         // 9. test join
@@ -139,4 +139,3 @@ suite("test_hive_partition_values_tvf", "p0,external") {
         qt_sql113 """select * from partition_values_all_types\$partitions 
order by p1,p2,p3;"""
     }
 }
-


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to