Skip to content

Commit 2647c0e

Browse files
committed
Merge origin/master
2 parents 7d36615 + 4f63b1c commit 2647c0e

File tree

13 files changed

+180
-18
lines changed

13 files changed

+180
-18
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Also I would like to know about needed examples or documentation stuff.
4444

4545
## Extensions in the latest SNAPSHOT version 1.2
4646

47+
* support for **isnull**
4748
* support for single quoted aliases ___select col1 as 'alias'___
4849
* support for Unicode string literal like **N'test'** or **U'test'**
4950
* support for bitwise not **~**

src/main/java/net/sf/jsqlparser/expression/Parenthesis.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
public class Parenthesis extends ASTNodeAccessImpl implements Expression {
3030

3131
private Expression expression;
32+
3233
private boolean not = false;
3334

3435
public Parenthesis() {

src/main/java/net/sf/jsqlparser/expression/operators/relational/IsNullExpression.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public class IsNullExpression extends ASTNodeAccessImpl implements Expression {
2929

3030
private Expression leftExpression;
3131
private boolean not = false;
32+
private boolean useIsNull = false;
3233

3334
public Expression getLeftExpression() {
3435
return leftExpression;
@@ -46,13 +47,25 @@ public void setNot(boolean b) {
4647
not = b;
4748
}
4849

50+
public boolean isUseIsNull() {
51+
return useIsNull;
52+
}
53+
54+
public void setUseIsNull(boolean useIsNull) {
55+
this.useIsNull = useIsNull;
56+
}
57+
4958
@Override
5059
public void accept(ExpressionVisitor expressionVisitor) {
5160
expressionVisitor.visit(this);
5261
}
5362

5463
@Override
5564
public String toString() {
56-
return leftExpression + " IS " + (not ? "NOT " : "") + "NULL";
65+
if (isUseIsNull()) {
66+
return leftExpression + (not ? " NOT" : "") + " ISNULL";
67+
} else {
68+
return leftExpression + " IS " + (not ? "NOT " : "") + "NULL";
69+
}
5770
}
5871
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,6 @@ public interface FromItemVisitor {
3636
void visit(ValuesList valuesList);
3737

3838
void visit(TableFunction tableFunction);
39+
40+
public void visit(ParenthesisFromItem aThis);
3941
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,9 @@ public void visit(ValuesList valuesList) {
5454
public void visit(TableFunction valuesList) {
5555

5656
}
57+
58+
@Override
59+
public void visit(ParenthesisFromItem aThis) {
60+
61+
}
5762
}
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 - 2013 JSQLParser
6+
* %%
7+
* This program is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU Lesser General Public License as
9+
* published by the Free Software Foundation, either version 2.1 of the
10+
* License, or (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Lesser Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Lesser Public
18+
* License along with this program. If not, see
19+
* <http://www.gnu.org/licenses/lgpl-2.1.html>.
20+
* #L%
21+
*/
22+
package net.sf.jsqlparser.statement.select;
23+
24+
import net.sf.jsqlparser.expression.*;
25+
26+
/**
27+
* It represents an expression like "(" expression ")"
28+
*/
29+
public class ParenthesisFromItem implements FromItem {
30+
31+
private FromItem fromItem;
32+
33+
private Alias alias;
34+
35+
public ParenthesisFromItem() {
36+
}
37+
38+
public ParenthesisFromItem(FromItem fromItem) {
39+
setFromItem(fromItem);
40+
}
41+
42+
public FromItem getFromItem() {
43+
return fromItem;
44+
}
45+
46+
public final void setFromItem(FromItem fromItem) {
47+
this.fromItem = fromItem;
48+
}
49+
50+
@Override
51+
public void accept(FromItemVisitor fromItemVisitor) {
52+
fromItemVisitor.visit(this);
53+
}
54+
55+
@Override
56+
public String toString() {
57+
return "(" + fromItem + ")" + (alias!=null?alias.toString():"");
58+
}
59+
60+
@Override
61+
public Alias getAlias() {
62+
return alias;
63+
}
64+
65+
@Override
66+
public void setAlias(Alias alias) {
67+
this.alias = alias;
68+
}
69+
70+
@Override
71+
public Pivot getPivot() {
72+
throw new UnsupportedOperationException("Not supported yet.");
73+
}
74+
75+
@Override
76+
public void setPivot(Pivot pivot) {
77+
throw new UnsupportedOperationException("Not supported yet.");
78+
}
79+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
import net.sf.jsqlparser.statement.select.FromItemVisitor;
116116
import net.sf.jsqlparser.statement.select.Join;
117117
import net.sf.jsqlparser.statement.select.LateralSubSelect;
118+
import net.sf.jsqlparser.statement.select.ParenthesisFromItem;
118119
import net.sf.jsqlparser.statement.select.PlainSelect;
119120
import net.sf.jsqlparser.statement.select.Select;
120121
import net.sf.jsqlparser.statement.select.SelectBody;
@@ -791,4 +792,9 @@ public void visit(Upsert upsert) {
791792
@Override
792793
public void visit(UseStatement use) {
793794
}
795+
796+
@Override
797+
public void visit(ParenthesisFromItem parenthesis) {
798+
parenthesis.getFromItem().accept(this);
799+
}
794800
}

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,10 +262,18 @@ public void visit(SignedExpression signedExpression) {
262262
@Override
263263
public void visit(IsNullExpression isNullExpression) {
264264
isNullExpression.getLeftExpression().accept(this);
265-
if (isNullExpression.isNot()) {
266-
buffer.append(" IS NOT NULL");
265+
if (isNullExpression.isUseIsNull()) {
266+
if (isNullExpression.isNot()) {
267+
buffer.append(" NOT ISNULL");
268+
} else {
269+
buffer.append(" ISNULL");
270+
}
267271
} else {
268-
buffer.append(" IS NULL");
272+
if (isNullExpression.isNot()) {
273+
buffer.append(" IS NOT NULL");
274+
} else {
275+
buffer.append(" IS NULL");
276+
}
269277
}
270278
}
271279

@@ -727,7 +735,7 @@ public void visit(KeepExpression aexpr) {
727735
public void visit(MySQLGroupConcat groupConcat) {
728736
buffer.append(groupConcat.toString());
729737
}
730-
738+
731739
@Override
732740
public void visit(ValueListExpression valueList) {
733741
buffer.append(valueList.toString());

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ public SelectDeParser() {
4040
}
4141

4242
/**
43-
* @param expressionVisitor a {@link ExpressionVisitor} to de-parse expressions. It has to share the same<br>
43+
* @param expressionVisitor a {@link ExpressionVisitor} to de-parse expressions. It has to share
44+
* the same<br>
4445
* StringBuilder (buffer parameter) as this object in order to work
4546
* @param buffer the buffer that will be filled with the select
4647
*/
@@ -280,7 +281,7 @@ public void visit(PivotXml pivot) {
280281
public void deparseOffset(Offset offset) {
281282
// OFFSET offset
282283
// or OFFSET offset (ROW | ROWS)
283-
if (offset.getOffsetJdbcParameter()!=null) {
284+
if (offset.getOffsetJdbcParameter() != null) {
284285
buffer.append(" OFFSET ").append(offset.getOffsetJdbcParameter());
285286
} else if (offset.getOffset() != 0) {
286287
buffer.append(" OFFSET ");
@@ -300,7 +301,7 @@ public void deparseFetch(Fetch fetch) {
300301
} else {
301302
buffer.append("NEXT ");
302303
}
303-
if (fetch.getFetchJdbcParameter()!=null) {
304+
if (fetch.getFetchJdbcParameter() != null) {
304305
buffer.append(fetch.getFetchJdbcParameter().toString());
305306
} else {
306307
buffer.append(fetch.getRowCount());
@@ -329,7 +330,7 @@ public void setExpressionVisitor(ExpressionVisitor visitor) {
329330
public void visit(SubJoin subjoin) {
330331
buffer.append("(");
331332
subjoin.getLeft().accept(this);
332-
for(Join join : subjoin.getJoinList()) {
333+
for (Join join : subjoin.getJoinList()) {
333334
deparseJoin(join);
334335
}
335336
buffer.append(")");
@@ -452,4 +453,14 @@ public void visit(AllColumns allColumns) {
452453
public void visit(TableFunction tableFunction) {
453454
buffer.append(tableFunction.toString());
454455
}
456+
457+
@Override
458+
public void visit(ParenthesisFromItem parenthesis) {
459+
buffer.append("(");
460+
parenthesis.getFromItem().accept(this);
461+
buffer.append(")");
462+
if (parenthesis.getAlias() != null) {
463+
buffer.append(parenthesis.getAlias().toString());
464+
}
465+
}
455466
}

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
203203
| <K_INTERVAL:"INTERVAL">
204204
| <K_INTO:"INTO">
205205
| <K_IS:"IS">
206+
| <K_ISNULL:"ISNULL">
206207
| <K_JOIN:"JOIN">
207208
| <K_KEEP:"KEEP">
208209
| <K_KEY:"KEY">
@@ -300,7 +301,8 @@ TOKEN : /* Operators */
300301
<OP_GREATERTHANEQUALS: ">" (<WHITESPACE>)* "=">
301302
| <OP_MINORTHANEQUALS: "<" (<WHITESPACE>)* "=">
302303
| <OP_NOTEQUALSSTANDARD: "<" (<WHITESPACE>)* ">">
303-
| <OP_NOTEQUALSBANG: "!=">
304+
| <OP_NOTEQUALSBANG: "!" (<WHITESPACE>)* "=">
305+
| <OP_CONCAT: "|" (<WHITESPACE>)* "|">
304306
}
305307

306308
TOKEN : /* Date/Time with time zones */
@@ -960,7 +962,7 @@ String RelObjectNameWithoutValue() :
960962
| tk=<K_OPEN> | tk=<K_OVER> | tk=<K_PERCENT> | tk=<K_PRIOR>
961963
| tk=<K_SEPARATOR> | tk=<K_NO> | tk=<K_ACTION> | tk=<K_CASCADE> | tk=<K_END>
962964
| tk=<K_TABLE> | tk=<K_DATETIMELITERAL> | tk=<K_COMMIT> | tk=<K_PRECISION>
963-
| tk=<K_INSERT> | tk=<K_INDEX> | tk=<K_PRIMARY>
965+
| tk=<K_INSERT> | tk=<K_INDEX> | tk=<K_PRIMARY> | tk=<K_ENABLE>
964966
)
965967

966968
{ return tk.image; }
@@ -1473,7 +1475,11 @@ FromItem FromItem():
14731475
LOOKAHEAD(SubJoin())
14741476
fromItem=SubJoin()
14751477
|
1478+
LOOKAHEAD(3)
14761479
fromItem=SubSelect()
1480+
|
1481+
fromItem=FromItem()
1482+
{ fromItem = new ParenthesisFromItem(fromItem); }
14771483
)
14781484
")"
14791485
)
@@ -2044,7 +2050,7 @@ Expression RegularCondition() #RegularCondition:
20442050
| "?" { result = new JsonOperator("?"); }
20452051
| "?|" { result = new JsonOperator("?|"); }
20462052
| "?&" { result = new JsonOperator("?&"); }
2047-
| "||" { result = new JsonOperator("||"); }
2053+
| <OP_CONCAT> { result = new JsonOperator("||"); }
20482054
| "-" { result = new JsonOperator("-"); }
20492055
| "-#" { result = new JsonOperator("-#"); }
20502056
)
@@ -2169,9 +2175,11 @@ Expression IsNullExpression():
21692175
}
21702176
{
21712177
(
2172-
<K_NOT> { result.setNot(true); } leftExpression=SimpleExpression() <K_IS> <K_NULL>
2178+
<K_NOT> { result.setNot(true); } leftExpression=SimpleExpression()
2179+
( <K_ISNULL> { result.setUseIsNull(true); } | <K_IS> <K_NULL> )
21732180
|
2174-
leftExpression=SimpleExpression() <K_IS> [<K_NOT> { result.setNot(true); } ] <K_NULL>
2181+
leftExpression=SimpleExpression()
2182+
(<K_ISNULL> { result.setUseIsNull(true); } | <K_IS> [<K_NOT> { result.setNot(true); } ] <K_NULL> )
21752183
)
21762184

21772185
{
@@ -2301,8 +2309,8 @@ Expression ConcatExpression():
23012309
}
23022310
{
23032311
leftExpression=BitwiseAndOr() { result = leftExpression; }
2304-
(LOOKAHEAD(2)
2305-
"||"
2312+
(LOOKAHEAD(3)
2313+
<OP_CONCAT> /* Oracle allows space between the bars. */
23062314
rightExpression=BitwiseAndOr()
23072315
{
23082316
Concat binExp = new Concat();

0 commit comments

Comments
 (0)