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..873d90ebfd 100644 --- a/src/main/java/com/alibaba/druid/common/jdbc/StatementBase.java +++ b/src/main/java/com/alibaba/druid/common/jdbc/StatementBase.java @@ -198,11 +198,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 +211,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/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/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index 7eddaa5a79..33505e2cc2 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 @@ -79,10 +79,6 @@ public class OracleSelectParser extends SQLSelectParser { super(exprParser); } - protected OracleExprParser createExprParser() { - return new OracleExprParser(lexer); - } - public OracleSelect select() { OracleSelect select = new OracleSelect(); @@ -92,11 +88,11 @@ public class OracleSelectParser extends SQLSelectParser { SubqueryFactoringClause subqueryFactoringClause = new SubqueryFactoringClause(); for (;;) { SubqueryFactoringClause.Entry entry = new SubqueryFactoringClause.Entry(); - entry.setName((SQLIdentifierExpr) createExprParser().name()); + entry.setName((SQLIdentifierExpr) this.exprParser.name()); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - createExprParser().names(entry.getColumns()); + exprParser.names(entry.getColumns()); accept(Token.RPAREN); } @@ -119,16 +115,16 @@ public class OracleSelectParser extends SQLSelectParser { acceptIdentifier("FIRST"); accept(Token.BY); - searchClause.getItems().add((OracleOrderByItem) createExprParser().parseSelectOrderByItem()); + searchClause.getItems().add((OracleOrderByItem) exprParser.parseSelectOrderByItem()); while (lexer.token() == (Token.COMMA)) { lexer.nextToken(); - searchClause.getItems().add((OracleOrderByItem) createExprParser().parseSelectOrderByItem()); + searchClause.getItems().add((OracleOrderByItem) exprParser.parseSelectOrderByItem()); } accept(Token.SET); - searchClause.setOrderingColumn((SQLIdentifierExpr) createExprParser().name()); + searchClause.setOrderingColumn((SQLIdentifierExpr) exprParser.name()); entry.setSearchClause(searchClause); } @@ -136,13 +132,13 @@ public class OracleSelectParser extends SQLSelectParser { if (identifierEquals("CYCLE")) { lexer.nextToken(); CycleClause cycleClause = new CycleClause(); - createExprParser().exprList(cycleClause.getAliases()); + exprParser.exprList(cycleClause.getAliases()); accept(Token.SET); - cycleClause.setMark(createExprParser().expr()); + cycleClause.setMark(exprParser.expr()); acceptIdentifier("TO"); - cycleClause.setValue(createExprParser().expr()); + cycleClause.setValue(exprParser.expr()); accept(Token.DEFAULT); - cycleClause.setDefaultValue(createExprParser().expr()); + cycleClause.setDefaultValue(exprParser.expr()); entry.setCycleClause(cycleClause); } @@ -170,7 +166,7 @@ public class OracleSelectParser extends SQLSelectParser { if (lexer.token() == Token.OF) { lexer.nextToken(); - this.createExprParser().exprList(forUpdate.getOf()); + this.exprParser.exprList(forUpdate.getOf()); } if (lexer.token() == Token.NOWAIT) { @@ -178,7 +174,7 @@ public class OracleSelectParser extends SQLSelectParser { forUpdate.setNotWait(true); } else if (lexer.token() == Token.WAIT) { lexer.nextToken(); - forUpdate.setWait(this.createExprParser().primary()); + forUpdate.setWait(this.exprParser.primary()); } else if (identifierEquals("SKIP")) { lexer.nextToken(); acceptIdentifier("LOCKED"); @@ -189,7 +185,7 @@ public class OracleSelectParser extends SQLSelectParser { } if (select.getOrderBy() == null) { - select.setOrderBy(this.createExprParser().parseOrderBy()); + select.setOrderBy(this.exprParser.parseOrderBy()); } if (lexer.token() == Token.WITH) { @@ -255,7 +251,7 @@ public class OracleSelectParser extends SQLSelectParser { lexer.nextToken(); } - this.createExprParser().parseHints(queryBlock.getHints()); + this.exprParser.parseHints(queryBlock.getHints()); parseSelectList(queryBlock); } @@ -504,7 +500,7 @@ public class OracleSelectParser extends SQLSelectParser { cellAssignment.setMeasureColumn(expr()); accept(Token.LBRACKET); - this.createExprParser().exprList(cellAssignment.getConditions()); + this.exprParser.exprList(cellAssignment.getConditions()); accept(Token.RBRACKET); return cellAssignment; @@ -518,10 +514,10 @@ public class OracleSelectParser extends SQLSelectParser { accept(Token.BY); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - createExprParser().exprList(queryPartitionClause.getExprList()); + exprParser.exprList(queryPartitionClause.getExprList()); accept(Token.RPAREN); } else { - createExprParser().exprList(queryPartitionClause.getExprList()); + exprParser.exprList(queryPartitionClause.getExprList()); } modelColumnClause.setQueryPartitionClause(queryPartitionClause); } @@ -567,11 +563,11 @@ public class OracleSelectParser extends SQLSelectParser { lexer.nextToken(); acceptIdentifier("SETS"); accept(Token.LPAREN); - createExprParser().exprList(groupingSet.getParameters()); + exprParser.exprList(groupingSet.getParameters()); accept(Token.RPAREN); groupBy.getItems().add(groupingSet); } else { - groupBy.getItems().add(this.createExprParser().expr()); + groupBy.getItems().add(this.exprParser.expr()); } if (!(lexer.token() == (Token.COMMA))) { @@ -584,7 +580,7 @@ public class OracleSelectParser extends SQLSelectParser { if (lexer.token() == (Token.HAVING)) { lexer.nextToken(); - groupBy.setHaving(this.createExprParser().expr()); + groupBy.setHaving(this.exprParser.expr()); } queryBlock.setGroupBy(groupBy); @@ -592,7 +588,7 @@ public class OracleSelectParser extends SQLSelectParser { lexer.nextToken(); SQLSelectGroupByClause groupBy = new SQLSelectGroupByClause(); - groupBy.setHaving(this.createExprParser().expr()); + groupBy.setHaving(this.exprParser.expr()); if (lexer.token() == (Token.GROUP)) { lexer.nextToken(); @@ -604,11 +600,11 @@ public class OracleSelectParser extends SQLSelectParser { lexer.nextToken(); acceptIdentifier("SETS"); accept(Token.LPAREN); - createExprParser().exprList(groupingSet.getParameters()); + exprParser.exprList(groupingSet.getParameters()); accept(Token.RPAREN); groupBy.getItems().add(groupingSet); } else { - groupBy.getItems().add(this.createExprParser().expr()); + groupBy.getItems().add(this.exprParser.expr()); } if (!(lexer.token() == (Token.COMMA))) { @@ -647,7 +643,7 @@ public class OracleSelectParser extends SQLSelectParser { if (identifierEquals("NOCYCLE")) { hierachical.setNoCycle(true); } - hierachical.setConnectBy(this.createExprParser().expr()); + hierachical.setConnectBy(this.exprParser.expr()); } if (lexer.token() == Token.START) { @@ -657,7 +653,7 @@ public class OracleSelectParser extends SQLSelectParser { } accept(Token.WITH); - hierachical.setStartWith(this.createExprParser().expr()); + hierachical.setStartWith(this.exprParser.expr()); } if (lexer.token() == Token.CONNECT) { @@ -676,7 +672,7 @@ public class OracleSelectParser extends SQLSelectParser { if (identifierEquals("NOCYCLE")) { hierachical.setNoCycle(true); } - hierachical.setConnectBy(this.createExprParser().expr()); + hierachical.setConnectBy(this.exprParser.expr()); } if (hierachical != null) { @@ -723,7 +719,7 @@ public class OracleSelectParser extends SQLSelectParser { } private void parseTableSourceQueryTableExpr(OracleSelectTableReference tableReference) { - tableReference.setExpr(this.createExprParser().expr()); + tableReference.setExpr(this.exprParser.expr()); { FlashbackQueryClause clause = flashback(); @@ -741,7 +737,7 @@ public class OracleSelectParser extends SQLSelectParser { } accept(Token.LPAREN); - this.createExprParser().exprList(sample.getPercent()); + this.exprParser.exprList(sample.getPercent()); accept(Token.RPAREN); if (identifierEquals("SEED")) { @@ -760,12 +756,12 @@ public class OracleSelectParser extends SQLSelectParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - partition.setPartition(createExprParser().name()); + partition.setPartition(exprParser.name()); accept(Token.RPAREN); } else { accept(Token.FOR); accept(Token.LPAREN); - createExprParser().names(partition.getFor()); + exprParser.names(partition.getFor()); accept(Token.RPAREN); } @@ -779,12 +775,12 @@ public class OracleSelectParser extends SQLSelectParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - partition.setPartition(createExprParser().name()); + partition.setPartition(exprParser.name()); accept(Token.RPAREN); } else { accept(Token.FOR); accept(Token.LPAREN); - createExprParser().names(partition.getFor()); + exprParser.names(partition.getFor()); accept(Token.RPAREN); } @@ -806,7 +802,7 @@ public class OracleSelectParser extends SQLSelectParser { clause.setType(AsOfFlashbackQueryClause.Type.TIMESTAMP); } - SQLBinaryOpExpr binaryExpr = (SQLBinaryOpExpr) createExprParser().expr(); + SQLBinaryOpExpr binaryExpr = (SQLBinaryOpExpr) exprParser.expr(); if (binaryExpr.getOperator() != SQLBinaryOperator.BooleanAnd) { throw new SQLParseException("syntax error : " + binaryExpr.getOperator()); } @@ -834,7 +830,7 @@ public class OracleSelectParser extends SQLSelectParser { AsOfFlashbackQueryClause clause = new AsOfFlashbackQueryClause(); clause.setType(AsOfFlashbackQueryClause.Type.SCN); lexer.nextToken(); - clause.setExpr(createExprParser().expr()); + clause.setExpr(exprParser.expr()); return clause; } else if (identifierEquals("SNAPSHOT")) { @@ -849,7 +845,7 @@ public class OracleSelectParser extends SQLSelectParser { AsOfFlashbackQueryClause clause = new AsOfFlashbackQueryClause(); acceptIdentifier("TIMESTAMP"); clause.setType(AsOfFlashbackQueryClause.Type.TIMESTAMP); - clause.setExpr(createExprParser().expr()); + clause.setExpr(exprParser.expr()); return clause; } @@ -875,7 +871,7 @@ public class OracleSelectParser extends SQLSelectParser { } if (lexer.token() == Token.HINT) { - this.createExprParser().parseHints(tableSource.getHints()); + this.exprParser.parseHints(tableSource.getHints()); } OracleSelectJoin.JoinType joinType = null; @@ -936,11 +932,11 @@ public class OracleSelectParser extends SQLSelectParser { if (lexer.token() == Token.ON) { lexer.nextToken(); - join.setCondition(this.createExprParser().expr()); + join.setCondition(this.exprParser.expr()); } else if (lexer.token() == Token.USING) { lexer.nextToken(); accept(Token.LPAREN); - this.createExprParser().exprList(join.getUsing()); + this.exprParser.exprList(join.getUsing()); accept(Token.RPAREN); } @@ -965,7 +961,7 @@ public class OracleSelectParser extends SQLSelectParser { accept(Token.LPAREN); while (true) { item = new OracleSelectPivot.Item(); - item.setExpr((OracleAggregateExpr) this.createExprParser().expr()); + item.setExpr((OracleAggregateExpr) this.exprParser.expr()); item.setAlias(as()); pivot.getItems().add(item); @@ -1003,7 +999,7 @@ public class OracleSelectParser extends SQLSelectParser { for (;;) { item = new OracleSelectPivot.Item(); - item.setExpr(this.createExprParser().expr()); + item.setExpr(this.exprParser.expr()); item.setAlias(as()); pivot.getPivotIn().add(item); @@ -1037,10 +1033,10 @@ public class OracleSelectParser extends SQLSelectParser { if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); - this.createExprParser().exprList(unPivot.getItems()); + this.exprParser.exprList(unPivot.getItems()); accept(Token.RPAREN); } else { - unPivot.getItems().add(this.createExprParser().expr()); + unPivot.getItems().add(this.exprParser.expr()); } accept(Token.FOR); @@ -1073,7 +1069,7 @@ public class OracleSelectParser extends SQLSelectParser { for (;;) { item = new OracleSelectPivot.Item(); - item.setExpr(this.createExprParser().expr()); + item.setExpr(this.exprParser.expr()); item.setAlias(as()); unPivot.getPivotIn().add(item); @@ -1111,6 +1107,6 @@ public class OracleSelectParser extends SQLSelectParser { } private void parseHints(OracleSelectQueryBlock queryBlock) { - this.createExprParser().parseHints(queryBlock.getHints()); + this.exprParser.parseHints(queryBlock.getHints()); } } 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/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/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 {