Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Encountered unexpected token: "\n\n\n" <ST_SEMICOLON> #1988

Closed
pansong291 opened this issue Apr 9, 2024 · 3 comments
Closed

Encountered unexpected token: "\n\n\n" <ST_SEMICOLON> #1988

pansong291 opened this issue Apr 9, 2024 · 3 comments

Comments

@pansong291
Copy link

Always check against the Latest SNAPSHOT of JSQLParser and the Syntax Diagram

Failing SQL Feature:

  • Brief description of the failing SQL feature
    net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "\n\n\n" <ST_SEMICOLON>
      at line 1, column 39.
    

SQL Example:

  • Simplified Query Example, focusing on the failing feature
    UPDATE shop_info  SET title=?,
    
    
    
    
    props=?  WHERE id=?
  • This SQL statement is dynamically concatenated in the program using a third-party library, so it is not possible to remove the extra blank lines within it. Even with the extra blank lines, it can be executed normally in MySQL, which means it does not have syntax errors.

Software Information:

  • JSqlParser version 4.6
  • Database MySQL

Tips:

Please write in English and avoid Screenshots (as we can't copy and paste content from it).
Try your example online with the latest JSQLParser and share the link in the error report.
Do provide Links or References to the specific Grammar and Syntax you are trying to use.

http://jsqlformatter.manticore-projects.com/jsqlformatter/demo.html?args=-c%20KoBQIgggKgogBAZwBYHsAOB9AlgOwGYpxwDKMUcALlhQDYCmAvAPwA0AUBx2gE7oLNEA6gAkYAJXhYAJsyA

@manticore-projects manticore-projects pinned this issue Apr 9, 2024
@manticore-projects
Copy link
Contributor

Greetings!

Two empty lines \n\n\n terminate a statement. There is no good reason for a statement to contain more than 1 empty line, but there are many good reasons to split statements at empty lines when you don't want to write semicolons.

If you still insist on empty lines then just use something like String.replaceAll("\n\n+", "\n").

@pansong291
Copy link
Author

pansong291 commented Apr 10, 2024

@manticore-projects Hello, I don't think it's that simple. Consider the following SQL statement, it cannot simply replace empty lines:

update shop_info set title=?,



content='abc



def'
where id=?

@manticore-projects
Copy link
Contributor

With JSQLParser 4.10 Snapshot, you can use the method CCJSqlParserUtil.sanitizeSingleSql( sqlStr) to sanitize your statement. It will remove the redundant empty lines using a regular expression which honors StringLiteral.

    @Test
    void testSingleStatementWithEmptyLines() throws JSQLParserException {
        String sqlStr = "update shop_info set title=?,\n"
                        + "\n"
                        + "\n"
                        + "\n"
                        + "content='abc\n"
                        + "\n"
                        + "\n"
                        + "\n"
                        + "def'\n"
                        + "where id=?";

        Statement statement = CCJSqlParserUtil.parse( CCJSqlParserUtil.sanitizeSingleSql( sqlStr) );
        TestUtils.assertStatementCanBeDeparsedAs(statement, "update shop_info set title=?,\n"
                                                            + "content='abc\n"
                                                            + "\n"
                                                            + "\n"
                                                            + "\n"
                                                            + "def'\n"
                                                            + "where id=?", true);
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants