parseSqlWithDialect(String sql, SessionVariable sessionVariable) {
+ return null;
+ }
+}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/SQLDialectUtils.java b/fe_plugins/http-dialect-converter/src/main/java/org/apache/doris/plugin/dialect/http/HttpDialectUtils.java
similarity index 77%
rename from fe/fe-core/src/main/java/org/apache/doris/common/util/SQLDialectUtils.java
rename to fe_plugins/http-dialect-converter/src/main/java/org/apache/doris/plugin/dialect/http/HttpDialectUtils.java
index 777f4ee279..73c2f47067 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/util/SQLDialectUtils.java
+++ b/fe_plugins/http-dialect-converter/src/main/java/org/apache/doris/plugin/dialect/http/HttpDialectUtils.java
@@ -15,12 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.common.util;
-
-import org.apache.doris.common.Config;
-import org.apache.doris.mysql.MysqlCommand;
-import org.apache.doris.nereids.parser.ParseDialect;
-import org.apache.doris.qe.ConnectContext;
+package org.apache.doris.plugin.dialect.http;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
@@ -37,51 +32,13 @@ import java.net.URL;
import java.nio.charset.StandardCharsets;
/**
- * This class is used to convert sql with different dialects
- * using sql convertor service.
+ * This class is used to convert sql with different dialects using sql convertor service.
* The sql convertor service is a http service which is used to convert sql.
- * Request body:
- * {
- * "version": "v1",
- * "sql": "select * from t",
- * "from": "presto",
- * "to": "doris",
- * "source": "text",
- * "case_sensitive": "0"
- * }
- *
- * Response body:
- * {
- * "version": "v1",
- * "data": "select * from t",
- * "code": 0,
- * "message": ""
*/
-public class SQLDialectUtils {
- private static final Logger LOG = LogManager.getLogger(SQLDialectUtils.class);
+public class HttpDialectUtils {
+ private static final Logger LOG = LogManager.getLogger(HttpDialectUtils.class);
- public static String convertStmtWithDialect(String originStmt, ConnectContext ctx, MysqlCommand mysqlCommand) {
- if (mysqlCommand != MysqlCommand.COM_QUERY) {
- return originStmt;
- }
- if (Config.sql_convertor_service.isEmpty()) {
- return originStmt;
- }
- ParseDialect.Dialect dialect = ctx.getSessionVariable().getSqlParseDialect();
- if (dialect == null) {
- return originStmt;
- }
- switch (dialect) {
- case PRESTO:
- return convertStmtWithPresto(originStmt);
- default:
- LOG.debug("only support presto dialect now.");
- return originStmt;
- }
- }
-
- private static String convertStmtWithPresto(String originStmt) {
- String targetURL = Config.sql_convertor_service;
+ public static String convertSql(String targetURL, String originStmt) {
ConvertRequest convertRequest = new ConvertRequest(originStmt, "presto");
HttpURLConnection connection = null;
diff --git a/fe/fe-core/src/test/java/org/apache/doris/common/util/SQLDialectUtilsTest.java b/fe_plugins/http-dialect-converter/src/test/java/org/apache/doris/plugin/dialect/http/HttpDialectUtilsTest.java
similarity index 52%
rename from fe/fe-core/src/test/java/org/apache/doris/common/util/SQLDialectUtilsTest.java
rename to fe_plugins/http-dialect-converter/src/test/java/org/apache/doris/plugin/dialect/http/HttpDialectUtilsTest.java
index 3a0812c89f..532d660f43 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/common/util/SQLDialectUtilsTest.java
+++ b/fe_plugins/http-dialect-converter/src/test/java/org/apache/doris/plugin/dialect/http/HttpDialectUtilsTest.java
@@ -15,13 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.common.util;
-
-import org.apache.doris.common.Config;
-import org.apache.doris.mysql.MysqlCommand;
-import org.apache.doris.qe.ConnectContext;
-import org.apache.doris.utframe.SimpleHttpServer;
-import org.apache.doris.utframe.TestWithFeService;
+package org.apache.doris.plugin.dialect.http;
import org.junit.After;
import org.junit.Assert;
@@ -29,15 +23,18 @@ import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
+import java.net.DatagramSocket;
+import java.net.ServerSocket;
+import java.net.SocketException;
-public class SQLDialectUtilsTest {
+public class HttpDialectUtilsTest {
- int port;
- SimpleHttpServer server;
+ private int port;
+ private SimpleHttpServer server;
@Before
public void setUp() throws Exception {
- port = TestWithFeService.findValidPort();
+ port = findValidPort();
server = new SimpleHttpServer(port);
server.start("/api/v1/convert");
}
@@ -50,37 +47,44 @@ public class SQLDialectUtilsTest {
}
@Test
- public void testSqlConvert() throws IOException {
+ public void testSqlConvert() {
String originSql = "select * from t1 where \"k1\" = 1";
String expectedSql = "select * from t1 where `k1` = 1";
- ConnectContext ctx = TestWithFeService.createDefaultCtx();
- // 1. not COM_QUERY
- String res = SQLDialectUtils.convertStmtWithDialect(originSql, ctx, MysqlCommand.COM_STMT_RESET);
+
+ String targetURL = "http://127.0.0.1:" + port + "/api/v1/convert";
+ String res = HttpDialectUtils.convertSql(targetURL, originSql);
Assert.assertEquals(originSql, res);
- // 2. config sql_convertor_service not set
- res = SQLDialectUtils.convertStmtWithDialect(originSql, ctx, MysqlCommand.COM_QUERY);
- Assert.assertEquals(originSql, res);
- // 3. session var sql_dialect not set
- Config.sql_convertor_service = "http://127.0.0.1:" + port + "/api/v1/convert";
- res = SQLDialectUtils.convertStmtWithDialect(originSql, ctx, MysqlCommand.COM_QUERY);
- Assert.assertEquals(originSql, res);
- // 4. not support dialect
- ctx.getSessionVariable().setSqlDialect("sqlserver");
- res = SQLDialectUtils.convertStmtWithDialect(originSql, ctx, MysqlCommand.COM_QUERY);
- Assert.assertEquals(originSql, res);
- // 5. test presto
- ctx.getSessionVariable().setSqlDialect("presto");
+ // test presto
server.setResponse("{\"version\": \"v1\", \"data\": \"" + expectedSql + "\", \"code\": 0, \"message\": \"\"}");
- res = SQLDialectUtils.convertStmtWithDialect(originSql, ctx, MysqlCommand.COM_QUERY);
+ res = HttpDialectUtils.convertSql(targetURL, originSql);
Assert.assertEquals(expectedSql, res);
- // 6. test response version error
+ // test response version error
server.setResponse("{\"version\": \"v2\", \"data\": \"" + expectedSql + "\", \"code\": 0, \"message\": \"\"}");
- res = SQLDialectUtils.convertStmtWithDialect(originSql, ctx, MysqlCommand.COM_QUERY);
+ res = HttpDialectUtils.convertSql(targetURL, originSql);
Assert.assertEquals(originSql, res);
// 7. test response code error
server.setResponse(
"{\"version\": \"v1\", \"data\": \"" + expectedSql + "\", \"code\": 400, \"message\": \"\"}");
- res = SQLDialectUtils.convertStmtWithDialect(originSql, ctx, MysqlCommand.COM_QUERY);
+ res = HttpDialectUtils.convertSql(targetURL, originSql);
Assert.assertEquals(originSql, res);
}
+
+ private static int findValidPort() {
+ int port;
+ while (true) {
+ try (ServerSocket socket = new ServerSocket(0)) {
+ socket.setReuseAddress(true);
+ port = socket.getLocalPort();
+ try (DatagramSocket datagramSocket = new DatagramSocket(port)) {
+ datagramSocket.setReuseAddress(true);
+ break;
+ } catch (SocketException e) {
+ System.out.println("The port " + port + " is invalid and try another port.");
+ }
+ } catch (IOException e) {
+ throw new IllegalStateException("Could not find a free TCP/IP port to start HTTP Server on");
+ }
+ }
+ return port;
+ }
}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/SimpleHttpServer.java b/fe_plugins/http-dialect-converter/src/test/java/org/apache/doris/plugin/dialect/http/SimpleHttpServer.java
similarity index 98%
rename from fe/fe-core/src/test/java/org/apache/doris/utframe/SimpleHttpServer.java
rename to fe_plugins/http-dialect-converter/src/test/java/org/apache/doris/plugin/dialect/http/SimpleHttpServer.java
index 57ffcf9082..10ae33e435 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/utframe/SimpleHttpServer.java
+++ b/fe_plugins/http-dialect-converter/src/test/java/org/apache/doris/plugin/dialect/http/SimpleHttpServer.java
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.utframe;
+package org.apache.doris.plugin.dialect.http;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
diff --git a/fe_plugins/pom.xml b/fe_plugins/pom.xml
index 1315315c89..9ace25e271 100644
--- a/fe_plugins/pom.xml
+++ b/fe_plugins/pom.xml
@@ -65,11 +65,20 @@ under the License.
auditdemo
auditloader
+ http-dialect-converter
+ trino-converter
+ sparksql-converter
- 2.18.0
- 2.0-SNAPSHOT
github
+ 1
+ 1.2-SNAPSHOT
+ 395
+ 2.18.0
+ 1.2.17
+ 1.18.24
+ 5.8.2
+ 1.49
@@ -137,7 +146,35 @@ under the License.
log4j
log4j
- 1.2.17
+ ${log4j.verion}
+
+
+
+ org.jmockit
+ jmockit
+ ${jmockit.version}
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit.version}
+ test
+
+
+
+ org.junit.vintage
+ junit-vintage-engine
+ ${junit.version}
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-params
+ ${junit.version}
+ test
diff --git a/fe_plugins/sparksql-converter/pom.xml b/fe_plugins/sparksql-converter/pom.xml
new file mode 100644
index 0000000000..e93a1e0f9f
--- /dev/null
+++ b/fe_plugins/sparksql-converter/pom.xml
@@ -0,0 +1,132 @@
+
+
+
+
+ org.apache.doris
+ fe-plugins
+ 1.0-SNAPSHOT
+ ../pom.xml
+
+ 4.0.0
+ sparksql-converter
+ jar
+
+
+ org.apache.doris
+ fe-core
+ ${doris.version}
+ provided
+
+
+ org.apache.doris
+ fe-common
+ ${doris.version}
+ provided
+
+
+
+ org.apache.logging.log4j
+ log4j-api
+ provided
+
+
+
+ org.apache.logging.log4j
+ log4j-core
+ provided
+
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+ provided
+
+
+
+ log4j
+ log4j
+ provided
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+
+ org.junit.vintage
+ junit-vintage-engine
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-params
+ test
+
+
+
+ org.jmockit
+ jmockit
+ test
+
+
+
+ sparksql-converter
+
+
+ maven-assembly-plugin
+ 2.4.1
+
+ false
+
+ src/main/assembly/zip.xml
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ set larger, eg, 3, to reduce the time or running plugin unit tests<-->
+ ${plugin-ut.parallel}
+ not reuse forked jvm, so that each unit test will run in separate jvm. to avoid singleton conflict<-->
+ false
+ false
+
+ -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar
+
+
+
+
+
+
diff --git a/fe_plugins/sparksql-converter/src/main/assembly/plugin.conf b/fe_plugins/sparksql-converter/src/main/assembly/plugin.conf
new file mode 100755
index 0000000000..2aeab7c29f
--- /dev/null
+++ b/fe_plugins/sparksql-converter/src/main/assembly/plugin.conf
@@ -0,0 +1,18 @@
+# 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.
+
+### plugin configuration
diff --git a/fe_plugins/sparksql-converter/src/main/assembly/plugin.properties b/fe_plugins/sparksql-converter/src/main/assembly/plugin.properties
new file mode 100755
index 0000000000..bad565370c
--- /dev/null
+++ b/fe_plugins/sparksql-converter/src/main/assembly/plugin.properties
@@ -0,0 +1,23 @@
+# 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.
+
+name=SparkSqlConverter
+type=DIALECT
+description=SQL dialect converter plugin for spark sql.
+version=1.0.0
+java.version=1.8.0
+classname=org.apache.doris.plugin.dialect.spark.SparkSqlDialectConverterPlugin
diff --git a/fe_plugins/sparksql-converter/src/main/assembly/zip.xml b/fe_plugins/sparksql-converter/src/main/assembly/zip.xml
new file mode 100644
index 0000000000..515e68751b
--- /dev/null
+++ b/fe_plugins/sparksql-converter/src/main/assembly/zip.xml
@@ -0,0 +1,43 @@
+
+
+
+ plugin
+
+ zip
+
+ false
+
+
+ target
+
+ *.jar
+
+ /
+
+
+ src/main/assembly
+
+ plugin.properties
+ plugin.conf
+
+ /
+
+
+
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/spark/DateTruncFnCallTransformer.java b/fe_plugins/sparksql-converter/src/main/java/org/apache/doris/plugin/dialect/spark/DateTruncFnCallTransformer.java
similarity index 95%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/parser/spark/DateTruncFnCallTransformer.java
rename to fe_plugins/sparksql-converter/src/main/java/org/apache/doris/plugin/dialect/spark/DateTruncFnCallTransformer.java
index 1503c6db22..b8de436fd9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/spark/DateTruncFnCallTransformer.java
+++ b/fe_plugins/sparksql-converter/src/main/java/org/apache/doris/plugin/dialect/spark/DateTruncFnCallTransformer.java
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.parser.spark;
+package org.apache.doris.plugin.dialect.spark;
import org.apache.doris.nereids.analyzer.UnboundFunction;
import org.apache.doris.nereids.parser.ComplexFnCallTransformer;
@@ -55,13 +55,13 @@ public class DateTruncFnCallTransformer extends ComplexFnCallTransformer {
@Override
protected boolean check(String sourceFnName, List sourceFnTransformedArguments,
- ParserContext context) {
+ ParserContext context) {
return getSourceFnName().equalsIgnoreCase(sourceFnName) && (sourceFnTransformedArguments.size() == 2);
}
@Override
protected Function transform(String sourceFnName, List sourceFnTransformedArguments,
- ParserContext context) {
+ ParserContext context) {
VarcharLiteral fmtLiteral = (VarcharLiteral) sourceFnTransformedArguments.get(1);
if (YEAR.contains(fmtLiteral.getValue().toUpperCase())) {
return new UnboundFunction(
@@ -78,4 +78,4 @@ public class DateTruncFnCallTransformer extends ComplexFnCallTransformer {
"date_trunc",
ImmutableList.of(sourceFnTransformedArguments.get(0), sourceFnTransformedArguments.get(1)));
}
-}
+}
\ No newline at end of file
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/spark/SparkSql3FnCallTransformers.java b/fe_plugins/sparksql-converter/src/main/java/org/apache/doris/plugin/dialect/spark/SparkSql3FnCallTransformers.java
similarity index 93%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/parser/spark/SparkSql3FnCallTransformers.java
rename to fe_plugins/sparksql-converter/src/main/java/org/apache/doris/plugin/dialect/spark/SparkSql3FnCallTransformers.java
index 341a3d1951..fad1c787ea 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/spark/SparkSql3FnCallTransformers.java
+++ b/fe_plugins/sparksql-converter/src/main/java/org/apache/doris/plugin/dialect/spark/SparkSql3FnCallTransformers.java
@@ -15,16 +15,18 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.parser.spark;
+package org.apache.doris.plugin.dialect.spark;
import org.apache.doris.nereids.analyzer.PlaceholderExpression;
+import org.apache.doris.nereids.parser.AbstractFnCallTransformer;
import org.apache.doris.nereids.parser.AbstractFnCallTransformers;
import org.apache.doris.nereids.trees.expressions.Expression;
import com.google.common.collect.Lists;
/**
- * The builder and factory for spark-sql 3.x FnCallTransformers, supply transform facade ability.
+ * The builder and factory for spark-sql 3.x {@link AbstractFnCallTransformer},
+ * and supply transform facade ability.
*/
public class SparkSql3FnCallTransformers extends AbstractFnCallTransformers {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/spark/SparkSql3LogicalPlanBuilder.java b/fe_plugins/sparksql-converter/src/main/java/org/apache/doris/plugin/dialect/spark/SparkSql3LogicalPlanBuilder.java
similarity index 95%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/parser/spark/SparkSql3LogicalPlanBuilder.java
rename to fe_plugins/sparksql-converter/src/main/java/org/apache/doris/plugin/dialect/spark/SparkSql3LogicalPlanBuilder.java
index 49eb2b74cc..e64fc736dc 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/spark/SparkSql3LogicalPlanBuilder.java
+++ b/fe_plugins/sparksql-converter/src/main/java/org/apache/doris/plugin/dialect/spark/SparkSql3LogicalPlanBuilder.java
@@ -15,13 +15,13 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.parser.spark;
+package org.apache.doris.plugin.dialect.spark;
import org.apache.doris.nereids.DorisParser;
import org.apache.doris.nereids.analyzer.UnboundFunction;
import org.apache.doris.nereids.exceptions.ParseException;
+import org.apache.doris.nereids.parser.Dialect;
import org.apache.doris.nereids.parser.LogicalPlanBuilder;
-import org.apache.doris.nereids.parser.ParseDialect;
import org.apache.doris.nereids.parser.ParserContext;
import org.apache.doris.nereids.parser.ParserUtils;
import org.apache.doris.nereids.trees.expressions.Expression;
@@ -42,7 +42,7 @@ public class SparkSql3LogicalPlanBuilder extends LogicalPlanBuilder {
private final ParserContext parserContext;
public SparkSql3LogicalPlanBuilder() {
- this.parserContext = new ParserContext(ParseDialect.SPARK_SQL_3_ALL);
+ this.parserContext = new ParserContext(Dialect.SPARK_SQL);
}
@Override
diff --git a/fe_plugins/sparksql-converter/src/main/java/org/apache/doris/plugin/dialect/spark/SparkSqlDialectConverterPlugin.java b/fe_plugins/sparksql-converter/src/main/java/org/apache/doris/plugin/dialect/spark/SparkSqlDialectConverterPlugin.java
new file mode 100644
index 0000000000..686c692faf
--- /dev/null
+++ b/fe_plugins/sparksql-converter/src/main/java/org/apache/doris/plugin/dialect/spark/SparkSqlDialectConverterPlugin.java
@@ -0,0 +1,47 @@
+// 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.plugin.dialect.spark;
+
+import org.apache.doris.analysis.StatementBase;
+import org.apache.doris.nereids.parser.Dialect;
+import org.apache.doris.nereids.parser.NereidsParser;
+import org.apache.doris.plugin.DialectConverterPlugin;
+import org.apache.doris.plugin.Plugin;
+import org.apache.doris.qe.SessionVariable;
+
+import com.google.common.collect.ImmutableSet;
+
+import java.util.List;
+import javax.annotation.Nullable;
+
+/**
+ * Extends from {@link org.apache.doris.plugin.DialectConverterPlugin},
+ * just focus on the syntax difference between spark-sql and doris.
+ */
+public class SparkSqlDialectConverterPlugin extends Plugin implements DialectConverterPlugin {
+
+ @Override
+ public ImmutableSet acceptDialects() {
+ return ImmutableSet.of(Dialect.SPARK_SQL);
+ }
+
+ @Override
+ public @Nullable List parseSqlWithDialect(String sql, SessionVariable sessionVariable) {
+ return new NereidsParser().parseSQL(sql, new SparkSql3LogicalPlanBuilder());
+ }
+}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/spark/FnTransformTest.java b/fe_plugins/sparksql-converter/src/test/java/org/apache/doris/plugin/dialect/spark/FnTransformTest.java
similarity index 77%
rename from fe/fe-core/src/test/java/org/apache/doris/nereids/parser/spark/FnTransformTest.java
rename to fe_plugins/sparksql-converter/src/test/java/org/apache/doris/plugin/dialect/spark/FnTransformTest.java
index a4e972c577..1d5e480ca2 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/spark/FnTransformTest.java
+++ b/fe_plugins/sparksql-converter/src/test/java/org/apache/doris/plugin/dialect/spark/FnTransformTest.java
@@ -15,21 +15,39 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.parser.spark;
+package org.apache.doris.plugin.dialect.spark;
+
import org.apache.doris.nereids.parser.NereidsParser;
-import org.apache.doris.nereids.parser.ParserTestBase;
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.SessionVariable;
import org.apache.commons.lang3.StringUtils;
+import mockit.Mock;
+import mockit.MockUp;
import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
+
/**
* Spark SQL to Doris function mapping test.
*/
-public class FnTransformTest extends ParserTestBase {
+public class FnTransformTest {
+ @BeforeAll
+ public static void init() {
+ ConnectContext ctx = new ConnectContext();
+ SessionVariable sessionVariable = new SessionVariable();
+ ctx.setSessionVariable(sessionVariable);
+ new MockUp() {
+ @Mock
+ public ConnectContext get() {
+ return ctx;
+ }
+ };
+ }
@Test
public void testCommonFnTransformers() {
// test json functions
@@ -40,35 +58,34 @@ public class FnTransformTest extends ParserTestBase {
testFunction("SELECT json_extract(c1, '$.c1') as b FROM t",
"SELECT get_json_object(c1, '$.c1') as b FROM t",
"json_extract('c1, '$.c1')");
-
// test string functions
testFunction("SELECT str_to_date('2023-12-16', 'yyyy-MM-dd') as b FROM t",
"SELECT to_date('2023-12-16', 'yyyy-MM-dd') as b FROM t",
"str_to_date('2023-12-16', 'yyyy-MM-dd')");
testFunction("SELECT str_to_date(c1, 'yyyy-MM-dd') as b FROM t",
- "SELECT to_date(c1, 'yyyy-MM-dd') as b FROM t",
- "str_to_date('c1, 'yyyy-MM-dd')");
+ "SELECT to_date(c1, 'yyyy-MM-dd') as b FROM t",
+ "str_to_date('c1, 'yyyy-MM-dd')");
testFunction("SELECT date_trunc('2023-12-16', 'YEAR') as a FROM t",
"SELECT trunc('2023-12-16', 'YEAR') as a FROM t",
"date_trunc('2023-12-16', 'YEAR')");
testFunction("SELECT date_trunc(c1, 'YEAR') as a FROM t",
- "SELECT trunc(c1, 'YEAR') as a FROM t",
- "date_trunc('c1, 'YEAR')");
+ "SELECT trunc(c1, 'YEAR') as a FROM t",
+ "date_trunc('c1, 'YEAR')");
testFunction("SELECT date_trunc('2023-12-16', 'YEAR') as a FROM t",
"SELECT trunc('2023-12-16', 'YY') as a FROM t",
"date_trunc('2023-12-16', 'YEAR')");
testFunction("SELECT date_trunc(c1, 'YEAR') as a FROM t",
- "SELECT trunc(c1, 'YY') as a FROM t",
- "date_trunc('c1, 'YEAR')");
+ "SELECT trunc(c1, 'YY') as a FROM t",
+ "date_trunc('c1, 'YEAR')");
testFunction("SELECT date_trunc('2023-12-16', 'MONTH') as a FROM t",
"SELECT trunc('2023-12-16', 'MON') as a FROM t",
"date_trunc('2023-12-16', 'MONTH')");
testFunction("SELECT date_trunc(c1, 'MONTH') as a FROM t",
- "SELECT trunc(c1, 'MON') as a FROM t",
- "date_trunc('c1, 'MONTH')");
+ "SELECT trunc(c1, 'MON') as a FROM t",
+ "date_trunc('c1, 'MONTH')");
// test numeric functions
testFunction("SELECT avg(c1) as a from t",
diff --git a/fe_plugins/sparksql-converter/src/test/java/org/apache/doris/plugin/dialect/spark/ParserTest.java b/fe_plugins/sparksql-converter/src/test/java/org/apache/doris/plugin/dialect/spark/ParserTest.java
new file mode 100644
index 0000000000..6583641d12
--- /dev/null
+++ b/fe_plugins/sparksql-converter/src/test/java/org/apache/doris/plugin/dialect/spark/ParserTest.java
@@ -0,0 +1,64 @@
+// 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.plugin.dialect.spark;
+
+import org.apache.doris.nereids.analyzer.UnboundResultSink;
+import org.apache.doris.nereids.exceptions.ParseException;
+import org.apache.doris.nereids.parser.NereidsParser;
+import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.SessionVariable;
+
+import mockit.Mock;
+import mockit.MockUp;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+
+/**
+ * Spark-sql query tests.
+ */
+public class ParserTest {
+
+ @BeforeAll
+ public static void init() {
+ ConnectContext ctx = new ConnectContext();
+ SessionVariable sessionVariable = new SessionVariable();
+ ctx.setSessionVariable(sessionVariable);
+ new MockUp() {
+ @Mock
+ public ConnectContext get() {
+ return ctx;
+ }
+ };
+ }
+
+ @Test
+ public void testParseCast1() {
+ // doris parser will throw a ParseException when derived table does not have alias
+ String sql1 = "select * from (select * from t1);";
+ NereidsParser nereidsParser = new NereidsParser();
+ Assertions.assertThrows(ParseException.class, () -> nereidsParser.parseSQL(sql1),
+ "Every derived table must have its own alias");
+
+ // test parse with spark-sql dialect
+ LogicalPlan dialectLogicalPlan = nereidsParser.parseSingle(sql1, new SparkSql3LogicalPlanBuilder());
+ Assertions.assertTrue(dialectLogicalPlan instanceof UnboundResultSink);
+ }
+}
diff --git a/fe_plugins/trino-converter/pom.xml b/fe_plugins/trino-converter/pom.xml
new file mode 100644
index 0000000000..795c1cc7b0
--- /dev/null
+++ b/fe_plugins/trino-converter/pom.xml
@@ -0,0 +1,159 @@
+
+
+
+
+ org.apache.doris
+ fe-plugins
+ 1.0-SNAPSHOT
+ ../pom.xml
+
+ 4.0.0
+ trino-converter
+ jar
+
+
+ org.apache.doris
+ fe-core
+ ${doris.version}
+ provided
+
+
+ org.apache.doris
+ fe-common
+ ${doris.version}
+ provided
+
+
+
+ io.trino
+ trino-parser
+ ${trino.parser.version}
+ compile
+
+
+
+ org.apache.logging.log4j
+ log4j-api
+ provided
+
+
+
+ org.apache.logging.log4j
+ log4j-core
+ provided
+
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+ provided
+
+
+
+ log4j
+ log4j
+ provided
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+
+ org.junit.vintage
+ junit-vintage-engine
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-params
+ test
+
+
+
+ org.jmockit
+ jmockit
+ test
+
+
+
+ trino-converter
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+ 3.1.2
+
+
+ copy-dependencies
+ package
+
+ copy-dependencies
+
+
+ ${project.build.directory}
+ true
+ trino-parser
+
+
+
+
+
+ maven-assembly-plugin
+ 2.4.1
+
+ false
+
+ src/main/assembly/zip.xml
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ set larger, eg, 3, to reduce the time or running plugin unit tests<-->
+ ${plugin-ut.parallel}
+ not reuse forked jvm, so that each unit test will run in separate jvm. to avoid singleton conflict<-->
+ false
+ false
+
+ -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar
+
+
+
+
+
+
diff --git a/fe_plugins/trino-converter/src/main/assembly/plugin.conf b/fe_plugins/trino-converter/src/main/assembly/plugin.conf
new file mode 100755
index 0000000000..fef1ae30da
--- /dev/null
+++ b/fe_plugins/trino-converter/src/main/assembly/plugin.conf
@@ -0,0 +1,18 @@
+# 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.
+
+### plugin configuration
\ No newline at end of file
diff --git a/fe_plugins/trino-converter/src/main/assembly/plugin.properties b/fe_plugins/trino-converter/src/main/assembly/plugin.properties
new file mode 100755
index 0000000000..6eff772bfe
--- /dev/null
+++ b/fe_plugins/trino-converter/src/main/assembly/plugin.properties
@@ -0,0 +1,23 @@
+# 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.
+
+name=TrinoConverter
+type=DIALECT
+description=SQL dialect converter plugin for trino.
+version=1.0.0
+java.version=1.8.0
+classname=org.apache.doris.plugin.dialect.trino.TrinoDialectConverterPlugin
diff --git a/fe_plugins/trino-converter/src/main/assembly/zip.xml b/fe_plugins/trino-converter/src/main/assembly/zip.xml
new file mode 100644
index 0000000000..515e68751b
--- /dev/null
+++ b/fe_plugins/trino-converter/src/main/assembly/zip.xml
@@ -0,0 +1,43 @@
+
+
+
+ plugin
+
+ zip
+
+ false
+
+
+ target
+
+ *.jar
+
+ /
+
+
+ src/main/assembly
+
+ plugin.properties
+ plugin.conf
+
+ /
+
+
+
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/DateDiffFnCallTransformer.java b/fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/DateDiffFnCallTransformer.java
similarity index 98%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/DateDiffFnCallTransformer.java
rename to fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/DateDiffFnCallTransformer.java
index 986f9996f9..c20e886098 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/DateDiffFnCallTransformer.java
+++ b/fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/DateDiffFnCallTransformer.java
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.parser.trino;
+package org.apache.doris.plugin.dialect.trino;
import org.apache.doris.nereids.analyzer.UnboundFunction;
import org.apache.doris.nereids.parser.ComplexFnCallTransformer;
diff --git a/fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/TrinoDialectConverterPlugin.java b/fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/TrinoDialectConverterPlugin.java
new file mode 100644
index 0000000000..3dcbc80a11
--- /dev/null
+++ b/fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/TrinoDialectConverterPlugin.java
@@ -0,0 +1,45 @@
+// 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.plugin.dialect.trino;
+
+import org.apache.doris.analysis.StatementBase;
+import org.apache.doris.nereids.parser.Dialect;
+import org.apache.doris.plugin.DialectConverterPlugin;
+import org.apache.doris.plugin.Plugin;
+import org.apache.doris.qe.SessionVariable;
+
+import com.google.common.collect.ImmutableSet;
+
+import javax.annotation.Nullable;
+import java.util.List;
+
+/**
+ * Extends from {@link org.apache.doris.plugin.DialectConverterPlugin}, focus on Trino dialect.
+ */
+public class TrinoDialectConverterPlugin extends Plugin implements DialectConverterPlugin {
+
+ @Override
+ public ImmutableSet acceptDialects() {
+ return ImmutableSet.of(Dialect.TRINO);
+ }
+
+ @Override
+ public @Nullable List parseSqlWithDialect(String sql, SessionVariable sessionVariable) {
+ return TrinoParser.parse(sql, sessionVariable);
+ }
+}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/TrinoFnCallTransformers.java b/fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/TrinoFnCallTransformers.java
similarity index 95%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/TrinoFnCallTransformers.java
rename to fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/TrinoFnCallTransformers.java
index 662439cfc9..22e8d329c9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/TrinoFnCallTransformers.java
+++ b/fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/TrinoFnCallTransformers.java
@@ -15,9 +15,10 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.parser.trino;
+package org.apache.doris.plugin.dialect.trino;
import org.apache.doris.nereids.analyzer.PlaceholderExpression;
+import org.apache.doris.nereids.parser.AbstractFnCallTransformer;
import org.apache.doris.nereids.parser.AbstractFnCallTransformers;
import org.apache.doris.nereids.trees.expressions.Expression;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/TrinoLogicalPlanBuilder.java b/fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/TrinoLogicalPlanBuilder.java
similarity index 99%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/TrinoLogicalPlanBuilder.java
rename to fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/TrinoLogicalPlanBuilder.java
index c1f9b9fbba..75da2236ba 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/TrinoLogicalPlanBuilder.java
+++ b/fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/TrinoLogicalPlanBuilder.java
@@ -15,7 +15,8 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.parser.trino;
+package org.apache.doris.plugin.dialect.trino;
+
import org.apache.doris.nereids.analyzer.UnboundAlias;
import org.apache.doris.nereids.analyzer.UnboundFunction;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/TrinoParser.java b/fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/TrinoParser.java
similarity index 76%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/TrinoParser.java
rename to fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/TrinoParser.java
index 82d9b9e93a..eb6451d5ca 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/TrinoParser.java
+++ b/fe_plugins/trino-converter/src/main/java/org/apache/doris/plugin/dialect/trino/TrinoParser.java
@@ -15,18 +15,23 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.parser.trino;
+package org.apache.doris.plugin.dialect.trino;
import org.apache.doris.analysis.StatementBase;
import org.apache.doris.nereids.StatementContext;
import org.apache.doris.nereids.exceptions.UnsupportedDialectException;
import org.apache.doris.nereids.glue.LogicalPlanAdapter;
-import org.apache.doris.nereids.parser.ParseDialect;
+import org.apache.doris.nereids.parser.Dialect;
import org.apache.doris.nereids.parser.ParserContext;
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
import org.apache.doris.qe.SessionVariable;
import com.google.common.base.Preconditions;
+import io.trino.sql.parser.ParsingException;
+import io.trino.sql.parser.ParsingOptions;
+import io.trino.sql.parser.SqlParser;
+import io.trino.sql.parser.StatementSplitter;
+import io.trino.sql.tree.Statement;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -42,8 +47,8 @@ public class TrinoParser {
public static final Logger LOG = LogManager.getLogger(TrinoParser.class);
- private static final io.trino.sql.parser.ParsingOptions PARSING_OPTIONS = new io.trino.sql.parser.ParsingOptions(
- io.trino.sql.parser.ParsingOptions.DecimalLiteralTreatment.AS_DECIMAL);
+ private static final ParsingOptions PARSING_OPTIONS = new ParsingOptions(
+ ParsingOptions.DecimalLiteralTreatment.AS_DECIMAL);
/**
* Parse with trino syntax, return null if parse failed
@@ -51,11 +56,10 @@ public class TrinoParser {
public static @Nullable List parse(String sql, SessionVariable sessionVariable) {
final List logicalPlans = new ArrayList<>();
try {
- io.trino.sql.parser.StatementSplitter splitter = new io.trino.sql.parser.StatementSplitter(
- addDelimiterIfNeeded(sql));
- ParserContext parserContext = new ParserContext(ParseDialect.TRINO_395);
+ StatementSplitter splitter = new StatementSplitter(addDelimiterIfNeeded(sql));
+ ParserContext parserContext = new ParserContext(Dialect.TRINO);
StatementContext statementContext = new StatementContext();
- for (io.trino.sql.parser.StatementSplitter.Statement statement : splitter.getCompleteStatements()) {
+ for (StatementSplitter.Statement statement : splitter.getCompleteStatements()) {
Object parsedPlan = parseSingle(statement.statement(), parserContext);
logicalPlans.add(parsedPlan == null
? null : new LogicalPlanAdapter((LogicalPlan) parsedPlan, statementContext));
@@ -64,14 +68,14 @@ public class TrinoParser {
return null;
}
return logicalPlans;
- } catch (io.trino.sql.parser.ParsingException | UnsupportedDialectException e) {
+ } catch (ParsingException | UnsupportedDialectException e) {
LOG.debug("Failed to parse logical plan from trino, sql is :{}", sql, e);
return null;
}
}
- private static io.trino.sql.tree.Statement parse(String sql) {
- io.trino.sql.parser.SqlParser sqlParser = new io.trino.sql.parser.SqlParser();
+ private static Statement parse(String sql) {
+ SqlParser sqlParser = new io.trino.sql.parser.SqlParser();
return sqlParser.createStatement(sql, PARSING_OPTIONS);
}
@@ -83,8 +87,8 @@ public class TrinoParser {
* @return logical plan
*/
public static T parseSingle(String sql, ParserContext parserContext) {
- Preconditions.checkArgument(parserContext.getParserDialect() == ParseDialect.TRINO_395);
- io.trino.sql.tree.Statement statement = TrinoParser.parse(sql);
+ Preconditions.checkArgument(parserContext.getParserDialect() == Dialect.TRINO);
+ Statement statement = TrinoParser.parse(sql);
return (T) new TrinoLogicalPlanBuilder().visit(statement, parserContext);
}
@@ -98,5 +102,4 @@ public class TrinoParser {
return sql + ";";
}
return sql;
- }
-}
+ }}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/trino/FnTransformTest.java b/fe_plugins/trino-converter/src/test/java/org/apache/doris/plugin/dialect/trino/FnTransformTest.java
similarity index 53%
rename from fe/fe-core/src/test/java/org/apache/doris/nereids/parser/trino/FnTransformTest.java
rename to fe_plugins/trino-converter/src/test/java/org/apache/doris/plugin/dialect/trino/FnTransformTest.java
index eefcf8599d..f477e1ec4c 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/trino/FnTransformTest.java
+++ b/fe_plugins/trino-converter/src/test/java/org/apache/doris/plugin/dialect/trino/FnTransformTest.java
@@ -15,32 +15,59 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.parser.trino;
+package org.apache.doris.plugin.dialect.trino;
+
+import org.apache.doris.nereids.parser.Dialect;
import org.apache.doris.nereids.parser.NereidsParser;
-import org.apache.doris.nereids.parser.ParserTestBase;
+import org.apache.doris.nereids.parser.ParserContext;
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.SessionVariable;
+import mockit.Mock;
+import mockit.MockUp;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
+
/**
* Trino to Doris function mapping test.
*/
-public class FnTransformTest extends ParserTestBase {
+public class FnTransformTest {
+
+ @BeforeAll
+ public static void init() {
+ ConnectContext ctx = new ConnectContext();
+ SessionVariable sessionVariable = new SessionVariable();
+ ctx.setSessionVariable(sessionVariable);
+ new MockUp() {
+ @Mock
+ public ConnectContext get() {
+ return ctx;
+ }
+ };
+ }
@Test
public void testStringFnTransform() {
- String sql = "SELECT ascii('a') as b FROM t";
+ ParserContext parserContext = new ParserContext(Dialect.TRINO);
NereidsParser nereidsParser = new NereidsParser();
+ String sql = "SELECT ascii('a') as b FROM t";
LogicalPlan logicalPlan = nereidsParser.parseSingle(sql);
-
String dialectSql = "SELECT codepoint('a') as b FROM t";
- trinoDialectParsePlan(dialectSql).assertEquals(logicalPlan);
+ LogicalPlan dialectLogicalPlan = TrinoParser.parseSingle(dialectSql, parserContext);
+ Assertions.assertEquals(dialectLogicalPlan, logicalPlan);
}
@Test
public void testDateDiffFnTransform() {
+ ParserContext parserContext = new ParserContext(Dialect.TRINO);
String dialectSql = "SELECT date_diff('second', TIMESTAMP '2020-12-25 22:00:00', TIMESTAMP '2020-12-25 21:00:00')";
- trinoDialectParsePlan(dialectSql).assertContains("seconds_diff(2020-12-25 22:00:00, 2020-12-25 21:00:00)");
+ LogicalPlan logicalPlan = TrinoParser.parseSingle(dialectSql, parserContext);
+ Assertions.assertTrue(logicalPlan.toString().toLowerCase()
+ .contains("seconds_diff(2020-12-25 22:00:00, 2020-12-25 21:00:00)"));
}
}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/trino/QueryTest.java b/fe_plugins/trino-converter/src/test/java/org/apache/doris/plugin/dialect/trino/ParserTest.java
similarity index 54%
rename from fe/fe-core/src/test/java/org/apache/doris/nereids/parser/trino/QueryTest.java
rename to fe_plugins/trino-converter/src/test/java/org/apache/doris/plugin/dialect/trino/ParserTest.java
index f438f4c252..f09b13dc40 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/trino/QueryTest.java
+++ b/fe_plugins/trino-converter/src/test/java/org/apache/doris/plugin/dialect/trino/ParserTest.java
@@ -15,28 +15,52 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.parser.trino;
+package org.apache.doris.plugin.dialect.trino;
+import org.apache.doris.nereids.parser.Dialect;
import org.apache.doris.nereids.parser.NereidsParser;
-import org.apache.doris.nereids.parser.ParserTestBase;
+import org.apache.doris.nereids.parser.ParserContext;
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
+import mockit.Mock;
+import mockit.MockUp;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.SessionVariable;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
+
/**
* Trino query tests.
*/
-public class QueryTest extends ParserTestBase {
+public class ParserTest {
+
+ @BeforeAll
+ public static void init() {
+ ConnectContext ctx = new ConnectContext();
+ SessionVariable sessionVariable = new SessionVariable();
+ ctx.setSessionVariable(sessionVariable);
+ new MockUp() {
+ @Mock
+ public ConnectContext get() {
+ return ctx;
+ }
+ };
+ }
@Test
public void testParseCast1() {
+ ParserContext parserContext = new ParserContext(Dialect.TRINO);
String sql = "SELECT CAST(1 AS DECIMAL(20, 6)) FROM t";
NereidsParser nereidsParser = new NereidsParser();
LogicalPlan logicalPlan = nereidsParser.parseSingle(sql);
- trinoDialectParsePlan(sql).assertEquals(logicalPlan);
+ LogicalPlan dialectLogicalPlan = TrinoParser.parseSingle(sql, parserContext);
+ Assertions.assertEquals(dialectLogicalPlan, logicalPlan);
sql = "SELECT CAST(a AS DECIMAL(20, 6)) FROM t";
logicalPlan = nereidsParser.parseSingle(sql);
- trinoDialectParsePlan(sql).assertEquals(logicalPlan);
+ dialectLogicalPlan = TrinoParser.parseSingle(sql, parserContext);
+ Assertions.assertEquals(dialectLogicalPlan, logicalPlan);
}
}