From 5492f5105a757817c4d18119751006f9c1ccc32d Mon Sep 17 00:00:00 2001 From: Tomer S Date: Fri, 26 Jul 2019 20:15:25 +0300 Subject: [PATCH] The duration part in INTERVAL expressions can contain a column and not only a constant - now supporting that use case --- .../jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt | 11 +++++++++-- .../sf/jsqlparser/statement/select/SelectTest.java | 6 ++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index adb6cd7c6..aff6dac8e 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -2955,13 +2955,20 @@ JsonExpression JsonExpression() : { IntervalExpression IntervalExpression() : { IntervalExpression interval; + Column col; Token token; boolean signed = false; } { { interval = new IntervalExpression(); } - ["-" {signed=true;}] (token= | token= | token= ) - { interval.setParameter((signed?"-":"") + token.image); } + ["-" {signed=true;}] + ( + ((token= | token= | token= ) + { interval.setParameter((signed?"-":"") + token.image); }) + | + (col=Column() + { interval.setExpression(col); }) + ) [ LOOKAHEAD(2) (token = | token = ) { interval.setIntervalType(token.image); } ] { return interval; diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java index 2dd405a8c..6327368f8 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java @@ -2177,6 +2177,12 @@ public void testValues6BothVariants() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(stmt); } + @Test + public void testIntervalWithColumn() throws JSQLParserException { + String stmt = "SELECT DATE_ADD(start_date, INTERVAL duration MINUTE) AS end_datetime FROM appointment"; + assertSqlCanBeParsedAndDeparsed(stmt); + } + @Test public void testInterval1() throws JSQLParserException { String stmt = "SELECT 5 + INTERVAL '3 days'";