Skip to content

Commit a805bce

Browse files
HIVE-29089: MSCK Repair table adds invalid partitions for non-string partition columns (#5976)
1 parent 02f0553 commit a805bce

File tree

7 files changed

+225
-71
lines changed

7 files changed

+225
-71
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
DROP TABLE IF EXISTS tbl_int;
2+
3+
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/';
4+
dfs ${system:test.dfs.mkdir} -p ${system:test.tmp.dir}/apps/hive/warehouse/test.db/tbl_int/month=random_partition;
5+
MSCK REPAIR TABLE tbl_int;
6+
7+
DROP TABLE IF EXISTS tbl_int;

ql/src/test/queries/clientpositive/msck_repair_9.q

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,23 @@ SHOW PARTITIONS tbl_x;
1414

1515
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/';
1616

17+
set hive.msck.path.validation=skip;
18+
1719
MSCK REPAIR TABLE tbl_y;
1820

1921
SHOW PARTITIONS tbl_y;
2022

23+
SET hive.exec.default.partition.name=SECOND_PARTITION;
24+
INSERT INTO tbl_y (id, name, day) values(4, 'ddd', 3);
25+
26+
SET hive.exec.default.partition.name=OTHER_PARTITION;
27+
INSERT INTO tbl_y (id, name, day) values(4, 'ddd', 3);
28+
29+
SHOW PARTITIONS tbl_y;
30+
31+
set hive.msck.path.validation=ignore;
32+
MSCK REPAIR TABLE tbl_y;
33+
SHOW PARTITIONS tbl_y;
34+
2135
DROP TABLE tbl_x;
2236
DROP TABLE tbl_y;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
PREHOOK: query: DROP TABLE IF EXISTS tbl_int
2+
PREHOOK: type: DROPTABLE
3+
PREHOOK: Output: database:default
4+
POSTHOOK: query: DROP TABLE IF EXISTS tbl_int
5+
POSTHOOK: type: DROPTABLE
6+
POSTHOOK: Output: database:default
7+
#### A masked pattern was here ####
8+
PREHOOK: type: CREATETABLE
9+
#### A masked pattern was here ####
10+
PREHOOK: Output: database:default
11+
PREHOOK: Output: default@tbl_int
12+
#### A masked pattern was here ####
13+
POSTHOOK: type: CREATETABLE
14+
#### A masked pattern was here ####
15+
POSTHOOK: Output: database:default
16+
POSTHOOK: Output: default@tbl_int
17+
PREHOOK: query: MSCK REPAIR TABLE tbl_int
18+
PREHOOK: type: MSCK
19+
PREHOOK: Output: default@tbl_int
20+
FAILED: Execution Error, return code 40000 from org.apache.hadoop.hive.ql.ddl.DDLTask. For input string: "random_partition"

ql/src/test/results/clientpositive/llap/msck_repair_9.q.out

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,57 @@ PREHOOK: Output: default@tbl_y
9090
POSTHOOK: query: MSCK REPAIR TABLE tbl_y
9191
POSTHOOK: type: MSCK
9292
POSTHOOK: Output: default@tbl_y
93-
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
93+
Partitions not in metastore: tbl_y:month=12/day=2 tbl_y:month=12/day=3 tbl_y:month=ANOTHER_PARTITION/day=3
94+
#### A masked pattern was here ####
95+
PREHOOK: query: SHOW PARTITIONS tbl_y
96+
PREHOOK: type: SHOWPARTITIONS
97+
PREHOOK: Input: default@tbl_y
98+
POSTHOOK: query: SHOW PARTITIONS tbl_y
99+
POSTHOOK: type: SHOWPARTITIONS
100+
POSTHOOK: Input: default@tbl_y
101+
month=12/day=2
102+
month=12/day=3
103+
month=ANOTHER_PARTITION/day=3
104+
PREHOOK: query: INSERT INTO tbl_y (id, name, day) values(4, 'ddd', 3)
105+
PREHOOK: type: QUERY
106+
PREHOOK: Input: _dummy_database@_dummy_table
107+
PREHOOK: Output: default@tbl_y
108+
POSTHOOK: query: INSERT INTO tbl_y (id, name, day) values(4, 'ddd', 3)
109+
POSTHOOK: type: QUERY
110+
POSTHOOK: Input: _dummy_database@_dummy_table
111+
POSTHOOK: Output: default@tbl_y
112+
POSTHOOK: Output: default@tbl_y@month=SECOND_PARTITION/day=3
113+
POSTHOOK: Lineage: tbl_y PARTITION(month=SECOND_PARTITION,day=3).id SCRIPT []
114+
POSTHOOK: Lineage: tbl_y PARTITION(month=SECOND_PARTITION,day=3).name SCRIPT []
115+
PREHOOK: query: INSERT INTO tbl_y (id, name, day) values(4, 'ddd', 3)
116+
PREHOOK: type: QUERY
117+
PREHOOK: Input: _dummy_database@_dummy_table
118+
PREHOOK: Output: default@tbl_y
119+
POSTHOOK: query: INSERT INTO tbl_y (id, name, day) values(4, 'ddd', 3)
120+
POSTHOOK: type: QUERY
121+
POSTHOOK: Input: _dummy_database@_dummy_table
122+
POSTHOOK: Output: default@tbl_y
123+
POSTHOOK: Output: default@tbl_y@month=OTHER_PARTITION/day=3
124+
POSTHOOK: Lineage: tbl_y PARTITION(month=OTHER_PARTITION,day=3).id SCRIPT []
125+
POSTHOOK: Lineage: tbl_y PARTITION(month=OTHER_PARTITION,day=3).name SCRIPT []
126+
PREHOOK: query: SHOW PARTITIONS tbl_y
127+
PREHOOK: type: SHOWPARTITIONS
128+
PREHOOK: Input: default@tbl_y
129+
POSTHOOK: query: SHOW PARTITIONS tbl_y
130+
POSTHOOK: type: SHOWPARTITIONS
131+
POSTHOOK: Input: default@tbl_y
132+
month=12/day=2
133+
month=12/day=3
134+
month=ANOTHER_PARTITION/day=3
135+
month=OTHER_PARTITION/day=3
136+
month=SECOND_PARTITION/day=3
137+
PREHOOK: query: MSCK REPAIR TABLE tbl_y
138+
PREHOOK: type: MSCK
139+
PREHOOK: Output: default@tbl_y
140+
POSTHOOK: query: MSCK REPAIR TABLE tbl_y
141+
POSTHOOK: type: MSCK
142+
POSTHOOK: Output: default@tbl_y
143+
Partitions not in metastore: tbl_y:month=12/day=__HIVE_DEFAULT_PARTITION__
94144
#### A masked pattern was here ####
95145
PREHOOK: query: SHOW PARTITIONS tbl_y
96146
PREHOOK: type: SHOWPARTITIONS
@@ -102,6 +152,8 @@ month=12/day=2
102152
month=12/day=3
103153
month=12/day=__HIVE_DEFAULT_PARTITION__
104154
month=ANOTHER_PARTITION/day=3
155+
month=OTHER_PARTITION/day=3
156+
month=SECOND_PARTITION/day=3
105157
PREHOOK: query: DROP TABLE tbl_x
106158
PREHOOK: type: DROPTABLE
107159
PREHOOK: Input: default@tbl_x

standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreChecker.java

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -444,34 +444,37 @@ void findUnknownPartitions(Table table, Set<Path> missingPartDirs,
444444
for (Path partPath : missingPartDirs) {
445445
FileSystem fs = partPath.getFileSystem(conf);
446446
String partitionName = getPartitionName(fs.makeQualified(tablePath),
447-
partPath, partColNames, partitionColToTypeMap);
447+
partPath, partColNames, partitionColToTypeMap, conf);
448+
if (partitionName == null) {
449+
// Skip this partition if there is some issue in the partition validation
450+
LOG.warn("Skipping partition : " + partPath.getName());
451+
continue;
452+
}
448453
LOG.debug("PartitionName: " + partitionName);
449454

450-
if (partitionName != null) {
451-
CheckResult.PartitionResult pr = new CheckResult.PartitionResult();
452-
pr.setPartitionName(partitionName);
453-
pr.setTableName(table.getTableName());
454-
// Also set the correct partition path here as creating path from Warehouse.makePartPath will always return
455-
// lowercase keys/path. Even if we add the new partition with lowerkeys, get queries on such partition
456-
// will not return any results.
457-
pr.setPath(partPath);
458-
459-
// Check if partition already exists. No need to check for those partition which are present in db
460-
// but no in fs as msck will override the partition location in db
461-
if (result.getCorrectPartitions().contains(pr)) {
462-
String msg = "The partition '" + pr.toString() + "' already exists for table" + table.getTableName();
463-
throw new MetastoreException(msg);
464-
} else if (result.getPartitionsNotInMs().contains(pr)) {
465-
String msg = "Found two paths for same partition '" + pr.toString() + "' for table " + table.getTableName();
466-
throw new MetastoreException(msg);
467-
}
468-
if (transactionalTable) {
469-
setMaxTxnAndWriteIdFromPartition(partPath, pr);
470-
}
471-
result.getPartitionsNotInMs().add(pr);
472-
if (result.getPartitionsNotOnFs().contains(pr)) {
473-
result.getPartitionsNotOnFs().remove(pr);
474-
}
455+
CheckResult.PartitionResult pr = new CheckResult.PartitionResult();
456+
pr.setPartitionName(partitionName);
457+
pr.setTableName(table.getTableName());
458+
// Also set the correct partition path here as creating path from Warehouse.makePartPath will always return
459+
// lowercase keys/path. Even if we add the new partition with lowerkeys, get queries on such partition
460+
// will not return any results.
461+
pr.setPath(partPath);
462+
463+
// Check if partition already exists. No need to check for those partition which are present in db
464+
// but no in fs as msck will override the partition location in db
465+
if (result.getCorrectPartitions().contains(pr)) {
466+
String msg = "The partition '" + pr.toString() + "' already exists for table" + table.getTableName();
467+
throw new MetastoreException(msg);
468+
} else if (result.getPartitionsNotInMs().contains(pr)) {
469+
String msg = "Found two paths for same partition '" + pr.toString() + "' for table " + table.getTableName();
470+
throw new MetastoreException(msg);
471+
}
472+
if (transactionalTable) {
473+
setMaxTxnAndWriteIdFromPartition(partPath, pr);
474+
}
475+
result.getPartitionsNotInMs().add(pr);
476+
if (result.getPartitionsNotOnFs().contains(pr)) {
477+
result.getPartitionsNotOnFs().remove(pr);
475478
}
476479
}
477480
LOG.debug("Number of partitions not in metastore : " + result.getPartitionsNotInMs().size());

standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreServerUtils.java

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@
6363
import org.apache.commons.collections.CollectionUtils;
6464
import org.apache.commons.collections.ListUtils;
6565
import org.apache.commons.lang3.StringUtils;
66-
import org.apache.commons.lang3.math.NumberUtils;
6766
import org.apache.hadoop.conf.Configuration;
6867
import org.apache.hadoop.fs.FileStatus;
6968
import org.apache.hadoop.fs.Path;
@@ -1608,8 +1607,8 @@ public static Partition getPartition(IMetaStoreClient msc, Table tbl, Map<String
16081607
* @return Partition name, for example partitiondate=2008-01-01
16091608
*/
16101609
public static String getPartitionName(Path tablePath, Path partitionPath, Set<String> partCols,
1611-
Map<String, String> partitionColToTypeMap) {
1612-
String result = null;
1610+
Map<String, String> partitionColToTypeMap, Configuration conf) {
1611+
StringBuilder result = null;
16131612
Path currPath = partitionPath;
16141613
LOG.debug("tablePath:" + tablePath + ", partCols: " + partCols);
16151614

@@ -1620,7 +1619,7 @@ public static String getPartitionName(Path tablePath, Path partitionPath, Set<St
16201619
if (parts.length > 0) {
16211620
if (parts.length != 2) {
16221621
LOG.warn(currPath.getName() + " is not a valid partition name");
1623-
return result;
1622+
return result.toString();
16241623
}
16251624

16261625
// 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
16291628
// Do not convert the partitionValue to lowercase
16301629
String partitionValue = parts[1];
16311630
if (partCols.contains(partitionName)) {
1631+
String normalisedPartitionValue = getNormalisedPartitionValue(partitionValue,
1632+
partitionColToTypeMap.get(partitionName), conf);
1633+
if (normalisedPartitionValue == null) {
1634+
return null;
1635+
}
16321636
if (result == null) {
1633-
result = partitionName + "="
1634-
+ getNormalisedPartitionValue(partitionValue, partitionColToTypeMap.get(partitionName));
1637+
result = new StringBuilder(partitionName + "=" + normalisedPartitionValue);
16351638
} else {
1636-
result = partitionName + "="
1637-
+ getNormalisedPartitionValue(partitionValue, partitionColToTypeMap.get(partitionName))
1638-
+ Path.SEPARATOR + result;
1639+
result.insert(0, partitionName + "=" + normalisedPartitionValue + Path.SEPARATOR);
16391640
}
16401641
}
16411642
}
16421643
currPath = currPath.getParent();
16431644
LOG.debug("currPath=" + currPath);
16441645
}
1645-
return result;
1646+
return (result == null) ? null : result.toString();
16461647
}
16471648

1648-
public static String getNormalisedPartitionValue(String partitionValue, String type) {
1649-
1650-
if (!NumberUtils.isParsable(partitionValue)) {
1649+
public static String getNormalisedPartitionValue(String partitionValue, String type, Configuration conf) {
1650+
// 1. Handle simple exit cases first.
1651+
if (type == null) {
16511652
return partitionValue;
16521653
}
1653-
1654-
LOG.debug("Converting '" + partitionValue + "' to type: '" + type + "'.");
1655-
1656-
if (type.equalsIgnoreCase("tinyint")
1657-
|| type.equalsIgnoreCase("smallint")
1658-
|| type.equalsIgnoreCase("int")){
1659-
return Integer.toString(Integer.parseInt(partitionValue));
1660-
} else if (type.equalsIgnoreCase("bigint")){
1661-
return Long.toString(Long.parseLong(partitionValue));
1662-
} else if (type.equalsIgnoreCase("float")){
1663-
return Float.toString(Float.parseFloat(partitionValue));
1664-
} else if (type.equalsIgnoreCase("double")){
1665-
return Double.toString(Double.parseDouble(partitionValue));
1666-
} else if (type.startsWith("decimal")){
1667-
// Decimal datatypes are stored like decimal(10,10)
1668-
return new BigDecimal(partitionValue).stripTrailingZeros().toPlainString();
1654+
if (Objects.equals(partitionValue, MetastoreConf.getVar(conf,
1655+
MetastoreConf.ConfVars.DEFAULTPARTITIONNAME))) {
1656+
// This is the special partition name for NULL values. It should never be parsed.
1657+
return partitionValue;
1658+
}
1659+
// 2. If the type is not numeric, no normalization is needed.
1660+
String colType = ColumnType.getTypeName(type);
1661+
if (!ColumnType.NumericTypes.contains(colType)) {
1662+
return partitionValue;
1663+
}
1664+
// 3. At this point, we have a numeric type that needs normalization.
1665+
LOG.debug("Normalizing partition value '{}' for type '{}'.", partitionValue, type);
1666+
try {
1667+
switch (colType) {
1668+
case ColumnType.TINYINT_TYPE_NAME:
1669+
case ColumnType.SMALLINT_TYPE_NAME:
1670+
case ColumnType.INT_TYPE_NAME:
1671+
return Integer.toString(Integer.parseInt(partitionValue));
1672+
case ColumnType.BIGINT_TYPE_NAME:
1673+
return Long.toString(Long.parseLong(partitionValue));
1674+
case ColumnType.FLOAT_TYPE_NAME:
1675+
return Float.toString(Float.parseFloat(partitionValue));
1676+
case ColumnType.DOUBLE_TYPE_NAME:
1677+
return Double.toString(Double.parseDouble(partitionValue));
1678+
case ColumnType.DECIMAL_TYPE_NAME:
1679+
return new BigDecimal(partitionValue).stripTrailingZeros().toPlainString();
1680+
}
1681+
} catch (NumberFormatException e) {
1682+
// 4. Handle cases where the value cannot be parsed as the expected number type.
1683+
String validationMode = MetastoreConf.getVar(conf, MetastoreConf.ConfVars.MSCK_PATH_VALIDATION);
1684+
if ("throw".equals(validationMode)) {
1685+
LOG.error("Invalid partition value: Cannot parse '{}' as type '{}'. Failing MSCK. "
1686+
+ "Set hive.msck.path.validation=skip to ignore invalid partitions.", partitionValue, type);
1687+
throw e;
1688+
} else if ("skip".equals(validationMode)) {
1689+
LOG.warn("Skipping invalid partition value '{}' for type '{}' due to parsing error.", partitionValue, type);
1690+
// Signals the caller to skip this partition.
1691+
return null;
1692+
}
16691693
}
16701694
return partitionValue;
16711695
}

standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreServerUtils.java

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import static org.hamcrest.core.Is.is;
7676
import static org.junit.Assert.assertEquals;
7777
import static org.junit.Assert.assertFalse;
78+
import static org.junit.Assert.assertNull;
7879
import static org.junit.Assert.assertThat;
7980
import static org.junit.Assert.assertTrue;
8081
import static org.mockito.Mockito.mock;
@@ -950,22 +951,55 @@ public void testAnonymizeConnectionURL() {
950951

951952
@Test
952953
public void testConversionToSignificantNumericTypes() {
953-
assertEquals("1", MetaStoreServerUtils.getNormalisedPartitionValue("0001", "tinyint"));
954-
assertEquals("1", MetaStoreServerUtils.getNormalisedPartitionValue("0001", "smallint"));
955-
assertEquals("10", MetaStoreServerUtils.getNormalisedPartitionValue("00010", "int"));
956-
assertEquals("-10", MetaStoreServerUtils.getNormalisedPartitionValue("-00010", "int"));
957-
958-
assertEquals("10", MetaStoreServerUtils.getNormalisedPartitionValue("00010", "bigint"));
959-
assertEquals("-10", MetaStoreServerUtils.getNormalisedPartitionValue("-00010", "bigint"));
960-
961-
assertEquals("1.01", MetaStoreServerUtils.getNormalisedPartitionValue("0001.0100", "float"));
962-
assertEquals("-1.01", MetaStoreServerUtils.getNormalisedPartitionValue("-0001.0100", "float"));
963-
assertEquals("1.01", MetaStoreServerUtils.getNormalisedPartitionValue("0001.010000", "double"));
964-
assertEquals("-1.01", MetaStoreServerUtils.getNormalisedPartitionValue("-0001.010000", "double"));
965-
assertEquals("1.01", MetaStoreServerUtils.getNormalisedPartitionValue("0001.0100", "decimal"));
966-
assertEquals("-1.01", MetaStoreServerUtils.getNormalisedPartitionValue("-0001.0100", "decimal"));
954+
Configuration metastoreConf = MetastoreConf.newMetastoreConf();
955+
assertEquals("1", MetaStoreServerUtils.getNormalisedPartitionValue("0001", "tinyint", metastoreConf));
956+
assertEquals("1", MetaStoreServerUtils.getNormalisedPartitionValue("0001", "smallint", metastoreConf));
957+
assertEquals("10", MetaStoreServerUtils.getNormalisedPartitionValue("00010", "int", metastoreConf));
958+
assertEquals("-10", MetaStoreServerUtils.getNormalisedPartitionValue("-00010", "int", metastoreConf));
959+
960+
assertEquals("10", MetaStoreServerUtils.getNormalisedPartitionValue("00010", "bigint", metastoreConf));
961+
assertEquals("-10", MetaStoreServerUtils.getNormalisedPartitionValue("-00010", "bigint", metastoreConf));
962+
963+
assertEquals("1.01", MetaStoreServerUtils.getNormalisedPartitionValue("0001.0100", "float", metastoreConf));
964+
assertEquals("-1.01", MetaStoreServerUtils.getNormalisedPartitionValue("-0001.0100", "float", metastoreConf));
965+
assertEquals("1.01", MetaStoreServerUtils.getNormalisedPartitionValue("0001.010000", "double", metastoreConf));
966+
assertEquals("-1.01", MetaStoreServerUtils.getNormalisedPartitionValue("-0001.010000", "double", metastoreConf));
967+
assertEquals("1.01", MetaStoreServerUtils.getNormalisedPartitionValue("0001.0100", "decimal", metastoreConf));
968+
assertEquals("-1.01", MetaStoreServerUtils.getNormalisedPartitionValue("-0001.0100", "decimal", metastoreConf));
969+
assertEquals("-1.01", MetaStoreServerUtils.getNormalisedPartitionValue("-0001.0100", "decimal(10,10)", metastoreConf));
967970
assertEquals("__HIVE_DEFAULT_PARTITION__", MetaStoreServerUtils.getNormalisedPartitionValue(
968-
"__HIVE_DEFAULT_PARTITION__", "decimal"));
971+
"__HIVE_DEFAULT_PARTITION__", "decimal", metastoreConf));
972+
}
973+
974+
@Test
975+
public void testConversionFromStringToNumeric() {
976+
Configuration metastoreConf = MetastoreConf.newMetastoreConf();
977+
Assert.assertThrows(NumberFormatException.class, () -> MetaStoreServerUtils.getNormalisedPartitionValue(
978+
"Random_Partition", "double", metastoreConf));
979+
Assert.assertThrows(NumberFormatException.class, () -> MetaStoreServerUtils.getNormalisedPartitionValue(
980+
"Random_Partition", "int", metastoreConf));
981+
Assert.assertThrows(NumberFormatException.class, () -> MetaStoreServerUtils.getNormalisedPartitionValue(
982+
"Random_Partition", "smallint", metastoreConf));
983+
Assert.assertThrows(NumberFormatException.class, () -> MetaStoreServerUtils.getNormalisedPartitionValue(
984+
"Random_Partition", "bigint", metastoreConf));
985+
Assert.assertThrows(NumberFormatException.class, () -> MetaStoreServerUtils.getNormalisedPartitionValue(
986+
"Random_Partition", "float", metastoreConf));
987+
Assert.assertThrows(NumberFormatException.class, () -> MetaStoreServerUtils.getNormalisedPartitionValue(
988+
"Random_Partition", "decimal", metastoreConf));
989+
990+
MetastoreConf.setVar(metastoreConf, MetastoreConf.ConfVars.MSCK_PATH_VALIDATION, "skip");
991+
assertNull(MetaStoreServerUtils.getNormalisedPartitionValue(
992+
"Random_Partition", "int", metastoreConf));
993+
assertNull(MetaStoreServerUtils.getNormalisedPartitionValue(
994+
"Random_Partition", "smallint", metastoreConf));
995+
assertNull(MetaStoreServerUtils.getNormalisedPartitionValue(
996+
"Random_Partition", "bigint", metastoreConf));
997+
assertNull(MetaStoreServerUtils.getNormalisedPartitionValue(
998+
"Random_Partition", "float", metastoreConf));
999+
assertNull(MetaStoreServerUtils.getNormalisedPartitionValue(
1000+
"Random_Partition", "double", metastoreConf));
1001+
assertNull(MetaStoreServerUtils.getNormalisedPartitionValue(
1002+
"Random_Partition", "decimal", metastoreConf));
9691003
}
9701004

9711005
@Test

0 commit comments

Comments
 (0)