diff --git a/pom.xml b/pom.xml index 1d568453fb..01a17f788f 100644 --- a/pom.xml +++ b/pom.xml @@ -2,13 +2,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.alibaba druid 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 e245fc804b..e6b2353ffc 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -172,7 +172,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { columnName = handleName(columnName); Column column = this.getColumn(tableName, columnName); - if (column == null) { + if (column == null && columnName != null) { column = new Column(tableName, columnName); columns.add(column); } @@ -257,7 +257,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public Map getAliasMap() { return aliasMap; } - + public void setCurrentTable(String table) { this.currentTable = table; } @@ -316,10 +316,15 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } + String identName = x.getName(); + if (aliasMap != null && aliasMap.containsKey(identName) && aliasMap.get(identName) == null) { + return false; + } + if (currentTable != null) { - addOrderByColumn(currentTable, x.getName(), x); + addOrderByColumn(currentTable, identName, x); } else { - addOrderByColumn("UNKOWN", x.getName(), x); + addOrderByColumn("UNKOWN", identName, x); } return false; } @@ -900,7 +905,10 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } if (currentTable != null) { - addColumn(currentTable, "*"); + Column column = addColumn(currentTable, "*"); + if (isParentSelectItem(x.getParent())) { + column.setSelec(true); + } } return false; } @@ -919,6 +927,10 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public Column getColumn(String tableName, String columnName) { for (Column column : this.columns) { + if (aliasMap != null && aliasMap.containsKey(columnName) && aliasMap.get(columnName) == null) { + return null; + } + if (StringUtils.equalsIgnoreCase(tableName, column.getTable()) && StringUtils.equalsIgnoreCase(columnName, column.getName())) { return column; @@ -1037,8 +1049,20 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLSelectItem x) { - x.getExpr().setParent(x); - return true; + x.getExpr().accept(this); + + String alias = x.getAlias(); + + Map aliasMap = this.getAliasMap(); + if (alias != null && (!alias.isEmpty()) && aliasMap != null) { + if (x.getExpr() instanceof SQLName) { + aliasMap.put(alias, x.getExpr().toString()); + } else { + aliasMap.put(alias, null); + } + } + + return false; } public void endVisit(SQLSelect x) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_0.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_0.java index ca9c474860..efc9527845 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_0.java @@ -47,13 +47,12 @@ public class MySqlSelectTest_0 extends MysqlTest { System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(3, visitor.getColumns().size()); + Assert.assertEquals(2, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("mytable"))); Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "last_name"))); Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "first_name"))); - Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "full_name"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_18.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_18.java index c76d02e596..5138383e60 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_18.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_18.java @@ -23,11 +23,26 @@ import com.alibaba.druid.sql.MysqlTest; 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.Column; public class MySqlSelectTest_18 extends MysqlTest { public void test_0() throws Exception { - String sql = "SELECT host.id as id, host.item_id as itemId, host.node_id as nodeId, host.node_type as nodeType, host.begin_time as beginTime, host.end_time as endTime, host.gmt_create as gmtCreate, host.gmt_modify as gmtModify, host.reason as reason, host.creator_id as creatorId, host.modifier_id as modifierId, user.name as creator, user.name as modifier, user.nick_name as nickName FROM notice_close_node host left join sys_user user on user.id = host.modifier_id"; + String sql = "SELECT host.id as id" // + + ", host.item_id as itemId" // + + ", host.node_id as nodeId" // + + ", host.node_type as nodeType" // + + ", host.begin_time as beginTime" // + + ", host.end_time as endTime" // + + ", host.gmt_create as gmtCreate" // + + ", host.gmt_modify as gmtModify" // + + ", host.reason as reason" // + + ", host.creator_id as creatorId" // + + ", host.modifier_id as modifierId" // + + ", user.name as creator" // + + ", user.name as modifier" // + + ", user.nick_name as nickName " // + + " FROM notice_close_node host left join sys_user user on user.id = host.modifier_id"; MySqlStatementParser parser = new MySqlStatementParser(sql); List statementList = parser.parseStatementList(); @@ -45,8 +60,10 @@ public class MySqlSelectTest_18 extends MysqlTest { System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(2, visitor.getTables().size()); - Assert.assertEquals(14, visitor.getColumns().size()); + Assert.assertEquals(15, visitor.getColumns().size()); Assert.assertEquals(2, visitor.getConditions().size()); + Assert.assertTrue(visitor.getColumns().contains(new Column("sys_user", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("notice_close_node", "modifier_id"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_20.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_20.java index 34e6d4e287..128906fb11 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_20.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_20.java @@ -24,11 +24,15 @@ import com.alibaba.druid.sql.SQLUtils; 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.Column; public class MySqlSelectTest_20 extends MysqlTest { public void test_0() throws Exception { - String sql = "select bsvariety,max(bsh) as bsh,min(bsl) as bsl from exchange_market_info where bsdate>date_sub(now(),interval 1 day) group by bsvariety desc;"; + String sql = "select bsvariety, max(bsh) as bsh, min(bsl) as bsl " + + " from exchange_market_info " + + " where bsdate>date_sub(now(),interval 1 day)" + + " group by bsvariety desc;"; MySqlStatementParser parser = new MySqlStatementParser(sql); @@ -46,6 +50,11 @@ public class MySqlSelectTest_20 extends MysqlTest { System.out.println("coditions : " + visitor.getConditions()); System.out.println("orderBy : " + visitor.getOrderByColumns()); + Assert.assertTrue(visitor.getColumns().contains(new Column("exchange_market_info", "bsvariety"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("exchange_market_info", "bsh"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("exchange_market_info", "bsl"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("exchange_market_info", "bsdate"))); + Assert.assertEquals(1, visitor.getTables().size()); Assert.assertEquals(4, visitor.getColumns().size()); Assert.assertEquals(1, visitor.getConditions().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/udf/ExportSelectListColumnsTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/udf/ExportSelectListColumnsTest2.java new file mode 100644 index 0000000000..8e574cf9d3 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/udf/ExportSelectListColumnsTest2.java @@ -0,0 +1,22 @@ +package com.alibaba.druid.bvt.sql.odps.udf; + +import org.junit.Assert; + +import com.alibaba.druid.support.opds.udf.ExportSelectListColumns; + +import junit.framework.TestCase; + +public class ExportSelectListColumnsTest2 extends TestCase { + + private ExportSelectListColumns udf = new ExportSelectListColumns(); + + public void test_0() throws Exception { + String sql = "SELECT * " + + "\n FROM fund_base_cv_ad_auction_ocr_pv_tfs a" + + "\n WHERE ds=20150819"; + + String text = udf.evaluate(sql, "odps"); + + Assert.assertEquals("fund_base_cv_ad_auction_ocr_pv_tfs.*", text); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest3.java index d32ea1eeaa..ba0e033d26 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest3.java @@ -51,7 +51,7 @@ public class OracleMergeTest3 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("tab$"))); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("sys.mon_mods_all$"))); - Assert.assertEquals(15, visitor.getColumns().size()); + Assert.assertEquals(16, visitor.getColumns().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest6.java index df622d975f..2dc8e70c82 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest6.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest6.java @@ -58,7 +58,7 @@ public class OracleMergeTest6 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("console_stb_ipstatus"))); - Assert.assertEquals(7, visitor.getColumns().size()); + Assert.assertEquals(6, visitor.getColumns().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest19.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest19.java index 142cc880e0..24fdf91a73 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest19.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest19.java @@ -61,7 +61,7 @@ public class OracleSelectTest19 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("sys.dba_data_files"))); - Assert.assertEquals(17, visitor.getColumns().size()); + Assert.assertEquals(18, visitor.getColumns().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest21.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest21.java index ecbdb95d48..3d3e6fc241 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest21.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest21.java @@ -24,6 +24,7 @@ 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; +import com.alibaba.druid.stat.TableStat.Column; public class OracleSelectTest21 extends OracleTest { @@ -66,7 +67,16 @@ public class OracleSelectTest21 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("DBA_HIST_SYSTEM_EVENT"))); - Assert.assertEquals(13, visitor.getColumns().size()); + Assert.assertTrue(visitor.getColumns().contains(new Column("DBA_HIST_SYSTEM_EVENT", "EVENT_NAME"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("DBA_HIST_SYSTEM_EVENT", "TOTAL_WAITS"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("DBA_HIST_SYSTEM_EVENT", "TIME_WAITED_MICRO"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("DBA_HIST_SYSTEM_EVENT", "SNAP_ID"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("DBA_HIST_SYSTEM_EVENT", "INSTANCE_NUMBER"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("DBA_HIST_SYSTEM_EVENT", "DBID"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("DBA_HIST_SYSTEM_EVENT", "WAIT_CLASS"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("DBA_HIST_SYSTEM_EVENT", "EVENT_ID"))); + + Assert.assertEquals(9, visitor.getColumns().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest27.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest27.java index 13f4bf201c..279e1c72c7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest27.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest27.java @@ -55,7 +55,7 @@ public class OracleSelectTest27 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("search.retl_table_config_search"))); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("sys.col$"))); - Assert.assertEquals(20, visitor.getColumns().size()); + Assert.assertEquals(19, visitor.getColumns().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest38.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest38.java index 60acc98140..04e2648344 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest38.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest38.java @@ -79,7 +79,7 @@ public class OracleSelectTest38 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("acduser.vw_acd_info"))); - Assert.assertEquals(15, visitor.getColumns().size()); + Assert.assertEquals(12, visitor.getColumns().size()); Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "sglx"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest.java b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest.java index b9fd10d44c..8c1a355862 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/schemaStat/SchemaStatTest.java @@ -3,6 +3,8 @@ package com.alibaba.druid.bvt.sql.schemaStat; import org.junit.Assert; import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.odps.parser.OdpsStatementParser; +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsSchemaStatVisitor; import com.alibaba.druid.sql.parser.SQLStatementParser; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; @@ -10,14 +12,19 @@ import junit.framework.TestCase; public class SchemaStatTest extends TestCase { public void test_schemaStat() throws Exception { - String sql = "select id as orderId from t_order order by orderId"; + String sql = "select " + + " create_time_dd as 来电日期" + + " from alisec_app.adl_tb_wing_rubbish_laidian_new_reason_realname_fdt " + + " order by 来电日期 desc limit 30;"; - SQLStatementParser parser = new SQLStatementParser(sql); + SQLStatementParser parser = new OdpsStatementParser(sql); SQLStatement stmt = parser.parseStatementList().get(0); - SchemaStatVisitor statVisitor = new SchemaStatVisitor(); + SchemaStatVisitor statVisitor = new OdpsSchemaStatVisitor(); stmt.accept(statVisitor); + System.out.println(statVisitor.getColumns()); + Assert.assertEquals(1, statVisitor.getColumns().size()); } }