Skip to content

Commit d71dbe3

Browse files
authored
fix: Fix SQL WHENEVER for NOT FOUND condition (#2374)
1 parent 57bd79b commit d71dbe3

File tree

3 files changed

+55
-16
lines changed

3 files changed

+55
-16
lines changed

server/engine/src/main/java/org/eclipse/lsp/cobol/implicitDialects/sql/Db2SqlVisitor.java

+12-5
Original file line numberDiff line numberDiff line change
@@ -474,17 +474,24 @@ private Pair<ExecSqlWheneverNode.WheneverType, String> getWheneverType(Db2SqlPar
474474
Pair<ExecSqlWheneverNode.WheneverType, String> result = Pair.of(ExecSqlWheneverNode.WheneverType.CONTINUE, null);
475475

476476
if (ruleContext.getChildCount() > 3) {
477-
ParseTree pt = ruleContext.getChild(2);
477+
478+
int index = 2;
479+
ParseTree pt = ruleContext.getChild(index);
478480
String value = pt.getText().trim().toUpperCase();
481+
if (Objects.equals(value, "FOUND")) {
482+
index = 3;
483+
pt = ruleContext.getChild(index);
484+
value = pt.getText().trim().toUpperCase();
485+
}
479486

480487
if (Objects.equals(value, "DO")) {
481-
result = Pair.of(ExecSqlWheneverNode.WheneverType.DO, ruleContext.getChild(3).getText());
488+
result = Pair.of(ExecSqlWheneverNode.WheneverType.DO, ruleContext.getChild(index + 1).getText());
482489
} else if (Objects.equals(value, "GO")) {
483-
if (ruleContext.getChildCount() > 4) {
484-
result = Pair.of(ExecSqlWheneverNode.WheneverType.GOTO, ruleContext.getChild(4).getText());
490+
if (ruleContext.getChildCount() > index + 2) {
491+
result = Pair.of(ExecSqlWheneverNode.WheneverType.GOTO, ruleContext.getChild(index + 2).getText());
485492
}
486493
} else if (Objects.equals(value, "GOTO")) {
487-
result = Pair.of(ExecSqlWheneverNode.WheneverType.GOTO, ruleContext.getChild(3).getText());
494+
result = Pair.of(ExecSqlWheneverNode.WheneverType.GOTO, ruleContext.getChild(index + 1).getText());
488495
}
489496
}
490497
return result;

server/engine/src/test/resources/cfast/case_execSqlWhenever.cbl

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
PROGRAM-ID. CBACT01C.
1515
PROCEDURE DIVISION.
1616
EXEC SQL WHENEVER SQLERROR GOTO HANDLER END-EXEC.
17-
EXEC SQL WHENEVER SQLERROR GO TO HANDLER END-EXEC.
17+
EXEC SQL WHENEVER SQLWARNING GO TO HANDLER END-EXEC.
1818
EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
19+
EXEC SQL WHENEVER NOT FOUND GO TO HANDLER END-EXEC.
1920

2021
EXEC SQL
2122
SELECT ABC FROM XYZ;

server/engine/src/test/resources/cfast/case_execSqlWhenever.result.json

+41-10
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"character": 9
1010
},
1111
"end": {
12-
"line": 25,
12+
"line": 26,
1313
"character": 31
1414
}
1515
},
@@ -46,7 +46,7 @@
4646
}
4747
},
4848
{
49-
"wheneverCondition": "SQLERROR",
49+
"wheneverCondition": "SQLWARNING",
5050
"wheneverType": "GOTO",
5151
"value": "HANDLER",
5252
"type": "execwhenever",
@@ -58,7 +58,7 @@
5858
},
5959
"end": {
6060
"line": 17,
61-
"character": 49
61+
"character": 51
6262
}
6363
}
6464
},
@@ -72,7 +72,7 @@
7272
},
7373
"end": {
7474
"line": 17,
75-
"character": 49
75+
"character": 51
7676
}
7777
}
7878
},
@@ -106,16 +106,47 @@
106106
}
107107
}
108108
},
109+
{
110+
"wheneverCondition": "NOT_FOUND",
111+
"wheneverType": "GOTO",
112+
"value": "HANDLER",
113+
"type": "execwhenever",
114+
"location": {
115+
"uri": "fake/path",
116+
"start": {
117+
"line": 19,
118+
"character": 22
119+
},
120+
"end": {
121+
"line": 19,
122+
"character": 49
123+
}
124+
}
125+
},
126+
{
127+
"type": "endexec",
128+
"location": {
129+
"uri": "fake/path",
130+
"start": {
131+
"line": 19,
132+
"character": 22
133+
},
134+
"end": {
135+
"line": 19,
136+
"character": 49
137+
}
138+
}
139+
},
109140
{
110141
"type": "execsql",
111142
"location": {
112143
"uri": "fake/path",
113144
"start": {
114-
"line": 20,
145+
"line": 21,
115146
"character": 12
116147
},
117148
"end": {
118-
"line": 22,
149+
"line": 23,
119150
"character": 45
120151
}
121152
}
@@ -125,11 +156,11 @@
125156
"location": {
126157
"uri": "fake/path",
127158
"start": {
128-
"line": 20,
159+
"line": 21,
129160
"character": 12
130161
},
131162
"end": {
132-
"line": 22,
163+
"line": 23,
133164
"character": 45
134165
}
135166
}
@@ -141,11 +172,11 @@
141172
"location": {
142173
"uri": "fake/path",
143174
"start": {
144-
"line": 24,
175+
"line": 25,
145176
"character": 9
146177
},
147178
"end": {
148-
"line": 25,
179+
"line": 26,
149180
"character": 31
150181
}
151182
}

0 commit comments

Comments
 (0)