Skip to content

Commit 8456acf

Browse files
fjalvinghwumpz
authored andcommitted
Fix issue #563: subjoin allows only one inner join, this should be a … (#564)
* Fix issue #563: subjoin allows only one inner join, this should be a list * Fix failing Oracle tests because of confusion between subjoin and subselect.
1 parent 21e8bc4 commit 8456acf

File tree

5 files changed

+47
-19
lines changed

5 files changed

+47
-19
lines changed

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

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,17 @@
2323

2424
import net.sf.jsqlparser.expression.Alias;
2525

26+
import java.util.List;
27+
2628
/**
27-
* A table created by "(tab1 join tab2)".
29+
* A table created by "(tab1 [join tab2]* )".
2830
*/
2931
public class SubJoin implements FromItem {
3032

3133
private FromItem left;
32-
private Join join;
3334
private Alias alias;
3435
private Pivot pivot;
36+
private List<Join> joinList;
3537

3638
@Override
3739
public void accept(FromItemVisitor fromItemVisitor) {
@@ -46,12 +48,12 @@ public void setLeft(FromItem l) {
4648
left = l;
4749
}
4850

49-
public Join getJoin() {
50-
return join;
51+
public List<Join> getJoinList() {
52+
return joinList;
5153
}
5254

53-
public void setJoin(Join j) {
54-
join = j;
55+
public void setJoinList(List<Join> joinList) {
56+
this.joinList = joinList;
5557
}
5658

5759
@Override
@@ -76,8 +78,13 @@ public void setAlias(Alias alias) {
7678

7779
@Override
7880
public String toString() {
79-
return "(" + left + " " + join + ")"
80-
+ ((alias != null) ? alias.toString() : "")
81-
+ ((pivot != null) ? " " + pivot : "");
81+
StringBuilder sb = new StringBuilder();
82+
sb.append("(").append(left);
83+
for(Join j : joinList) {
84+
sb.append(" ").append(j);
85+
}
86+
87+
sb.append(")").append((alias != null) ? (" " + alias.toString()) : "").append((pivot != null) ? " " + pivot : "");
88+
return sb.toString();
8289
}
8390
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,9 @@ public void visit(AnyComparisonExpression anyComparisonExpression) {
458458
@Override
459459
public void visit(SubJoin subjoin) {
460460
subjoin.getLeft().accept(this);
461-
subjoin.getJoin().getRightItem().accept(this);
461+
for(Join join : subjoin.getJoinList()) {
462+
join.getRightItem().accept(this);
463+
}
462464
}
463465

464466
@Override

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,9 @@ public void setExpressionVisitor(ExpressionVisitor visitor) {
329329
public void visit(SubJoin subjoin) {
330330
buffer.append("(");
331331
subjoin.getLeft().accept(this);
332-
deparseJoin(subjoin.getJoin());
332+
for(Join join : subjoin.getJoinList()) {
333+
deparseJoin(join);
334+
}
333335
buffer.append(")");
334336

335337
if (subjoin.getPivot() != null) {

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1558,11 +1558,13 @@ FromItem SubJoin():
15581558
{
15591559
FromItem fromItem = null;
15601560
Join join = null;
1561+
List joinList = null;
15611562
SubJoin subJoin = new SubJoin();
15621563
}
15631564
{
15641565
fromItem=FromItem() { subJoin.setLeft(fromItem); }
1565-
join=JoinerExpression() { subJoin.setJoin(join); }
1566+
// join=JoinerExpression() { subJoin.setJoin(join); }
1567+
joinList=SubJoinsList() { subJoin.setJoinList(joinList); }
15661568

15671569
{
15681570
return subJoin;
@@ -1581,6 +1583,19 @@ List<Join> JoinsList():
15811583
{ return joinsList; }
15821584
}
15831585

1586+
List SubJoinsList():
1587+
{
1588+
List<Join> joinsList = new ArrayList<Join>();
1589+
Join join = null;
1590+
}
1591+
{
1592+
1593+
(join=JoinerExpression() { joinsList.add(join); })+
1594+
1595+
{ return joinsList; }
1596+
}
1597+
1598+
15841599
Join JoinerExpression() #JoinerExpression:
15851600
{
15861601
Join join = new Join();

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,21 @@
1818
*/
1919
package net.sf.jsqlparser.test.select;
2020

21-
import java.io.File;
22-
import java.io.IOException;
23-
import java.util.logging.Level;
24-
import java.util.logging.Logger;
2521
import net.sf.jsqlparser.JSQLParserException;
2622
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
2723
import net.sf.jsqlparser.statement.Statement;
28-
29-
import static net.sf.jsqlparser.test.TestUtils.*;
3024
import org.apache.commons.io.FileUtils;
31-
import static org.junit.Assert.assertTrue;
3225
import org.junit.ComparisonFailure;
3326
import org.junit.Test;
3427

28+
import java.io.File;
29+
import java.io.IOException;
30+
import java.util.logging.Level;
31+
import java.util.logging.Logger;
32+
33+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
34+
import static org.junit.Assert.assertTrue;
35+
3536
/**
3637
* Tries to parse and deparse all statments in net.sf.jsqlparser.test.oracle-tests.
3738
*
@@ -63,6 +64,7 @@ public void testAllSqlsParseDeparse() throws IOException {
6364
success++;
6465
LOG.info(" -> SUCCESS");
6566
} catch (JSQLParserException ex) {
67+
ex.printStackTrace();
6668
//LOG.log(Level.SEVERE, null, ex);
6769
LOG.log(Level.INFO, " -> PROBLEM {0}", ex.toString());
6870
} catch (Exception ex) {

0 commit comments

Comments
 (0)