Skip to content

Commit 6c30062

Browse files
committed
merge oracle hierarchical syntax into main
2 parents 3901bc6 + b48f26e commit 6c30062

File tree

11 files changed

+209
-10
lines changed

11 files changed

+209
-10
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/expression/operators/relational/InExpression.java

100755100644
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,15 @@ public InExpression(Expression leftExpression, ItemsList itemsList) {
4141
setRightItemsList(itemsList);
4242
}
4343

44+
@Override
4445
public void setOldOracleJoinSyntax(int oldOracleJoinSyntax) {
4546
this.oldOracleJoinSyntax = oldOracleJoinSyntax;
4647
if (oldOracleJoinSyntax < 0 || oldOracleJoinSyntax > 1) {
4748
throw new IllegalArgumentException("unexpected join type for oracle found with IN (type=" + oldOracleJoinSyntax + ")");
4849
}
4950
}
5051

52+
@Override
5153
public int getOldOracleJoinSyntax() {
5254
return oldOracleJoinSyntax;
5355
}
@@ -97,4 +99,16 @@ private String getLeftExpressionString() {
9799
public String toString() {
98100
return (leftExpression == null ? leftItemsList : getLeftExpressionString()) + " " + ((not) ? "NOT " : "") + "IN " + rightItemsList + "";
99101
}
102+
103+
@Override
104+
public int getOraclePriorPosition() {
105+
return SupportsOldOracleJoinSyntax.NO_ORACLE_PRIOR;
106+
}
107+
108+
@Override
109+
public void setOraclePriorPosition(int priorPosition) {
110+
if (priorPosition != SupportsOldOracleJoinSyntax.NO_ORACLE_PRIOR) {
111+
throw new IllegalArgumentException("unexpected prior for oracle found");
112+
}
113+
}
100114
}

src/main/java/net/sf/jsqlparser/expression/operators/relational/OldOracleJoinBinaryExpression.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@
2222
package net.sf.jsqlparser.expression.operators.relational;
2323

2424
import net.sf.jsqlparser.expression.BinaryExpression;
25+
import static net.sf.jsqlparser.expression.operators.relational.SupportsOldOracleJoinSyntax.ORACLE_PRIOR_START;
2526

2627
public abstract class OldOracleJoinBinaryExpression extends BinaryExpression implements SupportsOldOracleJoinSyntax {
2728

2829
private int oldOracleJoinSyntax = NO_ORACLE_JOIN;
30+
31+
private int oraclePriorPosition = NO_ORACLE_PRIOR;
2932

3033
@Override
3134
public void setOldOracleJoinSyntax(int oldOracleJoinSyntax) {
@@ -37,11 +40,28 @@ public void setOldOracleJoinSyntax(int oldOracleJoinSyntax) {
3740

3841
@Override
3942
public String toString() {
40-
return (isNot() ? "NOT " : "") + getLeftExpression() + (oldOracleJoinSyntax == ORACLE_JOIN_RIGHT ? "(+)" : "") + " " + getStringExpression() + " " + getRightExpression() + (oldOracleJoinSyntax == ORACLE_JOIN_LEFT ? "(+)" : "");
43+
return (isNot() ? "NOT " : "")
44+
+ (oraclePriorPosition == ORACLE_PRIOR_START ? "PRIOR " : "")
45+
+ getLeftExpression()
46+
+ (oldOracleJoinSyntax == ORACLE_JOIN_RIGHT ? "(+)" : "") + " "
47+
+ getStringExpression() + " "
48+
+ (oraclePriorPosition == ORACLE_PRIOR_END ? "PRIOR " : "")
49+
+ getRightExpression()
50+
+ (oldOracleJoinSyntax == ORACLE_JOIN_LEFT ? "(+)" : "");
4151
}
4252

4353
@Override
4454
public int getOldOracleJoinSyntax() {
4555
return oldOracleJoinSyntax;
4656
}
57+
58+
@Override
59+
public int getOraclePriorPosition() {
60+
return oraclePriorPosition;
61+
}
62+
63+
@Override
64+
public void setOraclePriorPosition(int oraclePriorPosition) {
65+
this.oraclePriorPosition = oraclePriorPosition;
66+
}
4767
}

src/main/java/net/sf/jsqlparser/expression/operators/relational/SupportsOldOracleJoinSyntax.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,12 @@ public interface SupportsOldOracleJoinSyntax {
3030
int getOldOracleJoinSyntax();
3131

3232
void setOldOracleJoinSyntax(int oldOracleJoinSyntax);
33+
34+
static final int NO_ORACLE_PRIOR = 0;
35+
static final int ORACLE_PRIOR_START = 1;
36+
static final int ORACLE_PRIOR_END = 2;
37+
38+
int getOraclePriorPosition();
39+
40+
void setOraclePriorPosition(int priorPosition);
3341
}

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

100755100644
Lines changed: 29 additions & 3 deletions
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,8 @@ public class PlainSelect implements SelectBody {
4344
private Expression having;
4445
private Limit limit;
4546
private Top top;
47+
private OracleHierarchicalExpression oracleHierarchical = null;
48+
private boolean oracleSiblings = false;
4649

4750
/**
4851
* The {@link FromItem} in this query
@@ -159,7 +162,23 @@ public void setGroupByColumnReferences(List<Expression> list) {
159162
groupByColumnReferences = list;
160163
}
161164

162-
@Override
165+
public OracleHierarchicalExpression getOracleHierarchical() {
166+
return oracleHierarchical;
167+
}
168+
169+
public void setOracleHierarchical(OracleHierarchicalExpression oracleHierarchical) {
170+
this.oracleHierarchical = oracleHierarchical;
171+
}
172+
173+
public boolean isOracleSiblings() {
174+
return oracleSiblings;
175+
}
176+
177+
public void setOracleSiblings(boolean oracleSiblings) {
178+
this.oracleSiblings = oracleSiblings;
179+
}
180+
181+
@Override
163182
public String toString() {
164183
StringBuilder sql = new StringBuilder("SELECT ");
165184
if (distinct != null) {
@@ -186,11 +205,14 @@ public String toString() {
186205
if (where != null) {
187206
sql.append(" WHERE ").append(where);
188207
}
208+
if (oracleHierarchical != null) {
209+
sql.append(oracleHierarchical.toString());
210+
}
189211
sql.append(getFormatedList(groupByColumnReferences, "GROUP BY"));
190212
if (having != null) {
191213
sql.append(" HAVING ").append(having);
192214
}
193-
sql.append(orderByToString(orderByElements));
215+
sql.append(orderByToString(oracleSiblings, orderByElements));
194216
if (limit != null) {
195217
sql.append(limit);
196218
}
@@ -199,7 +221,11 @@ public String toString() {
199221
}
200222

201223
public static String orderByToString(List<OrderByElement> orderByElements) {
202-
return getFormatedList(orderByElements, "ORDER BY");
224+
return orderByToString(false, orderByElements);
225+
}
226+
227+
public static String orderByToString(boolean oracleSiblings, List<OrderByElement> orderByElements) {
228+
return getFormatedList(orderByElements, oracleSiblings?"ORDER SIBLINGS BY":"ORDER BY");
203229
}
204230

205231
public static String getFormatedList(List<?> list, String expression) {

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/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java

100755100644
Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ public void visit(PlainSelect plainSelect) {
9595
}
9696
}
9797

98+
if (plainSelect.getOracleHierarchical() != null) {
99+
plainSelect.getOracleHierarchical().accept(expressionVisitor);
100+
}
101+
98102
if (plainSelect.getWhere() != null) {
99103
buffer.append(" WHERE ");
100104
plainSelect.getWhere().accept(expressionVisitor);
@@ -117,7 +121,7 @@ public void visit(PlainSelect plainSelect) {
117121
}
118122

119123
if (plainSelect.getOrderByElements() != null) {
120-
deparseOrderBy(plainSelect.getOrderByElements());
124+
deparseOrderBy(plainSelect.isOracleSiblings(), plainSelect.getOrderByElements());
121125
}
122126

123127
if (plainSelect.getLimit() != null) {
@@ -212,7 +216,14 @@ public void visit(PivotXml pivot) {
212216
}
213217

214218
public void deparseOrderBy(List<OrderByElement> orderByElements) {
215-
buffer.append(" ORDER BY ");
219+
deparseOrderBy(false, orderByElements);
220+
}
221+
222+
public void deparseOrderBy(boolean oracleSiblings, List<OrderByElement> orderByElements) {
223+
if (oracleSiblings)
224+
buffer.append(" ORDER SIBLINGS BY ");
225+
else
226+
buffer.append(" ORDER BY ");
216227
for (Iterator<OrderByElement> iter = orderByElements.iterator(); iter.hasNext();) {
217228
OrderByElement orderByElement = iter.next();
218229
orderByElement.accept(this);

0 commit comments

Comments
 (0)