This is an automated email from the ASF dual-hosted git repository.
caiconghui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new ebbe6f6 [fix](broker-load) hdfs or bos path parser not support glob
exprs (#8390)
ebbe6f6 is described below
commit ebbe6f650ca572b9dfcce60951b7dfc8d134b4a6
Author: Zhengguo Yang <[email protected]>
AuthorDate: Sat Mar 12 20:10:05 2022 +0800
[fix](broker-load) hdfs or bos path parser not support glob exprs (#8390)
---
.../apache/doris/analysis/CreateFunctionStmt.java | 6 +-
.../java/org/apache/doris/analysis/ExportStmt.java | 28 ++-
.../java/org/apache/doris/analysis/HdfsURI.java | 83 ---------
.../apache/doris/catalog/AggregateFunction.java | 20 +-
.../java/org/apache/doris/catalog/Function.java | 21 ++-
.../org/apache/doris/catalog/ScalarFunction.java | 8 +-
.../java/org/apache/doris/common/util/URI.java | 204 +++++++++++++++++++++
.../java/org/apache/doris/common/util/URITest.java | 97 ++++++++++
8 files changed, 345 insertions(+), 122 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java
index 743fb21..76f3638 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateFunctionStmt.java
@@ -30,6 +30,7 @@ import org.apache.doris.common.ErrorCode;
import org.apache.doris.common.ErrorReport;
import org.apache.doris.common.FeConstants;
import org.apache.doris.common.UserException;
+import org.apache.doris.common.util.URI;
import org.apache.doris.common.util.Util;
import org.apache.doris.mysql.privilege.PrivPredicate;
import org.apache.doris.proto.FunctionService;
@@ -228,7 +229,7 @@ public class CreateFunctionStmt extends DdlStmt {
AggregateFunction.AggregateFunctionBuilder builder =
AggregateFunction.AggregateFunctionBuilder.createUdfBuilder();
builder.name(functionName).argsType(argsDef.getArgTypes()).retType(returnType.getType()).
-
hasVarArgs(argsDef.isVariadic()).intermediateType(intermediateType.getType()).objectFile(objectFile);
+
hasVarArgs(argsDef.isVariadic()).intermediateType(intermediateType.getType()).location(URI.create(objectFile));
String initFnSymbol = properties.get(INIT_KEY);
if (initFnSymbol == null) {
throw new AnalysisException("No 'init_fn' in properties");
@@ -288,10 +289,11 @@ public class CreateFunctionStmt extends DdlStmt {
throw new AnalysisException("check function [" + symbol + "]
failed: " + response.getStatus());
}
}
+ URI location = URI.create(objectFile);
function = ScalarFunction.createUdf(binaryType,
functionName, argsDef.getArgTypes(),
returnType.getType(), argsDef.isVariadic(),
- objectFile, symbol, prepareFnSymbol, closeFnSymbol);
+ location, symbol, prepareFnSymbol, closeFnSymbol);
function.setChecksum(checksum);
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExportStmt.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExportStmt.java
index 784b1a7..48fb782 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExportStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExportStmt.java
@@ -31,6 +31,7 @@ import org.apache.doris.common.FeNameFormat;
import org.apache.doris.common.UserException;
import org.apache.doris.common.util.PrintableMap;
import org.apache.doris.common.util.PropertyAnalyzer;
+import org.apache.doris.common.util.URI;
import org.apache.doris.mysql.privilege.PrivPredicate;
import org.apache.doris.qe.ConnectContext;
@@ -42,8 +43,6 @@ import com.google.common.collect.Maps;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import java.net.URI;
-import java.net.URISyntaxException;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@@ -233,18 +232,18 @@ public class ExportStmt extends StatementBase {
throw new AnalysisException("No dest path specified.");
}
- try {
- URI uri = new URI(path);
- String schema = uri.getScheme();
- if (type == StorageBackend.StorageType.BROKER) {
- if (schema == null || (!schema.equalsIgnoreCase("bos") &&
!schema.equalsIgnoreCase("afs")
+ URI uri = URI.create(path);
+ String schema = uri.getScheme();
+ if (type == StorageBackend.StorageType.BROKER) {
+ if (schema == null || (!schema.equalsIgnoreCase("bos") &&
!schema.equalsIgnoreCase("afs")
&& !schema.equalsIgnoreCase("hdfs"))) {
- throw new AnalysisException("Invalid export path. please
use valid 'HDFS://', 'AFS://' or 'BOS://' path.");
- }
- } else if (type == StorageBackend.StorageType.S3) {
- if (schema == null || !schema.equalsIgnoreCase("s3")) {
- throw new AnalysisException("Invalid export path. please
use valid 'S3://' path.");
- }
+ throw new AnalysisException("Invalid export path. please use
valid 'HDFS://', 'AFS://' or 'BOS://' " +
+ "path.");
+ }
+ } else if (type == StorageBackend.StorageType.S3) {
+ if (schema == null || !schema.equalsIgnoreCase("s3")) {
+ throw new AnalysisException("Invalid export path. please use
valid 'S3://' path.");
+ }
} else if (type == StorageBackend.StorageType.HDFS) {
if (schema == null || !schema.equalsIgnoreCase("hdfs")) {
throw new AnalysisException("Invalid export path. please
use valid 'HDFS://' path.");
@@ -256,9 +255,6 @@ public class ExportStmt extends StatementBase {
}
path = path.substring(OutFileClause.LOCAL_FILE_PREFIX.length()
- 1);
}
- } catch (URISyntaxException e) {
- throw new AnalysisException("Invalid path format. " +
e.getMessage());
- }
return path;
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/HdfsURI.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/HdfsURI.java
deleted file mode 100644
index 56fa1a2..0000000
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/HdfsURI.java
+++ /dev/null
@@ -1,83 +0,0 @@
-// 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.
-
-package org.apache.doris.analysis;
-
-import org.apache.doris.common.AnalysisException;
-import com.google.common.base.Preconditions;
-
-/*
- * Represents an HDFS URI in a SQL statement.
- */
-public class HdfsURI {
- private final String location;
-
- // Set during analysis
- // dhc to do
- // private Path uriPath;
- private String uriPath;
-
- public HdfsURI(String location) {
- Preconditions.checkNotNull(location);
- this.location = location.trim();
- }
-
- public String getPath() {
- Preconditions.checkNotNull(uriPath);
- return uriPath;
- }
-
- public void analyze(Analyzer analyzer) throws AnalysisException {
- if (location.isEmpty()) {
- throw new AnalysisException("URI path cannot be empty.");
- }
- uriPath = new String(location);
- //dhc to do
- /*
- uriPath = new Path(location);
- if (!uriPath.isUriPathAbsolute()) {
- throw new AnalysisException("URI path must be absolute: " + uriPath);
- }
- try {
- FileSystem fs = uriPath.getFileSystem(FileSystemUtil.getConfiguration());
- if (!(fs instanceof DistributedFileSystem)) {
- throw new AnalysisException(String.format("URI location '%s' " +
- "must point to an HDFS file system.", uriPath));
- }
- } catch (IOException e) {
- throw new AnalysisException(e.getMessage(), e);
- }
-
- // Fully-qualify the path
- uriPath = FileSystemUtil.createFullyQualifiedPath(uriPath);
- PrivilegeRequest req = new PrivilegeRequest(
- new AuthorizeableURI(uriPath.toString()), privilege);
- analyzer.getCatalog().checkAccess(analyzer.getUser(), req);
- */
- }
-
- @Override
- public String toString() {
- // If uriPath is null (this HdfsURI has not been analyzed yet) just
return the raw
- // location string the caller passed in.
- return uriPath == null ? location : uriPath.toString();
- }
-
- public String getLocation() {
- return location;
- }
-}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
index d64df26..da4d201 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
@@ -26,7 +26,7 @@ import com.google.gson.Gson;
import org.apache.doris.analysis.CreateFunctionStmt;
import org.apache.doris.analysis.FunctionName;
-import org.apache.doris.analysis.HdfsURI;
+import org.apache.doris.common.util.URI;
import org.apache.doris.thrift.TAggregateFunction;
import org.apache.doris.thrift.TFunction;
import org.apache.doris.thrift.TFunctionBinaryType;
@@ -95,7 +95,7 @@ public class AggregateFunction extends Function {
public AggregateFunction(FunctionName fnName, List<Type> argTypes,
Type retType, Type intermediateType,
- HdfsURI location, String updateFnSymbol, String
initFnSymbol,
+ URI location, String updateFnSymbol, String
initFnSymbol,
String serializeFnSymbol, String mergeFnSymbol,
String getValueFnSymbol,
String removeFnSymbol, String finalizeFnSymbol) {
this(fnName, argTypes, retType, intermediateType, location,
updateFnSymbol, initFnSymbol, serializeFnSymbol,
@@ -136,7 +136,7 @@ public class AggregateFunction extends Function {
public AggregateFunction(FunctionName fnName, List<Type> argTypes,
Type retType, Type intermediateType,
- HdfsURI location, String updateFnSymbol, String
initFnSymbol,
+ URI location, String updateFnSymbol, String
initFnSymbol,
String serializeFnSymbol, String mergeFnSymbol,
String getValueFnSymbol,
String removeFnSymbol, String finalizeFnSymbol,
boolean vectorized) {
this(fnName, argTypes, retType, intermediateType, false, location,
updateFnSymbol, initFnSymbol, serializeFnSymbol,
@@ -145,7 +145,7 @@ public class AggregateFunction extends Function {
public AggregateFunction(FunctionName fnName, List<Type> argTypes,
Type retType, Type intermediateType, boolean
hasVarArgs,
- HdfsURI location, String updateFnSymbol, String
initFnSymbol,
+ URI location, String updateFnSymbol, String
initFnSymbol,
String serializeFnSymbol, String mergeFnSymbol,
String getValueFnSymbol,
String removeFnSymbol, String finalizeFnSymbol,
boolean vectorized) {
// only `count` is always not nullable, other aggregate function is
always nullable
@@ -280,12 +280,12 @@ public class AggregateFunction extends Function {
// Used to create UDAF
public AggregateFunction(FunctionName fnName, Type[] argTypes,
- Type retType, boolean hasVarArgs, Type
intermediateType, String location,
+ Type retType, boolean hasVarArgs, Type
intermediateType, URI location,
String initFnSymbol, String updateFnSymbol,
String mergeFnSymbol,
String serializeFnSymbol, String finalizeFnSymbol,
String getValueFnSymbol, String removeFnSymbol) {
super(fnName, Arrays.asList(argTypes), retType, hasVarArgs);
- this.setLocation(new HdfsURI(location));
+ this.setLocation(location);
this.intermediateType = (intermediateType.equals(retType)) ? null :
intermediateType;
this.updateFnSymbol = updateFnSymbol;
this.initFnSymbol = initFnSymbol;
@@ -307,7 +307,7 @@ public class AggregateFunction extends Function {
Type retType;
boolean hasVarArgs;
Type intermediateType;
- String objectFile;
+ URI location;
String initFnSymbol;
String updateFnSymbol;
String serializeFnSymbol;
@@ -349,8 +349,8 @@ public class AggregateFunction extends Function {
return this;
}
- public AggregateFunctionBuilder objectFile(String objectFile) {
- this.objectFile = objectFile;
+ public AggregateFunctionBuilder location(URI location) {
+ this.location = location;
return this;
}
@@ -391,7 +391,7 @@ public class AggregateFunction extends Function {
public AggregateFunction build() {
AggregateFunction fn = new AggregateFunction(name, argTypes,
retType, hasVarArgs, intermediateType,
- objectFile, initFnSymbol, updateFnSymbol, mergeFnSymbol,
+ location, initFnSymbol, updateFnSymbol, mergeFnSymbol,
serializeFnSymbol, finalizeFnSymbol,
getValueFnSymbol, removeFnSymbol);
fn.setBinaryType(binaryType);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
index 2e64112..bfc29d7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
@@ -20,9 +20,10 @@ package org.apache.doris.catalog;
import static org.apache.doris.common.io.IOUtils.writeOptionString;
import org.apache.doris.analysis.FunctionName;
-import org.apache.doris.analysis.HdfsURI;
+import org.apache.doris.common.AnalysisException;
import org.apache.doris.common.io.Text;
import org.apache.doris.common.io.Writable;
+import org.apache.doris.common.util.URI;
import org.apache.doris.thrift.TFunction;
import org.apache.doris.thrift.TFunctionBinaryType;
@@ -113,7 +114,7 @@ public class Function implements Writable {
// Absolute path in HDFS for the binary that contains this function.
// e.g. /udfs/udfs.jar
- private HdfsURI location;
+ private URI location;
private TFunctionBinaryType binaryType;
protected NullableMode nullableMode = NullableMode.DEPEND_ON_ARGUMENT;
@@ -190,11 +191,11 @@ public class Function implements Writable {
return argTypes.length;
}
- public HdfsURI getLocation() {
+ public URI getLocation() {
return location;
}
- public void setLocation(HdfsURI loc) {
+ public void setLocation(URI loc) {
location = loc;
}
@@ -448,7 +449,7 @@ public class Function implements Writable {
fn.setName(name.toThrift());
fn.setBinaryType(binaryType);
if (location != null) {
- fn.setHdfsLocation(location.toString());
+ fn.setHdfsLocation(location.getLocation());
}
fn.setArgTypes(Type.toThrift(argTypes));
fn.setRetType(getReturnType().toThrift());
@@ -635,7 +636,7 @@ public class Function implements Writable {
// write library URL
String libUrl = "";
if (location != null) {
- libUrl = location.toString();
+ libUrl = location.getLocation();
}
writeOptionString(output, libUrl);
writeOptionString(output, checksum);
@@ -661,7 +662,13 @@ public class Function implements Writable {
boolean hasLocation = input.readBoolean();
if (hasLocation) {
- location = new HdfsURI(Text.readString(input));
+ String locationStr = Text.readString(input);
+ try {
+ location = URI.create(locationStr);
+ } catch (AnalysisException e) {
+ LOG.warn("failed to parse location:" + locationStr);
+ }
+
}
boolean hasChecksum = input.readBoolean();
if (hasChecksum) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarFunction.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarFunction.java
index 308bda0..66f0a62 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarFunction.java
@@ -19,8 +19,8 @@ package org.apache.doris.catalog;
import org.apache.doris.analysis.CreateFunctionStmt;
import org.apache.doris.analysis.FunctionName;
-import org.apache.doris.analysis.HdfsURI;
import org.apache.doris.common.io.Text;
+import org.apache.doris.common.util.URI;
import org.apache.doris.thrift.TFunction;
import org.apache.doris.thrift.TFunctionBinaryType;
import org.apache.doris.thrift.TScalarFunction;
@@ -77,7 +77,7 @@ public class ScalarFunction extends Function {
}
public ScalarFunction(FunctionName fnName, List<Type> argTypes,
- Type retType, HdfsURI location, String symbolName,
String initFnSymbol,
+ Type retType, URI location, String symbolName,
String initFnSymbol,
String closeFnSymbol) {
super(fnName, argTypes, retType, false);
setLocation(location);
@@ -315,13 +315,13 @@ public class ScalarFunction extends Function {
TFunctionBinaryType binaryType,
FunctionName name, Type[] args,
Type returnType, boolean isVariadic,
- String objectFile, String symbol, String prepareFnSymbol, String
closeFnSymbol) {
+ URI location, String symbol, String prepareFnSymbol, String
closeFnSymbol) {
ScalarFunction fn = new ScalarFunction(name, Arrays.asList(args),
returnType, isVariadic, binaryType,
true, false);
fn.symbolName = symbol;
fn.prepareFnSymbol = prepareFnSymbol;
fn.closeFnSymbol = closeFnSymbol;
- fn.setLocation(new HdfsURI(objectFile));
+ fn.setLocation(location);
return fn;
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/URI.java
b/fe/fe-core/src/main/java/org/apache/doris/common/util/URI.java
new file mode 100644
index 0000000..b0c0f19
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/URI.java
@@ -0,0 +1,204 @@
+// 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.
+
+package org.apache.doris.common.util;
+
+import org.apache.doris.common.AnalysisException;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.parquet.Strings;
+
+import java.util.TreeMap;
+
+public class URI {
+ private static final String SCHEME_DELIM = "://";
+ private static final String AUTH_DELIM = "@";
+ private static final String PATH_DELIM = "/";
+ private static final String QUERY_DELIM = "\\?";
+ private static final String FRAGMENT_DELIM = "#";
+ private static final String PASS_DELIM = ":";
+ private static final String PORT_DELIM = ":";
+ private static final String QUERY_ITEM_DELIM = "&";
+ private static final String QUERY_KV_DELIM = "=";
+
+ private final String location;
+ private String scheme;
+ private String authority;
+ private String host;
+ private int port = -1;
+ private String userInfo;
+ private String userName;
+ private String passWord;
+ private String path = "";
+ private String query;
+ private String fragment;
+ private TreeMap<String, String> queryMap;
+
+ private URI(String location) throws AnalysisException {
+ if (Strings.isNullOrEmpty(location)) {
+ throw new AnalysisException("location can not be null");
+ }
+ this.location = location.trim();
+ parse();
+ }
+
+ public static URI create(String location) throws AnalysisException {
+ return new URI(location);
+ }
+
+ public String getLocation() {
+ return location;
+ }
+ public String getScheme() {
+ return scheme;
+ }
+
+ public String getAuthority() {
+ return authority;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public String getUserInfo() {
+ return userInfo;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public String getPassWord() {
+ return passWord;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public String getQuery() {
+ return query;
+ }
+
+ public String getFragment() {
+ return fragment;
+ }
+
+ public TreeMap<String, String> getQueryMap() {
+ return queryMap;
+ }
+
+ private void parse() throws AnalysisException {
+ String[] schemeSplit = this.location.split(SCHEME_DELIM);
+ String hierarchical;
+ if (schemeSplit.length == 1) {
+ hierarchical = schemeSplit[0];
+ } else if (schemeSplit.length == 2) {
+ scheme = schemeSplit[0];
+ hierarchical = schemeSplit[1];
+ } else {
+ throw new AnalysisException("Invalid uri: " + this.location);
+ }
+
+ String[] authoritySplit = hierarchical.split(PATH_DELIM, 2);
+ String hostPortPath;
+ if (authoritySplit.length == 1) {
+ if (StringUtils.isBlank(scheme)) {
+ hostPortPath = authoritySplit[0];
+ } else {
+ authority = authoritySplit[0];
+ parseAuthority(authority);
+ return;
+ }
+ } else if (authoritySplit.length == 2) {
+ authority = authoritySplit[0];
+ parseAuthority(authority);
+ hostPortPath = authoritySplit[1];
+ } else {
+ throw new AnalysisException("Invalid uri: " + this.location);
+ }
+ String[] fragSplit = hostPortPath.split(FRAGMENT_DELIM);
+ if (fragSplit.length == 2) {
+ fragment = fragSplit[1];
+ }
+ String[] querySplit = fragSplit[0].split(QUERY_DELIM);
+ if (querySplit.length == 1) {
+ path = StringUtils.isBlank(host) ? querySplit[0] : PATH_DELIM +
querySplit[0];
+ } else if (querySplit.length == 2) {
+ path = StringUtils.isBlank(host) ? querySplit[0] : PATH_DELIM +
querySplit[0];
+ query = querySplit[1];
+ parseQuery();
+ } else {
+ throw new AnalysisException("Invalid path: " + this.location);
+ }
+
+ }
+
+ private void parseQuery() {
+ if (StringUtils.isBlank(query)) {
+ return;
+ }
+ String[] split = query.split(QUERY_ITEM_DELIM);
+ queryMap = new TreeMap<>();
+ for (String item : split) {
+ String[] itemSplit = item.split(QUERY_KV_DELIM);
+ if (itemSplit.length == 2) {
+ queryMap.put(itemSplit[0], itemSplit[1]);
+ }
+ }
+
+ }
+
+ private void parseAuthority(String str) throws AnalysisException {
+ if (StringUtils.isBlank(str)) {
+ return;
+ }
+ String[] authSplit = str.split(AUTH_DELIM);
+ String hostPort;
+ if (authSplit.length == 1) {
+ hostPort = authSplit[0];
+ } else if (authSplit.length == 2) {
+ userInfo = authSplit[0];
+ hostPort = authSplit[1];
+ String[] userSplit = userInfo.split(PASS_DELIM);
+ if (userSplit.length == 1) {
+ userName = userInfo;
+ } else if (userSplit.length == 2) {
+ userName = userSplit[0];
+ passWord = userSplit[1];
+ } else {
+ throw new AnalysisException("Invalid userinfo: " + userInfo);
+ }
+ } else {
+ throw new AnalysisException("Invalid authority: " + str);
+ }
+ String[] hostSplit = hostPort.split(PORT_DELIM);
+ if (hostSplit.length == 1) {
+ host = hostSplit[0];
+ } else if (hostSplit.length == 2) {
+ host = hostSplit[0];
+ port = Integer.parseInt(hostSplit[1]);
+ } else {
+ throw new AnalysisException("Invalid host port: " + hostPort);
+ }
+ }
+}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/common/util/URITest.java
b/fe/fe-core/src/test/java/org/apache/doris/common/util/URITest.java
new file mode 100644
index 0000000..bf4c990
--- /dev/null
+++ b/fe/fe-core/src/test/java/org/apache/doris/common/util/URITest.java
@@ -0,0 +1,97 @@
+// 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.
+
+package org.apache.doris.common.util;
+
+import org.apache.doris.common.UserException;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.net.URISyntaxException;
+
+public class URITest {
+ private void check(java.net.URI javaURI, URI myURI) {
+ Assert.assertEquals(javaURI.getAuthority(), myURI.getAuthority());
+ Assert.assertEquals(javaURI.getPath(), myURI.getPath());
+ Assert.assertEquals(javaURI.getHost(), myURI.getHost());
+ Assert.assertEquals(javaURI.getPort(), myURI.getPort());
+ Assert.assertEquals(javaURI.getScheme(), myURI.getScheme());
+ Assert.assertEquals(javaURI.getQuery(), myURI.getQuery());
+ Assert.assertEquals(javaURI.getFragment(), myURI.getFragment());
+ Assert.assertEquals(javaURI.getUserInfo(), myURI.getUserInfo());
+ }
+ @Test
+ public void testNormal() throws UserException, URISyntaxException {
+ String str1 =
"foo://username:[email protected]:8042/over/there/index.dtb?type=animal&name=narwhal#nose";
+ java.net.URI javaURI1 = new java.net.URI(str1);
+ URI myURI1 = URI.create(str1);
+ check(javaURI1, myURI1);
+ Assert.assertEquals(myURI1.getUserName(), "username");
+ Assert.assertEquals(myURI1.getPassWord(), "password");
+ Assert.assertEquals(myURI1.getQueryMap().get("type"), "animal");
+
+ String str2 = "foo://example.com/over/there/index.dtb#nose";
+ java.net.URI javaURI2 = new java.net.URI(str2);
+ URI myURI2 = URI.create(str2);
+ check(javaURI2, myURI2);
+ Assert.assertEquals(myURI2.getFragment(), "nose");
+
+ String str3 = "foo://example.com/over/there/index.dtb?type=animal";
+ java.net.URI javaURI3 = new java.net.URI(str3);
+ URI myURI3 = URI.create(str3);
+ check(javaURI3, myURI3);
+ Assert.assertEquals(myURI3.getQueryMap().get("type"), "animal");
+
+ String str4 =
"foo://:[email protected]/over/there/index.dtb?type=animal";
+ java.net.URI javaURI4 = new java.net.URI(str4);
+ URI myURI4 = URI.create(str4);
+ check(javaURI4, myURI4);
+ Assert.assertEquals(myURI4.getQueryMap().get("type"), "animal");
+
+ String str5 =
"foo://[email protected]/over/there/index.dtb?type=animal";
+ java.net.URI javaURI5 = new java.net.URI(str5);
+ URI myURI5 = URI.create(str5);
+ check(javaURI5, myURI5);
+ Assert.assertEquals(myURI5.getQueryMap().get("type"), "animal");
+
+ String str6 = "foo://example.com";
+ java.net.URI javaURI6 = new java.net.URI(str6);
+ URI myURI6 = URI.create(str6);
+ check(javaURI6, myURI6);
+
+ String str7 = "example.com";
+ java.net.URI javaURI7 = new java.net.URI(str7);
+ URI myURI7 = URI.create(str7);
+ check(javaURI7, myURI7);
+
+ String str8 = "example.com";
+ java.net.URI javaURI8 = new java.net.URI(str8);
+ URI myURI8 = URI.create(str8);
+ check(javaURI8, myURI8);
+
+ URI myURI9 =
URI.create("hdfs://ip:12/test/test/data/{20220131,20220201}/*");
+ Assert.assertEquals(myURI9.getScheme(), "hdfs");
+ Assert.assertEquals(myURI9.getPath(),
"/test/test/data/{20220131,20220201}/*");
+ Assert.assertEquals(myURI9.getHost(), "ip");
+ Assert.assertEquals(myURI9.getPort(), 12);
+ Assert.assertEquals(myURI9.getAuthority(), "ip:12");
+
+ URI myURI10 = URI.create("hdfs");
+ Assert.assertEquals(myURI10.getPath(), "hdfs");
+ }
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]