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 351e7ca8f1..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 @@ -198,11 +206,7 @@ public abstract class StatementBase implements Statement { @SuppressWarnings("unchecked") @Override public T unwrap(Class iface) throws SQLException { - if (iface == null) { - return null; - } - - if (iface.isInstance(this)) { + if (isWrapperFor(iface)) { return (T) this; } @@ -215,7 +219,7 @@ public abstract class StatementBase implements Statement { return false; } - if (iface.isInstance(this)) { + if (iface == this.getClass() || iface.isInstance(this)) { return true; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveCreateTableParser.java index 52116b6843..76d309855a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveCreateTableParser.java @@ -24,7 +24,7 @@ public class HiveCreateTableParser extends SQLCreateTableParser { public SQLCreateTableStatement parseCrateTable(boolean acceptCreate) { HiveCreateTableStatement stmt = (HiveCreateTableStatement) super.parseCrateTable(acceptCreate); - if (lexer.token() == Token.PARTITIONED) { + if (identifierEquals("PARTITIONED")) { lexer.nextToken(); accept(Token.BY); accept(Token.LPAREN); 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/hive/parser/HiveLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveLexer.java index 73fddd3ecf..ee74a8ec4e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveLexer.java @@ -83,9 +83,6 @@ public class HiveLexer extends Lexer { map.put("ANY", Token.ANY); map.put("WITH", Token.WITH); - map.put("PARTITIONED", Token.PARTITIONED); - map.put("SHOW", Token.SHOW); - map.put("TABLES", Token.TABLES); DEFAULT_SQL_SERVER_KEYWORDS = new Keywords(map); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveStatementParser.java index fa7da28e04..80a60873a8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/hive/parser/HiveStatementParser.java @@ -25,10 +25,10 @@ public class HiveStatementParser extends SQLStatementParser { } public boolean parseStatementListDialect(List statementList) { - if (lexer.token() == Token.SHOW) { + if (identifierEquals("SHOW")) { lexer.nextToken(); - if (lexer.token() == Token.TABLES) { + if (identifierEquals("TABLES")) { lexer.nextToken(); HiveShowTablesStatement stmt = new HiveShowTablesStatement(); @@ -41,7 +41,7 @@ public class HiveStatementParser extends SQLStatementParser { return true; } - throw new ParserException("TODO " + lexer.token()); + throw new ParserException("TODO " + lexer.info()); } return false; } 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/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index 99ec0915d0..e0804ab0b2 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -185,6 +185,10 @@ public class Lexer { public final Token token() { return token; } + + public String info() { + return this.token + " " + this.stringVal(); + } public final void nextToken() { sp = 0; 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/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java index 3173dfb66a..1569f27b38 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -167,9 +167,6 @@ public enum Token { TOP("TOP"), // hive - PARTITIONED("PARTITIONED"), - SHOW("SHOW"), - TABLES("TABLES"), EOF, ERROR, diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_happyday517.java b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_happyday517.java index 8ae1f37dd0..868f8bd9d6 100644 --- a/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_happyday517.java +++ b/src/test/java/com/alibaba/druid/bvt/bug/Bug_for_happyday517.java @@ -8,6 +8,7 @@ import junit.framework.Assert; import junit.framework.TestCase; import com.alibaba.druid.mock.MockDriver; +import com.alibaba.druid.mock.MockPreparedStatement; import com.alibaba.druid.mock.MockStatement; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.stat.DruidDataSourceStatManager; @@ -68,7 +69,7 @@ public class Bug_for_happyday517 extends TestCase { String sql = "select 1"; Statement stmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); - MockStatement mockStmt = stmt.unwrap(MockStatement.class); + MockPreparedStatement mockStmt = stmt.unwrap(MockPreparedStatement.class); Assert.assertEquals(ResultSet.TYPE_SCROLL_SENSITIVE, mockStmt.getResultSetType()); Assert.assertEquals(ResultSet.CONCUR_UPDATABLE, mockStmt.getResultSetConcurrency()); @@ -85,7 +86,7 @@ public class Bug_for_happyday517 extends TestCase { Statement stmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE, ResultSet.CLOSE_CURSORS_AT_COMMIT); - MockStatement mockStmt = stmt.unwrap(MockStatement.class); + MockPreparedStatement mockStmt = stmt.unwrap(MockPreparedStatement.class); Assert.assertEquals(ResultSet.TYPE_SCROLL_SENSITIVE, mockStmt.getResultSetType()); Assert.assertEquals(ResultSet.CONCUR_UPDATABLE, mockStmt.getResultSetConcurrency()); @@ -102,7 +103,7 @@ public class Bug_for_happyday517 extends TestCase { String sql = "select 1"; Statement stmt = conn.prepareCall(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); - MockStatement mockStmt = stmt.unwrap(MockStatement.class); + Statement mockStmt = stmt.unwrap(Statement.class); Assert.assertEquals(ResultSet.TYPE_SCROLL_SENSITIVE, mockStmt.getResultSetType()); Assert.assertEquals(ResultSet.CONCUR_UPDATABLE, mockStmt.getResultSetConcurrency()); @@ -119,7 +120,7 @@ public class Bug_for_happyday517 extends TestCase { Statement stmt = conn.prepareCall(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE, ResultSet.CLOSE_CURSORS_AT_COMMIT); - MockStatement mockStmt = stmt.unwrap(MockStatement.class); + Statement mockStmt = stmt.unwrap(Statement.class); Assert.assertEquals(ResultSet.TYPE_SCROLL_SENSITIVE, mockStmt.getResultSetType()); Assert.assertEquals(ResultSet.CONCUR_UPDATABLE, mockStmt.getResultSetConcurrency()); 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/hive/HiveShowTableTest.java b/src/test/java/com/alibaba/druid/bvt/sql/hive/HiveShowTableTest.java index 8a41f2df08..f4e06c9143 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/hive/HiveShowTableTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/hive/HiveShowTableTest.java @@ -8,7 +8,6 @@ import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.dialect.hive.parser.HiveStatementParser; import com.alibaba.druid.sql.dialect.hive.visitor.HiveSchemaStatVisitor; import com.alibaba.druid.sql.hive.HiveTest; -import com.alibaba.druid.stat.TableStat; public class HiveShowTableTest extends HiveTest {