From 817b3ff97116dff4ef2b0b888bd4a17a3ef04e47 Mon Sep 17 00:00:00 2001 From: Arnav Balyan Date: Fri, 1 May 2026 10:48:29 +0530 Subject: [PATCH] update --- .../paimon/schema/SchemaValidation.java | 20 ++++++++++++- .../paimon/schema/SchemaValidationTest.java | 28 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/paimon-core/src/main/java/org/apache/paimon/schema/SchemaValidation.java b/paimon-core/src/main/java/org/apache/paimon/schema/SchemaValidation.java index 443766adc21b..09d6674924de 100644 --- a/paimon-core/src/main/java/org/apache/paimon/schema/SchemaValidation.java +++ b/paimon-core/src/main/java/org/apache/paimon/schema/SchemaValidation.java @@ -487,7 +487,8 @@ private static void validateFieldsPrefix(TableSchema schema, CoreOptions options .forEach( k -> { if (k.startsWith(FIELDS_PREFIX)) { - String[] fields = k.split("\\.")[1].split(FIELDS_SEPARATOR); + String[] segments = k.split("\\."); + String[] fields = segments[1].split(FIELDS_SEPARATOR); for (String field : fields) { checkArgument( DEFAULT_AGG_FUNCTION.equals(field) @@ -496,6 +497,23 @@ private static void validateFieldsPrefix(TableSchema schema, CoreOptions options "Field %s can not be found in table schema.", field)); } + // PAIMON-6471: dot paths into a ROW field's members + // (e.g. fields.row.inner.aggregate-function) are silently + // dropped today and produce wrong results. This check + // rejects them. + if (segments.length > 3 && fields.length == 1) { + String parent = fields[0]; + schema.fields().stream() + .filter(f -> f.name().equals(parent)) + .findFirst() + .ifPresent( + f -> + checkArgument( + !(f.type() instanceof RowType), + "Nested-field path is not supported on ROW field '%s': %s", + parent, + k)); + } } }); } diff --git a/paimon-core/src/test/java/org/apache/paimon/schema/SchemaValidationTest.java b/paimon-core/src/test/java/org/apache/paimon/schema/SchemaValidationTest.java index e7534a4373b6..d2bad5248c70 100644 --- a/paimon-core/src/test/java/org/apache/paimon/schema/SchemaValidationTest.java +++ b/paimon-core/src/test/java/org/apache/paimon/schema/SchemaValidationTest.java @@ -180,6 +180,34 @@ public void testPartialUpdateTableAggregateFunctionWithoutSequenceGroup() { assertThatCode(() -> validateTableSchemaExec(options)).doesNotThrowAnyException(); } + @Test + public void testNestedRowAggregateOptionRejected() { + // PAIMON-6471: nested-path agg config was silently ignored, leaving the parent ROW + // on the default aggregator and producing wrong results without any error. + List fields = + Arrays.asList( + new DataField(0, "id", DataTypes.INT()), + new DataField( + 1, + "data", + DataTypes.ROW( + DataTypes.FIELD(2, "num", DataTypes.INT()), + DataTypes.FIELD(3, "info", DataTypes.STRING())))); + + Map options = new HashMap<>(); + options.put("merge-engine", "aggregation"); + options.put("fields.data.num.aggregate-function", "sum"); + options.put("fields.data.sequence-group", "data"); + options.put(BUCKET.key(), "1"); + + TableSchema schema = + new TableSchema(1, fields, 10, emptyList(), singletonList("id"), options, ""); + + assertThatThrownBy(() -> validateTableSchema(schema)) + .hasMessageContaining("Nested-field path is not supported on ROW field 'data'") + .hasMessageContaining("fields.data.num.aggregate-function"); + } + @Test public void testChainTableAllowsNonDeduplicateMergeEngine() { Map options = new HashMap<>();