[ES|QL] Update grammars (#213006)

This PR updates the ES|QL grammars (lexer and parser) to match the
latest version in Elasticsearch.

---------

Co-authored-by: drewdaemon <drew.tate@elastic.co>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
Co-authored-by: Stratoula Kalafateli <efstratia.kalafateli@elastic.co>
This commit is contained in:
Kibana Machine 2025-03-18 20:25:57 +01:00 committed by GitHub
parent dfb16cbe46
commit 681295ff9e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
40 changed files with 7615 additions and 6798 deletions

View file

@ -110,7 +110,7 @@ main () {
.buildkite/scripts/bootstrap.sh
# Build ANTLR stuff
cd ./src/platform/packages/shared/kbn-esql-ast/src
cd ./src/platform/packages/shared/kbn-esql-ast
yarn build:antlr4:esql
# Make a commit
@ -118,7 +118,7 @@ main () {
git checkout -b "$BRANCH_NAME"
git add antlr/*
git add src/antlr/*
git commit -m "Update ES|QL grammars"
report_main_step "Changes committed. Creating pull request."

View file

@ -4,11 +4,12 @@
"private": true,
"license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0",
"scripts": {
"build:antlr4:esql:parser": "antlr -Dlanguage=TypeScript -lib src/antlr/parser src/antlr/esql_parser.g4",
"build:antlr4:esql:lexer": "antlr -Dlanguage=TypeScript -lib src/antlr/lexer src/antlr/esql_lexer.g4",
"build:antlr4:esql": "npm run build:antlr4:esql:parser && npm run build:antlr4:esql:lexer",
"prebuild:antlr4": "brew bundle --file=./scripts/antlr4_tools/brewfile",
"build:antlr4": "npm run build:antlr4:esql"
"build:antlr4": "npm run build:antlr4:esql",
"build:antlr4:esql": "npm run build:antlr4:esql:lexer && npm run build:antlr4:esql:parser",
"postbuild:antlr4:esql": "./scripts/postbuild.sh",
"build:antlr4:esql:parser": "antlr -Dlanguage=TypeScript -lib src/antlr/parser src/antlr/esql_parser.g4",
"build:antlr4:esql:lexer": "antlr -Dlanguage=TypeScript -lib src/antlr/lexer src/antlr/esql_lexer.g4"
},
"sideEffects": false
}

View file

@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -euo pipefail
# Function to add @ts-nocheck to a file
add_ts_nocheck() {
local file=$1
if [ -f "$file" ]; then
echo "Adding @ts-nocheck to $file"
echo -e "// @ts-nocheck\n$(cat "$file")" > "$file"
else
echo "$file not found!"
fi
}
# Add @ts-nocheck to the parser file
add_ts_nocheck src/antlr/esql_parser.ts
# Add @ts-nocheck to the lexer file
add_ts_nocheck src/antlr/esql_lexer.ts
# Rename the parser listener file if it exists
if [ -f src/antlr/esql_parserListener.ts ]; then
echo "Renaming src/antlr/esql_parserListener.ts to src/antlr/esql_parser_listener.ts"
mv src/antlr/esql_parserListener.ts src/antlr/esql_parser_listener.ts
else
echo "src/antlr/esql_parserListener.ts not found!"
fi

View file

@ -23,28 +23,20 @@ options {
}
/*
* Before modifying this file, please read the section above as changes here
* have significant impact in the ANTLR generated code and its consumption upstream
* (including Kibana).
* Before modifying this file or the files in the `lexer` subdirectory, please read
* the section below as changes here have significant impact in the ANTLR generated
* code and its consumption in Kibana.
*
* A. To add a development token (only available behind in snapshot/dev builds)
* A. To add a development command (only available behind in snapshot/dev builds)
*
* Since the tokens/modes are in development, simply define them under the
* "// in development section" and follow the section comments in that section.
* That is use the DEV_ prefix and use the {this.isDevVersion()}? conditional.
* They are defined at the end of the file, to minimize the impact on the existing
* token types.
* Since the tokens/modes are in development, add a predicate like this:
* DEV_MYCOMMAND : {this.isDevVersion()}? 'mycommand' -> ...
*
* B. To add a new (production-ready) token
*
* Be sure to go through step A (add a development token).
* Make sure to remove the prefix and conditional before promoting the tokens in
* production.
* Since tokens types (numbers) are generated by ANTLR in a continuous fashion,
* it is desirable to avoid changing these values hence where possible, add
* add them at the end of their respective section.
* Note that the use of lexing modes prevents this since any addition to a mode
* (regardless where it occurs) shifts all the declarations that follow in other modes.
*
* C. Renaming a token
*
@ -59,49 +51,25 @@ options {
* they have on the UI (auto-completion, etc...)
*/
DISSECT : 'dissect' -> pushMode(EXPRESSION_MODE);
DROP : 'drop' -> pushMode(PROJECT_MODE);
ENRICH : 'enrich' -> pushMode(ENRICH_MODE);
EVAL : 'eval' -> pushMode(EXPRESSION_MODE);
EXPLAIN : 'explain' -> pushMode(EXPLAIN_MODE);
FROM : 'from' -> pushMode(FROM_MODE);
GROK : 'grok' -> pushMode(EXPRESSION_MODE);
KEEP : 'keep' -> pushMode(PROJECT_MODE);
LIMIT : 'limit' -> pushMode(EXPRESSION_MODE);
MV_EXPAND : 'mv_expand' -> pushMode(MVEXPAND_MODE);
RENAME : 'rename' -> pushMode(RENAME_MODE);
ROW : 'row' -> pushMode(EXPRESSION_MODE);
SHOW : 'show' -> pushMode(SHOW_MODE);
SORT : 'sort' -> pushMode(EXPRESSION_MODE);
STATS : 'stats' -> pushMode(EXPRESSION_MODE);
WHERE : 'where' -> pushMode(EXPRESSION_MODE);
JOIN_LOOKUP : 'lookup' -> pushMode(JOIN_MODE);
//
// in development
//
// Before adding a new in-development command, to sandbox the behavior when running in production environments
//
// For example: to add myCommand use the following declaration:
// DEV_MYCOMMAND : {this.isDevVersion()}? 'mycommand' -> ...
//
// Once the command has been stabilized, remove the DEV_ prefix and the {}? conditional and move the command to the
// main section while preserving alphabetical order:
// MYCOMMAND : 'mycommand' -> ...
DEV_CHANGE_POINT : {this.isDevVersion()}? 'change_point' -> pushMode(CHANGE_POINT_MODE);
DEV_INLINESTATS : {this.isDevVersion()}? 'inlinestats' -> pushMode(EXPRESSION_MODE);
DEV_INSIST : {this.isDevVersion()}? 'insist_🐔' -> pushMode(PROJECT_MODE);
DEV_LOOKUP : {this.isDevVersion()}? 'lookup_🐔' -> pushMode(LOOKUP_MODE);
DEV_METRICS : {this.isDevVersion()}? 'metrics' -> pushMode(METRICS_MODE);
// list of all JOIN commands
DEV_JOIN_FULL : {this.isDevVersion()}? 'full' -> pushMode(JOIN_MODE);
DEV_JOIN_LEFT : {this.isDevVersion()}? 'left' -> pushMode(JOIN_MODE);
DEV_JOIN_RIGHT : {this.isDevVersion()}? 'right' -> pushMode(JOIN_MODE);
//
// Catch-all for unrecognized commands - don't define any beyond this line
//
UNKNOWN_CMD : ~[ \r\n\t[\]/]+ -> pushMode(EXPRESSION_MODE) ;
/*
* Import lexer grammar esql_lexer;
* the UNKNOWN_CMD token *last* because it takes over parsing for
* all other commands.
*/
import ChangePoint,
Enrich,
Explain,
Expression,
From,
Fork,
Join,
Lookup,
Metrics,
MvExpand,
Project,
Rename,
Show,
UnknownCommand;
LINE_COMMENT
: '//' ~[\r\n]* '\r'? '\n'? -> channel(HIDDEN)
@ -113,560 +81,4 @@ MULTILINE_COMMENT
WS
: [ \r\n\t]+ -> channel(HIDDEN)
;
//
// Expression - used by most command
//
mode EXPRESSION_MODE;
PIPE : '|' -> popMode;
fragment DIGIT
: [0-9]
;
fragment LETTER
: [a-z]
;
fragment ESCAPE_SEQUENCE
: '\\' [tnr"\\]
;
fragment UNESCAPED_CHARS
: ~[\r\n"\\]
;
fragment EXPONENT
: [e] [+-]? DIGIT+
;
fragment ASPERAND
: '@'
;
fragment BACKQUOTE
: '`'
;
fragment BACKQUOTE_BLOCK
: ~'`'
| '``'
;
fragment UNDERSCORE
: '_'
;
fragment UNQUOTED_ID_BODY
: (LETTER | DIGIT | UNDERSCORE)
;
QUOTED_STRING
: '"' (ESCAPE_SEQUENCE | UNESCAPED_CHARS)* '"'
| '"""' (~[\r\n])*? '"""' '"'? '"'?
;
INTEGER_LITERAL
: DIGIT+
;
DECIMAL_LITERAL
: DIGIT+ DOT DIGIT*
| DOT DIGIT+
| DIGIT+ (DOT DIGIT*)? EXPONENT
| DOT DIGIT+ EXPONENT
;
BY : 'by';
AND : 'and';
ASC : 'asc';
ASSIGN : '=';
CAST_OP : '::';
COLON : ':';
COMMA : ',';
DESC : 'desc';
DOT : '.';
FALSE : 'false';
FIRST : 'first';
IN: 'in';
IS: 'is';
LAST : 'last';
LIKE: 'like';
LP : '(';
NOT : 'not';
NULL : 'null';
NULLS : 'nulls';
OR : 'or';
PARAM: '?';
RLIKE: 'rlike';
RP : ')';
TRUE : 'true';
EQ : '==';
CIEQ : '=~';
NEQ : '!=';
LT : '<';
LTE : '<=';
GT : '>';
GTE : '>=';
PLUS : '+';
MINUS : '-';
ASTERISK : '*';
SLASH : '/';
PERCENT : '%';
LEFT_BRACES : '{';
RIGHT_BRACES : '}';
NESTED_WHERE : WHERE -> type(WHERE);
NAMED_OR_POSITIONAL_PARAM
: PARAM (LETTER | UNDERSCORE) UNQUOTED_ID_BODY*
| PARAM DIGIT+
;
// Brackets are funny. We can happen upon a CLOSING_BRACKET in two ways - one
// way is to start in an explain command which then shifts us to expression
// mode. Thus, the two popModes on CLOSING_BRACKET. The other way could as
// the start of a multivalued field constant. To line up with the double pop
// the explain mode needs, we double push when we see that.
OPENING_BRACKET : '[' -> pushMode(EXPRESSION_MODE), pushMode(EXPRESSION_MODE);
CLOSING_BRACKET : ']' -> popMode, popMode;
UNQUOTED_IDENTIFIER
: LETTER UNQUOTED_ID_BODY*
// only allow @ at beginning of identifier to keep the option to allow @ as infix operator in the future
// also, single `_` and `@` characters are not valid identifiers
| (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY+
;
fragment QUOTED_ID
: BACKQUOTE BACKQUOTE_BLOCK+ BACKQUOTE
;
QUOTED_IDENTIFIER
: QUOTED_ID
;
EXPR_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
EXPR_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
EXPR_WS
: WS -> channel(HIDDEN)
;
//
// Explain
//
mode EXPLAIN_MODE;
EXPLAIN_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(DEFAULT_MODE);
EXPLAIN_PIPE : PIPE -> type(PIPE), popMode;
EXPLAIN_WS : WS -> channel(HIDDEN);
EXPLAIN_LINE_COMMENT : LINE_COMMENT -> channel(HIDDEN);
EXPLAIN_MULTILINE_COMMENT : MULTILINE_COMMENT -> channel(HIDDEN);
//
// FROM command
//
mode FROM_MODE;
FROM_PIPE : PIPE -> type(PIPE), popMode;
FROM_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET);
FROM_CLOSING_BRACKET : CLOSING_BRACKET -> type(CLOSING_BRACKET);
FROM_COLON : COLON -> type(COLON);
FROM_COMMA : COMMA -> type(COMMA);
FROM_ASSIGN : ASSIGN -> type(ASSIGN);
METADATA : 'metadata';
// in 8.14 ` were not allowed
// this has been relaxed in 8.15 since " is used for quoting
fragment UNQUOTED_SOURCE_PART
: ~[:"=|,[\]/ \t\r\n]
| '/' ~[*/] // allow single / but not followed by another / or * which would start a comment -- used in index pattern date spec
;
UNQUOTED_SOURCE
: UNQUOTED_SOURCE_PART+
;
FROM_UNQUOTED_SOURCE : UNQUOTED_SOURCE -> type(UNQUOTED_SOURCE);
FROM_QUOTED_SOURCE : QUOTED_STRING -> type(QUOTED_STRING);
FROM_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
FROM_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
FROM_WS
: WS -> channel(HIDDEN)
;
//
// DROP, KEEP, INSIST
//
mode PROJECT_MODE;
PROJECT_PIPE : PIPE -> type(PIPE), popMode;
PROJECT_DOT: DOT -> type(DOT);
PROJECT_COMMA : COMMA -> type(COMMA);
PROJECT_PARAM : PARAM -> type(PARAM);
PROJECT_NAMED_OR_POSITIONAL_PARAM : NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM);
fragment UNQUOTED_ID_BODY_WITH_PATTERN
: (LETTER | DIGIT | UNDERSCORE | ASTERISK)
;
fragment UNQUOTED_ID_PATTERN
: (LETTER | ASTERISK) UNQUOTED_ID_BODY_WITH_PATTERN*
| (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY_WITH_PATTERN+
;
ID_PATTERN
: (UNQUOTED_ID_PATTERN | QUOTED_ID)+
;
PROJECT_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
PROJECT_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
PROJECT_WS
: WS -> channel(HIDDEN)
;
//
// | RENAME a.b AS x, c AS y
//
mode RENAME_MODE;
RENAME_PIPE : PIPE -> type(PIPE), popMode;
RENAME_ASSIGN : ASSIGN -> type(ASSIGN);
RENAME_COMMA : COMMA -> type(COMMA);
RENAME_DOT: DOT -> type(DOT);
RENAME_PARAM : PARAM -> type(PARAM);
RENAME_NAMED_OR_POSITIONAL_PARAM : NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM);
AS : 'as';
RENAME_ID_PATTERN
: ID_PATTERN -> type(ID_PATTERN)
;
RENAME_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
RENAME_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
RENAME_WS
: WS -> channel(HIDDEN)
;
// | ENRICH ON key WITH fields
mode ENRICH_MODE;
ENRICH_PIPE : PIPE -> type(PIPE), popMode;
ENRICH_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(SETTING_MODE);
ON : 'on' -> pushMode(ENRICH_FIELD_MODE);
WITH : 'with' -> pushMode(ENRICH_FIELD_MODE);
// similar to that of an index
// see https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html#indices-create-api-path-params
fragment ENRICH_POLICY_NAME_BODY
: ~[\\/?"<>| ,#\t\r\n:]
;
ENRICH_POLICY_NAME
// allow prefix for the policy to specify its resolution
: (ENRICH_POLICY_NAME_BODY+ COLON)? ENRICH_POLICY_NAME_BODY+
;
ENRICH_MODE_UNQUOTED_VALUE
: ENRICH_POLICY_NAME -> type(ENRICH_POLICY_NAME)
;
ENRICH_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
ENRICH_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
ENRICH_WS
: WS -> channel(HIDDEN)
;
// submode for Enrich to allow different lexing between policy source (loose) and field identifiers
mode ENRICH_FIELD_MODE;
ENRICH_FIELD_PIPE : PIPE -> type(PIPE), popMode, popMode;
ENRICH_FIELD_ASSIGN : ASSIGN -> type(ASSIGN);
ENRICH_FIELD_COMMA : COMMA -> type(COMMA);
ENRICH_FIELD_DOT: DOT -> type(DOT);
ENRICH_FIELD_WITH : WITH -> type(WITH) ;
ENRICH_FIELD_ID_PATTERN
: ID_PATTERN -> type(ID_PATTERN)
;
ENRICH_FIELD_QUOTED_IDENTIFIER
: QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER)
;
ENRICH_FIELD_PARAM : PARAM -> type(PARAM);
ENRICH_FIELD_NAMED_OR_POSITIONAL_PARAM : NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM);
ENRICH_FIELD_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
ENRICH_FIELD_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
ENRICH_FIELD_WS
: WS -> channel(HIDDEN)
;
mode MVEXPAND_MODE;
MVEXPAND_PIPE : PIPE -> type(PIPE), popMode;
MVEXPAND_DOT: DOT -> type(DOT);
MVEXPAND_PARAM : PARAM -> type(PARAM);
MVEXPAND_NAMED_OR_POSITIONAL_PARAM : NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM);
MVEXPAND_QUOTED_IDENTIFIER
: QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER)
;
MVEXPAND_UNQUOTED_IDENTIFIER
: UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER)
;
MVEXPAND_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
MVEXPAND_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
MVEXPAND_WS
: WS -> channel(HIDDEN)
;
//
// SHOW commands
//
mode SHOW_MODE;
SHOW_PIPE : PIPE -> type(PIPE), popMode;
INFO : 'info';
SHOW_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
SHOW_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
SHOW_WS
: WS -> channel(HIDDEN)
;
mode SETTING_MODE;
SETTING_CLOSING_BRACKET : CLOSING_BRACKET -> type(CLOSING_BRACKET), popMode;
SETTING_COLON : COLON -> type(COLON);
SETTING
: (ASPERAND | DIGIT| DOT | LETTER | UNDERSCORE)+
;
SETTING_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
SETTTING_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
SETTING_WS
: WS -> channel(HIDDEN)
;
//
// LOOKUP ON key
//
mode LOOKUP_MODE;
LOOKUP_PIPE : PIPE -> type(PIPE), popMode;
LOOKUP_COLON : COLON -> type(COLON);
LOOKUP_COMMA : COMMA -> type(COMMA);
LOOKUP_DOT: DOT -> type(DOT);
LOOKUP_ON : ON -> type(ON), pushMode(LOOKUP_FIELD_MODE);
LOOKUP_UNQUOTED_SOURCE: UNQUOTED_SOURCE -> type(UNQUOTED_SOURCE);
LOOKUP_QUOTED_SOURCE : QUOTED_STRING -> type(QUOTED_STRING);
LOOKUP_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
LOOKUP_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
LOOKUP_WS
: WS -> channel(HIDDEN)
;
mode LOOKUP_FIELD_MODE;
LOOKUP_FIELD_PIPE : PIPE -> type(PIPE), popMode, popMode;
LOOKUP_FIELD_COMMA : COMMA -> type(COMMA);
LOOKUP_FIELD_DOT: DOT -> type(DOT);
LOOKUP_FIELD_ID_PATTERN
: ID_PATTERN -> type(ID_PATTERN)
;
LOOKUP_FIELD_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
LOOKUP_FIELD_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
LOOKUP_FIELD_WS
: WS -> channel(HIDDEN)
;
//
// JOIN-related commands
//
mode JOIN_MODE;
JOIN_PIPE : PIPE -> type(PIPE), popMode;
JOIN : 'join';
JOIN_AS : AS -> type(AS);
JOIN_ON : ON -> type(ON), popMode, pushMode(EXPRESSION_MODE);
USING : 'USING' -> popMode, pushMode(EXPRESSION_MODE);
JOIN_UNQUOTED_SOURCE: UNQUOTED_SOURCE -> type(UNQUOTED_SOURCE);
JOIN_QUOTED_SOURCE : QUOTED_STRING -> type(QUOTED_STRING);
JOIN_COLON : COLON -> type(COLON);
JOIN_UNQUOTED_IDENTIFER: UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER);
JOIN_QUOTED_IDENTIFIER : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER);
JOIN_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
JOIN_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
JOIN_WS
: WS -> channel(HIDDEN)
;
//
// METRICS command
//
mode METRICS_MODE;
METRICS_PIPE : PIPE -> type(PIPE), popMode;
METRICS_UNQUOTED_SOURCE: UNQUOTED_SOURCE -> type(UNQUOTED_SOURCE), popMode, pushMode(CLOSING_METRICS_MODE);
METRICS_QUOTED_SOURCE : QUOTED_STRING -> type(QUOTED_STRING), popMode, pushMode(CLOSING_METRICS_MODE);
METRICS_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
METRICS_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
METRICS_WS
: WS -> channel(HIDDEN)
;
// TODO: remove this workaround mode - see https://github.com/elastic/elasticsearch/issues/108528
mode CLOSING_METRICS_MODE;
CLOSING_METRICS_COLON
: COLON -> type(COLON), popMode, pushMode(METRICS_MODE)
;
CLOSING_METRICS_COMMA
: COMMA -> type(COMMA), popMode, pushMode(METRICS_MODE)
;
CLOSING_METRICS_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
CLOSING_METRICS_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
CLOSING_METRICS_WS
: WS -> channel(HIDDEN)
;
CLOSING_METRICS_QUOTED_IDENTIFIER
: QUOTED_IDENTIFIER -> popMode, pushMode(EXPRESSION_MODE), type(QUOTED_IDENTIFIER)
;
CLOSING_METRICS_UNQUOTED_IDENTIFIER
:UNQUOTED_IDENTIFIER -> popMode, pushMode(EXPRESSION_MODE), type(UNQUOTED_IDENTIFIER)
;
CLOSING_METRICS_BY
:BY -> popMode, pushMode(EXPRESSION_MODE), type(BY)
;
CLOSING_METRICS_PIPE
: PIPE -> type(PIPE), popMode
;
///
/// CHANGE_POINT command
///
mode CHANGE_POINT_MODE;
CHANGE_POINT_PIPE : PIPE -> type(PIPE), popMode;
CHANGE_POINT_ON : ON -> type(ON);
CHANGE_POINT_AS : AS -> type(AS);
CHANGE_POINT_DOT: DOT -> type(DOT);
CHANGE_POINT_COMMA: COMMA -> type(COMMA);
CHANGE_POINT_QUOTED_IDENTIFIER: QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER);
CHANGE_POINT_UNQUOTED_IDENTIFIER: UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER);
CHANGE_POINT_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN);
CHANGE_POINT_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN);
CHANGE_POINT_WS: WS -> channel(HIDDEN);
//
// INSIST command
//
mode INSIST_MODE;
INSIST_PIPE : PIPE -> type(PIPE), popMode;
INSIST_IDENTIFIER: UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER);
INSIST_WS : WS -> channel(HIDDEN);
INSIST_LINE_COMMENT : LINE_COMMENT -> channel(HIDDEN);
INSIST_MULTILINE_COMMENT : MULTILINE_COMMENT -> channel(HIDDEN);
;

File diff suppressed because one or more lines are too long

View file

@ -1,202 +1,202 @@
DISSECT=1
DROP=2
ENRICH=3
EVAL=4
EXPLAIN=5
FROM=6
GROK=7
KEEP=8
LIMIT=9
MV_EXPAND=10
RENAME=11
ROW=12
SHOW=13
SORT=14
STATS=15
WHERE=16
JOIN_LOOKUP=17
DEV_CHANGE_POINT=18
DEV_INLINESTATS=19
DEV_INSIST=20
DEV_LOOKUP=21
DEV_METRICS=22
DEV_JOIN_FULL=23
DEV_JOIN_LEFT=24
DEV_JOIN_RIGHT=25
UNKNOWN_CMD=26
LINE_COMMENT=27
MULTILINE_COMMENT=28
WS=29
PIPE=30
QUOTED_STRING=31
INTEGER_LITERAL=32
DECIMAL_LITERAL=33
BY=34
AND=35
ASC=36
ASSIGN=37
CAST_OP=38
COLON=39
COMMA=40
DESC=41
DOT=42
FALSE=43
FIRST=44
IN=45
IS=46
LAST=47
LIKE=48
LP=49
NOT=50
NULL=51
NULLS=52
OR=53
PARAM=54
RLIKE=55
RP=56
TRUE=57
EQ=58
CIEQ=59
NEQ=60
LT=61
LTE=62
GT=63
GTE=64
PLUS=65
MINUS=66
ASTERISK=67
SLASH=68
PERCENT=69
LEFT_BRACES=70
RIGHT_BRACES=71
NAMED_OR_POSITIONAL_PARAM=72
OPENING_BRACKET=73
CLOSING_BRACKET=74
UNQUOTED_IDENTIFIER=75
QUOTED_IDENTIFIER=76
EXPR_LINE_COMMENT=77
EXPR_MULTILINE_COMMENT=78
EXPR_WS=79
EXPLAIN_WS=80
EXPLAIN_LINE_COMMENT=81
EXPLAIN_MULTILINE_COMMENT=82
METADATA=83
UNQUOTED_SOURCE=84
FROM_LINE_COMMENT=85
FROM_MULTILINE_COMMENT=86
FROM_WS=87
ID_PATTERN=88
PROJECT_LINE_COMMENT=89
PROJECT_MULTILINE_COMMENT=90
PROJECT_WS=91
AS=92
RENAME_LINE_COMMENT=93
RENAME_MULTILINE_COMMENT=94
RENAME_WS=95
ON=96
WITH=97
ENRICH_POLICY_NAME=98
ENRICH_LINE_COMMENT=99
ENRICH_MULTILINE_COMMENT=100
ENRICH_WS=101
ENRICH_FIELD_LINE_COMMENT=102
ENRICH_FIELD_MULTILINE_COMMENT=103
ENRICH_FIELD_WS=104
MVEXPAND_LINE_COMMENT=105
MVEXPAND_MULTILINE_COMMENT=106
MVEXPAND_WS=107
INFO=108
SHOW_LINE_COMMENT=109
SHOW_MULTILINE_COMMENT=110
SHOW_WS=111
SETTING=112
SETTING_LINE_COMMENT=113
SETTTING_MULTILINE_COMMENT=114
SETTING_WS=115
LOOKUP_LINE_COMMENT=116
LOOKUP_MULTILINE_COMMENT=117
LOOKUP_WS=118
LOOKUP_FIELD_LINE_COMMENT=119
LOOKUP_FIELD_MULTILINE_COMMENT=120
LOOKUP_FIELD_WS=121
JOIN=122
USING=123
JOIN_LINE_COMMENT=124
JOIN_MULTILINE_COMMENT=125
JOIN_WS=126
METRICS_LINE_COMMENT=127
METRICS_MULTILINE_COMMENT=128
METRICS_WS=129
CLOSING_METRICS_LINE_COMMENT=130
CLOSING_METRICS_MULTILINE_COMMENT=131
CLOSING_METRICS_WS=132
CHANGE_POINT_LINE_COMMENT=133
CHANGE_POINT_MULTILINE_COMMENT=134
CHANGE_POINT_WS=135
INSIST_WS=136
INSIST_LINE_COMMENT=137
INSIST_MULTILINE_COMMENT=138
'dissect'=1
'drop'=2
'enrich'=3
'eval'=4
'explain'=5
'from'=6
'grok'=7
'keep'=8
'limit'=9
'mv_expand'=10
'rename'=11
'row'=12
'show'=13
'sort'=14
'stats'=15
'where'=16
'lookup'=17
'|'=30
'by'=34
'and'=35
'asc'=36
'='=37
'::'=38
':'=39
','=40
'desc'=41
'.'=42
'false'=43
'first'=44
'in'=45
'is'=46
'last'=47
'like'=48
'('=49
'not'=50
'null'=51
'nulls'=52
'or'=53
'?'=54
'rlike'=55
')'=56
'true'=57
'=='=58
'=~'=59
'!='=60
'<'=61
'<='=62
'>'=63
'>='=64
'+'=65
'-'=66
'*'=67
'/'=68
'%'=69
'{'=70
'}'=71
']'=74
'metadata'=83
'as'=92
'on'=96
'with'=97
'info'=108
'join'=122
'USING'=123
LINE_COMMENT=1
MULTILINE_COMMENT=2
WS=3
DEV_CHANGE_POINT=4
ENRICH=5
EXPLAIN=6
DISSECT=7
EVAL=8
GROK=9
LIMIT=10
ROW=11
SORT=12
STATS=13
WHERE=14
DEV_INLINESTATS=15
FROM=16
DEV_FORK=17
JOIN_LOOKUP=18
DEV_JOIN_FULL=19
DEV_JOIN_LEFT=20
DEV_JOIN_RIGHT=21
DEV_LOOKUP=22
DEV_METRICS=23
MV_EXPAND=24
DROP=25
KEEP=26
DEV_INSIST=27
RENAME=28
SHOW=29
UNKNOWN_CMD=30
CHANGE_POINT_LINE_COMMENT=31
CHANGE_POINT_MULTILINE_COMMENT=32
CHANGE_POINT_WS=33
ON=34
WITH=35
ENRICH_POLICY_NAME=36
ENRICH_LINE_COMMENT=37
ENRICH_MULTILINE_COMMENT=38
ENRICH_WS=39
ENRICH_FIELD_LINE_COMMENT=40
ENRICH_FIELD_MULTILINE_COMMENT=41
ENRICH_FIELD_WS=42
SETTING=43
SETTING_LINE_COMMENT=44
SETTTING_MULTILINE_COMMENT=45
SETTING_WS=46
EXPLAIN_WS=47
EXPLAIN_LINE_COMMENT=48
EXPLAIN_MULTILINE_COMMENT=49
PIPE=50
QUOTED_STRING=51
INTEGER_LITERAL=52
DECIMAL_LITERAL=53
BY=54
AND=55
ASC=56
ASSIGN=57
CAST_OP=58
COLON=59
COMMA=60
DESC=61
DOT=62
FALSE=63
FIRST=64
IN=65
IS=66
LAST=67
LIKE=68
NOT=69
NULL=70
NULLS=71
OR=72
PARAM=73
RLIKE=74
TRUE=75
EQ=76
CIEQ=77
NEQ=78
LT=79
LTE=80
GT=81
GTE=82
PLUS=83
MINUS=84
ASTERISK=85
SLASH=86
PERCENT=87
LEFT_BRACES=88
RIGHT_BRACES=89
NAMED_OR_POSITIONAL_PARAM=90
OPENING_BRACKET=91
CLOSING_BRACKET=92
LP=93
RP=94
UNQUOTED_IDENTIFIER=95
QUOTED_IDENTIFIER=96
EXPR_LINE_COMMENT=97
EXPR_MULTILINE_COMMENT=98
EXPR_WS=99
METADATA=100
UNQUOTED_SOURCE=101
FROM_LINE_COMMENT=102
FROM_MULTILINE_COMMENT=103
FROM_WS=104
FORK_WS=105
FORK_LINE_COMMENT=106
FORK_MULTILINE_COMMENT=107
JOIN=108
USING=109
JOIN_LINE_COMMENT=110
JOIN_MULTILINE_COMMENT=111
JOIN_WS=112
LOOKUP_LINE_COMMENT=113
LOOKUP_MULTILINE_COMMENT=114
LOOKUP_WS=115
LOOKUP_FIELD_LINE_COMMENT=116
LOOKUP_FIELD_MULTILINE_COMMENT=117
LOOKUP_FIELD_WS=118
METRICS_LINE_COMMENT=119
METRICS_MULTILINE_COMMENT=120
METRICS_WS=121
CLOSING_METRICS_LINE_COMMENT=122
CLOSING_METRICS_MULTILINE_COMMENT=123
CLOSING_METRICS_WS=124
MVEXPAND_LINE_COMMENT=125
MVEXPAND_MULTILINE_COMMENT=126
MVEXPAND_WS=127
ID_PATTERN=128
PROJECT_LINE_COMMENT=129
PROJECT_MULTILINE_COMMENT=130
PROJECT_WS=131
AS=132
RENAME_LINE_COMMENT=133
RENAME_MULTILINE_COMMENT=134
RENAME_WS=135
INFO=136
SHOW_LINE_COMMENT=137
SHOW_MULTILINE_COMMENT=138
SHOW_WS=139
'enrich'=5
'explain'=6
'dissect'=7
'eval'=8
'grok'=9
'limit'=10
'row'=11
'sort'=12
'stats'=13
'where'=14
'from'=16
'lookup'=18
'mv_expand'=24
'drop'=25
'keep'=26
'rename'=28
'show'=29
'on'=34
'with'=35
'|'=50
'by'=54
'and'=55
'asc'=56
'='=57
'::'=58
':'=59
','=60
'desc'=61
'.'=62
'false'=63
'first'=64
'in'=65
'is'=66
'last'=67
'like'=68
'not'=69
'null'=70
'nulls'=71
'or'=72
'?'=73
'rlike'=74
'true'=75
'=='=76
'=~'=77
'!='=78
'<'=79
'<='=80
'>'=81
'>='=82
'+'=83
'-'=84
'*'=85
'/'=86
'%'=87
'{'=88
'}'=89
']'=92
')'=94
'metadata'=100
'join'=108
'USING'=109
'as'=132
'info'=136

View file

@ -22,6 +22,9 @@ options {
tokenVocab=esql_lexer;
}
import Expression,
Join;
singleStatement
: query EOF
;
@ -59,68 +62,13 @@ processingCommand
| {this.isDevVersion()}? lookupCommand
| {this.isDevVersion()}? changePointCommand
| {this.isDevVersion()}? insistCommand
| {this.isDevVersion()}? forkCommand
;
whereCommand
: WHERE booleanExpression
;
booleanExpression
: NOT booleanExpression #logicalNot
| valueExpression #booleanDefault
| regexBooleanExpression #regexExpression
| left=booleanExpression operator=AND right=booleanExpression #logicalBinary
| left=booleanExpression operator=OR right=booleanExpression #logicalBinary
| valueExpression (NOT)? IN LP valueExpression (COMMA valueExpression)* RP #logicalIn
| valueExpression IS NOT? NULL #isNull
| matchBooleanExpression #matchExpression
;
regexBooleanExpression
: valueExpression (NOT)? kind=LIKE pattern=string
| valueExpression (NOT)? kind=RLIKE pattern=string
;
matchBooleanExpression
: fieldExp=qualifiedName (CAST_OP fieldType=dataType)? COLON matchQuery=constant
;
valueExpression
: operatorExpression #valueExpressionDefault
| left=operatorExpression comparisonOperator right=operatorExpression #comparison
;
operatorExpression
: primaryExpression #operatorExpressionDefault
| operator=(MINUS | PLUS) operatorExpression #arithmeticUnary
| left=operatorExpression operator=(ASTERISK | SLASH | PERCENT) right=operatorExpression #arithmeticBinary
| left=operatorExpression operator=(PLUS | MINUS) right=operatorExpression #arithmeticBinary
;
primaryExpression
: constant #constantDefault
| qualifiedName #dereference
| functionExpression #function
| LP booleanExpression RP #parenthesizedExpression
| primaryExpression CAST_OP dataType #inlineCast
;
functionExpression
: functionName LP (ASTERISK | (booleanExpression (COMMA booleanExpression)* (COMMA mapExpression)?))? RP
;
functionName
: identifierOrParameter
;
mapExpression
: LEFT_BRACES entryExpression (COMMA entryExpression)* RIGHT_BRACES
;
entryExpression
: key=string COLON value=constant
;
dataType
: identifier #toDataType
;
@ -201,19 +149,6 @@ identifierPattern
| parameter
;
constant
: NULL #nullLiteral
| integerValue UNQUOTED_IDENTIFIER #qualifiedIntegerLiteral
| decimalValue #decimalLiteral
| integerValue #integerLiteral
| booleanValue #booleanLiteral
| parameter #inputParameter
| string #stringLiteral
| OPENING_BRACKET numericValue (COMMA numericValue)* CLOSING_BRACKET #numericArrayLiteral
| OPENING_BRACKET booleanValue (COMMA booleanValue)* CLOSING_BRACKET #booleanArrayLiteral
| OPENING_BRACKET string (COMMA string)* CLOSING_BRACKET #stringArrayLiteral
;
parameter
: PARAM #inputParam
| NAMED_OR_POSITIONAL_PARAM #inputNamedOrPositionalParam
@ -272,31 +207,6 @@ commandOption
: identifier ASSIGN constant
;
booleanValue
: TRUE | FALSE
;
numericValue
: decimalValue
| integerValue
;
decimalValue
: (PLUS | MINUS)? DECIMAL_LITERAL
;
integerValue
: (PLUS | MINUS)? INTEGER_LITERAL
;
string
: QUOTED_STRING
;
comparisonOperator
: EQ | NEQ | LT | LTE | GT | GTE
;
explainCommand
: EXPLAIN subqueryExpression
;
@ -328,26 +238,33 @@ inlinestatsCommand
: DEV_INLINESTATS stats=aggFields (BY grouping=fields)?
;
joinCommand
: type=(JOIN_LOOKUP | DEV_JOIN_LEFT | DEV_JOIN_RIGHT) JOIN joinTarget joinCondition
;
joinTarget
: index=indexPattern
;
joinCondition
: ON joinPredicate (COMMA joinPredicate)*
;
joinPredicate
: valueExpression
;
changePointCommand
: DEV_CHANGE_POINT value=qualifiedName (ON key=qualifiedName)? (AS targetType=qualifiedName COMMA targetPvalue=qualifiedName)?
;
insistCommand
: DEV_INSIST qualifiedNamePatterns
;
forkCommand
: DEV_FORK forkSubQueries
;
forkSubQueries
: (forkSubQuery)+
;
forkSubQuery
: LP forkSubQueryCommand RP
;
forkSubQueryCommand
: forkSubQueryProcessingCommand #singleForkSubQueryCommand
| forkSubQueryCommand PIPE forkSubQueryProcessingCommand #compositeForkSubQuery
;
forkSubQueryProcessingCommand
: whereCommand
| sortCommand
| limitCommand
;

File diff suppressed because one or more lines are too long

View file

@ -1,202 +1,202 @@
DISSECT=1
DROP=2
ENRICH=3
EVAL=4
EXPLAIN=5
FROM=6
GROK=7
KEEP=8
LIMIT=9
MV_EXPAND=10
RENAME=11
ROW=12
SHOW=13
SORT=14
STATS=15
WHERE=16
JOIN_LOOKUP=17
DEV_CHANGE_POINT=18
DEV_INLINESTATS=19
DEV_INSIST=20
DEV_LOOKUP=21
DEV_METRICS=22
DEV_JOIN_FULL=23
DEV_JOIN_LEFT=24
DEV_JOIN_RIGHT=25
UNKNOWN_CMD=26
LINE_COMMENT=27
MULTILINE_COMMENT=28
WS=29
PIPE=30
QUOTED_STRING=31
INTEGER_LITERAL=32
DECIMAL_LITERAL=33
BY=34
AND=35
ASC=36
ASSIGN=37
CAST_OP=38
COLON=39
COMMA=40
DESC=41
DOT=42
FALSE=43
FIRST=44
IN=45
IS=46
LAST=47
LIKE=48
LP=49
NOT=50
NULL=51
NULLS=52
OR=53
PARAM=54
RLIKE=55
RP=56
TRUE=57
EQ=58
CIEQ=59
NEQ=60
LT=61
LTE=62
GT=63
GTE=64
PLUS=65
MINUS=66
ASTERISK=67
SLASH=68
PERCENT=69
LEFT_BRACES=70
RIGHT_BRACES=71
NAMED_OR_POSITIONAL_PARAM=72
OPENING_BRACKET=73
CLOSING_BRACKET=74
UNQUOTED_IDENTIFIER=75
QUOTED_IDENTIFIER=76
EXPR_LINE_COMMENT=77
EXPR_MULTILINE_COMMENT=78
EXPR_WS=79
EXPLAIN_WS=80
EXPLAIN_LINE_COMMENT=81
EXPLAIN_MULTILINE_COMMENT=82
METADATA=83
UNQUOTED_SOURCE=84
FROM_LINE_COMMENT=85
FROM_MULTILINE_COMMENT=86
FROM_WS=87
ID_PATTERN=88
PROJECT_LINE_COMMENT=89
PROJECT_MULTILINE_COMMENT=90
PROJECT_WS=91
AS=92
RENAME_LINE_COMMENT=93
RENAME_MULTILINE_COMMENT=94
RENAME_WS=95
ON=96
WITH=97
ENRICH_POLICY_NAME=98
ENRICH_LINE_COMMENT=99
ENRICH_MULTILINE_COMMENT=100
ENRICH_WS=101
ENRICH_FIELD_LINE_COMMENT=102
ENRICH_FIELD_MULTILINE_COMMENT=103
ENRICH_FIELD_WS=104
MVEXPAND_LINE_COMMENT=105
MVEXPAND_MULTILINE_COMMENT=106
MVEXPAND_WS=107
INFO=108
SHOW_LINE_COMMENT=109
SHOW_MULTILINE_COMMENT=110
SHOW_WS=111
SETTING=112
SETTING_LINE_COMMENT=113
SETTTING_MULTILINE_COMMENT=114
SETTING_WS=115
LOOKUP_LINE_COMMENT=116
LOOKUP_MULTILINE_COMMENT=117
LOOKUP_WS=118
LOOKUP_FIELD_LINE_COMMENT=119
LOOKUP_FIELD_MULTILINE_COMMENT=120
LOOKUP_FIELD_WS=121
JOIN=122
USING=123
JOIN_LINE_COMMENT=124
JOIN_MULTILINE_COMMENT=125
JOIN_WS=126
METRICS_LINE_COMMENT=127
METRICS_MULTILINE_COMMENT=128
METRICS_WS=129
CLOSING_METRICS_LINE_COMMENT=130
CLOSING_METRICS_MULTILINE_COMMENT=131
CLOSING_METRICS_WS=132
CHANGE_POINT_LINE_COMMENT=133
CHANGE_POINT_MULTILINE_COMMENT=134
CHANGE_POINT_WS=135
INSIST_WS=136
INSIST_LINE_COMMENT=137
INSIST_MULTILINE_COMMENT=138
'dissect'=1
'drop'=2
'enrich'=3
'eval'=4
'explain'=5
'from'=6
'grok'=7
'keep'=8
'limit'=9
'mv_expand'=10
'rename'=11
'row'=12
'show'=13
'sort'=14
'stats'=15
'where'=16
'lookup'=17
'|'=30
'by'=34
'and'=35
'asc'=36
'='=37
'::'=38
':'=39
','=40
'desc'=41
'.'=42
'false'=43
'first'=44
'in'=45
'is'=46
'last'=47
'like'=48
'('=49
'not'=50
'null'=51
'nulls'=52
'or'=53
'?'=54
'rlike'=55
')'=56
'true'=57
'=='=58
'=~'=59
'!='=60
'<'=61
'<='=62
'>'=63
'>='=64
'+'=65
'-'=66
'*'=67
'/'=68
'%'=69
'{'=70
'}'=71
']'=74
'metadata'=83
'as'=92
'on'=96
'with'=97
'info'=108
'join'=122
'USING'=123
LINE_COMMENT=1
MULTILINE_COMMENT=2
WS=3
DEV_CHANGE_POINT=4
ENRICH=5
EXPLAIN=6
DISSECT=7
EVAL=8
GROK=9
LIMIT=10
ROW=11
SORT=12
STATS=13
WHERE=14
DEV_INLINESTATS=15
FROM=16
DEV_FORK=17
JOIN_LOOKUP=18
DEV_JOIN_FULL=19
DEV_JOIN_LEFT=20
DEV_JOIN_RIGHT=21
DEV_LOOKUP=22
DEV_METRICS=23
MV_EXPAND=24
DROP=25
KEEP=26
DEV_INSIST=27
RENAME=28
SHOW=29
UNKNOWN_CMD=30
CHANGE_POINT_LINE_COMMENT=31
CHANGE_POINT_MULTILINE_COMMENT=32
CHANGE_POINT_WS=33
ON=34
WITH=35
ENRICH_POLICY_NAME=36
ENRICH_LINE_COMMENT=37
ENRICH_MULTILINE_COMMENT=38
ENRICH_WS=39
ENRICH_FIELD_LINE_COMMENT=40
ENRICH_FIELD_MULTILINE_COMMENT=41
ENRICH_FIELD_WS=42
SETTING=43
SETTING_LINE_COMMENT=44
SETTTING_MULTILINE_COMMENT=45
SETTING_WS=46
EXPLAIN_WS=47
EXPLAIN_LINE_COMMENT=48
EXPLAIN_MULTILINE_COMMENT=49
PIPE=50
QUOTED_STRING=51
INTEGER_LITERAL=52
DECIMAL_LITERAL=53
BY=54
AND=55
ASC=56
ASSIGN=57
CAST_OP=58
COLON=59
COMMA=60
DESC=61
DOT=62
FALSE=63
FIRST=64
IN=65
IS=66
LAST=67
LIKE=68
NOT=69
NULL=70
NULLS=71
OR=72
PARAM=73
RLIKE=74
TRUE=75
EQ=76
CIEQ=77
NEQ=78
LT=79
LTE=80
GT=81
GTE=82
PLUS=83
MINUS=84
ASTERISK=85
SLASH=86
PERCENT=87
LEFT_BRACES=88
RIGHT_BRACES=89
NAMED_OR_POSITIONAL_PARAM=90
OPENING_BRACKET=91
CLOSING_BRACKET=92
LP=93
RP=94
UNQUOTED_IDENTIFIER=95
QUOTED_IDENTIFIER=96
EXPR_LINE_COMMENT=97
EXPR_MULTILINE_COMMENT=98
EXPR_WS=99
METADATA=100
UNQUOTED_SOURCE=101
FROM_LINE_COMMENT=102
FROM_MULTILINE_COMMENT=103
FROM_WS=104
FORK_WS=105
FORK_LINE_COMMENT=106
FORK_MULTILINE_COMMENT=107
JOIN=108
USING=109
JOIN_LINE_COMMENT=110
JOIN_MULTILINE_COMMENT=111
JOIN_WS=112
LOOKUP_LINE_COMMENT=113
LOOKUP_MULTILINE_COMMENT=114
LOOKUP_WS=115
LOOKUP_FIELD_LINE_COMMENT=116
LOOKUP_FIELD_MULTILINE_COMMENT=117
LOOKUP_FIELD_WS=118
METRICS_LINE_COMMENT=119
METRICS_MULTILINE_COMMENT=120
METRICS_WS=121
CLOSING_METRICS_LINE_COMMENT=122
CLOSING_METRICS_MULTILINE_COMMENT=123
CLOSING_METRICS_WS=124
MVEXPAND_LINE_COMMENT=125
MVEXPAND_MULTILINE_COMMENT=126
MVEXPAND_WS=127
ID_PATTERN=128
PROJECT_LINE_COMMENT=129
PROJECT_MULTILINE_COMMENT=130
PROJECT_WS=131
AS=132
RENAME_LINE_COMMENT=133
RENAME_MULTILINE_COMMENT=134
RENAME_WS=135
INFO=136
SHOW_LINE_COMMENT=137
SHOW_MULTILINE_COMMENT=138
SHOW_WS=139
'enrich'=5
'explain'=6
'dissect'=7
'eval'=8
'grok'=9
'limit'=10
'row'=11
'sort'=12
'stats'=13
'where'=14
'from'=16
'lookup'=18
'mv_expand'=24
'drop'=25
'keep'=26
'rename'=28
'show'=29
'on'=34
'with'=35
'|'=50
'by'=54
'and'=55
'asc'=56
'='=57
'::'=58
':'=59
','=60
'desc'=61
'.'=62
'false'=63
'first'=64
'in'=65
'is'=66
'last'=67
'like'=68
'not'=69
'null'=70
'nulls'=71
'or'=72
'?'=73
'rlike'=74
'true'=75
'=='=76
'=~'=77
'!='=78
'<'=79
'<='=80
'>'=81
'>='=82
'+'=83
'-'=84
'*'=85
'/'=86
'%'=87
'{'=88
'}'=89
']'=92
')'=94
'metadata'=100
'join'=108
'USING'=109
'as'=132
'info'=136

View file

@ -0,0 +1,24 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar ChangePoint;
//
// | CHANGE_POINT command
//
DEV_CHANGE_POINT : {this.isDevVersion()}? 'change_point' -> pushMode(CHANGE_POINT_MODE);
mode CHANGE_POINT_MODE;
CHANGE_POINT_PIPE : PIPE -> type(PIPE), popMode;
CHANGE_POINT_ON : ON -> type(ON);
CHANGE_POINT_AS : AS -> type(AS);
CHANGE_POINT_DOT: DOT -> type(DOT);
CHANGE_POINT_COMMA: COMMA -> type(COMMA);
CHANGE_POINT_QUOTED_IDENTIFIER: QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER);
CHANGE_POINT_UNQUOTED_IDENTIFIER: UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER);
CHANGE_POINT_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN);
CHANGE_POINT_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN);
CHANGE_POINT_WS: WS -> channel(HIDDEN);

View file

@ -0,0 +1,100 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar Enrich;
//
// | ENRICH ON key WITH fields
//
ENRICH : 'enrich' -> pushMode(ENRICH_MODE);
mode ENRICH_MODE;
ENRICH_PIPE : PIPE -> type(PIPE), popMode;
ENRICH_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(SETTING_MODE);
ON : 'on' -> pushMode(ENRICH_FIELD_MODE);
WITH : 'with' -> pushMode(ENRICH_FIELD_MODE);
// similar to that of an index
// see https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html#indices-create-api-path-params
fragment ENRICH_POLICY_NAME_BODY
: ~[\\/?"<>| ,#\t\r\n:]
;
ENRICH_POLICY_NAME
// allow prefix for the policy to specify its resolution
: (ENRICH_POLICY_NAME_BODY+ COLON)? ENRICH_POLICY_NAME_BODY+
;
ENRICH_MODE_UNQUOTED_VALUE
: ENRICH_POLICY_NAME -> type(ENRICH_POLICY_NAME)
;
ENRICH_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
ENRICH_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
ENRICH_WS
: WS -> channel(HIDDEN)
;
// submode for Enrich to allow different lexing between policy source (loose) and field identifiers
mode ENRICH_FIELD_MODE;
ENRICH_FIELD_PIPE : PIPE -> type(PIPE), popMode, popMode;
ENRICH_FIELD_ASSIGN : ASSIGN -> type(ASSIGN);
ENRICH_FIELD_COMMA : COMMA -> type(COMMA);
ENRICH_FIELD_DOT: DOT -> type(DOT);
ENRICH_FIELD_WITH : WITH -> type(WITH) ;
ENRICH_FIELD_ID_PATTERN
: ID_PATTERN -> type(ID_PATTERN)
;
ENRICH_FIELD_QUOTED_IDENTIFIER
: QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER)
;
ENRICH_FIELD_PARAM : PARAM -> type(PARAM);
ENRICH_FIELD_NAMED_OR_POSITIONAL_PARAM : NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM);
ENRICH_FIELD_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
ENRICH_FIELD_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
ENRICH_FIELD_WS
: WS -> channel(HIDDEN)
;
mode SETTING_MODE;
SETTING_CLOSING_BRACKET : CLOSING_BRACKET -> type(CLOSING_BRACKET), popMode;
SETTING_COLON : COLON -> type(COLON);
SETTING
: (ASPERAND | DIGIT| DOT | LETTER | UNDERSCORE)+
;
SETTING_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
SETTTING_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
SETTING_WS
: WS -> channel(HIDDEN)
;

View file

@ -0,0 +1,20 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar Explain;
//
// Explain
//
EXPLAIN : 'explain' -> pushMode(EXPLAIN_MODE);
mode EXPLAIN_MODE;
EXPLAIN_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(DEFAULT_MODE);
EXPLAIN_PIPE : PIPE -> type(PIPE), popMode;
EXPLAIN_WS : WS -> channel(HIDDEN);
EXPLAIN_LINE_COMMENT : LINE_COMMENT -> channel(HIDDEN);
EXPLAIN_MULTILINE_COMMENT : MULTILINE_COMMENT -> channel(HIDDEN);

View file

@ -0,0 +1,169 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar Expression;
//
// Expression - used by many commands
//
DISSECT : 'dissect' -> pushMode(EXPRESSION_MODE);
EVAL : 'eval' -> pushMode(EXPRESSION_MODE);
GROK : 'grok' -> pushMode(EXPRESSION_MODE);
LIMIT : 'limit' -> pushMode(EXPRESSION_MODE);
ROW : 'row' -> pushMode(EXPRESSION_MODE);
SORT : 'sort' -> pushMode(EXPRESSION_MODE);
STATS : 'stats' -> pushMode(EXPRESSION_MODE);
WHERE : 'where' -> pushMode(EXPRESSION_MODE);
DEV_INLINESTATS : {this.isDevVersion()}? 'inlinestats' -> pushMode(EXPRESSION_MODE);
mode EXPRESSION_MODE;
PIPE : '|' -> popMode;
fragment DIGIT
: [0-9]
;
fragment LETTER
: [a-z]
;
fragment ESCAPE_SEQUENCE
: '\\' [tnr"\\]
;
fragment UNESCAPED_CHARS
: ~[\r\n"\\]
;
fragment EXPONENT
: [e] [+-]? DIGIT+
;
fragment ASPERAND
: '@'
;
fragment BACKQUOTE
: '`'
;
fragment BACKQUOTE_BLOCK
: ~'`'
| '``'
;
fragment UNDERSCORE
: '_'
;
fragment UNQUOTED_ID_BODY
: (LETTER | DIGIT | UNDERSCORE)
;
QUOTED_STRING
: '"' (ESCAPE_SEQUENCE | UNESCAPED_CHARS)* '"'
| '"""' (~[\r\n])*? '"""' '"'? '"'?
;
INTEGER_LITERAL
: DIGIT+
;
DECIMAL_LITERAL
: DIGIT+ DOT DIGIT*
| DOT DIGIT+
| DIGIT+ (DOT DIGIT*)? EXPONENT
| DOT DIGIT+ EXPONENT
;
BY : 'by';
AND : 'and';
ASC : 'asc';
ASSIGN : '=';
CAST_OP : '::';
COLON : ':';
COMMA : ',';
DESC : 'desc';
DOT : '.';
FALSE : 'false';
FIRST : 'first';
IN: 'in';
IS: 'is';
LAST : 'last';
LIKE: 'like';
NOT : 'not';
NULL : 'null';
NULLS : 'nulls';
OR : 'or';
PARAM: '?';
RLIKE: 'rlike';
TRUE : 'true';
EQ : '==';
CIEQ : '=~';
NEQ : '!=';
LT : '<';
LTE : '<=';
GT : '>';
GTE : '>=';
PLUS : '+';
MINUS : '-';
ASTERISK : '*';
SLASH : '/';
PERCENT : '%';
LEFT_BRACES : '{';
RIGHT_BRACES : '}';
NESTED_WHERE : WHERE -> type(WHERE);
NAMED_OR_POSITIONAL_PARAM
: PARAM (LETTER | UNDERSCORE) UNQUOTED_ID_BODY*
| PARAM DIGIT+
;
// Brackets are funny. We can happen upon a CLOSING_BRACKET in two ways - one
// way is to start in an explain command which then shifts us to expression
// mode. Thus, the two popModes on CLOSING_BRACKET. The other way could as
// the start of a multivalued field constant. To line up with the double pop
// the explain mode needs, we double push when we see that.
OPENING_BRACKET : '[' -> pushMode(EXPRESSION_MODE), pushMode(EXPRESSION_MODE);
CLOSING_BRACKET : ']' -> popMode, popMode;
LP : '(' -> pushMode(EXPRESSION_MODE), pushMode(EXPRESSION_MODE);
RP : ')' -> popMode, popMode;
UNQUOTED_IDENTIFIER
: LETTER UNQUOTED_ID_BODY*
// only allow @ at beginning of identifier to keep the option to allow @ as infix operator in the future
// also, single `_` and `@` characters are not valid identifiers
| (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY+
;
fragment QUOTED_ID
: BACKQUOTE BACKQUOTE_BLOCK+ BACKQUOTE
;
QUOTED_IDENTIFIER
: QUOTED_ID
;
EXPR_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
EXPR_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
EXPR_WS
: WS -> channel(HIDDEN)
;

View file

@ -0,0 +1,21 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar Fork;
//
// Fork
//
DEV_FORK : {this.isDevVersion()}? 'fork' -> pushMode(FORK_MODE);
mode FORK_MODE;
FORK_LP : LP -> type(LP), pushMode(DEFAULT_MODE);
FORK_PIPE : PIPE -> type(PIPE), popMode;
FORK_WS : WS -> channel(HIDDEN);
FORK_LINE_COMMENT : LINE_COMMENT -> channel(HIDDEN);
FORK_MULTILINE_COMMENT : MULTILINE_COMMENT -> channel(HIDDEN);

View file

@ -0,0 +1,48 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar From;
//
// FROM command
//
FROM : 'from' -> pushMode(FROM_MODE);
mode FROM_MODE;
FROM_PIPE : PIPE -> type(PIPE), popMode;
FROM_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET);
FROM_CLOSING_BRACKET : CLOSING_BRACKET -> type(CLOSING_BRACKET);
FROM_COLON : COLON -> type(COLON);
FROM_COMMA : COMMA -> type(COMMA);
FROM_ASSIGN : ASSIGN -> type(ASSIGN);
METADATA : 'metadata';
// in 8.14 ` were not allowed
// this has been relaxed in 8.15 since " is used for quoting
fragment UNQUOTED_SOURCE_PART
: ~[:"=|,[\]/ \t\r\n]
| '/' ~[*/] // allow single / but not followed by another / or * which would start a comment -- used in index pattern date spec
;
UNQUOTED_SOURCE
: UNQUOTED_SOURCE_PART+
;
FROM_UNQUOTED_SOURCE : UNQUOTED_SOURCE -> type(UNQUOTED_SOURCE);
FROM_QUOTED_SOURCE : QUOTED_STRING -> type(QUOTED_STRING);
FROM_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
FROM_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
FROM_WS
: WS -> channel(HIDDEN)
;

View file

@ -0,0 +1,41 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar Join;
//
// JOIN-related commands
//
JOIN_LOOKUP : 'lookup' -> pushMode(JOIN_MODE);
DEV_JOIN_FULL : {this.isDevVersion()}? 'full' -> pushMode(JOIN_MODE);
DEV_JOIN_LEFT : {this.isDevVersion()}? 'left' -> pushMode(JOIN_MODE);
DEV_JOIN_RIGHT : {this.isDevVersion()}? 'right' -> pushMode(JOIN_MODE);
mode JOIN_MODE;
JOIN_PIPE : PIPE -> type(PIPE), popMode;
JOIN : 'join';
JOIN_AS : AS -> type(AS);
JOIN_ON : ON -> type(ON), popMode, pushMode(EXPRESSION_MODE);
USING : 'USING' -> popMode, pushMode(EXPRESSION_MODE);
JOIN_UNQUOTED_SOURCE: UNQUOTED_SOURCE -> type(UNQUOTED_SOURCE);
JOIN_QUOTED_SOURCE : QUOTED_STRING -> type(QUOTED_STRING);
JOIN_COLON : COLON -> type(COLON);
JOIN_UNQUOTED_IDENTIFER: UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER);
JOIN_QUOTED_IDENTIFIER : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER);
JOIN_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
JOIN_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
JOIN_WS
: WS -> channel(HIDDEN)
;

View file

@ -0,0 +1,55 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar Lookup;
//
// LOOKUP ON key
//
DEV_LOOKUP : {this.isDevVersion()}? 'lookup_🐔' -> pushMode(LOOKUP_MODE);
mode LOOKUP_MODE;
LOOKUP_PIPE : PIPE -> type(PIPE), popMode;
LOOKUP_COLON : COLON -> type(COLON);
LOOKUP_COMMA : COMMA -> type(COMMA);
LOOKUP_DOT: DOT -> type(DOT);
LOOKUP_ON : ON -> type(ON), pushMode(LOOKUP_FIELD_MODE);
LOOKUP_UNQUOTED_SOURCE: UNQUOTED_SOURCE -> type(UNQUOTED_SOURCE);
LOOKUP_QUOTED_SOURCE : QUOTED_STRING -> type(QUOTED_STRING);
LOOKUP_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
LOOKUP_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
LOOKUP_WS
: WS -> channel(HIDDEN)
;
mode LOOKUP_FIELD_MODE;
LOOKUP_FIELD_PIPE : PIPE -> type(PIPE), popMode, popMode;
LOOKUP_FIELD_COMMA : COMMA -> type(COMMA);
LOOKUP_FIELD_DOT: DOT -> type(DOT);
LOOKUP_FIELD_ID_PATTERN
: ID_PATTERN -> type(ID_PATTERN)
;
LOOKUP_FIELD_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
LOOKUP_FIELD_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
LOOKUP_FIELD_WS
: WS -> channel(HIDDEN)
;

View file

@ -0,0 +1,70 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar Metrics;
//
// METRICS command
//
DEV_METRICS : {this.isDevVersion()}? 'metrics' -> pushMode(METRICS_MODE);
mode METRICS_MODE;
METRICS_PIPE : PIPE -> type(PIPE), popMode;
METRICS_UNQUOTED_SOURCE: UNQUOTED_SOURCE -> type(UNQUOTED_SOURCE), popMode, pushMode(CLOSING_METRICS_MODE);
METRICS_QUOTED_SOURCE : QUOTED_STRING -> type(QUOTED_STRING), popMode, pushMode(CLOSING_METRICS_MODE);
METRICS_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
METRICS_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
METRICS_WS
: WS -> channel(HIDDEN)
;
// TODO: remove this workaround mode - see https://github.com/elastic/elasticsearch/issues/108528
mode CLOSING_METRICS_MODE;
CLOSING_METRICS_COLON
: COLON -> type(COLON), popMode, pushMode(METRICS_MODE)
;
CLOSING_METRICS_COMMA
: COMMA -> type(COMMA), popMode, pushMode(METRICS_MODE)
;
CLOSING_METRICS_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
CLOSING_METRICS_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
CLOSING_METRICS_WS
: WS -> channel(HIDDEN)
;
CLOSING_METRICS_QUOTED_IDENTIFIER
: QUOTED_IDENTIFIER -> popMode, pushMode(EXPRESSION_MODE), type(QUOTED_IDENTIFIER)
;
CLOSING_METRICS_UNQUOTED_IDENTIFIER
:UNQUOTED_IDENTIFIER -> popMode, pushMode(EXPRESSION_MODE), type(UNQUOTED_IDENTIFIER)
;
CLOSING_METRICS_BY
:BY -> popMode, pushMode(EXPRESSION_MODE), type(BY)
;
CLOSING_METRICS_PIPE
: PIPE -> type(PIPE), popMode
;

View file

@ -0,0 +1,39 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar MvExpand;
//
// MV_EXPAND
//
MV_EXPAND : 'mv_expand' -> pushMode(MVEXPAND_MODE);
mode MVEXPAND_MODE;
MVEXPAND_PIPE : PIPE -> type(PIPE), popMode;
MVEXPAND_DOT: DOT -> type(DOT);
MVEXPAND_PARAM : PARAM -> type(PARAM);
MVEXPAND_NAMED_OR_POSITIONAL_PARAM : NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM);
MVEXPAND_QUOTED_IDENTIFIER
: QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER)
;
MVEXPAND_UNQUOTED_IDENTIFIER
: UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER)
;
MVEXPAND_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
MVEXPAND_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
MVEXPAND_WS
: WS -> channel(HIDDEN)
;

View file

@ -0,0 +1,46 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar Project;
//
// DROP, KEEP
//
DROP : 'drop' -> pushMode(PROJECT_MODE);
KEEP : 'keep' -> pushMode(PROJECT_MODE);
DEV_INSIST : {this.isDevVersion()}? 'insist_🐔' -> pushMode(PROJECT_MODE);
mode PROJECT_MODE;
PROJECT_PIPE : PIPE -> type(PIPE), popMode;
PROJECT_DOT: DOT -> type(DOT);
PROJECT_COMMA : COMMA -> type(COMMA);
PROJECT_PARAM : PARAM -> type(PARAM);
PROJECT_NAMED_OR_POSITIONAL_PARAM : NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM);
fragment UNQUOTED_ID_BODY_WITH_PATTERN
: (LETTER | DIGIT | UNDERSCORE | ASTERISK)
;
fragment UNQUOTED_ID_PATTERN
: (LETTER | ASTERISK) UNQUOTED_ID_BODY_WITH_PATTERN*
| (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY_WITH_PATTERN+
;
ID_PATTERN
: (UNQUOTED_ID_PATTERN | QUOTED_ID)+
;
PROJECT_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
PROJECT_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
PROJECT_WS
: WS -> channel(HIDDEN)
;

View file

@ -0,0 +1,39 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar Rename;
//
// | RENAME a.b AS x, c AS y
//
RENAME : 'rename' -> pushMode(RENAME_MODE);
mode RENAME_MODE;
RENAME_PIPE : PIPE -> type(PIPE), popMode;
RENAME_ASSIGN : ASSIGN -> type(ASSIGN);
RENAME_COMMA : COMMA -> type(COMMA);
RENAME_DOT: DOT -> type(DOT);
RENAME_PARAM : PARAM -> type(PARAM);
RENAME_NAMED_OR_POSITIONAL_PARAM : NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM);
AS : 'as';
RENAME_ID_PATTERN
: ID_PATTERN -> type(ID_PATTERN)
;
RENAME_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
RENAME_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
RENAME_WS
: WS -> channel(HIDDEN)
;

View file

@ -0,0 +1,31 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar Show;
//
// SHOW commands
//
SHOW : 'show' -> pushMode(SHOW_MODE);
mode SHOW_MODE;
SHOW_PIPE : PIPE -> type(PIPE), popMode;
INFO : 'info';
SHOW_LINE_COMMENT
: LINE_COMMENT -> channel(HIDDEN)
;
SHOW_MULTILINE_COMMENT
: MULTILINE_COMMENT -> channel(HIDDEN)
;
SHOW_WS
: WS -> channel(HIDDEN)
;

View file

@ -0,0 +1,12 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
lexer grammar UnknownCommand;
//
// Catch-all for unrecognized commands
//
UNKNOWN_CMD : ~[ \r\n\t[\]/]+ -> pushMode(EXPRESSION_MODE) ;

View file

@ -0,0 +1,101 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
parser grammar Expression;
booleanExpression
: NOT booleanExpression #logicalNot
| valueExpression #booleanDefault
| regexBooleanExpression #regexExpression
| left=booleanExpression operator=AND right=booleanExpression #logicalBinary
| left=booleanExpression operator=OR right=booleanExpression #logicalBinary
| valueExpression (NOT)? IN LP valueExpression (COMMA valueExpression)* RP #logicalIn
| valueExpression IS NOT? NULL #isNull
| matchBooleanExpression #matchExpression
;
regexBooleanExpression
: valueExpression (NOT)? kind=LIKE pattern=string
| valueExpression (NOT)? kind=RLIKE pattern=string
;
matchBooleanExpression
: fieldExp=qualifiedName (CAST_OP fieldType=dataType)? COLON matchQuery=constant
;
valueExpression
: operatorExpression #valueExpressionDefault
| left=operatorExpression comparisonOperator right=operatorExpression #comparison
;
operatorExpression
: primaryExpression #operatorExpressionDefault
| operator=(MINUS | PLUS) operatorExpression #arithmeticUnary
| left=operatorExpression operator=(ASTERISK | SLASH | PERCENT) right=operatorExpression #arithmeticBinary
| left=operatorExpression operator=(PLUS | MINUS) right=operatorExpression #arithmeticBinary
;
primaryExpression
: constant #constantDefault
| qualifiedName #dereference
| functionExpression #function
| LP booleanExpression RP #parenthesizedExpression
| primaryExpression CAST_OP dataType #inlineCast
;
functionExpression
: functionName LP (ASTERISK | (booleanExpression (COMMA booleanExpression)* (COMMA mapExpression)?))? RP
;
functionName
: identifierOrParameter
;
mapExpression
: LEFT_BRACES entryExpression (COMMA entryExpression)* RIGHT_BRACES
;
entryExpression
: key=string COLON value=constant
;
constant
: NULL #nullLiteral
| integerValue UNQUOTED_IDENTIFIER #qualifiedIntegerLiteral
| decimalValue #decimalLiteral
| integerValue #integerLiteral
| booleanValue #booleanLiteral
| parameter #inputParameter
| string #stringLiteral
| OPENING_BRACKET numericValue (COMMA numericValue)* CLOSING_BRACKET #numericArrayLiteral
| OPENING_BRACKET booleanValue (COMMA booleanValue)* CLOSING_BRACKET #booleanArrayLiteral
| OPENING_BRACKET string (COMMA string)* CLOSING_BRACKET #stringArrayLiteral
;
booleanValue
: TRUE | FALSE
;
numericValue
: decimalValue
| integerValue
;
decimalValue
: (PLUS | MINUS)? DECIMAL_LITERAL
;
integerValue
: (PLUS | MINUS)? INTEGER_LITERAL
;
string
: QUOTED_STRING
;
comparisonOperator
: EQ | NEQ | LT | LTE | GT | GTE
;

View file

@ -0,0 +1,25 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
parser grammar Join;
joinCommand
: type=(JOIN_LOOKUP | DEV_JOIN_LEFT | DEV_JOIN_RIGHT) JOIN joinTarget joinCondition
;
joinTarget
: index=indexPattern
;
joinCondition
: ON joinPredicate (COMMA joinPredicate)*
;
joinPredicate
: valueExpression
;

View file

@ -0,0 +1,44 @@
import { CharStream, CommonTokenStream } from 'antlr4';
import { default as ESQLLexer } from './esql_lexer';
import { default as ESQLParser } from '../antlr/esql_parser';
import { GRAMMAR_ROOT_RULE } from '../parser/constants';
import { ESQLErrorListener } from '../parser';
describe('ES|QL Lexer/Parser', () => {
it('should lex a simple query', () => {
const text = 'FROM an_index';
const lexer = new ESQLLexer(new CharStream(text));
const stream = new CommonTokenStream(lexer);
stream.fill();
const symbolicNames = stream.tokens.map((token) => lexer.symbolicNames[token.type]);
expect(symbolicNames).toEqual(['FROM', 'FROM_WS', 'UNQUOTED_SOURCE', undefined]);
});
it('should match token numbers between lexer and parser', () => {
expect(ESQLLexer.FROM).toEqual(ESQLParser.FROM);
expect(ESQLLexer.RENAME).toEqual(ESQLParser.RENAME);
expect(ESQLLexer.PIPE).toEqual(ESQLParser.PIPE);
expect(ESQLLexer.LAST).toEqual(ESQLParser.LAST);
expect(ESQLLexer.SLASH).toEqual(ESQLParser.SLASH);
});
it('should parse a simple query', () => {
const text = 'FROM an_index';
const lexer = new ESQLLexer(new CharStream(text));
const stream = new CommonTokenStream(lexer);
const parser = new ESQLParser(stream);
const errorListener = new ESQLErrorListener();
parser.removeErrorListeners();
parser.addErrorListener(errorListener);
parser[GRAMMAR_ROOT_RULE]();
expect(errorListener.getErrors()).toHaveLength(0);
});
});

View file

@ -12,7 +12,13 @@ import { ErrorListener } from 'antlr4';
import { getPosition } from './helpers';
import type { EditorError } from '../types';
// These will need to be manually updated whenever the relevant grammar changes.
const SYNTAX_ERRORS_TO_IGNORE = [
`mismatched input '<EOF>' expecting {'explain', 'row', 'from', 'show'}`,
];
const REPLACE_DEV = /,{0,1}(?<!\s)\s*DEV_\w+\s*/g;
const REPLACE_ORPHAN_COMMA = /{, /g;
export class ESQLErrorListener extends ErrorListener<any> {
protected errors: EditorError[] = [];
@ -27,6 +33,15 @@ export class ESQLErrorListener extends ErrorListener<any> {
// Remove any DEV_ tokens from the error message
message = message.replace(REPLACE_DEV, '');
// Remove any trailing commas from the error message... this handles
// cases where the dev token was at the start of a list
// e.g. "mismatched input 'PROJECT' expecting {, 'enrich', 'dissect', 'eval', 'grok'}"
message = message.replace(REPLACE_ORPHAN_COMMA, '{');
if (SYNTAX_ERRORS_TO_IGNORE.includes(message)) {
return;
}
const textMessage = `SyntaxError: ${message}`;
const tokenPosition = getPosition(offendingSymbol);

View file

@ -19,8 +19,32 @@ import { default as ESQLLexer } from '../antlr/esql_lexer';
import { default as ESQLParser } from '../antlr/esql_parser';
import { default as ESQLParserListener } from '../antlr/esql_parser_listener';
/**
* Some changes to the grammar deleted the literal names for some tokens.
* This is a workaround to restore the literals that were lost.
*
* See https://github.com/elastic/elasticsearch/pull/124177 for context.
*/
const replaceSymbolsWithLiterals = (
symbolicNames: Array<string | null>,
literalNames: Array<string | null>
) => {
const symbolReplacements: Map<string, string> = new Map([
['LP', '('],
['OPENING_BRACKET', '['],
]);
for (let i = 0; i < symbolicNames.length; i++) {
const name = symbolicNames[i];
if (name && symbolReplacements.has(name)) {
literalNames[i] = `'${symbolReplacements.get(name)!}'`;
}
}
};
export const getLexer = (inputStream: CharStream, errorListener: ErrorListener<any>) => {
const lexer = new ESQLLexer(inputStream);
replaceSymbolsWithLiterals(lexer.symbolicNames, lexer.literalNames);
lexer.removeErrorListeners();
lexer.addErrorListener(errorListener);
@ -36,8 +60,7 @@ export const getParser = (
const lexer = getLexer(inputStream, errorListener);
const tokens = new CommonTokenStream(lexer);
const parser = new ESQLParser(tokens);
// lexer.symbolicNames
replaceSymbolsWithLiterals(parser.symbolicNames, parser.literalNames);
parser.removeErrorListeners();
parser.addErrorListener(errorListener);
@ -62,11 +85,6 @@ export const createParser = (src: string) => {
return getParser(CharStreams.fromString(src), errorListener, parseListener);
};
// These will need to be manually updated whenever the relevant grammar changes.
const SYNTAX_ERRORS_TO_IGNORE = [
`SyntaxError: mismatched input '<EOF>' expecting {'explain', 'from', 'row', 'show'}`,
];
export interface ParseOptions {
/**
* Whether to collect and attach to AST nodes user's custom formatting:
@ -115,9 +133,7 @@ export const parse = (text: string | undefined, options: ParseOptions = {}): Par
parser[GRAMMAR_ROOT_RULE]();
const errors = errorListener.getErrors().filter((error) => {
return !SYNTAX_ERRORS_TO_IGNORE.includes(error.message);
});
const errors = errorListener.getErrors();
const { ast: commands } = parseListener.getAst();
const root = Builder.expression.query(commands, {
location: {
@ -133,10 +149,6 @@ export const parse = (text: string | undefined, options: ParseOptions = {}): Par
return { root, ast: commands, errors, tokens: tokens.tokens };
} catch (error) {
/**
* Parsing should never fail, meaning this branch should never execute. But
* if it does fail, we want to log the error message for easier debugging.
*/
// eslint-disable-next-line no-console
console.error(error);
@ -151,9 +163,7 @@ export const parse = (text: string | undefined, options: ParseOptions = {}): Par
endLineNumber: 0,
startColumn: 0,
endColumn: 0,
message:
'Parsing internal error: ' +
(!!error && typeof error === 'object' ? String(error.message) : String(error)),
message: `Invalid query [${text}]`,
severity: 'error',
},
],

View file

@ -604,7 +604,7 @@ FROM index
test('can vertically flatten adjacent binary expressions of the same precedence', () => {
const query = `
FROM index
| STATS super_function_name(0.123123123123123 + 888811112.232323123123 + 123123123123.123123123 + 23232323.23232323123 - 123 + 999)),
| STATS super_function_name(0.123123123123123 + 888811112.232323123123 + 123123123123.123123123 + 23232323.23232323123 - 123 + 999),
| LIMIT 10
`;
const text = reprint(query).text;
@ -618,7 +618,8 @@ FROM index
123123123123.12312 +
23232323.232323233 -
123 +
999)`);
999)
| LIMIT 10`);
});
});
@ -644,7 +645,7 @@ FROM index
test('binary expressions of different precedence are not flattened', () => {
const query = `
FROM index
| STATS fn(123456789 + 123456789 - 123456789 + 123456789 - 123456789 + 123456789 - 123456789)),
| STATS fn(123456789 + 123456789 - 123456789 + 123456789 - 123456789 + 123456789 - 123456789),
| LIMIT 10
`;
const text = reprint(query).text;
@ -659,13 +660,14 @@ FROM index
123456789 -
123456789 +
123456789 -
123456789)`);
123456789)
| LIMIT 10`);
});
test('binary expressions vertical flattening child function function argument wrapping', () => {
const query = `
FROM index
| STATS super_function_name(11111111111111.111 + 11111111111111.111 * 11111111111111.111 + another_function_goes_here("this will get wrapped", "at this word", "and one more long string") - 111 + 111)),
| STATS super_function_name(11111111111111.111 + 11111111111111.111 * 11111111111111.111 + another_function_goes_here("this will get wrapped", "at this word", "and one more long string") - 111 + 111),
| LIMIT 10
`;
const text = reprint(query).text;
@ -679,13 +681,14 @@ FROM index
ANOTHER_FUNCTION_GOES_HERE("this will get wrapped", "at this word",
"and one more long string") -
111 +
111)`);
111)
| LIMIT 10`);
});
test('two binary expression lists of different precedence group', () => {
const query = `
FROM index
| STATS fn(11111111111111.111 + 3333333333333.3333 * 3333333333333.3333 * 3333333333333.3333 * 3333333333333.3333 + 11111111111111.111 + 11111111111111.111)),
| STATS fn(11111111111111.111 + 3333333333333.3333 * 3333333333333.3333 * 3333333333333.3333 * 3333333333333.3333 + 11111111111111.111 + 11111111111111.111),
| LIMIT 10
`;
const text = reprint(query).text;
@ -700,7 +703,8 @@ FROM index
3333333333333.3335 *
3333333333333.3335 +
11111111111111.111 +
11111111111111.111)`);
11111111111111.111)
| LIMIT 10`);
});
test('formats WHERE binary-expression', () => {

View file

@ -11,7 +11,8 @@
"src/**/*",
"**/*.ts",
],
"kbn_references": [],
"kbn_references": [
],
"exclude": [
"target/**/*",
]

View file

@ -18,7 +18,7 @@ export const validationFromCommandTestSuite = (setup: helpers.Setup) => {
const { expectErrors } = await setup();
await expectErrors('f', [
"SyntaxError: mismatched input 'f' expecting {'explain', 'from', 'row', 'show'}",
"SyntaxError: mismatched input 'f' expecting {'explain', 'row', 'from', 'show'}",
]);
await expectErrors('from ', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, UNQUOTED_SOURCE}",

View file

@ -17,7 +17,7 @@ export const validationMetricsCommandTestSuite = (setup: helpers.Setup) => {
const { expectErrors } = await setup();
await expectErrors('m', [
"SyntaxError: mismatched input 'm' expecting {'explain', 'from', 'row', 'show'}",
"SyntaxError: mismatched input 'm' expecting {'explain', 'row', 'from', 'show'}",
]);
await expectErrors('metrics ', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, UNQUOTED_SOURCE}",
@ -117,11 +117,11 @@ export const validationMetricsCommandTestSuite = (setup: helpers.Setup) => {
await expectErrors('metrics a_index doubleField=', [
expect.any(String),
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
]);
await expectErrors('metrics a_index doubleField=5 by ', [
expect.any(String),
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
]);
});

View file

@ -117,10 +117,10 @@ export const validationStatsCommandTestSuite = (setup: helpers.Setup) => {
const { expectErrors } = await setup();
await expectErrors('from a_index | stats doubleField=', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
]);
await expectErrors('from a_index | stats doubleField=5 by ', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
]);
await expectErrors('from a_index | stats avg(doubleField) by wrongField', [
'Unknown column [wrongField]',
@ -183,7 +183,7 @@ export const validationStatsCommandTestSuite = (setup: helpers.Setup) => {
const { expectErrors } = await setup();
await expectErrors('from a_index | stats by ', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
]);
});

View file

@ -168,70 +168,70 @@
{
"query": "eval",
"error": [
"SyntaxError: mismatched input 'eval' expecting {'explain', 'from', 'row', 'show'}"
"SyntaxError: mismatched input 'eval' expecting {'explain', 'row', 'from', 'show'}"
],
"warning": []
},
{
"query": "stats",
"error": [
"SyntaxError: mismatched input 'stats' expecting {'explain', 'from', 'row', 'show'}"
"SyntaxError: mismatched input 'stats' expecting {'explain', 'row', 'from', 'show'}"
],
"warning": []
},
{
"query": "rename",
"error": [
"SyntaxError: mismatched input 'rename' expecting {'explain', 'from', 'row', 'show'}"
"SyntaxError: mismatched input 'rename' expecting {'explain', 'row', 'from', 'show'}"
],
"warning": []
},
{
"query": "limit",
"error": [
"SyntaxError: mismatched input 'limit' expecting {'explain', 'from', 'row', 'show'}"
"SyntaxError: mismatched input 'limit' expecting {'explain', 'row', 'from', 'show'}"
],
"warning": []
},
{
"query": "keep",
"error": [
"SyntaxError: mismatched input 'keep' expecting {'explain', 'from', 'row', 'show'}"
"SyntaxError: mismatched input 'keep' expecting {'explain', 'row', 'from', 'show'}"
],
"warning": []
},
{
"query": "drop",
"error": [
"SyntaxError: mismatched input 'drop' expecting {'explain', 'from', 'row', 'show'}"
"SyntaxError: mismatched input 'drop' expecting {'explain', 'row', 'from', 'show'}"
],
"warning": []
},
{
"query": "mv_expand",
"error": [
"SyntaxError: mismatched input 'mv_expand' expecting {'explain', 'from', 'row', 'show'}"
"SyntaxError: mismatched input 'mv_expand' expecting {'explain', 'row', 'from', 'show'}"
],
"warning": []
},
{
"query": "dissect",
"error": [
"SyntaxError: mismatched input 'dissect' expecting {'explain', 'from', 'row', 'show'}"
"SyntaxError: mismatched input 'dissect' expecting {'explain', 'row', 'from', 'show'}"
],
"warning": []
},
{
"query": "grok",
"error": [
"SyntaxError: mismatched input 'grok' expecting {'explain', 'from', 'row', 'show'}"
"SyntaxError: mismatched input 'grok' expecting {'explain', 'row', 'from', 'show'}"
],
"warning": []
},
{
"query": "row",
"error": [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
@ -339,7 +339,7 @@
{
"query": "row var = 1 in (",
"error": [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"Error: [in] function expects at least 2 arguments, got 1."
],
"warning": []
@ -2271,28 +2271,28 @@
{
"query": "from index | project ",
"error": [
"SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where', 'lookup'}"
"SyntaxError: mismatched input 'project' expecting {'enrich', 'dissect', 'eval', 'grok', 'limit', 'sort', 'stats', 'where', 'lookup', 'mv_expand', 'drop', 'keep', 'rename'}"
],
"warning": []
},
{
"query": "from index | project textField, doubleField, dateField",
"error": [
"SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where', 'lookup'}"
"SyntaxError: mismatched input 'project' expecting {'enrich', 'dissect', 'eval', 'grok', 'limit', 'sort', 'stats', 'where', 'lookup', 'mv_expand', 'drop', 'keep', 'rename'}"
],
"warning": []
},
{
"query": "from index | PROJECT textField, doubleField, dateField",
"error": [
"SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where', 'lookup'}"
"SyntaxError: mismatched input 'PROJECT' expecting {'enrich', 'dissect', 'eval', 'grok', 'limit', 'sort', 'stats', 'where', 'lookup', 'mv_expand', 'drop', 'keep', 'rename'}"
],
"warning": []
},
{
"query": "from index | project missingField, doubleField, dateField",
"error": [
"SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where', 'lookup'}"
"SyntaxError: mismatched input 'project' expecting {'enrich', 'dissect', 'eval', 'grok', 'limit', 'sort', 'stats', 'where', 'lookup', 'mv_expand', 'drop', 'keep', 'rename'}"
],
"warning": []
},
@ -2663,7 +2663,7 @@
{
"query": "from a_index | dissect",
"error": [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
@ -2718,7 +2718,7 @@
{
"query": "from a_index | dissect textField \"%{firstWord}\" option = ",
"error": [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '['}",
"Invalid option for DISSECT: [option]"
],
"warning": []
@ -2757,7 +2757,7 @@
{
"query": "from a_index | grok",
"error": [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
@ -3558,21 +3558,21 @@
{
"query": "from a_index | where *+ doubleField",
"error": [
"SyntaxError: extraneous input '*' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: extraneous input '*' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
{
"query": "from a_index | where /+ doubleField",
"error": [
"SyntaxError: extraneous input '/' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: extraneous input '/' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
{
"query": "from a_index | where %+ doubleField",
"error": [
"SyntaxError: extraneous input '%' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: extraneous input '%' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
@ -4499,7 +4499,7 @@
{
"query": "from a_index | eval ",
"error": [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
@ -4542,7 +4542,7 @@
{
"query": "from a_index | eval a=b, ",
"error": [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"Unknown column [b]"
],
"warning": []
@ -4569,7 +4569,7 @@
{
"query": "from a_index | eval a=round(doubleField), ",
"error": [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
@ -5710,21 +5710,21 @@
{
"query": "from a_index | eval *+ doubleField",
"error": [
"SyntaxError: extraneous input '*' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: extraneous input '*' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
{
"query": "from a_index | eval /+ doubleField",
"error": [
"SyntaxError: extraneous input '/' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: extraneous input '/' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
{
"query": "from a_index | eval %+ doubleField",
"error": [
"SyntaxError: extraneous input '%' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: extraneous input '%' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
@ -7050,7 +7050,7 @@
{
"query": "from a_index | eval not",
"error": [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"Error: [not] function expects exactly one argument, got 0."
],
"warning": []
@ -7058,7 +7058,7 @@
{
"query": "from a_index | eval in",
"error": [
"SyntaxError: mismatched input 'in' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: mismatched input 'in' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
@ -7073,8 +7073,7 @@
{
"query": "from a_index | eval textField in textField)",
"error": [
"SyntaxError: missing '(' at 'textField'",
"Error: [in] function expects at least 2 arguments, got 1."
"Invalid query [from a_index | eval textField in textField)]"
],
"warning": []
},
@ -9107,7 +9106,7 @@
{
"query": "from a_index | sort ",
"error": [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
@ -9126,7 +9125,7 @@
{
"query": "from a_index | sort doubleField, ",
"error": [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}"
],
"warning": []
},
@ -9795,7 +9794,7 @@
{
"query": "f",
"error": [
"SyntaxError: mismatched input 'f' expecting {'explain', 'from', 'row', 'show'}"
"SyntaxError: mismatched input 'f' expecting {'explain', 'row', 'from', 'show'}"
],
"warning": []
},

View file

@ -276,7 +276,7 @@ describe('validation logic', () => {
['eval', 'stats', 'rename', 'limit', 'keep', 'drop', 'mv_expand', 'dissect', 'grok'].map(
(command) =>
testErrorsAndWarnings(command, [
`SyntaxError: mismatched input '${command}' expecting {'explain', 'from', 'row', 'show'}`,
`SyntaxError: mismatched input '${command}' expecting {'explain', 'row', 'from', 'show'}`,
])
);
});
@ -306,7 +306,7 @@ describe('validation logic', () => {
describe('row', () => {
testErrorsAndWarnings('row', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
]);
testErrorsAndWarnings('row missing_column', ['Unknown column [missing_column]']);
testErrorsAndWarnings('row fn()', ['Unknown function [fn]']);
@ -335,7 +335,7 @@ describe('validation logic', () => {
"SyntaxError: mismatched input '<EOF>' expecting '('",
]);
testErrorsAndWarnings('row var = 1 in (', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
'Error: [in] function expects at least 2 arguments, got 1.',
]);
testErrorsAndWarnings('row var = 1 not in ', [
@ -537,16 +537,16 @@ describe('validation logic', () => {
]);
testErrorsAndWarnings('from index | keep `any#Char$Field`', []);
testErrorsAndWarnings('from index | project ', [
"SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where', 'lookup'}",
"SyntaxError: mismatched input 'project' expecting {'enrich', 'dissect', 'eval', 'grok', 'limit', 'sort', 'stats', 'where', 'lookup', 'mv_expand', 'drop', 'keep', 'rename'}",
]);
testErrorsAndWarnings('from index | project textField, doubleField, dateField', [
"SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where', 'lookup'}",
"SyntaxError: mismatched input 'project' expecting {'enrich', 'dissect', 'eval', 'grok', 'limit', 'sort', 'stats', 'where', 'lookup', 'mv_expand', 'drop', 'keep', 'rename'}",
]);
testErrorsAndWarnings('from index | PROJECT textField, doubleField, dateField', [
"SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where', 'lookup'}",
"SyntaxError: mismatched input 'PROJECT' expecting {'enrich', 'dissect', 'eval', 'grok', 'limit', 'sort', 'stats', 'where', 'lookup', 'mv_expand', 'drop', 'keep', 'rename'}",
]);
testErrorsAndWarnings('from index | project missingField, doubleField, dateField', [
"SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where', 'lookup'}",
"SyntaxError: mismatched input 'project' expecting {'enrich', 'dissect', 'eval', 'grok', 'limit', 'sort', 'stats', 'where', 'lookup', 'mv_expand', 'drop', 'keep', 'rename'}",
]);
testErrorsAndWarnings('from index | keep k*', []);
testErrorsAndWarnings('from index | keep *Field', []);
@ -692,7 +692,7 @@ describe('validation logic', () => {
describe('dissect', () => {
testErrorsAndWarnings('from a_index | dissect', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
]);
testErrorsAndWarnings('from a_index | dissect textField', [
"SyntaxError: missing QUOTED_STRING at '<EOF>'",
@ -716,7 +716,7 @@ describe('validation logic', () => {
"SyntaxError: mismatched input '<EOF>' expecting '='",
]);
testErrorsAndWarnings('from a_index | dissect textField "%{firstWord}" option = ', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '['}",
'Invalid option for DISSECT: [option]',
]);
testErrorsAndWarnings('from a_index | dissect textField "%{firstWord}" option = 1', [
@ -742,7 +742,7 @@ describe('validation logic', () => {
describe('grok', () => {
testErrorsAndWarnings('from a_index | grok', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
]);
testErrorsAndWarnings('from a_index | grok textField', [
"SyntaxError: missing QUOTED_STRING at '<EOF>'",
@ -826,7 +826,7 @@ describe('validation logic', () => {
}
for (const wrongOp of ['*', '/', '%']) {
testErrorsAndWarnings(`from a_index | where ${wrongOp}+ doubleField`, [
`SyntaxError: extraneous input '${wrongOp}' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`,
`SyntaxError: extraneous input '${wrongOp}' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`,
]);
}
@ -899,7 +899,7 @@ describe('validation logic', () => {
describe('eval', () => {
testErrorsAndWarnings('from a_index | eval ', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
]);
testErrorsAndWarnings('from a_index | eval textField ', []);
testErrorsAndWarnings('from a_index | eval b = textField', []);
@ -912,7 +912,7 @@ describe('validation logic', () => {
]);
testErrorsAndWarnings('from a_index | eval a=b', ['Unknown column [b]']);
testErrorsAndWarnings('from a_index | eval a=b, ', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
'Unknown column [b]',
]);
testErrorsAndWarnings('from a_index | eval a=round', ['Unknown column [round]']);
@ -921,7 +921,7 @@ describe('validation logic', () => {
]);
testErrorsAndWarnings('from a_index | eval a=round(doubleField) ', []);
testErrorsAndWarnings('from a_index | eval a=round(doubleField), ', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
]);
testErrorsAndWarnings('from a_index | eval a=round(doubleField) + round(doubleField) ', []);
testErrorsAndWarnings('from a_index | eval a=round(doubleField) + round(textField) ', [
@ -984,7 +984,7 @@ describe('validation logic', () => {
for (const wrongOp of ['*', '/', '%']) {
testErrorsAndWarnings(`from a_index | eval ${wrongOp}+ doubleField`, [
`SyntaxError: extraneous input '${wrongOp}' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`,
`SyntaxError: extraneous input '${wrongOp}' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`,
]);
}
testErrorsAndWarnings(
@ -1205,11 +1205,11 @@ describe('validation logic', () => {
[]
);
testErrorsAndWarnings('from a_index | eval not', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
'Error: [not] function expects exactly one argument, got 0.',
]);
testErrorsAndWarnings('from a_index | eval in', [
"SyntaxError: mismatched input 'in' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input 'in' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
]);
testErrorsAndWarnings('from a_index | eval textField in textField', [
@ -1218,8 +1218,7 @@ describe('validation logic', () => {
]);
testErrorsAndWarnings('from a_index | eval textField in textField)', [
"SyntaxError: missing '(' at 'textField'",
'Error: [in] function expects at least 2 arguments, got 1.',
'Invalid query [from a_index | eval textField in textField)]',
]);
testErrorsAndWarnings('from a_index | eval textField not in textField', [
"SyntaxError: missing '(' at 'textField'",
@ -1291,12 +1290,12 @@ describe('validation logic', () => {
describe('sort', () => {
testErrorsAndWarnings('from a_index | sort ', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
]);
testErrorsAndWarnings('from a_index | sort "field" ', []);
testErrorsAndWarnings('from a_index | sort wrongField ', ['Unknown column [wrongField]']);
testErrorsAndWarnings('from a_index | sort doubleField, ', [
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
"SyntaxError: mismatched input '<EOF>' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, '[', '(', UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}",
]);
testErrorsAndWarnings('from a_index | sort doubleField, textField', []);
for (const dir of ['desc', 'asc']) {

View file

@ -104,7 +104,7 @@ describe('ESQL Theme', () => {
'closing_metrics_ws',
'join_ws',
'change_point_ws',
'insist_ws',
'fork_ws',
];
// First, check that every valid exception is actually valid

View file

@ -52,6 +52,7 @@ export const buildESQLTheme = ({
...buildRuleGroup(
[
'dev_metrics',
'dev_fork',
'metadata',
'mv_expand',
'stats',
@ -158,8 +159,8 @@ export const buildESQLTheme = ({
'closing_metrics_multiline_comment',
'change_point_line_comment',
'change_point_multiline_comment',
'insist_line_comment',
'insist_multiline_comment',
'fork_line_comment',
'fork_multiline_comment',
],
euiTheme.colors.textSubdued
),