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

Reply via email to