Skip to content

Commit af38dd7

Browse files
committed
Merge pull request #269 from nhanitvn/feature/hive-left-semi-join
Add support for Hive's LEFT SEMI JOIN
2 parents bb978c4 + e56fbe9 commit af38dd7

File tree

4 files changed

+60
-3
lines changed

4 files changed

+60
-3
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public class Join {
3939
private boolean inner = false;
4040
private boolean simple = false;
4141
private boolean cross = false;
42+
private boolean semi = false;
4243
private FromItem rightItem;
4344
private Expression onExpression;
4445
private List<Column> usingColumns;
@@ -82,6 +83,15 @@ public void setOuter(boolean b) {
8283
outer = b;
8384
}
8485

86+
/**
87+
* Whether is a "SEMI" join
88+
*
89+
* @return true if is a "SEMI" join
90+
*/
91+
public boolean isSemi() { return semi; }
92+
93+
public void setSemi(boolean b) { semi = b; }
94+
8595
/**
8696
* Whether is a "LEFT" join
8797
*
@@ -199,6 +209,8 @@ public String toString() {
199209
type += "OUTER ";
200210
} else if (isInner()) {
201211
type += "INNER ";
212+
} else if (isSemi()) {
213+
type += "SEMI ";
202214
}
203215

204216
return type + "JOIN " + rightItem + ((onExpression != null) ? " ON " + onExpression + "" : "")

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,8 @@ public void deparseJoin(Join join) {
338338
buffer.append(" OUTER");
339339
} else if (join.isInner()) {
340340
buffer.append(" INNER");
341+
} else if (join.isSemi()) {
342+
buffer.append(" SEMI");
341343
}
342344

343345
buffer.append(" JOIN ");

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
232232
| <K_DELAYED : "DELAYED">
233233
| <K_HIGH_PRIORITY : "HIGH_PRIORITY">
234234
| <K_IGNORE : "IGNORE">
235+
| <K_SEMI : "SEMI">
235236
}
236237

237238
TOKEN : /* Operators */
@@ -1224,9 +1225,9 @@ Join JoinerExpression():
12241225
List<Column> columns = null;
12251226
}
12261227
{
1227-
[
1228-
( <K_LEFT> { join.setLeft(true); }
1229-
| <K_RIGHT> { join.setRight(true); }
1228+
[
1229+
<K_LEFT> { join.setLeft(true); } [ <K_SEMI> { join.setSemi(true); } | <K_OUTER> { join.setOuter(true); } ]
1230+
| ( <K_RIGHT> { join.setRight(true); }
12301231
| <K_FULL> { join.setFull(true); }
12311232
) [ <K_OUTER> { join.setOuter(true); } ]
12321233
| <K_INNER> { join.setInner(true); }
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package net.sf.jsqlparser.test.select;
2+
3+
import junit.framework.*;
4+
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
5+
import net.sf.jsqlparser.schema.Table;
6+
import net.sf.jsqlparser.statement.Statement;
7+
import net.sf.jsqlparser.statement.select.PlainSelect;
8+
import net.sf.jsqlparser.statement.select.Select;
9+
10+
import static net.sf.jsqlparser.test.TestUtils.*;
11+
12+
/**
13+
* Created by nhanitvn on 5/19/16.
14+
*/
15+
public class HiveTest extends TestCase {
16+
17+
public void testLeftSemiJoin() throws Exception {
18+
String sql;
19+
Statement statement;
20+
21+
sql = "SELECT\n"
22+
+ " Something\n"
23+
+ "FROM\n"
24+
+ " Sometable\n"
25+
+ "LEFT SEMI JOIN\n"
26+
+ " Othertable\n";
27+
28+
statement = CCJSqlParserUtil.parse(sql);
29+
30+
System.out.println(statement.toString());
31+
32+
Select select = (Select) statement;
33+
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
34+
assertEquals(1, plainSelect.getJoins().size());
35+
assertEquals("Othertable", ((Table) plainSelect.getJoins().get(0).getRightItem()).getFullyQualifiedName());
36+
assertTrue(plainSelect.getJoins().get(0).isLeft());
37+
assertTrue(plainSelect.getJoins().get(0).isSemi());
38+
assertStatementCanBeDeparsedAs(select, sql, true);
39+
40+
assertSqlCanBeParsedAndDeparsed(sql, true);
41+
}
42+
}

0 commit comments

Comments
 (0)