diff --git a/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2SelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2SelectParser.java index 13abc8d994..727b64634d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2SelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/db2/parser/DB2SelectParser.java @@ -19,7 +19,6 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLSetQuantifier; import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; import com.alibaba.druid.sql.dialect.db2.ast.stmt.DB2SelectQueryBlock; -import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLSelectParser; import com.alibaba.druid.sql.parser.Token; diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java index 499718ca8e..d75ebb4162 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java @@ -44,7 +44,7 @@ public class ParameterizedOutputVisitorUtils { if (statementList.size() == 0) { return sql; } - + SQLStatement stmt = statementList.get(0); StringBuilder out = new StringBuilder(); @@ -62,7 +62,7 @@ public class ParameterizedOutputVisitorUtils { if (JdbcUtils.MYSQL.equals(dbType)) { return new MySqlParameterizedOutputVisitor(out); } - + if (JdbcUtils.MARIADB.equals(dbType)) { return new MySqlParameterizedOutputVisitor(out); } @@ -74,11 +74,11 @@ public class ParameterizedOutputVisitorUtils { if (JdbcUtils.POSTGRESQL.equals(dbType)) { return new PGParameterizedOutputVisitor(out); } - + if (JdbcUtils.SQL_SERVER.equals(dbType) || JdbcUtils.JTDS.equals(dbType)) { return new SQLServerParameterizedOutputVisitor(out); } - + if (JdbcUtils.DB2.equals(dbType)) { return new DB2ParameterizedOutputVisitor(out); } @@ -99,16 +99,19 @@ public class ParameterizedOutputVisitorUtils { } public static SQLBinaryOpExpr merge(SQLBinaryOpExpr x) { + SQLExpr left = x.getLeft(); + SQLExpr right = x.getRight(); SQLObject parent = x.getParent(); - if (x.getLeft() instanceof SQLLiteralExpr && x.getRight() instanceof SQLLiteralExpr) { + + if (left instanceof SQLLiteralExpr && right instanceof SQLLiteralExpr) { if (x.getOperator() == SQLBinaryOperator.Equality || x.getOperator() == SQLBinaryOperator.NotEqual) { - x.getLeft().getAttributes().put(ATTR_PARAMS_SKIP, true); - x.getRight().getAttributes().put(ATTR_PARAMS_SKIP, true); + left.putAttribute(ATTR_PARAMS_SKIP, true); + right.putAttribute(ATTR_PARAMS_SKIP, true); } return x; } - if (x.getRight() instanceof SQLLiteralExpr) { + if (right instanceof SQLLiteralExpr) { x = new SQLBinaryOpExpr(x.getLeft(), x.getOperator(), new SQLVariantRefExpr("?")); x.setParent(parent); } @@ -141,17 +144,17 @@ public class ParameterizedOutputVisitorUtils { // ID = ? OR ID = ? => ID = ? if (x.getOperator() == SQLBinaryOperator.BooleanOr) { - if ((x.getLeft() instanceof SQLBinaryOpExpr) && (x.getRight() instanceof SQLBinaryOpExpr)) { - SQLBinaryOpExpr left = (SQLBinaryOpExpr) x.getLeft(); - SQLBinaryOpExpr right = (SQLBinaryOpExpr) x.getRight(); + if ((left instanceof SQLBinaryOpExpr) && (right instanceof SQLBinaryOpExpr)) { + SQLBinaryOpExpr leftBinary = (SQLBinaryOpExpr) x.getLeft(); + SQLBinaryOpExpr rightBinary = (SQLBinaryOpExpr) x.getRight(); - if (mergeEqual(left, right)) { - return left; + if (mergeEqual(leftBinary, rightBinary)) { + return leftBinary; } - if (isLiteralExpr(left.getLeft()) && left.getOperator() == SQLBinaryOperator.BooleanOr) { - if (mergeEqual(left.getRight(), right)) { - return left; + if (isLiteralExpr(leftBinary.getLeft()) && leftBinary.getOperator() == SQLBinaryOperator.BooleanOr) { + if (mergeEqual(leftBinary.getRight(), right)) { + return leftBinary; } } } diff --git a/src/main/java/com/alibaba/druid/util/JdbcUtils.java b/src/main/java/com/alibaba/druid/util/JdbcUtils.java index 5b9d3e3c8d..fd31494d7d 100644 --- a/src/main/java/com/alibaba/druid/util/JdbcUtils.java +++ b/src/main/java/com/alibaba/druid/util/JdbcUtils.java @@ -53,20 +53,23 @@ public final class JdbcUtils implements JdbcConstants { static { try { - for (Enumeration e = Thread.currentThread().getContextClassLoader().getResources("META-INF/druid-driver.properties"); e.hasMoreElements();) { - URL url = e.nextElement(); + ClassLoader ctxClassLoader = Thread.currentThread().getContextClassLoader(); + if (ctxClassLoader != null) { + for (Enumeration e = ctxClassLoader.getResources("META-INF/druid-driver.properties"); e.hasMoreElements();) { + URL url = e.nextElement(); - Properties property = new Properties(); + Properties property = new Properties(); - InputStream is = null; - try { - is = url.openStream(); - property.load(is); - } finally { - JdbcUtils.close(is); + InputStream is = null; + try { + is = url.openStream(); + property.load(is); + } finally { + JdbcUtils.close(is); + } + + driverUrlMapping.putAll(property); } - - driverUrlMapping.putAll(property); } } catch (Exception e) { LOG.error("load druid-driver.properties error", e); @@ -486,7 +489,7 @@ public final class JdbcUtils implements JdbcConstants { // skip } } - + if (clazz == null) { try { ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); @@ -637,10 +640,13 @@ public final class JdbcUtils implements JdbcConstants { return null; } - try { - clazz = Thread.currentThread().getContextClassLoader().loadClass(className); - } catch (ClassNotFoundException e) { - + ClassLoader ctxClassLoader = Thread.currentThread().getContextClassLoader(); + if (ctxClassLoader != null) { + try { + clazz = ctxClassLoader.loadClass(className); + } catch (ClassNotFoundException e) { + // skip + } } if (clazz != null) { diff --git a/src/main/java/com/alibaba/druid/wall/spi/DB2WallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/DB2WallVisitor.java index c928312ec1..de93f1a2e3 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/DB2WallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/DB2WallVisitor.java @@ -40,6 +40,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSetStatement; import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; +import com.alibaba.druid.sql.dialect.db2.ast.stmt.DB2SelectQueryBlock; import com.alibaba.druid.sql.dialect.db2.visitor.DB2ASTVisitorAdapter; import com.alibaba.druid.wall.Violation; import com.alibaba.druid.wall.WallConfig; @@ -128,6 +129,13 @@ public class DB2WallVisitor extends DB2ASTVisitorAdapter implements WallVisitor return true; } + + @Override + public boolean visit(DB2SelectQueryBlock x) { + WallVisitorUtils.checkSelelct(this, x); + + return true; + } @Override public boolean visit(SQLUnionQuery x) { @@ -222,4 +230,5 @@ public class DB2WallVisitor extends DB2ASTVisitorAdapter implements WallVisitor public boolean visit(SQLCallStatement x) { return false; } + } diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_wdw1206.java b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_wdw1206.java new file mode 100644 index 0000000000..1836a6a406 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_wdw1206.java @@ -0,0 +1,36 @@ +package com.alibaba.druid.bvt.bug; + +import java.sql.Connection; + +import junit.framework.TestCase; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.util.JdbcUtils; + +public class Bug_for_wdw1206 extends TestCase { + + private ClassLoader ctxClassLoader; + private DruidDataSource dataSource; + + protected void setUp() throws Exception { + ctxClassLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(null); + + dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:mock:"); + dataSource.setPoolPreparedStatements(false); + dataSource.setTestOnBorrow(true); + dataSource.setFilters("stat"); + } + + protected void tearDown() throws Exception { + Thread.currentThread().setContextClassLoader(ctxClassLoader); + + JdbcUtils.close(dataSource); + } + + public void test_nullCtxClassLoader() throws Exception { + Connection conn = dataSource.getConnection(); + conn.close(); + } +}