Skip to content

Commit

Permalink
fix: Backslash escaped single quote '\''
Browse files Browse the repository at this point in the history
fixes JSQLParser#1812

Signed-off-by: Andreas Reichel <andreas@manticore-projects.com>
  • Loading branch information
manticore-projects committed Jun 27, 2023
1 parent 420d7d8 commit a297543
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 3 deletions.
11 changes: 9 additions & 2 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,14 @@ TOKEN:
}
}
input_stream.backup(image.length() - matchedToken.image.length() );
}
} else if ( configuration.getAsBoolean(Feature.allowBackslashEscapeCharacter) && matchedToken.image.contains("\\''") ) {
for (int i=0;i<CCJSqlParserConstants.tokenImage.length;i++) {
if ( CCJSqlParserConstants.tokenImage[i].equals("<S_CHAR_LITERAL>") ) {
matchedToken.kind = i;
}
}
input_stream.backup(image.length() - matchedToken.image.length() );
}
}
| < S_QUOTED_IDENTIFIER: "\"" ( "\"\"" | ~["\n","\r","\""])* "\"" | "$$" (~["$"])* "$$" | ("`" (~["\n","\r","`"])+ "`") | ( "[" (~["\n","\r","]"])* "]" ) >
{
Expand Down Expand Up @@ -3405,7 +3412,7 @@ Expression LikeExpression(Expression leftExpression) #LikeExpression:
| token = <K_RLIKE>
| token = <K_REGEXP>
) { result.setLikeKeyWord( LikeExpression.KeyWord.from(token.image)); }
[ <K_BINARY> {result.setUseBinary(true); } ]
[ LOOKAHEAD(2) <K_BINARY> {result.setUseBinary(true); } ]
rightExpression=SimpleExpression()
[ LOOKAHEAD(2) <K_ESCAPE>
(
Expand Down
26 changes: 25 additions & 1 deletion src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3266,7 +3266,7 @@ public void testIssue167_singleQuoteEscape(String sqlStr) throws JSQLParserExcep
}

@ParameterizedTest
@ValueSource(strings = {"SELECT '\\'''", "SELECT '\\\\\\''"})
@ValueSource(strings = {"SELECT '\\'\\''", "SELECT '\\\\\\''"})
public void testIssue167_singleQuoteEscape2(String sqlStr) throws JSQLParserException {
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true,
parser -> parser.withBackslashEscapeCharacter(true));
Expand Down Expand Up @@ -5722,4 +5722,28 @@ public void testNotIsNullInFilter() throws JSQLParserException {
String stmt = "SELECT count(*) FILTER (WHERE i NOT ISNULL) AS filtered FROM tasks";
assertSqlCanBeParsedAndDeparsed(stmt);
}

@Test
void testBackSlashQuotationIssue1812() throws JSQLParserException {
String sqlStr = "SELECT ('\\'', 'a')";
Statement stmt2 = CCJSqlParserUtil.parse(
sqlStr
, parser -> parser
.withBackslashEscapeCharacter(true)
);

sqlStr = "INSERT INTO recycle_record (a,f) VALUES ('\\'anything', 'abc');";
stmt2 = CCJSqlParserUtil.parse(
sqlStr
, parser -> parser
.withBackslashEscapeCharacter(true)
);

sqlStr = "INSERT INTO recycle_record (a,f) VALUES ('\\'','83653692186728700711687663398101');";
stmt2 = CCJSqlParserUtil.parse(
sqlStr
, parser -> parser
.withBackslashEscapeCharacter(true)
);
}
}

0 comments on commit a297543

Please sign in to comment.