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 <43782773+bepppo...@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-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org