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]