From 1ba072bb29fb5fd10e8f4518dc8d6bd1f238320f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Wed, 16 May 2012 20:05:22 +0800 Subject: [PATCH] mysql parser ddl support --- .../mysql/parser/MySqlStatementParser.java | 27 +++++++++++++++++++ .../mysql/visitor/MySqlOutputVisitor.java | 2 +- .../oracle/parser/OracleExprParser.java | 6 ++--- .../dialect/oracle/parser/OracleLexer.java | 1 - .../oracle/parser/OracleSelectParser.java | 2 +- .../oracle/parser/OracleStatementParser.java | 8 +++--- .../com/alibaba/druid/sql/parser/Token.java | 1 - 7 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index e768de0633..960f1be52d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -54,6 +54,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplicateStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlResetStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRollbackStatement; @@ -1970,4 +1971,30 @@ public class MySqlStatementParser extends SQLStatementParser { } throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } + + public SQLStatement parseRename() { + MySqlRenameTableStatement stmt = new MySqlRenameTableStatement(); + + acceptIdentifier("RENAME"); + + accept(Token.TABLE); + + for (;;) { + MySqlRenameTableStatement.Item item = new MySqlRenameTableStatement.Item(); + item.setName(this.exprParser.name()); + acceptIdentifier("TO"); + item.setTo(this.exprParser.name()); + + stmt.getItems().add(item); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + + break; + } + + return stmt; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index b322f3dcd5..0d82d52c3c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -2265,7 +2265,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public boolean visit(MySqlRenameTableStatement x) { - print("RENAME "); + print("RENAME TABLE "); printAndAccept(x.getItems(), ", "); return false; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index b22a80e481..44c5943db2 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -381,7 +381,7 @@ public class OracleExprParser extends SQLExprParser { accept(Token.RPAREN); } - accept(Token.TO); + identifierEquals("TO"); if (identifierEquals("SECOND")) { lexer.nextToken(); interval.setToType(OracleIntervalType.SECOND); @@ -702,8 +702,8 @@ public class OracleExprParser extends SQLExprParser { accept(Token.RPAREN); } - if (lexer.token() == Token.TO) { - accept(Token.TO); + if (identifierEquals("TO")) { + lexer.nextToken(); if (identifierEquals("SECOND")) { lexer.nextToken(); interval.setToType(OracleIntervalType.SECOND); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java index 632866eace..68bd59770c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java @@ -98,7 +98,6 @@ public class OracleLexer extends Lexer { map.put("CURSOR", Token.CURSOR); - map.put("TO", Token.TO); map.put("MODEL", Token.MODEL); map.put("MERGE", Token.MERGE); map.put("USING", Token.USING); 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 55a6bda4c7..3c3cdc8fc7 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 @@ -140,7 +140,7 @@ public class OracleSelectParser extends SQLSelectParser { createExprParser().exprList(cycleClause.getAliases()); accept(Token.SET); cycleClause.setMark(createExprParser().expr()); - accept(Token.TO); + acceptIdentifier("TO"); cycleClause.setValue(createExprParser().expr()); accept(Token.DEFAULT); cycleClause.setDefaultValue(createExprParser().expr()); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index fbc63e2522..8fcf028c39 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -388,7 +388,7 @@ public class OracleStatementParser extends SQLStatementParser { OracleRollbackStatement stmt = new OracleRollbackStatement(); - if (lexer.token() == Token.TO) { + if (identifierEquals("TO")) { lexer.nextToken(); stmt.setTo(this.exprParser.name()); } @@ -402,7 +402,7 @@ public class OracleStatementParser extends SQLStatementParser { OracleSavePointStatement stmt = new OracleSavePointStatement(); - if (lexer.token() == Token.TO) { + if (identifierEquals("TO")) { lexer.nextToken(); stmt.setTo(this.exprParser.name()); } @@ -640,7 +640,7 @@ public class OracleStatementParser extends SQLStatementParser { if (identifierEquals("RENAME")) { lexer.nextToken(); - accept(Token.TO); + acceptIdentifier("TO"); stmt.setRenameTo(this.exprParser.name()); } @@ -915,7 +915,7 @@ public class OracleStatementParser extends SQLStatementParser { private OracleAlterTableItem parseAlterTableRename() { acceptIdentifier("RENAME"); - if (lexer.token() == Token.TO) { + if (identifierEquals("TO")) { lexer.nextToken(); OracleAlterTableRenameTo item = new OracleAlterTableRenameTo(); item.setTo(this.exprParser.name()); 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 b2d3bc520a..acb4bd8bb5 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -139,7 +139,6 @@ public enum Token { WITH("WITH"), EXTRACT("EXTRACT"), CURSOR("CURSOR"), - TO("TO"), MODEL("MODEL"), MERGE("MERGE"), MATCHED("MATCHED"),