Skip to content

Commit

Permalink
Add support for expressions (such as columns) in AT TIME ZONE express…
Browse files Browse the repository at this point in the history
…ions (#1413)

Co-authored-by: EverSQL <tomer@eversql.com>
  • Loading branch information
tomershay and tomershayeversql authored Nov 19, 2021
1 parent dbbcebb commit ebe171b
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
public class TimezoneExpression extends ASTNodeAccessImpl implements Expression {

private Expression leftExpression;
private ArrayList<String> timezoneExpressions = new ArrayList<>();
private ArrayList<Expression> timezoneExpressions = new ArrayList<>();

public Expression getLeftExpression() {
return leftExpression;
Expand All @@ -32,19 +32,19 @@ public void accept(ExpressionVisitor expressionVisitor) {
expressionVisitor.visit(this);
}

public List<String> getTimezoneExpressions() {
public List<Expression> getTimezoneExpressions() {
return timezoneExpressions;
}

public void addTimezoneExpression(String timezoneExpr) {
public void addTimezoneExpression(Expression timezoneExpr) {
this.timezoneExpressions.add(timezoneExpr);
}

@Override
public String toString() {
String returnValue = getLeftExpression().toString();
for (String expr : timezoneExpressions) {
returnValue += " AT TIME ZONE " + expr;
for (Expression expr : timezoneExpressions) {
returnValue += " AT TIME ZONE " + expr.toString();
}

return returnValue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -924,8 +924,9 @@ public void visit(XMLSerializeExpr expr) {
public void visit(TimezoneExpression var) {
var.getLeftExpression().accept(this);

for (String expr : var.getTimezoneExpressions()) {
buffer.append(" AT TIME ZONE " + expr);
for (Expression expr : var.getTimezoneExpressions()) {
buffer.append(" AT TIME ZONE ");
expr.accept(this);
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -3638,6 +3638,7 @@ Expression PrimaryExpression() #PrimaryExpression:
Expression retval = null;
CastExpression castExpr = null;
TimezoneExpression timezoneExpr = null;
Expression timezoneRightExpr = null;
Token token = null;
Token sign = null;
String tmp = "";
Expand Down Expand Up @@ -3762,11 +3763,11 @@ Expression PrimaryExpression() #PrimaryExpression:
retval=castExpr;
} )*

( <K_AT> <K_DATETIMELITERAL> <K_ZONE> token=<S_CHAR_LITERAL> {
( <K_AT> <K_DATETIMELITERAL> <K_ZONE> timezoneRightExpr=PrimaryExpression() {
if (timezoneExpr == null)
timezoneExpr = new TimezoneExpression();

timezoneExpr.addTimezoneExpression(token.image);
timezoneExpr.addTimezoneExpression(timezoneRightExpr);
} )*

{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -884,6 +884,12 @@ public void testTimezoneExpressionWithTwoTransformations() throws JSQLParserExce
assertSqlCanBeParsedAndDeparsed(stmt);
}

@Test
public void testTimezoneExpressionWithColumnBasedTimezone() throws JSQLParserException {
String stmt = "SELECT 1 FROM tbl WHERE col AT TIME ZONE timezone_col < '2021-11-05 00:00:35'::date + INTERVAL '1 day' * 0";
assertSqlCanBeParsedAndDeparsed(stmt);
}

@Test
public void testUnionWithOrderByAndLimitAndNoBrackets() throws JSQLParserException {
String stmt = "SELECT id FROM table1 UNION SELECT id FROM table2 ORDER BY id ASC LIMIT 55";
Expand Down

0 comments on commit ebe171b

Please sign in to comment.