File tree Expand file tree Collapse file tree 4 files changed +60
-3
lines changed
jjtree/net/sf/jsqlparser/parser
test/java/net/sf/jsqlparser/test/select Expand file tree Collapse file tree 4 files changed +60
-3
lines changed Original file line number Diff line number Diff 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 + "" : "" )
Original file line number Diff line number Diff 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 " );
Original file line number Diff line number Diff 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
237238TOKEN : /* 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); }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments