mirror of
https://github.com/elastic/kibana.git
synced 2025-04-23 09:19:04 -04:00
[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:
parent
dfb16cbe46
commit
681295ff9e
40 changed files with 7615 additions and 6798 deletions
|
@ -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."
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
27
src/platform/packages/shared/kbn-esql-ast/scripts/postbuild.sh
Executable file
27
src/platform/packages/shared/kbn-esql-ast/scripts/postbuild.sh
Executable 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
|
|
@ -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
|
@ -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
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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
|
@ -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
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -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);
|
|
@ -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)
|
||||
;
|
|
@ -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);
|
|
@ -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)
|
||||
;
|
|
@ -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);
|
||||
|
|
@ -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)
|
||||
;
|
|
@ -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)
|
||||
;
|
|
@ -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)
|
||||
;
|
|
@ -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
|
||||
;
|
|
@ -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)
|
||||
;
|
|
@ -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)
|
||||
;
|
|
@ -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)
|
||||
;
|
|
@ -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)
|
||||
;
|
||||
|
|
@ -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) ;
|
|
@ -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
|
||||
;
|
|
@ -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
|
||||
;
|
||||
|
||||
|
|
@ -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);
|
||||
});
|
||||
});
|
|
@ -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);
|
||||
|
|
|
@ -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',
|
||||
},
|
||||
],
|
||||
|
|
|
@ -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', () => {
|
||||
|
|
|
@ -11,7 +11,8 @@
|
|||
"src/**/*",
|
||||
"**/*.ts",
|
||||
],
|
||||
"kbn_references": [],
|
||||
"kbn_references": [
|
||||
],
|
||||
"exclude": [
|
||||
"target/**/*",
|
||||
]
|
||||
|
|
|
@ -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}",
|
||||
|
|
|
@ -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}",
|
||||
]);
|
||||
});
|
||||
|
||||
|
|
|
@ -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}",
|
||||
]);
|
||||
});
|
||||
|
||||
|
|
|
@ -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": []
|
||||
},
|
||||
|
|
|
@ -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']) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue