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

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


The following commit(s) were added to refs/heads/master by this push:
     new 4266432d111 [Fix](dialect) Fix trino dialect converter when sql does 
not end with delimiter. (#29106)
4266432d111 is described below

commit 4266432d11160c66d52c2e2b4c67b824556dc831
Author: Xiangyu Wang <dut.xian...@gmail.com>
AuthorDate: Fri Dec 29 18:02:57 2023 +0800

    [Fix](dialect) Fix trino dialect converter when sql does not end with 
delimiter. (#29106)
    
    Co-authored-by: wangxiangyu <wangxian...@360shuke.com>
---
 .../doris/nereids/parser/trino/TrinoParser.java      | 20 ++++++++++++++++----
 .../doris/nereids/parser/NereidsParserTest.java      | 14 ++++++++++++++
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/TrinoParser.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/TrinoParser.java
index 671af5e7f05..82d9b9e93a6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/TrinoParser.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/trino/TrinoParser.java
@@ -42,9 +42,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 io.trino.sql.parser.ParsingOptions PARSING_OPTIONS = 
new io.trino.sql.parser.ParsingOptions(
+                
io.trino.sql.parser.ParsingOptions.DecimalLiteralTreatment.AS_DECIMAL);
 
     /**
      * Parse with trino syntax, return null if parse failed
@@ -52,7 +51,8 @@ public class TrinoParser {
     public static @Nullable List<StatementBase> parse(String sql, 
SessionVariable sessionVariable) {
         final List<StatementBase> logicalPlans = new ArrayList<>();
         try {
-            io.trino.sql.parser.StatementSplitter splitter = new 
io.trino.sql.parser.StatementSplitter(sql);
+            io.trino.sql.parser.StatementSplitter splitter = new 
io.trino.sql.parser.StatementSplitter(
+                        addDelimiterIfNeeded(sql));
             ParserContext parserContext = new 
ParserContext(ParseDialect.TRINO_395);
             StatementContext statementContext = new StatementContext();
             for (io.trino.sql.parser.StatementSplitter.Statement statement : 
splitter.getCompleteStatements()) {
@@ -87,4 +87,16 @@ public class TrinoParser {
         io.trino.sql.tree.Statement statement = TrinoParser.parse(sql);
         return (T) new TrinoLogicalPlanBuilder().visit(statement, 
parserContext);
     }
+
+    /**
+     * {@link io.trino.sql.parser.StatementSplitter} use ";" as the delimiter 
if not set
+     * So add ";" if sql does not end with ";",
+     * otherwise {@link 
io.trino.sql.parser.StatementSplitter#getCompleteStatements()} will return 
empty list
+     */
+    private static String addDelimiterIfNeeded(String sql) {
+        if (!sql.trim().endsWith(";")) {
+            return sql + ";";
+        }
+        return sql;
+    }
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
index 9baee503cfc..dc7e336433f 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/NereidsParserTest.java
@@ -206,6 +206,20 @@ public class NereidsParserTest extends ParserTestBase {
         Assertions.assertTrue(logicalPlan1 instanceof ExplainCommand);
     }
 
+    @Test
+    public void testParseSingleStmtWithTrinoDialect() {
+        String sql = "select `AD``D` from t1 where a = 1";
+        NereidsParser nereidsParser = new NereidsParser();
+        SessionVariable sessionVariable = new SessionVariable();
+        sessionVariable.setSqlDialect("trino");
+        // test fall back to doris parser
+        List<StatementBase> statementBases = nereidsParser.parseSQL(sql, 
sessionVariable);
+        Assertions.assertEquals(1, statementBases.size());
+        Assertions.assertTrue(statementBases.get(0) instanceof 
LogicalPlanAdapter);
+        LogicalPlan logicalPlan0 = ((LogicalPlanAdapter) 
statementBases.get(0)).getLogicalPlan();
+        Assertions.assertTrue(logicalPlan0 instanceof UnboundResultSink);
+    }
+
     @Test
     public void testParseSQLWithSparkSqlDialect() {
         // doris parser will throw a ParseException when derived table does 
not have alias


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

Reply via email to