From a5811a4f3ef3f544cb2b1b03a0637bd9438ecdf9 Mon Sep 17 00:00:00 2001 From: "shaojin.wensj" Date: Mon, 20 Jul 2015 04:41:57 +0800 Subject: [PATCH] improved odps sql formatter --- .../java/com/alibaba/druid/sql/SQLUtils.java | 22 ++++++-- .../com/alibaba/druid/sql/ast/SQLObject.java | 3 ++ .../alibaba/druid/sql/ast/SQLObjectImpl.java | 32 ++++++++++++ .../alibaba/druid/sql/ast/SQLStatement.java | 2 +- .../ast/statement/SQLCommentStatement.java | 4 +- .../sql/ast/statement/SQLInsertStatement.java | 10 ++++ .../druid/sql/ast/statement/SQLSelect.java | 15 ++++++ .../sql/ast/statement/SQLSelectItem.java | 6 +-- .../sql/dialect/mysql/parser/MySqlLexer.java | 8 +-- .../sql/dialect/odps/ast/OdpsObject.java | 23 +++++++++ .../sql/dialect/odps/ast/OdpsObjectImpl.java | 4 +- .../dialect/odps/ast/OdpsStatisticClause.java | 12 ++--- .../odps/ast/OdpsUDTFSQLSelectItem.java | 15 +++++- .../dialect/odps/parser/OdpsExprParser.java | 7 ++- .../sql/dialect/odps/parser/OdpsLexer.java | 11 +++- .../dialect/odps/parser/OdpsSelectParser.java | 2 +- .../odps/parser/OdpsStatementParser.java | 24 +++++++-- .../odps/visitor/OdpsOutputVisitor.java | 31 ++++++++--- .../stmt/OracleSetTransactionStatement.java | 9 ++++ .../dialect/oracle/parser/OracleLexer.java | 4 +- .../ast/stmt/SQLServerBlockStatement.java | 9 ++++ .../ast/stmt/SQLServerCommitStatement.java | 10 ++++ .../ast/stmt/SQLServerDeclareStatement.java | 9 ++++ .../ast/stmt/SQLServerExecStatement.java | 9 ++++ .../ast/stmt/SQLServerIfStatement.java | 8 +++ .../ast/stmt/SQLServerSetStatement.java | 10 +++- ...SetTransactionIsolationLevelStatement.java | 8 +++ .../ast/stmt/SQLServerWaitForStatement.java | 9 ++++ .../sqlserver/parser/SQLServerLexer.java | 4 +- .../com/alibaba/druid/sql/parser/Lexer.java | 37 ++++++++++++-- .../druid/sql/parser/SQLExprParser.java | 2 +- .../druid/sql/parser/SQLSelectParser.java | 6 +-- .../druid/sql/parser/SQLStatementParser.java | 51 ++----------------- .../druid/bvt/sql/mysql/SQLUtilsTest.java | 3 +- .../bvt/sql/odps/OdpsFormatCommentTest10.java | 28 ++++++++++ .../bvt/sql/odps/OdpsFormatCommentTest7.java | 24 +++++++++ .../bvt/sql/odps/OdpsFormatCommentTest8.java | 27 ++++++++++ .../bvt/sql/odps/OdpsFormatCommentTest9.java | 20 ++++++++ 38 files changed, 415 insertions(+), 103 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsObject.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest10.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest7.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest8.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest9.java diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index 59087e1601..4f1c54f169 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -255,11 +255,12 @@ public class SQLUtils { if (i > 0) { visitor.println(";"); } - - List comments = stmt.getBeforeCommentsDirect(); - if (comments != null){ - for(String comment : comments) { - visitor.println(comment); + { + List comments = stmt.getBeforeCommentsDirect(); + if (comments != null){ + for(String comment : comments) { + visitor.println(comment); + } } } stmt.accept(visitor); @@ -270,6 +271,17 @@ public class SQLUtils { visitor.println(); visitor.print(";"); } + + List comments = stmt.getAfterCommentsDirect(); + if (comments != null){ + for (int j = 0; j < comments.size(); ++j) { + String comment = comments.get(j); + if (j != 0) { + visitor.println(); + } + visitor.print(comment); + } + } } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLObject.java b/src/main/java/com/alibaba/druid/sql/ast/SQLObject.java index fbe2a4d953..cbfc495952 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLObject.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLObject.java @@ -37,11 +37,14 @@ public interface SQLObject { Map getAttributesDirect(); void addBeforeComment(String comment); + void addBeforeComment(List comments); List getBeforeCommentsDirect(); void addAfterComment(String comment); + void addAfterComment(List comments); + List getAfterCommentsDirect(); boolean hasBeforeComment(); diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLObjectImpl.java b/src/main/java/com/alibaba/druid/sql/ast/SQLObjectImpl.java index 4094fed083..e6964ee7be 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLObjectImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLObjectImpl.java @@ -111,6 +111,10 @@ public abstract class SQLObjectImpl implements SQLObject { @SuppressWarnings("unchecked") public void addBeforeComment(String comment) { + if (comment == null) { + return; + } + if (attributes == null) { attributes = new HashMap(1); } @@ -124,6 +128,20 @@ public abstract class SQLObjectImpl implements SQLObject { comments.add(comment); } + @SuppressWarnings("unchecked") + public void addBeforeComment(List comments) { + if (attributes == null) { + attributes = new HashMap(1); + } + + List attrComments = (List) attributes.get("format.before_comment"); + if (attrComments == null) { + attributes.put("format.before_comment", comments); + } else { + attrComments.addAll(comments); + } + } + @SuppressWarnings("unchecked") public List getBeforeCommentsDirect() { if (attributes == null) { @@ -148,6 +166,20 @@ public abstract class SQLObjectImpl implements SQLObject { comments.add(comment); } + @SuppressWarnings("unchecked") + public void addAfterComment(List comments) { + if (attributes == null) { + attributes = new HashMap(1); + } + + List attrComments = (List) attributes.get("format.after_comment"); + if (attrComments == null) { + attributes.put("format.after_comment", comments); + } else { + attrComments.addAll(comments); + } + } + @SuppressWarnings("unchecked") public List getAfterCommentsDirect() { if (attributes == null) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLStatement.java b/src/main/java/com/alibaba/druid/sql/ast/SQLStatement.java index 8e3e08d86d..bb67f36b00 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLStatement.java @@ -16,5 +16,5 @@ package com.alibaba.druid.sql.ast; public interface SQLStatement extends SQLObject { - + String getDbType(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommentStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommentStatement.java index ed8eaf8547..db5a714f89 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommentStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommentStatement.java @@ -16,11 +16,11 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class SQLCommentStatement extends SQLObjectImpl implements SQLStatement { +public class SQLCommentStatement extends SQLStatementImpl implements SQLStatement { public static enum Type { TABLE, COLUMN diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java index 3391b4e856..521a501865 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java @@ -24,6 +24,7 @@ import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLInsertStatement extends SQLInsertInto implements SQLStatement { + private String dbType; public SQLInsertStatement(){ @@ -85,4 +86,13 @@ public class SQLInsertStatement extends SQLInsertInto implements SQLStatement { visitor.endVisit(this); } } + + @Override + public String getDbType() { + return dbType; + } + + public void setDbType(String dbType) { + this.dbType = dbType; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java index 7efc2e39e0..6ab3563471 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java @@ -18,9 +18,12 @@ package com.alibaba.druid.sql.ast.statement; import java.util.ArrayList; import java.util.List; +import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLHint; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.ast.SQLOrderBy; +import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLSelect extends SQLObjectImpl { @@ -118,4 +121,16 @@ public class SQLSelect extends SQLObjectImpl { return true; } + public String toString() { + SQLObject parent = this.getParent(); + if (parent instanceof SQLStatement) { + String dbType = ((SQLStatement) parent).getDbType(); + + if (dbType != null) { + return SQLUtils.toSQLString(this, dbType); + } + } + + return super.toString(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java index 2a6ad1dcb1..8639d114ec 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java @@ -21,9 +21,9 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLSelectItem extends SQLObjectImpl { - private SQLExpr expr; - private String alias; - private boolean connectByRoot = false; + protected SQLExpr expr; + protected String alias; + protected boolean connectByRoot = false; public SQLSelectItem(){ diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java index e533050701..1203bbdc7b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java @@ -106,11 +106,11 @@ public class MySqlLexer extends Lexer { bufPos++; } - stringVal = subString(mark, bufPos); + stringVal = subString(mark - 1, bufPos + 1); token = Token.LINE_COMMENT; hasComment = true; if (keepComments) { - commentVal = stringVal; + addComment(stringVal); } if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) { @@ -452,7 +452,7 @@ public class MySqlLexer extends Lexer { token = Token.MULTI_LINE_COMMENT; hasComment = true; if (keepComments) { - commentVal = stringVal; + addComment(stringVal); } } @@ -499,7 +499,7 @@ public class MySqlLexer extends Lexer { token = Token.LINE_COMMENT; hasComment = true; if (keepComments) { - commentVal = stringVal; + addComment(stringVal); } if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsObject.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsObject.java new file mode 100644 index 0000000000..23194aea56 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsObject.java @@ -0,0 +1,23 @@ +/* + * 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.odps.ast; + +import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; + +public interface OdpsObject extends SQLObject { + void accept0(OdpsASTVisitor visitor); +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsObjectImpl.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsObjectImpl.java index e12f362e40..75d4ddaae4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsObjectImpl.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsObjectImpl.java @@ -20,13 +20,13 @@ import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public abstract class OdpsObjectImpl extends SQLObjectImpl { +public abstract class OdpsObjectImpl extends SQLObjectImpl implements OdpsObject { @Override protected void accept0(SQLASTVisitor visitor) { accept0((OdpsASTVisitor) visitor); } - protected abstract void accept0(OdpsASTVisitor visitor); + public abstract void accept0(OdpsASTVisitor visitor); public String toString() { return SQLUtils.toOdpsString(this); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsStatisticClause.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsStatisticClause.java index 0b7ecc23bd..245b9a0941 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsStatisticClause.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsStatisticClause.java @@ -40,7 +40,7 @@ public abstract class OdpsStatisticClause extends OdpsObjectImpl { public static class NullValue extends ColumnStatisticClause { @Override - protected void accept0(OdpsASTVisitor visitor) { + public void accept0(OdpsASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, column); } @@ -50,7 +50,7 @@ public abstract class OdpsStatisticClause extends OdpsObjectImpl { public static class ColumnSum extends ColumnStatisticClause { @Override - protected void accept0(OdpsASTVisitor visitor) { + public void accept0(OdpsASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, column); } @@ -60,7 +60,7 @@ public abstract class OdpsStatisticClause extends OdpsObjectImpl { public static class ColumnMin extends ColumnStatisticClause { @Override - protected void accept0(OdpsASTVisitor visitor) { + public void accept0(OdpsASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, column); } @@ -70,7 +70,7 @@ public abstract class OdpsStatisticClause extends OdpsObjectImpl { public static class ColumnMax extends ColumnStatisticClause { @Override - protected void accept0(OdpsASTVisitor visitor) { + public void accept0(OdpsASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, column); } @@ -94,7 +94,7 @@ public abstract class OdpsStatisticClause extends OdpsObjectImpl { } @Override - protected void accept0(OdpsASTVisitor visitor) { + public void accept0(OdpsASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, expr); } @@ -105,7 +105,7 @@ public abstract class OdpsStatisticClause extends OdpsObjectImpl { public static class TableCount extends OdpsStatisticClause { @Override - protected void accept0(OdpsASTVisitor visitor) { + public void accept0(OdpsASTVisitor visitor) { if (visitor.visit(this)) { } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsUDTFSQLSelectItem.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsUDTFSQLSelectItem.java index 84b104060f..f4142ea9e4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsUDTFSQLSelectItem.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsUDTFSQLSelectItem.java @@ -19,8 +19,10 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class OdpsUDTFSQLSelectItem extends SQLSelectItem { +public class OdpsUDTFSQLSelectItem extends SQLSelectItem implements OdpsObject { private final List aliasList = new ArrayList(); @@ -36,4 +38,15 @@ public class OdpsUDTFSQLSelectItem extends SQLSelectItem { return aliasList; } + protected void accept0(SQLASTVisitor visitor) { + accept0((OdpsASTVisitor) visitor); + } + + public void accept0(OdpsASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, this.expr); + } + visitor.endVisit(this); + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java index 38e3d86e5f..c090e7c57f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java @@ -21,7 +21,6 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem; 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.Token; @@ -49,8 +48,8 @@ public class OdpsExprParser extends SQLExprParser { this.lexer.nextToken(); } - public OdpsExprParser(String sql, Lexer.CommentHandler commentHandler){ - this(new OdpsLexer(sql, commentHandler)); + public OdpsExprParser(String sql, boolean skipComments, boolean keepComments){ + this(new OdpsLexer(sql, skipComments, keepComments)); this.lexer.nextToken(); } @@ -107,7 +106,7 @@ public class OdpsExprParser extends SQLExprParser { SQLSelectItem item = new SQLSelectItem(expr, alias); if (lexer.hasComment() && lexer.isKeepComments()) { - item.addAfterComment(lexer.commentVal()); + item.addAfterComment(lexer.readAndResetComments()); } return item; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java index d89f6e9968..d5e43d3221 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsLexer.java @@ -53,6 +53,13 @@ public class OdpsLexer extends Lexer { super.keywods = DEFAULT_ODPS_KEYWORDS; } + public OdpsLexer(String input, boolean skipComment, boolean keepComments){ + super(input, skipComment); + this.skipComment = skipComment; + this.keepComments = keepComments; + super.keywods = DEFAULT_ODPS_KEYWORDS; + } + public OdpsLexer(String input, CommentHandler commentHandler){ super(input, commentHandler); super.keywods = DEFAULT_ODPS_KEYWORDS; @@ -107,7 +114,7 @@ public class OdpsLexer extends Lexer { token = Token.MULTI_LINE_COMMENT; hasComment = true; if (keepComments) { - commentVal = stringVal; + addComment(stringVal); } } @@ -157,7 +164,7 @@ public class OdpsLexer extends Lexer { token = Token.LINE_COMMENT; hasComment = true; if (keepComments) { - commentVal = stringVal; + addComment(stringVal); } endOfComment = isEOF(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java index 0cf938bc47..a4fdbb082f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsSelectParser.java @@ -43,7 +43,7 @@ public class OdpsSelectParser extends SQLSelectParser { OdpsSelectQueryBlock queryBlock = new OdpsSelectQueryBlock(); if (lexer.hasComment() && lexer.isKeepComments()) { - queryBlock.addBeforeComment(lexer.commentVal()); + queryBlock.addBeforeComment(lexer.readAndResetComments()); } accept(Token.SELECT); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java index 5d19f5b689..55e4fb8027 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java @@ -48,9 +48,8 @@ import com.alibaba.druid.util.JdbcConstants; public class OdpsStatementParser extends SQLStatementParser { public OdpsStatementParser(String sql){ - super (new OdpsLexer(sql), JdbcConstants.ODPS); + super (new OdpsLexer(sql, true, true), JdbcConstants.ODPS); this.exprParser = new OdpsExprParser(this.lexer); - this.lexer.setCommentHandler(commentCallBack); this.lexer.nextToken(); } @@ -231,8 +230,8 @@ public class OdpsStatementParser extends SQLStatementParser { public OdpsInsert parseOdpsInsert() { OdpsInsert insert = new OdpsInsert(); - if (lexer.hasComment()) { - insert.addBeforeComment(lexer.commentVal()); + if (lexer.isKeepComments() && lexer.hasComment()) { + insert.addBeforeComment(lexer.readAndResetComments()); } SQLSelectParser selectParser = createSQLSelectParser(); @@ -323,11 +322,22 @@ public class OdpsStatementParser extends SQLStatementParser { } public SQLStatement parseSet() { + List comments = null; + if (lexer.isKeepComments() && lexer.hasComment()) { + comments = lexer.readAndResetComments(); + } + accept(Token.SET); if (identifierEquals("LABEL")) { - lexer.nextToken(); OdpsSetLabelStatement stmt = new OdpsSetLabelStatement(); + + if (comments != null) { + stmt.addBeforeComment(comments); + } + + lexer.nextToken(); + stmt.setLabel(lexer.stringVal()); lexer.nextToken(); accept(Token.TO); @@ -351,6 +361,10 @@ public class OdpsStatementParser extends SQLStatementParser { return stmt; } else { SQLSetStatement stmt = new SQLSetStatement(getDbType()); + + if (comments != null) { + stmt.addBeforeComment(comments); + } parseAssignItems(stmt.getItems(), stmt); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java index 9f9d69cb8c..4ed093a062 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java @@ -144,10 +144,14 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis println(); print(") "); print(x.getFrom().getAlias()); + println(); } - for (OdpsInsert insert : x.getItems()) { - println(); + for (int i = 0; i < x.getItems().size(); ++i) { + OdpsInsert insert = x.getItems().get(i); + if (i != 0) { + println(); + } insert.accept(this); } return false; @@ -327,15 +331,30 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis public boolean visit(OdpsUDTFSQLSelectItem x) { x.getExpr().accept(this); - print(" AS ("); + println(); + print("AS ("); + + int aliasSize = x.getAliasList().size(); + if (aliasSize > 5) { + incrementIndent(); + println(); + } - for (int i = 0; i < x.getAliasList().size(); ++i) { + for (int i = 0; i < aliasSize; ++i) { if (i != 0) { - print(", "); + if (aliasSize > 5) { + println(","); + } else { + print(", "); + } } print(x.getAliasList().get(i)); } - + + if (aliasSize > 5) { + decrementIndent(); + println(); + } print(")"); return false; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSetTransactionStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSetTransactionStatement.java index b87ae52734..67321f0c5a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSetTransactionStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSetTransactionStatement.java @@ -22,6 +22,7 @@ import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; public class OracleSetTransactionStatement extends OracleSQLObjectImpl implements OracleStatement { private boolean readOnly = false; + private String dbType; private SQLExpr name; @@ -49,4 +50,12 @@ public class OracleSetTransactionStatement extends OracleSQLObjectImpl implement this.readOnly = readOnly; } + public String getDbType() { + return dbType; + } + + public void setDbType(String dbType) { + this.dbType = dbType; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java index 3a982bd9ad..d2f834f554 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java @@ -232,7 +232,7 @@ public class OracleLexer extends Lexer { token = Token.MULTI_LINE_COMMENT; hasComment = true; if (keepComments) { - commentVal = stringVal; + addComment(stringVal); } } @@ -278,7 +278,7 @@ public class OracleLexer extends Lexer { token = Token.LINE_COMMENT; hasComment = true; if (keepComments) { - commentVal = stringVal; + addComment(stringVal); } endOfComment = isEOF(); return; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerBlockStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerBlockStatement.java index 5f6b699599..0d7fac5045 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerBlockStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerBlockStatement.java @@ -26,6 +26,8 @@ import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; public class SQLServerBlockStatement extends SQLServerObjectImpl implements SQLServerStatement { private List statementList = new ArrayList(); + + private String dbType; public List getStatementList() { return statementList; @@ -43,4 +45,11 @@ public class SQLServerBlockStatement extends SQLServerObjectImpl implements SQL visitor.endVisit(this); } + public String getDbType() { + return dbType; + } + + public void setDbType(String dbType) { + this.dbType = dbType; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerCommitStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerCommitStatement.java index f28c06986b..73d051d377 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerCommitStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerCommitStatement.java @@ -27,6 +27,8 @@ public class SQLServerCommitStatement extends SQLServerObjectImpl implements SQL private SQLExpr transactionName; private SQLExpr delayedDurability; + + private String dbType; public boolean isWork() { return work; @@ -59,4 +61,12 @@ public class SQLServerCommitStatement extends SQLServerObjectImpl implements SQL public void setDelayedDurability(SQLExpr delayedDurability) { this.delayedDurability = delayedDurability; } + + public String getDbType() { + return dbType; + } + + public void setDbType(String dbType) { + this.dbType = dbType; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerDeclareStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerDeclareStatement.java index ad7d765d84..1af4846e98 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerDeclareStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerDeclareStatement.java @@ -26,6 +26,8 @@ import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; public class SQLServerDeclareStatement extends SQLServerObjectImpl implements SQLServerStatement { protected List items = new ArrayList(); + + private String dbType; @Override public void accept0(SQLServerASTVisitor visitor) { @@ -43,4 +45,11 @@ public class SQLServerDeclareStatement extends SQLServerObjectImpl implements SQ this.items = items; } + public String getDbType() { + return dbType; + } + + public void setDbType(String dbType) { + this.dbType = dbType; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerExecStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerExecStatement.java index fd16c16e0a..08b9bbabb2 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerExecStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerExecStatement.java @@ -29,6 +29,7 @@ public class SQLServerExecStatement extends SQLServerObjectImpl implements SQLSe private SQLName returnStatus; private SQLName moduleName; private List parameters = new ArrayList(); + private String dbType; public SQLName getModuleName() { return moduleName; @@ -58,4 +59,12 @@ public class SQLServerExecStatement extends SQLServerObjectImpl implements SQLSe public void setReturnStatus(SQLName returnStatus) { this.returnStatus = returnStatus; } + + public String getDbType() { + return dbType; + } + + public void setDbType(String dbType) { + this.dbType = dbType; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerIfStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerIfStatement.java index 6f73d4a771..15ff204bcd 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerIfStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerIfStatement.java @@ -29,6 +29,7 @@ public class SQLServerIfStatement extends SQLServerObjectImpl implements SQLServ private SQLExpr condition; private List statements = new ArrayList(); private Else elseItem; + private String dbType; @Override public void accept0(SQLServerASTVisitor visitor) { @@ -86,4 +87,11 @@ public class SQLServerIfStatement extends SQLServerObjectImpl implements SQLServ } + public String getDbType() { + return dbType; + } + + public void setDbType(String dbType) { + this.dbType = dbType; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerSetStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerSetStatement.java index 3bf15a6957..569c44afbc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerSetStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerSetStatement.java @@ -24,7 +24,7 @@ import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; public class SQLServerSetStatement extends SQLServerObjectImpl implements SQLServerStatement { private SQLAssignItem item = new SQLAssignItem(); - + private String dbType; public SQLServerSetStatement(){ } @@ -53,4 +53,12 @@ public class SQLServerSetStatement extends SQLServerObjectImpl implements SQLSer } visitor.endVisit(this); } + + public String getDbType() { + return dbType; + } + + public void setDbType(String dbType) { + this.dbType = dbType; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerSetTransactionIsolationLevelStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerSetTransactionIsolationLevelStatement.java index 558467357e..daec126c0d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerSetTransactionIsolationLevelStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerSetTransactionIsolationLevelStatement.java @@ -22,6 +22,7 @@ import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; public class SQLServerSetTransactionIsolationLevelStatement extends SQLServerObjectImpl implements SQLServerStatement { private String level; + private String dbType; @Override public void accept0(SQLServerASTVisitor visitor) { @@ -37,4 +38,11 @@ public class SQLServerSetTransactionIsolationLevelStatement extends SQLServerObj this.level = level; } + public String getDbType() { + return dbType; + } + + public void setDbType(String dbType) { + this.dbType = dbType; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerWaitForStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerWaitForStatement.java index ca59e3f8b7..3bcdbc5356 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerWaitForStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerWaitForStatement.java @@ -30,6 +30,8 @@ public class SQLServerWaitForStatement extends SQLServerObjectImpl implements SQ private SQLStatement statement; private SQLExpr timeout; + + private String dbType; @Override public void accept0(SQLServerASTVisitor visitor) { @@ -74,4 +76,11 @@ public class SQLServerWaitForStatement extends SQLServerObjectImpl implements SQ this.timeout = timeout; } + public String getDbType() { + return dbType; + } + + public void setDbType(String dbType) { + this.dbType = dbType; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java index 3732551a40..3450bb5777 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java @@ -107,7 +107,7 @@ public class SQLServerLexer extends Lexer { token = Token.MULTI_LINE_COMMENT; hasComment = true; if (keepComments) { - commentVal = stringVal; + addComment(stringVal); } } @@ -149,7 +149,7 @@ public class SQLServerLexer extends Lexer { token = Token.LINE_COMMENT; hasComment = true; if (keepComments) { - commentVal = stringVal; + addComment(stringVal); } endOfComment = isEOF(); diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index 9024b19208..343505f306 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -35,7 +35,9 @@ import static com.alibaba.druid.sql.parser.Token.RPAREN; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; /** * @author wenshao @@ -57,7 +59,7 @@ public class Lexer { protected String stringVal; - protected String commentVal; + protected List comments = new ArrayList(2); protected boolean skipComment = true; @@ -288,6 +290,7 @@ public class Lexer { public final void nextToken() { bufPos = 0; hasComment = false; + comments = null; for (;;) { if (isWhitespace(ch)) { @@ -803,7 +806,7 @@ public class Lexer { token = Token.MULTI_LINE_COMMENT; hasComment = true; if (keepComments) { - commentVal = stringVal; + addComment(stringVal); } if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) { @@ -851,7 +854,7 @@ public class Lexer { token = Token.LINE_COMMENT; hasComment = true; if (keepComments) { - commentVal = stringVal; + addComment(stringVal); } if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) { @@ -1017,8 +1020,26 @@ public class Lexer { return stringVal; } - public final String commentVal() { - return commentVal; + public final String readAndResetCommentValue() { + if (comments.size() == 0) { + return null; + } + + String val = comments.get(0); + + this.hasComment = false; + this.comments.clear(); + + return val; + } + + public final List readAndResetComments() { + List comments = this.comments; + + this.hasComment = false; + this.comments = null; + + return comments; } private boolean isOperator(char ch) { @@ -1171,4 +1192,10 @@ public class Lexer { return true; } + protected void addComment(String comment) { + if (comments == null) { + comments = new ArrayList(2); + } + comments.add(stringVal); + } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index d887fb950e..52dfbcc0a7 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1180,7 +1180,7 @@ public class SQLExprParser extends SQLParser { for (;;) { if (lexer.token() == Token.AND || lexer.token() == Token.AMPAMP) { if (lexer.isKeepComments() && lexer.hasComment()) { - expr.addAfterComment(lexer.commentVal()); + expr.addAfterComment(lexer.readAndResetComments()); } lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java index b552092298..1058248c5d 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java @@ -162,7 +162,7 @@ public class SQLSelectParser extends SQLParser { SQLSelectQueryBlock queryBlock = new SQLSelectQueryBlock(); if (lexer.hasComment() && lexer.isKeepComments()) { - queryBlock.addBeforeComment(lexer.commentVal()); + queryBlock.addBeforeComment(lexer.readAndResetCommentValue()); } accept(Token.SELECT); @@ -243,7 +243,7 @@ public class SQLSelectParser extends SQLParser { if (lexer.hasComment() && lexer.isKeepComments() // && lexer.token() != Token.INSERT // odps multi-insert ) { - where.addAfterComment(lexer.commentVal()); + where.addAfterComment(lexer.readAndResetCommentValue()); } queryBlock.setWhere(where); @@ -341,7 +341,7 @@ public class SQLSelectParser extends SQLParser { SQLTableSource tableSrc = parseTableSourceRest(tableReference); if (lexer.hasComment() && lexer.isKeepComments()) { - tableSrc.addAfterComment(lexer.commentVal()); + tableSrc.addAfterComment(lexer.readAndResetComments()); } return tableSrc; diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index b70ed071bd..25f79f7c29 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -103,10 +103,6 @@ public class SQLStatementParser extends SQLParser { protected int parseValuesSize = 3; - protected List comments; - - protected CommentCallback commentCallBack = new CommentCallback(); - public SQLStatementParser(String sql){ this(sql, null); } @@ -147,42 +143,23 @@ public class SQLStatementParser extends SQLParser { } public void parseStatementList(List statementList, int max) { - List 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; - } - if (lexer.token() == Token.END) { + if (lexer.token() == Token.EOF || lexer.token() == Token.END) { + if (lexer.isKeepComments() && lexer.hasComment() && statementList.size() > 0) { + SQLStatement stmt = statementList.get(statementList.size() - 1); + stmt.addAfterComment(lexer.readAndResetComments()); + } return; } 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); @@ -1988,22 +1965,4 @@ 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(); - } - comments.add(comment); - } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/SQLUtilsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/SQLUtilsTest.java index 8566c200e2..0d6f8070d5 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/SQLUtilsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/SQLUtilsTest.java @@ -36,7 +36,8 @@ public class SQLUtilsTest extends TestCase { String expected = "SELECT lottery_notice_issue, lottery_notice_date, lottery_notice_result" + "\nFROM tb_lottery_notice" + "\nWHERE lottery_type_id = 8" + "\n\tAND lottery_notice_issue <= 2014066" + "\nUNION ALL" - + "\nSELECT NULL, NULL, NULL, NULL, NULL" + "\n\t, NULL"; + + "\nSELECT NULL, NULL, NULL, NULL, NULL" // + + "\n\t, NULL# and lottery_notice_issue>=2014062 order by lottery_notice_issue desc"; Assert.assertEquals(expected, formattedSql); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest10.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest10.java new file mode 100644 index 0000000000..2e24125699 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest10.java @@ -0,0 +1,28 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsFormatCommentTest10 extends TestCase { + public void test_column_comment() throws Exception { + String sql = "insert overwrite table ttt partition (ds='20150710',hh='07') select tt_split(content, 60) as (f0, f1, f2, f3,f4,f5,f6) from xxx;"; + Assert.assertEquals("INSERT OVERWRITE TABLE ttt PARTITION (ds='20150710', hh='07')" + + "\nSELECT tt_split(content, 60)" + + "\n\tAS (" + + "\n\t\tf0," + + "\n\t\tf1," + + "\n\t\tf2," + + "\n\t\tf3," + + "\n\t\tf4," + + "\n\t\tf5," + + "\n\t\tf6" + + "\n\t)" + + "\nFROM xxx" + + "\n;", SQLUtils.formatOdps(sql)); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest7.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest7.java new file mode 100644 index 0000000000..c1d3265d10 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest7.java @@ -0,0 +1,24 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsFormatCommentTest7 extends TestCase { + public void test_column_comment() throws Exception { + String sql = "--这里是注释" // + + "\nselect * from table1;" // + + "\nselect * from table2;;" + ;// + Assert.assertEquals("--这里是注释" + + "\nSELECT *" + + "\nFROM table1;" + + "\nSELECT *" + + "\nFROM table2" + + "\n;", SQLUtils.formatOdps(sql)); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest8.java new file mode 100644 index 0000000000..507d31d365 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest8.java @@ -0,0 +1,27 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsFormatCommentTest8 extends TestCase { + public void test_column_comment() throws Exception { + String sql = "select * from table1;--comment1 goes here" // + + "\n" // + + "\nselect * from table2;;select * from table3;" // + + "\n--comment2 goes here" + ;// + Assert.assertEquals("SELECT *" + + "\nFROM table1;" + + "\n--comment1 goes here" + + "\nSELECT *" + + "\nFROM table2;" + + "\nSELECT *" + + "\nFROM table3" + + "\n;--comment2 goes her", SQLUtils.formatOdps(sql)); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest9.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest9.java new file mode 100644 index 0000000000..51017e1e20 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest9.java @@ -0,0 +1,20 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsFormatCommentTest9 extends TestCase { + public void test_column_comment() throws Exception { + String sql = "insert overwrite table ttt partition (ds='20150710',hh='07') select tt_split(content, 60) as (f0, f1, f2, f3) from xxx;"; + Assert.assertEquals("INSERT OVERWRITE TABLE ttt PARTITION (ds='20150710', hh='07')" + + "\nSELECT tt_split(content, 60)" + + "\n\tAS (f0, f1, f2, f3)" + + "\nFROM xxx" + + "\n;", SQLUtils.formatOdps(sql)); + } + + +}