From d71dbe3c505ea957047166907e6c31eed51ac439 Mon Sep 17 00:00:00 2001 From: Leonid Baranov Date: Tue, 9 Jul 2024 13:37:29 +0200 Subject: [PATCH] fix: Fix SQL WHENEVER for NOT FOUND condition (#2374) --- .../implicitDialects/sql/Db2SqlVisitor.java | 17 +++++-- .../resources/cfast/case_execSqlWhenever.cbl | 3 +- .../cfast/case_execSqlWhenever.result.json | 51 +++++++++++++++---- 3 files changed, 55 insertions(+), 16 deletions(-) diff --git a/server/engine/src/main/java/org/eclipse/lsp/cobol/implicitDialects/sql/Db2SqlVisitor.java b/server/engine/src/main/java/org/eclipse/lsp/cobol/implicitDialects/sql/Db2SqlVisitor.java index ab6a7105bd..cc07d6f132 100644 --- a/server/engine/src/main/java/org/eclipse/lsp/cobol/implicitDialects/sql/Db2SqlVisitor.java +++ b/server/engine/src/main/java/org/eclipse/lsp/cobol/implicitDialects/sql/Db2SqlVisitor.java @@ -474,17 +474,24 @@ private Pair getWheneverType(Db2SqlPar Pair result = Pair.of(ExecSqlWheneverNode.WheneverType.CONTINUE, null); if (ruleContext.getChildCount() > 3) { - ParseTree pt = ruleContext.getChild(2); + + int index = 2; + ParseTree pt = ruleContext.getChild(index); String value = pt.getText().trim().toUpperCase(); + if (Objects.equals(value, "FOUND")) { + index = 3; + pt = ruleContext.getChild(index); + value = pt.getText().trim().toUpperCase(); + } if (Objects.equals(value, "DO")) { - result = Pair.of(ExecSqlWheneverNode.WheneverType.DO, ruleContext.getChild(3).getText()); + result = Pair.of(ExecSqlWheneverNode.WheneverType.DO, ruleContext.getChild(index + 1).getText()); } else if (Objects.equals(value, "GO")) { - if (ruleContext.getChildCount() > 4) { - result = Pair.of(ExecSqlWheneverNode.WheneverType.GOTO, ruleContext.getChild(4).getText()); + if (ruleContext.getChildCount() > index + 2) { + result = Pair.of(ExecSqlWheneverNode.WheneverType.GOTO, ruleContext.getChild(index + 2).getText()); } } else if (Objects.equals(value, "GOTO")) { - result = Pair.of(ExecSqlWheneverNode.WheneverType.GOTO, ruleContext.getChild(3).getText()); + result = Pair.of(ExecSqlWheneverNode.WheneverType.GOTO, ruleContext.getChild(index + 1).getText()); } } return result; diff --git a/server/engine/src/test/resources/cfast/case_execSqlWhenever.cbl b/server/engine/src/test/resources/cfast/case_execSqlWhenever.cbl index 106d550609..798dd7d7fd 100644 --- a/server/engine/src/test/resources/cfast/case_execSqlWhenever.cbl +++ b/server/engine/src/test/resources/cfast/case_execSqlWhenever.cbl @@ -14,8 +14,9 @@ PROGRAM-ID. CBACT01C. PROCEDURE DIVISION. EXEC SQL WHENEVER SQLERROR GOTO HANDLER END-EXEC. - EXEC SQL WHENEVER SQLERROR GO TO HANDLER END-EXEC. + EXEC SQL WHENEVER SQLWARNING GO TO HANDLER END-EXEC. EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC. + EXEC SQL WHENEVER NOT FOUND GO TO HANDLER END-EXEC. EXEC SQL SELECT ABC FROM XYZ; diff --git a/server/engine/src/test/resources/cfast/case_execSqlWhenever.result.json b/server/engine/src/test/resources/cfast/case_execSqlWhenever.result.json index 295e1aee93..5e5927ea49 100644 --- a/server/engine/src/test/resources/cfast/case_execSqlWhenever.result.json +++ b/server/engine/src/test/resources/cfast/case_execSqlWhenever.result.json @@ -9,7 +9,7 @@ "character": 9 }, "end": { - "line": 25, + "line": 26, "character": 31 } }, @@ -46,7 +46,7 @@ } }, { - "wheneverCondition": "SQLERROR", + "wheneverCondition": "SQLWARNING", "wheneverType": "GOTO", "value": "HANDLER", "type": "execwhenever", @@ -58,7 +58,7 @@ }, "end": { "line": 17, - "character": 49 + "character": 51 } } }, @@ -72,7 +72,7 @@ }, "end": { "line": 17, - "character": 49 + "character": 51 } } }, @@ -106,16 +106,47 @@ } } }, + { + "wheneverCondition": "NOT_FOUND", + "wheneverType": "GOTO", + "value": "HANDLER", + "type": "execwhenever", + "location": { + "uri": "fake/path", + "start": { + "line": 19, + "character": 22 + }, + "end": { + "line": 19, + "character": 49 + } + } + }, + { + "type": "endexec", + "location": { + "uri": "fake/path", + "start": { + "line": 19, + "character": 22 + }, + "end": { + "line": 19, + "character": 49 + } + } + }, { "type": "execsql", "location": { "uri": "fake/path", "start": { - "line": 20, + "line": 21, "character": 12 }, "end": { - "line": 22, + "line": 23, "character": 45 } } @@ -125,11 +156,11 @@ "location": { "uri": "fake/path", "start": { - "line": 20, + "line": 21, "character": 12 }, "end": { - "line": 22, + "line": 23, "character": 45 } } @@ -141,11 +172,11 @@ "location": { "uri": "fake/path", "start": { - "line": 24, + "line": 25, "character": 9 }, "end": { - "line": 25, + "line": 26, "character": 31 } }