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

morrysnow 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 deb1ad82643 [enhancement](Nereids) add mode no_backslash_escapes 
(#25822)
deb1ad82643 is described below

commit deb1ad826432e2601c2b000d7009dc25c47ada4d
Author: 谢健 <[email protected]>
AuthorDate: Fri Oct 27 13:43:32 2023 +0800

    [enhancement](Nereids) add mode no_backslash_escapes (#25822)
    
    add mode 
[no_backslash_escapes](https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html)
---
 .../doris/nereids/parser/LogicalPlanBuilder.java   |  7 ++++---
 .../java/org/apache/doris/qe/SqlModeHelper.java    | 10 +++++++++
 .../doris/nereids/parser/ParserTestBase.java       | 17 +++++++++++++++
 .../doris/nereids/preprocess/SelectHintTest.java   | 15 ++++++++++++++
 .../trees/expressions/ExpressionParserTest.java    | 24 ++++++++++++++++++++++
 5 files changed, 70 insertions(+), 3 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index 0fb047abee3..fdc33a15559 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -1380,7 +1380,7 @@ public class LogicalPlanBuilder extends 
DorisParserBaseVisitor<Object> {
         return ParserUtils.withOrigin(ctx, () -> {
             Expression left = getExpression(ctx.left);
             Expression right = getExpression(ctx.right);
-            if (ConnectContext.get().getSessionVariable().getSqlMode() == 
SqlModeHelper.MODE_PIPES_AS_CONCAT) {
+            if (SqlModeHelper.hasPipeAsConcat()) {
                 return new UnboundFunction("concat", Lists.newArrayList(left, 
right));
             } else {
                 return new Or(left, right);
@@ -1719,11 +1719,12 @@ public class LogicalPlanBuilder extends 
DorisParserBaseVisitor<Object> {
 
     @Override
     public Literal visitStringLiteral(StringLiteralContext ctx) {
-        // TODO: add unescapeSQLString.
         String txt = ctx.STRING_LITERAL().getText();
         String s = txt.substring(1, txt.length() - 1);
         s = s.replace("''", "'").replace("\"\"", "\"");
-        s = LogicalPlanBuilderAssistant.escapeBackSlash(s);
+        if (!SqlModeHelper.hasNoBackSlashEscapes()) {
+            s = LogicalPlanBuilderAssistant.escapeBackSlash(s);
+        }
         return new VarcharLiteral(s);
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SqlModeHelper.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/SqlModeHelper.java
index 8414cfdfb2a..9a9eda648b2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SqlModeHelper.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SqlModeHelper.java
@@ -209,4 +209,14 @@ public class SqlModeHelper {
         return combineModeSet;
     }
 
+    public static boolean hasNoBackSlashEscapes() {
+        return ((ConnectContext.get().getSessionVariable().getSqlMode() & 
MODE_ALLOWED_MASK)
+                & MODE_NO_BACKSLASH_ESCAPES) != 0;
+    }
+
+    public static boolean hasPipeAsConcat() {
+        return ((ConnectContext.get().getSessionVariable().getSqlMode() & 
MODE_ALLOWED_MASK)
+                & MODE_PIPES_AS_CONCAT) != 0;
+    }
+
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/ParserTestBase.java 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/ParserTestBase.java
index a5ba2b4e052..5e68a3809f9 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/ParserTestBase.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/parser/ParserTestBase.java
@@ -21,11 +21,28 @@ import org.apache.doris.nereids.util.ExpressionParseChecker;
 import org.apache.doris.nereids.util.MemoPatternMatchSupported;
 import org.apache.doris.nereids.util.PlanParseChecker;
 import org.apache.doris.nereids.util.TrinoDialectPlanParseChecker;
+import org.apache.doris.qe.ConnectContext;
+
+import mockit.Mock;
+import mockit.MockUp;
+import org.junit.jupiter.api.BeforeAll;
 
 /**
  * Base class to check SQL parsing result.
  */
 public abstract class ParserTestBase implements MemoPatternMatchSupported {
+
+    @BeforeAll
+    public static void init() {
+        ConnectContext ctx = new ConnectContext();
+        new MockUp<ConnectContext>() {
+            @Mock
+            public ConnectContext get() {
+                return ctx;
+            }
+        };
+    }
+
     public PlanParseChecker parsePlan(String sql) {
         return new PlanParseChecker(sql);
     }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/preprocess/SelectHintTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/preprocess/SelectHintTest.java
index 7e6d3f0a621..94dab1eef7b 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/preprocess/SelectHintTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/preprocess/SelectHintTest.java
@@ -30,10 +30,25 @@ import org.apache.doris.qe.StmtExecutor;
 import org.apache.doris.thrift.TUniqueId;
 
 import mockit.Expectations;
+import mockit.Mock;
+import mockit.MockUp;
 import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
 public class SelectHintTest {
+
+    @BeforeAll
+    public static void init() {
+        ConnectContext ctx = new ConnectContext();
+        new MockUp<ConnectContext>() {
+            @Mock
+            public ConnectContext get() {
+                return ctx;
+            }
+        };
+    }
+
     @Test
     public void testFallbackToOriginalPlanner() throws Exception {
         String sql = " SELECT /*+ SET_VAR(enable_nereids_planner=\"false\") */ 
1";
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/ExpressionParserTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/ExpressionParserTest.java
index 7a8917e2f70..3fbd3787249 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/ExpressionParserTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/ExpressionParserTest.java
@@ -21,6 +21,9 @@ import org.apache.doris.nereids.analyzer.UnboundSlot;
 import org.apache.doris.nereids.exceptions.ParseException;
 import org.apache.doris.nereids.parser.NereidsParser;
 import org.apache.doris.nereids.parser.ParserTestBase;
+import org.apache.doris.nereids.trees.expressions.literal.StringLiteral;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.SqlModeHelper;
 
 import org.junit.jupiter.api.Test;
 
@@ -50,6 +53,27 @@ public class ExpressionParserTest extends ParserTestBase {
         System.out.println(expression.toSql());
     }
 
+    @Test
+    void testNoBackslashEscapes() {
+        parseExpression("'\\b'")
+                .assertEquals(new StringLiteral("\b"));
+        parseExpression("'\\n'")
+                .assertEquals(new StringLiteral("\n"));
+        parseExpression("'\\t'")
+                .assertEquals(new StringLiteral("\t"));
+        parseExpression("'\\0'")
+                .assertEquals(new StringLiteral("\0"));
+        
ConnectContext.get().getSessionVariable().setSqlMode(SqlModeHelper.MODE_NO_BACKSLASH_ESCAPES);
+        parseExpression("'\\b'")
+                .assertEquals(new StringLiteral("\\b"));
+        parseExpression("'\\n'")
+                .assertEquals(new StringLiteral("\\n"));
+        parseExpression("'\\t'")
+                .assertEquals(new StringLiteral("\\t"));
+        parseExpression("'\\0'")
+                .assertEquals(new StringLiteral("\\0"));
+    }
+
     @Test
     public void testSqlBetweenPredicate() {
         String sql = "select * from test1 where d1 between 1 and 2";


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to