From 210e3979ad8cba47e8540b2547df684746533fe3 Mon Sep 17 00:00:00 2001 From: "ryan.murphy" Date: Fri, 24 Mar 2017 14:45:59 -0600 Subject: [PATCH] Issue 391 expression for interval. --- .../expression/ExpressionVisitorAdapter.java | 1 + .../expression/IntervalExpression.java | 6 ++-- .../sf/jsqlparser/util/TablesNamesFinder.java | 1 + .../util/deparser/ExpressionDeParser.java | 6 +++- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 35 ++++++++++++------- .../sf/jsqlparser/test/select/SelectTest.java | 2 +- 6 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java index 2d3bc9e48..9927c916b 100644 --- a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java @@ -314,6 +314,7 @@ public void visit(ExtractExpression expr) { @Override public void visit(IntervalExpression expr) { + expr.getParameter().accept(this); } @Override diff --git a/src/main/java/net/sf/jsqlparser/expression/IntervalExpression.java b/src/main/java/net/sf/jsqlparser/expression/IntervalExpression.java index 4d62bf5d6..933a57ba8 100644 --- a/src/main/java/net/sf/jsqlparser/expression/IntervalExpression.java +++ b/src/main/java/net/sf/jsqlparser/expression/IntervalExpression.java @@ -27,14 +27,14 @@ */ public class IntervalExpression implements Expression { - private String parameter = null; + private Expression parameter = null; private String intervalType = null; - public String getParameter() { + public Expression getParameter() { return parameter; } - public void setParameter(String parameter) { + public void setParameter(Expression parameter) { this.parameter = parameter; } diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index a2cd25826..075983682 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -421,6 +421,7 @@ protected void init() { @Override public void visit(IntervalExpression iexpr) { + iexpr.getParameter().accept(this); } @Override 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 c8d980087..9b2881885 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java @@ -522,7 +522,11 @@ public void visit(MultiExpressionList multiExprList) { @Override public void visit(IntervalExpression iexpr) { - buffer.append(iexpr.toString()); + buffer.append("INTERVAL "); + iexpr.getParameter().accept(this); + if(iexpr.getIntervalType() != null) { + buffer.append(" ").append(iexpr.getIntervalType()); + } } @Override diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 4866aaa5f..80332292e 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -2272,12 +2272,13 @@ JsonExpression JsonExpression() : { IntervalExpression IntervalExpression() : { IntervalExpression interval = new IntervalExpression(); + Expression item; Token token; boolean signed = false; } { - ["-" {signed=true;}] (token= | token= | token=) - { interval.setParameter((signed?"-":"") + token.image); } + (item = PrimaryExpression()) + { interval.setParameter(item); } [ LOOKAHEAD(2) token = { interval.setIntervalType(token.image); } ] { return interval; @@ -3095,20 +3096,30 @@ List AlterExpressionConstraintState(): } { ( - ( {retval.add(new DeferrableConstraint(false));} + ( + {retval.add(new DeferrableConstraint(false));} ) | ( - {retval.add(new DeferrableConstraint(true));} ) + {retval.add(new DeferrableConstraint(true));} + ) + | + ( + {retval.add(new ValidateConstraint(false));} + ) + | + ( + {retval.add(new ValidateConstraint(true));} + ) | - ( {retval.add(new ValidateConstraint(false));} - ) | - ( {retval.add(new ValidateConstraint(true));} - ) | - ( {retval.add(new EnableConstraint(false));} - ) | - ( {retval.add(new EnableConstraint(true));} - ) )* + ( + {retval.add(new EnableConstraint(false));} + ) + | + ( + {retval.add(new EnableConstraint(true));} + ) + )* { return retval; } diff --git a/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java b/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java index 440d05eb4..0c6aa800c 100644 --- a/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java +++ b/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java @@ -1852,7 +1852,7 @@ public void testInterval2() throws JSQLParserException { assertTrue(sub.getRightExpression() instanceof IntervalExpression); IntervalExpression iexpr = (IntervalExpression) sub.getRightExpression(); - assertEquals("'45 MINUTE'", iexpr.getParameter()); + assertEquals("'45 MINUTE'", iexpr.getParameter().toString()); } public void testInterval3() throws JSQLParserException {