This commit is contained in:
温少
2012-03-18 21:02:41 +08:00
parent 4931dfd625
commit 192f7322c4
10 changed files with 154 additions and 48 deletions
@@ -57,7 +57,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatem
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLExprParser;
import com.alibaba.druid.sql.parser.SQLSelectParser;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.sql.parser.Token;
@@ -67,16 +66,12 @@ public class MySqlStatementParser extends SQLStatementParser {
public MySqlStatementParser(String sql) throws ParserException{
this(new MySqlLexer(sql));
this.lexer.nextToken();
this.exprParser = this.createExprParser();
this.exprParser = new MySqlExprParser(lexer);
}
public MySqlStatementParser(Lexer lexer){
super(lexer);
this.exprParser = this.createExprParser();
}
protected SQLExprParser createExprParser() {
return new MySqlExprParser(lexer);
this.exprParser = new MySqlExprParser(lexer);
}
public SQLCreateTableStatement parseCreateTable() throws ParserException {
@@ -179,11 +174,11 @@ public class MySqlStatementParser extends SQLStatementParser {
for (;;) {
MySqlCreateUserStatement.UserSpecification userSpec = new MySqlCreateUserStatement.UserSpecification();
SQLCharExpr expr = (SQLCharExpr) this.createExprParser().expr();
SQLCharExpr expr = (SQLCharExpr) exprParser.expr();
String user = expr.toString();
if (lexer.token() == Token.VARIANT) {
lexer.nextToken();
SQLCharExpr expr2 = (SQLCharExpr) this.createExprParser().expr();
SQLCharExpr expr2 = (SQLCharExpr) exprParser.expr();
user += '@';
user += expr2.toString();
}
@@ -198,12 +193,12 @@ public class MySqlStatementParser extends SQLStatementParser {
lexer.nextToken();
}
SQLCharExpr password = (SQLCharExpr) this.createExprParser().expr();
SQLCharExpr password = (SQLCharExpr) this.exprParser.expr();
userSpec.setPassword(password);
} else if (lexer.token() == Token.WITH) {
lexer.nextToken();
SQLCharExpr text = (SQLCharExpr) this.createExprParser().expr();
SQLCharExpr text = (SQLCharExpr) this.exprParser.expr();
userSpec.setAuthPlugin(text);
}
}
@@ -346,7 +341,7 @@ public class MySqlStatementParser extends SQLStatementParser {
statementList.add(stmt);
return true;
}
if (identifierEquals("DESCRIBE")) {
SQLStatement stmt = parseDescribe();
statementList.add(stmt);
@@ -355,13 +350,13 @@ public class MySqlStatementParser extends SQLStatementParser {
return false;
}
public SQLStatement parseDescribe() throws ParserException {
acceptIdentifier("DESCRIBE");
MySqlDescribeStatement stmt = new MySqlDescribeStatement();
stmt.setObject(this.exprParser.name());
return stmt;
}
@@ -487,15 +482,15 @@ public class MySqlStatementParser extends SQLStatementParser {
MySqlSelectQueryBlock.Limit limit = new MySqlSelectQueryBlock.Limit();
SQLExpr temp = this.createExprParser().expr();
SQLExpr temp = this.exprParser.expr();
if (lexer.token() == (Token.COMMA)) {
limit.setOffset(temp);
lexer.nextToken();
limit.setRowCount(createExprParser().expr());
limit.setRowCount(exprParser.expr());
} else if (identifierEquals("OFFSET")) {
limit.setRowCount(temp);
lexer.nextToken();
limit.setOffset(createExprParser().expr());
limit.setOffset(exprParser.expr());
} else {
limit.setRowCount(temp);
}
@@ -991,11 +986,11 @@ public class MySqlStatementParser extends SQLStatementParser {
MySqlDropUser stmt = new MySqlDropUser();
for (;;) {
SQLCharExpr expr = (SQLCharExpr) this.createExprParser().expr();
SQLCharExpr expr = (SQLCharExpr) this.exprParser.expr();
String user = expr.toString();
if (lexer.token() == Token.VARIANT) {
lexer.nextToken();
SQLCharExpr expr2 = (SQLCharExpr) this.createExprParser().expr();
SQLCharExpr expr2 = (SQLCharExpr) this.exprParser.expr();
user += '@';
user += expr2.toString();
}
@@ -1035,7 +1030,7 @@ public class MySqlStatementParser extends SQLStatementParser {
}
return stmt;
}
public SQLSelectParser createSQLSelectParser() {
return new MySqlSelectParser(this.lexer);
}
@@ -102,16 +102,21 @@ public class OracleStatementParser extends SQLStatementParser {
public OracleStatementParser(String sql){
super(new OracleLexer(sql));
this.lexer.nextToken();
this.exprParser = createExprParser();
this.exprParser = new OracleExprParser(lexer);
}
public OracleStatementParser(Lexer lexer){
super(lexer);
this.exprParser = createExprParser();
this.exprParser = new OracleExprParser(lexer);
}
protected OracleExprParser createExprParser() {
return new OracleExprParser(lexer);
@Override
public OracleExprParser getExprParser() {
return (OracleExprParser) exprParser;
}
public void parseHints(List<OracleHint> hints) {
this.getExprParser().parseHints(hints);
}
public OracleCreateTableParser getSQLCreateTableParser() {
@@ -121,10 +126,10 @@ public class OracleStatementParser extends SQLStatementParser {
protected void parseInsert0_hinits(SQLInsertInto insertStatement) {
if (insertStatement instanceof OracleInsertStatement) {
OracleInsertStatement stmt = (OracleInsertStatement) insertStatement;
this.createExprParser().parseHints(stmt.getHints());
this.getExprParser().parseHints(stmt.getHints());
} else {
List<OracleHint> hints = new ArrayList<OracleHint>();
this.createExprParser().parseHints(hints);
this.getExprParser().parseHints(hints);
}
}
@@ -1124,8 +1129,7 @@ public class OracleStatementParser extends SQLStatementParser {
OracleMergeStatement stmt = new OracleMergeStatement();
OracleExprParser exprParser = this.createExprParser();
exprParser.parseHints(stmt.getHints());
parseHints(stmt.getHints());
accept(Token.INTO);
stmt.setInto(exprParser.name());
@@ -1241,7 +1245,7 @@ public class OracleStatementParser extends SQLStatementParser {
List<OracleHint> hints = new ArrayList<OracleHint>();
this.createExprParser().parseHints(hints);
parseHints(hints);
if (lexer.token() == Token.INTO) {
OracleInsertStatement stmt = new OracleInsertStatement();
@@ -1290,7 +1294,7 @@ public class OracleStatementParser extends SQLStatementParser {
OracleMultiInsertStatement.ConditionalInsertClauseItem item = new OracleMultiInsertStatement.ConditionalInsertClauseItem();
item.setWhen(this.createExprParser().expr());
item.setWhen(this.exprParser.expr());
accept(Token.THEN);
OracleMultiInsertStatement.InsertIntoClause insertInto = new OracleMultiInsertStatement.InsertIntoClause();
parseInsert0(insertInto);
@@ -1430,7 +1434,7 @@ public class OracleStatementParser extends SQLStatementParser {
if (lexer.token() == Token.DELETE) {
lexer.nextToken();
this.createExprParser().parseHints(deleteStatement.getHints());
parseHints(deleteStatement.getHints());
if (lexer.token() == (Token.FROM)) {
lexer.nextToken();
@@ -22,18 +22,20 @@ import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLExprParser;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.sql.parser.Token;
public class OracleUpdateParser extends SQLStatementParser {
public OracleUpdateParser(String sql) throws ParserException{
super(sql);
super(new OracleLexer(sql));
this.lexer.nextToken();
this.exprParser = new OracleExprParser(lexer);
}
public OracleUpdateParser(Lexer lexer){
super(lexer);
this.exprParser = new OracleExprParser(lexer);
}
public OracleUpdateStatement parseUpdateStatement() throws ParserException {
@@ -142,8 +144,4 @@ public class OracleUpdateParser extends SQLStatementParser {
lexer.nextToken();
}
}
protected SQLExprParser createExprParser() {
return new OracleExprParser(lexer);
}
}
@@ -124,7 +124,7 @@ public class PGSQLStatementParser extends SQLStatementParser {
break;
}
} else if (lexer.token() == (Token.SELECT)) {
SQLQueryExpr queryExpr = (SQLQueryExpr) this.createExprParser().expr();
SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr();
stmt.setQuery(queryExpr.getSubQuery());
}
@@ -155,7 +155,7 @@ public class PGSQLStatementParser extends SQLStatementParser {
if (lexer.token() == Token.USING) {
lexer.nextToken();
for (;;) {
SQLName name = this.createExprParser().name();
SQLName name = this.exprParser.name();
deleteStatement.getUsing().add(name);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
@@ -271,13 +271,13 @@ public class PGSQLStatementParser extends SQLStatementParser {
private PGWithQuery withQuery() {
PGWithQuery withQuery = new PGWithQuery();
withQuery.setName(this.createExprParser().expr());
withQuery.setName(this.exprParser.expr());
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
for (;;) {
SQLExpr expr = this.createExprParser().expr();
SQLExpr expr = this.exprParser.expr();
withQuery.getColumns().add(expr);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
@@ -0,0 +1,8 @@
package com.alibaba.druid.sql.dialect.sqlserver.ast.expr;
import com.alibaba.druid.sql.ast.SQLExpr;
public interface SQLServerExpr extends SQLExpr {
}
@@ -0,0 +1,83 @@
package com.alibaba.druid.sql.dialect.sqlserver.ast.expr;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerObjectImpl;
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor;
public class SQLServerObjectReferenceExpr extends SQLServerObjectImpl implements SQLServerExpr {
private static final long serialVersionUID = 1L;
private String server;
private String database;
private String schema;
private String object;
@Override
public void accept0(SQLServerASTVisitor visitor) {
}
public void output(StringBuffer buf) {
boolean flag = false;
if (server != null) {
buf.append(server);
buf.append('.');
flag = true;
}
if (database != null) {
buf.append(database);
buf.append('.');
flag = true;
} else {
if (flag) {
buf.append('.');
}
}
if (schema != null) {
buf.append(schema);
buf.append('.');
flag = true;
} else {
if (flag) {
buf.append('.');
}
}
buf.append(object);
}
public String getServer() {
return server;
}
public void setServer(String server) {
this.server = server;
}
public String getDatabase() {
return database;
}
public void setDatabase(String database) {
this.database = database;
}
public String getSchema() {
return schema;
}
public void setSchema(String schema) {
this.schema = schema;
}
public String getObject() {
return object;
}
public void setObject(String object) {
this.object = object;
}
}
@@ -0,0 +1,18 @@
package com.alibaba.druid.sql.dialect.sqlserver.parser;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLExprParser;
public class SQLServerExprParser extends SQLExprParser {
public SQLServerExprParser(Lexer lexer){
super(lexer);
}
public SQLServerExprParser(String sql) throws ParserException{
super(new SQLServerLexer(sql));
this.lexer.nextToken();
}
}
@@ -24,6 +24,7 @@ public class SQLServerStatementParser extends SQLStatementParser {
public SQLServerStatementParser(String sql){
super(new SQLServerLexer(sql));
this.lexer.nextToken();
this.exprParser = new SQLServerExprParser(lexer);
}
public SQLSelectParser createSQLSelectParser() {
@@ -47,16 +47,16 @@ public class SQLStatementParser extends SQLParser {
public SQLStatementParser(String sql){
super(sql);
this.exprParser = createExprParser();
this.exprParser = new SQLExprParser(lexer);
}
public SQLStatementParser(Lexer lexer){
super(lexer);
this.exprParser = createExprParser();
this.exprParser = new SQLExprParser(lexer);
}
protected SQLExprParser createExprParser() {
return new SQLExprParser(lexer);
public SQLExprParser getExprParser() {
return exprParser;
}
public List<SQLStatement> parseStatementList() throws ParserException {
@@ -255,7 +255,7 @@ public class SQLStatementParser extends SQLParser {
insertStatement.setValues(values);
accept(Token.RPAREN);
} else if (acceptSubQuery && (lexer.token() == Token.SELECT || lexer.token() == Token.LPAREN)) {
SQLQueryExpr queryExpr = (SQLQueryExpr) this.createExprParser().expr();
SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr();
insertStatement.setQuery(queryExpr.getSubQuery());
}
}
@@ -9,7 +9,6 @@ import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.stat.TableStat;
import com.alibaba.druid.stat.TableStat.Column;
public class MySqlDescribteTest extends MysqlTest {