其他分享
首页 > 其他分享> > 数据链接池Druid和Clickhouse:expect ANY, actual ANY pos 2

数据链接池Druid和Clickhouse:expect ANY, actual ANY pos 2

作者:互联网

背景:

项目中需要使用A表left join B表,并且B表中有重复的key时只显示一条。在MySql中可以这样实现:

select
 * 
from
 a t1
left join b t2 
 on  t1.key= t2.key
and
 t2.id =(select min(id) from b where key =t2.key)

也就是在join操作后还需要使用一个子查询限制B表相同key的数据只使用一条。在Clickhouse中可以使用any left join实现相同的功能:

select
 * 
from
 a t1
any left b t2 
on t1.key = t2.key

在项目中使用any left join却报了错:

syntax error: syntax error, error in :' )a2 ANY LEFT JOIN t_test test o', expect ANY, actual ANY pos 2978, line 88, column 8, token ANY

环境:

JDK1.8
<druid.version>1.1.10</druid.version>

解决方法:

升级druid到<druid.version>1.2.6</druid.version>  
并取消使用druid filter 准确来说是:wall

解决过程:

  看到错误信息是:   expect ANY, actual ANY 也就是期望是ANY,而得到的也是ANY。这不就是想啥来啥多少人梦寐以求的心想事成吗?怎么还报错了呢。是不是MyBatis XML中配置Sql时有特殊字符?删了重新编写依然报错依旧。仔细看错误信息发现:

ALL LEFT JOIN t_test a o, pos 2985, line 90, column 5, token ALL
at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:576)
at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:602)
at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:124)
at com.alibaba.druid.wall.WallProvider.checkInternal(WallProvider.java:630)

从错误信息看出原来是druid报的错误,检查druid版本,发现使用的版本较低就升级到了最新的版本。但问题依旧。项目暂时用不到druid wall过滤器,索性就取消了过滤器。取消后可以正常执行any left join语句.

那么问题来了:

如果还想同时使用druid的过滤器咋办?
当然可以修改wall filter源码以支持clickhouse sql.
如果不想改代码还可以?

提示 clickhouse

标签:actual,t2,druid,Druid,key,join,ANY,left
来源: https://blog.51cto.com/u_14256460/2785243