diff --git a/src/main/java/com/alibaba/druid/common/jdbc/ResultSetMetaDataBase.java b/src/main/java/com/alibaba/druid/common/jdbc/ResultSetMetaDataBase.java index 627fff312a..b1f89a1cb8 100644 --- a/src/main/java/com/alibaba/druid/common/jdbc/ResultSetMetaDataBase.java +++ b/src/main/java/com/alibaba/druid/common/jdbc/ResultSetMetaDataBase.java @@ -35,11 +35,7 @@ public class ResultSetMetaDataBase implements ResultSetMetaData { @SuppressWarnings("unchecked") @Override public T unwrap(Class iface) throws SQLException { - if (iface == null) { - return null; - } - - if (iface.isAssignableFrom(ResultSetMetaDataBase.class)) { + if (isWrapperFor(iface)) { return (T) this; } return null; @@ -50,8 +46,12 @@ public class ResultSetMetaDataBase implements ResultSetMetaData { if (iface == null) { return false; } + + if (iface.isAssignableFrom(this.getClass())) { + return true; + } - return ResultSetMetaDataBase.class.isAssignableFrom(iface); + return false; } @Override diff --git a/src/main/java/com/alibaba/druid/common/jdbc/StatementBase.java b/src/main/java/com/alibaba/druid/common/jdbc/StatementBase.java index 873d90ebfd..05676e39d2 100644 --- a/src/main/java/com/alibaba/druid/common/jdbc/StatementBase.java +++ b/src/main/java/com/alibaba/druid/common/jdbc/StatementBase.java @@ -7,6 +7,8 @@ import java.sql.SQLFeatureNotSupportedException; import java.sql.SQLWarning; import java.sql.Statement; +import com.alibaba.druid.mock.MockConnectionClosedException; + public abstract class StatementBase implements Statement { private Connection connection; @@ -41,8 +43,14 @@ public abstract class StatementBase implements Statement { this.connection = connection; } - protected void checkOpen() throws SQLException { - + protected void checkOpen() throws SQLException, MockConnectionClosedException { + if (closed) { + throw new SQLException(); + } + + if (this.connection != null && this.connection.isClosed()) { + throw new MockConnectionClosedException(); + } } @Override diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveExprParser.java new file mode 100644 index 0000000000..c297327b75 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveExprParser.java @@ -0,0 +1,17 @@ +package com.alibaba.druid.sql.dialect.hive.parser; + +import com.alibaba.druid.sql.parser.Lexer; +import com.alibaba.druid.sql.parser.ParserException; +import com.alibaba.druid.sql.parser.SQLExprParser; + + +public class HiveExprParser extends SQLExprParser { + public HiveExprParser(String sql) throws ParserException{ + super(new HiveLexer(sql)); + this.lexer.nextToken(); + } + + public HiveExprParser(Lexer lexer){ + super(lexer); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java index 0e7f8017e6..4d4ec91164 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java @@ -11,7 +11,8 @@ import com.alibaba.druid.sql.parser.Token; public class PGExprParser extends SQLExprParser{ public PGExprParser(String sql) throws ParserException{ - super(sql); + super(new PGLexer(sql)); + this.lexer.nextToken(); } public PGExprParser(Lexer lexer){ diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index ee674125d0..3301429bfa 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -184,6 +184,13 @@ public class SQLStatementParser extends SQLParser { statementList.add(stmt); continue; } + + if (identifierEquals("COMMIT")) { + SQLStatement stmt = parseCommit(); + + statementList.add(stmt); + continue; + } if (lexer.token() == Token.LPAREN) { char mark_ch = lexer.current(); @@ -225,6 +232,10 @@ public class SQLStatementParser extends SQLParser { } return stmt; } + + public SQLStatement parseCommit() { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } public SQLUseStatement parseUse() { accept(Token.USE); diff --git a/src/test/java/com/alibaba/druid/bvt/mock/MockResultSetMetaDataTest.java b/src/test/java/com/alibaba/druid/bvt/mock/MockResultSetMetaDataTest.java index aa78e1c195..1636b25e7e 100644 --- a/src/test/java/com/alibaba/druid/bvt/mock/MockResultSetMetaDataTest.java +++ b/src/test/java/com/alibaba/druid/bvt/mock/MockResultSetMetaDataTest.java @@ -2,11 +2,13 @@ package com.alibaba.druid.bvt.mock; import java.math.BigDecimal; import java.sql.Date; +import java.sql.ResultSetMetaData; import junit.framework.TestCase; import org.junit.Assert; +import com.alibaba.druid.common.jdbc.ResultSetMetaDataBase; import com.alibaba.druid.common.jdbc.ResultSetMetaDataBase.ColumnMetaData; import com.alibaba.druid.mock.MockResultSetMetaData; @@ -17,6 +19,8 @@ public class MockResultSetMetaDataTest extends TestCase { Assert.assertTrue(meta.isWrapperFor(MockResultSetMetaData.class)); Assert.assertFalse(meta.isWrapperFor(BigDecimal.class)); Assert.assertTrue(meta.unwrap(MockResultSetMetaData.class) instanceof MockResultSetMetaData); + Assert.assertTrue(meta.unwrap(ResultSetMetaDataBase.class) instanceof MockResultSetMetaData); + Assert.assertTrue(meta.unwrap(ResultSetMetaData.class) instanceof MockResultSetMetaData); Assert.assertTrue(meta.unwrap(null) == null); Assert.assertTrue(meta.unwrap(java.sql.ResultSetMetaData.class) != null); Assert.assertTrue(meta.unwrap(Object.class) != null); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/Case3.java b/src/test/java/com/alibaba/druid/bvt/pool/Case3.java index 50b7f069da..7036a7061e 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/Case3.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/Case3.java @@ -4,11 +4,11 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; import junit.framework.Assert; import junit.framework.TestCase; -import com.alibaba.druid.mock.MockStatement; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.stat.DruidDataSourceStatManager; @@ -59,7 +59,7 @@ public class Case3 extends TestCase { ResultSet rs = stmt.executeQuery(); rs.next(); - MockStatement mockStmt = stmt.unwrap(MockStatement.class); + Statement mockStmt = stmt.unwrap(Statement.class); Assert.assertEquals(false, mockStmt.isClosed()); conn.close(); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestOraclePrefetch.java b/src/test/java/com/alibaba/druid/bvt/pool/TestOraclePrefetch.java index 47a6cbbe90..43c8b7e3d1 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/TestOraclePrefetch.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestOraclePrefetch.java @@ -80,6 +80,5 @@ public class TestOraclePrefetch extends TestCase { conn.close(); } - dataSource.close(); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/REPLACE_Syntax_Test.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/REPLACE_Syntax_Test.java index 1baf2fa8b6..9c994bb510 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/REPLACE_Syntax_Test.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/REPLACE_Syntax_Test.java @@ -46,7 +46,7 @@ public class REPLACE_Syntax_Test extends TestCase { String text = output(stmtList); - Assert.assertEquals("REPLACE DELAYED INTO `online_users`\nSET `session_id` = '3580cc4e61117c0785372c426eddd11c', `user_id` = 'XXX', `page` = '/', `lastview` = NOW();", + Assert.assertEquals("REPLACE DELAYED INTO `online_users` (`session_id`, `user_id`, `page`, `lastview`)\nVALUES ('3580cc4e61117c0785372c426eddd11c', 'XXX', '/', NOW());", text); }