开发者社区> 问答> 正文

postgresql ON CONFLICT DO UPDATE “update增量” 情况下解析失

#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

展开
收起
山海行 2023-07-05 20:34:27 533 0
3 条回答
写回答
取消 提交回答
  • 您在使用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仓库或寻求相关技术支持以获取更多帮助和解决方案。

    2023-07-30 14:05:10
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    在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语句类似,但存在一些细微的差别。您可以查阅相关文档,了解这个语句的详细用法。

    2023-07-30 13:57:05
    赞同 展开评论 打赏
  • 问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14

    原回答者GitHub用户wenshao

    2023-07-06 11:52:29
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
金融级 PostgreSQL监控及优化 立即下载
PostgreSQL在哈啰的实践-周飞 立即下载
PostgreSQL高并发数据库应用数据 立即下载

相关镜像