diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index 7631a2a86b..20cf450a29 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -94,6 +94,8 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { if (subQueryMap.containsKey(owner)) { return false; } + + owner = aliasWrap(owner); if (owner != null) { orderByColumns.add(new Column(owner, x.getName())); @@ -417,7 +419,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { if (subQueryMap.containsKey(owner)) { return false; } - + + owner = aliasWrap(owner); + if (owner != null) { Column column = new Column(owner, x.getName()); columns.add(column); @@ -426,6 +430,15 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } return false; } + + protected String aliasWrap(String name) { + Map aliasMap = aliasLocal.get(); + if (aliasMap.containsKey(name)) { + return aliasMap.get(name); + } + + return name; + } protected Column handleSubQueryColumn(String owner, String alias) { SQLObject query = subQueryMap.get(owner); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest10.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest10.java new file mode 100644 index 0000000000..50fa8cc563 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest10.java @@ -0,0 +1,47 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleSelectTest10 extends OracleTest { + + public void test_0() throws Exception { + String sql = "SELECT * FROM pivot_table" + // + " UNPIVOT INCLUDE NULLS " + // + " (yearly_total FOR order_mode IN (store AS 'direct', internet AS 'online'))" + // + " ORDER BY year, order_mode;"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(statementList)); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("pivot_table"))); + + Assert.assertEquals(3, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +}