diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java index 0cfc491c7b..efdacec0dd 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java @@ -15,6 +15,8 @@ */ package com.alibaba.druid.sql.parser; +import java.util.List; + import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLConstraint; @@ -33,7 +35,17 @@ public class SQLCreateTableParser extends SQLDDLParser { } public SQLCreateTableStatement parseCrateTable() { - return parseCrateTable(true); + List comments = null; + if (lexer.isKeepComments() && lexer.hasComment()) { + comments = lexer.readAndResetComments(); + } + + SQLCreateTableStatement stmt = parseCrateTable(true); + if (comments != null) { + stmt.addBeforeComment(comments); + } + + return stmt; } public SQLCreateTableStatement parseCrateTable(boolean acceptCreate) { 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 e02940daa6..fd7d4acb30 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -25,7 +25,6 @@ import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint; @@ -190,6 +189,7 @@ public class SQLStatementParser extends SQLParser { } if (lexer.token() == (Token.CREATE)) { + statementList.add(parseCreate()); continue; } @@ -1648,6 +1648,11 @@ public class SQLStatementParser extends SQLParser { public SQLStatement parseCreate() { char markChar = lexer.current(); int markBp = lexer.bp(); + + List comments = null; + if (lexer.isKeepComments() && lexer.hasComment()) { + comments = lexer.readAndResetComments(); + } accept(Token.CREATE); @@ -1655,7 +1660,13 @@ public class SQLStatementParser extends SQLParser { if (token == Token.TABLE || identifierEquals("GLOBAL")) { SQLCreateTableParser createTableParser = getSQLCreateTableParser(); - return createTableParser.parseCrateTable(false); + SQLCreateTableStatement stmt = createTableParser.parseCrateTable(false); + + if (comments != null) { + stmt.addBeforeComment(comments); + } + + return stmt; } else if (token == Token.INDEX // || token == Token.UNIQUE // || identifierEquals("NONCLUSTERED") // sql server diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest30.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest30.java new file mode 100644 index 0000000000..c1fd5893d0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest30.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 OdpsFormatCommentTest30 extends TestCase { + public void test_drop_function() throws Exception { + String sql = "--啊实打实大啊实打实大" + + "\nCREATE TABLE xxx (" + + "\n aa STRING," + + "\n asdasd STRING," + + "\n asasd STRING" + + "\n);"; + Assert.assertEquals("--啊实打实大啊实打实大" + + "\nCREATE TABLE xxx (" + + "\n\taa STRING," + + "\n\tasdasd STRING," + + "\n\tasasd STRING" + + "\n);", SQLUtils.formatOdps(sql)); + } +}