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());
}
}