Skip to content

Commit

Permalink
Better error messages on unexpected commands and improved comment syn…
Browse files Browse the repository at this point in the history
…tax (#316)

Resolves #287 

`frm test` now produces

```
org.elasticsearch.xpack.esql.parser.ParsingException: line 1:1: mismatched input 'frm' expecting {'explain', 'from', 'row'}
```

and `from test | filter a > 10` produces

```
org.elasticsearch.xpack.esql.parser.ParsingException: line 1:13: mismatched input 'filter' expecting {'eval', 'stats', 'where', 'sort', 'limit', 'project'}
```

I also noticed that support for comments was somewhat inconsistent and
queries like `from a//comment` or `from a/*comment*/` did not parse.
Supporting single / in the source identifier in from is handy for
supporting unquoted date math expressions as in`from
<my-index-{now/d}>`.
  • Loading branch information
Lukas Wegmann committed Nov 2, 2022
1 parent fa10836 commit f86d6a9
Show file tree
Hide file tree
Showing 9 changed files with 512 additions and 401 deletions.
Expand Up @@ -69,7 +69,7 @@ public void setupIndex() {

public void testRow() {
long value = randomLongBetween(0, Long.MAX_VALUE);
EsqlQueryResponse response = run("row" + value);
EsqlQueryResponse response = run("row " + value);
assertEquals(List.of(List.of(value)), response.values());
}

Expand Down
8 changes: 7 additions & 1 deletion x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4
Expand Up @@ -9,6 +9,7 @@ WHERE : 'where' -> pushMode(EXPRESSION);
SORT : 'sort' -> pushMode(EXPRESSION);
LIMIT : 'limit' -> pushMode(EXPRESSION);
PROJECT : 'project' -> pushMode(SOURCE_IDENTIFIERS);
UNKNOWN_CMD : ~[ \r\n\t[\]/]+ -> pushMode(EXPRESSION);

LINE_COMMENT
: '//' ~[\r\n]* '\r'? '\n'? -> channel(HIDDEN)
Expand Down Expand Up @@ -128,7 +129,12 @@ SRC_COMMA : ',' -> type(COMMA);
SRC_ASSIGN : '=' -> type(ASSIGN);

SRC_UNQUOTED_IDENTIFIER
: ~[=`|, [\]\t\r\n]+
: SRC_UNQUOTED_IDENTIFIER_PART+
;

fragment SRC_UNQUOTED_IDENTIFIER_PART
: ~[=`|,[\]/ \t\r\n]+
| '/' ~[*/] // allow single / but not followed by another / or * which would start a comment
;

SRC_QUOTED_IDENTIFIER
Expand Down
151 changes: 76 additions & 75 deletions x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens
Expand Up @@ -7,53 +7,54 @@ WHERE=6
SORT=7
LIMIT=8
PROJECT=9
LINE_COMMENT=10
MULTILINE_COMMENT=11
WS=12
PIPE=13
STRING=14
INTEGER_LITERAL=15
DECIMAL_LITERAL=16
BY=17
AND=18
ASC=19
ASSIGN=20
COMMA=21
DESC=22
DOT=23
FALSE=24
FIRST=25
LAST=26
LP=27
OPENING_BRACKET=28
CLOSING_BRACKET=29
NOT=30
NULL=31
NULLS=32
OR=33
RP=34
TRUE=35
EQ=36
NEQ=37
LT=38
LTE=39
GT=40
GTE=41
PLUS=42
MINUS=43
ASTERISK=44
SLASH=45
PERCENT=46
UNQUOTED_IDENTIFIER=47
QUOTED_IDENTIFIER=48
EXPR_LINE_COMMENT=49
EXPR_MULTILINE_COMMENT=50
EXPR_WS=51
SRC_UNQUOTED_IDENTIFIER=52
SRC_QUOTED_IDENTIFIER=53
SRC_LINE_COMMENT=54
SRC_MULTILINE_COMMENT=55
SRC_WS=56
UNKNOWN_CMD=10
LINE_COMMENT=11
MULTILINE_COMMENT=12
WS=13
PIPE=14
STRING=15
INTEGER_LITERAL=16
DECIMAL_LITERAL=17
BY=18
AND=19
ASC=20
ASSIGN=21
COMMA=22
DESC=23
DOT=24
FALSE=25
FIRST=26
LAST=27
LP=28
OPENING_BRACKET=29
CLOSING_BRACKET=30
NOT=31
NULL=32
NULLS=33
OR=34
RP=35
TRUE=36
EQ=37
NEQ=38
LT=39
LTE=40
GT=41
GTE=42
PLUS=43
MINUS=44
ASTERISK=45
SLASH=46
PERCENT=47
UNQUOTED_IDENTIFIER=48
QUOTED_IDENTIFIER=49
EXPR_LINE_COMMENT=50
EXPR_MULTILINE_COMMENT=51
EXPR_WS=52
SRC_UNQUOTED_IDENTIFIER=53
SRC_QUOTED_IDENTIFIER=54
SRC_LINE_COMMENT=55
SRC_MULTILINE_COMMENT=56
SRC_WS=57
'eval'=1
'explain'=2
'from'=3
Expand All @@ -63,31 +64,31 @@ SRC_WS=56
'sort'=7
'limit'=8
'project'=9
'by'=17
'and'=18
'asc'=19
'desc'=22
'.'=23
'false'=24
'first'=25
'last'=26
'('=27
'['=28
']'=29
'not'=30
'null'=31
'nulls'=32
'or'=33
')'=34
'true'=35
'=='=36
'!='=37
'<'=38
'<='=39
'>'=40
'>='=41
'+'=42
'-'=43
'*'=44
'/'=45
'%'=46
'by'=18
'and'=19
'asc'=20
'desc'=23
'.'=24
'false'=25
'first'=26
'last'=27
'('=28
'['=29
']'=30
'not'=31
'null'=32
'nulls'=33
'or'=34
')'=35
'true'=36
'=='=37
'!='=38
'<'=39
'<='=40
'>'=41
'>='=42
'+'=43
'-'=44
'*'=45
'/'=46
'%'=47
151 changes: 76 additions & 75 deletions x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens
Expand Up @@ -7,53 +7,54 @@ WHERE=6
SORT=7
LIMIT=8
PROJECT=9
LINE_COMMENT=10
MULTILINE_COMMENT=11
WS=12
PIPE=13
STRING=14
INTEGER_LITERAL=15
DECIMAL_LITERAL=16
BY=17
AND=18
ASC=19
ASSIGN=20
COMMA=21
DESC=22
DOT=23
FALSE=24
FIRST=25
LAST=26
LP=27
OPENING_BRACKET=28
CLOSING_BRACKET=29
NOT=30
NULL=31
NULLS=32
OR=33
RP=34
TRUE=35
EQ=36
NEQ=37
LT=38
LTE=39
GT=40
GTE=41
PLUS=42
MINUS=43
ASTERISK=44
SLASH=45
PERCENT=46
UNQUOTED_IDENTIFIER=47
QUOTED_IDENTIFIER=48
EXPR_LINE_COMMENT=49
EXPR_MULTILINE_COMMENT=50
EXPR_WS=51
SRC_UNQUOTED_IDENTIFIER=52
SRC_QUOTED_IDENTIFIER=53
SRC_LINE_COMMENT=54
SRC_MULTILINE_COMMENT=55
SRC_WS=56
UNKNOWN_CMD=10
LINE_COMMENT=11
MULTILINE_COMMENT=12
WS=13
PIPE=14
STRING=15
INTEGER_LITERAL=16
DECIMAL_LITERAL=17
BY=18
AND=19
ASC=20
ASSIGN=21
COMMA=22
DESC=23
DOT=24
FALSE=25
FIRST=26
LAST=27
LP=28
OPENING_BRACKET=29
CLOSING_BRACKET=30
NOT=31
NULL=32
NULLS=33
OR=34
RP=35
TRUE=36
EQ=37
NEQ=38
LT=39
LTE=40
GT=41
GTE=42
PLUS=43
MINUS=44
ASTERISK=45
SLASH=46
PERCENT=47
UNQUOTED_IDENTIFIER=48
QUOTED_IDENTIFIER=49
EXPR_LINE_COMMENT=50
EXPR_MULTILINE_COMMENT=51
EXPR_WS=52
SRC_UNQUOTED_IDENTIFIER=53
SRC_QUOTED_IDENTIFIER=54
SRC_LINE_COMMENT=55
SRC_MULTILINE_COMMENT=56
SRC_WS=57
'eval'=1
'explain'=2
'from'=3
Expand All @@ -63,31 +64,31 @@ SRC_WS=56
'sort'=7
'limit'=8
'project'=9
'by'=17
'and'=18
'asc'=19
'desc'=22
'.'=23
'false'=24
'first'=25
'last'=26
'('=27
'['=28
']'=29
'not'=30
'null'=31
'nulls'=32
'or'=33
')'=34
'true'=35
'=='=36
'!='=37
'<'=38
'<='=39
'>'=40
'>='=41
'+'=42
'-'=43
'*'=44
'/'=45
'%'=46
'by'=18
'and'=19
'asc'=20
'desc'=23
'.'=24
'false'=25
'first'=26
'last'=27
'('=28
'['=29
']'=30
'not'=31
'null'=32
'nulls'=33
'or'=34
')'=35
'true'=36
'=='=37
'!='=38
'<'=39
'<='=40
'>'=41
'>='=42
'+'=43
'-'=44
'*'=45
'/'=46
'%'=47

Large diffs are not rendered by default.

0 comments on commit f86d6a9

Please sign in to comment.