JSqlParser
JSqlParser copied to clipboard
Lexical error from backslash in string literal
Describe the bug Lexical error for Oracle update statement when where clause has backslash in string literal.
To Reproduce Steps to reproduce the behavior:
- update PARAM_TBL set PARA_DESC = null where PARA_DESC = '\' and DEFAULT_VALUE = '\'
- Parsing this SQL using JSqlParser with this statements:
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
public class SqlParse {
public static void main(String[] args) throws Exception {
String sql = "update PARAM_TBL set PARA_DESC = null where PARA_DESC = '\\' and DEFAULT_VALUE = '\\'";
CCJSqlParserUtil.parse(sql);
}
}
- Exception
Exception in thread "main" net.sf.jsqlparser.JSQLParserException: Lexical error at line 1, column 82. Encountered: "\\" (92), after : ""
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatement(CCJSqlParserUtil.java:165)
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:59)
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:37)
at SqlParse.main(SqlParse.java:7)
Caused by: net.sf.jsqlparser.parser.TokenMgrException: Lexical error at line 1, column 82. Encountered: "\\" (92), after : ""
at net.sf.jsqlparser.parser.CCJSqlParserTokenManager.getNextToken(CCJSqlParserTokenManager.java:4759)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_scan_token(CCJSqlParser.java:26392)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_PrimaryExpression_3279_9_631(CCJSqlParser.java:24982)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_PrimaryExpression_3217_5_117(CCJSqlParser.java:25491)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_BitwiseXor_3187_5_184(CCJSqlParser.java:25612)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_MultiplicativeExpression_3157_5_179(CCJSqlParser.java:25743)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_AdditiveExpression_3133_5_360(CCJSqlParser.java:25826)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_BitwiseAndOr_3101_5_176(CCJSqlParser.java:26047)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_ConcatExpression_3078_5_258(CCJSqlParser.java:26100)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_SimpleExpression_3054_5_115(CCJSqlParser.java:18471)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3_93(CCJSqlParser.java:18642)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_ComparisonItem_3008_3_158(CCJSqlParser.java:18744)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_RegularCondition_2665_9_334(CCJSqlParser.java:20825)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_RegularCondition_2633_5_157(CCJSqlParser.java:21160)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_Condition_2616_9_310(CCJSqlParser.java:21226)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_Condition_2614_5_154(CCJSqlParser.java:21260)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3_70(CCJSqlParser.java:21352)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_2_70(CCJSqlParser.java:17723)
at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:8424)
at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:8400)
at net.sf.jsqlparser.parser.CCJSqlParser.Expression(CCJSqlParser.java:8371)
at net.sf.jsqlparser.parser.CCJSqlParser.WhereClause(CCJSqlParser.java:7284)
at net.sf.jsqlparser.parser.CCJSqlParser.Update(CCJSqlParser.java:1408)
at net.sf.jsqlparser.parser.CCJSqlParser.SingleStatement(CCJSqlParser.java:138)
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:81)
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatement(CCJSqlParserUtil.java:163)
... 3 more
System
- Oracle 10
- Java 8
- JSqlParser 4.0
This is connected to quote parsing in JSqlParser. So JSqlParser recognizes \' as an escaped quote and therefore the accepted string literal here is:
'\\' and DEFAULT_VALUE = '
which is not your intention.
I thinking about making this quotation escaping somehow more robust. Probably we should consider making the concrete processing optional.