Skip to content

Commit 7768588

Browse files
authored
Merge pull request #280 from conterra/date-expr
date expressions of ANSI SQL
2 parents 3bc316d + f51df4b commit 7768588

File tree

7 files changed

+112
-4
lines changed

7 files changed

+112
-4
lines changed

src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,5 +164,7 @@ public interface ExpressionVisitor {
164164
void visit(RowConstructor rowConstructor);
165165

166166
void visit(OracleHint hint);
167-
167+
168+
void visit(TimeKeyExpression timeKeyExpression);
169+
168170
}

src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,5 +455,10 @@ public void visit(HexValue hexValue) {
455455
public void visit(OracleHint hint) {
456456

457457
}
458-
458+
459+
@Override
460+
public void visit(TimeKeyExpression timeKeyExpression) {
461+
462+
}
463+
459464
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2016 JSQLParser
6+
* %%
7+
* This program is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU Lesser General Public License as
9+
* published by the Free Software Foundation, either version 2.1 of the
10+
* License, or (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Lesser Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Lesser Public
18+
* License along with this program. If not, see
19+
* <http://www.gnu.org/licenses/lgpl-2.1.html>.
20+
* #L%
21+
*/
22+
package net.sf.jsqlparser.expression;
23+
24+
public class TimeKeyExpression implements Expression {
25+
26+
private String stringValue;
27+
28+
public TimeKeyExpression(final String value) {
29+
this.stringValue = value;
30+
}
31+
32+
@Override
33+
public void accept(ExpressionVisitor expressionVisitor) {
34+
expressionVisitor.visit(this);
35+
}
36+
37+
public String getStringValue() {
38+
return stringValue;
39+
}
40+
41+
public void setStringValue(String string) {
42+
stringValue = string;
43+
}
44+
45+
@Override
46+
public String toString() {
47+
return getStringValue();
48+
}
49+
}

src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,4 +652,7 @@ public void visit(AlterView alterView) {
652652
throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
653653
}
654654

655+
@Override
656+
public void visit(TimeKeyExpression timeKeyExpression) {
657+
}
655658
}

src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,5 +575,10 @@ public void visit(RowConstructor rowConstructor) {
575575
public void visit(OracleHint hint) {
576576
buffer.append(hint.toString());
577577
}
578-
578+
579+
@Override
580+
public void visit(TimeKeyExpression timeKeyExpression) {
581+
buffer.append(timeKeyExpression.toString());
582+
}
583+
579584
}

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
233233
| <K_HIGH_PRIORITY : "HIGH_PRIORITY">
234234
| <K_IGNORE : "IGNORE">
235235
| <K_SEMI : "SEMI">
236+
| <K_TIME_KEY_EXPR : ( "CURRENT_TIMESTAMP" | "CURRENT_TIME" | "CURRENT_DATE" ) ( "()" )?>
236237
}
237238

238239
TOKEN : /* Operators */
@@ -2046,6 +2047,9 @@ Expression PrimaryExpression():
20462047

20472048
| LOOKAHEAD(2) [sign="+" | sign="-"] retval=CastExpression()
20482049

2050+
// support timestamp expressions
2051+
| token=<K_TIME_KEY_EXPR> { retval = new TimeKeyExpression(token.image); }
2052+
20492053
| LOOKAHEAD(["+" | "-"] Column()) [sign="+" | sign="-"] retval=Column()
20502054

20512055
| LOOKAHEAD(["+" | "-"] "(" BitwiseAndOr() ")") [sign="+" | sign="-"] "(" retval=BitwiseAndOr() ")" {retval = new Parenthesis(retval); }
@@ -2790,6 +2794,8 @@ String CreateParameter():
27902794
tk=<K_DELETE> { retval = tk.image; }
27912795
|
27922796
tk=<K_UPDATE> { retval = tk.image; }
2797+
|
2798+
tk=<K_TIME_KEY_EXPR> { retval = new TimeKeyExpression(tk.image).toString(); }
27932799
|
27942800
"=" { retval = "="; }
27952801
|

src/test/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapterTest.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import net.sf.jsqlparser.expression.operators.relational.InExpression;
2525
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
2626
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
27+
import net.sf.jsqlparser.schema.Column;
2728
import net.sf.jsqlparser.statement.select.PlainSelect;
2829
import net.sf.jsqlparser.statement.select.Select;
2930
import org.junit.After;
@@ -130,5 +131,42 @@ public void visit(OracleHint hint) {
130131
assertEquals(singleLine, holder[0].isSingleLine());
131132
assertEquals(hint, holder[0].getValue());
132133
}
133-
134+
135+
@Test
136+
public void testCurrentTimestampExpression() throws JSQLParserException{
137+
final List<String> columnList = new ArrayList<String>();
138+
Select select = (Select) CCJSqlParserUtil.parse( "select * from foo where bar < CURRENT_TIMESTAMP" );
139+
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
140+
Expression where = plainSelect.getWhere();
141+
where.accept(new ExpressionVisitorAdapter() {
142+
143+
@Override
144+
public void visit(Column column) {
145+
super.visit(column);
146+
columnList.add(column.getColumnName());
147+
}
148+
});
149+
150+
assertEquals(1, columnList.size());
151+
assertEquals("bar", columnList.get(0));
152+
}
153+
154+
@Test
155+
public void testCurrentDateExpression() throws JSQLParserException{
156+
final List<String> columnList = new ArrayList<String>();
157+
Select select = (Select) CCJSqlParserUtil.parse( "select * from foo where bar < CURRENT_DATE" );
158+
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
159+
Expression where = plainSelect.getWhere();
160+
where.accept(new ExpressionVisitorAdapter() {
161+
162+
@Override
163+
public void visit(Column column) {
164+
super.visit(column);
165+
columnList.add(column.getColumnName());
166+
}
167+
});
168+
169+
assertEquals(1, columnList.size());
170+
assertEquals("bar", columnList.get(0));
171+
}
134172
}

0 commit comments

Comments
 (0)