Skip to content

Commit a297543

Browse files
fix: Backslash escaped single quote '\''
fixes #1812 Signed-off-by: Andreas Reichel <[email protected]>
1 parent 420d7d8 commit a297543

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,14 @@ TOKEN:
565565
}
566566
}
567567
input_stream.backup(image.length() - matchedToken.image.length() );
568-
}
568+
} else if ( configuration.getAsBoolean(Feature.allowBackslashEscapeCharacter) && matchedToken.image.contains("\\''") ) {
569+
for (int i=0;i<CCJSqlParserConstants.tokenImage.length;i++) {
570+
if ( CCJSqlParserConstants.tokenImage[i].equals("<S_CHAR_LITERAL>") ) {
571+
matchedToken.kind = i;
572+
}
573+
}
574+
input_stream.backup(image.length() - matchedToken.image.length() );
575+
}
569576
}
570577
| < S_QUOTED_IDENTIFIER: "\"" ( "\"\"" | ~["\n","\r","\""])* "\"" | "$$" (~["$"])* "$$" | ("`" (~["\n","\r","`"])+ "`") | ( "[" (~["\n","\r","]"])* "]" ) >
571578
{
@@ -3405,7 +3412,7 @@ Expression LikeExpression(Expression leftExpression) #LikeExpression:
34053412
| token = <K_RLIKE>
34063413
| token = <K_REGEXP>
34073414
) { result.setLikeKeyWord( LikeExpression.KeyWord.from(token.image)); }
3408-
[ <K_BINARY> {result.setUseBinary(true); } ]
3415+
[ LOOKAHEAD(2) <K_BINARY> {result.setUseBinary(true); } ]
34093416
rightExpression=SimpleExpression()
34103417
[ LOOKAHEAD(2) <K_ESCAPE>
34113418
(

src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3266,7 +3266,7 @@ public void testIssue167_singleQuoteEscape(String sqlStr) throws JSQLParserExcep
32663266
}
32673267

32683268
@ParameterizedTest
3269-
@ValueSource(strings = {"SELECT '\\'''", "SELECT '\\\\\\''"})
3269+
@ValueSource(strings = {"SELECT '\\'\\''", "SELECT '\\\\\\''"})
32703270
public void testIssue167_singleQuoteEscape2(String sqlStr) throws JSQLParserException {
32713271
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
32723272
parser -> parser.withBackslashEscapeCharacter(true));
@@ -5722,4 +5722,28 @@ public void testNotIsNullInFilter() throws JSQLParserException {
57225722
String stmt = "SELECT count(*) FILTER (WHERE i NOT ISNULL) AS filtered FROM tasks";
57235723
assertSqlCanBeParsedAndDeparsed(stmt);
57245724
}
5725+
5726+
@Test
5727+
void testBackSlashQuotationIssue1812() throws JSQLParserException {
5728+
String sqlStr = "SELECT ('\\'', 'a')";
5729+
Statement stmt2 = CCJSqlParserUtil.parse(
5730+
sqlStr
5731+
, parser -> parser
5732+
.withBackslashEscapeCharacter(true)
5733+
);
5734+
5735+
sqlStr = "INSERT INTO recycle_record (a,f) VALUES ('\\'anything', 'abc');";
5736+
stmt2 = CCJSqlParserUtil.parse(
5737+
sqlStr
5738+
, parser -> parser
5739+
.withBackslashEscapeCharacter(true)
5740+
);
5741+
5742+
sqlStr = "INSERT INTO recycle_record (a,f) VALUES ('\\'','83653692186728700711687663398101');";
5743+
stmt2 = CCJSqlParserUtil.parse(
5744+
sqlStr
5745+
, parser -> parser
5746+
.withBackslashEscapeCharacter(true)
5747+
);
5748+
}
57255749
}

0 commit comments

Comments
 (0)