Skip to content

Commit 5ac27a7

Browse files
committed
fixes #99
1 parent e475666 commit 5ac27a7

File tree

4 files changed

+51
-5
lines changed

4 files changed

+51
-5
lines changed

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

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
*/
2222
package net.sf.jsqlparser.statement.select;
2323

24+
import java.util.Iterator;
25+
import java.util.List;
2426
import net.sf.jsqlparser.expression.Alias;
2527
import net.sf.jsqlparser.expression.Expression;
2628
import net.sf.jsqlparser.expression.ExpressionVisitor;
@@ -35,6 +37,7 @@ public class SubSelect implements FromItem, Expression, ItemsList {
3537
private SelectBody selectBody;
3638
private Alias alias;
3739
private boolean useBrackets = true;
40+
private List<WithItem> withItemsList;
3841

3942
private Pivot pivot;
4043

@@ -83,6 +86,14 @@ public boolean isUseBrackets() {
8386
public void setUseBrackets(boolean useBrackets) {
8487
this.useBrackets = useBrackets;
8588
}
89+
90+
public List<WithItem> getWithItemsList() {
91+
return withItemsList;
92+
}
93+
94+
public void setWithItemsList(List<WithItem> withItemsList) {
95+
this.withItemsList = withItemsList;
96+
}
8697

8798
@Override
8899
public void accept(ItemsListVisitor itemsListVisitor) {
@@ -91,8 +102,27 @@ public void accept(ItemsListVisitor itemsListVisitor) {
91102

92103
@Override
93104
public String toString() {
94-
return (useBrackets?"(":"") + selectBody + (useBrackets?")":"")
95-
+ ((pivot != null) ? " " + pivot : "")
96-
+ ((alias != null) ? alias.toString() : "");
105+
StringBuilder retval = new StringBuilder();
106+
if (useBrackets)
107+
retval.append("(");
108+
if (withItemsList != null && !withItemsList.isEmpty()) {
109+
retval.append("WITH ");
110+
for (Iterator<WithItem> iter = withItemsList.iterator(); iter.hasNext();) {
111+
WithItem withItem = (WithItem) iter.next();
112+
retval.append(withItem);
113+
if (iter.hasNext()) {
114+
retval.append(",");
115+
}
116+
retval.append(" ");
117+
}
118+
}
119+
retval.append(selectBody);
120+
if (useBrackets)
121+
retval.append(")");
122+
123+
if (pivot != null) retval.append(" ").append(pivot);
124+
if (alias != null) retval.append(alias.toString());
125+
126+
return retval.toString();
97127
}
98128
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,17 @@ public void visit(SelectExpressionItem selectExpressionItem) {
181181
@Override
182182
public void visit(SubSelect subSelect) {
183183
buffer.append("(");
184+
if (subSelect.getWithItemsList() != null && !subSelect.getWithItemsList().isEmpty()) {
185+
buffer.append("WITH ");
186+
for (Iterator<WithItem> iter = subSelect.getWithItemsList().iterator(); iter.hasNext();) {
187+
WithItem withItem = iter.next();
188+
withItem.accept(this);
189+
if (iter.hasNext()) {
190+
buffer.append(",");
191+
}
192+
buffer.append(" ");
193+
}
194+
}
184195
subSelect.getSelectBody().accept(this);
185196
buffer.append(")");
186197
Pivot pivot = subSelect.getPivot();

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2030,11 +2030,13 @@ Function Function():
20302030
SubSelect SubSelect():
20312031
{
20322032
SelectBody selectBody = null;
2033+
SubSelect subSelect = new SubSelect();
2034+
List<WithItem> with = null;
20332035
}
20342036
{
2037+
[ with=WithList() { subSelect.setWithItemsList(with); } ]
20352038
selectBody=SelectBody()
20362039
{
2037-
SubSelect subSelect = new SubSelect();
20382040
subSelect.setSelectBody(selectBody);
20392041
return subSelect;
20402042
}

src/test/java/net/sf/jsqlparser/test/select/SelectTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1636,5 +1636,8 @@ public void testSelectJoin2() throws JSQLParserException {
16361636
public void testSelectOracleColl() throws JSQLParserException {
16371637
assertSqlCanBeParsedAndDeparsed("SELECT * FROM the_table tt WHERE TT.COL1 = lines(idx).COL1");
16381638
}
1639-
1639+
1640+
public void testSelectInnerWith() throws JSQLParserException {
1641+
assertSqlCanBeParsedAndDeparsed("SELECT * FROM (WITH actor AS (SELECT 'a' aid FROM DUAL) SELECT aid FROM actor)");
1642+
}
16401643
}

0 commit comments

Comments
 (0)