diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataSchemaStatVisitor.java index 7b90268d99..79f54d6438 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataSchemaStatVisitor.java @@ -17,12 +17,17 @@ package com.alibaba.druid.sql.dialect.teradata.visitor; import java.util.Map; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; import com.alibaba.druid.sql.dialect.teradata.ast.expr.TeradataAnalytic; import com.alibaba.druid.sql.dialect.teradata.ast.expr.TeradataAnalyticWindowing; import com.alibaba.druid.sql.dialect.teradata.ast.expr.TeradataIntervalExpr; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.stat.TableStat.Column; import com.alibaba.druid.util.JdbcUtils; public class TeradataSchemaStatVisitor extends SchemaStatVisitor implements TeradataASTVisitor { @@ -84,5 +89,34 @@ public class TeradataSchemaStatVisitor extends SchemaStatVisitor implements Tera } + public boolean visit(SQLSelectItem x) { + x.getExpr().accept(this); + + String alias = x.getAlias(); + + Map aliasMap = this.getAliasMap(); + if (alias != null && (!alias.isEmpty()) && aliasMap != null) { + if (x.getExpr() instanceof SQLName) { + putAliasMap(aliasMap, alias, x.getExpr().toString()); + } else if (x.getExpr() instanceof SQLAggregateExpr + || x.getExpr() instanceof SQLMethodInvokeExpr) { + TeradataSchemaStatVisitor visitor = new TeradataSchemaStatVisitor(); + x.getExpr().accept(visitor); + for (Column col : visitor.getColumns()) { + if (col.getTable().equalsIgnoreCase("unknown") + || this.getCurrentTable() != null) { + col.setTable(this.currentTable); + } + putAliasMap(aliasMap, alias, col.toString()); + } + } + else { + putAliasMap(aliasMap, alias, null); + } + } + + return false; + } + }