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

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


The following commit(s) were added to refs/heads/master by this push:
     new a805bce08a8 HIVE-29089: MSCK Repair table adds invalid partitions for 
non-string partition columns (#5976)
a805bce08a8 is described below

commit a805bce08a85cf4e7e1daa9678e125e5f049cf5f
Author: Vikram Ahuja <vikramahuja1...@users.noreply.github.com>
AuthorDate: Tue Aug 5 19:07:30 2025 +0530

    HIVE-29089: MSCK Repair table adds invalid partitions for non-string 
partition columns (#5976)
---
 ql/src/test/queries/clientnegative/msck_repair_9.q |  7 ++
 ql/src/test/queries/clientpositive/msck_repair_9.q | 14 ++++
 .../results/clientnegative/msck_repair_9.q.out     | 20 ++++++
 .../clientpositive/llap/msck_repair_9.q.out        | 54 +++++++++++++-
 .../hive/metastore/HiveMetaStoreChecker.java       | 55 ++++++++-------
 .../hive/metastore/utils/MetaStoreServerUtils.java | 82 ++++++++++++++--------
 .../metastore/utils/TestMetaStoreServerUtils.java  | 64 +++++++++++++----
 7 files changed, 225 insertions(+), 71 deletions(-)

diff --git a/ql/src/test/queries/clientnegative/msck_repair_9.q 
b/ql/src/test/queries/clientnegative/msck_repair_9.q
new file mode 100644
index 00000000000..7dfe3834b5a
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/msck_repair_9.q
@@ -0,0 +1,7 @@
+DROP TABLE IF EXISTS tbl_int;
+
+CREATE EXTERNAL TABLE tbl_int (id INT, name STRING) PARTITIONED BY (month INT) 
stored as ORC location 
'${system:test.tmp.dir}/apps/hive/warehouse/test.db/tbl_int/';
+dfs ${system:test.dfs.mkdir} -p 
${system:test.tmp.dir}/apps/hive/warehouse/test.db/tbl_int/month=random_partition;
+MSCK REPAIR TABLE tbl_int;
+
+DROP TABLE IF EXISTS tbl_int;
diff --git a/ql/src/test/queries/clientpositive/msck_repair_9.q 
b/ql/src/test/queries/clientpositive/msck_repair_9.q
index 5660a6f95d8..42f0f91fee8 100644
--- a/ql/src/test/queries/clientpositive/msck_repair_9.q
+++ b/ql/src/test/queries/clientpositive/msck_repair_9.q
@@ -14,9 +14,23 @@ SHOW PARTITIONS tbl_x;
 
 CREATE EXTERNAL TABLE tbl_y (id INT, name STRING) PARTITIONED BY (month INT, 
day INT) stored as ORC location 
'${system:test.tmp.dir}/apps/hive/warehouse/test.db/tbl_x/';
 
+set hive.msck.path.validation=skip;
+
 MSCK REPAIR TABLE tbl_y;
 
 SHOW PARTITIONS tbl_y;
 
+SET hive.exec.default.partition.name=SECOND_PARTITION;
+INSERT INTO tbl_y (id, name, day) values(4, 'ddd', 3);
+
+SET hive.exec.default.partition.name=OTHER_PARTITION;
+INSERT INTO tbl_y (id, name, day) values(4, 'ddd', 3);
+
+SHOW PARTITIONS tbl_y;
+
+set hive.msck.path.validation=ignore;
+MSCK REPAIR TABLE tbl_y;
+SHOW PARTITIONS tbl_y;
+
 DROP TABLE tbl_x;
 DROP TABLE tbl_y;
diff --git a/ql/src/test/results/clientnegative/msck_repair_9.q.out 
b/ql/src/test/results/clientnegative/msck_repair_9.q.out
new file mode 100644
index 00000000000..22a17bff681
--- /dev/null
+++ b/ql/src/test/results/clientnegative/msck_repair_9.q.out
@@ -0,0 +1,20 @@
+PREHOOK: query: DROP TABLE IF EXISTS tbl_int
+PREHOOK: type: DROPTABLE
+PREHOOK: Output: database:default
+POSTHOOK: query: DROP TABLE IF EXISTS tbl_int
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Output: database:default
+#### A masked pattern was here ####
+PREHOOK: type: CREATETABLE
+#### A masked pattern was here ####
+PREHOOK: Output: database:default
+PREHOOK: Output: default@tbl_int
+#### A masked pattern was here ####
+POSTHOOK: type: CREATETABLE
+#### A masked pattern was here ####
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@tbl_int
+PREHOOK: query: MSCK REPAIR TABLE tbl_int
+PREHOOK: type: MSCK
+PREHOOK: Output: default@tbl_int
+FAILED: Execution Error, return code 40000 from 
org.apache.hadoop.hive.ql.ddl.DDLTask. For input string: "random_partition"
diff --git a/ql/src/test/results/clientpositive/llap/msck_repair_9.q.out 
b/ql/src/test/results/clientpositive/llap/msck_repair_9.q.out
index 1c6394b8f87..048bc72f11f 100644
--- a/ql/src/test/results/clientpositive/llap/msck_repair_9.q.out
+++ b/ql/src/test/results/clientpositive/llap/msck_repair_9.q.out
@@ -90,7 +90,57 @@ PREHOOK: Output: default@tbl_y
 POSTHOOK: query: MSCK REPAIR TABLE tbl_y
 POSTHOOK: type: MSCK
 POSTHOOK: Output: default@tbl_y
-Partitions not in metastore:   tbl_y:month=12/day=2    tbl_y:month=12/day=3    
tbl_y:month=12/day=__HIVE_DEFAULT_PARTITION__   
tbl_y:month=ANOTHER_PARTITION/day=3
+Partitions not in metastore:   tbl_y:month=12/day=2    tbl_y:month=12/day=3    
tbl_y:month=ANOTHER_PARTITION/day=3
+#### A masked pattern was here ####
+PREHOOK: query: SHOW PARTITIONS tbl_y
+PREHOOK: type: SHOWPARTITIONS
+PREHOOK: Input: default@tbl_y
+POSTHOOK: query: SHOW PARTITIONS tbl_y
+POSTHOOK: type: SHOWPARTITIONS
+POSTHOOK: Input: default@tbl_y
+month=12/day=2
+month=12/day=3
+month=ANOTHER_PARTITION/day=3
+PREHOOK: query: INSERT INTO tbl_y (id, name, day) values(4, 'ddd', 3)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@tbl_y
+POSTHOOK: query: INSERT INTO tbl_y (id, name, day) values(4, 'ddd', 3)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@tbl_y
+POSTHOOK: Output: default@tbl_y@month=SECOND_PARTITION/day=3
+POSTHOOK: Lineage: tbl_y PARTITION(month=SECOND_PARTITION,day=3).id SCRIPT []
+POSTHOOK: Lineage: tbl_y PARTITION(month=SECOND_PARTITION,day=3).name SCRIPT []
+PREHOOK: query: INSERT INTO tbl_y (id, name, day) values(4, 'ddd', 3)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@tbl_y
+POSTHOOK: query: INSERT INTO tbl_y (id, name, day) values(4, 'ddd', 3)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@tbl_y
+POSTHOOK: Output: default@tbl_y@month=OTHER_PARTITION/day=3
+POSTHOOK: Lineage: tbl_y PARTITION(month=OTHER_PARTITION,day=3).id SCRIPT []
+POSTHOOK: Lineage: tbl_y PARTITION(month=OTHER_PARTITION,day=3).name SCRIPT []
+PREHOOK: query: SHOW PARTITIONS tbl_y
+PREHOOK: type: SHOWPARTITIONS
+PREHOOK: Input: default@tbl_y
+POSTHOOK: query: SHOW PARTITIONS tbl_y
+POSTHOOK: type: SHOWPARTITIONS
+POSTHOOK: Input: default@tbl_y
+month=12/day=2
+month=12/day=3
+month=ANOTHER_PARTITION/day=3
+month=OTHER_PARTITION/day=3
+month=SECOND_PARTITION/day=3
+PREHOOK: query: MSCK REPAIR TABLE tbl_y
+PREHOOK: type: MSCK
+PREHOOK: Output: default@tbl_y
+POSTHOOK: query: MSCK REPAIR TABLE tbl_y
+POSTHOOK: type: MSCK
+POSTHOOK: Output: default@tbl_y
+Partitions not in metastore:   tbl_y:month=12/day=__HIVE_DEFAULT_PARTITION__
 #### A masked pattern was here ####
 PREHOOK: query: SHOW PARTITIONS tbl_y
 PREHOOK: type: SHOWPARTITIONS
@@ -102,6 +152,8 @@ month=12/day=2
 month=12/day=3
 month=12/day=__HIVE_DEFAULT_PARTITION__
 month=ANOTHER_PARTITION/day=3
+month=OTHER_PARTITION/day=3
+month=SECOND_PARTITION/day=3
 PREHOOK: query: DROP TABLE tbl_x
 PREHOOK: type: DROPTABLE
 PREHOOK: Input: default@tbl_x
diff --git 
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreChecker.java
 
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreChecker.java
index 4afc779cb66..e5a85783e0f 100644
--- 
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreChecker.java
+++ 
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreChecker.java
@@ -444,34 +444,37 @@ void findUnknownPartitions(Table table, Set<Path> 
missingPartDirs,
     for (Path partPath : missingPartDirs) {
       FileSystem fs = partPath.getFileSystem(conf);
       String partitionName = getPartitionName(fs.makeQualified(tablePath),
-          partPath, partColNames, partitionColToTypeMap);
+          partPath, partColNames, partitionColToTypeMap, conf);
+      if (partitionName == null) {
+        // Skip this partition if there is some issue in the partition 
validation
+        LOG.warn("Skipping partition : " + partPath.getName());
+        continue;
+      }
       LOG.debug("PartitionName: " + partitionName);
 
-      if (partitionName != null) {
-        CheckResult.PartitionResult pr = new CheckResult.PartitionResult();
-        pr.setPartitionName(partitionName);
-        pr.setTableName(table.getTableName());
-        // Also set the correct partition path here as creating path from 
Warehouse.makePartPath will always return
-        // lowercase keys/path. Even if we add the new partition with 
lowerkeys, get queries on such partition
-        // will not return any results.
-        pr.setPath(partPath);
-
-        // Check if partition already exists. No need to check for those 
partition which are present in db
-        // but no in fs as msck will override the partition location in db
-        if (result.getCorrectPartitions().contains(pr)) {
-          String msg = "The partition '" + pr.toString() + "' already exists 
for table" + table.getTableName();
-          throw new MetastoreException(msg);
-        } else if (result.getPartitionsNotInMs().contains(pr)) {
-          String msg = "Found two paths for same partition '" + pr.toString() 
+ "' for table " + table.getTableName();
-          throw new MetastoreException(msg);
-        }
-        if (transactionalTable) {
-          setMaxTxnAndWriteIdFromPartition(partPath, pr);
-        }
-        result.getPartitionsNotInMs().add(pr);
-        if (result.getPartitionsNotOnFs().contains(pr)) {
-          result.getPartitionsNotOnFs().remove(pr);
-        }
+      CheckResult.PartitionResult pr = new CheckResult.PartitionResult();
+      pr.setPartitionName(partitionName);
+      pr.setTableName(table.getTableName());
+      // Also set the correct partition path here as creating path from 
Warehouse.makePartPath will always return
+      // lowercase keys/path. Even if we add the new partition with lowerkeys, 
get queries on such partition
+      // will not return any results.
+      pr.setPath(partPath);
+
+      // Check if partition already exists. No need to check for those 
partition which are present in db
+      // but no in fs as msck will override the partition location in db
+      if (result.getCorrectPartitions().contains(pr)) {
+        String msg = "The partition '" + pr.toString() + "' already exists for 
table" + table.getTableName();
+        throw new MetastoreException(msg);
+      } else if (result.getPartitionsNotInMs().contains(pr)) {
+        String msg = "Found two paths for same partition '" + pr.toString() + 
"' for table " + table.getTableName();
+        throw new MetastoreException(msg);
+      }
+      if (transactionalTable) {
+        setMaxTxnAndWriteIdFromPartition(partPath, pr);
+      }
+      result.getPartitionsNotInMs().add(pr);
+      if (result.getPartitionsNotOnFs().contains(pr)) {
+        result.getPartitionsNotOnFs().remove(pr);
       }
     }
     LOG.debug("Number of partitions not in metastore : " + 
result.getPartitionsNotInMs().size());
diff --git 
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreServerUtils.java
 
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreServerUtils.java
index fd2e1926e43..77e93f838d5 100644
--- 
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreServerUtils.java
+++ 
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreServerUtils.java
@@ -63,7 +63,6 @@
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.ListUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.math.NumberUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.Path;
@@ -1608,8 +1607,8 @@ public static Partition getPartition(IMetaStoreClient 
msc, Table tbl, Map<String
    * @return Partition name, for example partitiondate=2008-01-01
    */
   public static String getPartitionName(Path tablePath, Path partitionPath, 
Set<String> partCols,
-                                        Map<String, String> 
partitionColToTypeMap) {
-    String result = null;
+                                        Map<String, String> 
partitionColToTypeMap, Configuration conf) {
+    StringBuilder result = null;
     Path currPath = partitionPath;
     LOG.debug("tablePath:" + tablePath + ", partCols: " + partCols);
 
@@ -1620,7 +1619,7 @@ public static String getPartitionName(Path tablePath, 
Path partitionPath, Set<St
       if (parts.length > 0) {
         if (parts.length != 2) {
           LOG.warn(currPath.getName() + " is not a valid partition name");
-          return result;
+          return result.toString();
         }
 
         // Since hive stores partitions keys in lower case, if the hdfs path 
contains mixed case,
@@ -1629,43 +1628,68 @@ public static String getPartitionName(Path tablePath, 
Path partitionPath, Set<St
         // Do not convert the partitionValue to lowercase
         String partitionValue = parts[1];
         if (partCols.contains(partitionName)) {
+          String normalisedPartitionValue = 
getNormalisedPartitionValue(partitionValue,
+                  partitionColToTypeMap.get(partitionName), conf);
+          if (normalisedPartitionValue == null) {
+            return null;
+          }
           if (result == null) {
-            result = partitionName + "="
-                    + getNormalisedPartitionValue(partitionValue, 
partitionColToTypeMap.get(partitionName));
+            result = new StringBuilder(partitionName + "=" + 
normalisedPartitionValue);
           } else {
-            result = partitionName + "="
-                    + getNormalisedPartitionValue(partitionValue, 
partitionColToTypeMap.get(partitionName))
-                    + Path.SEPARATOR + result;
+            result.insert(0, partitionName + "=" + normalisedPartitionValue + 
Path.SEPARATOR);
           }
         }
       }
       currPath = currPath.getParent();
       LOG.debug("currPath=" + currPath);
     }
-    return result;
+    return (result == null) ? null : result.toString();
   }
 
-  public static String getNormalisedPartitionValue(String partitionValue, 
String type) {
-
-    if (!NumberUtils.isParsable(partitionValue)) {
+  public static String getNormalisedPartitionValue(String partitionValue, 
String type, Configuration conf) {
+    // 1. Handle simple exit cases first.
+    if (type == null) {
       return partitionValue;
     }
-
-    LOG.debug("Converting '" + partitionValue + "' to type: '" + type + "'.");
-
-    if (type.equalsIgnoreCase("tinyint")
-    || type.equalsIgnoreCase("smallint")
-    || type.equalsIgnoreCase("int")){
-      return Integer.toString(Integer.parseInt(partitionValue));
-    } else if (type.equalsIgnoreCase("bigint")){
-      return Long.toString(Long.parseLong(partitionValue));
-    } else if (type.equalsIgnoreCase("float")){
-      return Float.toString(Float.parseFloat(partitionValue));
-    } else if (type.equalsIgnoreCase("double")){
-      return Double.toString(Double.parseDouble(partitionValue));
-    } else if (type.startsWith("decimal")){
-      // Decimal datatypes are stored like decimal(10,10)
-      return new 
BigDecimal(partitionValue).stripTrailingZeros().toPlainString();
+    if (Objects.equals(partitionValue, MetastoreConf.getVar(conf,
+            MetastoreConf.ConfVars.DEFAULTPARTITIONNAME))) {
+      // This is the special partition name for NULL values. It should never 
be parsed.
+      return partitionValue;
+    }
+    // 2. If the type is not numeric, no normalization is needed.
+    String colType = ColumnType.getTypeName(type);
+    if (!ColumnType.NumericTypes.contains(colType)) {
+      return partitionValue;
+    }
+    // 3. At this point, we have a numeric type that needs normalization.
+    LOG.debug("Normalizing partition value '{}' for type '{}'.", 
partitionValue, type);
+    try {
+      switch (colType) {
+        case ColumnType.TINYINT_TYPE_NAME:
+        case ColumnType.SMALLINT_TYPE_NAME:
+        case ColumnType.INT_TYPE_NAME:
+          return Integer.toString(Integer.parseInt(partitionValue));
+        case ColumnType.BIGINT_TYPE_NAME:
+          return Long.toString(Long.parseLong(partitionValue));
+        case ColumnType.FLOAT_TYPE_NAME:
+          return Float.toString(Float.parseFloat(partitionValue));
+        case ColumnType.DOUBLE_TYPE_NAME:
+          return Double.toString(Double.parseDouble(partitionValue));
+        case ColumnType.DECIMAL_TYPE_NAME:
+          return new 
BigDecimal(partitionValue).stripTrailingZeros().toPlainString();
+      }
+    } catch (NumberFormatException e) {
+      // 4. Handle cases where the value cannot be parsed as the expected 
number type.
+      String validationMode = MetastoreConf.getVar(conf, 
MetastoreConf.ConfVars.MSCK_PATH_VALIDATION);
+      if ("throw".equals(validationMode)) {
+        LOG.error("Invalid partition value: Cannot parse '{}' as type '{}'. 
Failing MSCK. "
+                + "Set hive.msck.path.validation=skip to ignore invalid 
partitions.", partitionValue, type);
+        throw e;
+      } else if ("skip".equals(validationMode)) {
+        LOG.warn("Skipping invalid partition value '{}' for type '{}' due to 
parsing error.", partitionValue, type);
+        // Signals the caller to skip this partition.
+        return null;
+      }
     }
     return partitionValue;
   }
diff --git 
a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreServerUtils.java
 
b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreServerUtils.java
index c09d9838104..bb22300b335 100644
--- 
a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreServerUtils.java
+++ 
b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreServerUtils.java
@@ -75,6 +75,7 @@
 import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
@@ -950,22 +951,55 @@ public void testAnonymizeConnectionURL() {
 
   @Test
   public void testConversionToSignificantNumericTypes() {
-    assertEquals("1", MetaStoreServerUtils.getNormalisedPartitionValue("0001", 
"tinyint"));
-    assertEquals("1", MetaStoreServerUtils.getNormalisedPartitionValue("0001", 
"smallint"));
-    assertEquals("10", 
MetaStoreServerUtils.getNormalisedPartitionValue("00010", "int"));
-    assertEquals("-10", 
MetaStoreServerUtils.getNormalisedPartitionValue("-00010", "int"));
-
-    assertEquals("10", 
MetaStoreServerUtils.getNormalisedPartitionValue("00010", "bigint"));
-    assertEquals("-10", 
MetaStoreServerUtils.getNormalisedPartitionValue("-00010", "bigint"));
-
-    assertEquals("1.01", 
MetaStoreServerUtils.getNormalisedPartitionValue("0001.0100", "float"));
-    assertEquals("-1.01", 
MetaStoreServerUtils.getNormalisedPartitionValue("-0001.0100", "float"));
-    assertEquals("1.01", 
MetaStoreServerUtils.getNormalisedPartitionValue("0001.010000", "double"));
-    assertEquals("-1.01", 
MetaStoreServerUtils.getNormalisedPartitionValue("-0001.010000", "double"));
-    assertEquals("1.01", 
MetaStoreServerUtils.getNormalisedPartitionValue("0001.0100", "decimal"));
-    assertEquals("-1.01", 
MetaStoreServerUtils.getNormalisedPartitionValue("-0001.0100", "decimal"));
+    Configuration metastoreConf = MetastoreConf.newMetastoreConf();
+    assertEquals("1", MetaStoreServerUtils.getNormalisedPartitionValue("0001", 
"tinyint", metastoreConf));
+    assertEquals("1", MetaStoreServerUtils.getNormalisedPartitionValue("0001", 
"smallint", metastoreConf));
+    assertEquals("10", 
MetaStoreServerUtils.getNormalisedPartitionValue("00010", "int", 
metastoreConf));
+    assertEquals("-10", 
MetaStoreServerUtils.getNormalisedPartitionValue("-00010", "int", 
metastoreConf));
+
+    assertEquals("10", 
MetaStoreServerUtils.getNormalisedPartitionValue("00010", "bigint", 
metastoreConf));
+    assertEquals("-10", 
MetaStoreServerUtils.getNormalisedPartitionValue("-00010", "bigint", 
metastoreConf));
+
+    assertEquals("1.01", 
MetaStoreServerUtils.getNormalisedPartitionValue("0001.0100", "float", 
metastoreConf));
+    assertEquals("-1.01", 
MetaStoreServerUtils.getNormalisedPartitionValue("-0001.0100", "float", 
metastoreConf));
+    assertEquals("1.01", 
MetaStoreServerUtils.getNormalisedPartitionValue("0001.010000", "double", 
metastoreConf));
+    assertEquals("-1.01", 
MetaStoreServerUtils.getNormalisedPartitionValue("-0001.010000", "double", 
metastoreConf));
+    assertEquals("1.01", 
MetaStoreServerUtils.getNormalisedPartitionValue("0001.0100", "decimal", 
metastoreConf));
+    assertEquals("-1.01", 
MetaStoreServerUtils.getNormalisedPartitionValue("-0001.0100", "decimal", 
metastoreConf));
+    assertEquals("-1.01", 
MetaStoreServerUtils.getNormalisedPartitionValue("-0001.0100", 
"decimal(10,10)", metastoreConf));
     assertEquals("__HIVE_DEFAULT_PARTITION__", 
MetaStoreServerUtils.getNormalisedPartitionValue(
-        "__HIVE_DEFAULT_PARTITION__", "decimal"));
+        "__HIVE_DEFAULT_PARTITION__", "decimal", metastoreConf));
+  }
+
+  @Test
+  public void testConversionFromStringToNumeric() {
+    Configuration metastoreConf = MetastoreConf.newMetastoreConf();
+    Assert.assertThrows(NumberFormatException.class, () -> 
MetaStoreServerUtils.getNormalisedPartitionValue(
+            "Random_Partition", "double", metastoreConf));
+    Assert.assertThrows(NumberFormatException.class, () -> 
MetaStoreServerUtils.getNormalisedPartitionValue(
+            "Random_Partition", "int", metastoreConf));
+    Assert.assertThrows(NumberFormatException.class, () -> 
MetaStoreServerUtils.getNormalisedPartitionValue(
+            "Random_Partition", "smallint", metastoreConf));
+    Assert.assertThrows(NumberFormatException.class, () -> 
MetaStoreServerUtils.getNormalisedPartitionValue(
+            "Random_Partition", "bigint", metastoreConf));
+    Assert.assertThrows(NumberFormatException.class, () -> 
MetaStoreServerUtils.getNormalisedPartitionValue(
+            "Random_Partition", "float", metastoreConf));
+    Assert.assertThrows(NumberFormatException.class, () -> 
MetaStoreServerUtils.getNormalisedPartitionValue(
+            "Random_Partition", "decimal", metastoreConf));
+
+    MetastoreConf.setVar(metastoreConf, 
MetastoreConf.ConfVars.MSCK_PATH_VALIDATION, "skip");
+      assertNull(MetaStoreServerUtils.getNormalisedPartitionValue(
+              "Random_Partition", "int", metastoreConf));
+      assertNull(MetaStoreServerUtils.getNormalisedPartitionValue(
+              "Random_Partition", "smallint", metastoreConf));
+      assertNull(MetaStoreServerUtils.getNormalisedPartitionValue(
+              "Random_Partition", "bigint", metastoreConf));
+      assertNull(MetaStoreServerUtils.getNormalisedPartitionValue(
+              "Random_Partition", "float", metastoreConf));
+      assertNull(MetaStoreServerUtils.getNormalisedPartitionValue(
+              "Random_Partition", "double", metastoreConf));
+      assertNull(MetaStoreServerUtils.getNormalisedPartitionValue(
+              "Random_Partition", "decimal", metastoreConf));
   }
 
   @Test

Reply via email to