This is an automated email from the ASF dual-hosted git repository.
lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push:
new 4bf2d9b01d [flink] Fix that 'values-time' partition expire might throw
NPE (#4646)
4bf2d9b01d is described below
commit 4bf2d9b01d0176bdf52e68dd996cbe79f4304d14
Author: yuzelin <[email protected]>
AuthorDate: Thu Dec 5 23:57:05 2024 +0800
[flink] Fix that 'values-time' partition expire might throw NPE (#4646)
---
.../PartitionValuesTimeExpireStrategy.java | 21 ++++++++++++++++-----
.../procedure/ExpirePartitionsProcedureITCase.java | 13 +++++++++++++
2 files changed, 29 insertions(+), 5 deletions(-)
diff --git
a/paimon-core/src/main/java/org/apache/paimon/partition/PartitionValuesTimeExpireStrategy.java
b/paimon-core/src/main/java/org/apache/paimon/partition/PartitionValuesTimeExpireStrategy.java
index 80ae633fd2..51c53282c4 100644
---
a/paimon-core/src/main/java/org/apache/paimon/partition/PartitionValuesTimeExpireStrategy.java
+++
b/paimon-core/src/main/java/org/apache/paimon/partition/PartitionValuesTimeExpireStrategy.java
@@ -81,23 +81,34 @@ public class PartitionValuesTimeExpireStrategy extends
PartitionExpireStrategy {
LocalDateTime partTime = timeExtractor.extract(partitionKeys,
Arrays.asList(array));
return expireDateTime.isAfter(partTime);
} catch (DateTimeParseException e) {
- String partitionInfo =
- IntStream.range(0, partitionKeys.size())
- .mapToObj(i -> partitionKeys.get(i) + ":" +
array[i])
- .collect(Collectors.joining(","));
LOG.warn(
"Can't extract datetime from partition {}. If you want
to configure partition expiration, please:\n"
+ " 1. Check the expiration configuration.\n"
+ " 2. Manually delete the partition using
the drop-partition command if the partition"
+ " value is non-date formatted.\n"
+ " 3. Use '{}' expiration strategy by set
'{}', which supports non-date formatted partition.",
- partitionInfo,
+ formatPartitionInfo(array),
+ CoreOptions.PartitionExpireStrategy.UPDATE_TIME,
+ CoreOptions.PARTITION_EXPIRATION_STRATEGY.key());
+ return false;
+ } catch (NullPointerException e) {
+ // there might exist NULL partition value
+ LOG.warn(
+ "This partition {} cannot be expired because it
contains null value. "
+ + "You can try to drop it manually or use '{}'
expiration strategy by set '{}'.",
+ formatPartitionInfo(array),
CoreOptions.PartitionExpireStrategy.UPDATE_TIME,
CoreOptions.PARTITION_EXPIRATION_STRATEGY.key());
return false;
}
}
+ private String formatPartitionInfo(Object[] array) {
+ return IntStream.range(0, partitionKeys.size())
+ .mapToObj(i -> partitionKeys.get(i) + ":" + array[i])
+ .collect(Collectors.joining(","));
+ }
+
@Override
public boolean test(
long rowCount,
diff --git
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/procedure/ExpirePartitionsProcedureITCase.java
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/procedure/ExpirePartitionsProcedureITCase.java
index bc2e84902f..2d1fb6dde7 100644
---
a/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/procedure/ExpirePartitionsProcedureITCase.java
+++
b/paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/procedure/ExpirePartitionsProcedureITCase.java
@@ -402,6 +402,19 @@ public class ExpirePartitionsProcedureITCase extends
CatalogITCaseBase {
.containsExactlyInAnyOrder("4:2024-06-03:01:00",
"Never-expire:9999-09-09:99:99");
}
+ @Test
+ public void testNullPartitionExpire() {
+ sql("CREATE TABLE T (k INT, ds STRING) PARTITIONED BY (ds);");
+ sql("INSERT INTO T VALUES (1, CAST (NULL AS STRING))");
+ assertThat(
+ callExpirePartitions(
+ "CALL sys.expire_partitions("
+ + "`table` => 'default.T'"
+ + ", expiration_time => '1 d'"
+ + ", timestamp_formatter =>
'yyyyMMdd')"))
+ .containsExactly("No expired partitions.");
+ }
+
/** Return a list of expired partitions. */
public List<String> callExpirePartitions(String callSql) {
return sql(callSql).stream()