You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/12/14 06:47:38 UTC

[doris] 01/05: [Fix](Table Valued function) fix the problem that can not catchthe exception thrown by the TableValuedFunctionRef constructor (#14983)

This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 16ba1c53f301dd25f0861f897f54742bd20d9cb6
Author: Tiewei Fang <43...@users.noreply.github.com>
AuthorDate: Tue Dec 13 11:26:04 2022 +0800

    [Fix](Table Valued function) fix the problem that can not catchthe exception thrown by the TableValuedFunctionRef constructor (#14983)
    
    Put the generation of TableValuedFunctionIf in the analyze function, instead of the generation in the
    TableValuedFunctionRef constructor.
---
 .../main/java/org/apache/doris/analysis/SelectStmt.java   |  1 +
 .../org/apache/doris/analysis/TableValuedFunctionRef.java | 15 +++++++++++----
 .../tablefunction/ExternalFileTableValuedFunction.java    | 12 ++++++++----
 .../doris/tablefunction/HdfsTableValuedFunction.java      |  3 +--
 .../doris/tablefunction/NumbersTableValuedFunction.java   | 11 +++++------
 .../apache/doris/tablefunction/S3TableValuedFunction.java |  8 ++++++--
 .../apache/doris/tablefunction/TableValuedFunctionIf.java |  5 ++---
 7 files changed, 34 insertions(+), 21 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
index 5e1cb19a73..b715014149 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
@@ -304,6 +304,7 @@ public class SelectStmt extends QueryStmt {
                 inlineStmt.getTables(analyzer, expandView, tableMap, parentViewNameSet);
             } else if (tblRef instanceof TableValuedFunctionRef) {
                 TableValuedFunctionRef tblFuncRef = (TableValuedFunctionRef) tblRef;
+                tblFuncRef.analyze(analyzer);
                 tableMap.put(tblFuncRef.getTableFunction().getTable().getId(),
                         tblFuncRef.getTableFunction().getTable());
             } else {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/TableValuedFunctionRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/TableValuedFunctionRef.java
index 328b1819fa..2bbf5e00be 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/TableValuedFunctionRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/TableValuedFunctionRef.java
@@ -18,7 +18,7 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.Table;
-import org.apache.doris.common.UserException;
+import org.apache.doris.common.AnalysisException;
 import org.apache.doris.planner.PlanNodeId;
 import org.apache.doris.planner.ScanNode;
 import org.apache.doris.tablefunction.TableValuedFunctionIf;
@@ -29,10 +29,13 @@ public class TableValuedFunctionRef extends TableRef {
 
     private Table table;
     private TableValuedFunctionIf tableFunction;
+    private String funcName;
+    private Map<String, String> params;
 
-    public TableValuedFunctionRef(String funcName, String alias, Map<String, String> params) throws UserException {
+    public TableValuedFunctionRef(String funcName, String alias, Map<String, String> params) {
         super(new TableName(null, null, "_table_valued_function_" + funcName), alias);
-        this.tableFunction = TableValuedFunctionIf.getTableFunction(funcName, params);
+        this.funcName = funcName;
+        this.params = params;
         if (hasExplicitAlias()) {
             return;
         }
@@ -41,7 +44,10 @@ public class TableValuedFunctionRef extends TableRef {
 
     public TableValuedFunctionRef(TableValuedFunctionRef other) {
         super(other);
+        this.funcName = other.funcName;
+        this.params = other.params;
         this.tableFunction = other.tableFunction;
+        this.table = other.table;
     }
 
     @Override
@@ -60,12 +66,13 @@ public class TableValuedFunctionRef extends TableRef {
      * Register this table ref and then analyze the Join clause.
      */
     @Override
-    public void analyze(Analyzer analyzer) throws UserException {
+    public void analyze(Analyzer analyzer) throws AnalysisException {
         if (isAnalyzed) {
             return;
         }
         // Table function could generate a table which will has columns
         // Maybe will call be during this process
+        this.tableFunction = TableValuedFunctionIf.getTableFunction(funcName, params);
         this.table = tableFunction.getTable();
         desc = analyzer.registerTableRef(this);
         isAnalyzed = true; // true that we have assigned desc
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 17b3364294..b7d13f071a 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
@@ -134,13 +134,17 @@ public abstract class ExternalFileTableValuedFunction extends TableValuedFunctio
         return "";
     }
 
-    protected void parseFile() throws UserException {
+    protected void parseFile() throws AnalysisException {
         String path = getFilePath();
         BrokerDesc brokerDesc = getBrokerDesc();
-        BrokerUtil.parseFile(path, brokerDesc, fileStatuses);
+        try {
+            BrokerUtil.parseFile(path, brokerDesc, fileStatuses);
+        } catch (UserException e) {
+            throw new AnalysisException("parse file failed, path = " + path);
+        }
     }
 
-    protected void parseProperties(Map<String, String> validParams) throws UserException {
+    protected void parseProperties(Map<String, String> validParams) throws AnalysisException {
         String formatString = validParams.getOrDefault(FORMAT, "").toLowerCase();
         switch (formatString) {
             case "csv":
@@ -295,7 +299,7 @@ public abstract class ExternalFileTableValuedFunction extends TableValuedFunctio
             break;
         }
         if (firstFile == null) {
-            throw new AnalysisException("Can not get first file, please check s3 uri.");
+            throw new AnalysisException("Can not get first file, please check uri.");
         }
 
         // set TFileRangeDesc
diff --git a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/HdfsTableValuedFunction.java b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/HdfsTableValuedFunction.java
index 175c9e501a..b555a34e12 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/HdfsTableValuedFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/HdfsTableValuedFunction.java
@@ -21,7 +21,6 @@ import org.apache.doris.analysis.BrokerDesc;
 import org.apache.doris.analysis.ExportStmt;
 import org.apache.doris.analysis.StorageBackend.StorageType;
 import org.apache.doris.common.AnalysisException;
-import org.apache.doris.common.UserException;
 import org.apache.doris.common.util.URI;
 import org.apache.doris.thrift.TFileType;
 
@@ -65,7 +64,7 @@ public class HdfsTableValuedFunction extends ExternalFileTableValuedFunction {
     private URI hdfsUri;
     private String filePath;
 
-    public HdfsTableValuedFunction(Map<String, String> params) throws UserException {
+    public HdfsTableValuedFunction(Map<String, String> params) throws AnalysisException {
         Map<String, String> fileFormatParams = new CaseInsensitiveMap();
         locationProperties = Maps.newHashMap();
         for (String key : params.keySet()) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/NumbersTableValuedFunction.java b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/NumbersTableValuedFunction.java
index 9e1a6ed181..3e0e92b5b5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/NumbersTableValuedFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/NumbersTableValuedFunction.java
@@ -22,7 +22,6 @@ import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.PrimitiveType;
 import org.apache.doris.common.AnalysisException;
-import org.apache.doris.common.UserException;
 import org.apache.doris.planner.DataGenScanNode;
 import org.apache.doris.planner.PlanNodeId;
 import org.apache.doris.planner.ScanNode;
@@ -64,9 +63,9 @@ public class NumbersTableValuedFunction extends DataGenTableValuedFunction {
     /**
      * Constructor.
      * @param params params from user
-     * @throws UserException exception
+     * @throws AnalysisException exception
      */
-    public NumbersTableValuedFunction(Map<String, String> params) throws UserException {
+    public NumbersTableValuedFunction(Map<String, String> params) throws AnalysisException {
         Map<String, String> validParams = Maps.newHashMap();
         for (String key : params.keySet()) {
             if (!PROPERTIES_SET.contains(key.toLowerCase())) {
@@ -78,17 +77,17 @@ public class NumbersTableValuedFunction extends DataGenTableValuedFunction {
         try {
             tabletsNum = Integer.parseInt(validParams.getOrDefault(BACKEND_NUM, "1"));
         } catch (NumberFormatException e) {
-            throw new UserException("can not parse `backend_num` param to natural number");
+            throw new AnalysisException("can not parse `backend_num` param to natural number");
         }
         String numberStr = validParams.get(NUMBER);
         if (!Strings.isNullOrEmpty(numberStr)) {
             try {
                 totalNumbers = Long.parseLong(numberStr);
             } catch (NumberFormatException e) {
-                throw new UserException("can not parse `number` param to natural number");
+                throw new AnalysisException("can not parse `number` param to natural number");
             }
         } else {
-            throw new UserException(
+            throw new AnalysisException(
                     "can not find `number` param, please specify `number`, like: numbers(\"number\" = \"10\")");
         }
     }
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 6af05f3374..e0b4e310f5 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
@@ -64,7 +64,7 @@ public class S3TableValuedFunction extends ExternalFileTableValuedFunction {
     private String virtualBucket;
     private boolean forceVirtualHosted;
 
-    public S3TableValuedFunction(Map<String, String> params) throws UserException {
+    public S3TableValuedFunction(Map<String, String> params) throws AnalysisException {
         Map<String, String> validParams = new CaseInsensitiveMap();
         for (String key : params.keySet()) {
             if (!PROPERTIES_SET.contains(key.toLowerCase()) && !FILE_FORMAT_PROPERTIES.contains(key.toLowerCase())) {
@@ -82,7 +82,11 @@ public class S3TableValuedFunction extends ExternalFileTableValuedFunction {
             forceVirtualHosted = !Boolean.valueOf(validParams.get(USE_PATH_STYLE)).booleanValue();
         }
 
-        s3uri = S3URI.create(validParams.get(S3_URI), forceVirtualHosted);
+        try {
+            s3uri = S3URI.create(validParams.get(S3_URI), forceVirtualHosted);
+        } catch (UserException e) {
+            throw new AnalysisException("parse s3 uri failed, uri = " + validParams.get(S3_URI));
+        }
         if (forceVirtualHosted) {
             // s3uri.getVirtualBucket() is: virtualBucket.endpoint, Eg:
             //          uri: http://my_bucket.cos.ap-beijing.myqcloud.com/file.txt
diff --git a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/TableValuedFunctionIf.java b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/TableValuedFunctionIf.java
index 56167d1b87..862b986e97 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/TableValuedFunctionIf.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/TableValuedFunctionIf.java
@@ -22,7 +22,6 @@ import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.FunctionGenTable;
 import org.apache.doris.catalog.TableIf;
 import org.apache.doris.common.AnalysisException;
-import org.apache.doris.common.UserException;
 import org.apache.doris.planner.PlanNodeId;
 import org.apache.doris.planner.ScanNode;
 
@@ -42,7 +41,7 @@ public abstract class TableValuedFunctionIf {
 
     // All table functions should be registered here
     public static TableValuedFunctionIf getTableFunction(String funcName, Map<String, String> params)
-                                                        throws UserException {
+                                                        throws AnalysisException {
         switch (funcName.toLowerCase()) {
             case NumbersTableValuedFunction.NAME:
                 return new NumbersTableValuedFunction(params);
@@ -51,7 +50,7 @@ public abstract class TableValuedFunctionIf {
             case HdfsTableValuedFunction.NAME:
                 return new HdfsTableValuedFunction(params);
             default:
-                throw new UserException("Could not find table function " + funcName);
+                throw new AnalysisException("Could not find table function " + funcName);
         }
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org