#2060的bug未完全修复 druid 版本:1.1.6 配置信息 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.postgresql.Driver
测试数据: create table test1( tid INT not null, tid1 INT not null, tvalue int not null ); alter table test1 add PRIMARY key(tid,tid1);
insert into test1 as xx (tid,tid1,tvalue) values (1,1,1),(2,2,2) on conflict(tid,tid1) do update set tvalue = xx.tvalue + excluded.tvalue; 受影响的行: 2
代码内异常: Caused by: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'est1 as xx(tid,tid1,tvalue) values ', expect AS, actual AS pos 20, line 1, column 18, token AS : insert into test1 as xx(tid,tid1,tvalue) values (1,1,1) on conflict(tid,tid1) do update set tvalue = xx.tvalue + excluded.tvalue at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:798) at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:286) at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:506) at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:942) at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:143) at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:506) at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:375) at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:387) at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:85) at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88) at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59) at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:85) at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49) at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198) at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433) ... 45 more Caused by: com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'est1 as xx(tid,tid1,tvalue) values ', expect AS, actual AS pos 20, line 1, column 18, token AS at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:284) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:421) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:81) at com.alibaba.druid.wall.WallProvider.checkInternal(WallProvider.java:624) at com.alibaba.druid.wall.WallProvider.check(WallProvider.java:578) at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:785) ... 66 more
原提问者GitHub用户NeedCuriosity
您在使用PostgreSQL的ON CONFLICT DO UPDATE语句处理冲突时遇到了解析失败的问题。根据您提供的信息,您正在使用Druid 1.1.6版本,并且出现了以下异常:
Caused by: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'est1 as xx(tid,tid1,tvalue) values ', expect AS, actual AS pos 20, line 1, column 18, token AS : insert into test1 as xx(tid,tid1,tvalue) values (1,1,1) on conflict(tid,tid1) do update set tvalue = xx.tvalue + excluded.tvalue
这个异常提示了一个SQL注入违规的错误,并指出了出错的位置。根据异常信息,您的SQL语句中似乎存在语法错误。
为了解决这个问题,有几个可能的步骤可以尝试:
1. 确认Druid版本:请确保您正在使用的Druid版本支持ON CONFLICT DO UPDATE语句。某些较旧的Druid版本可能不支持该语法的解析。
2. 检查SQL语法:仔细检查您的SQL语句中的语法错误。参考PostgreSQL文档和语法规范,确保您的语句符合正确的语法结构、关键字和标点符号之间有正确的空格,并且列名、值以及冲突处理子句等部分都正确。
3. 升级Druid版本:根据一个回答中提到的信息,Druid 1.1.6版本中的#2060 bug可能未完全修复。尝试升级到最新的Druid版本(例如1.1.14),看看是否能够解决您的问题。
如果尝试了上述步骤后仍然存在问题,请考虑查看Druid的官方文档、GitHub仓库或寻求相关技术支持以获取更多帮助和解决方案。
在PostgreSQL中,ON CONFLICT DO UPDATE语句用于在插入数据时处理冲突。在执行这个语句时,您可以使用“update增量”来更新已存在的数据。
如果您在使用ON CONFLICT DO UPDATE语句时遇到了解析失败的问题,可能是因为您的语法有误或不支持这种语法。具体来说,如果您的PostgreSQL版本低于9.5,或者您的语法不正确,都可能导致解析失败。
为了解决这个问题,您可以尝试以下几种方法:
升级PostgreSQL版本:如果您的PostgreSQL版本低于9.5,您可以尝试升级到9.5或更高版本。从PostgreSQL 9.5开始,支持ON CONFLICT DO UPDATE语句,因此您可以使用这个语句来处理冲突并更新数据。如果您无法升级PostgreSQL版本,可以尝试使用其他方法,例如使用INSERT INTO ... ON DUPLICATE KEY UPDATE语句。
确认语法正确性:如果您的PostgreSQL版本已经支持ON CONFLICT DO UPDATE语句,但您的语法仍然不正确,可能是因为您的语法有误。请确保您的语法正确,并且符合PostgreSQL的语法要求。具体来说,您需要注意以下几点:
确保使用正确的语法结构,并且在关键字和标点符号之间使用正确的空格。
确保您的SQL语句中包含正确的列名和值,并且这些列名和值的类型匹配。
确保您的ON CONFLICT子句中包含正确的冲突处理方式,并且DO UPDATE子句中包含正确的更新语句。
使用INSERT INTO ... ON DUPLICATE KEY UPDATE语句:如果您的PostgreSQL版本不支持ON CONFLICT DO UPDATE语句,或者您无法解决语法问题,您可以尝试使用INSERT INTO ... ON DUPLICATE KEY UPDATE语句。这个语句在MySQL中也被称为INSERT ... ON DUPLICATE KEY UPDATE语句,可以用于在插入数据时处理冲突并更新数据。这个语句的语法与ON CONFLICT DO UPDATE语句类似,但存在一些细微的差别。您可以查阅相关文档,了解这个语句的详细用法。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。