diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index 53bad0bf76..26a52a4e87 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -46,8 +46,6 @@ import com.alibaba.druid.sql.dialect.postgresql.visitor.PGOutputVisitor; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerOutputVisitor; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; -import com.alibaba.druid.sql.dialect.teradata.visitor.TeradataOutputVisitor; -import com.alibaba.druid.sql.dialect.teradata.visitor.TeradataSchemaStatVisitor; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLParserUtils; @@ -173,14 +171,6 @@ public class SQLUtils { return toSQLString(sqlObject, JdbcConstants.SQL_SERVER, option); } - public static String toTeradataString(SQLObject sqlObject) { - return toTeradataString(sqlObject, null); - } - - public static String toTeradataString(SQLObject sqlObject, FormatOption option) { - return toSQLString(sqlObject, JdbcConstants.TERADATA, option); - } - public static String formatPGSql(String sql, FormatOption option) { return format(sql, JdbcConstants.POSTGRESQL, option); } @@ -383,10 +373,6 @@ public class SQLUtils { return new OdpsOutputVisitor(out); } - if (JdbcConstants.TERADATA.equals(dbType)) { - return new TeradataOutputVisitor(out); - } - return new SQLASTOutputVisitor(out); } @@ -421,10 +407,6 @@ public class SQLUtils { if (JdbcConstants.ODPS.equals(dbType)) { return new OdpsSchemaStatVisitor(); } - - if (JdbcConstants.TERADATA.equals(dbType)) { - return new TeradataSchemaStatVisitor(); - } return new SchemaStatVisitor(); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/TeradataObject.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/TeradataObject.java deleted file mode 100644 index abb16ee0a8..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/TeradataObject.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.ast; - -import com.alibaba.druid.sql.ast.SQLObject; - -public interface TeradataObject extends SQLObject { - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataAnalytic.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataAnalytic.java deleted file mode 100644 index 22a8c51112..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataAnalytic.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.ast.expr; - -import com.alibaba.druid.sql.ast.SQLOver; -import com.alibaba.druid.sql.dialect.teradata.visitor.TeradataASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -public class TeradataAnalytic extends SQLOver implements TeradataExpr { - - private TeradataAnalyticWindowing windowing; - - public TeradataAnalytic(){ - - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - this.accept0((TeradataASTVisitor) visitor); - } - - public void accept0(TeradataASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, this.partitionBy); - acceptChild(visitor, this.orderBy); - acceptChild(visitor, this.windowing); - } - visitor.endVisit(this); - } - - public TeradataAnalyticWindowing getWindowing() { - return this.windowing; - } - - public void setWindowing(TeradataAnalyticWindowing windowing) { - this.windowing = windowing; - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataAnalyticWindowing.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataAnalyticWindowing.java deleted file mode 100644 index dffc7cad5f..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataAnalyticWindowing.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.ast.expr; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLObjectImpl; -import com.alibaba.druid.sql.dialect.teradata.visitor.TeradataASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -public class TeradataAnalyticWindowing extends SQLObjectImpl implements TeradataExpr { - - private Type type; - private SQLExpr expr; - - public TeradataAnalyticWindowing(){ - - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - this.accept0((TeradataASTVisitor) visitor); - } - - public void accept0(TeradataASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, this.expr); - } - visitor.endVisit(this); - } - - public SQLExpr getExpr() { - return this.expr; - } - - public void setExpr(SQLExpr expr) { - this.expr = expr; - } - - public Type getType() { - return this.type; - } - - public void setType(Type type) { - this.type = type; - } - - public static enum Type { - ROWS, RANGE; - } -} - diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataExpr.java deleted file mode 100644 index 912ce644df..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataExpr.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.ast.expr; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.dialect.teradata.ast.TeradataObject; - -public interface TeradataExpr extends SQLExpr, TeradataObject { - -} \ No newline at end of file diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataIntervalExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataIntervalExpr.java deleted file mode 100644 index b48370f21b..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataIntervalExpr.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.ast.expr; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLExprImpl; -import com.alibaba.druid.sql.dialect.teradata.visitor.TeradataASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -public class TeradataIntervalExpr extends SQLExprImpl implements TeradataExpr { - - private SQLExpr value; - private TeradataIntervalUnit unit; - - public TeradataIntervalExpr() { - - } - - public SQLExpr getValue() { - return this.value; - } - - public void setValue(SQLExpr value) { - this.value = value; - } - - public TeradataIntervalUnit getUnit() { - return unit; - } - - public void setUnit(TeradataIntervalUnit unit) { - this.unit = unit; - } - - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - TeradataIntervalExpr other = (TeradataIntervalExpr) obj; - if (unit != other.unit) { - return false; - } - if (value == null) { - if (other.value != null) { - return false; - } - } else if (!value.equals(other.value)) { - return false; - } - return true; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((unit == null)? 0 : unit.hashCode()); - result = prime * result + ((value == null)? 0 : value.hashCode()); - return result; - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - TeradataASTVisitor tdVisitor = (TeradataASTVisitor) visitor; - if (tdVisitor.visit(this)) { - acceptChild(visitor, this.value); - } - tdVisitor.endVisit(this); - } - - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataIntervalUnit.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataIntervalUnit.java deleted file mode 100644 index 635f36506e..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/expr/TeradataIntervalUnit.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.ast.expr; - -public enum TeradataIntervalUnit { - - YEAR, MONTH, DAY, - - HOUR, MINUTE, SECOND; - - public final String name_lcase; - - private TeradataIntervalUnit() { - this.name_lcase = name().toLowerCase(); - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/stmt/TeradataInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/stmt/TeradataInsertStatement.java deleted file mode 100644 index aa6cbf230e..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/stmt/TeradataInsertStatement.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.ast.stmt; - -import java.util.ArrayList; -import java.util.List; - -import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; -import com.alibaba.druid.sql.dialect.teradata.visitor.TeradataASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -public class TeradataInsertStatement extends SQLInsertStatement { - private List valuesList = new ArrayList(); - - public ValuesClause getValues() { - if (valuesList.size() == 0) { - return null; - } - return valuesList.get(0); - } - - public void setValues(ValuesClause values) { - if (valuesList.size() == 0) { - valuesList.add(values); - } else { - valuesList.set(0, values); - } - } - - public List getValuesList() { - return valuesList; - } - - public void addValueCause(ValuesClause valueClause) { - valueClause.setParent(this); - valuesList.add(valueClause); - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - if (visitor instanceof TeradataASTVisitor) { - accept0((TeradataASTVisitor) visitor); - } else { - throw new IllegalArgumentException("not support visitor type : " + visitor.getClass().getName()); - } - } - - protected void accept0(TeradataASTVisitor visitor) { - if (visitor.visit(this)) { - this.acceptChild(visitor, getTableSource()); - this.acceptChild(visitor, getColumns()); - this.acceptChild(visitor, getValuesList()); - this.acceptChild(visitor, getQuery()); - } - - visitor.endVisit(this); - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/stmt/TeradataSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/stmt/TeradataSelectQueryBlock.java deleted file mode 100644 index e6f46eac35..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/ast/stmt/TeradataSelectQueryBlock.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.ast.stmt; - -import com.alibaba.druid.sql.SQLUtils; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLOrderBy; -import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; -import com.alibaba.druid.sql.dialect.teradata.visitor.TeradataASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -public class TeradataSelectQueryBlock extends SQLSelectQueryBlock { - private SQLOrderBy orderBy; - private SQLExpr qualifyClause; - - public TeradataSelectQueryBlock() { - - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - if (visitor instanceof TeradataASTVisitor) { - accept0((TeradataASTVisitor) visitor); - return; - } - - super.accept0(visitor); - } - - protected void accept0(TeradataASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, this.selectList); - acceptChild(visitor, this.into); - acceptChild(visitor, this.from); - acceptChild(visitor, this.where); - acceptChild(visitor, this.groupBy); - acceptChild(visitor, this.qualifyClause); - acceptChild(visitor, this.orderBy); - } - visitor.endVisit(this); - } - - public SQLOrderBy getOrderBy() { - return orderBy; - } - - public void setOrderBy(SQLOrderBy orderBy) { - this.orderBy = orderBy; - } - - public SQLExpr getQualifyClause() { - return qualifyClause; - } - - public void setQualifyClause(SQLExpr qualify) { - if (qualify != null) { - qualify.setParent(this); - } - this.qualifyClause = qualify; - } - - public String toString() { - return SQLUtils.toTeradataString(this); - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/parser/TeradataExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/parser/TeradataExprParser.java deleted file mode 100644 index 56e44bdeb1..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/parser/TeradataExprParser.java +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.parser; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLKeep; -import com.alibaba.druid.sql.ast.SQLKeep.DenseRank; -import com.alibaba.druid.sql.ast.SQLOrderBy; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; -import com.alibaba.druid.sql.ast.expr.SQLAggregateOption; -import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; -import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; -import com.alibaba.druid.sql.ast.expr.SQLCastExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; -import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; -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.dialect.teradata.ast.expr.TeradataIntervalUnit; -import com.alibaba.druid.sql.parser.Lexer; -import com.alibaba.druid.sql.parser.ParserException; -import com.alibaba.druid.sql.parser.SQLExprParser; -import com.alibaba.druid.sql.parser.SQLSelectParser; -import com.alibaba.druid.sql.parser.Token; -import com.alibaba.druid.util.JdbcConstants; - -public class TeradataExprParser extends SQLExprParser { - - public final static String[] AGGREGATE_FUNCTIONS = { "AVG", "COUNT", "MAX", "MIN", "STDDEV", "SUM", "ROW_NUMBER" }; - - public TeradataExprParser(String sql){ - this(new TeradataLexer(sql)); - this.lexer.nextToken(); - this.dbType = JdbcConstants.TERADATA; - } - - public TeradataExprParser(Lexer lexer){ - super(lexer); - this.aggregateFunctions = AGGREGATE_FUNCTIONS; - this.dbType = JdbcConstants.TERADATA; - } - - public SQLExpr primary() { - SQLExpr sqlExpr = null; - - final Token tok = lexer.token(); - - switch (tok){ - case SEL: - SQLQueryExpr queryExpr = new SQLQueryExpr(createSelectParser().select()); - sqlExpr = queryExpr; - return primaryRest(sqlExpr); - case CAST: - lexer.nextToken(); - accept(Token.LPAREN); - SQLCastExpr cast = new SQLCastExpr(); - cast.setExpr(expr()); - accept(Token.AS); - cast.setDataType(parseDataType()); - // TODO: deal with FORMAT - // currently ignore FORMAT keywords - if(lexer.token() == Token.FORMAT) { - lexer.nextToken(); - lexer.nextToken(); - } - accept(Token.RPAREN); - return primaryRest(cast); - default: - return super.primary(); - } - } - - public SQLSelectParser createSelectParser() { - return new TeradataSelectParser(this); - } - - // for cases like: between DATE '2010-01-01' and DATE '2011-01-01' - public SQLExpr relationalRest(SQLExpr expr) { - if (lexer.token() == Token.BETWEEN) { - lexer.nextToken(); - SQLExpr beginExpr = bitOr(); - SQLExpr endExpr; - if (lexer.token() != Token.AND) { - lexer.nextToken(); - accept(Token.AND); - endExpr = bitOr(); - lexer.nextToken(); - } else { - accept(Token.AND); - endExpr = bitOr(); - } - expr = new SQLBetweenExpr(expr, beginExpr, endExpr); - return expr; - } - return super.relationalRest(expr); - } - - protected SQLExpr methodRest(SQLExpr expr, boolean acceptLPAREN) { - if (acceptLPAREN) { - accept(Token.LPAREN); - } - - if (expr instanceof SQLIdentifierExpr) { - String methodName = ((SQLIdentifierExpr) expr).getName(); - SQLMethodInvokeExpr methodExpr = new SQLMethodInvokeExpr(methodName); - if ("trim".equalsIgnoreCase(methodName)) { - if (identifierEquals("LEADING") - || identifierEquals("TRAILING") - || identifierEquals("BOTH")) { - methodExpr.putAttribute("trim_option", lexer.stringVal()); - lexer.nextToken(); - if (lexer.token() == Token.LITERAL_CHARS) { - SQLExpr trim_character = this.primary(); - trim_character.setParent(methodExpr); - methodExpr.putAttribute("trim_character", trim_character); - } - } else { - SQLExpr trim_character = this.primary(); - trim_character.setParent(methodExpr); - methodExpr.putAttribute("trim_character", trim_character); - } - - if (lexer.token() == Token.FROM) { - lexer.nextToken(); - SQLExpr trim_source = this.expr(); - methodExpr.addParameter(trim_source); - } - - accept(Token.RPAREN); - return primaryRest(methodExpr); - } - } else if (expr instanceof SQLCaseExpr) { - lexer.nextToken(); - accept(Token.RPAREN); - return primaryRest(expr); - } - return super.methodRest(expr, false); - } - - public SQLExpr multiplicativeRest(SQLExpr expr) { - if (lexer.token() == Token.MOD) { - lexer.nextToken(); - SQLExpr rightExp = bitXor(); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Mod, rightExp, getDbType()); - expr = multiplicativeRest(expr); - return expr; - } - return super.multiplicativeRest(expr); - } - - protected SQLAggregateExpr parseAggregateExpr(String methodName) { - methodName = methodName.toUpperCase(); - - SQLAggregateExpr aggregateExpr; - if (lexer.token() == Token.UNIQUE) { - aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateOption.UNIQUE); - lexer.nextToken(); - } else if (lexer.token() == (Token.ALL)) { - aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateOption.ALL); - lexer.nextToken(); - } else if (lexer.token() == (Token.DISTINCT)) { - aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateOption.DISTINCT); - lexer.nextToken(); - } else { - aggregateExpr = new SQLAggregateExpr(methodName); - } - exprList(aggregateExpr.getArguments(), aggregateExpr); - - accept(Token.RPAREN); - - if (lexer.token() == Token.KEEP) { - lexer.nextToken(); - - SQLKeep keep = new SQLKeep(); - accept(Token.LPAREN); - acceptIdentifier("DENSE_RANK"); - if (identifierEquals("FIRST")) { - lexer.nextToken(); - keep.setDenseRank(DenseRank.FIRST); - } else { - acceptIdentifier("LAST"); - keep.setDenseRank(DenseRank.LAST); - } - - SQLOrderBy orderBy = this.parseOrderBy(); - keep.setOrderBy(orderBy); - - aggregateExpr.setKeep(keep); - - accept(Token.RPAREN); - } - - if (lexer.token() == Token.OVER) { - TeradataAnalytic over = new TeradataAnalytic(); - - lexer.nextToken(); - accept(Token.LPAREN); - - if (identifierEquals("PARTITION")) { - lexer.nextToken(); - accept(Token.BY); - - if (lexer.token() == (Token.LPAREN)) { - lexer.nextToken(); - exprList(over.getPartitionBy(), over); - accept(Token.RPAREN); - } else { - exprList(over.getPartitionBy(), over); - } - } - - over.setOrderBy(parseOrderBy()); - if (over.getOrderBy() != null) { - TeradataAnalyticWindowing windowing = null; - if (lexer.stringVal().equalsIgnoreCase("ROWS")) { - lexer.nextToken(); - windowing = new TeradataAnalyticWindowing(); - windowing.setType(TeradataAnalyticWindowing.Type.ROWS); - } else if (lexer.stringVal().equalsIgnoreCase("RANGE")) { - lexer.nextToken(); - windowing = new TeradataAnalyticWindowing(); - windowing.setType(TeradataAnalyticWindowing.Type.RANGE); - } - - if (windowing != null) { - if (lexer.stringVal().equalsIgnoreCase("BETWEEN")) { - String between = null; - String and = null; - lexer.nextToken(); - if(lexer.token() == Token.LITERAL_INT) { - int val_1 = lexer.integerValue().intValue(); - lexer.nextToken(); - if (lexer.stringVal().equalsIgnoreCase("PRECEDING")) { - lexer.nextToken(); - between = "BETWEEN " + String.valueOf(val_1) + " PRECEDING"; - } else if (lexer.stringVal().equalsIgnoreCase("FOLLOWING")) { - lexer.nextToken(); - between = "BETWEEN " + String.valueOf(val_1) + " FOLLOWING"; - } else { - throw new ParserException("syntax error"); - } - } else if (lexer.stringVal().equalsIgnoreCase("CURRENT")) { - lexer.nextToken(); - if (lexer.stringVal().equalsIgnoreCase("ROW")) { - lexer.nextToken(); - between = "BETWEEN CURRENT ROW"; - } - } else if (lexer.stringVal().equalsIgnoreCase("UNBOUNDED")) { - lexer.nextToken(); - if (lexer.stringVal().equalsIgnoreCase("PRECEDING")) { - lexer.nextToken(); - between = "BETWEEN UNBOUNDED PRECEDING"; - } - } else { - throw new ParserException("syntax error"); - } - if (lexer.stringVal().equalsIgnoreCase("AND")) { - lexer.nextToken(); - if(lexer.token() == Token.LITERAL_INT) { - System.out.println("yes, inside and"); - int val_2 = lexer.integerValue().intValue(); - lexer.nextToken(); - if (lexer.stringVal().equalsIgnoreCase("PRECEDING")) { - lexer.nextToken(); - and = " AND " + String.valueOf(val_2) + " PRECEDING"; - windowing.setExpr(new SQLIdentifierExpr(between + and)); - } else if (lexer.stringVal().equalsIgnoreCase("FOLLOWING")) { - lexer.nextToken(); - and = " AND " + String.valueOf(val_2) + " FOLLOWING"; - windowing.setExpr(new SQLIdentifierExpr(between + and)); - } else { - throw new ParserException("syntax error"); - } - } else if (lexer.stringVal().equalsIgnoreCase("CURRENT")) { - lexer.nextToken(); - if (lexer.stringVal().equalsIgnoreCase("ROW")) { - lexer.nextToken(); - and = " AND CURRENT ROW"; - windowing.setExpr(new SQLIdentifierExpr(between + and)); - } - } else if (lexer.stringVal().equalsIgnoreCase("UNBOUNDED")) { - lexer.nextToken(); - if (lexer.stringVal().equalsIgnoreCase("FOLLOWING")) { - lexer.nextToken(); - and = " AND UNBOUNDED FOLLOWING"; - windowing.setExpr(new SQLIdentifierExpr(between + and)); - } - } else { - throw new ParserException("syntax error"); - } - } else { - throw new ParserException("syntax error"); - } - } else { - if (lexer.stringVal().equalsIgnoreCase("CURRENT")) { - lexer.nextToken(); - if (lexer.stringVal().equalsIgnoreCase("ROW")) { - lexer.nextToken(); - windowing.setExpr(new SQLIdentifierExpr("CURRENT ROW")); - over.setWindowing(windowing); - } else { - throw new ParserException("syntax error"); - } - } - if (lexer.stringVal().equalsIgnoreCase("UNBOUNDED")) { - lexer.nextToken(); - if (lexer.stringVal().equalsIgnoreCase("PRECEDING")) { - lexer.nextToken(); - System.out.println("yes, inside!!"); - windowing.setExpr(new SQLIdentifierExpr("UNBOUNDED PRECEDING")); - } else { - throw new ParserException("syntax error"); - } - } - } - over.setWindowing(windowing); - } - } - - accept(Token.RPAREN); - - aggregateExpr.setOver(over); - } - return aggregateExpr; - } - - protected SQLExpr parseInterval() { - accept(Token.INTERVAL); - - if (lexer.token() == Token.LITERAL_CHARS) { - SQLExpr value = expr(); - - if (lexer.token() != Token.IDENTIFIER) { - throw new ParserException("Syntax error"); - } - - String unit = lexer.stringVal(); - lexer.nextToken(); - - TeradataIntervalExpr intervalExpr = new TeradataIntervalExpr(); - intervalExpr.setValue(value); - intervalExpr.setUnit(TeradataIntervalUnit.valueOf(unit.toUpperCase())); - - return intervalExpr; - } else { - throw new ParserException("TODO with other interval"); - } - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/parser/TeradataLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/parser/TeradataLexer.java deleted file mode 100644 index 4defb47f59..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/parser/TeradataLexer.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.parser; - -import static com.alibaba.druid.sql.parser.LayoutCharacters.EOI; - -import java.util.HashMap; -import java.util.Map; - -import com.alibaba.druid.sql.parser.Keywords; -import com.alibaba.druid.sql.parser.Lexer; -import com.alibaba.druid.sql.parser.NotAllowCommentException; -import com.alibaba.druid.sql.parser.Token; - -public class TeradataLexer extends Lexer { - public final static Keywords DEFAULT_TD_KEYWORDS; - - static { - Map map = new HashMap(); - map.putAll(Keywords.DEFAULT_KEYWORDS.getKeywords()); - - map.put("SEL", Token.SEL); - map.put("LOCKING", Token.LOCKING); - map.put("ACCESS", Token.ACCESS); - -// map.put("PARTITION", Token.PARTITION); -// map.put("PARTITIONED", Token.PARTITIONED); - map.put("RANGE_N", Token.RANGE_N); - - map.put("VOLATILE", Token.VOLATILE); - map.put("MULTISET", Token.MULTISET); - - map.put("FORMAT", Token.FORMAT); - - map.put("QUALIFY", Token.QUALIFY); - - map.put("MOD", Token.MOD); - - DEFAULT_TD_KEYWORDS = new Keywords(map); - } - - public TeradataLexer(String input){ - super(input); - super.keywods = DEFAULT_TD_KEYWORDS; - } - - public void scanComment() { - if (ch != '/' && ch != '-') { - throw new IllegalStateException(); - } - - mark = pos; - bufPos = 0; - scanChar(); - - // /*+ */ - if (ch == '*') { - scanChar(); - bufPos++; - - while (ch == ' ') { - scanChar(); - bufPos++; - } - - boolean isHint = false; - int startHintSp = bufPos + 1; - if (ch == '+') { - isHint = true; - scanChar(); - bufPos++; - } - - for (;;) { - if (ch == '*' && charAt(pos + 1) == '/') { - bufPos += 2; - scanChar(); - scanChar(); - break; - } - - scanChar(); - bufPos++; - } - - if (isHint) { - stringVal = subString(mark + startHintSp, (bufPos - startHintSp) - 1); - token = Token.HINT; - } else { - stringVal = subString(mark, bufPos); - token = Token.MULTI_LINE_COMMENT; - if (keepComments) { - addComment(stringVal); - } - } - - if (token != Token.HINT && !isAllowComment()) { - throw new NotAllowCommentException(); - } - - return; - } - - if (!isAllowComment()) { - throw new NotAllowCommentException(); - } - - if (ch == '/' || ch == '-') { - scanChar(); - bufPos++; - - for (;;) { - if (ch == '\r') { - if (charAt(pos + 1) == '\n') { - bufPos += 2; - scanChar(); - break; - } - bufPos++; - break; - } else if (ch == EOI) { - break; - } - - if (ch == '\n') { - scanChar(); - bufPos++; - break; - } - - scanChar(); - bufPos++; - } - - stringVal = subString(mark + 1, bufPos); - token = Token.LINE_COMMENT; - if (keepComments) { - addComment(stringVal); - } - endOfComment = isEOF(); - return; - } - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/parser/TeradataSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/parser/TeradataSelectParser.java deleted file mode 100644 index 3aa48c9867..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/parser/TeradataSelectParser.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.parser; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLSetQuantifier; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; -import com.alibaba.druid.sql.dialect.teradata.ast.stmt.TeradataSelectQueryBlock; -import com.alibaba.druid.sql.parser.ParserException; -import com.alibaba.druid.sql.parser.SQLExprParser; -import com.alibaba.druid.sql.parser.SQLSelectParser; -import com.alibaba.druid.sql.parser.Token; - -public class TeradataSelectParser extends SQLSelectParser{ - - public TeradataSelectParser(SQLExprParser exprParser) { - super(exprParser); - } - - public TeradataSelectParser(String sql) { - this(new TeradataExprParser(sql)); - } - - public SQLSelectQuery query() { - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - - SQLSelectQuery select = query(); - accept(Token.RPAREN); - - return queryRest(select); - } - - TeradataSelectQueryBlock queryBlock = new TeradataSelectQueryBlock(); - - if (lexer.token() == Token.SEL - || lexer.token() == Token.SELECT) { - - lexer.nextToken(); - - if (lexer.token() == Token.COMMENT) { - lexer.nextToken(); - } - - if (lexer.token() == (Token.DISTINCT)) { - queryBlock.setDistionOption(SQLSetQuantifier.DISTINCT); - lexer.nextToken(); - } else if (lexer.token() == (Token.ALL)) { - queryBlock.setDistionOption(SQLSetQuantifier.ALL); - lexer.nextToken(); - } - parseSelectList(queryBlock); - } - parseFrom(queryBlock); - - parseWhere(queryBlock); - - parseGroupBy(queryBlock); - - parserQualify(queryBlock); - - queryBlock.setOrderBy(this.exprParser.parseOrderBy()); - - return queryRest(queryBlock); - } - - private void parserQualify(TeradataSelectQueryBlock queryBlock) { - if (lexer.token() != Token.QUALIFY) { - return; - } - - lexer.nextToken(); - if (lexer.token() == Token.LITERAL_INT) { - lexer.nextToken(); - // possibly =, >=, <= - // ignore this for now - lexer.nextToken(); - - if (lexer.token() == Token.IDENTIFIER) { - SQLExpr expr = new SQLIdentifierExpr(lexer.stringVal()); - lexer.nextToken(); - if (lexer.token() != Token.COMMA) { - expr = this.exprParser.primaryRest(expr); - } - // TODO: add qualify clause into queryBlock - queryBlock.setQualifyClause(expr); - } else { - throw new ParserException("not support token:" + lexer.token()); - } - } else if (lexer.token() == Token.IDENTIFIER) { - SQLExpr expr = new SQLIdentifierExpr(lexer.stringVal()); - lexer.nextToken(); - if (lexer.token() != Token.COMMA) { - expr = this.exprParser.primaryRest(expr); - } - lexer.nextToken(); - lexer.nextToken(); - // TODO: add qualify clause into queryBlock - queryBlock.setQualifyClause(expr); - } else { - throw new ParserException("not support token:" + lexer.token()); - } - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/parser/TeradataStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/parser/TeradataStatementParser.java deleted file mode 100644 index 5a8354e1c3..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/parser/TeradataStatementParser.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.parser; - -import java.util.ArrayList; -import java.util.List; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.expr.SQLCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; -import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; -import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; -import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; -import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause; -import com.alibaba.druid.sql.dialect.teradata.ast.stmt.TeradataInsertStatement; -import com.alibaba.druid.sql.parser.Lexer; -import com.alibaba.druid.sql.parser.ParserException; -import com.alibaba.druid.sql.parser.SQLStatementParser; -import com.alibaba.druid.sql.parser.Token; -import com.alibaba.druid.util.JdbcConstants; - -public class TeradataStatementParser extends SQLStatementParser { - - public TeradataStatementParser(String sql){ - super(new TeradataExprParser(sql)); - } - - public TeradataStatementParser(Lexer lexer){ - super(new TeradataExprParser(lexer)); - } - - public TeradataExprParser getExprParser() { - return (TeradataExprParser) exprParser; - } - - public TeradataSelectParser createSQLSelectParser() { - return new TeradataSelectParser(this.exprParser); - } - - public SQLSelectStatement parseSelect() { - TeradataSelectParser selectParser = new TeradataSelectParser(this.exprParser); - return new SQLSelectStatement(selectParser.select(), JdbcConstants.TERADATA); - } - - public SQLInsertStatement parseInsert() { - TeradataInsertStatement insertStatement = new TeradataInsertStatement(); - - if (lexer.token() == Token.INSERT) { - lexer.nextToken(); - - if (lexer.token() == Token.INTO) { - lexer.nextToken(); - } - - SQLName tableName = this.exprParser.name(); - insertStatement.setTableName(tableName); - - if (lexer.token() == Token.IDENTIFIER && !identifierEquals("VALUE")) { - insertStatement.setAlias(lexer.stringVal()); - lexer.nextToken(); - } - } - - int columnSize = 0; - if (lexer.token() == (Token.LPAREN)) { - lexer.nextToken(); - if (lexer.token() == (Token.SELECT)) { - SQLSelect select = this.exprParser.createSelectParser().select(); - select.setParent(insertStatement); - insertStatement.setQuery(select); - } else { - this.exprParser.exprList(insertStatement.getColumns(), insertStatement); - columnSize = insertStatement.getColumns().size(); - } - accept(Token.RPAREN); - } - - if (lexer.token() == Token.VALUES || identifierEquals("VALUE")) { - lexer.nextTokenLParen(); - parseValueClause(insertStatement.getValuesList(), columnSize); - } else if (lexer.token() == Token.SET) { - lexer.nextToken(); - - SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(); - insertStatement.getValuesList().add(values); - - for (;;) { - SQLName name = this.exprParser.name(); - insertStatement.addColumn(name); - if (lexer.token() == Token.EQ) { - lexer.nextToken(); - } else { - accept(Token.COLONEQ); - } - values.addValue(this.exprParser.expr()); - - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - - break; - } - - } else if (lexer.token() == (Token.SELECT) - || lexer.token() == (Token.SEL)) { - SQLSelect select = this.exprParser.createSelectParser().select(); - select.setParent(insertStatement); - insertStatement.setQuery(select); - } else if (lexer.token() == (Token.LPAREN)) { - lexer.nextToken(); - SQLSelect select = this.exprParser.createSelectParser().select(); - select.setParent(insertStatement); - insertStatement.setQuery(select); - accept(Token.RPAREN); - } - - return insertStatement; - } - - private void parseValueClause(List valueClauseList, int columnSize) { - for (;;) { - if (lexer.token() != Token.LPAREN) { - throw new ParserException("syntax error, expect ')'"); - } - lexer.nextTokenValue(); - - if (lexer.token() != Token.RPAREN) { - List valueExprList; - if (columnSize > 0) { - valueExprList = new ArrayList(columnSize); - } else { - valueExprList = new ArrayList(); - } - - for (;;) { - SQLExpr expr; - if (lexer.token() == Token.LITERAL_INT) { - expr = new SQLIntegerExpr(lexer.integerValue()); - lexer.nextTokenComma(); - } else if (lexer.token() == Token.LITERAL_CHARS) { - expr = new SQLCharExpr(lexer.stringVal()); - lexer.nextTokenComma(); - } else if (lexer.token() == Token.LITERAL_NCHARS) { - expr = new SQLNCharExpr(lexer.stringVal()); - lexer.nextTokenComma(); - } else { - expr = exprParser.expr(); - } - - if (lexer.token() == Token.COMMA) { - valueExprList.add(expr); - lexer.nextTokenValue(); - continue; - } else if (lexer.token() == Token.RPAREN) { - valueExprList.add(expr); - break; - } else { - expr = this.exprParser.primaryRest(expr); - if (lexer.token() != Token.COMMA && lexer.token() != Token.RPAREN) { - expr = this.exprParser.exprRest(expr); - } - - valueExprList.add(expr); - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } else { - break; - } - } - } - - SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(valueExprList); - valueClauseList.add(values); - } else { - SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(new ArrayList(0)); - valueClauseList.add(values); - } - - if (lexer.token() != Token.RPAREN) { - throw new ParserException("syntax error"); - } - - if (!parseCompleteValues && valueClauseList.size() >= parseValuesSize) { - lexer.skipToEOF(); - break; - } - - lexer.nextTokenComma(); - if (lexer.token() == Token.COMMA) { - lexer.nextTokenLParen(); - continue; - } else { - break; - } - } - } - - public void parseStatementList(List statementList, int max) { - for (;;) { - if (max != -1) { - if (statementList.size() >= max) { - return; - } - } - - if (lexer.token() == Token.EOF) { - return; - } - if (lexer.token() == Token.END) { - return; - } - if (lexer.token() == Token.ELSE) { - return; - } - - if (lexer.token() == (Token.SEMI)) { - lexer.nextToken(); - continue; - } - - if (lexer.token() == (Token.SELECT)) { - statementList.add(parseSelect()); - continue; - } else { - super.parseStatementList(statementList, max); - } - } - } - - public boolean parseStatementListDialect(List statementList) { - if (lexer.token() == Token.SEL) { - statementList.add(parseSelect()); - return true; - } - return false; - } - -} 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 deleted file mode 100644 index 3fb1d36b69..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataASTVisitor.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -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.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.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); - - boolean visit(TeradataIntervalExpr x); - - void endVisit(TeradataIntervalExpr x); - - boolean visit(SQLSubqueryTableSource x); - - void endVisit(SQLSubqueryTableSource 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 deleted file mode 100644 index d286c6ddc4..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataASTVisitorAdapter.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -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.dialect.teradata.ast.expr.TeradataIntervalExpr; -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; - } - - @Override - public boolean visit(TeradataIntervalExpr x) { - // TODO Auto-generated method stub - return true; - } - - @Override - public void endVisit(TeradataIntervalExpr x) { - // TODO Auto-generated method stub - - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataEvalVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataEvalVisitor.java deleted file mode 100644 index 9bab665a39..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataEvalVisitor.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.visitor; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; -import com.alibaba.druid.sql.visitor.SQLEvalVisitor; -import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; -import com.alibaba.druid.sql.visitor.functions.Function; - -public class TeradataEvalVisitor extends TeradataASTVisitorAdapter implements SQLEvalVisitor { - private Map functions = new HashMap(); - private List parameters = new ArrayList(); - - private int variantIndex = -1; - - private boolean markVariantIndex = true; - - public TeradataEvalVisitor() { - this(new ArrayList(1)); - } - - public TeradataEvalVisitor(List parameters) { - this.parameters = parameters; - } - - @Override - public Function getFunction(String funcName) { - return functions.get(funcName); - } - - @Override - public void registerFunction(String funcName, Function function) { - functions.put(funcName, function); - } - - @Override - public void unregisterFunction(String funcName) { - functions.remove(funcName); - } - - @Override - public List getParameters() { - return parameters; - } - - @Override - public void setParameters(List parameters) { - this.parameters = parameters; - } - - @Override - public int incrementAndGetVariantIndex() { - return ++variantIndex; - } - - @Override - public boolean isMarkVariantIndex() { - return markVariantIndex; - } - - @Override - public void setMarkVariantIndex(boolean markVariantIndex) { - this.markVariantIndex = markVariantIndex; - } - - public boolean visit(SQLBinaryOpExpr x) { - return SQLEvalVisitorUtils.visit(this, x); - } - -} 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 deleted file mode 100644 index e09580fde5..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataOutputVisitor.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.visitor; - -import com.alibaba.druid.sql.ast.SQLExpr; -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.expr.SQLMethodInvokeExpr; -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.expr.TeradataIntervalExpr; -import com.alibaba.druid.sql.dialect.teradata.ast.stmt.TeradataSelectQueryBlock; -import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; - -public class TeradataOutputVisitor extends SQLASTOutputVisitor implements TeradataASTVisitor { - - 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); - } - } - } - - @Override - public boolean visit(TeradataIntervalExpr x) { - print0(ucase ? "INTERVAL " : "interval "); - x.getValue().accept(this); - print(' '); - print0(ucase ? x.getUnit().name() : x.getUnit().name_lcase); - return false; - } - - @Override - public void endVisit(TeradataIntervalExpr x) { - - } - - public void endVisit(SQLMethodInvokeExpr x) { - - } - - public boolean visit(SQLMethodInvokeExpr x) { - if ("trim".equalsIgnoreCase(x.getMethodName())) { - SQLExpr trim_character = (SQLExpr) x.getAttribute("trim_character"); - - print0(x.getMethodName()); - print('('); - String trim_option = (String) x.getAttribute("trim_option"); - if (trim_option != null && trim_option.length() != 0) { - print0(trim_option); - print(' '); - } - if (trim_character != null) { - trim_character.accept(this); - } - if (x.getParameters().size() > 0) { - print0(ucase ? " FROM " : " from "); - x.getParameters().get(0).accept(this); - } - print(')'); - return false; - } - return super.visit(x); - } -} 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 deleted file mode 100644 index 57abb7057d..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/teradata/visitor/TeradataSchemaStatVisitor.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.teradata.visitor; - -import java.util.LinkedHashMap; -import java.util.Map; - -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLObject; -import com.alibaba.druid.sql.ast.statement.SQLSelectItem; -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.util.JdbcUtils; - -public class TeradataSchemaStatVisitor extends SchemaStatVisitor implements TeradataASTVisitor { - - protected final Map aliasQueryMap = new LinkedHashMap(); - - @Override - public String getDbType() { - return JdbcUtils.TERADATA; - } - - @Override - public boolean visit(TeradataAnalyticWindowing x) { - 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; - } - - @Override - public boolean visit(TeradataIntervalExpr x) { - return true; - } - - @Override - public void endVisit(TeradataIntervalExpr x) { - - } - - @Override - public boolean visit(SQLSubqueryTableSource x) { - accept(x.getSelect()); - - String table = (String) x.getSelect().getAttribute(ATTR_TABLE); - if (aliasMap != null && x.getAlias() != null) { - if (table != null) { - this.aliasMap.put(x.getAlias(), table); - } - addSubQuery(x.getAlias(), x.getSelect()); - this.setCurrentTable(x.getAlias()); - } - - if (table != null) { - x.putAttribute(ATTR_TABLE, table); - } - - return false; - } - - @Override - public void endVisit(SQLSubqueryTableSource x) { - - } - - 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 { - TeradataSchemaStatVisitor visitor = new TeradataSchemaStatVisitor(); - x.getExpr().accept(visitor); - putAliasMap(aliasMap, alias, null); - // Add expression alias into aliasQuery map - // in order to retrieve column info from aliasQueryMap - // if aliasMap value is null - String uniqueAliasName = this.getCurrentTable() == null ? - alias : this.getCurrentTable() + "." + alias; - addAliasQuery(uniqueAliasName, x.getExpr()); - } - } - - return false; - } - - protected void addAliasQuery(String alias, SQLObject query) { - String alias_lcase = alias.toLowerCase(); - aliasQueryMap.put(alias_lcase, query); - } - - public SQLObject getAliasQuery(String alias) { - String alias_lcase = alias.toLowerCase(); - return aliasQueryMap.get(alias_lcase); - } - - public Map getAliasQueryMap() { - return aliasQueryMap; - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index 03247f8ec0..09d25ab03f 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -15,12 +15,29 @@ */ package com.alibaba.druid.sql.visitor; +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_ERROR; +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_EXPR; +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; +import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE_NULL; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + import com.alibaba.druid.DruidRuntimeException; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLObject; -import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; @@ -44,7 +61,6 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlEvalVisitorImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleEvalVisitor; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGEvalVisitor; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerEvalVisitor; -import com.alibaba.druid.sql.dialect.teradata.visitor.TeradataEvalVisitor; import com.alibaba.druid.sql.visitor.functions.Ascii; import com.alibaba.druid.sql.visitor.functions.Bin; import com.alibaba.druid.sql.visitor.functions.BitLength; @@ -79,23 +95,6 @@ import com.alibaba.druid.util.Utils; import com.alibaba.druid.wall.spi.WallVisitorUtils; import com.alibaba.druid.wall.spi.WallVisitorUtils.WallConditionContext; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_ERROR; -import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_EXPR; -import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE; -import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE_NULL; - public class SQLEvalVisitorUtils { private static Map functions = new HashMap(); @@ -180,10 +179,6 @@ public class SQLEvalVisitorUtils { return new DB2EvalVisitor(); } - if (JdbcUtils.TERADATA.equals(dbType)) { - return new TeradataEvalVisitor(); - } - return new SQLEvalVisitorImpl(); }