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 66610283de..fd712791c8 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 @@ -16,6 +16,7 @@ import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; @@ -239,6 +240,12 @@ public class MySqlSchemaStatVisitor extends MySqlASTVisitorAdapter { } public boolean visit(SQLSelectQueryBlock x) { + + if (x.getFrom() instanceof SQLSubqueryTableSource) { + x.getFrom().accept(this); + return false; + } + x.putAttribute("_original_use_mode", modeLocal.get()); modeLocal.set(Mode.Select); diff --git a/src/test/java/com/alibaba/druid/sql/mysql/bvt/visitor/MySqlSchemaStatVisitorTest_Subquery.java b/src/test/java/com/alibaba/druid/sql/mysql/bvt/visitor/MySqlSchemaStatVisitorTest_Subquery.java new file mode 100644 index 0000000000..773f66674a --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/mysql/bvt/visitor/MySqlSchemaStatVisitorTest_Subquery.java @@ -0,0 +1,40 @@ +package com.alibaba.druid.sql.mysql.bvt.visitor; + +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; + +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.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor.Column; + +public class MySqlSchemaStatVisitorTest_Subquery extends TestCase { + + public void test_0() throws Exception { + String sql = "SELECT id2, name2 FROM (select id, name from users limit 10) a"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println(sql); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getFields()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(true, visitor.getTables().containsKey("users")); + + Assert.assertEquals(2, visitor.getFields().size()); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "id"))); + Assert.assertEquals(true, visitor.getFields().contains(new Column("users", "name"))); + + } + +}