support sql ast object toString

This commit is contained in:
wenshao
2014-10-26 18:22:07 +08:00
parent 5df5c89405
commit 520da83034
60 changed files with 436 additions and 79 deletions
@@ -115,6 +115,6 @@ public class SQLCreateTableParser extends SQLDDLParser {
}
protected SQLCreateTableStatement newCreateStatement() {
return new SQLCreateTableStatement();
return new SQLCreateTableStatement(getDbType());
}
}
@@ -87,10 +87,18 @@ public class SQLExprParser extends SQLParser {
public SQLExprParser(String sql){
super(sql);
}
public SQLExprParser(String sql, String dbType){
super(sql, dbType);
}
public SQLExprParser(Lexer lexer){
super(lexer);
}
public SQLExprParser(Lexer lexer, String dbType){
super(lexer, dbType);
}
public SQLExpr expr() {
if (lexer.token() == Token.STAR) {
@@ -19,19 +19,34 @@ public class SQLParser {
protected final Lexer lexer;
public SQLParser(String sql){
this(new Lexer(sql));
protected String dbType;
public SQLParser(String sql, String dbType){
this(new Lexer(sql), dbType);
this.lexer.nextToken();
}
public SQLParser(String sql){
this(sql, null);
}
public SQLParser(Lexer lexer){
this(lexer, null);
}
public SQLParser(Lexer lexer, String dbType){
this.lexer = lexer;
this.dbType = dbType;
}
public final Lexer getLexer() {
return lexer;
}
public String getDbType() {
return dbType;
}
protected boolean identifierEquals(String text) {
return lexer.token() == Token.IDENTIFIER && lexer.stringVal().equalsIgnoreCase(text);
}
@@ -143,7 +158,7 @@ public class SQLParser {
alias += ('.' + lexer.token().name());
lexer.nextToken();
}
return alias;
}
@@ -169,7 +184,7 @@ public class SQLParser {
} else if (lexer.token() == Token.USER) {
alias = lexer.stringVal();
lexer.nextToken();
}
}
switch (lexer.token()) {
case KEY:
@@ -184,7 +199,7 @@ public class SQLParser {
return alias;
}
protected void printError(Token token){
protected void printError(Token token) {
String arround;
if (lexer.mark >= 0 && (lexer.text.length() > lexer.mark + 30)) {
if (lexer.mark - 5 > 0) {
@@ -202,7 +217,7 @@ public class SQLParser {
} else {
arround = lexer.text;
}
// throw new
// ParserException("syntax error, error arround:'"+arround+"',expect "
// + token + ", actual " + lexer.token() + " "
@@ -210,7 +225,7 @@ public class SQLParser {
throw new ParserException("syntax error, error in :'" + arround + "',expect " + token + ", actual "
+ lexer.token() + " " + lexer.stringVal());
}
public void accept(Token token) {
if (lexer.token() == token) {
lexer.nextToken();
@@ -223,7 +238,7 @@ public class SQLParser {
public void match(Token token) {
if (lexer.token() != token) {
throw new ParserException("syntax error, expect " + token + ", actual " + lexer.token() + " "
+ lexer.stringVal());
+ lexer.stringVal());
}
}
@@ -90,11 +90,15 @@ public class SQLStatementParser extends SQLParser {
protected int parseValuesSize = 3;
public SQLStatementParser(String sql){
this(new SQLExprParser(sql));
this(sql, null);
}
public SQLStatementParser(String sql, String dbType){
this(new SQLExprParser(sql, dbType));
}
public SQLStatementParser(SQLExprParser exprParser){
super(exprParser.getLexer());
super(exprParser.getLexer(), exprParser.getDbType());
this.exprParser = exprParser;
}
@@ -315,7 +319,7 @@ public class SQLStatementParser extends SQLParser {
lexer.nextToken();
}
SQLRollbackStatement stmt = new SQLRollbackStatement();
SQLRollbackStatement stmt = new SQLRollbackStatement(getDbType());
if (lexer.token() == Token.TO) {
lexer.nextToken();
@@ -339,14 +343,14 @@ public class SQLStatementParser extends SQLParser {
public SQLUseStatement parseUse() {
accept(Token.USE);
SQLUseStatement stmt = new SQLUseStatement();
SQLUseStatement stmt = new SQLUseStatement(getDbType());
stmt.setDatabase(this.exprParser.name());
return stmt;
}
public SQLGrantStatement parseGrant() {
accept(Token.GRANT);
SQLGrantStatement stmt = new SQLGrantStatement();
SQLGrantStatement stmt = new SQLGrantStatement(getDbType());
for (;;) {
String privilege = null;
@@ -619,7 +623,7 @@ public class SQLStatementParser extends SQLParser {
acceptIdentifier("OPTION");
stmt.setAdminOption(true);
}
if (lexer.token() == Token.IDENTIFIED) {
lexer.nextToken();
accept(Token.BY);
@@ -631,7 +635,7 @@ public class SQLStatementParser extends SQLParser {
public SQLStatement parseSavePoint() {
acceptIdentifier("SAVEPOINT");
SQLSavePointStatement stmt = new SQLSavePointStatement();
SQLSavePointStatement stmt = new SQLSavePointStatement(getDbType());
stmt.setName(this.exprParser.name());
return stmt;
}
@@ -639,7 +643,7 @@ public class SQLStatementParser extends SQLParser {
public SQLStatement parseReleaseSavePoint() {
acceptIdentifier("RELEASE");
acceptIdentifier("SAVEPOINT");
SQLReleaseSavePointStatement stmt = new SQLReleaseSavePointStatement();
SQLReleaseSavePointStatement stmt = new SQLReleaseSavePointStatement(getDbType());
stmt.setName(this.exprParser.name());
return stmt;
}
@@ -752,7 +756,7 @@ public class SQLStatementParser extends SQLParser {
accept(Token.DROP);
}
SQLDropTableStatement stmt = new SQLDropTableStatement();
SQLDropTableStatement stmt = new SQLDropTableStatement(getDbType());
if (identifierEquals("TEMPORARY")) {
lexer.nextToken();
@@ -816,7 +820,7 @@ public class SQLStatementParser extends SQLParser {
SQLName name = this.exprParser.name();
SQLDropSequenceStatement stmt = new SQLDropSequenceStatement();
SQLDropSequenceStatement stmt = new SQLDropSequenceStatement(getDbType());
stmt.setName(name);
return stmt;
}
@@ -830,7 +834,7 @@ public class SQLStatementParser extends SQLParser {
SQLName name = this.exprParser.name();
SQLDropTriggerStatement stmt = new SQLDropTriggerStatement();
SQLDropTriggerStatement stmt = new SQLDropTriggerStatement(getDbType());
stmt.setName(name);
return stmt;
}
@@ -840,7 +844,7 @@ public class SQLStatementParser extends SQLParser {
accept(Token.DROP);
}
SQLDropViewStatement stmt = new SQLDropViewStatement();
SQLDropViewStatement stmt = new SQLDropViewStatement(getDbType());
accept(Token.VIEW);
@@ -881,7 +885,7 @@ public class SQLStatementParser extends SQLParser {
accept(Token.DROP);
}
SQLDropDatabaseStatement stmt = new SQLDropDatabaseStatement();
SQLDropDatabaseStatement stmt = new SQLDropDatabaseStatement(getDbType());
accept(Token.DATABASE);
@@ -896,67 +900,67 @@ public class SQLStatementParser extends SQLParser {
return stmt;
}
protected SQLDropFunctionStatement parseDropFunction(boolean acceptDrop) {
if (acceptDrop) {
accept(Token.DROP);
}
SQLDropFunctionStatement stmt = new SQLDropFunctionStatement();
SQLDropFunctionStatement stmt = new SQLDropFunctionStatement(getDbType());
accept(Token.FUNCTION);
if (lexer.token() == Token.IF) {
lexer.nextToken();
accept(Token.EXISTS);
stmt.setIfExists(true);
}
SQLName name = this.exprParser.name();
stmt.setName(name);
return stmt;
}
protected SQLDropTableSpaceStatement parseDropTablespace(boolean acceptDrop) {
if (acceptDrop) {
accept(Token.DROP);
}
SQLDropTableSpaceStatement stmt = new SQLDropTableSpaceStatement();
SQLDropTableSpaceStatement stmt = new SQLDropTableSpaceStatement(getDbType());
accept(Token.TABLESPACE);
if (lexer.token() == Token.IF) {
lexer.nextToken();
accept(Token.EXISTS);
stmt.setIfExists(true);
}
SQLName name = this.exprParser.name();
stmt.setName(name);
return stmt;
}
protected SQLDropProcedureStatement parseDropProcedure(boolean acceptDrop) {
if (acceptDrop) {
accept(Token.DROP);
}
SQLDropProcedureStatement stmt = new SQLDropProcedureStatement();
SQLDropProcedureStatement stmt = new SQLDropProcedureStatement(getDbType());
accept(Token.PROCEDURE);
if (lexer.token() == Token.IF) {
lexer.nextToken();
accept(Token.EXISTS);
stmt.setIfExists(true);
}
SQLName name = this.exprParser.name();
stmt.setName(name);
return stmt;
}
@@ -965,7 +969,7 @@ public class SQLStatementParser extends SQLParser {
if (lexer.token() == Token.TABLE) {
lexer.nextToken();
}
SQLTruncateStatement stmt = new SQLTruncateStatement();
SQLTruncateStatement stmt = new SQLTruncateStatement(getDbType());
if (lexer.token() == Token.ONLY) {
lexer.nextToken();
@@ -1090,7 +1094,7 @@ public class SQLStatementParser extends SQLParser {
public SQLDropUserStatement parseDropUser() {
accept(Token.USER);
SQLDropUserStatement stmt = new SQLDropUserStatement();
SQLDropUserStatement stmt = new SQLDropUserStatement(getDbType());
for (;;) {
SQLExpr expr = this.exprParser.expr();
stmt.getUsers().add(expr);
@@ -1106,7 +1110,7 @@ public class SQLStatementParser extends SQLParser {
public SQLStatement parseDropIndex() {
accept(Token.INDEX);
SQLDropIndexStatement stmt = new SQLDropIndexStatement();
SQLDropIndexStatement stmt = new SQLDropIndexStatement(getDbType());
stmt.setIndexName(this.exprParser.name());
if (lexer.token() == Token.ON) {
@@ -1123,9 +1127,9 @@ public class SQLStatementParser extends SQLParser {
lexer.nextToken();
brace = true;
}
SQLCallStatement stmt = new SQLCallStatement();
SQLCallStatement stmt = new SQLCallStatement(getDbType());
if (lexer.token() == Token.QUES) {
lexer.nextToken();
accept(Token.EQ);
@@ -1134,7 +1138,6 @@ public class SQLStatementParser extends SQLParser {
acceptIdentifier("CALL");
stmt.setProcedureName(exprParser.name());
if (lexer.token() == Token.LPAREN) {
@@ -1153,7 +1156,7 @@ public class SQLStatementParser extends SQLParser {
public SQLStatement parseSet() {
accept(Token.SET);
SQLSetStatement stmt = new SQLSetStatement();
SQLSetStatement stmt = new SQLSetStatement(getDbType());
parseAssignItems(stmt.getItems(), stmt);
@@ -1231,7 +1234,7 @@ public class SQLStatementParser extends SQLParser {
public SQLStatement parseCreateTrigger() {
accept(Token.TRIGGER);
SQLCreateTriggerStatement stmt = new SQLCreateTriggerStatement();
SQLCreateTriggerStatement stmt = new SQLCreateTriggerStatement(getDbType());
stmt.setName(this.exprParser.name());
if (identifierEquals("BEFORE")) {
@@ -1293,7 +1296,7 @@ public class SQLStatementParser extends SQLParser {
accept(Token.DATABASE);
SQLCreateDatabaseStatement stmt = new SQLCreateDatabaseStatement();
SQLCreateDatabaseStatement stmt = new SQLCreateDatabaseStatement(getDbType());
stmt.setName(this.exprParser.name());
return stmt;
}
@@ -1311,7 +1314,7 @@ public class SQLStatementParser extends SQLParser {
accept(Token.CREATE);
}
SQLCreateIndexStatement stmt = new SQLCreateIndexStatement();
SQLCreateIndexStatement stmt = new SQLCreateIndexStatement(getDbType());
if (lexer.token() == Token.UNIQUE) {
lexer.nextToken();
if (identifierEquals("CLUSTERED")) {
@@ -1415,11 +1418,11 @@ public class SQLStatementParser extends SQLParser {
}
protected SQLUpdateStatement createUpdateStatement() {
return new SQLUpdateStatement();
return new SQLUpdateStatement(getDbType());
}
public SQLDeleteStatement parseDeleteStatement() {
SQLDeleteStatement deleteStatement = new SQLDeleteStatement();
SQLDeleteStatement deleteStatement = new SQLDeleteStatement(getDbType());
if (lexer.token() == Token.DELETE) {
lexer.nextToken();
@@ -1452,7 +1455,7 @@ public class SQLStatementParser extends SQLParser {
}
public SQLCreateViewStatement parseCreateView() {
SQLCreateViewStatement createView = new SQLCreateViewStatement();
SQLCreateViewStatement createView = new SQLCreateViewStatement(getDbType());
if (lexer.token() == Token.CREATE) {
lexer.nextToken();
@@ -1534,10 +1537,10 @@ public class SQLStatementParser extends SQLParser {
if (lexer.token() == Token.FOR) {
lexer.nextToken();
}
SQLExplainStatement explain = new SQLExplainStatement();
if(lexer.token == Token.HINT) {
SQLExplainStatement explain = new SQLExplainStatement(getDbType());
if (lexer.token == Token.HINT) {
explain.setHints(this.exprParser.parseHints());
}
@@ -1579,7 +1582,6 @@ public class SQLStatementParser extends SQLParser {
return item;
}
public boolean isParseCompleteValues() {
return parseCompleteValues;
}