提交 46bf0299 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Nest joins only if required

上级 636da38e
...@@ -1369,8 +1369,7 @@ public class Parser { ...@@ -1369,8 +1369,7 @@ public class Parser {
} else { } else {
TableFilter top; TableFilter top;
top = readTableFilter(); top = readTableFilter();
top = readJoin(top, false); top = readJoin(top);
top = getNested(top);
read(")"); read(")");
alias = readFromAlias(null); alias = readFromAlias(null);
if (alias != null) { if (alias != null) {
...@@ -1717,8 +1716,7 @@ public class Parser { ...@@ -1717,8 +1716,7 @@ public class Parser {
return command; return command;
} }
private TableFilter readJoin(TableFilter top, boolean nested) { private TableFilter readJoin(TableFilter top) {
boolean joined = false;
TableFilter last = top; TableFilter last = top;
while (true) { while (true) {
TableFilter join; TableFilter join;
...@@ -1727,47 +1725,46 @@ public class Parser { ...@@ -1727,47 +1725,46 @@ public class Parser {
read("JOIN"); read("JOIN");
// the right hand side is the 'inner' table usually // the right hand side is the 'inner' table usually
join = readTableFilter(); join = readTableFilter();
join = readJoin(join, nested); join = readJoin(join);
Expression on = null; Expression on = null;
if (readIf("ON")) { if (readIf("ON")) {
on = readExpression(); on = readExpression();
} }
top = getNested(top); addJoin(join, top, true, on);
join.addJoin(top, true, on);
top = join; top = join;
} else if (readIf("LEFT")) { } else if (readIf("LEFT")) {
readIf("OUTER"); readIf("OUTER");
read("JOIN"); read("JOIN");
join = readTableFilter(); join = readTableFilter();
join = readJoin(join, true); join = readJoin(join);
Expression on = null; Expression on = null;
if (readIf("ON")) { if (readIf("ON")) {
on = readExpression(); on = readExpression();
} }
top.addJoin(join, true, on); addJoin(top, join, true, on);
} else if (readIf("FULL")) { } else if (readIf("FULL")) {
throw getSyntaxError(); throw getSyntaxError();
} else if (readIf("INNER")) { } else if (readIf("INNER")) {
read("JOIN"); read("JOIN");
join = readTableFilter(); join = readTableFilter();
top = readJoin(top, false); top = readJoin(top);
Expression on = null; Expression on = null;
if (readIf("ON")) { if (readIf("ON")) {
on = readExpression(); on = readExpression();
} }
top.addJoin(join, false, on); addJoin(top, join, false, on);
} else if (readIf("JOIN")) { } else if (readIf("JOIN")) {
join = readTableFilter(); join = readTableFilter();
top = readJoin(top, false); top = readJoin(top);
Expression on = null; Expression on = null;
if (readIf("ON")) { if (readIf("ON")) {
on = readExpression(); on = readExpression();
} }
top.addJoin(join, false, on); addJoin(top, join, false, on);
} else if (readIf("CROSS")) { } else if (readIf("CROSS")) {
read("JOIN"); read("JOIN");
join = readTableFilter(); join = readTableFilter();
top.addJoin(join, false, null); addJoin(top, join, false, null);
} else if (readIf("NATURAL")) { } else if (readIf("NATURAL")) {
read("JOIN"); read("JOIN");
join = readTableFilter(); join = readTableFilter();
...@@ -1799,26 +1796,25 @@ public class Parser { ...@@ -1799,26 +1796,25 @@ public class Parser {
} }
} }
} }
top.addJoin(join, false, on); addJoin(top, join, false, on);
} else { } else {
break; break;
} }
joined = true;
last = join; last = join;
} }
if (nested && joined) {
top = getNested(top);
}
return top; return top;
} }
private TableFilter getNested(TableFilter n) { private void addJoin(TableFilter top, TableFilter join, boolean outer, Expression on) {
String joinTable = Constants.PREFIX_JOIN + parseIndex; if (join.getJoin() != null) {
TableFilter top = new TableFilter(session, getDualTable(true), String joinTable = Constants.PREFIX_JOIN + parseIndex;
joinTable, rightsChecked, currentSelect, n.getOrderInFrom(), TableFilter n = new TableFilter(session, getDualTable(true),
null); joinTable, rightsChecked, currentSelect, join.getOrderInFrom(),
top.setNestedJoin(n); null);
return top; n.setNestedJoin(join);
join = n;
}
top.addJoin(join, outer, on);
} }
private Prepared parseExecute() { private Prepared parseExecute() {
...@@ -2149,7 +2145,7 @@ public class Parser { ...@@ -2149,7 +2145,7 @@ public class Parser {
} }
private void parseJoinTableFilter(TableFilter top, final Select command) { private void parseJoinTableFilter(TableFilter top, final Select command) {
top = readJoin(top, false); top = readJoin(top);
command.addTableFilter(top, true); command.addTableFilter(top, true);
boolean isOuter = false; boolean isOuter = false;
while (true) { while (true) {
......
...@@ -380,7 +380,7 @@ public class TestNestedJoins extends TestBase { ...@@ -380,7 +380,7 @@ public class TestNestedJoins extends TestBase {
assertTrue(rs.next()); assertTrue(rs.next());
sql = cleanRemarks(rs.getString(1)); sql = cleanRemarks(rs.getString(1));
assertEquals("SELECT DISTINCT T1.A, T2.A, T3.A FROM PUBLIC.T2 " + assertEquals("SELECT DISTINCT T1.A, T2.A, T3.A FROM PUBLIC.T2 " +
"LEFT OUTER JOIN ( PUBLIC.T3 LEFT OUTER JOIN ( PUBLIC.T1 ) " + "LEFT OUTER JOIN ( PUBLIC.T3 LEFT OUTER JOIN PUBLIC.T1 " +
"ON T1.B = T3.A ) ON T2.B = T1.A", sql); "ON T1.B = T3.A ) ON T2.B = T1.A", sql);
rs = stat.executeQuery("select distinct t1.a, t2.a, t3.a from t1 " + rs = stat.executeQuery("select distinct t1.a, t2.a, t3.a from t1 " +
"right outer join t3 on t1.b=t3.a " + "right outer join t3 on t1.b=t3.a " +
......
...@@ -334,7 +334,7 @@ public class TestOuterJoins extends TestBase { ...@@ -334,7 +334,7 @@ public class TestOuterJoins extends TestBase {
sql = cleanRemarks(rs.getString(1)); sql = cleanRemarks(rs.getString(1));
assertEquals("SELECT DISTINCT T1.A, T2.A, T3.A FROM PUBLIC.T2 " + assertEquals("SELECT DISTINCT T1.A, T2.A, T3.A FROM PUBLIC.T2 " +
"LEFT OUTER JOIN ( PUBLIC.T3 " + "LEFT OUTER JOIN ( PUBLIC.T3 " +
"LEFT OUTER JOIN ( PUBLIC.T1 ) ON T1.B = T3.A ) " + "LEFT OUTER JOIN PUBLIC.T1 ON T1.B = T3.A ) " +
"ON T2.B = T1.A", sql); "ON T2.B = T1.A", sql);
rs = stat.executeQuery("select distinct t1.a, t2.a, t3.a from t1 " + rs = stat.executeQuery("select distinct t1.a, t2.a, t3.a from t1 " +
"right outer join t3 on t1.b=t3.a right outer join t2 on t2.b=t1.a"); "right outer join t3 on t1.b=t3.a right outer join t2 on t2.b=t1.a");
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论