diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataASTVisitor.java index c4a3c8e48c..46e9b2fbdb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataASTVisitor.java @@ -15,8 +15,21 @@ */ package com.alibaba.druid.sql.dialect.teradata.visitor; +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +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.visitor.SQLASTVisitor; public interface TeradataASTVisitor extends SQLASTVisitor { + boolean visit(TeradataAnalyticWindowing x); + + void endVisit(TeradataAnalyticWindowing x); + + boolean visit(TeradataAnalytic x); + + boolean visit(SQLSelectQueryBlock x); + + boolean visit(SQLSelect x); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataASTVisitorAdapter.java index 3dcdb0e84b..d7380d2bea 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataASTVisitorAdapter.java @@ -15,8 +15,28 @@ */ package com.alibaba.druid.sql.dialect.teradata.visitor; +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.visitor.SQLASTVisitorAdapter; public class TeradataASTVisitorAdapter extends SQLASTVisitorAdapter implements TeradataASTVisitor { + @Override + public boolean visit(TeradataAnalyticWindowing x) { + // TODO Auto-generated method stub + return true; + } + + @Override + public void endVisit(TeradataAnalyticWindowing x) { + // TODO Auto-generated method stub + + } + + @Override + public boolean visit(TeradataAnalytic x) { + // TODO Auto-generated method stub + return false; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataOutputVisitor.java index bbedbacee2..6960a77d60 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataOutputVisitor.java @@ -15,6 +15,15 @@ */ package com.alibaba.druid.sql.dialect.teradata.visitor; +import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.ast.SQLOrderBy; +import com.alibaba.druid.sql.ast.SQLSetQuantifier; +import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +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.stmt.TeradataSelectQueryBlock; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; public class TeradataOutputVisitor extends SQLASTOutputVisitor implements TeradataASTVisitor { @@ -22,5 +31,131 @@ public class TeradataOutputVisitor extends SQLASTOutputVisitor implements Terada public TeradataOutputVisitor(Appendable appender){ super(appender); } + + public boolean visit(TeradataAnalytic x) { + print0(ucase ? "OVER (" : "over ("); + + boolean space = false; + if (x.getPartitionBy().size() > 0) { + print0(ucase ? "PARTITION BY " : "partition by "); + printAndAccept(x.getPartitionBy(), ", "); + space = true; + } + + if (x.getOrderBy() != null) { + if (space) { + print(' '); + } + x.getOrderBy().accept(this); + space = true; + } + + if (x.getWindowing() != null) { + if (space) { + print(' '); + } + x.getWindowing().accept(this); + } + + print(')'); + + return false; + } + + @Override + public boolean visit(TeradataAnalyticWindowing x) { + print0(x.getType().name().toUpperCase()); + print(' '); + x.getExpr().accept(this); + return false; + } + + @Override + public void endVisit(TeradataAnalyticWindowing x) { + // TODO Auto-generated method stub + + } + + public boolean visit(SQLSelectQueryBlock select) { + if(select instanceof TeradataSelectQueryBlock) { + return visit((TeradataSelectQueryBlock) select); + } + + return super.visit(select); + } + + public boolean visit(TeradataSelectQueryBlock x) { + if (x.getOrderBy() != null) { + x.getOrderBy().setParent(x); + } + + print0(ucase ? "SELECT " : "select "); + + if (SQLSetQuantifier.ALL == x.getDistionOption()) { + print0(ucase ? "ALL " : "all "); + } else if (SQLSetQuantifier.DISTINCT == x.getDistionOption()) { + print0(ucase ? "DISTINCT " : "distinct "); + } else if (SQLSetQuantifier.UNIQUE == x.getDistionOption()) { + print0(ucase ? "UNIQUE " : "unique "); + } + + printSelectList(x.getSelectList()); + + if (x.getInto() != null) { + println(); + print0(ucase ? "INTO " : "into "); + x.getInto().accept(this); + } + + println(); + print0(ucase ? "FROM " : "from "); + if (x.getFrom() == null) { + print0(ucase ? "DUAL" : "dual"); + } else { + x.getFrom().setParent(x); + x.getFrom().accept(this); + } + + if (x.getWhere() != null) { + println(); + print0(ucase ? "WHERE " : "where "); + x.getWhere().setParent(x); + x.getWhere().accept(this); + } + + if (x.getGroupBy() != null) { + println(); + x.getGroupBy().accept(this); + } + + if (x.getOrderBy() != null) { + println(); + x.getOrderBy().accept(this); + } + + return false; + + } + + public boolean visit(SQLSelect x) { + return super.visit(x); + } + + protected void visitAggreateRest(SQLAggregateExpr aggregateExpr) { + { + SQLOrderBy value = (SQLOrderBy) aggregateExpr.getAttribute("ORDER BY"); + if (value != null) { + print(' '); + ((SQLObject) value).accept(this); + } + } + { + Object value = aggregateExpr.getAttribute("SEPARATOR"); + if (value != null) { + print0(ucase ? " SEPARATOR " : " separator "); + ((SQLObject) value).accept(this); + } + } + } } 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 43472f728c..141732f44f 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 @@ -15,6 +15,8 @@ */ package com.alibaba.druid.sql.dialect.teradata.visitor; +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.visitor.SchemaStatVisitor; import com.alibaba.druid.util.JdbcUtils; @@ -22,7 +24,25 @@ public class TeradataSchemaStatVisitor extends SchemaStatVisitor implements Tera @Override public String getDbType() { - return JdbcUtils.POSTGRESQL; + return JdbcUtils.TERADATA; } + @Override + public boolean visit(TeradataAnalyticWindowing x) { + // TODO Auto-generated method stub + return true; + } + + @Override + public void endVisit(TeradataAnalyticWindowing x) { + // TODO Auto-generated method stub + + } + + @Override + public boolean visit(TeradataAnalytic x) { + // TODO Auto-generated method stub + return false; + } + }