sql server support

This commit is contained in:
wenshao
2011-11-12 13:35:47 +08:00
parent a91b98f87a
commit a8226a3215
12 changed files with 333 additions and 3 deletions
@@ -0,0 +1,36 @@
/*
* Copyright 1999-2011 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.sql.dialect.sqlserver.ast;
import com.alibaba.druid.sql.ast.SQLObjectImpl;
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public abstract class SQLServerObjectImpl extends SQLObjectImpl implements SQLServerObject {
private static final long serialVersionUID = 1L;
public SQLServerObjectImpl(){
}
@Override
protected void accept0(SQLASTVisitor visitor) {
this.accept0((SQLServerASTVisitor) visitor);
}
public abstract void accept0(SQLServerASTVisitor visitor);
}
@@ -0,0 +1,39 @@
package com.alibaba.druid.sql.dialect.sqlserver.ast;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLServerSelectQueryBlock extends SQLSelectQueryBlock {
/**
*
*/
private static final long serialVersionUID = 1L;
private Top top;
public Top getTop() {
return top;
}
public void setTop(Top top) {
this.top = top;
}
@Override
protected void accept0(SQLASTVisitor visitor) {
accept0((SQLServerASTVisitor) visitor);
}
protected void accept0(SQLServerASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, this.top);
acceptChild(visitor, this.selectList);
acceptChild(visitor, this.from);
acceptChild(visitor, this.where);
acceptChild(visitor, this.groupBy);
}
visitor.endVisit(this);
}
}
@@ -0,0 +1,48 @@
package com.alibaba.druid.sql.dialect.sqlserver.ast;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor;
public class Top extends SQLServerObjectImpl {
/**
*
*/
private static final long serialVersionUID = 1L;
private SQLExpr expr;
private boolean percent;
private boolean withTies;
public SQLExpr getExpr() {
return expr;
}
public void setExpr(SQLExpr expr) {
this.expr = expr;
}
public boolean isPercent() {
return percent;
}
public void setPercent(boolean percent) {
this.percent = percent;
}
public boolean isWithTies() {
return withTies;
}
public void setWithTies(boolean withTies) {
this.withTies = withTies;
}
@Override
public void accept0(SQLServerASTVisitor visitor) {
if (visitor.visit(this)) {
}
}
}
@@ -86,6 +86,7 @@ public class SQLServerLexer extends Lexer {
map.put("WITH", Token.WITH);
map.put("CURSOR", Token.CURSOR);
map.put("TOP", Token.TOP);
DEFAULT_SQL_SERVER_KEYWORDS = new Keywords(map);
}
@@ -0,0 +1,77 @@
package com.alibaba.druid.sql.dialect.sqlserver.parser;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock;
import com.alibaba.druid.sql.dialect.sqlserver.ast.Top;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLSelectParser;
import com.alibaba.druid.sql.parser.Token;
public class SQLServerSelectParser extends SQLSelectParser {
public SQLServerSelectParser(String sql){
super(new SQLServerLexer(sql));
this.lexer.nextToken();
}
public SQLServerSelectParser(Lexer lexer){
super(lexer);
}
public SQLSelect select() throws ParserException {
SQLServerSelect select = new SQLServerSelect();
select.setQuery(query());
select.setOrderBy(parseOrderBy());
if (select.getOrderBy() == null) {
select.setOrderBy(parseOrderBy());
}
return select;
}
protected SQLSelectQuery query() throws ParserException {
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
SQLSelectQuery select = query();
accept(Token.RPAREN);
return queryRest(select);
}
accept(Token.SELECT);
SQLServerSelectQueryBlock queryBlock = new SQLServerSelectQueryBlock();
if (lexer.token() == Token.DISTINCT) {
queryBlock.setDistionOption(SQLSetQuantifier.DISTINCT);
lexer.nextToken();
} else if (lexer.token() == Token.ALL) {
queryBlock.setDistionOption(SQLSetQuantifier.ALL);
lexer.nextToken();
}
if (lexer.token() == Token.TOP) {
Top top = new Top();
lexer.nextToken();
top.setExpr(createExprParser().primary());
queryBlock.setTop(top);
}
parseSelectList(queryBlock);
parseFrom(queryBlock);
parseWhere(queryBlock);
parseGroupBy(queryBlock);
return queryRest(queryBlock);
}
}
@@ -25,7 +25,6 @@ import com.alibaba.druid.sql.dialect.oracle.parser.OracleInsertParser;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleSelectParser;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLSelectParser;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.sql.parser.Token;
@@ -53,7 +52,7 @@ public class SQLServerStatementParser extends SQLStatementParser {
}
if (lexer.token() == (Token.SELECT)) {
statementList.add(new SQLSelectStatement(new SQLSelectParser(this.lexer).select()));
statementList.add(new SQLSelectStatement(new SQLServerSelectParser(this.lexer).select()));
continue;
}
@@ -0,0 +1,15 @@
package com.alibaba.druid.sql.dialect.sqlserver.visitor;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock;
import com.alibaba.druid.sql.dialect.sqlserver.ast.Top;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public interface SQLServerASTVisitor extends SQLASTVisitor {
boolean visit(SQLServerSelectQueryBlock x);
void endVisit(SQLServerSelectQueryBlock x);
boolean visit(Top x);
void endVisit(Top x);
}
@@ -0,0 +1,69 @@
package com.alibaba.druid.sql.dialect.sqlserver.visitor;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock;
import com.alibaba.druid.sql.dialect.sqlserver.ast.Top;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
public class SqlServerOutputVisitor extends SQLASTOutputVisitor implements SQLServerASTVisitor {
public SqlServerOutputVisitor(Appendable appender){
super(appender);
}
public boolean visit(SQLServerSelectQueryBlock select) {
print("SELECT ");
if (SQLSetQuantifier.ALL == select.getDistionOption()) {
print("ALL ");
} else if (SQLSetQuantifier.DISTINCT == select.getDistionOption()) {
print("DISTINCT ");
} else if (SQLSetQuantifier.UNIQUE == select.getDistionOption()) {
print("UNIQUE ");
}
if (select.getTop() != null) {
select.getTop().accept(this);
}
printSelectList(select.getSelectList());
if (select.getFrom() != null) {
println();
print("FROM ");
select.getFrom().accept(this);
}
if (select.getWhere() != null) {
println();
print("WHERE ");
select.getWhere().accept(this);
}
if (select.getGroupBy() != null) {
print(" ");
select.getGroupBy().accept(this);
}
return false;
}
@Override
public void endVisit(SQLServerSelectQueryBlock x) {
}
@Override
public boolean visit(Top x) {
print("TOP ");
x.getExpr().accept(this);
print(" ");
return false;
}
@Override
public void endVisit(Top x) {
}
}