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.32k stars 1.34k forks source link

Cannot parse druid sql #1625

Open shuitai opened 2 years ago

shuitai commented 2 years ago

Cannot parse druid sql: https://druid.apache.org/docs/latest/querying/sql.html

String sql = "SELECT count(machineId), FLOOR(__time TO HOUR) FROM xaxd_brokerloadindexv1 WHERE __time BETWEEN '2010-02-12 00:00:00' AND '2019-02-23 00:00:00' GROUP BY FLOOR(__time TO HOUR)"; Select select = (Select) CCJSqlParserUtil.parse(sql);

The sample SQL is: SELECT count(machineId), FLOOR(__time TO HOUR) FROM xaxd_brokerloadindexv1 WHERE time BETWEEN '2010-02-12 00:00:00' AND '2019-02-23 00:00:00' GROUP BY FLOOR(time TO HOUR)

The exception is: Exception in thread "main" net.sf.jsqlparser.JSQLParserException: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "(" "(" at line 1, column 31.

Was expecting one of:

"&"
"::"
";"
"<<"
">>"
"COLLATE"
"CONNECT"
"EMIT"
"GROUP"
"HAVING"
"INTO"
"START"
"WINDOW"
"["
"^"
"|"
<EOF>

at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatement(CCJSqlParserUtil.java:263)
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:81)
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parse(CCJSqlParserUtil.java:47)
at com.java.test.SqlParserTest.main(SqlParserTest.java:12)

Caused by: java.util.concurrent.ExecutionException: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "(" "(" at line 1, column 31.

Was expecting one of:

"&"
"::"
";"
"<<"
">>"
"COLLATE"
"CONNECT"
"EMIT"
"GROUP"
"HAVING"
"INTO"
"START"
"WINDOW"
"["
"^"
"|"
<EOF>

at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:205)
at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatement(CCJSqlParserUtil.java:258)
... 3 more

Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "(" "(" at line 1, column 31.

Was expecting one of:

"&"
"::"
";"
"<<"
">>"
"COLLATE"
"CONNECT"
"EMIT"
"GROUP"
"HAVING"
"INTO"
"START"
"WINDOW"
"["
"^"
"|"
<EOF>

at net.sf.jsqlparser.parser.CCJSqlParser.generateParseException(CCJSqlParser.java:33398)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_consume_token(CCJSqlParser.java:33231)
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:167)
at net.sf.jsqlparser.parser.CCJSqlParserUtil$1.call(CCJSqlParserUtil.java:253)
at net.sf.jsqlparser.parser.CCJSqlParserUtil$1.call(CCJSqlParserUtil.java:250)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
manticore-projects commented 2 years ago

Greetings.

The RDBMS specific <timestamp> TO HOUR is not supported (simply because it is not standard compliant. Maybe you can use the standard complaint Extract( <field> FROM <expression>) instead.

Without the TO HOUR your statement parses fine.