Skip to content

Commit afa6e2d

Browse files
committed
OracleHierarchicalExpression implemented
1 parent aff5360 commit afa6e2d

File tree

6 files changed

+115
-6
lines changed

6 files changed

+115
-6
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,6 @@ public interface ExpressionVisitor {
138138
void visit(ExtractExpression eexpr);
139139

140140
void visit(IntervalExpression iexpr);
141+
142+
void visit(OracleHierarchicalExpression oexpr);
141143
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2013 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+
/**
25+
*
26+
* @author toben
27+
*/
28+
public class OracleHierarchicalExpression implements Expression {
29+
30+
private Expression startExpression;
31+
private Expression connectExpression;
32+
private boolean noCycle = false;
33+
34+
public Expression getStartExpression() {
35+
return startExpression;
36+
}
37+
38+
public void setStartExpression(Expression startExpression) {
39+
this.startExpression = startExpression;
40+
}
41+
42+
public Expression getConnectExpression() {
43+
return connectExpression;
44+
}
45+
46+
public void setConnectExpression(Expression connectExpression) {
47+
this.connectExpression = connectExpression;
48+
}
49+
50+
public boolean isNoCycle() {
51+
return noCycle;
52+
}
53+
54+
public void setNoCycle(boolean noCycle) {
55+
this.noCycle = noCycle;
56+
}
57+
58+
@Override
59+
public void accept(ExpressionVisitor expressionVisitor) {
60+
expressionVisitor.visit(this);
61+
}
62+
63+
public String toString() {
64+
StringBuilder b = new StringBuilder();
65+
if (startExpression != null) {
66+
b.append(" START WITH ").append(startExpression.toString());
67+
}
68+
b.append(" CONNECT BY ");
69+
if (isNoCycle()) {
70+
b.append("NOCYCLE ");
71+
}
72+
b.append(connectExpression.toString());
73+
return b.toString();
74+
}
75+
}

src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java

100755100644
Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import java.util.Iterator;
2828
import java.util.List;
29+
import net.sf.jsqlparser.expression.OracleHierarchicalExpression;
2930

3031
/**
3132
* The core of a "SELECT" statement (no UNION, no ORDER BY)
@@ -43,6 +44,7 @@ public class PlainSelect implements SelectBody {
4344
private Expression having;
4445
private Limit limit;
4546
private Top top;
47+
private OracleHierarchicalExpression oracleHierarchical = null;
4648

4749
/**
4850
* The {@link FromItem} in this query
@@ -159,7 +161,15 @@ public void setGroupByColumnReferences(List<Expression> list) {
159161
groupByColumnReferences = list;
160162
}
161163

162-
@Override
164+
public OracleHierarchicalExpression getOracleHierarchical() {
165+
return oracleHierarchical;
166+
}
167+
168+
public void setOracleHierarchical(OracleHierarchicalExpression oracleHierarchical) {
169+
this.oracleHierarchical = oracleHierarchical;
170+
}
171+
172+
@Override
163173
public String toString() {
164174
StringBuilder sql = new StringBuilder("SELECT ");
165175
if (distinct != null) {
@@ -186,6 +196,9 @@ public String toString() {
186196
if (where != null) {
187197
sql.append(" WHERE ").append(where);
188198
}
199+
if (oracleHierarchical != null) {
200+
sql.append(oracleHierarchical.toString());
201+
}
189202
sql.append(getFormatedList(groupByColumnReferences, "GROUP BY"));
190203
if (having != null) {
191204
sql.append(" HAVING ").append(having);

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import net.sf.jsqlparser.expression.JdbcParameter;
4242
import net.sf.jsqlparser.expression.LongValue;
4343
import net.sf.jsqlparser.expression.NullValue;
44+
import net.sf.jsqlparser.expression.OracleHierarchicalExpression;
4445
import net.sf.jsqlparser.expression.Parenthesis;
4546
import net.sf.jsqlparser.expression.StringValue;
4647
import net.sf.jsqlparser.expression.TimeValue;
@@ -501,4 +502,8 @@ public void visit(IntervalExpression iexpr) {
501502
@Override
502503
public void visit(JdbcNamedParameter jdbcNamedParameter) {
503504
}
505+
506+
@Override
507+
public void visit(OracleHierarchicalExpression oexpr) {
508+
}
504509
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,4 +482,9 @@ public void visit(IntervalExpression iexpr) {
482482
public void visit(JdbcNamedParameter jdbcNamedParameter) {
483483
buffer.append(jdbcNamedParameter.toString());
484484
}
485+
486+
@Override
487+
public void visit(OracleHierarchicalExpression oexpr) {
488+
buffer.append(oexpr.toString());
489+
}
485490
}

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ import net.sf.jsqlparser.expression.ExtractExpression;
8181
import net.sf.jsqlparser.expression.WhenClause;
8282
import net.sf.jsqlparser.expression.AnyComparisonExpression;
8383
import net.sf.jsqlparser.expression.AllComparisonExpression;
84+
import net.sf.jsqlparser.expression.OracleHierarchicalExpression;
8485
import net.sf.jsqlparser.expression.operators.arithmetic.Addition;
8586
import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseAnd;
8687
import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseOr;
@@ -257,6 +258,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
257258
| <K_START:"START">
258259
| <K_CONNECT:"CONNECT">
259260
| <K_PRIOR:"PRIOR">
261+
| <K_NOCYCLE:"NOCYCLE">
260262
}
261263

262264

@@ -597,6 +599,7 @@ PlainSelect PlainSelect():
597599
Expression having = null;
598600
Limit limit = null;
599601
Top top = null;
602+
OracleHierarchicalExpression oracleHierarchicalQueryClause = null;
600603
}
601604
{
602605
<K_SELECT>
@@ -623,7 +626,7 @@ PlainSelect PlainSelect():
623626
joins=JoinsList() ]
624627

625628
[ where=WhereClause() { plainSelect.setWhere(where); }]
626-
[ OracleHierarchicalQueryClause() ]
629+
[ oracleHierarchicalQueryClause=OracleHierarchicalQueryClause() { plainSelect.setOracleHierarchical(oracleHierarchicalQueryClause); } ]
627630
[ groupByColumnReferences=GroupByColumnReferences() { plainSelect.setGroupByColumnReferences(groupByColumnReferences); }]
628631
[ having=Having() { plainSelect.setHaving(having); }]
629632
[LOOKAHEAD(2) orderByElements = OrderByElements() { plainSelect.setOrderByElements(orderByElements); } ]
@@ -1083,12 +1086,18 @@ Expression WhereClause():
10831086
{ return retval; }
10841087
}
10851088

1086-
Expression OracleHierarchicalQueryClause(): {}
1089+
OracleHierarchicalExpression OracleHierarchicalQueryClause():
10871090
{
1088-
[ <K_START> <K_WITH> AndExpression() ]
1089-
<K_CONNECT> <K_BY> [ "NOCYCLE" ] { allowOraclePrior=true; } AndExpression() { allowOraclePrior=false; }
1091+
OracleHierarchicalExpression result = new OracleHierarchicalExpression();
1092+
Expression expr;
1093+
}
1094+
{
1095+
[ <K_START> <K_WITH> expr=AndExpression() {result.setStartExpression(expr);} ]
1096+
<K_CONNECT> <K_BY> [ <K_NOCYCLE> { result.setNoCycle(true); } ]
1097+
{ allowOraclePrior=true; } expr=AndExpression()
1098+
{ result.setConnectExpression(expr);allowOraclePrior=false; }
10901099

1091-
{ return null; }
1100+
{ return result; }
10921101
}
10931102

10941103

0 commit comments

Comments
 (0)