Skip to content

Commit e30f30d

Browse files
fix: IntervalExpression supports complex expressions
- fixes #2172 Signed-off-by: Andreas Reichel <[email protected]>
1 parent 0c092af commit e30f30d

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

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

+13-3
Original file line numberDiff line numberDiff line change
@@ -5926,15 +5926,25 @@ JsonAggregateFunction JsonAggregateFunction() : {
59265926
}
59275927

59285928
IntervalExpression IntervalExpression() : {
5929-
IntervalExpression interval;
5929+
IntervalExpression interval = new IntervalExpression();
59305930
Token token = null;
59315931
Expression expr = null;
59325932
boolean signed = false;
59335933
}
59345934
{
59355935

5936-
{ interval = new IntervalExpression(); }
5937-
<K_INTERVAL> ["-" {signed=true;}] (token=<S_LONG> | token=<S_DOUBLE> | token=<S_CHAR_LITERAL> | LOOKAHEAD(JdbcParameter()) expr = JdbcParameter() | expr = JdbcNamedParameter() | LOOKAHEAD(Function()) expr = Function() | expr = Column())
5936+
<K_INTERVAL>
5937+
(
5938+
5939+
LOOKAHEAD(3) (
5940+
[ "-" {signed=true;}]
5941+
(token=<S_LONG> | token=<S_DOUBLE>)
5942+
)
5943+
|
5944+
LOOKAHEAD(2) token=<S_CHAR_LITERAL>
5945+
|
5946+
expr = Expression()
5947+
)
59385948
{
59395949
if (expr != null) {
59405950
if (signed) expr = new SignedExpression('-', expr);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package net.sf.jsqlparser.expression;
2+
3+
import net.sf.jsqlparser.JSQLParserException;
4+
import net.sf.jsqlparser.test.TestUtils;
5+
import org.junit.jupiter.api.Test;
6+
7+
8+
class IntervalExpressionTest {
9+
10+
@Test
11+
void testExtractExpressionIssue2172() throws JSQLParserException {
12+
String sqlStr = "select INTERVAL Extract( DAY from Now()) - 1 DAY";
13+
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
14+
15+
sqlStr = "SELECT UNIX_TIMESTAMP(date_sub(date_sub(date_format(now(),'%y-%m-%d'),interval extract(day from now())-1 day),interval 1 month))*1000";
16+
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
17+
}
18+
}

0 commit comments

Comments
 (0)