Add Mod operation as SQLBinaryOpExpr

This commit is contained in:
Louis Xu
2016-04-21 17:22:43 +08:00
parent 5e1f16592d
commit 098f603280
@@ -21,6 +21,10 @@ 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;
@@ -63,7 +67,6 @@ public class TeradataExprParser extends SQLExprParser {
sqlExpr = queryExpr;
return primaryRest(sqlExpr);
case CAST:
System.out.println("cast test!");
lexer.nextToken();
accept(Token.LPAREN);
SQLCastExpr cast = new SQLCastExpr();
@@ -87,6 +90,27 @@ public class TeradataExprParser extends SQLExprParser {
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);
@@ -121,10 +145,25 @@ public class TeradataExprParser extends SQLExprParser {
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();