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

47 篇文章 0 订阅
8 篇文章 0 订阅

背景:

项目中需要使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个不安分的程序员

祝您财源广进

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值