From bff932b81a3d8c713f7d9f9313fbeab476fdd0af Mon Sep 17 00:00:00 2001 From: Yako Date: Sun, 10 May 2015 22:03:45 +0800 Subject: [PATCH] fix issue #818 --- .../ast/statement/MySqlDescribeStatement.java | 11 ++++++ .../mysql/parser/MySqlStatementParser.java | 4 ++- .../mysql/visitor/MySqlOutputVisitor.java | 4 +++ .../mysql/visitor/MySqlSchemaStatVisitor.java | 6 +++- .../bvt/sql/mysql/MySqlDescribteTest.java | 34 ++++++++++++++++--- 5 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDescribeStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDescribeStatement.java index 4ff0490af1..4a060a4281 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDescribeStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDescribeStatement.java @@ -22,9 +22,12 @@ public class MySqlDescribeStatement extends MySqlStatementImpl { private SQLName object; + private SQLName colName; + public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, object); + acceptChild(visitor, colName); } visitor.endVisit(this); } @@ -37,4 +40,12 @@ public class MySqlDescribeStatement extends MySqlStatementImpl { this.object = object; } + public SQLName getColName() { + return colName; + } + + public void setColName(SQLName colName) { + this.colName = colName; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 6a76e7f088..5a96896c74 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -711,7 +711,9 @@ public class MySqlStatementParser extends SQLStatementParser { MySqlDescribeStatement stmt = new MySqlDescribeStatement(); stmt.setObject(this.exprParser.name()); - + if (lexer.token() == Token.IDENTIFIER) { + stmt.setColName(this.exprParser.name()); + } return stmt; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index 356b2ee15c..5dedcc356d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -1696,6 +1696,10 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV public boolean visit(MySqlDescribeStatement x) { print("DESC "); x.getObject().accept(this); + print(" "); + if (x.getColName() != null) { + x.getColName().accept(this); + } return false; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index f48d132f9c..4a39c0a605 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -546,7 +546,11 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public boolean visit(MySqlDescribeStatement x) { - getTableStat(x.getObject().toString()); + String table = x.getObject().toString(); + getTableStat(table); + if (x.getColName() != null) { + addColumn(table, x.getColName().toString()); + } return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDescribteTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDescribteTest.java index 80832dd6ca..98e28dcb8c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDescribteTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDescribteTest.java @@ -24,6 +24,7 @@ import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; public class MySqlDescribteTest extends MysqlTest { @@ -44,14 +45,39 @@ public class MySqlDescribteTest extends MysqlTest { System.out.println("fields : " + visitor.getColumns()); System.out.println("coditions : " + visitor.getConditions()); System.out.println("orderBy : " + visitor.getOrderByColumns()); - + Assert.assertEquals(1, visitor.getTables().size()); Assert.assertEquals(0, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("City"))); -// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); - -// Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t2"))); + + // Assert.assertTrue(visitor.getColumns().contains(new Column("t2", "id"))); + } + + public void test_1() throws Exception { + String sql = "desc student sname"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(1, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getColumns().contains(new Column("student", "sname"))); } }