Skip to content

Commit 750c30a

Browse files
Implement Transact-SQL IF ELSE Statement Control Flows. (#1275)
* Implement Transact-SQL IF ELSE Statement Control Flows. Fixes #1273 except for Blocks. * Improce Test Coverage * Adjust the required Test Coverage for JDK 8
1 parent a88e921 commit 750c30a

13 files changed

Lines changed: 316 additions & 28 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ jacocoTestCoverageVerification {
6868
violationRules {
6969
rule {
7070
limit {
71-
minimum = 0.842
71+
minimum = 0.837
7272
}
7373
}
7474
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2021 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
11+
package net.sf.jsqlparser.statement;
12+
13+
import java.util.Objects;
14+
import net.sf.jsqlparser.expression.Expression;
15+
16+
/**
17+
*
18+
* @author <a href="mailto:andreas@manticore-projects.com">Andreas Reichel</a>
19+
*/
20+
public class IfElseStatement implements Statement {
21+
private final Expression condition;
22+
private final Statement ifStatement;
23+
private Statement elseStatement;
24+
private boolean usingSemicolonForIfStatement = false;
25+
private boolean usingSemicolonForElseStatement = false;
26+
27+
public IfElseStatement(Expression condition, Statement ifStatement) {
28+
this.condition =
29+
Objects.requireNonNull(condition, "The CONDITION of the IfElseStatement must not be null.");
30+
this.ifStatement = Objects.requireNonNull(ifStatement,
31+
"The IF Statement of the IfElseStatement must not be null.");
32+
}
33+
34+
public Expression getCondition() {
35+
return condition;
36+
}
37+
38+
public Statement getIfStatement() {
39+
return ifStatement;
40+
}
41+
42+
public void setElseStatement(Statement elseStatement) {
43+
this.elseStatement = elseStatement;
44+
}
45+
46+
public Statement getElseStatement() {
47+
return elseStatement;
48+
}
49+
50+
public void setUsingSemicolonForElseStatement(boolean usingSemicolonForElseStatement) {
51+
this.usingSemicolonForElseStatement = usingSemicolonForElseStatement;
52+
}
53+
54+
public boolean isUsingSemicolonForElseStatement() {
55+
return usingSemicolonForElseStatement;
56+
}
57+
58+
public void setUsingSemicolonForIfStatement(boolean usingSemicolonForIfStatement) {
59+
this.usingSemicolonForIfStatement = usingSemicolonForIfStatement;
60+
}
61+
62+
public boolean isUsingSemicolonForIfStatement() {
63+
return usingSemicolonForIfStatement;
64+
}
65+
66+
public StringBuilder appendTo(StringBuilder builder) {
67+
builder.append("IF ").append(condition).append(" ").append(ifStatement)
68+
.append(usingSemicolonForIfStatement ? ";" : "");
69+
70+
if (elseStatement != null) {
71+
builder.append(" ELSE ").append(elseStatement)
72+
.append(usingSemicolonForElseStatement ? ";" : "");
73+
}
74+
return builder;
75+
}
76+
77+
@Override
78+
public String toString() {
79+
return appendTo(new StringBuilder()).toString();
80+
}
81+
82+
@Override
83+
public void accept(StatementVisitor statementVisitor) {
84+
statementVisitor.visit(this);
85+
}
86+
87+
}

src/main/java/net/sf/jsqlparser/statement/SavepointStatement.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,14 @@
77
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
88
* #L%
99
*/
10-
/*
11-
* Copyright (C) 2021 JSQLParser.
12-
*
13-
* This library is free software; you can redistribute it and/or modify it under the terms of the
14-
* GNU Lesser General Public License as published by the Free Software Foundation; either version
15-
* 2.1 of the License, or (at your option) any later version.
16-
*
17-
* This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
18-
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19-
* Lesser General Public License for more details.
20-
*
21-
* You should have received a copy of the GNU Lesser General Public License along with this library;
22-
* if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23-
* 02110-1301 USA
24-
*/
2510

2611
package net.sf.jsqlparser.statement;
2712

2813
import java.util.Objects;
2914

3015
/**
3116
*
32-
* @author are
17+
* @author <a href="mailto:andreas@manticore-projects.com">Andreas Reichel</a>
3318
*/
3419
public class SavepointStatement implements Statement {
3520
private String savepointName;

src/main/java/net/sf/jsqlparser/statement/Statement.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,5 @@
1212
import net.sf.jsqlparser.Model;
1313

1414
public interface Statement extends Model {
15-
1615
void accept(StatementVisitor statementVisitor);
1716
}

src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ public interface StatementVisitor {
114114

115115
void visit(AlterSession alterSession);
116116

117+
void visit(IfElseStatement aThis);
117118
void visit(RenameTableStatement renameTableStatement);
118119

119120
void visit(PurgeStatement purgeStatement);

src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,22 @@ public void visit(AlterSession alterSession) {
213213
//@todo: do something usefull here
214214
}
215215

216+
@Override
217+
public void visit(IfElseStatement ifElseStatement) {
218+
ifElseStatement.getIfStatement().accept(this);
219+
if (ifElseStatement.getElseStatement()!=null) {
220+
ifElseStatement.getElseStatement().accept(this);
221+
}
222+
}
223+
216224
@Override
217225
public void visit(RenameTableStatement renameTableStatement) {
226+
//@todo: do something usefull here
218227
}
219228

220229
@Override
221230
public void visit(PurgeStatement purgeStatement) {
231+
//@todo: do something usefull here
222232
}
223233

224234
@Override

src/main/java/net/sf/jsqlparser/statement/Statements.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ public void accept(StatementVisitor statementVisitor) {
3535
public String toString() {
3636
StringBuilder b = new StringBuilder();
3737
for (Statement stmt : statements) {
38-
b.append(stmt.toString()).append(";\n");
38+
if (stmt instanceof IfElseStatement) {
39+
// IfElseStatements print the Semicolons by themselves
40+
b.append(stmt).append("\n");
41+
} else {
42+
b.append(stmt).append(";\n");
43+
}
3944
}
4045
return b.toString();
4146
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,7 @@ public void visit(Replace replace) {
721721

722722
@Override
723723
public void visit(Drop drop) {
724-
throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
724+
visit(drop.getName());
725725
}
726726

727727
@Override
@@ -1030,6 +1030,13 @@ public void visit(JsonFunction expression) {
10301030
}
10311031

10321032
@Override
1033+
public void visit(IfElseStatement ifElseStatement) {
1034+
ifElseStatement.getIfStatement().accept(this);
1035+
if (ifElseStatement.getElseStatement()!=null) {
1036+
ifElseStatement.getElseStatement().accept(this);
1037+
}
1038+
}
1039+
10331040
public void visit(OracleNamedFunctionParameter oracleNamedFunctionParameter) {
10341041
oracleNamedFunctionParameter.getExpression().accept(this);
10351042
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import net.sf.jsqlparser.statement.DeclareStatement;
1919
import net.sf.jsqlparser.statement.DescribeStatement;
2020
import net.sf.jsqlparser.statement.ExplainStatement;
21+
import net.sf.jsqlparser.statement.IfElseStatement;
2122
import net.sf.jsqlparser.statement.PurgeStatement;
2223
import net.sf.jsqlparser.statement.RollbackStatement;
2324
import net.sf.jsqlparser.statement.SavepointStatement;
@@ -353,6 +354,11 @@ public void visit(AlterSession alterSession) {
353354
new AlterSessionDeParser(buffer).deParse(alterSession);
354355
}
355356

357+
@Override
358+
public void visit(IfElseStatement ifElseStatement) {
359+
ifElseStatement.appendTo(buffer);
360+
}
361+
356362
@Override
357363
public void visit(RenameTableStatement renameTableStatement) {
358364
renameTableStatement.appendTo(buffer);

src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import net.sf.jsqlparser.statement.DescribeStatement;
1818
import net.sf.jsqlparser.statement.ExplainStatement;
1919
import net.sf.jsqlparser.statement.PurgeStatement;
20+
import net.sf.jsqlparser.statement.IfElseStatement;
2021
import net.sf.jsqlparser.statement.RollbackStatement;
2122
import net.sf.jsqlparser.statement.SavepointStatement;
2223
import net.sf.jsqlparser.statement.ResetStatement;
@@ -282,6 +283,13 @@ public void visit(AlterSession alterSession) {
282283
}
283284

284285
@Override
286+
public void visit(IfElseStatement ifElseStatement) {
287+
ifElseStatement.getIfStatement().accept(this);
288+
if (ifElseStatement.getElseStatement()!=null) {
289+
ifElseStatement.getElseStatement().accept(this);
290+
}
291+
}
292+
285293
public void visit(RenameTableStatement renameTableStatement) {
286294
//TODO: not yet implemented
287295
}

0 commit comments

Comments
 (0)