alibaba / druid

阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池
https://github.com/alibaba/druid/wiki
Apache License 2.0
27.92k stars 8.57k forks source link

SQL解析错误 #5417

Open CharlesWone opened 1 year ago

CharlesWone commented 1 year ago

18:49:35.868 [http-nio-9012-exec-1] ERROR c.a.d.f.s.StatFilter - [mergeSql,150] - merge sql error, dbType clickhouse, druid-1.2.16, sql : WITH inData AS( SELECT COUNT(1) inCount, SUM(amount) inAmount FROM mv_trans_info_to_address WHERE to_address = ? AND timestamp BETWEEN ? AND ? ), outData AS( SELECT COUNT(1) outCount, SUM(amount) outAmount FROM mv_trans_info_owner_address WHERE owner_address = ? AND timestamp BETWEEN ? AND ? ) SELECT * FROM inData, outData com.alibaba.druid.sql.parser.ParserException: not supported.pos 166, line 3, column 10, token ) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:615) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:101) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.parameterize(ParameterizedOutputVisitorUtils.java:163) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.parameterize(ParameterizedOutputVisitorUtils.java:134) at com.alibaba.druid.filter.stat.StatFilter.mergeSql(StatFilter.java:148)

lizongbo commented 1 year ago

发完整的能重现问题的sql出来。

CharlesWone commented 1 year ago

发完整的能重现问题的sql出来。

    String sql = "WITH a AS(SELECT 1) SELECT * FROM a";
    ParameterizedOutputVisitorUtils.parameterize(sql, DbType.clickhouse, null, null, null);

with as这种sql,这个方法这里报错

lizongbo commented 1 year ago

发完整的能重现问题的sql出来。

    String sql = "WITH a AS(SELECT 1) SELECT * FROM a";
    ParameterizedOutputVisitorUtils.parameterize(sql, DbType.clickhouse, null, null, null);

with as这种sql,这个方法这里报错

看官方语法是 as后面的变量名,确认sql没有写错吗? 是不是应该这样写:

WITH (SELECT 1)  AS a  SELECT * FROM a

这样解析是没有问题的。

https://clickhouse.com/docs/zh/sql-reference/statements/select/with

CharlesWone commented 11 months ago

发完整的能重现问题的sql出来。

    String sql = "WITH a AS(SELECT 1) SELECT * FROM a";
    ParameterizedOutputVisitorUtils.parameterize(sql, DbType.clickhouse, null, null, null);

with as这种sql,这个方法这里报错

看官方语法是 as后面的变量名,确认sql没有写错吗? 是不是应该这样写:

WITH (SELECT 1)  AS a  SELECT * FROM a

这样解析是没有问题的。

https://clickhouse.com/docs/zh/sql-reference/statements/select/with

你个sql有问题,解析虽然不报错,查询报错,DBeaver都执行不了 你这种写法是将子查询结果只有一行的作为一个常量,我是需要将子查询的结果作为一个临时表