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
@@ -88,12 +88,16 @@ import com.alibaba.druid.sql.dialect.odps.parser.OdpsSelectParser;
public class SQLStatementParser extends SQLParser {
protected SQLExprParser exprParser;
protected SQLExprParser exprParser;
protected boolean parseCompleteValues = true;
protected int parseValuesSize = 3;
protected boolean parseCompleteValues = true;
protected int parseValuesSize = 3;
protected List<String> comments;
protected CommentCallback commentCallBack = new CommentCallback();
public SQLStatementParser(String sql){
this(sql, null);
}
@@ -101,11 +105,23 @@ public class SQLStatementParser extends SQLParser {
public SQLStatementParser(String sql, String dbType){
this(new SQLExprParser(sql, dbType));
}
public SQLStatementParser(SQLExprParser exprParser){
super(exprParser.getLexer(), exprParser.getDbType());
this.exprParser = exprParser;
}
protected SQLStatementParser(Lexer lexer, String dbType){
super(lexer, dbType);
}
public boolean isKeepComments() {
return lexer.isKeepComments();
}
public void setKeepComments(boolean keepComments) {
this.lexer.setKeepComments(keepComments);
}
public SQLExprParser getExprParser() {
return exprParser;
@@ -122,13 +138,30 @@ public class SQLStatementParser extends SQLParser {
}
public void parseStatementList(List<SQLStatement> statementList, int max) {
List<String> comments = null;
if (this.comments != null) {
comments = this.comments;
this.comments = null;
}
int size_original = statementList.size();
for (;;) {
boolean isFirstStmt = statementList.size() == size_original + 1;
if (isFirstStmt && comments != null && lexer.isKeepComments()) {
SQLStatement firstStmt = statementList.get(size_original);
for (String comment : comments) {
firstStmt.addBeforeComment(comment);
}
comments = null;
}
if (max != -1) {
if (statementList.size() >= max) {
return;
}
}
if (lexer.token() == Token.EOF) {
return;
}
@@ -136,8 +169,15 @@ public class SQLStatementParser extends SQLParser {
return;
}
if (lexer.token() == (Token.SEMI)) {
if (lexer.token() == Token.SEMI) {
size_original = statementList.size();
this.comments = null;
lexer.nextToken();
comments = this.comments;
if (lexer.isKeepComments()) {
SQLStatement stmt = statementList.get(statementList.size() - 1);
stmt.getAttributes().put("format.semi", Boolean.TRUE);
}
continue;
}
@@ -1781,4 +1821,22 @@ public class SQLStatementParser extends SQLParser {
public void setParseValuesSize(int parseValuesSize) {
this.parseValuesSize = parseValuesSize;
}
class CommentCallback implements Lexer.CommentHandler {
@Override
public boolean handle(Token lastToken, String comment) {
addComment(comment);
return true;
}
}
void addComment(String comment) {
if (comments == null) {
comments = new ArrayList<String>();
}
comments.add(comment);
}
}