diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/paimon/PaimonUtil.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/paimon/PaimonUtil.java index a0ede02a32a0ff..8f82f3c3aa0695 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/paimon/PaimonUtil.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/paimon/PaimonUtil.java @@ -59,6 +59,7 @@ import org.apache.paimon.types.MapType; import org.apache.paimon.types.RowType; import org.apache.paimon.types.VarCharType; +import org.apache.paimon.utils.DateTimeUtils; import org.apache.paimon.utils.InstantiationUtil; import org.apache.paimon.utils.Pair; import org.apache.paimon.utils.Projection; @@ -116,12 +117,23 @@ public static PaimonPartitionInfo generatePartitionInfo(List partitionCo Map nameToPartitionItem = Maps.newHashMap(); Map nameToPartition = Maps.newHashMap(); PaimonPartitionInfo partitionInfo = new PaimonPartitionInfo(nameToPartitionItem, nameToPartition); + List types = partitionColumns.stream() + .map(Column::getType) + .collect(Collectors.toList()); + Map columnNameToType = partitionColumns.stream() + .collect(Collectors.toMap(Column::getName, Column::getType)); for (Partition partition : paimonPartitions) { Map spec = partition.spec(); StringBuilder sb = new StringBuilder(); for (Map.Entry entry : spec.entrySet()) { - sb.append(entry.getKey()).append("=").append(entry.getValue()).append("/"); + sb.append(entry.getKey()).append("="); + // Paimon stores DATE type as days since 1970-01-01 (epoch), so we convert the integer to a date string. + if (columnNameToType.getOrDefault(entry.getKey(), Type.NULL).isDateV2()) { + sb.append(DateTimeUtils.formatDate(Integer.parseInt(entry.getValue()))).append("/"); + } else { + sb.append(entry.getValue()).append("/"); + } } if (sb.length() > 0) { sb.deleteCharAt(sb.length() - 1); @@ -131,7 +143,7 @@ public static PaimonPartitionInfo generatePartitionInfo(List partitionCo try { // partition values return by paimon api, may have problem, // to avoid affecting the query, we catch exceptions here - nameToPartitionItem.put(partitionName, toListPartitionItem(partitionName, partitionColumns)); + nameToPartitionItem.put(partitionName, toListPartitionItem(partitionName, types)); } catch (Exception e) { LOG.warn("toListPartitionItem failed, partitionColumns: {}, partitionValues: {}", partitionColumns, partition.spec(), e); @@ -140,11 +152,8 @@ public static PaimonPartitionInfo generatePartitionInfo(List partitionCo return partitionInfo; } - public static ListPartitionItem toListPartitionItem(String partitionName, List partitionColumns) + public static ListPartitionItem toListPartitionItem(String partitionName, List types) throws AnalysisException { - List types = partitionColumns.stream() - .map(Column::getType) - .collect(Collectors.toList()); // Partition name will be in format: nation=cn/city=beijing // parse it to get values "cn" and "beijing" List partitionValues = HiveUtil.toPartitionValues(partitionName); diff --git a/regression-test/data/mtmv_p0/test_paimon_mtmv.out b/regression-test/data/mtmv_p0/test_paimon_mtmv.out index 0cfe4bd293cf51..5c7547c0687c86 100644 --- a/regression-test/data/mtmv_p0/test_paimon_mtmv.out +++ b/regression-test/data/mtmv_p0/test_paimon_mtmv.out @@ -143,6 +143,9 @@ true -- !date_partition_base_table -- 1 2020-01-01 +-- !date_type_partition -- +1 2020-01-01 + -- !date_partition -- 1 2020-01-01 diff --git a/regression-test/suites/mtmv_p0/test_paimon_mtmv.groovy b/regression-test/suites/mtmv_p0/test_paimon_mtmv.groovy index abd0f64450ef4e..c4ea889f92307a 100644 --- a/regression-test/suites/mtmv_p0/test_paimon_mtmv.groovy +++ b/regression-test/suites/mtmv_p0/test_paimon_mtmv.groovy @@ -268,8 +268,7 @@ suite("test_paimon_mtmv", "p0,external,mtmv,external_docker,external_docker_dori // date type will has problem order_qt_date_partition_base_table "SELECT * FROM ${catalogName}.`test_paimon_spark`.date_partition" - test { - sql """ + sql """ CREATE MATERIALIZED VIEW ${mvName} BUILD DEFERRED REFRESH AUTO ON MANUAL partition by (`create_date`) @@ -278,8 +277,15 @@ suite("test_paimon_mtmv", "p0,external,mtmv,external_docker,external_docker_dori AS SELECT * FROM ${catalogName}.`test_paimon_spark`.date_partition; """ - exception "Unable to find a suitable base table" - } + sql """ + REFRESH MATERIALIZED VIEW ${mvName} auto; + """ + waitingMTMVTaskFinishedByMvName(mvName) + def showPaimonDateTypePartitionsResult = sql """show partitions from ${mvName}""" + logger.info("showPaimonDateTypePartitionsResult: " + showPaimonDateTypePartitionsResult.toString()) + assertTrue(showPaimonDateTypePartitionsResult.toString().contains("p_20200101")) + order_qt_date_type_partition "select * FROM ${mvName}" + sql """drop materialized view if exists ${mvName};""" sql """ CREATE MATERIALIZED VIEW ${mvName}