diff --git a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java index 8d7d88249..715362a0f 100644 --- a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java +++ b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java @@ -164,5 +164,7 @@ public interface ExpressionVisitor { void visit(RowConstructor rowConstructor); void visit(OracleHint hint); - + + void visit(TimeKeyExpression timeKeyExpression); + } diff --git a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java index d75938056..2919491a8 100644 --- a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java @@ -455,5 +455,10 @@ public void visit(HexValue hexValue) { public void visit(OracleHint hint) { } - + + @Override + public void visit(TimeKeyExpression timeKeyExpression) { + + } + } diff --git a/src/main/java/net/sf/jsqlparser/expression/TimeKeyExpression.java b/src/main/java/net/sf/jsqlparser/expression/TimeKeyExpression.java new file mode 100644 index 000000000..4d22ef9d6 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/expression/TimeKeyExpression.java @@ -0,0 +1,49 @@ +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2016 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ +package net.sf.jsqlparser.expression; + +public class TimeKeyExpression implements Expression { + + private String stringValue; + + public TimeKeyExpression(final String value) { + this.stringValue = value; + } + + @Override + public void accept(ExpressionVisitor expressionVisitor) { + expressionVisitor.visit(this); + } + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(String string) { + stringValue = string; + } + + @Override + public String toString() { + return getStringValue(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index b3770a949..499ea31ad 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -652,4 +652,7 @@ public void visit(AlterView alterView) { throw new UnsupportedOperationException(NOT_SUPPORTED_YET); } + @Override + public void visit(TimeKeyExpression timeKeyExpression) { + } } diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java index 6b605740b..18524b926 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java @@ -575,5 +575,10 @@ public void visit(RowConstructor rowConstructor) { public void visit(OracleHint hint) { buffer.append(hint.toString()); } - + + @Override + public void visit(TimeKeyExpression timeKeyExpression) { + buffer.append(timeKeyExpression.toString()); + } + } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 34ff9183a..e872e9024 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -233,6 +233,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| } TOKEN : /* Operators */ @@ -2046,6 +2047,9 @@ Expression PrimaryExpression(): | LOOKAHEAD(2) [sign="+" | sign="-"] retval=CastExpression() + // support timestamp expressions + | token= { retval = new TimeKeyExpression(token.image); } + | LOOKAHEAD(["+" | "-"] Column()) [sign="+" | sign="-"] retval=Column() | LOOKAHEAD(["+" | "-"] "(" BitwiseAndOr() ")") [sign="+" | sign="-"] "(" retval=BitwiseAndOr() ")" {retval = new Parenthesis(retval); } @@ -2790,6 +2794,8 @@ String CreateParameter(): tk= { retval = tk.image; } | tk= { retval = tk.image; } + | + tk= { retval = new TimeKeyExpression(tk.image).toString(); } | "=" { retval = "="; } | diff --git a/src/test/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapterTest.java b/src/test/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapterTest.java index 8713350ad..e522536d0 100644 --- a/src/test/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapterTest.java +++ b/src/test/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapterTest.java @@ -24,6 +24,7 @@ import net.sf.jsqlparser.expression.operators.relational.InExpression; import net.sf.jsqlparser.expression.operators.relational.ItemsList; import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import org.junit.After; @@ -130,5 +131,42 @@ public void visit(OracleHint hint) { assertEquals(singleLine, holder[0].isSingleLine()); assertEquals(hint, holder[0].getValue()); } - + + @Test + public void testCurrentTimestampExpression() throws JSQLParserException{ + final List columnList = new ArrayList(); + Select select = (Select) CCJSqlParserUtil.parse( "select * from foo where bar < CURRENT_TIMESTAMP" ); + PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + Expression where = plainSelect.getWhere(); + where.accept(new ExpressionVisitorAdapter() { + + @Override + public void visit(Column column) { + super.visit(column); + columnList.add(column.getColumnName()); + } + }); + + assertEquals(1, columnList.size()); + assertEquals("bar", columnList.get(0)); + } + + @Test + public void testCurrentDateExpression() throws JSQLParserException{ + final List columnList = new ArrayList(); + Select select = (Select) CCJSqlParserUtil.parse( "select * from foo where bar < CURRENT_DATE" ); + PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + Expression where = plainSelect.getWhere(); + where.accept(new ExpressionVisitorAdapter() { + + @Override + public void visit(Column column) { + super.visit(column); + columnList.add(column.getColumnName()); + } + }); + + assertEquals(1, columnList.size()); + assertEquals("bar", columnList.get(0)); + } }