Skip to content

Commit 782de00

Browse files
committed
fixes #344
1 parent 678ac96 commit 782de00

File tree

7 files changed

+151
-85
lines changed

7 files changed

+151
-85
lines changed

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public class Join extends ASTNodeAccessImpl {
2727
private boolean cross = false;
2828
private boolean semi = false;
2929
private boolean straight = false;
30+
private boolean apply = false;
3031
private FromItem rightItem;
3132
private Expression onExpression;
3233
private List<Column> usingColumns;
@@ -69,6 +70,14 @@ public void setOuter(boolean b) {
6970
outer = b;
7071
}
7172

73+
public boolean isApply() {
74+
return apply;
75+
}
76+
77+
public void setApply(boolean apply) {
78+
this.apply = apply;
79+
}
80+
7281
/**
7382
* Whether is a "SEMI" join
7483
*
@@ -175,10 +184,10 @@ public void setUsingColumns(List<Column> list) {
175184
usingColumns = list;
176185
}
177186

178-
179187
public boolean isWindowJoin() {
180188
return joinWindow != null;
181189
}
190+
182191
/**
183192
* Return the "WITHIN" join window (if any)
184193
*/
@@ -219,10 +228,12 @@ public String toString() {
219228
type += "SEMI ";
220229
}
221230

222-
if (!isStraight()) {
223-
type += "JOIN ";
224-
} else {
231+
if (isStraight()) {
225232
type = "STRAIGHT_JOIN ";
233+
} else if (isApply()) {
234+
type += "APPLY ";
235+
} else {
236+
type += "JOIN ";
226237
}
227238

228239
return type + rightItem + ((joinWindow != null) ? " WITHIN " + joinWindow : "")

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

Lines changed: 9 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -9,63 +9,18 @@
99
*/
1010
package net.sf.jsqlparser.statement.select;
1111

12-
import net.sf.jsqlparser.expression.Alias;
13-
14-
public class LateralSubSelect implements FromItem {
15-
16-
private SubSelect subSelect;
17-
private Alias alias;
18-
private Pivot pivot;
19-
private UnPivot unpivot;
20-
21-
public void setSubSelect(SubSelect subSelect) {
22-
this.subSelect = subSelect;
23-
}
24-
25-
public SubSelect getSubSelect() {
26-
return subSelect;
12+
/**
13+
* lateral sub select
14+
* @author tobens
15+
*/
16+
public class LateralSubSelect extends SpecialSubSelect {
17+
18+
public LateralSubSelect() {
19+
super("LATERAL");
2720
}
28-
21+
2922
@Override
3023
public void accept(FromItemVisitor fromItemVisitor) {
3124
fromItemVisitor.visit(this);
3225
}
33-
34-
@Override
35-
public Alias getAlias() {
36-
return alias;
37-
}
38-
39-
@Override
40-
public void setAlias(Alias alias) {
41-
this.alias = alias;
42-
}
43-
44-
@Override
45-
public Pivot getPivot() {
46-
return pivot;
47-
}
48-
49-
@Override
50-
public void setPivot(Pivot pivot) {
51-
this.pivot = pivot;
52-
}
53-
54-
@Override
55-
public UnPivot getUnPivot() {
56-
return this.unpivot;
57-
}
58-
59-
@Override
60-
public void setUnPivot(UnPivot unpivot) {
61-
this.unpivot = unpivot;
62-
}
63-
64-
@Override
65-
public String toString() {
66-
return "LATERAL" + subSelect.toString()
67-
+ ((alias != null) ? alias.toString() : "")
68-
+ ((pivot != null) ? " " + pivot : "")
69-
+ ((unpivot != null) ? " " + unpivot : "");
70-
}
7126
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.select;
11+
12+
import net.sf.jsqlparser.expression.Alias;
13+
14+
/**
15+
* Special sub selects of the form prefix ( subselect ) e.g. lateral ( select * from mytable ).
16+
* @author tobens
17+
*/
18+
public abstract class SpecialSubSelect implements FromItem {
19+
20+
private SubSelect subSelect;
21+
private Alias alias;
22+
private Pivot pivot;
23+
private UnPivot unpivot;
24+
private final String prefix;
25+
26+
public SpecialSubSelect(String prefix) {
27+
this.prefix = prefix;
28+
}
29+
30+
public String getPrefix() {
31+
return prefix;
32+
}
33+
34+
public void setSubSelect(SubSelect subSelect) {
35+
this.subSelect = subSelect;
36+
}
37+
38+
public SubSelect getSubSelect() {
39+
return subSelect;
40+
}
41+
42+
@Override
43+
public Alias getAlias() {
44+
return alias;
45+
}
46+
47+
@Override
48+
public void setAlias(Alias alias) {
49+
this.alias = alias;
50+
}
51+
52+
@Override
53+
public Pivot getPivot() {
54+
return pivot;
55+
}
56+
57+
@Override
58+
public void setPivot(Pivot pivot) {
59+
this.pivot = pivot;
60+
}
61+
62+
@Override
63+
public UnPivot getUnPivot() {
64+
return this.unpivot;
65+
}
66+
67+
@Override
68+
public void setUnPivot(UnPivot unpivot) {
69+
this.unpivot = unpivot;
70+
}
71+
72+
@Override
73+
public String toString() {
74+
return prefix + subSelect.toString()
75+
+ ((alias != null) ? alias.toString() : "")
76+
+ ((pivot != null) ? " " + pivot : "")
77+
+ ((unpivot != null) ? " " + unpivot : "");
78+
}
79+
}

src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,7 @@ public void visit(ExtractExpression eexpr) {
509509
public void visit(LateralSubSelect lateralSubSelect) {
510510
lateralSubSelect.getSubSelect().getSelectBody().accept(this);
511511
}
512-
512+
513513
@Override
514514
public void visit(MultiExpressionList multiExprList) {
515515
for (ExpressionList exprList : multiExprList.getExprList()) {

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -372,10 +372,12 @@ public void deparseJoin(Join join) {
372372
buffer.append(" SEMI");
373373
}
374374

375-
if (!join.isStraight()) {
376-
buffer.append(" JOIN ");
377-
} else {
375+
if (join.isStraight()) {
378376
buffer.append(" STRAIGHT_JOIN ");
377+
} else if (join.isApply()) {
378+
buffer.append(" APPLY ");
379+
} else {
380+
buffer.append(" JOIN ");
379381
}
380382

381383
}

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
121121
| <K_AND:"AND">
122122
| <K_AND_OPERATOR:"&&">
123123
| <K_ANY:"ANY">
124+
| <K_APPLY:"APPLY">
124125
| <K_AS: "AS">
125126
| <K_ASC:"ASC">
126127
| <K_BEGIN:"BEGIN">
@@ -1123,7 +1124,7 @@ Not all names should be allowed for aliases.
11231124
String RelObjectNameWithoutValue() :
11241125
{ Token tk = null; }
11251126
{
1126-
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> | tk=<K_BYTE> | tk=<K_CHAR> | tk=<K_CHANGE>
1127+
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> | tk=<K_BYTE> | tk=<K_CHAR> | tk=<K_CHANGE> | tk=<K_CHARACTER>
11271128
| tk=<K_CAST> | tk=<K_COMMENT> | tk=<K_DO> | tk=<K_EXTRACT> | tk=<K_FIRST> | tk=<K_FOLLOWING>
11281129
| tk=<K_LAST> | tk=<K_MATERIALIZED> | tk=<K_NULLS> | tk=<K_PARTITION> | tk=<K_RANGE>
11291130
| tk=<K_ROW> | tk=<K_ROWS> | tk=<K_SIBLINGS> | tk=<K_XML>
@@ -1792,15 +1793,15 @@ FromItem ValuesList():
17921793

17931794
LateralSubSelect LateralSubSelect():
17941795
{
1795-
LateralSubSelect lateralSubSelect = new LateralSubSelect();
1796+
LateralSubSelect specialSubSelect;
17961797
SubSelect subSelect = null;
17971798
}
17981799
{
1799-
<K_LATERAL>
1800+
<K_LATERAL> { specialSubSelect = new LateralSubSelect(); }
18001801
"(" subSelect=SubSelect() ")"
18011802
{
1802-
lateralSubSelect.setSubSelect(subSelect);
1803-
return lateralSubSelect;
1803+
specialSubSelect.setSubSelect(subSelect);
1804+
return specialSubSelect;
18041805
}
18051806
}
18061807

@@ -1851,8 +1852,11 @@ Join JoinerExpression() #JoinerExpression:
18511852
Column tableColumn;
18521853
List<Column> columns = null;
18531854
KSQLJoinWindow joinWindow = null;
1855+
18541856
}
18551857
{
1858+
1859+
18561860
[
18571861
<K_LEFT> { join.setLeft(true); } [ <K_SEMI> { join.setSemi(true); } | <K_OUTER> { join.setOuter(true); } ]
18581862
| ( <K_RIGHT> { join.setRight(true); }
@@ -1864,7 +1868,7 @@ Join JoinerExpression() #JoinerExpression:
18641868
]
18651869

18661870
( <K_JOIN> | "," { join.setSimple(true); } (<K_OUTER> { join.setOuter(true); } )?
1867-
| <K_STRAIGHT> { join.setStraight(true); } )
1871+
| <K_STRAIGHT> { join.setStraight(true); } | <K_APPLY> {join.setApply(true); } )
18681872

18691873
right=FromItem()
18701874

@@ -3855,7 +3859,7 @@ ColDataType ColDataType():
38553859
[LOOKAHEAD(2) "(" {tk2 =null;} ( (tk=<S_LONG> [ tk2=<K_BYTE> | tk2=<K_CHAR> ] | tk=<S_CHAR_LITERAL> | tk=<S_IDENTIFIER> )
38563860
{ argumentsStringList.add(tk.image + (tk2!=null?" " + tk2.image:"")); } ["," {/*argumentsStringList.add(",");*/}] )* ")"]
38573861
[( "[" {tk=null;} [ tk=<S_LONG> ] { array.add(tk!=null?Integer.valueOf(tk.image):null); } "]" )+ { colDataType.setArrayData(array); } ]
3858-
[<K_CHARACTER> <K_SET> tk=<S_IDENTIFIER> { colDataType.setCharacterSet(tk.image); } ]
3862+
[LOOKAHEAD(2) <K_CHARACTER> <K_SET> tk=<S_IDENTIFIER> { colDataType.setCharacterSet(tk.image); } ]
38593863

38603864
{
38613865
if (argumentsStringList.size() > 0)

0 commit comments

Comments
 (0)