Skip to content

Commit 865a3bf

Browse files
authored
Add support clickhouse GLOBAL ANY/ALL JOIN syntax variants (#2385)
1 parent c7b3bdb commit 865a3bf

File tree

4 files changed

+99
-2
lines changed

4 files changed

+99
-2
lines changed

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public class Join extends ASTNodeAccessImpl {
3535
private boolean simple = false;
3636
private boolean cross = false;
3737
private boolean semi = false;
38+
private boolean any = false;
39+
private boolean all = false;
3840
private boolean straight = false;
3941
private boolean apply = false;
4042
private boolean fetch = false;
@@ -186,6 +188,48 @@ public Join withSemi(boolean b) {
186188
return this;
187189
}
188190

191+
/**
192+
* Whether is an "ANY" join
193+
*
194+
* @return true if is an "ANY" join
195+
*/
196+
public boolean isAny() {
197+
return any;
198+
}
199+
200+
public void setAny(boolean b) {
201+
if (b) {
202+
all = false;
203+
}
204+
any = b;
205+
}
206+
207+
public Join withAny(boolean b) {
208+
this.setAny(b);
209+
return this;
210+
}
211+
212+
/**
213+
* Whether is an "ALL" join
214+
*
215+
* @return true if is an "ALL" join
216+
*/
217+
public boolean isAll() {
218+
return all;
219+
}
220+
221+
public void setAll(boolean b) {
222+
if (b) {
223+
any = false;
224+
}
225+
all = b;
226+
}
227+
228+
public Join withAll(boolean b) {
229+
this.setAll(b);
230+
return this;
231+
}
232+
189233
/**
190234
* Whether is a "LEFT" join
191235
*
@@ -421,6 +465,12 @@ public String toString() {
421465
builder.append("NATURAL ");
422466
}
423467

468+
if (isAny()) {
469+
builder.append("ANY ");
470+
} else if (isAll()) {
471+
builder.append("ALL ");
472+
}
473+
424474
if (isRight()) {
425475
builder.append("RIGHT ");
426476
} else if (isFull()) {

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,12 @@ public void deparseJoin(Join join) {
597597
builder.append(" NATURAL");
598598
}
599599

600+
if (join.isAny()) {
601+
builder.append(" ANY");
602+
} else if (join.isAll()) {
603+
builder.append(" ALL");
604+
}
605+
600606
if (join.isRight()) {
601607
builder.append(" RIGHT");
602608
} else if (join.isFull()) {

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4964,17 +4964,18 @@ Join JoinerExpression() #JoinerExpression:
49644964
}
49654965
{
49664966
[ <K_GLOBAL> { join.setGlobal(true); } ]
4967+
[ <K_ANY> { join.setAny(true); } | <K_ALL> { join.setAll(true); } ]
49674968
[ <K_NATURAL> { join.setNatural(true); } ]
49684969

49694970
[
49704971
(
4971-
<K_LEFT> { join.setLeft(true); } [ <K_SEMI> { join.setSemi(true); } | <K_OUTER> { join.setOuter(true); } ]
4972+
<K_LEFT> { join.setLeft(true); } [ <K_SEMI> { join.setSemi(true); } | <K_OUTER> { join.setOuter(true); } | <K_ANY> { join.setAny(true); } | <K_ALL> { join.setAll(true); } ]
49724973
|
49734974
(
49744975
<K_RIGHT> { join.setRight(true); }
49754976
|
49764977
<K_FULL> { join.setFull(true); }
4977-
) [ <K_OUTER> { join.setOuter(true); } ]
4978+
) [ <K_OUTER> { join.setOuter(true); } | <K_ANY> { join.setAny(true); } | <K_ALL> { join.setAll(true); } ]
49784979
|
49794980
<K_INNER> { join.setInner(true); }
49804981
)

src/test/java/net/sf/jsqlparser/statement/select/ClickHouseTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,46 @@ public void testGlobalJoin() throws JSQLParserException {
2626
assertSqlCanBeParsedAndDeparsed(sql, true);
2727
}
2828

29+
@Test
30+
public void testGlobalAnyLeftJoin() throws JSQLParserException {
31+
String sql = "SELECT * FROM events e GLOBAL ANY LEFT JOIN users u ON e.user_id = u.id";
32+
PlainSelect select = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true);
33+
Join join = select.getJoins().get(0);
34+
Assertions.assertTrue(join.isGlobal());
35+
Assertions.assertTrue(join.isAny());
36+
Assertions.assertTrue(join.isLeft());
37+
}
38+
39+
@Test
40+
public void testGlobalAllRightJoin() throws JSQLParserException {
41+
String sql = "SELECT * FROM events e GLOBAL ALL RIGHT JOIN users u ON e.user_id = u.id";
42+
PlainSelect select = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true);
43+
Join join = select.getJoins().get(0);
44+
Assertions.assertTrue(join.isGlobal());
45+
Assertions.assertTrue(join.isAll());
46+
Assertions.assertTrue(join.isRight());
47+
}
48+
49+
@Test
50+
public void testLeftAnyJoinOrderVariant() throws JSQLParserException {
51+
String sql = "SELECT * FROM events e LEFT ANY JOIN users u ON e.user_id = u.id";
52+
Select statement = (Select) CCJSqlParserUtil.parse(sql);
53+
PlainSelect select = (PlainSelect) statement.getSelectBody();
54+
Join join = select.getJoins().get(0);
55+
Assertions.assertTrue(join.isAny());
56+
Assertions.assertTrue(join.isLeft());
57+
}
58+
59+
@Test
60+
public void testRightAllJoinOrderVariant() throws JSQLParserException {
61+
String sql = "SELECT * FROM events e RIGHT ALL JOIN users u ON e.user_id = u.id";
62+
Select statement = (Select) CCJSqlParserUtil.parse(sql);
63+
PlainSelect select = (PlainSelect) statement.getSelectBody();
64+
Join join = select.getJoins().get(0);
65+
Assertions.assertTrue(join.isAll());
66+
Assertions.assertTrue(join.isRight());
67+
}
68+
2969
@Test
3070
public void testFunctionWithAttributesIssue1742() throws JSQLParserException {
3171
String sql = "SELECT f1(arguments).f2.f3 from dual";

0 commit comments

Comments
 (0)