This is an automated email from the ASF dual-hosted git repository.
hello-stephen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new cca22317162 [fix](fe) Reject conflicting path partition columns
(#67408)
cca22317162 is described below
commit cca2231716264a15cbc884fbeac96eef4eafd66b
Author: Refrain <[email protected]>
AuthorDate: Wed Oct 21 15:42:39 2026 +0800
[fix](fe) Reject conflicting path partition columns (#67408)
Problem Summary: A file table-valued function could append a path
partition column whose name already existed in the inferred file schema.
The duplicate schema made direct column references ambiguous and allowed
`SELECT *` to reach an internal backend error. Reject case-insensitive
conflicts while constructing the schema so the invalid configuration
fails during analysis.
### Release note
File table-valued functions now reject path partition columns that
conflict with existing file columns.
---
.../ExternalFileTableValuedFunction.java | 6 ++++
.../partition_col=from_path/data.csv | 3 ++
.../test_path_partition_column_collision.groovy | 37 ++++++++++++++++++++++
3 files changed, 46 insertions(+)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/ExternalFileTableValuedFunction.java
b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/ExternalFileTableValuedFunction.java
index 0e54237a62a..2f4495ab643 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/ExternalFileTableValuedFunction.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/ExternalFileTableValuedFunction.java
@@ -493,6 +493,12 @@ public abstract class ExternalFileTableValuedFunction
extends TableValuedFunctio
// HACK(tsy): path columns are all treated as STRING type now, after
BE supports reading all columns
// types by all format readers from file meta, maybe reading path
columns types from BE then.
for (String colName : pathPartitionKeys) {
+ String colLowerName = colName.toLowerCase();
+ if (columnLowerNames.contains(colLowerName)) {
+ throw new NotSupportedException(
+ "Path partition column conflicts with an existing
column: " + colName);
+ }
+ columnLowerNames.add(colLowerName);
columns.add(new Column(colName,
ScalarType.createVarcharType(ScalarType.MAX_VARCHAR_LENGTH), false));
}
}
diff --git
a/regression-test/data/external_table_p0/tvf/test_path_partition_column_collision/partition_col=from_path/data.csv
b/regression-test/data/external_table_p0/tvf/test_path_partition_column_collision/partition_col=from_path/data.csv
new file mode 100644
index 00000000000..5ea1ce60c0d
--- /dev/null
+++
b/regression-test/data/external_table_p0/tvf/test_path_partition_column_collision/partition_col=from_path/data.csv
@@ -0,0 +1,3 @@
+partition_col,value
+from_file,1
+from_file,2
diff --git
a/regression-test/suites/external_table_p0/tvf/test_path_partition_column_collision.groovy
b/regression-test/suites/external_table_p0/tvf/test_path_partition_column_collision.groovy
new file mode 100644
index 00000000000..f0a103dee26
--- /dev/null
+++
b/regression-test/suites/external_table_p0/tvf/test_path_partition_column_collision.groovy
@@ -0,0 +1,37 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_path_partition_column_collision", "p0,external") {
+ String ak = getS3AK()
+ String sk = getS3SK()
+ String s3Endpoint = getS3Endpoint()
+ String bucket = context.config.otherConfigs.get("s3BucketName")
+
+ test {
+ sql """
+ desc function s3(
+ "URI" =
"https://${bucket}.${s3Endpoint}/regression/tvf/test_path_partition_column_collision/partition_col=from_path/data.csv",
+ "s3.access_key" = "${ak}",
+ "s3.secret_key" = "${sk}",
+ "FORMAT" = "csv_with_names",
+ "column_separator" = ",",
+ "use_path_style" = "false", -- aliyun does not support
path_style
+ "path_partition_keys" = "partition_col");
+ """
+ exception "Path partition column conflicts with an existing column:
partition_col"
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]