From eaedd87d44a9aee3c1ff70a0dc699a5eeaf82a85 Mon Sep 17 00:00:00 2001 From: Claes65 Date: Thu, 4 Jul 2024 08:55:46 +0200 Subject: [PATCH 1/2] Addition to SELECT statement --- .../natparse/parsing/StatementListParser.java | 6 ++++-- .../parsing/StatementListParserShould.java | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/libs/natparse/src/main/java/org/amshove/natparse/parsing/StatementListParser.java b/libs/natparse/src/main/java/org/amshove/natparse/parsing/StatementListParser.java index ddcadf033..0fd7c28e4 100644 --- a/libs/natparse/src/main/java/org/amshove/natparse/parsing/StatementListParser.java +++ b/libs/natparse/src/main/java/org/amshove/natparse/parsing/StatementListParser.java @@ -1440,9 +1440,11 @@ private StatementNode select() throws ParseError continue; } - // FETCH FIRST clause - if (peekKind(SyntaxKind.FETCH) && peekKind(1, SyntaxKind.FIRST)) + if (peekKind(SyntaxKind.FETCH) && peekKind(1, SyntaxKind.FIRST) || + peekKind(SyntaxKind.IF) && peekKind(1, SyntaxKind.NO) || + peekKind(SyntaxKind.OPTIMIZE) && peekKind(1, SyntaxKind.FOR)) { + consume(select); consume(select); continue; } diff --git a/libs/natparse/src/test/java/org/amshove/natparse/parsing/StatementListParserShould.java b/libs/natparse/src/test/java/org/amshove/natparse/parsing/StatementListParserShould.java index 55918bb6b..f7539cab5 100644 --- a/libs/natparse/src/test/java/org/amshove/natparse/parsing/StatementListParserShould.java +++ b/libs/natparse/src/test/java/org/amshove/natparse/parsing/StatementListParserShould.java @@ -2738,6 +2738,24 @@ void parseSelectWithJoinAndSubSelect() END-SELECT""", ISelectNode.class); } + @Test + void parseSelectWithFunnyKeywords() + { + assertParsesSingleStatement(""" + SELECT + A.MFE_NR1 + INTO + KUPINTGA.MFE-NR + FROM VMFE_MFE A + WHERE A.MFE_NR2 = WORK.FFNR + AND A.MFE_REL_TYPE IN ('01', '05') + OPTIMIZE FOR 1 ROW + IF NO RECORDS FOUND + IGNORE END-NOREC + END-SELECT + """, ISelectNode.class); + } + @Test void parseDb2Insert() { From eb72e577e2ef182ae2f199158d8dde7d8dc633b1 Mon Sep 17 00:00:00 2001 From: Claes65 Date: Fri, 12 Jul 2024 13:48:49 +0200 Subject: [PATCH 2/2] Support for more descriptor types in DDM parsing --- .../amshove/natparse/natural/ddm/DescriptorType.java | 6 +++++- .../amshove/natparse/parsing/ddm/DdmParserShould.java | 11 +++++++++-- .../org/amshove/natparse/parsing/ddm/CompleteDdm.NSD | 4 +++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/libs/natparse/src/main/java/org/amshove/natparse/natural/ddm/DescriptorType.java b/libs/natparse/src/main/java/org/amshove/natparse/natural/ddm/DescriptorType.java index 7ad9a0a90..1c906aaf1 100644 --- a/libs/natparse/src/main/java/org/amshove/natparse/natural/ddm/DescriptorType.java +++ b/libs/natparse/src/main/java/org/amshove/natparse/natural/ddm/DescriptorType.java @@ -8,7 +8,9 @@ public enum DescriptorType DESCRIPTOR, SUPERDESCRIPTOR, PHONETIC, - UNIQUE; + UNIQUE, + HYPERDESCRIPTOR, + NONDESCRIPTOR; /** * Constructs the {@link DescriptorType} from source. @@ -24,6 +26,8 @@ public static DescriptorType fromSource(String source) case "S" -> SUPERDESCRIPTOR; case "P" -> PHONETIC; case "U" -> UNIQUE; + case "H" -> HYPERDESCRIPTOR; + case "N" -> NONDESCRIPTOR; case " " -> NONE; default -> throw new NaturalParseException(String.format("Can't determine DescriptorType from \"%s\"", source)); }; diff --git a/libs/natparse/src/test/java/org/amshove/natparse/parsing/ddm/DdmParserShould.java b/libs/natparse/src/test/java/org/amshove/natparse/parsing/ddm/DdmParserShould.java index a2672316b..e004207d2 100644 --- a/libs/natparse/src/test/java/org/amshove/natparse/parsing/ddm/DdmParserShould.java +++ b/libs/natparse/src/test/java/org/amshove/natparse/parsing/ddm/DdmParserShould.java @@ -53,7 +53,7 @@ void parseACompleteDdm() var fields = ddm.fields(); - assertThat(ddm.fields()).hasSize(12); + assertThat(ddm.fields()).hasSize(14); var topLevelFields = fields.stream().map(IDdmField::name).collect(Collectors.toList()); assertThat(topLevelFields) @@ -68,7 +68,9 @@ void parseACompleteDdm() "A-SUPERDESCRIPTOR", "ANOTHER-SUPERDESCRIPTOR", "SUPERDESCRIPTOR-WITH-SUBRANGE", - "UNIQUE-SUPER-WITH-SUBRANGE" + "UNIQUE-SUPER-WITH-SUBRANGE", + "HYPERDESCRIPTOR", + "NONDESCRIPTOR" ) ); @@ -103,6 +105,11 @@ void parseACompleteDdm() assertThat(superdescriptorWithSubrange.fields()).hasSize(2); assertSuperdescriptorHasField(superdescriptorWithSubrange, "SOME-NUMBER", 1, 5); assertSuperdescriptorHasField(superdescriptorWithSubrange, "TOP-LEVEL-GROUP-CHILD", 5, 12); + + var aHyperdescriptor = findField(ddm, "HYPERDESCRIPTOR"); + assertThat(aHyperdescriptor.descriptor()).isEqualTo(DescriptorType.HYPERDESCRIPTOR); + var aNondescriptor = findField(ddm, "NONDESCRIPTOR"); + assertThat(aNondescriptor.descriptor()).isEqualTo(DescriptorType.NONDESCRIPTOR); } @Test diff --git a/libs/natparse/src/test/resources/org/amshove/natparse/parsing/ddm/CompleteDdm.NSD b/libs/natparse/src/test/resources/org/amshove/natparse/parsing/ddm/CompleteDdm.NSD index 34f8c51f7..0414f8e33 100644 --- a/libs/natparse/src/test/resources/org/amshove/natparse/parsing/ddm/CompleteDdm.NSD +++ b/libs/natparse/src/test/resources/org/amshove/natparse/parsing/ddm/CompleteDdm.NSD @@ -36,9 +36,11 @@ P 1 BA PERIODIC-GROUP * -------- SOURCE FIELD(S) ------- * SOME-NUMBER (1-5) * TOP-LEVEL-GROUP-CHILD (5-12) - 1 AI UNIQUE-SUPER-WITH-SUBRANGE A 32 N U + 1 AJ UNIQUE-SUPER-WITH-SUBRANGE A 32 N U * -------- SOURCE FIELD(S) ------- * SOME-NUMBER (1-5) * ANOTHER-NUMBER(1-12) * ALPHA-FIELD (1-8) + 1 AK HYPERDESCRIPTOR A 32 N H + 1 AL NONDESCRIPTOR A 32 N N ******DDM OUTPUT TERMINATED******