Skip to content

Commit 2b91b4c

Browse files
committed
PostgreSQL allow for ';' at the end of the first statement
1 parent 590804e commit 2b91b4c

File tree

3 files changed

+60
-44
lines changed

3 files changed

+60
-44
lines changed

headless-services/commons/jpql/grammars/PostgreSqlParser.g4

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ options { tokenVocab=PostgreSqlLexer; }
2626

2727

2828
root
29-
: stmt ((SEMI stmt)+ SEMI)? EOF
29+
: stmt ((SEMI stmt)* SEMI)? EOF
3030
;
3131

3232
// Top Level Description

headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/postgresql/PostgreSqlParser.java

+39-43
Original file line numberDiff line numberDiff line change
@@ -640,29 +640,25 @@ public final RootContext root() throws RecognitionException {
640640
_la = _input.LA(1);
641641
if (_la==SEMI) {
642642
{
643-
setState(535);
643+
setState(537);
644644
_errHandler.sync(this);
645-
_alt = 1;
646-
do {
647-
switch (_alt) {
648-
case 1:
645+
_alt = getInterpreter().adaptivePredict(_input,0,_ctx);
646+
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
647+
if ( _alt==1 ) {
649648
{
650649
{
651650
setState(533);
652651
match(SEMI);
653652
setState(534);
654653
stmt();
655654
}
656-
}
657-
break;
658-
default:
659-
throw new NoViableAltException(this);
655+
}
660656
}
661-
setState(537);
657+
setState(539);
662658
_errHandler.sync(this);
663659
_alt = getInterpreter().adaptivePredict(_input,0,_ctx);
664-
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
665-
setState(539);
660+
}
661+
setState(540);
666662
match(SEMI);
667663
}
668664
}
@@ -46413,8 +46409,8 @@ private boolean identifier_sempred(IdentifierContext _localctx, int predIndex) {
4641346409
"\u0101\u0002\u0102\u0007\u0102\u0002\u0103\u0007\u0103\u0002\u0104\u0007"+
4641446410
"\u0104\u0002\u0105\u0007\u0105\u0002\u0106\u0007\u0106\u0002\u0107\u0007"+
4641546411
"\u0107\u0002\u0108\u0007\u0108\u0002\u0109\u0007\u0109\u0001\u0000\u0001"+
46416-
"\u0000\u0001\u0000\u0004\u0000\u0218\b\u0000\u000b\u0000\f\u0000\u0219"+
46417-
"\u0001\u0000\u0001\u0000\u0003\u0000\u021e\b\u0000\u0001\u0000\u0001\u0000"+
46412+
"\u0000\u0001\u0000\u0005\u0000\u0218\b\u0000\n\u0000\f\u0000\u021b\t\u0000"+
46413+
"\u0001\u0000\u0003\u0000\u021e\b\u0000\u0001\u0000\u0001\u0000\u0001\u0001"+
4641846414
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
4641946415
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
4642046416
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
@@ -46423,49 +46419,49 @@ private boolean identifier_sempred(IdentifierContext _localctx, int predIndex) {
4642346419
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
4642446420
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
4642546421
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
46426-
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u0256\b\u0001"+
46427-
"\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+
46428-
"\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+
46422+
"\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0001\u0256\b\u0001\u0001\u0002"+
46423+
"\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+
4642946424
"\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+
4643046425
"\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+
4643146426
"\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+
4643246427
"\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+
4643346428
"\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+
46434-
"\u0003\u0003\u0282\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+
46429+
"\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0003\u0003"+
46430+
"\u0282\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+
4643546431
"\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+
4643646432
"\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+
4643746433
"\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+
4643846434
"\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+
46439-
"\u0001\u0004\u0001\u0004\u0003\u0004\u02a2\b\u0004\u0001\u0005\u0001\u0005"+
46435+
"\u0001\u0004\u0003\u0004\u02a2\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+
4644046436
"\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+
4644146437
"\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+
4644246438
"\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+
4644346439
"\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+
46444-
"\u0001\u0005\u0003\u0005\u02bf\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006"+
46440+
"\u0003\u0005\u02bf\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+
4644546441
"\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+
4644646442
"\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+
46447-
"\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+
46448-
"\u0003\u0006\u02d6\b\u0006\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001"+
46449-
"\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0003\t\u02e4"+
46450-
"\b\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+
46451-
"\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0003\t\u02f4\b\t\u0001\t\u0001"+
46452-
"\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0003\t\u02fd\b\t\u0001\t\u0001"+
46453-
"\t\u0003\t\u0301\b\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+
46443+
"\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006"+
46444+
"\u02d6\b\u0006\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\t\u0001\t"+
46445+
"\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0003\t\u02e4\b\t\u0001"+
46446+
"\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+
46447+
"\t\u0001\t\u0001\t\u0001\t\u0001\t\u0003\t\u02f4\b\t\u0001\t\u0001\t\u0001"+
46448+
"\t\u0001\t\u0001\t\u0001\t\u0001\t\u0003\t\u02fd\b\t\u0001\t\u0001\t\u0003"+
46449+
"\t\u0301\b\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+
4645446450
"\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+
4645546451
"\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+
4645646452
"\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+
46457-
"\t\u0001\t\u0001\t\u0001\t\u0003\t\u0328\b\t\u0001\n\u0001\n\u0001\n\u0001"+
46458-
"\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0003"+
46459-
"\n\u0336\b\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+
46460-
"\n\u0001\n\u0003\n\u0341\b\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+
46461-
"\n\u0001\n\u0001\n\u0003\n\u034b\b\n\u0001\u000b\u0001\u000b\u0001\u000b"+
46462-
"\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u0353\b\u000b\u0001\u000b"+
46463-
"\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+
46464-
"\u0003\u000b\u035c\b\u000b\u0001\f\u0001\f\u0001\r\u0001\r\u0003\r\u0362"+
46465-
"\b\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003\r\u0368\b\r\u0001\r\u0003\r"+
46466-
"\u036b\b\r\u0001\r\u0001\r\u0003\r\u036f\b\r\u0001\r\u0001\r\u0003\r\u0373"+
46467-
"\b\r\u0001\r\u0001\r\u0003\r\u0377\b\r\u0001\r\u0001\r\u0003\r\u037b\b"+
46468-
"\r\u0001\r\u0001\r\u0001\r\u0003\r\u0380\b\r\u0001\r\u0001\r\u0001\r\u0001"+
46453+
"\t\u0001\t\u0001\t\u0003\t\u0328\b\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+
46454+
"\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0003\n\u0336"+
46455+
"\b\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+
46456+
"\n\u0003\n\u0341\b\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+
46457+
"\n\u0001\n\u0003\n\u034b\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+
46458+
"\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u0353\b\u000b\u0001\u000b\u0001"+
46459+
"\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003"+
46460+
"\u000b\u035c\b\u000b\u0001\f\u0001\f\u0001\r\u0001\r\u0003\r\u0362\b\r"+
46461+
"\u0001\r\u0001\r\u0001\r\u0001\r\u0003\r\u0368\b\r\u0001\r\u0003\r\u036b"+
46462+
"\b\r\u0001\r\u0001\r\u0003\r\u036f\b\r\u0001\r\u0001\r\u0003\r\u0373\b"+
46463+
"\r\u0001\r\u0001\r\u0003\r\u0377\b\r\u0001\r\u0001\r\u0003\r\u037b\b\r"+
46464+
"\u0001\r\u0001\r\u0001\r\u0003\r\u0380\b\r\u0001\r\u0001\r\u0001\r\u0001"+
4646946465
"\r\u0003\r\u0386\b\r\u0001\r\u0001\r\u0003\r\u038a\b\r\u0001\r\u0001\r"+
4647046466
"\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003\r\u0393\b\r\u0001\r\u0001"+
4647146467
"\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003\r\u039b\b\r\u0001\r\u0001\r\u0001"+
@@ -47332,10 +47328,10 @@ private boolean identifier_sempred(IdentifierContext _localctx, int predIndex) {
4733247328
"\u0210\u160b\u0001\u0000\u0000\u0000\u0212\u160d\u0001\u0000\u0000\u0000"+
4733347329
"\u0214\u021d\u0003\u0002\u0001\u0000\u0215\u0216\u0005\u0343\u0000\u0000"+
4733447330
"\u0216\u0218\u0003\u0002\u0001\u0000\u0217\u0215\u0001\u0000\u0000\u0000"+
47335-
"\u0218\u0219\u0001\u0000\u0000\u0000\u0219\u0217\u0001\u0000\u0000\u0000"+
47336-
"\u0219\u021a\u0001\u0000\u0000\u0000\u021a\u021b\u0001\u0000\u0000\u0000"+
47337-
"\u021b\u021c\u0005\u0343\u0000\u0000\u021c\u021e\u0001\u0000\u0000\u0000"+
47338-
"\u021d\u0217\u0001\u0000\u0000\u0000\u021d\u021e\u0001\u0000\u0000\u0000"+
47331+
"\u0218\u021b\u0001\u0000\u0000\u0000\u0219\u0217\u0001\u0000\u0000\u0000"+
47332+
"\u0219\u021a\u0001\u0000\u0000\u0000\u021a\u021c\u0001\u0000\u0000\u0000"+
47333+
"\u021b\u0219\u0001\u0000\u0000\u0000\u021c\u021e\u0005\u0343\u0000\u0000"+
47334+
"\u021d\u0219\u0001\u0000\u0000\u0000\u021d\u021e\u0001\u0000\u0000\u0000"+
4733947335
"\u021e\u021f\u0001\u0000\u0000\u0000\u021f\u0220\u0005\u0000\u0000\u0001"+
4734047336
"\u0220\u0001\u0001\u0000\u0000\u0000\u0221\u0256\u0003\u0004\u0002\u0000"+
4734147337
"\u0222\u0256\u0003\u0006\u0003\u0000\u0223\u0256\u0003`0\u0000\u0224\u0256"+

headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/PostgreSqlSemanticTokensTest.java

+20
Original file line numberDiff line numberDiff line change
@@ -80,5 +80,25 @@ void spelInQuery() {
8080

8181
assertThat(tokens.size()).isEqualTo(10);
8282
}
83+
84+
@Test
85+
void semiColonAtEnd() {
86+
List<SemanticTokenData> tokens = provider.computeTokens(" select count(*) from anecdote where anecdote_id=:anecdote ; ", 0);
87+
assertThat(tokens.get(0)).isEqualTo(new SemanticTokenData(1, 7, "keyword", new String[0])); // select
88+
assertThat(tokens.get(1)).isEqualTo(new SemanticTokenData(8, 13, "keyword", new String[0])); // count
89+
assertThat(tokens.get(2)).isEqualTo(new SemanticTokenData(13, 14, "operator", new String[0])); // (
90+
assertThat(tokens.get(3)).isEqualTo(new SemanticTokenData(14, 15, "operator", new String[0])); // *
91+
assertThat(tokens.get(4)).isEqualTo(new SemanticTokenData(15, 16, "operator", new String[0])); // )
92+
assertThat(tokens.get(5)).isEqualTo(new SemanticTokenData(17, 21, "keyword", new String[0])); // from
93+
assertThat(tokens.get(6)).isEqualTo(new SemanticTokenData(22, 30, "variable", new String[0])); // anecdote
94+
assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(31, 36, "keyword", new String[0])); // where
95+
assertThat(tokens.get(8)).isEqualTo(new SemanticTokenData(37, 48, "variable", new String[0])); // anecdote_id
96+
assertThat(tokens.get(9)).isEqualTo(new SemanticTokenData(48, 49, "operator", new String[0])); // =
97+
assertThat(tokens.get(10)).isEqualTo(new SemanticTokenData(49, 50, "operator", new String[0])); // :
98+
assertThat(tokens.get(11)).isEqualTo(new SemanticTokenData(50, 58, "parameter", new String[0])); // anecdote
99+
assertThat(tokens.get(12)).isEqualTo(new SemanticTokenData(59, 60, "operator", new String[0])); // ;
100+
101+
assertThat(tokens.size()).isEqualTo(13);
102+
}
83103

84104
}

0 commit comments

Comments
 (0)