Skip to content

Commit 0083971

Browse files
committed
Adding support for IS [NOT] TRUE/FALSE expressions
1 parent 4d100a7 commit 0083971

File tree

7 files changed

+136
-61
lines changed

7 files changed

+136
-61
lines changed

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

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,7 @@
2222
import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction;
2323
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
2424
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
25-
import net.sf.jsqlparser.expression.operators.relational.Between;
26-
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
27-
import net.sf.jsqlparser.expression.operators.relational.ExistsExpression;
28-
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
29-
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
30-
import net.sf.jsqlparser.expression.operators.relational.InExpression;
31-
import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
32-
import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
33-
import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
34-
import net.sf.jsqlparser.expression.operators.relational.Matches;
35-
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
36-
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
37-
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
38-
import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator;
39-
import net.sf.jsqlparser.expression.operators.relational.RegExpMySQLOperator;
40-
import net.sf.jsqlparser.expression.operators.relational.SimilarToExpression;
25+
import net.sf.jsqlparser.expression.operators.relational.*;
4126
import net.sf.jsqlparser.schema.Column;
4227
import net.sf.jsqlparser.statement.select.SubSelect;
4328

@@ -97,6 +82,8 @@ public interface ExpressionVisitor {
9782

9883
void visit(IsNullExpression isNullExpression);
9984

85+
void visit(IsBooleanExpression isBooleanExpression);
86+
10087
void visit(LikeExpression likeExpression);
10188

10289
void visit(MinorThan minorThan);

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,11 @@ public void visit(IsNullExpression expr) {
172172
expr.getLeftExpression().accept(this);
173173
}
174174

175+
@Override
176+
public void visit(IsBooleanExpression expr) {
177+
expr.getLeftExpression().accept(this);
178+
}
179+
175180
@Override
176181
public void visit(LikeExpression expr) {
177182
visitBinaryExpression(expr);
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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.expression.operators.relational;
11+
12+
import net.sf.jsqlparser.expression.Expression;
13+
import net.sf.jsqlparser.expression.ExpressionVisitor;
14+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
15+
16+
public class IsBooleanExpression extends ASTNodeAccessImpl implements Expression {
17+
18+
private Expression leftExpression;
19+
private boolean not = false;
20+
private boolean isTrue = false;
21+
22+
public Expression getLeftExpression() {
23+
return leftExpression;
24+
}
25+
26+
public boolean isNot() {
27+
return not;
28+
}
29+
30+
public void setLeftExpression(Expression expression) {
31+
leftExpression = expression;
32+
}
33+
34+
public void setNot(boolean b) {
35+
not = b;
36+
}
37+
38+
public boolean isTrue() {
39+
return isTrue;
40+
}
41+
42+
public void setIsTrue(boolean isTrue) {
43+
this.isTrue = isTrue;
44+
}
45+
46+
@Override
47+
public void accept(ExpressionVisitor expressionVisitor) {
48+
expressionVisitor.visit(this);
49+
}
50+
51+
@Override
52+
public String toString() {
53+
if (isTrue()) {
54+
return leftExpression + " IS" + (not ? " NOT" : "") + " TRUE";
55+
} else {
56+
return leftExpression + " IS" + (not ? " NOT" : "") + " FALSE";
57+
}
58+
}
59+
}

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

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -62,26 +62,7 @@
6262
import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction;
6363
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
6464
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
65-
import net.sf.jsqlparser.expression.operators.relational.Between;
66-
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
67-
import net.sf.jsqlparser.expression.operators.relational.ExistsExpression;
68-
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
69-
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
70-
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
71-
import net.sf.jsqlparser.expression.operators.relational.InExpression;
72-
import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
73-
import net.sf.jsqlparser.expression.operators.relational.ItemsListVisitor;
74-
import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
75-
import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
76-
import net.sf.jsqlparser.expression.operators.relational.Matches;
77-
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
78-
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
79-
import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
80-
import net.sf.jsqlparser.expression.operators.relational.NamedExpressionList;
81-
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
82-
import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator;
83-
import net.sf.jsqlparser.expression.operators.relational.RegExpMySQLOperator;
84-
import net.sf.jsqlparser.expression.operators.relational.SimilarToExpression;
65+
import net.sf.jsqlparser.expression.operators.relational.*;
8566
import net.sf.jsqlparser.schema.Column;
8667
import net.sf.jsqlparser.schema.Table;
8768
import net.sf.jsqlparser.statement.Block;
@@ -309,6 +290,10 @@ public void visit(SignedExpression signedExpression) {
309290
public void visit(IsNullExpression isNullExpression) {
310291
}
311292

293+
@Override
294+
public void visit(IsBooleanExpression isBooleanExpression) {
295+
}
296+
312297
@Override
313298
public void visit(JdbcParameter jdbcParameter) {
314299
}

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

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -63,28 +63,7 @@
6363
import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction;
6464
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
6565
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
66-
import net.sf.jsqlparser.expression.operators.relational.Between;
67-
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
68-
import net.sf.jsqlparser.expression.operators.relational.ExistsExpression;
69-
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
70-
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
71-
import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals;
72-
import net.sf.jsqlparser.expression.operators.relational.InExpression;
73-
import net.sf.jsqlparser.expression.operators.relational.IsNullExpression;
74-
import net.sf.jsqlparser.expression.operators.relational.ItemsListVisitor;
75-
import net.sf.jsqlparser.expression.operators.relational.JsonOperator;
76-
import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
77-
import net.sf.jsqlparser.expression.operators.relational.Matches;
78-
import net.sf.jsqlparser.expression.operators.relational.MinorThan;
79-
import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals;
80-
import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
81-
import net.sf.jsqlparser.expression.operators.relational.NamedExpressionList;
82-
import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo;
83-
import net.sf.jsqlparser.expression.operators.relational.OldOracleJoinBinaryExpression;
84-
import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator;
85-
import net.sf.jsqlparser.expression.operators.relational.RegExpMySQLOperator;
86-
import net.sf.jsqlparser.expression.operators.relational.SimilarToExpression;
87-
import net.sf.jsqlparser.expression.operators.relational.SupportsOldOracleJoinSyntax;
66+
import net.sf.jsqlparser.expression.operators.relational.*;
8867
import net.sf.jsqlparser.schema.Column;
8968
import net.sf.jsqlparser.schema.Table;
9069
import net.sf.jsqlparser.statement.select.OrderByElement;
@@ -253,6 +232,24 @@ public void visit(IsNullExpression isNullExpression) {
253232
}
254233
}
255234

235+
@Override
236+
public void visit(IsBooleanExpression isBooleanExpression) {
237+
isBooleanExpression.getLeftExpression().accept(this);
238+
if (isBooleanExpression.isTrue()) {
239+
if (isBooleanExpression.isNot()) {
240+
buffer.append(" IS NOT TRUE");
241+
} else {
242+
buffer.append(" IS TRUE");
243+
}
244+
} else {
245+
if (isBooleanExpression.isNot()) {
246+
buffer.append(" IS NOT FALSE");
247+
} else {
248+
buffer.append(" IS FALSE");
249+
}
250+
}
251+
}
252+
256253
@Override
257254
public void visit(JdbcParameter jdbcParameter) {
258255
buffer.append("?");

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

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
166166
| <K_EXTRACT:"EXTRACT">
167167
| <K_FETCH:"FETCH">
168168
| <K_FIRST: "FIRST">
169+
| <K_FALSE: "FALSE">
169170
| <K_FOLLOWING: "FOLLOWING">
170171
| <K_FOR:"FOR">
171172
| <K_FORCE : "FORCE">
@@ -270,6 +271,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
270271
| <K_TOP:"TOP">
271272
| <K_TRAILING:"TRAILING">
272273
| <K_TRUNCATE:"TRUNCATE">
274+
| <K_TRUE:"TRUE">
273275
| <K_TUMBLING:"TUMBLING">
274276
| <K_TYPE:"TYPE">
275277
| <K_UNBOUNDED: "UNBOUNDED">
@@ -1069,7 +1071,7 @@ String RelObjectNameWithoutValue() :
10691071
| tk=<K_UNSIGNED>
10701072
| tk=<K_TEMP> | tk=<K_TEMPORARY> | tk=<K_TYPE> | tk=<K_ISNULL>
10711073
| tk=<K_ZONE> | tk=<K_COLUMNS> | tk=<K_DESCRIBE> | tk=<K_FN> | tk=<K_PATH>
1072-
| tk=<K_DATE_LITERAL> | tk=<K_NEXTVAL>
1074+
| tk=<K_DATE_LITERAL> | tk=<K_NEXTVAL> | tk=<K_TRUE> | tk=<K_FALSE>
10731075
/* | tk=<K_PLACING> | tk=<K_BOTH> | tk=<K_LEADING> | tk=<K_TRAILING> */
10741076
)
10751077

@@ -2316,9 +2318,10 @@ Expression SQLCondition():
23162318
(
23172319
result=ExistsExpression()
23182320
| LOOKAHEAD(InExpression()) result=InExpression()
2319-
| left = SimpleExpression()
2321+
| left = SimpleExpression()
23202322
(LOOKAHEAD(2) result=Between(left)
2321-
| LOOKAHEAD(2) result=IsNullExpression(left)
2323+
| LOOKAHEAD(IsNullExpression()) result=IsNullExpression(left)
2324+
| LOOKAHEAD(IsBooleanExpression()) result=IsBooleanExpression(left)
23222325
| LOOKAHEAD(2) result=LikeExpression(left)
23232326
| result=SimilarToExpression(left)
23242327
)
@@ -2418,6 +2421,21 @@ Expression IsNullExpression(Expression leftExpression):
24182421
}
24192422
}
24202423

2424+
Expression IsBooleanExpression(Expression leftExpression):
2425+
{
2426+
IsBooleanExpression result = new IsBooleanExpression();
2427+
}
2428+
{
2429+
(
2430+
<K_IS> [<K_NOT> { result.setNot(true); } ] (<K_TRUE> { result.setIsTrue(true); } | <K_FALSE> { result.setIsTrue(false); })
2431+
)
2432+
2433+
{
2434+
result.setLeftExpression(leftExpression);
2435+
return result;
2436+
}
2437+
}
2438+
24212439
Expression ExistsExpression():
24222440
{
24232441
ExistsExpression result = new ExistsExpression();

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1852,6 +1852,30 @@ public void testFunctionRight() throws JSQLParserException {
18521852
assertSqlCanBeParsedAndDeparsed(statement);
18531853
}
18541854

1855+
@Test
1856+
public void testIsTrue() throws JSQLParserException {
1857+
String statement = "SELECT col FROM tbl WHERE col IS TRUE";
1858+
assertSqlCanBeParsedAndDeparsed(statement);
1859+
}
1860+
1861+
@Test
1862+
public void testIsFalse() throws JSQLParserException {
1863+
String statement = "SELECT col FROM tbl WHERE col IS FALSE";
1864+
assertSqlCanBeParsedAndDeparsed(statement);
1865+
}
1866+
1867+
@Test
1868+
public void testIsNotTrue() throws JSQLParserException {
1869+
String statement = "SELECT col FROM tbl WHERE col IS NOT TRUE";
1870+
assertSqlCanBeParsedAndDeparsed(statement);
1871+
}
1872+
1873+
@Test
1874+
public void testIsNotFalse() throws JSQLParserException {
1875+
String statement = "SELECT col FROM tbl WHERE col IS NOT FALSE";
1876+
assertSqlCanBeParsedAndDeparsed(statement);
1877+
}
1878+
18551879
@Test
18561880
public void testOracleJoin() throws JSQLParserException {
18571881
String stmt = "SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.a = tabelle2.b(+)";

0 commit comments

Comments
 (0)