Skip to content

Fail to parse ESCAPE '\' with two Columns Escaped #832

Closed

Description

@Preston-Crary

Actual Behavior

JSQLParserException is thrown:

at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:40)
Caused by: net.sf.jsqlparser.parser.TokenMgrException: Lexical error at line 1, column 81.  Encountered: "\\" (92), after : ""
	at net.sf.jsqlparser.parser.CCJSqlParserTokenManager.getNextToken(CCJSqlParserTokenManager.java:3600)
	at net.sf.jsqlparser.parser.CCJSqlParser.jj_ntk_f(CCJSqlParser.java:19297)
	at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:6101)
	at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:6051)
	at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:6087)
	at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:6051)
	at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:6142)
	at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:6051)
	at net.sf.jsqlparser.parser.CCJSqlParser.Expression(CCJSqlParser.java:6022)
	at net.sf.jsqlparser.parser.CCJSqlParser.WhereClause(CCJSqlParser.java:5379)
	at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:3195)
	at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:3351)
	at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:3059)
	at net.sf.jsqlparser.parser.CCJSqlParser.SubSelect(CCJSqlParser.java:9738)
	at net.sf.jsqlparser.parser.CCJSqlParser.FromItem(CCJSqlParser.java:4556)
	at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:3185)
	at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:3351)
	at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:3059)
	at net.sf.jsqlparser.parser.CCJSqlParser.Select(CCJSqlParser.java:3052)
	at net.sf.jsqlparser.parser.CCJSqlParser.SingleStatement(CCJSqlParser.java:132)
	at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:83)
	at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:38)

Expected Behavior

Can parse this without issues.

Steps to Reproduce the Problem

Parse this SQL:
SELECT * FROM T1 WHERE (name LIKE ? ESCAPE '\') AND (description LIKE ? ESCAPE '\')

Code Used

Statement statement = new CCJSqlParserManager().parse(new StringReader("SELECT * FROM T1 WHERE (name LIKE ? ESCAPE '\') AND (description LIKE ? ESCAPE '\')"))

Note

This parses without issues, having the 2nd escape is needed to see the problem:
SELECT * FROM T1 WHERE (name LIKE ? ESCAPE '\') AND (description LIKE ?)

Specifications

Tried using com.github.jsqlparser:jsqlparser:1.4 and com.github.jsqlparser:jsqlparser:2.1

Activity

  1. sivaraam commented on Sep 23, 2019

    @sivaraam
    Contributor

    Interesting. On first sight, I thought not escaping the backslash in following statement was the reason behind the issue,

    Statement statement = new CCJSqlParserManager().parse(new StringReader("SELECT * FROM T1 WHERE (name LIKE ? ESCAPE '\') AND (description LIKE ? ESCAPE '\')"))
    

    So, I tried the following,

                Statement selectWithEscapes = CCJSqlParserUtil.parse("" +
                        "SELECT * " +
                        "FROM T1 " +
                        "WHERE (name LIKE ? ESCAPE '\\') AND (description LIKE ? ESCAPE '\\')"
    

    Note that \ is replaced with \\. But, this didn't parse. Then I tried splitting the query into multiple lines (by adding newlines to different parts the query) to make more sense to the line information printed in error. So, I tried the following,

    Statement selectWithEscapes = CCJSqlParserUtil.parse("" +
                        "SELECT * \n" +
                        "FROM T1 \n" +
                        "WHERE (name LIKE ? ESCAPE '\\') \n" +
                        "  AND \n" +
                        "(description LIKE ? ESCAPE '\\')"
                );
    

    Interestingly it parsed without errors. It seems that the parse has issues only when two ESCAPES are found in the same line in a query.

  2. wumpz commented on Sep 23, 2019

    @wumpz
    Member

    I know that. It is a problem with JSqlParser supporting \ escaping and '' escaping. Til now I was not able to switch on / off one or the other by a flag. If this could be solved by updating the literals reg exp I would be very happy. PRs are welcome.
    I thingk the multiline issue comes from JavaCCs evaluating token reg exps.

  3. added a commit that references this issue on Jan 15, 2023
    9d79d4b
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions