JSQLParser / JSqlParser

JSqlParser parses an SQL statement and translate it into a hierarchy of Java classes. The generated hierarchy can be navigated using the Visitor Pattern
https://github.com/JSQLParser/JSqlParser/wiki
Apache License 2.0
5.33k stars 1.34k forks source link

where is not supported case ? #964

Closed zhou-hao closed 4 years ago

zhou-hao commented 4 years ago

Describe the bug can not parse case expression

To Reproduce Steps to reproduce the behavior:

  1. Example SQL
    select *
    from dev_device_tags t
    where (
          case true
              when t.key = '1' then t.value = '2'
              when t.key = '2' then t.value = '3'
              end
    )
  2. Parsing this SQL using JSqlParser with this statements
    CCJSqlParserUtil.parse(sql)
  3. Exception
    
    net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "case" "CASE"
    at line 4, column 11.

Was expecting one of:

"!"
"("
"NOT"

at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:22439)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:22286)
at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:7535)
at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:7475)
at net.sf.jsqlparser.parser.CCJSqlParser.AndExpression(CCJSqlParser.java:7528)
at net.sf.jsqlparser.parser.CCJSqlParser.OrExpression(CCJSqlParser.java:7475)
at net.sf.jsqlparser.parser.CCJSqlParser.Expression(CCJSqlParser.java:7446)
at net.sf.jsqlparser.parser.CCJSqlParser.WhereClause(CCJSqlParser.java:6425)
at net.sf.jsqlparser.parser.CCJSqlParser.PlainSelect(CCJSqlParser.java:3794)
at net.sf.jsqlparser.parser.CCJSqlParser.SetOperationList(CCJSqlParser.java:3973)
at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:3649)
at net.sf.jsqlparser.parser.CCJSqlParser.Select(CCJSqlParser.java:3642)
at net.sf.jsqlparser.parser.CCJSqlParser.SingleStatement(CCJSqlParser.java:124)
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:75)
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:49)
... 67 more

**Expected behavior**
A clear and concise description of what you expected to happen.

**System**
 - Database postgresql
- Java 8
- JSqlParser 3.1
zhou-hao commented 4 years ago

change the sql.....

select *
from dev_device_tags t
where (
          case
              when t.key = '1' then t.value = '2'
              when t.key = '2' then t.value = '3'
              end
 )