From f1449462c71bd3d72038d81f7cbeef65f76384d2 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 30 Aug 2012 05:24:06 +0800 Subject: [PATCH 1/3] bug fixed OracleSQL Parser, support with subQuery --- .../oracle/parser/OracleSelectParser.java | 2 +- .../bvt/sql/oracle/OracleSelectTest38.java | 95 +++++++++++++++++++ 2 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest38.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index 0c0456d5db..c75a4eabcc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -686,7 +686,7 @@ public class OracleSelectParser extends SQLSelectParser { if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); OracleSelectSubqueryTableSource tableSource; - if (lexer.token() == Token.SELECT) { + if (lexer.token() == Token.SELECT || lexer.token() == Token.WITH) { tableSource = new OracleSelectSubqueryTableSource(select()); } else if (lexer.token() == (Token.LPAREN)) { tableSource = new OracleSelectSubqueryTableSource(select()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest38.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest38.java new file mode 100644 index 0000000000..6d413b27fc --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest38.java @@ -0,0 +1,95 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleSelectTest38 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select * from " + + "(with vw_kreis_statics_t as" + + " (select substr(xzqh,1,6) xzqh,swrslx,sum(swrs_count) acd_totle from" + + " (select xzqh,sglx,case when (swrs7 < 3) then '1'" + + " when (swrs7 < 5) then '2' when (swrs7 <= 9) then '3' else '4' end swrslx,1 swrs_count" + + " from acduser.vw_acd_info where sglx='1' " + + " " + + " and sgfssj >= ?" + + " " + + " " + + " )" + + " group by substr(xzqh,1,6),swrslx)" + + "" + + " select e.\"XZQH\",e.\"LESS3\",e.\"F3TO5\",e.\"F5TO9\",e.\"MORE9\",kreis_code, kreis_name,px1,py1,px2,py2 from" + + " ( select" + + " xzqh," + + " nvl(max(decode(swrslx,'1',acd_totle)),0) less3," + + " nvl(max(decode(swrslx,'2',acd_totle)),0) f3to5," + + " nvl(max(decode(swrslx,'3',acd_totle)),0) f5to9," + + " nvl(max(decode(swrslx,'4',acd_totle)),0) more9" + + " from( select * from acduser.vw_kreis_statics_t) group by xzqh " + + " ) e" + + "" + + " left join" + + " acduser.vw_sc_kreis_code_lv2 f on e.xzqh = f.short_kreis_code) " + + " where kreis_code in" + + "(select * from " + + " (select tbek_code from acduser.vw_kreis_code start with tbek_code = ? connect by prior tbek_pk=tbek_parent ) " + + "where tbek_code != ?)"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(4, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("acduser.vw_acd_info"))); + + Assert.assertEquals(15, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "sglx"))); + + // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); + } +} From f162238125bd6ed30bdb8e9e7b0a587cf1c81d84 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 30 Aug 2012 05:58:05 +0800 Subject: [PATCH 2/3] remove unused code --- .../encoding/EncodingConvertFilter.java | 10 ----- .../config/AbstractDruidFilterConfig.java | 42 ----------------- .../druid/proxy/config/DruidFilterConfig.java | 23 ---------- .../config/EncodingDruidFilterConfig.java | 45 ------------------- .../spring/stat/BeanTypeAutoProxyCreator.java | 1 - .../druid/bvt/proxy/DruidDriverTest.java | 1 - 6 files changed, 122 deletions(-) delete mode 100644 src/main/java/com/alibaba/druid/proxy/config/AbstractDruidFilterConfig.java delete mode 100644 src/main/java/com/alibaba/druid/proxy/config/DruidFilterConfig.java delete mode 100644 src/main/java/com/alibaba/druid/proxy/config/EncodingDruidFilterConfig.java diff --git a/src/main/java/com/alibaba/druid/filter/encoding/EncodingConvertFilter.java b/src/main/java/com/alibaba/druid/filter/encoding/EncodingConvertFilter.java index 97d8afb07b..96a5428ce0 100644 --- a/src/main/java/com/alibaba/druid/filter/encoding/EncodingConvertFilter.java +++ b/src/main/java/com/alibaba/druid/filter/encoding/EncodingConvertFilter.java @@ -26,8 +26,6 @@ import java.util.Properties; import com.alibaba.druid.filter.FilterAdapter; import com.alibaba.druid.filter.FilterChain; -import com.alibaba.druid.proxy.config.AbstractDruidFilterConfig; -import com.alibaba.druid.proxy.config.EncodingDruidFilterConfig; import com.alibaba.druid.proxy.jdbc.CallableStatementProxy; import com.alibaba.druid.proxy.jdbc.ClobProxy; import com.alibaba.druid.proxy.jdbc.ConnectionProxy; @@ -46,14 +44,6 @@ public class EncodingConvertFilter extends FilterAdapter { private String clientEncoding; private String serverEncoding; - public void loadConfig(AbstractDruidFilterConfig druidFilterConfig) { - EncodingDruidFilterConfig druidEncodingFilterConfig = (EncodingDruidFilterConfig) druidFilterConfig; - if (druidEncodingFilterConfig != null) { - clientEncoding = druidEncodingFilterConfig.getClientEncoding(); - serverEncoding = druidEncodingFilterConfig.getServerEncoding(); - } - } - public ConnectionProxy connection_connect(FilterChain chain, Properties info) throws SQLException { ConnectionProxy conn = chain.connection_connect(info); diff --git a/src/main/java/com/alibaba/druid/proxy/config/AbstractDruidFilterConfig.java b/src/main/java/com/alibaba/druid/proxy/config/AbstractDruidFilterConfig.java deleted file mode 100644 index 8f880b0162..0000000000 --- a/src/main/java/com/alibaba/druid/proxy/config/AbstractDruidFilterConfig.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.proxy.config; - -/** - * @author gang.su - */ -public abstract class AbstractDruidFilterConfig { - - private String name; - private String clazz; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getClazz() { - return clazz; - } - - public void setClazz(String clazz) { - this.clazz = clazz; - } - -} diff --git a/src/main/java/com/alibaba/druid/proxy/config/DruidFilterConfig.java b/src/main/java/com/alibaba/druid/proxy/config/DruidFilterConfig.java deleted file mode 100644 index e747d3bbe5..0000000000 --- a/src/main/java/com/alibaba/druid/proxy/config/DruidFilterConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.proxy.config; - -/** - * @author gang.su - */ -public class DruidFilterConfig extends AbstractDruidFilterConfig { - -} diff --git a/src/main/java/com/alibaba/druid/proxy/config/EncodingDruidFilterConfig.java b/src/main/java/com/alibaba/druid/proxy/config/EncodingDruidFilterConfig.java deleted file mode 100644 index 878fbb88b1..0000000000 --- a/src/main/java/com/alibaba/druid/proxy/config/EncodingDruidFilterConfig.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.proxy.config; - -/** - * druid filter配置 来源于配置文件 - * - * @author gang.su - */ -public class EncodingDruidFilterConfig extends AbstractDruidFilterConfig { - - private String clientEncoding; - - private String serverEncoding; - - public String getClientEncoding() { - return clientEncoding; - } - - public void setClientEncoding(String clientEncoding) { - this.clientEncoding = clientEncoding; - } - - public String getServerEncoding() { - return serverEncoding; - } - - public void setServerEncoding(String serverEncoding) { - this.serverEncoding = serverEncoding; - } - -} diff --git a/src/main/java/com/alibaba/druid/support/spring/stat/BeanTypeAutoProxyCreator.java b/src/main/java/com/alibaba/druid/support/spring/stat/BeanTypeAutoProxyCreator.java index 6ce7f98813..968f7e701d 100644 --- a/src/main/java/com/alibaba/druid/support/spring/stat/BeanTypeAutoProxyCreator.java +++ b/src/main/java/com/alibaba/druid/support/spring/stat/BeanTypeAutoProxyCreator.java @@ -21,7 +21,6 @@ import java.util.List; import org.springframework.aop.TargetSource; import org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator; -import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; diff --git a/src/test/java/com/alibaba/druid/bvt/proxy/DruidDriverTest.java b/src/test/java/com/alibaba/druid/bvt/proxy/DruidDriverTest.java index 35cc17c2ef..dd1346eab4 100644 --- a/src/test/java/com/alibaba/druid/bvt/proxy/DruidDriverTest.java +++ b/src/test/java/com/alibaba/druid/bvt/proxy/DruidDriverTest.java @@ -23,7 +23,6 @@ import junit.framework.TestCase; import com.alibaba.druid.filter.FilterAdapter; import com.alibaba.druid.mock.MockDriver; import com.alibaba.druid.proxy.DruidDriver; -import com.alibaba.druid.proxy.config.AbstractDruidFilterConfig; import com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl; import com.alibaba.druid.util.JdbcUtils; From de8c746ff15825e45f44a0b613af55f6d6fac3c7 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 30 Aug 2012 06:00:19 +0800 Subject: [PATCH 3/3] improve testcase, test EncodingFilter --- .../java/com/alibaba/druid/bvt/filter/FilterChainImplTest.java | 2 +- .../java/com/alibaba/druid/bvt/filter/FilterChainImplTest2.java | 2 +- .../java/com/alibaba/druid/bvt/filter/FilterChainImplTest3.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest.java b/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest.java index 29bfa43d10..0c8595c5a1 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest.java @@ -28,7 +28,7 @@ public class FilterChainImplTest extends TestCase { dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mock:xxx"); - dataSource.setFilters("stat,log4j,wall"); + dataSource.setFilters("stat,log4j,wall,encoding"); dataSource.getProxyFilters().add(new FilterAdapter() { }); dataSource.setDbType("mysql"); diff --git a/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest2.java b/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest2.java index fd5a0fe91e..b1b1c689bb 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest2.java @@ -20,7 +20,7 @@ public class FilterChainImplTest2 extends TestCase { dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mock:xxx"); - dataSource.setFilters("stat,log4j,wall"); + dataSource.setFilters("stat,log4j,wall,encoding"); dataSource.getProxyFilters().add(new FilterAdapter() {} ); dataSource.setDbType("mysql"); diff --git a/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest3.java b/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest3.java index ed049e6a2e..57e5e0a0af 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/FilterChainImplTest3.java @@ -27,7 +27,7 @@ public class FilterChainImplTest3 extends TestCase { dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mock:xxx"); - dataSource.setFilters("stat,log4j,wall"); + dataSource.setFilters("stat,log4j,wall,encoding"); dataSource.getProxyFilters().add(new FilterAdapter() {} ); dataSource.setDbType("mysql");