alibaba / druid

阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池
https://github.com/alibaba/druid/wiki
Apache License 2.0
27.95k stars 8.57k forks source link

当合并SQL开启时, 整合flyway报错 #1561

Closed ZxcSoft closed 7 years ago

ZxcSoft commented 7 years ago

先说下环境: spring, springmvc:4.3.4.RELEASE flyway:4.0.3 druid:1.0.25 数据库: postgresql 9.5版本

spring配置的druid statFilter如下 <bean id="statFilter" class="com.alibaba.druid.filter.stat.StatFilter" lazy-init="true">

    <property name="logSlowSql" value="true" />
    <property name="mergeSql" value="true" />
</bean>

flyway配置如下

合并验证SQL时 主要报错如下

2016-12-26 19:23:29.017 [localhost-startStop-1] INFO [Slf4jLog:44] - Flyway 4.0.3 by Boxfuse 2016-12-26 19:23:29.033 [localhost-startStop-1] INFO [Slf4jLog:44] - Database: jdbc:postgresql://192.168.1.233/latto (PostgreSQL 9.5) 2016-12-26 19:23:29.115 [localhost-startStop-1] DEBUG [Slf4jLog:40] - DDL Transactions Supported: true 2016-12-26 19:23:29.118 [localhost-startStop-1] DEBUG [Slf4jLog:40] - Schema: public 2016-12-26 19:23:29.128 [localhost-startStop-1] DEBUG [Slf4jLog:40] - Spring Jdbc available: true 2016-12-26 19:23:29.130 [localhost-startStop-1] DEBUG [Slf4jLog:40] - Scanning for SQL callbacks ... 2016-12-26 19:23:29.130 [localhost-startStop-1] DEBUG [Slf4jLog:40] - Scanning for classpath resources at 'classpath:flyway' (Prefix: '', Suffix: '.sql') 2016-12-26 19:23:29.130 [localhost-startStop-1] DEBUG [Slf4jLog:40] - Determining location urls for classpath:flyway using ClassLoader WebappClassLoader context: latto-service delegate: false ----------> Parent Classloader: java.net.URLClassLoader@1ef7fe8e ... 2016-12-26 19:23:29.131 [localhost-startStop-1] WARN [Slf4jLog:48] - Unable to resolve location classpath:flyway 2016-12-26 19:23:29.153 [localhost-startStop-1] ERROR [Log4j2Impl:53] - merge sql error, dbType postgresql, sql : SET search_path = "public","$user", public com.alibaba.druid.sql.parser.ParserException: syntax error, expect EQ, actual COMMA $user at com.alibaba.druid.sql.parser.SQLExprParser.accept(SQLExprParser.java:1657) at com.alibaba.druid.sql.parser.SQLExprParser.parseAssignItem(SQLExprParser.java:1839) at com.alibaba.druid.sql.parser.SQLStatementParser.parseAssignItems(SQLStatementParser.java:1635) at com.alibaba.druid.sql.parser.SQLStatementParser.parseSet(SQLStatementParser.java:1628) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:215) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:147) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:142) at com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils.parameterize(ParameterizedOutputVisitorUtils.java:53) at com.alibaba.druid.filter.stat.StatFilter.mergeSql(StatFilter.java:145) at com.alibaba.druid.filter.stat.StatFilter.createSqlStat(StatFilter.java:630) at com.alibaba.druid.filter.stat.StatFilter.statementPrepareAfter(StatFilter.java:305) at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:124) at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:448) at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:342) at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:331) at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at net.bull.javamelody.JdbcWrapper$ConnectionInvocationHandler.invoke(JdbcWrapper.java:189) at net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler.invoke(JdbcWrapper.java:286) at com.sun.proxy.$Proxy108.prepareStatement(Unknown Source) at org.flywaydb.core.internal.dbsupport.JdbcTemplate.prepareStatement(JdbcTemplate.java:290) at org.flywaydb.core.internal.dbsupport.JdbcTemplate.execute(JdbcTemplate.java:218) at org.flywaydb.core.internal.dbsupport.postgresql.PostgreSQLDbSupport.doChangeCurrentSchemaTo(PostgreSQLDbSupport.java:107) at org.flywaydb.core.internal.dbsupport.postgresql.PostgreSQLDbSupport.changeCurrentSchemaTo(PostgreSQLDbSupport.java:92) at org.flywaydb.core.internal.command.DbValidate$1.doInTransaction(DbValidate.java:139) at org.flywaydb.core.internal.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:72) at org.flywaydb.core.internal.command.DbValidate.validate(DbValidate.java:136) at org.flywaydb.core.Flyway.doValidate(Flyway.java:1002) at org.flywaydb.core.Flyway.access$100(Flyway.java:72) at org.flywaydb.core.Flyway$1.execute(Flyway.java:921) at org.flywaydb.core.Flyway$1.execute(Flyway.java:917) at org.flywaydb.core.Flyway.execute(Flyway.java:1373) at org.flywaydb.core.Flyway.migrate(Flyway.java:917)

关闭合并SQL之后, 这个错误消失 应该是flyway设置用户到public这个schema. 但是druid不支持合并这个语句导致的.

ZxcSoft commented 7 years ago

spring statfilter提交上去? 我现在贴一下 <bean id="statFilter" class="com.alibaba.druid.filter.stat.StatFilter" lazy-init="true">

    <property name="logSlowSql" value="true" />
    <property name="mergeSql" value="true" />
</bean>
ZxcSoft commented 7 years ago

.....还是没贴出来 ` <bean id="statFilter" class="com.alibaba.druid.filter.stat.StatFilter" lazy-init="true">

    <property name="logSlowSql" value="true" />
    <property name="mergeSql" value="true" />
</bean>`
wenshao commented 7 years ago

问题已经重现并且解决,预计元旦后发布新版本

cedooo commented 8 months ago

问题已经重现并且解决,预计元旦后发布新版本

1.2.* 版本又出现这个问题了