improved sql format output

This commit is contained in:
shaojin.wensj
2015-07-11 14:27:29 +08:00
parent 60b7139911
commit b36374f7bf
26 changed files with 612 additions and 35 deletions
@@ -109,6 +109,9 @@ public class MySqlLexer extends Lexer {
stringVal = subString(mark, bufPos);
token = Token.LINE_COMMENT;
hasComment = true;
if (keepComments) {
commentVal = stringVal;
}
if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) {
return;
@@ -448,13 +451,16 @@ public class MySqlLexer extends Lexer {
stringVal = subString(mark, bufPos);
token = Token.MULTI_LINE_COMMENT;
hasComment = true;
}
if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) {
return;
if (keepComments) {
commentVal = stringVal;
}
}
endOfComment = isEOF();
if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) {
return;
}
if (!isHint && !isAllowComment() && !isSafeComment(stringVal)) {
throw new NotAllowCommentException();
@@ -492,6 +498,9 @@ public class MySqlLexer extends Lexer {
stringVal = subString(mark, bufPos + 1);
token = Token.LINE_COMMENT;
hasComment = true;
if (keepComments) {
commentVal = stringVal;
}
if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) {
return;
@@ -48,6 +48,11 @@ public class OdpsExprParser extends SQLExprParser {
this.lexer.nextToken();
}
public OdpsExprParser(String sql, Lexer.CommentHandler commentHandler){
this(new OdpsLexer(sql, commentHandler));
this.lexer.nextToken();
}
protected SQLExpr parseAliasExpr(String alias) {
return new SQLCharExpr(alias);
}
@@ -97,7 +102,13 @@ public class OdpsExprParser extends SQLExprParser {
}
final String alias = as();
SQLSelectItem item = new SQLSelectItem(expr, alias);
if (lexer.hasComment() && lexer.isKeepComments()) {
item.addAfterComment(lexer.commentVal());
}
return new SQLSelectItem(expr, alias);
return item;
}
}
@@ -52,10 +52,17 @@ public class OdpsLexer extends Lexer {
super.keywods = DEFAULT_ODPS_KEYWORDS;
}
public OdpsLexer(String input, CommentHandler commentHandler){
super(input, commentHandler);
super.keywods = DEFAULT_ODPS_KEYWORDS;
}
public void scanComment() {
if (ch != '/' && ch != '-') {
throw new IllegalStateException();
}
Token lastToken = this.token;
mark = pos;
bufPos = 0;
@@ -95,9 +102,16 @@ public class OdpsLexer extends Lexer {
stringVal = subString(mark + startHintSp, (bufPos - startHintSp) - 1);
token = Token.HINT;
} else {
stringVal = subString(mark, bufPos);
stringVal = subString(mark, bufPos + 1);
token = Token.MULTI_LINE_COMMENT;
hasComment = true;
if (keepComments) {
commentVal = stringVal;
}
}
if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) {
return;
}
if (token != Token.HINT && !isAllowComment()) {
@@ -138,10 +152,18 @@ public class OdpsLexer extends Lexer {
bufPos++;
}
stringVal = subString(mark + 1, bufPos);
stringVal = subString(mark, bufPos);
token = Token.LINE_COMMENT;
hasComment = true;
if (keepComments) {
commentVal = stringVal;
}
endOfComment = isEOF();
if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) {
return;
}
return;
}
}
@@ -40,14 +40,18 @@ public class OdpsSelectParser extends SQLSelectParser {
return queryRest(select);
}
OdpsSelectQueryBlock queryBlock = new OdpsSelectQueryBlock();
if (lexer.hasComment() && lexer.isKeepComments()) {
queryBlock.addBeforeComment(lexer.commentVal());
}
accept(Token.SELECT);
if (lexer.token() == Token.COMMENT) {
lexer.nextToken();
}
OdpsSelectQueryBlock queryBlock = new OdpsSelectQueryBlock();
if (lexer.token() == Token.DISTINCT) {
queryBlock.setDistionOption(SQLSetQuantifier.DISTINCT);
lexer.nextToken();
@@ -42,9 +42,11 @@ import com.alibaba.druid.sql.parser.Token;
import com.alibaba.druid.util.JdbcConstants;
public class OdpsStatementParser extends SQLStatementParser {
public OdpsStatementParser(String sql){
super(new OdpsExprParser(sql));
super (new OdpsLexer(sql), JdbcConstants.ODPS);
this.exprParser = new OdpsExprParser(this.lexer);
this.lexer.setCommentHandler(commentCallBack);
this.lexer.nextToken();
}
public OdpsStatementParser(SQLExprParser exprParser){
@@ -108,6 +110,11 @@ public class OdpsStatementParser extends SQLStatementParser {
public OdpsInsert parseOdpsInsert() {
OdpsInsert insert = new OdpsInsert();
if (lexer.hasComment()) {
insert.addBeforeComment(lexer.commentVal());
}
SQLSelectParser selectParser = createSQLSelectParser();
accept(Token.INSERT);
@@ -153,6 +153,10 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis
@Override
public boolean visit(OdpsInsert x) {
if (x.hasBeforeComment()) {
printComment(x.getBeforeCommentsDirect(), "\n");
println();
}
if (x.isOverwrite()) {
print("INSERT OVERWRITE TABLE ");
} else {
@@ -231,12 +235,22 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis
protected void printSelectList(List<SQLSelectItem> selectList) {
incrementIndent();
for (int i = 0, size = selectList.size(); i < size; ++i) {
SQLSelectItem selectItem = selectList.get(i);
if (i != 0) {
print(", ");
printComment(selectList.get(i - 1).getAfterCommentsDirect(), "\n");
println();
}
selectList.get(i).accept(this);
selectItem.accept(this);
if (i == selectList.size() - 1 && selectItem.hasAfterComment()) {
print(' ');
printComment(selectItem.getAfterCommentsDirect(), "\n");
}
}
decrementIndent();
}
@@ -374,6 +388,11 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis
@Override
public boolean visit(OdpsSelectQueryBlock x) {
if (isPrettyFormat() && x.hasBeforeComment()) {
printComment(x.getBeforeCommentsDirect(), "\n");
println();
}
print("SELECT ");
if (SQLSetQuantifier.ALL == x.getDistionOption()) {
@@ -397,6 +416,10 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis
print("WHERE ");
x.getWhere().setParent(x);
x.getWhere().accept(this);
if (x.getWhere().hasAfterComment() && isPrettyFormat()) {
print(' ');
printComment(x.getWhere().getAfterCommentsDirect(), "\n");
}
}
if (x.getGroupBy() != null) {
@@ -231,6 +231,9 @@ public class OracleLexer extends Lexer {
stringVal = subString(mark, bufPos);
token = Token.MULTI_LINE_COMMENT;
hasComment = true;
if (keepComments) {
commentVal = stringVal;
}
}
if (token != Token.HINT && !isAllowComment()) {
@@ -274,6 +277,9 @@ public class OracleLexer extends Lexer {
stringVal = subString(mark + 1, bufPos);
token = Token.LINE_COMMENT;
hasComment = true;
if (keepComments) {
commentVal = stringVal;
}
endOfComment = isEOF();
return;
}
@@ -106,6 +106,9 @@ public class SQLServerLexer extends Lexer {
stringVal = subString(mark, bufPos);
token = Token.MULTI_LINE_COMMENT;
hasComment = true;
if (keepComments) {
commentVal = stringVal;
}
}
if (token != Token.HINT && !isAllowComment() && !isSafeComment(stringVal)) {
@@ -145,6 +148,9 @@ public class SQLServerLexer extends Lexer {
stringVal = subString(mark + 1, bufPos);
token = Token.LINE_COMMENT;
hasComment = true;
if (keepComments) {
commentVal = stringVal;
}
endOfComment = isEOF();
if (!isAllowComment() && (isEOF() || !isSafeComment(stringVal))) {