diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsCreateTableParser.java index 1013714fd5..7d70490ddf 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsCreateTableParser.java @@ -108,10 +108,17 @@ public class OdpsCreateTableParser extends SQLCreateTableParser { SQLColumnDefinition column = this.exprParser.parseColumn(); stmt.getPartitionColumns().add(column); + if (lexer.isKeepComments() && lexer.hasComment()) { + column.addAfterComment(lexer.readAndResetComments()); + } + if (!(lexer.token() == (Token.COMMA))) { break; } else { lexer.nextToken(); + if (lexer.isKeepComments() && lexer.hasComment()) { + column.addAfterComment(lexer.readAndResetComments()); + } } } 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 6c49023841..ce5cefcabf 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 @@ -24,6 +24,7 @@ import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; @@ -93,13 +94,27 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis int partitionSize = x.getPartitionColumns().size(); if (partitionSize > 0) { println(); - print("PARTITIONED ("); + print("PARTITIONED BY ("); + incrementIndent(); + println(); for (int i = 0; i < partitionSize; ++i) { - if (i != 0) { - print(", "); + SQLColumnDefinition column = x.getPartitionColumns().get(i); + column.accept(this); + + if (i != partitionSize - 1) { + print(','); + } + if (this.isPrettyFormat() && column.hasAfterComment()) { + print(' '); + printComment(column.getAfterCommentsDirect(), "\n"); + } + + if (i != partitionSize - 1) { + println(); } - x.getPartitionColumns().get(i).accept(this); } + decrementIndent(); + println(); print(")"); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 9539d79236..2eecb9d370 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -989,7 +989,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab print(" COMMENT "); x.getComment().accept(this); } - + return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest.java index 58db11aa1f..8d3fa00d1c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest.java @@ -31,7 +31,10 @@ public class OdpsCreateTableTest extends TestCase { + "\n\ttotal_price DOUBLE"// + "\n)"// + "\nCOMMENT 'xxxx'"// - + "\nPARTITIONED (sale_date STRING, region STRING)"// + + "\nPARTITIONED BY (" + + "\n\tsale_date STRING," + + "\n\tregion STRING" + + "\n)"// + "\nLIFECYCLE 5", output); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest15.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest15.java new file mode 100644 index 0000000000..8a2ace58a7 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest15.java @@ -0,0 +1,23 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsFormatCommentTest15 extends TestCase { + public void test_column_comment() throws Exception { + String sql = "create table t1 (f0 bigint) partitioned by (ds string, hh string);"; + Assert.assertEquals("CREATE TABLE t1t1 (" + + "\n\tf0 bigint" + + "\n)" + + "\nPARTITIONED BY (" + + "\n\tds string," + + "\n\thh string" + + "\n)" + + "\n;", SQLUtils.formatOdps(sql)); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest16.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest16.java new file mode 100644 index 0000000000..d2e1b94397 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest16.java @@ -0,0 +1,26 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsFormatCommentTest16 extends TestCase { + public void test_column_comment() throws Exception { + String sql = "create table t1 (f0 bigint) partitioned by (" + + "ds string, -- c_1" + + "\nhh string -- c_2" + + "\n);"; + Assert.assertEquals("CREATE TABLE t1t1 (" + + "\n\tf0 bigint" + + "\n)" + + "\nPARTITIONED BY (" + + "\n\tds string, -- c_1" + + "\n\thh string -- c_2" + + "\n)" + + "\n;", SQLUtils.formatOdps(sql)); + } + + +}