druid 1.1.13 flyway 5.2.4 postgres 9.6
2019-02-22 17:43:18.031 ERROR 13456 --- [ main] c.a.d.f.s.StatFilter : merge sql error, dbType postgresql, druid-1.1.13, sql : SET ROLE 'postgres'
com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'ROLE 'postgres'', expect LITERAL_CHARS, actual LITERAL_CHARS pos 19, line 1, column 9, token LITERAL_CHARS postgres at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:288) ~[druid-1.1.13.jar:1.1.13] at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:433) ~[druid-1.1.13.jar:1.1.13] at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:72) ~[druid-1.1.13.jar:1.1.13] at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.parameterize(ParameterizedOutputVisitorUtils.java:94) ~[druid-1.1.13.jar:1.1.13] at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.parameterize(ParameterizedOutputVisitorUtils.java:77) ~[druid-1.1.13.jar:1.1.13] at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.parameterize(ParameterizedOutputVisitorUtils.java:50) ~[druid-1.1.13.jar:1.1.13] at com.alibaba.druid.filter.stat.StatFilter.mergeSql(StatFilter.java:147) ~[druid-1.1.13.jar:1.1.13] at com.alibaba.druid.filter.stat.StatFilter.createSqlStat(StatFilter.java:648) ~[druid-1.1.13.jar:1.1.13] at com.alibaba.druid.filter.stat.StatFilter.statementPrepareAfter(StatFilter.java:311) ~[druid-1.1.13.jar:1.1.13] at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:124) ~[druid-1.1.13.jar:1.1.13] at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:568) ~[druid-1.1.13.jar:1.1.13]
原提问者GitHub用户xxfad
说的是Druid 1.1.13在解析带有Postgres的"set role"语句时会报错。
这是因为:
Druid是用于解析SQL的库,主要支持主流的数据库,如MySQL、Oracle等。
Postgres有一些特殊的SQL扩展语句,比如"set role"。Druid无法识别这些语句。
Flyway 5.2.4是数据库版本控制工具,内部使用Druid解析SQL。
当Flyway处理带有"set role"的Postgres脚本时,最终会交给Druid解析,然而Druid不支持"set role",所以就报错了。
解决这个问题有几种方法:
升级Druid版本。后续版本可能添加了对Postgres特殊语句的支持。
更改Flyway自己的SQL解析器。 Flyway可以内置专门针对Postgres优化的解析器。
避免使用"set role"语句。使用Druid支持的标准SQL语法。
将"set role"语句单独提取到脚本中。不放在Flyway自动处理的脚本里面。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。