This is an automated email from the ASF dual-hosted git repository. dataroaring 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 ac2b060cd28 [fix](tvf) fix azure tvf: can not build s3() (#45872) ac2b060cd28 is described below commit ac2b060cd286688d70e992b974a1a8d6cbe43000 Author: Kaijie Chen <chenkai...@selectdb.com> AuthorDate: Fri Dec 27 19:18:03 2024 +0800 [fix](tvf) fix azure tvf: can not build s3() (#45872) ### What problem does this PR solve? Issue Number: DORIS-17644 Related PR: #37240 Problem Summary: `properties` is an immutable map, trying to modify it will cause `UnsupportedOperationException` to be thrown. ``` 2024-12-24 18:01:22,287 WARN (mysql-nio-pool-0|490) [StmtExecutor.executeByNereids():836] Nereids plan query failed: SELECT * FROM S3 ( ... ) org.apache.doris.nereids.exceptions.AnalysisException: Can not build s3(): null at org.apache.doris.nereids.trees.expressions.functions.table.S3.toCatalogFunction(S3.java:55) ~[doris-fe.jar:1.2-SNAPSHOT] at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:186) ~[guava-33.2.1-jre.jar:?] at org.apache.doris.nereids.trees.expressions.functions.table.TableValuedFunction.lambda$new$0(TableValuedFunction.java:55) ~[doris-fe.jar:1.2-SNAPSHOT] at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:186) ~[guava-33.2.1-jre.jar:?] at org.apache.doris.nereids.trees.expressions.functions.table.TableValuedFunction.getTable(TableValuedFunction.java:103) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.trees.plans.logical.LogicalTVFRelation.computeOutput(LogicalTVFRelation.java:105) ~[doris-fe.jar:1.2-SNAPSHOT] at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:186) ~[guava-33.2.1-jre.jar:?] at org.apache.doris.nereids.properties.LogicalProperties.getOutput(LogicalProperties.java:104) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.trees.plans.AbstractPlan.getOutput(AbstractPlan.java:169) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.util.PlanUtils.fastGetChildrenOutputs(PlanUtils.java:161) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.rules.analysis.BindExpression.buildSimpleExprAnalyzer(BindExpression.java:1241) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.rules.analysis.BindExpression.bindProject(BindExpression.java:626) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.pattern.PatternMatcher$1.transform(PatternMatcher.java:92) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.rules.AppliedAwareRule.transform(AppliedAwareRule.java:55) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.jobs.rewrite.PlanTreeRewriteJob.rewrite(PlanTreeRewriteJob.java:57) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.jobs.rewrite.PlanTreeRewriteBottomUpJob.rewriteThis(PlanTreeRewriteBottomUpJob.java:91) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.jobs.rewrite.PlanTreeRewriteBottomUpJob.execute(PlanTreeRewriteBottomUpJob.java:75) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.jobs.scheduler.SimpleJobScheduler.executeJobPool(SimpleJobScheduler.java:44) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.jobs.rewrite.RootPlanTreeRewriteJob.execute(RootPlanTreeRewriteJob.java:66) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.jobs.executor.AbstractBatchJobExecutor.execute(AbstractBatchJobExecutor.java:139) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.jobs.executor.Analyzer.analyze(Analyzer.java:87) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.NereidsPlanner.lambda$analyze$4(NereidsPlanner.java:361) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.NereidsPlanner.keepOrShowPlanProcess(NereidsPlanner.java:888) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.NereidsPlanner.analyze(NereidsPlanner.java:361) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.NereidsPlanner.planWithoutLock(NereidsPlanner.java:250) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.NereidsPlanner.planWithLock(NereidsPlanner.java:224) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.NereidsPlanner.plan(NereidsPlanner.java:145) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.StmtExecutor.executeByNereids(StmtExecutor.java:830) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.StmtExecutor.execute(StmtExecutor.java:609) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.StmtExecutor.queryRetry(StmtExecutor.java:572) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.StmtExecutor.execute(StmtExecutor.java:562) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.ConnectProcessor.executeQuery(ConnectProcessor.java:347) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.ConnectProcessor.handleQuery(ConnectProcessor.java:250) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.MysqlConnectProcessor.handleQuery(MysqlConnectProcessor.java:209) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.MysqlConnectProcessor.dispatch(MysqlConnectProcessor.java:237) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.qe.MysqlConnectProcessor.processOnce(MysqlConnectProcessor.java:417) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.mysql.ReadListener.lambda$handleEvent$0(ReadListener.java:52) ~[doris-fe.jar:1.2-SNAPSHOT] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?] at java.lang.Thread.run(Thread.java:833) ~[?:?] Caused by: java.lang.UnsupportedOperationException at com.google.common.collect.ImmutableMap.put(ImmutableMap.java:814) ~[guava-33.2.1-jre.jar:?] at org.apache.doris.tablefunction.S3TableValuedFunction.<init>(S3TableValuedFunction.java:66) ~[doris-fe.jar:1.2-SNAPSHOT] at org.apache.doris.nereids.trees.expressions.functions.table.S3.toCatalogFunction(S3.java:53) ~[doris-fe.jar:1.2-SNAPSHOT] ... 39 more ``` --- .../doris/tablefunction/S3TableValuedFunction.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/S3TableValuedFunction.java b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/S3TableValuedFunction.java index 7a9566c13e0..3defb171a9f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/S3TableValuedFunction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/S3TableValuedFunction.java @@ -56,11 +56,6 @@ public class S3TableValuedFunction extends ExternalFileTableValuedFunction { "ACCESS_KEY", "SECRET_KEY", "SESSION_TOKEN", "REGION"); public S3TableValuedFunction(Map<String, String> properties) throws AnalysisException { - final boolean isAzureTvf = AzureProperties.checkAzureProviderPropertyExist(properties); - // Azure could run without region - if (isAzureTvf) { - properties.put(S3Properties.REGION, "DUMMY-REGION"); - } // 1. analyze common properties Map<String, String> otherProps = super.parseCommonProperties(properties); @@ -84,8 +79,14 @@ public class S3TableValuedFunction extends ExternalFileTableValuedFunction { // If endpoint is missing, exception will be thrown. String endpoint = constructEndpoint(otherProps, s3uri); if (!otherProps.containsKey(S3Properties.REGION)) { - String region = s3uri.getRegion().orElseThrow(() -> - new AnalysisException(String.format("Properties '%s' is required.", S3Properties.REGION))); + String region; + if (AzureProperties.checkAzureProviderPropertyExist(properties)) { + // Azure could run without region + region = s3uri.getRegion().orElse("DUMMY-REGION"); + } else { + region = s3uri.getRegion().orElseThrow(() -> new AnalysisException( + String.format("Properties '%s' is required.", S3Properties.REGION))); + } otherProps.put(S3Properties.REGION, region); } checkNecessaryS3Properties(otherProps); @@ -99,7 +100,7 @@ public class S3TableValuedFunction extends ExternalFileTableValuedFunction { locationProperties = S3Properties.credentialToMap(credential); locationProperties.put(PropertyConverter.USE_PATH_STYLE, usePathStyle); - if (isAzureTvf) { + if (AzureProperties.checkAzureProviderPropertyExist(properties)) { // For Azure's compatibility, we need bucket to connect to the blob storage's container locationProperties.put(S3Properties.BUCKET, s3uri.getBucket()); } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org