Skip to content

Commit

Permalink
[enhancement](Nereids) add mode no_backslash_escapes apache#25822 (ap…
Browse files Browse the repository at this point in the history
  • Loading branch information
keanji-x authored Nov 3, 2023
1 parent 246300b commit 6f05f16
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1059,7 +1059,7 @@ public Expression visitDoublePipes(DorisParser.DoublePipesContext ctx) {
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);
Expand Down Expand Up @@ -1345,9 +1345,12 @@ public Literal visitIntegerLiteral(IntegerLiteralContext ctx) {

@Override
public Literal visitStringLiteral(StringLiteralContext ctx) {
// TODO: add unescapeSQLString.
String txt = ctx.STRING_LITERAL().getText();
String s = escapeBackSlash(txt.substring(1, txt.length() - 1));
String s = txt.substring(1, txt.length() - 1);
s = s.replace("''", "'").replace("\"\"", "\"");
if (!SqlModeHelper.hasNoBackSlashEscapes()) {
s = escapeBackSlash(s);
}
return new VarcharLiteral(s);
}

Expand Down
10 changes: 10 additions & 0 deletions fe/fe-core/src/main/java/org/apache/doris/qe/SqlModeHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -209,4 +209,14 @@ public static Map<String, Long> getCombineMode() {
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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,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.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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,25 @@
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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
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;

Expand Down Expand Up @@ -50,6 +53,27 @@ private void assertExpr(String expr) {
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";
Expand Down

0 comments on commit 6f05f16

Please sign in to comment.