sql parser refactor

This commit is contained in:
温少
2012-05-20 15:06:01 +08:00
9 changed files with 58 additions and 68 deletions
@@ -198,11 +198,7 @@ public abstract class StatementBase implements Statement {
@SuppressWarnings("unchecked")
@Override
public <T> T unwrap(Class<T> 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;
}
@@ -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);
@@ -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);
}
@@ -25,10 +25,10 @@ public class HiveStatementParser extends SQLStatementParser {
}
public boolean parseStatementListDialect(List<SQLStatement> 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;
}
@@ -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());
}
}
@@ -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;
@@ -167,9 +167,6 @@ public enum Token {
TOP("TOP"),
// hive
PARTITIONED("PARTITIONED"),
SHOW("SHOW"),
TABLES("TABLES"),
EOF,
ERROR,
@@ -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());
@@ -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 {