Skip to content

Commit

Permalink
Fix issue #563: subjoin allows only one inner join, this should be a … (
Browse files Browse the repository at this point in the history
#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.
  • Loading branch information
fjalvingh authored and wumpz committed Feb 2, 2018
1 parent 21e8bc4 commit 8456acf
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 19 deletions.
25 changes: 16 additions & 9 deletions src/main/java/net/sf/jsqlparser/statement/select/SubJoin.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,17 @@

import net.sf.jsqlparser.expression.Alias;

import java.util.List;

/**
* A table created by "(tab1 join tab2)".
* A table created by "(tab1 [join tab2]* )".
*/
public class SubJoin implements FromItem {

private FromItem left;
private Join join;
private Alias alias;
private Pivot pivot;
private List<Join> joinList;

@Override
public void accept(FromItemVisitor fromItemVisitor) {
Expand All @@ -46,12 +48,12 @@ public void setLeft(FromItem l) {
left = l;
}

public Join getJoin() {
return join;
public List<Join> getJoinList() {
return joinList;
}

public void setJoin(Join j) {
join = j;
public void setJoinList(List<Join> joinList) {
this.joinList = joinList;
}

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

@Override
public String toString() {
return "(" + left + " " + join + ")"
+ ((alias != null) ? alias.toString() : "")
+ ((pivot != null) ? " " + pivot : "");
StringBuilder sb = new StringBuilder();
sb.append("(").append(left);
for(Join j : joinList) {
sb.append(" ").append(j);
}

sb.append(")").append((alias != null) ? (" " + alias.toString()) : "").append((pivot != null) ? " " + pivot : "");
return sb.toString();
}
}
4 changes: 3 additions & 1 deletion src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,9 @@ public void visit(AnyComparisonExpression anyComparisonExpression) {
@Override
public void visit(SubJoin subjoin) {
subjoin.getLeft().accept(this);
subjoin.getJoin().getRightItem().accept(this);
for(Join join : subjoin.getJoinList()) {
join.getRightItem().accept(this);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,9 @@ public void setExpressionVisitor(ExpressionVisitor visitor) {
public void visit(SubJoin subjoin) {
buffer.append("(");
subjoin.getLeft().accept(this);
deparseJoin(subjoin.getJoin());
for(Join join : subjoin.getJoinList()) {
deparseJoin(join);
}
buffer.append(")");

if (subjoin.getPivot() != null) {
Expand Down
17 changes: 16 additions & 1 deletion src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -1558,11 +1558,13 @@ FromItem SubJoin():
{
FromItem fromItem = null;
Join join = null;
List joinList = null;
SubJoin subJoin = new SubJoin();
}
{
fromItem=FromItem() { subJoin.setLeft(fromItem); }
join=JoinerExpression() { subJoin.setJoin(join); }
// join=JoinerExpression() { subJoin.setJoin(join); }
joinList=SubJoinsList() { subJoin.setJoinList(joinList); }

{
return subJoin;
Expand All @@ -1581,6 +1583,19 @@ List<Join> JoinsList():
{ return joinsList; }
}

List SubJoinsList():
{
List<Join> joinsList = new ArrayList<Join>();
Join join = null;
}
{

(join=JoinerExpression() { joinsList.add(join); })+

{ return joinsList; }
}


Join JoinerExpression() #JoinerExpression:
{
Join join = new Join();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,21 @@
*/
package net.sf.jsqlparser.test.select;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;

import static net.sf.jsqlparser.test.TestUtils.*;
import org.apache.commons.io.FileUtils;
import static org.junit.Assert.assertTrue;
import org.junit.ComparisonFailure;
import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
import static org.junit.Assert.assertTrue;

/**
* Tries to parse and deparse all statments in net.sf.jsqlparser.test.oracle-tests.
*
Expand Down Expand Up @@ -63,6 +64,7 @@ public void testAllSqlsParseDeparse() throws IOException {
success++;
LOG.info(" -> SUCCESS");
} catch (JSQLParserException ex) {
ex.printStackTrace();
//LOG.log(Level.SEVERE, null, ex);
LOG.log(Level.INFO, " -> PROBLEM {0}", ex.toString());
} catch (Exception ex) {
Expand Down

0 comments on commit 8456acf

Please sign in to comment.