From a5b129c10c2f3ae7c6169984c3e4ab5914168f13 Mon Sep 17 00:00:00 2001 From: Costin Leau Date: Wed, 14 Feb 2018 12:30:32 +0200 Subject: [PATCH] SQL: Introduce the catalog concept inside the grammar (elastic/x-pack-elasticsearch#3911) Indices can now specify the catalog (the cluster) in which they belong. This is a first step in supporting both CCS and BI tools which tend to be explicit Original commit: elastic/x-pack-elasticsearch@0b4633faccd14ff4f5f24979003619828ef797f5 --- plugin/sql/src/main/antlr/SqlBase.g4 | 4 +- plugin/sql/src/main/antlr/SqlBase.tokens | 330 +++++------ plugin/sql/src/main/antlr/SqlBaseLexer.tokens | 328 ++++++----- .../sql/analysis/analyzer/PreAnalyzer.java | 9 +- .../xpack/sql/parser/IdentifierBuilder.java | 8 +- .../xpack/sql/parser/SqlBaseLexer.java | 557 +++++++++--------- .../xpack/sql/parser/SqlBaseParser.java | 526 +++++++++-------- .../xpack/sql/plan/TableIdentifier.java | 21 +- .../xpack/sql/session/SqlSession.java | 13 +- .../analysis/analyzer/PreAnalyzerTests.java | 42 +- .../plan/logical/UnresolvedRelationTests.java | 4 +- .../xpack/qa/sql/nosecurity/CliExplainIT.java | 6 +- 12 files changed, 965 insertions(+), 883 deletions(-) diff --git a/plugin/sql/src/main/antlr/SqlBase.g4 b/plugin/sql/src/main/antlr/SqlBase.g4 index ce81dc5830b..bce094c530e 100644 --- a/plugin/sql/src/main/antlr/SqlBase.g4 +++ b/plugin/sql/src/main/antlr/SqlBase.g4 @@ -233,8 +233,8 @@ identifier ; tableIdentifier - : TABLE_IDENTIFIER - | identifier + : (catalog=identifier ':')? TABLE_IDENTIFIER + | (catalog=identifier ':')? name=identifier ; quoteIdentifier diff --git a/plugin/sql/src/main/antlr/SqlBase.tokens b/plugin/sql/src/main/antlr/SqlBase.tokens index cf6756a699d..6ebe6e43c28 100644 --- a/plugin/sql/src/main/antlr/SqlBase.tokens +++ b/plugin/sql/src/main/antlr/SqlBase.tokens @@ -1,170 +1,172 @@ T__0=1 T__1=2 T__2=3 -ALL=4 -ANALYZE=5 -ANALYZED=6 -AND=7 -ANY=8 -AS=9 -ASC=10 -BETWEEN=11 -BY=12 -CAST=13 -COLUMNS=14 -DEBUG=15 -DESC=16 -DESCRIBE=17 -DISTINCT=18 -ESCAPE=19 -EXECUTABLE=20 -EXISTS=21 -EXPLAIN=22 -EXTRACT=23 -FALSE=24 -FORMAT=25 -FROM=26 -FULL=27 -FUNCTIONS=28 -GRAPHVIZ=29 -GROUP=30 -HAVING=31 -IN=32 -INNER=33 -IS=34 -JOIN=35 -LEFT=36 -LIKE=37 -LIMIT=38 -MAPPED=39 -MATCH=40 -NATURAL=41 -NOT=42 -NULL=43 -ON=44 -OPTIMIZED=45 -OR=46 -ORDER=47 -OUTER=48 -PARSED=49 -PHYSICAL=50 -PLAN=51 -RIGHT=52 -RLIKE=53 -QUERY=54 -SCHEMAS=55 -SELECT=56 -SHOW=57 -SYS=58 -TABLES=59 -TEXT=60 -TRUE=61 -TYPES=62 -USING=63 -VERIFY=64 -WHERE=65 -WITH=66 -EQ=67 -NEQ=68 -LT=69 -LTE=70 -GT=71 -GTE=72 -PLUS=73 -MINUS=74 -ASTERISK=75 -SLASH=76 -PERCENT=77 -CONCAT=78 -DOT=79 -STRING=80 -INTEGER_VALUE=81 -DECIMAL_VALUE=82 -IDENTIFIER=83 -DIGIT_IDENTIFIER=84 -TABLE_IDENTIFIER=85 -QUOTED_IDENTIFIER=86 -BACKQUOTED_IDENTIFIER=87 -SIMPLE_COMMENT=88 -BRACKETED_COMMENT=89 -WS=90 -UNRECOGNIZED=91 -DELIMITER=92 +T__3=4 +ALL=5 +ANALYZE=6 +ANALYZED=7 +AND=8 +ANY=9 +AS=10 +ASC=11 +BETWEEN=12 +BY=13 +CAST=14 +COLUMNS=15 +DEBUG=16 +DESC=17 +DESCRIBE=18 +DISTINCT=19 +ESCAPE=20 +EXECUTABLE=21 +EXISTS=22 +EXPLAIN=23 +EXTRACT=24 +FALSE=25 +FORMAT=26 +FROM=27 +FULL=28 +FUNCTIONS=29 +GRAPHVIZ=30 +GROUP=31 +HAVING=32 +IN=33 +INNER=34 +IS=35 +JOIN=36 +LEFT=37 +LIKE=38 +LIMIT=39 +MAPPED=40 +MATCH=41 +NATURAL=42 +NOT=43 +NULL=44 +ON=45 +OPTIMIZED=46 +OR=47 +ORDER=48 +OUTER=49 +PARSED=50 +PHYSICAL=51 +PLAN=52 +RIGHT=53 +RLIKE=54 +QUERY=55 +SCHEMAS=56 +SELECT=57 +SHOW=58 +SYS=59 +TABLES=60 +TEXT=61 +TRUE=62 +TYPES=63 +USING=64 +VERIFY=65 +WHERE=66 +WITH=67 +EQ=68 +NEQ=69 +LT=70 +LTE=71 +GT=72 +GTE=73 +PLUS=74 +MINUS=75 +ASTERISK=76 +SLASH=77 +PERCENT=78 +CONCAT=79 +DOT=80 +STRING=81 +INTEGER_VALUE=82 +DECIMAL_VALUE=83 +IDENTIFIER=84 +DIGIT_IDENTIFIER=85 +TABLE_IDENTIFIER=86 +QUOTED_IDENTIFIER=87 +BACKQUOTED_IDENTIFIER=88 +SIMPLE_COMMENT=89 +BRACKETED_COMMENT=90 +WS=91 +UNRECOGNIZED=92 +DELIMITER=93 '('=1 ')'=2 ','=3 -'ALL'=4 -'ANALYZE'=5 -'ANALYZED'=6 -'AND'=7 -'ANY'=8 -'AS'=9 -'ASC'=10 -'BETWEEN'=11 -'BY'=12 -'CAST'=13 -'COLUMNS'=14 -'DEBUG'=15 -'DESC'=16 -'DESCRIBE'=17 -'DISTINCT'=18 -'ESCAPE'=19 -'EXECUTABLE'=20 -'EXISTS'=21 -'EXPLAIN'=22 -'EXTRACT'=23 -'FALSE'=24 -'FORMAT'=25 -'FROM'=26 -'FULL'=27 -'FUNCTIONS'=28 -'GRAPHVIZ'=29 -'GROUP'=30 -'HAVING'=31 -'IN'=32 -'INNER'=33 -'IS'=34 -'JOIN'=35 -'LEFT'=36 -'LIKE'=37 -'LIMIT'=38 -'MAPPED'=39 -'MATCH'=40 -'NATURAL'=41 -'NOT'=42 -'NULL'=43 -'ON'=44 -'OPTIMIZED'=45 -'OR'=46 -'ORDER'=47 -'OUTER'=48 -'PARSED'=49 -'PHYSICAL'=50 -'PLAN'=51 -'RIGHT'=52 -'RLIKE'=53 -'QUERY'=54 -'SCHEMAS'=55 -'SELECT'=56 -'SHOW'=57 -'SYS'=58 -'TABLES'=59 -'TEXT'=60 -'TRUE'=61 -'TYPES'=62 -'USING'=63 -'VERIFY'=64 -'WHERE'=65 -'WITH'=66 -'='=67 -'<'=69 -'<='=70 -'>'=71 -'>='=72 -'+'=73 -'-'=74 -'*'=75 -'/'=76 -'%'=77 -'||'=78 -'.'=79 +':'=4 +'ALL'=5 +'ANALYZE'=6 +'ANALYZED'=7 +'AND'=8 +'ANY'=9 +'AS'=10 +'ASC'=11 +'BETWEEN'=12 +'BY'=13 +'CAST'=14 +'COLUMNS'=15 +'DEBUG'=16 +'DESC'=17 +'DESCRIBE'=18 +'DISTINCT'=19 +'ESCAPE'=20 +'EXECUTABLE'=21 +'EXISTS'=22 +'EXPLAIN'=23 +'EXTRACT'=24 +'FALSE'=25 +'FORMAT'=26 +'FROM'=27 +'FULL'=28 +'FUNCTIONS'=29 +'GRAPHVIZ'=30 +'GROUP'=31 +'HAVING'=32 +'IN'=33 +'INNER'=34 +'IS'=35 +'JOIN'=36 +'LEFT'=37 +'LIKE'=38 +'LIMIT'=39 +'MAPPED'=40 +'MATCH'=41 +'NATURAL'=42 +'NOT'=43 +'NULL'=44 +'ON'=45 +'OPTIMIZED'=46 +'OR'=47 +'ORDER'=48 +'OUTER'=49 +'PARSED'=50 +'PHYSICAL'=51 +'PLAN'=52 +'RIGHT'=53 +'RLIKE'=54 +'QUERY'=55 +'SCHEMAS'=56 +'SELECT'=57 +'SHOW'=58 +'SYS'=59 +'TABLES'=60 +'TEXT'=61 +'TRUE'=62 +'TYPES'=63 +'USING'=64 +'VERIFY'=65 +'WHERE'=66 +'WITH'=67 +'='=68 +'<'=70 +'<='=71 +'>'=72 +'>='=73 +'+'=74 +'-'=75 +'*'=76 +'/'=77 +'%'=78 +'||'=79 +'.'=80 diff --git a/plugin/sql/src/main/antlr/SqlBaseLexer.tokens b/plugin/sql/src/main/antlr/SqlBaseLexer.tokens index 1294d010e91..c05b8b7f045 100644 --- a/plugin/sql/src/main/antlr/SqlBaseLexer.tokens +++ b/plugin/sql/src/main/antlr/SqlBaseLexer.tokens @@ -1,169 +1,171 @@ T__0=1 T__1=2 T__2=3 -ALL=4 -ANALYZE=5 -ANALYZED=6 -AND=7 -ANY=8 -AS=9 -ASC=10 -BETWEEN=11 -BY=12 -CAST=13 -COLUMNS=14 -DEBUG=15 -DESC=16 -DESCRIBE=17 -DISTINCT=18 -ESCAPE=19 -EXECUTABLE=20 -EXISTS=21 -EXPLAIN=22 -EXTRACT=23 -FALSE=24 -FORMAT=25 -FROM=26 -FULL=27 -FUNCTIONS=28 -GRAPHVIZ=29 -GROUP=30 -HAVING=31 -IN=32 -INNER=33 -IS=34 -JOIN=35 -LEFT=36 -LIKE=37 -LIMIT=38 -MAPPED=39 -MATCH=40 -NATURAL=41 -NOT=42 -NULL=43 -ON=44 -OPTIMIZED=45 -OR=46 -ORDER=47 -OUTER=48 -PARSED=49 -PHYSICAL=50 -PLAN=51 -RIGHT=52 -RLIKE=53 -QUERY=54 -SCHEMAS=55 -SELECT=56 -SHOW=57 -SYS=58 -TABLES=59 -TEXT=60 -TRUE=61 -TYPES=62 -USING=63 -VERIFY=64 -WHERE=65 -WITH=66 -EQ=67 -NEQ=68 -LT=69 -LTE=70 -GT=71 -GTE=72 -PLUS=73 -MINUS=74 -ASTERISK=75 -SLASH=76 -PERCENT=77 -CONCAT=78 -DOT=79 -STRING=80 -INTEGER_VALUE=81 -DECIMAL_VALUE=82 -IDENTIFIER=83 -DIGIT_IDENTIFIER=84 -TABLE_IDENTIFIER=85 -QUOTED_IDENTIFIER=86 -BACKQUOTED_IDENTIFIER=87 -SIMPLE_COMMENT=88 -BRACKETED_COMMENT=89 -WS=90 -UNRECOGNIZED=91 +T__3=4 +ALL=5 +ANALYZE=6 +ANALYZED=7 +AND=8 +ANY=9 +AS=10 +ASC=11 +BETWEEN=12 +BY=13 +CAST=14 +COLUMNS=15 +DEBUG=16 +DESC=17 +DESCRIBE=18 +DISTINCT=19 +ESCAPE=20 +EXECUTABLE=21 +EXISTS=22 +EXPLAIN=23 +EXTRACT=24 +FALSE=25 +FORMAT=26 +FROM=27 +FULL=28 +FUNCTIONS=29 +GRAPHVIZ=30 +GROUP=31 +HAVING=32 +IN=33 +INNER=34 +IS=35 +JOIN=36 +LEFT=37 +LIKE=38 +LIMIT=39 +MAPPED=40 +MATCH=41 +NATURAL=42 +NOT=43 +NULL=44 +ON=45 +OPTIMIZED=46 +OR=47 +ORDER=48 +OUTER=49 +PARSED=50 +PHYSICAL=51 +PLAN=52 +RIGHT=53 +RLIKE=54 +QUERY=55 +SCHEMAS=56 +SELECT=57 +SHOW=58 +SYS=59 +TABLES=60 +TEXT=61 +TRUE=62 +TYPES=63 +USING=64 +VERIFY=65 +WHERE=66 +WITH=67 +EQ=68 +NEQ=69 +LT=70 +LTE=71 +GT=72 +GTE=73 +PLUS=74 +MINUS=75 +ASTERISK=76 +SLASH=77 +PERCENT=78 +CONCAT=79 +DOT=80 +STRING=81 +INTEGER_VALUE=82 +DECIMAL_VALUE=83 +IDENTIFIER=84 +DIGIT_IDENTIFIER=85 +TABLE_IDENTIFIER=86 +QUOTED_IDENTIFIER=87 +BACKQUOTED_IDENTIFIER=88 +SIMPLE_COMMENT=89 +BRACKETED_COMMENT=90 +WS=91 +UNRECOGNIZED=92 '('=1 ')'=2 ','=3 -'ALL'=4 -'ANALYZE'=5 -'ANALYZED'=6 -'AND'=7 -'ANY'=8 -'AS'=9 -'ASC'=10 -'BETWEEN'=11 -'BY'=12 -'CAST'=13 -'COLUMNS'=14 -'DEBUG'=15 -'DESC'=16 -'DESCRIBE'=17 -'DISTINCT'=18 -'ESCAPE'=19 -'EXECUTABLE'=20 -'EXISTS'=21 -'EXPLAIN'=22 -'EXTRACT'=23 -'FALSE'=24 -'FORMAT'=25 -'FROM'=26 -'FULL'=27 -'FUNCTIONS'=28 -'GRAPHVIZ'=29 -'GROUP'=30 -'HAVING'=31 -'IN'=32 -'INNER'=33 -'IS'=34 -'JOIN'=35 -'LEFT'=36 -'LIKE'=37 -'LIMIT'=38 -'MAPPED'=39 -'MATCH'=40 -'NATURAL'=41 -'NOT'=42 -'NULL'=43 -'ON'=44 -'OPTIMIZED'=45 -'OR'=46 -'ORDER'=47 -'OUTER'=48 -'PARSED'=49 -'PHYSICAL'=50 -'PLAN'=51 -'RIGHT'=52 -'RLIKE'=53 -'QUERY'=54 -'SCHEMAS'=55 -'SELECT'=56 -'SHOW'=57 -'SYS'=58 -'TABLES'=59 -'TEXT'=60 -'TRUE'=61 -'TYPES'=62 -'USING'=63 -'VERIFY'=64 -'WHERE'=65 -'WITH'=66 -'='=67 -'<'=69 -'<='=70 -'>'=71 -'>='=72 -'+'=73 -'-'=74 -'*'=75 -'/'=76 -'%'=77 -'||'=78 -'.'=79 +':'=4 +'ALL'=5 +'ANALYZE'=6 +'ANALYZED'=7 +'AND'=8 +'ANY'=9 +'AS'=10 +'ASC'=11 +'BETWEEN'=12 +'BY'=13 +'CAST'=14 +'COLUMNS'=15 +'DEBUG'=16 +'DESC'=17 +'DESCRIBE'=18 +'DISTINCT'=19 +'ESCAPE'=20 +'EXECUTABLE'=21 +'EXISTS'=22 +'EXPLAIN'=23 +'EXTRACT'=24 +'FALSE'=25 +'FORMAT'=26 +'FROM'=27 +'FULL'=28 +'FUNCTIONS'=29 +'GRAPHVIZ'=30 +'GROUP'=31 +'HAVING'=32 +'IN'=33 +'INNER'=34 +'IS'=35 +'JOIN'=36 +'LEFT'=37 +'LIKE'=38 +'LIMIT'=39 +'MAPPED'=40 +'MATCH'=41 +'NATURAL'=42 +'NOT'=43 +'NULL'=44 +'ON'=45 +'OPTIMIZED'=46 +'OR'=47 +'ORDER'=48 +'OUTER'=49 +'PARSED'=50 +'PHYSICAL'=51 +'PLAN'=52 +'RIGHT'=53 +'RLIKE'=54 +'QUERY'=55 +'SCHEMAS'=56 +'SELECT'=57 +'SHOW'=58 +'SYS'=59 +'TABLES'=60 +'TEXT'=61 +'TRUE'=62 +'TYPES'=63 +'USING'=64 +'VERIFY'=65 +'WHERE'=66 +'WITH'=67 +'='=68 +'<'=70 +'<='=71 +'>'=72 +'>='=73 +'+'=74 +'-'=75 +'*'=76 +'/'=77 +'%'=78 +'||'=79 +'.'=80 diff --git a/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/PreAnalyzer.java b/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/PreAnalyzer.java index 17a5305a4f9..68b73cf3a01 100644 --- a/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/PreAnalyzer.java +++ b/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/analysis/analyzer/PreAnalyzer.java @@ -5,6 +5,7 @@ */ package org.elasticsearch.xpack.sql.analysis.analyzer; +import org.elasticsearch.xpack.sql.plan.TableIdentifier; import org.elasticsearch.xpack.sql.plan.logical.LogicalPlan; import org.elasticsearch.xpack.sql.plan.logical.UnresolvedRelation; @@ -22,9 +23,9 @@ public class PreAnalyzer { public static class PreAnalysis { public static final PreAnalysis EMPTY = new PreAnalysis(emptyList()); - public final List indices; + public final List indices; - PreAnalysis(List indices) { + PreAnalysis(List indices) { this.indices = indices; } } @@ -38,9 +39,9 @@ public class PreAnalyzer { } private PreAnalysis doPreAnalyze(LogicalPlan plan) { - List indices = new ArrayList<>(); + List indices = new ArrayList<>(); - plan.forEachUp(p -> indices.add(p.table().index()), UnresolvedRelation.class); + plan.forEachUp(p -> indices.add(p.table()), UnresolvedRelation.class); // mark plan as preAnalyzed (if it were marked, there would be no analysis) plan.forEachUp(LogicalPlan::setPreAnalyzed); diff --git a/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/IdentifierBuilder.java b/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/IdentifierBuilder.java index c127fef8168..8c79ae1ef05 100644 --- a/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/IdentifierBuilder.java +++ b/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/IdentifierBuilder.java @@ -5,6 +5,7 @@ */ package org.elasticsearch.xpack.sql.parser; +import org.antlr.v4.runtime.tree.ParseTree; import org.elasticsearch.common.Strings; import org.elasticsearch.xpack.sql.parser.SqlBaseParser.IdentifierContext; import org.elasticsearch.xpack.sql.parser.SqlBaseParser.QualifiedNameContext; @@ -16,11 +17,12 @@ abstract class IdentifierBuilder extends AbstractBuilder { @Override public TableIdentifier visitTableIdentifier(TableIdentifierContext ctx) { - String index = ctx.getText(); Location source = source(ctx); + ParseTree tree = ctx.name != null ? ctx.name : ctx.TABLE_IDENTIFIER(); + String index = tree.getText(); - validateIndex(ctx.getText(), source); - return new TableIdentifier(source, index); + validateIndex(index, source); + return new TableIdentifier(source, visitIdentifier(ctx.catalog), index); } // see https://github.com/elastic/elasticsearch/issues/6736 diff --git a/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseLexer.java b/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseLexer.java index 9030ea712a5..1811f3588b6 100644 --- a/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseLexer.java +++ b/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseLexer.java @@ -22,27 +22,27 @@ class SqlBaseLexer extends Lexer { protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache(); public static final int - T__0=1, T__1=2, T__2=3, ALL=4, ANALYZE=5, ANALYZED=6, AND=7, ANY=8, AS=9, - ASC=10, BETWEEN=11, BY=12, CAST=13, COLUMNS=14, DEBUG=15, DESC=16, DESCRIBE=17, - DISTINCT=18, ESCAPE=19, EXECUTABLE=20, EXISTS=21, EXPLAIN=22, EXTRACT=23, - FALSE=24, FORMAT=25, FROM=26, FULL=27, FUNCTIONS=28, GRAPHVIZ=29, GROUP=30, - HAVING=31, IN=32, INNER=33, IS=34, JOIN=35, LEFT=36, LIKE=37, LIMIT=38, - MAPPED=39, MATCH=40, NATURAL=41, NOT=42, NULL=43, ON=44, OPTIMIZED=45, - OR=46, ORDER=47, OUTER=48, PARSED=49, PHYSICAL=50, PLAN=51, RIGHT=52, - RLIKE=53, QUERY=54, SCHEMAS=55, SELECT=56, SHOW=57, SYS=58, TABLES=59, - TEXT=60, TRUE=61, TYPES=62, USING=63, VERIFY=64, WHERE=65, WITH=66, EQ=67, - NEQ=68, LT=69, LTE=70, GT=71, GTE=72, PLUS=73, MINUS=74, ASTERISK=75, - SLASH=76, PERCENT=77, CONCAT=78, DOT=79, STRING=80, INTEGER_VALUE=81, - DECIMAL_VALUE=82, IDENTIFIER=83, DIGIT_IDENTIFIER=84, TABLE_IDENTIFIER=85, - QUOTED_IDENTIFIER=86, BACKQUOTED_IDENTIFIER=87, SIMPLE_COMMENT=88, BRACKETED_COMMENT=89, - WS=90, UNRECOGNIZED=91; + T__0=1, T__1=2, T__2=3, T__3=4, ALL=5, ANALYZE=6, ANALYZED=7, AND=8, ANY=9, + AS=10, ASC=11, BETWEEN=12, BY=13, CAST=14, COLUMNS=15, DEBUG=16, DESC=17, + DESCRIBE=18, DISTINCT=19, ESCAPE=20, EXECUTABLE=21, EXISTS=22, EXPLAIN=23, + EXTRACT=24, FALSE=25, FORMAT=26, FROM=27, FULL=28, FUNCTIONS=29, GRAPHVIZ=30, + GROUP=31, HAVING=32, IN=33, INNER=34, IS=35, JOIN=36, LEFT=37, LIKE=38, + LIMIT=39, MAPPED=40, MATCH=41, NATURAL=42, NOT=43, NULL=44, ON=45, OPTIMIZED=46, + OR=47, ORDER=48, OUTER=49, PARSED=50, PHYSICAL=51, PLAN=52, RIGHT=53, + RLIKE=54, QUERY=55, SCHEMAS=56, SELECT=57, SHOW=58, SYS=59, TABLES=60, + TEXT=61, TRUE=62, TYPES=63, USING=64, VERIFY=65, WHERE=66, WITH=67, EQ=68, + NEQ=69, LT=70, LTE=71, GT=72, GTE=73, PLUS=74, MINUS=75, ASTERISK=76, + SLASH=77, PERCENT=78, CONCAT=79, DOT=80, STRING=81, INTEGER_VALUE=82, + DECIMAL_VALUE=83, IDENTIFIER=84, DIGIT_IDENTIFIER=85, TABLE_IDENTIFIER=86, + QUOTED_IDENTIFIER=87, BACKQUOTED_IDENTIFIER=88, SIMPLE_COMMENT=89, BRACKETED_COMMENT=90, + WS=91, UNRECOGNIZED=92; public static String[] modeNames = { "DEFAULT_MODE" }; public static final String[] ruleNames = { - "T__0", "T__1", "T__2", "ALL", "ANALYZE", "ANALYZED", "AND", "ANY", "AS", - "ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE", + "T__0", "T__1", "T__2", "T__3", "ALL", "ANALYZE", "ANALYZED", "AND", "ANY", + "AS", "ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE", "DISTINCT", "ESCAPE", "EXECUTABLE", "EXISTS", "EXPLAIN", "EXTRACT", "FALSE", "FORMAT", "FROM", "FULL", "FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING", "IN", "INNER", "IS", "JOIN", "LEFT", "LIKE", "LIMIT", "MAPPED", "MATCH", @@ -57,8 +57,8 @@ class SqlBaseLexer extends Lexer { }; private static final String[] _LITERAL_NAMES = { - null, "'('", "')'", "','", "'ALL'", "'ANALYZE'", "'ANALYZED'", "'AND'", - "'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CAST'", "'COLUMNS'", + null, "'('", "')'", "','", "':'", "'ALL'", "'ANALYZE'", "'ANALYZED'", + "'AND'", "'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CAST'", "'COLUMNS'", "'DEBUG'", "'DESC'", "'DESCRIBE'", "'DISTINCT'", "'ESCAPE'", "'EXECUTABLE'", "'EXISTS'", "'EXPLAIN'", "'EXTRACT'", "'FALSE'", "'FORMAT'", "'FROM'", "'FULL'", "'FUNCTIONS'", "'GRAPHVIZ'", "'GROUP'", "'HAVING'", "'IN'", @@ -71,8 +71,8 @@ class SqlBaseLexer extends Lexer { "'||'", "'.'" }; private static final String[] _SYMBOLIC_NAMES = { - null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY", "AS", - "ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE", + null, null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY", + "AS", "ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE", "DISTINCT", "ESCAPE", "EXECUTABLE", "EXISTS", "EXPLAIN", "EXTRACT", "FALSE", "FORMAT", "FROM", "FULL", "FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING", "IN", "INNER", "IS", "JOIN", "LEFT", "LIKE", "LIMIT", "MAPPED", "MATCH", @@ -140,7 +140,7 @@ class SqlBaseLexer extends Lexer { public ATN getATN() { return _ATN; } public static final String _serializedATN = - "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2]\u030f\b\1\4\2\t"+ + "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2^\u0313\b\1\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -150,263 +150,264 @@ class SqlBaseLexer extends Lexer { "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+ "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+ "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+ - "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\3"+ - "\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6"+ - "\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3"+ - "\n\3\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r"+ - "\3\r\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+ - "\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22"+ - "\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23"+ - "\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25"+ - "\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27"+ - "\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+ - "\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33"+ - "\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35"+ - "\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36"+ - "\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3\"\3\"\3"+ - "\"\3\"\3\"\3\"\3#\3#\3#\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3"+ - "\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3"+ - "*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3,\3,\3,\3,\3,\3-\3-\3-\3.\3.\3.\3.\3.\3"+ - ".\3.\3.\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3"+ - "\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3"+ - "\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3"+ - "8\38\38\38\38\38\38\38\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3;\3;\3;\3"+ - ";\3<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3"+ - "?\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3C\3C\3C\3"+ - "C\3C\3D\3D\3E\3E\3E\3E\3E\3E\3E\5E\u0251\nE\3F\3F\3G\3G\3G\3H\3H\3I\3"+ - "I\3I\3J\3J\3K\3K\3L\3L\3M\3M\3N\3N\3O\3O\3O\3P\3P\3Q\3Q\3Q\3Q\7Q\u0270"+ - "\nQ\fQ\16Q\u0273\13Q\3Q\3Q\3R\6R\u0278\nR\rR\16R\u0279\3S\6S\u027d\nS"+ - "\rS\16S\u027e\3S\3S\7S\u0283\nS\fS\16S\u0286\13S\3S\3S\6S\u028a\nS\rS"+ - "\16S\u028b\3S\6S\u028f\nS\rS\16S\u0290\3S\3S\7S\u0295\nS\fS\16S\u0298"+ - "\13S\5S\u029a\nS\3S\3S\3S\3S\6S\u02a0\nS\rS\16S\u02a1\3S\3S\5S\u02a6\n"+ - "S\3T\3T\5T\u02aa\nT\3T\3T\3T\7T\u02af\nT\fT\16T\u02b2\13T\3U\3U\3U\3U"+ - "\6U\u02b8\nU\rU\16U\u02b9\3V\3V\3V\3V\6V\u02c0\nV\rV\16V\u02c1\3W\3W\3"+ - "W\3W\7W\u02c8\nW\fW\16W\u02cb\13W\3W\3W\3X\3X\3X\3X\7X\u02d3\nX\fX\16"+ - "X\u02d6\13X\3X\3X\3Y\3Y\5Y\u02dc\nY\3Y\6Y\u02df\nY\rY\16Y\u02e0\3Z\3Z"+ - "\3[\3[\3\\\3\\\3\\\3\\\7\\\u02eb\n\\\f\\\16\\\u02ee\13\\\3\\\5\\\u02f1"+ - "\n\\\3\\\5\\\u02f4\n\\\3\\\3\\\3]\3]\3]\3]\3]\7]\u02fd\n]\f]\16]\u0300"+ - "\13]\3]\3]\3]\3]\3]\3^\6^\u0308\n^\r^\16^\u0309\3^\3^\3_\3_\3\u02fe\2"+ - "`\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20"+ - "\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37"+ - "= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o"+ - "9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH"+ - "\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1"+ - "R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1\2\u00b3\2\u00b5"+ - "\2\u00b7Z\u00b9[\u00bb\\\u00bd]\3\2\f\3\2))\4\2BBaa\5\2<\3\2\2\2\u0177\u0178\7J\2\2\u0178\u0179\7C\2\2\u0179"+ - "\u017a\7X\2\2\u017a\u017b\7K\2\2\u017b\u017c\7P\2\2\u017c\u017d\7I\2\2"+ - "\u017d@\3\2\2\2\u017e\u017f\7K\2\2\u017f\u0180\7P\2\2\u0180B\3\2\2\2\u0181"+ - "\u0182\7K\2\2\u0182\u0183\7P\2\2\u0183\u0184\7P\2\2\u0184\u0185\7G\2\2"+ - "\u0185\u0186\7T\2\2\u0186D\3\2\2\2\u0187\u0188\7K\2\2\u0188\u0189\7U\2"+ - "\2\u0189F\3\2\2\2\u018a\u018b\7L\2\2\u018b\u018c\7Q\2\2\u018c\u018d\7"+ - "K\2\2\u018d\u018e\7P\2\2\u018eH\3\2\2\2\u018f\u0190\7N\2\2\u0190\u0191"+ - "\7G\2\2\u0191\u0192\7H\2\2\u0192\u0193\7V\2\2\u0193J\3\2\2\2\u0194\u0195"+ - "\7N\2\2\u0195\u0196\7K\2\2\u0196\u0197\7M\2\2\u0197\u0198\7G\2\2\u0198"+ - "L\3\2\2\2\u0199\u019a\7N\2\2\u019a\u019b\7K\2\2\u019b\u019c\7O\2\2\u019c"+ - "\u019d\7K\2\2\u019d\u019e\7V\2\2\u019eN\3\2\2\2\u019f\u01a0\7O\2\2\u01a0"+ - "\u01a1\7C\2\2\u01a1\u01a2\7R\2\2\u01a2\u01a3\7R\2\2\u01a3\u01a4\7G\2\2"+ - "\u01a4\u01a5\7F\2\2\u01a5P\3\2\2\2\u01a6\u01a7\7O\2\2\u01a7\u01a8\7C\2"+ - "\2\u01a8\u01a9\7V\2\2\u01a9\u01aa\7E\2\2\u01aa\u01ab\7J\2\2\u01abR\3\2"+ - "\2\2\u01ac\u01ad\7P\2\2\u01ad\u01ae\7C\2\2\u01ae\u01af\7V\2\2\u01af\u01b0"+ - "\7W\2\2\u01b0\u01b1\7T\2\2\u01b1\u01b2\7C\2\2\u01b2\u01b3\7N\2\2\u01b3"+ - "T\3\2\2\2\u01b4\u01b5\7P\2\2\u01b5\u01b6\7Q\2\2\u01b6\u01b7\7V\2\2\u01b7"+ - "V\3\2\2\2\u01b8\u01b9\7P\2\2\u01b9\u01ba\7W\2\2\u01ba\u01bb\7N\2\2\u01bb"+ - "\u01bc\7N\2\2\u01bcX\3\2\2\2\u01bd\u01be\7Q\2\2\u01be\u01bf\7P\2\2\u01bf"+ - "Z\3\2\2\2\u01c0\u01c1\7Q\2\2\u01c1\u01c2\7R\2\2\u01c2\u01c3\7V\2\2\u01c3"+ - "\u01c4\7K\2\2\u01c4\u01c5\7O\2\2\u01c5\u01c6\7K\2\2\u01c6\u01c7\7\\\2"+ - "\2\u01c7\u01c8\7G\2\2\u01c8\u01c9\7F\2\2\u01c9\\\3\2\2\2\u01ca\u01cb\7"+ - "Q\2\2\u01cb\u01cc\7T\2\2\u01cc^\3\2\2\2\u01cd\u01ce\7Q\2\2\u01ce\u01cf"+ - "\7T\2\2\u01cf\u01d0\7F\2\2\u01d0\u01d1\7G\2\2\u01d1\u01d2\7T\2\2\u01d2"+ - "`\3\2\2\2\u01d3\u01d4\7Q\2\2\u01d4\u01d5\7W\2\2\u01d5\u01d6\7V\2\2\u01d6"+ - "\u01d7\7G\2\2\u01d7\u01d8\7T\2\2\u01d8b\3\2\2\2\u01d9\u01da\7R\2\2\u01da"+ - "\u01db\7C\2\2\u01db\u01dc\7T\2\2\u01dc\u01dd\7U\2\2\u01dd\u01de\7G\2\2"+ - "\u01de\u01df\7F\2\2\u01dfd\3\2\2\2\u01e0\u01e1\7R\2\2\u01e1\u01e2\7J\2"+ - "\2\u01e2\u01e3\7[\2\2\u01e3\u01e4\7U\2\2\u01e4\u01e5\7K\2\2\u01e5\u01e6"+ - "\7E\2\2\u01e6\u01e7\7C\2\2\u01e7\u01e8\7N\2\2\u01e8f\3\2\2\2\u01e9\u01ea"+ - "\7R\2\2\u01ea\u01eb\7N\2\2\u01eb\u01ec\7C\2\2\u01ec\u01ed\7P\2\2\u01ed"+ - "h\3\2\2\2\u01ee\u01ef\7T\2\2\u01ef\u01f0\7K\2\2\u01f0\u01f1\7I\2\2\u01f1"+ - "\u01f2\7J\2\2\u01f2\u01f3\7V\2\2\u01f3j\3\2\2\2\u01f4\u01f5\7T\2\2\u01f5"+ - "\u01f6\7N\2\2\u01f6\u01f7\7K\2\2\u01f7\u01f8\7M\2\2\u01f8\u01f9\7G\2\2"+ - "\u01f9l\3\2\2\2\u01fa\u01fb\7S\2\2\u01fb\u01fc\7W\2\2\u01fc\u01fd\7G\2"+ - "\2\u01fd\u01fe\7T\2\2\u01fe\u01ff\7[\2\2\u01ffn\3\2\2\2\u0200\u0201\7"+ - "U\2\2\u0201\u0202\7E\2\2\u0202\u0203\7J\2\2\u0203\u0204\7G\2\2\u0204\u0205"+ - "\7O\2\2\u0205\u0206\7C\2\2\u0206\u0207\7U\2\2\u0207p\3\2\2\2\u0208\u0209"+ - "\7U\2\2\u0209\u020a\7G\2\2\u020a\u020b\7N\2\2\u020b\u020c\7G\2\2\u020c"+ - "\u020d\7E\2\2\u020d\u020e\7V\2\2\u020er\3\2\2\2\u020f\u0210\7U\2\2\u0210"+ - "\u0211\7J\2\2\u0211\u0212\7Q\2\2\u0212\u0213\7Y\2\2\u0213t\3\2\2\2\u0214"+ - "\u0215\7U\2\2\u0215\u0216\7[\2\2\u0216\u0217\7U\2\2\u0217v\3\2\2\2\u0218"+ - "\u0219\7V\2\2\u0219\u021a\7C\2\2\u021a\u021b\7D\2\2\u021b\u021c\7N\2\2"+ - "\u021c\u021d\7G\2\2\u021d\u021e\7U\2\2\u021ex\3\2\2\2\u021f\u0220\7V\2"+ - "\2\u0220\u0221\7G\2\2\u0221\u0222\7Z\2\2\u0222\u0223\7V\2\2\u0223z\3\2"+ - "\2\2\u0224\u0225\7V\2\2\u0225\u0226\7T\2\2\u0226\u0227\7W\2\2\u0227\u0228"+ - "\7G\2\2\u0228|\3\2\2\2\u0229\u022a\7V\2\2\u022a\u022b\7[\2\2\u022b\u022c"+ - "\7R\2\2\u022c\u022d\7G\2\2\u022d\u022e\7U\2\2\u022e~\3\2\2\2\u022f\u0230"+ - "\7W\2\2\u0230\u0231\7U\2\2\u0231\u0232\7K\2\2\u0232\u0233\7P\2\2\u0233"+ - "\u0234\7I\2\2\u0234\u0080\3\2\2\2\u0235\u0236\7X\2\2\u0236\u0237\7G\2"+ - "\2\u0237\u0238\7T\2\2\u0238\u0239\7K\2\2\u0239\u023a\7H\2\2\u023a\u023b"+ - "\7[\2\2\u023b\u0082\3\2\2\2\u023c\u023d\7Y\2\2\u023d\u023e\7J\2\2\u023e"+ - "\u023f\7G\2\2\u023f\u0240\7T\2\2\u0240\u0241\7G\2\2\u0241\u0084\3\2\2"+ - "\2\u0242\u0243\7Y\2\2\u0243\u0244\7K\2\2\u0244\u0245\7V\2\2\u0245\u0246"+ - "\7J\2\2\u0246\u0086\3\2\2\2\u0247\u0248\7?\2\2\u0248\u0088\3\2\2\2\u0249"+ - "\u024a\7>\2\2\u024a\u0251\7@\2\2\u024b\u024c\7#\2\2\u024c\u0251\7?\2\2"+ - "\u024d\u024e\7>\2\2\u024e\u024f\7?\2\2\u024f\u0251\7@\2\2\u0250\u0249"+ - "\3\2\2\2\u0250\u024b\3\2\2\2\u0250\u024d\3\2\2\2\u0251\u008a\3\2\2\2\u0252"+ - "\u0253\7>\2\2\u0253\u008c\3\2\2\2\u0254\u0255\7>\2\2\u0255\u0256\7?\2"+ - "\2\u0256\u008e\3\2\2\2\u0257\u0258\7@\2\2\u0258\u0090\3\2\2\2\u0259\u025a"+ - "\7@\2\2\u025a\u025b\7?\2\2\u025b\u0092\3\2\2\2\u025c\u025d\7-\2\2\u025d"+ - "\u0094\3\2\2\2\u025e\u025f\7/\2\2\u025f\u0096\3\2\2\2\u0260\u0261\7,\2"+ - "\2\u0261\u0098\3\2\2\2\u0262\u0263\7\61\2\2\u0263\u009a\3\2\2\2\u0264"+ - "\u0265\7\'\2\2\u0265\u009c\3\2\2\2\u0266\u0267\7~\2\2\u0267\u0268\7~\2"+ - "\2\u0268\u009e\3\2\2\2\u0269\u026a\7\60\2\2\u026a\u00a0\3\2\2\2\u026b"+ - "\u0271\7)\2\2\u026c\u0270\n\2\2\2\u026d\u026e\7)\2\2\u026e\u0270\7)\2"+ - "\2\u026f\u026c\3\2\2\2\u026f\u026d\3\2\2\2\u0270\u0273\3\2\2\2\u0271\u026f"+ - "\3\2\2\2\u0271\u0272\3\2\2\2\u0272\u0274\3\2\2\2\u0273\u0271\3\2\2\2\u0274"+ - "\u0275\7)\2\2\u0275\u00a2\3\2\2\2\u0276\u0278\5\u00b3Z\2\u0277\u0276\3"+ - "\2\2\2\u0278\u0279\3\2\2\2\u0279\u0277\3\2\2\2\u0279\u027a\3\2\2\2\u027a"+ - "\u00a4\3\2\2\2\u027b\u027d\5\u00b3Z\2\u027c\u027b\3\2\2\2\u027d\u027e"+ - "\3\2\2\2\u027e\u027c\3\2\2\2\u027e\u027f\3\2\2\2\u027f\u0280\3\2\2\2\u0280"+ - "\u0284\5\u009fP\2\u0281\u0283\5\u00b3Z\2\u0282\u0281\3\2\2\2\u0283\u0286"+ - "\3\2\2\2\u0284\u0282\3\2\2\2\u0284\u0285\3\2\2\2\u0285\u02a6\3\2\2\2\u0286"+ - "\u0284\3\2\2\2\u0287\u0289\5\u009fP\2\u0288\u028a\5\u00b3Z\2\u0289\u0288"+ - "\3\2\2\2\u028a\u028b\3\2\2\2\u028b\u0289\3\2\2\2\u028b\u028c\3\2\2\2\u028c"+ - "\u02a6\3\2\2\2\u028d\u028f\5\u00b3Z\2\u028e\u028d\3\2\2\2\u028f\u0290"+ - "\3\2\2\2\u0290\u028e\3\2\2\2\u0290\u0291\3\2\2\2\u0291\u0299\3\2\2\2\u0292"+ - "\u0296\5\u009fP\2\u0293\u0295\5\u00b3Z\2\u0294\u0293\3\2\2\2\u0295\u0298"+ - "\3\2\2\2\u0296\u0294\3\2\2\2\u0296\u0297\3\2\2\2\u0297\u029a\3\2\2\2\u0298"+ - "\u0296\3\2\2\2\u0299\u0292\3\2\2\2\u0299\u029a\3\2\2\2\u029a\u029b\3\2"+ - "\2\2\u029b\u029c\5\u00b1Y\2\u029c\u02a6\3\2\2\2\u029d\u029f\5\u009fP\2"+ - "\u029e\u02a0\5\u00b3Z\2\u029f\u029e\3\2\2\2\u02a0\u02a1\3\2\2\2\u02a1"+ - "\u029f\3\2\2\2\u02a1\u02a2\3\2\2\2\u02a2\u02a3\3\2\2\2\u02a3\u02a4\5\u00b1"+ - "Y\2\u02a4\u02a6\3\2\2\2\u02a5\u027c\3\2\2\2\u02a5\u0287\3\2\2\2\u02a5"+ - "\u028e\3\2\2\2\u02a5\u029d\3\2\2\2\u02a6\u00a6\3\2\2\2\u02a7\u02aa\5\u00b5"+ - "[\2\u02a8\u02aa\7a\2\2\u02a9\u02a7\3\2\2\2\u02a9\u02a8\3\2\2\2\u02aa\u02b0"+ - "\3\2\2\2\u02ab\u02af\5\u00b5[\2\u02ac\u02af\5\u00b3Z\2\u02ad\u02af\t\3"+ - "\2\2\u02ae\u02ab\3\2\2\2\u02ae\u02ac\3\2\2\2\u02ae\u02ad\3\2\2\2\u02af"+ - "\u02b2\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b0\u02b1\3\2\2\2\u02b1\u00a8\3\2"+ - "\2\2\u02b2\u02b0\3\2\2\2\u02b3\u02b7\5\u00b3Z\2\u02b4\u02b8\5\u00b5[\2"+ - "\u02b5\u02b8\5\u00b3Z\2\u02b6\u02b8\t\4\2\2\u02b7\u02b4\3\2\2\2\u02b7"+ - "\u02b5\3\2\2\2\u02b7\u02b6\3\2\2\2\u02b8\u02b9\3\2\2\2\u02b9\u02b7\3\2"+ - "\2\2\u02b9\u02ba\3\2\2\2\u02ba\u00aa\3\2\2\2\u02bb\u02c0\5\u00b5[\2\u02bc"+ - "\u02c0\5\u00b3Z\2\u02bd\u02c0\t\3\2\2\u02be\u02c0\5\u0097L\2\u02bf\u02bb"+ - "\3\2\2\2\u02bf\u02bc\3\2\2\2\u02bf\u02bd\3\2\2\2\u02bf\u02be\3\2\2\2\u02c0"+ - "\u02c1\3\2\2\2\u02c1\u02bf\3\2\2\2\u02c1\u02c2\3\2\2\2\u02c2\u00ac\3\2"+ - "\2\2\u02c3\u02c9\7$\2\2\u02c4\u02c8\n\5\2\2\u02c5\u02c6\7$\2\2\u02c6\u02c8"+ - "\7$\2\2\u02c7\u02c4\3\2\2\2\u02c7\u02c5\3\2\2\2\u02c8\u02cb\3\2\2\2\u02c9"+ - "\u02c7\3\2\2\2\u02c9\u02ca\3\2\2\2\u02ca\u02cc\3\2\2\2\u02cb\u02c9\3\2"+ - "\2\2\u02cc\u02cd\7$\2\2\u02cd\u00ae\3\2\2\2\u02ce\u02d4\7b\2\2\u02cf\u02d3"+ - "\n\6\2\2\u02d0\u02d1\7b\2\2\u02d1\u02d3\7b\2\2\u02d2\u02cf\3\2\2\2\u02d2"+ - "\u02d0\3\2\2\2\u02d3\u02d6\3\2\2\2\u02d4\u02d2\3\2\2\2\u02d4\u02d5\3\2"+ - "\2\2\u02d5\u02d7\3\2\2\2\u02d6\u02d4\3\2\2\2\u02d7\u02d8\7b\2\2\u02d8"+ - "\u00b0\3\2\2\2\u02d9\u02db\7G\2\2\u02da\u02dc\t\7\2\2\u02db\u02da\3\2"+ - "\2\2\u02db\u02dc\3\2\2\2\u02dc\u02de\3\2\2\2\u02dd\u02df\5\u00b3Z\2\u02de"+ - "\u02dd\3\2\2\2\u02df\u02e0\3\2\2\2\u02e0\u02de\3\2\2\2\u02e0\u02e1\3\2"+ - "\2\2\u02e1\u00b2\3\2\2\2\u02e2\u02e3\t\b\2\2\u02e3\u00b4\3\2\2\2\u02e4"+ - "\u02e5\t\t\2\2\u02e5\u00b6\3\2\2\2\u02e6\u02e7\7/\2\2\u02e7\u02e8\7/\2"+ - "\2\u02e8\u02ec\3\2\2\2\u02e9\u02eb\n\n\2\2\u02ea\u02e9\3\2\2\2\u02eb\u02ee"+ - "\3\2\2\2\u02ec\u02ea\3\2\2\2\u02ec\u02ed\3\2\2\2\u02ed\u02f0\3\2\2\2\u02ee"+ - "\u02ec\3\2\2\2\u02ef\u02f1\7\17\2\2\u02f0\u02ef\3\2\2\2\u02f0\u02f1\3"+ - "\2\2\2\u02f1\u02f3\3\2\2\2\u02f2\u02f4\7\f\2\2\u02f3\u02f2\3\2\2\2\u02f3"+ - "\u02f4\3\2\2\2\u02f4\u02f5\3\2\2\2\u02f5\u02f6\b\\\2\2\u02f6\u00b8\3\2"+ - "\2\2\u02f7\u02f8\7\61\2\2\u02f8\u02f9\7,\2\2\u02f9\u02fe\3\2\2\2\u02fa"+ - "\u02fd\5\u00b9]\2\u02fb\u02fd\13\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fb"+ - "\3\2\2\2\u02fd\u0300\3\2\2\2\u02fe\u02ff\3\2\2\2\u02fe\u02fc\3\2\2\2\u02ff"+ - "\u0301\3\2\2\2\u0300\u02fe\3\2\2\2\u0301\u0302\7,\2\2\u0302\u0303\7\61"+ - "\2\2\u0303\u0304\3\2\2\2\u0304\u0305\b]\2\2\u0305\u00ba\3\2\2\2\u0306"+ - "\u0308\t\13\2\2\u0307\u0306\3\2\2\2\u0308\u0309\3\2\2\2\u0309\u0307\3"+ - "\2\2\2\u0309\u030a\3\2\2\2\u030a\u030b\3\2\2\2\u030b\u030c\b^\2\2\u030c"+ - "\u00bc\3\2\2\2\u030d\u030e\13\2\2\2\u030e\u00be\3\2\2\2\"\2\u0250\u026f"+ - "\u0271\u0279\u027e\u0284\u028b\u0290\u0296\u0299\u02a1\u02a5\u02a9\u02ae"+ - "\u02b0\u02b7\u02b9\u02bf\u02c1\u02c7\u02c9\u02d2\u02d4\u02db\u02e0\u02ec"+ - "\u02f0\u02f3\u02fc\u02fe\u0309\3\2\3\2"; + "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+ + "`\t`\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3"+ + "\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\n"+ + "\3\n\3\n\3\n\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3"+ + "\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20"+ + "\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22"+ + "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24"+ + "\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26"+ + "\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27"+ + "\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31"+ + "\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33"+ + "\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\36\3\36"+ + "\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37"+ + "\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3#"+ + "\3#\3#\3#\3#\3#\3$\3$\3$\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'"+ + "\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3+\3+\3"+ + "+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3-\3-\3-\3-\3-\3.\3.\3.\3/\3/\3/\3/\3/\3"+ + "/\3/\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3"+ + "\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3"+ + "\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3"+ + "\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\39\39\3"+ + "9\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3<\3<\3<\3<\3=\3"+ + "=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3"+ + "A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3"+ + "E\3E\3F\3F\3F\3F\3F\3F\3F\5F\u0255\nF\3G\3G\3H\3H\3H\3I\3I\3J\3J\3J\3"+ + "K\3K\3L\3L\3M\3M\3N\3N\3O\3O\3P\3P\3P\3Q\3Q\3R\3R\3R\3R\7R\u0274\nR\f"+ + "R\16R\u0277\13R\3R\3R\3S\6S\u027c\nS\rS\16S\u027d\3T\6T\u0281\nT\rT\16"+ + "T\u0282\3T\3T\7T\u0287\nT\fT\16T\u028a\13T\3T\3T\6T\u028e\nT\rT\16T\u028f"+ + "\3T\6T\u0293\nT\rT\16T\u0294\3T\3T\7T\u0299\nT\fT\16T\u029c\13T\5T\u029e"+ + "\nT\3T\3T\3T\3T\6T\u02a4\nT\rT\16T\u02a5\3T\3T\5T\u02aa\nT\3U\3U\5U\u02ae"+ + "\nU\3U\3U\3U\7U\u02b3\nU\fU\16U\u02b6\13U\3V\3V\3V\3V\6V\u02bc\nV\rV\16"+ + "V\u02bd\3W\3W\3W\3W\6W\u02c4\nW\rW\16W\u02c5\3X\3X\3X\3X\7X\u02cc\nX\f"+ + "X\16X\u02cf\13X\3X\3X\3Y\3Y\3Y\3Y\7Y\u02d7\nY\fY\16Y\u02da\13Y\3Y\3Y\3"+ + "Z\3Z\5Z\u02e0\nZ\3Z\6Z\u02e3\nZ\rZ\16Z\u02e4\3[\3[\3\\\3\\\3]\3]\3]\3"+ + "]\7]\u02ef\n]\f]\16]\u02f2\13]\3]\5]\u02f5\n]\3]\5]\u02f8\n]\3]\3]\3^"+ + "\3^\3^\3^\3^\7^\u0301\n^\f^\16^\u0304\13^\3^\3^\3^\3^\3^\3_\6_\u030c\n"+ + "_\r_\16_\u030d\3_\3_\3`\3`\3\u0302\2a\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21"+ + "\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30"+ + "/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.["+ + "/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083"+ + "C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097"+ + "M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00ab"+ + "W\u00adX\u00afY\u00b1Z\u00b3\2\u00b5\2\u00b7\2\u00b9[\u00bb\\\u00bd]\u00bf"+ + "^\3\2\f\3\2))\4\2BBaa\5\2<\3\2\2\2\u0175\u0176\7I\2\2\u0176\u0177\7T"+ + "\2\2\u0177\u0178\7Q\2\2\u0178\u0179\7W\2\2\u0179\u017a\7R\2\2\u017a@\3"+ + "\2\2\2\u017b\u017c\7J\2\2\u017c\u017d\7C\2\2\u017d\u017e\7X\2\2\u017e"+ + "\u017f\7K\2\2\u017f\u0180\7P\2\2\u0180\u0181\7I\2\2\u0181B\3\2\2\2\u0182"+ + "\u0183\7K\2\2\u0183\u0184\7P\2\2\u0184D\3\2\2\2\u0185\u0186\7K\2\2\u0186"+ + "\u0187\7P\2\2\u0187\u0188\7P\2\2\u0188\u0189\7G\2\2\u0189\u018a\7T\2\2"+ + "\u018aF\3\2\2\2\u018b\u018c\7K\2\2\u018c\u018d\7U\2\2\u018dH\3\2\2\2\u018e"+ + "\u018f\7L\2\2\u018f\u0190\7Q\2\2\u0190\u0191\7K\2\2\u0191\u0192\7P\2\2"+ + "\u0192J\3\2\2\2\u0193\u0194\7N\2\2\u0194\u0195\7G\2\2\u0195\u0196\7H\2"+ + "\2\u0196\u0197\7V\2\2\u0197L\3\2\2\2\u0198\u0199\7N\2\2\u0199\u019a\7"+ + "K\2\2\u019a\u019b\7M\2\2\u019b\u019c\7G\2\2\u019cN\3\2\2\2\u019d\u019e"+ + "\7N\2\2\u019e\u019f\7K\2\2\u019f\u01a0\7O\2\2\u01a0\u01a1\7K\2\2\u01a1"+ + "\u01a2\7V\2\2\u01a2P\3\2\2\2\u01a3\u01a4\7O\2\2\u01a4\u01a5\7C\2\2\u01a5"+ + "\u01a6\7R\2\2\u01a6\u01a7\7R\2\2\u01a7\u01a8\7G\2\2\u01a8\u01a9\7F\2\2"+ + "\u01a9R\3\2\2\2\u01aa\u01ab\7O\2\2\u01ab\u01ac\7C\2\2\u01ac\u01ad\7V\2"+ + "\2\u01ad\u01ae\7E\2\2\u01ae\u01af\7J\2\2\u01afT\3\2\2\2\u01b0\u01b1\7"+ + "P\2\2\u01b1\u01b2\7C\2\2\u01b2\u01b3\7V\2\2\u01b3\u01b4\7W\2\2\u01b4\u01b5"+ + "\7T\2\2\u01b5\u01b6\7C\2\2\u01b6\u01b7\7N\2\2\u01b7V\3\2\2\2\u01b8\u01b9"+ + "\7P\2\2\u01b9\u01ba\7Q\2\2\u01ba\u01bb\7V\2\2\u01bbX\3\2\2\2\u01bc\u01bd"+ + "\7P\2\2\u01bd\u01be\7W\2\2\u01be\u01bf\7N\2\2\u01bf\u01c0\7N\2\2\u01c0"+ + "Z\3\2\2\2\u01c1\u01c2\7Q\2\2\u01c2\u01c3\7P\2\2\u01c3\\\3\2\2\2\u01c4"+ + "\u01c5\7Q\2\2\u01c5\u01c6\7R\2\2\u01c6\u01c7\7V\2\2\u01c7\u01c8\7K\2\2"+ + "\u01c8\u01c9\7O\2\2\u01c9\u01ca\7K\2\2\u01ca\u01cb\7\\\2\2\u01cb\u01cc"+ + "\7G\2\2\u01cc\u01cd\7F\2\2\u01cd^\3\2\2\2\u01ce\u01cf\7Q\2\2\u01cf\u01d0"+ + "\7T\2\2\u01d0`\3\2\2\2\u01d1\u01d2\7Q\2\2\u01d2\u01d3\7T\2\2\u01d3\u01d4"+ + "\7F\2\2\u01d4\u01d5\7G\2\2\u01d5\u01d6\7T\2\2\u01d6b\3\2\2\2\u01d7\u01d8"+ + "\7Q\2\2\u01d8\u01d9\7W\2\2\u01d9\u01da\7V\2\2\u01da\u01db\7G\2\2\u01db"+ + "\u01dc\7T\2\2\u01dcd\3\2\2\2\u01dd\u01de\7R\2\2\u01de\u01df\7C\2\2\u01df"+ + "\u01e0\7T\2\2\u01e0\u01e1\7U\2\2\u01e1\u01e2\7G\2\2\u01e2\u01e3\7F\2\2"+ + "\u01e3f\3\2\2\2\u01e4\u01e5\7R\2\2\u01e5\u01e6\7J\2\2\u01e6\u01e7\7[\2"+ + "\2\u01e7\u01e8\7U\2\2\u01e8\u01e9\7K\2\2\u01e9\u01ea\7E\2\2\u01ea\u01eb"+ + "\7C\2\2\u01eb\u01ec\7N\2\2\u01ech\3\2\2\2\u01ed\u01ee\7R\2\2\u01ee\u01ef"+ + "\7N\2\2\u01ef\u01f0\7C\2\2\u01f0\u01f1\7P\2\2\u01f1j\3\2\2\2\u01f2\u01f3"+ + "\7T\2\2\u01f3\u01f4\7K\2\2\u01f4\u01f5\7I\2\2\u01f5\u01f6\7J\2\2\u01f6"+ + "\u01f7\7V\2\2\u01f7l\3\2\2\2\u01f8\u01f9\7T\2\2\u01f9\u01fa\7N\2\2\u01fa"+ + "\u01fb\7K\2\2\u01fb\u01fc\7M\2\2\u01fc\u01fd\7G\2\2\u01fdn\3\2\2\2\u01fe"+ + "\u01ff\7S\2\2\u01ff\u0200\7W\2\2\u0200\u0201\7G\2\2\u0201\u0202\7T\2\2"+ + "\u0202\u0203\7[\2\2\u0203p\3\2\2\2\u0204\u0205\7U\2\2\u0205\u0206\7E\2"+ + "\2\u0206\u0207\7J\2\2\u0207\u0208\7G\2\2\u0208\u0209\7O\2\2\u0209\u020a"+ + "\7C\2\2\u020a\u020b\7U\2\2\u020br\3\2\2\2\u020c\u020d\7U\2\2\u020d\u020e"+ + "\7G\2\2\u020e\u020f\7N\2\2\u020f\u0210\7G\2\2\u0210\u0211\7E\2\2\u0211"+ + "\u0212\7V\2\2\u0212t\3\2\2\2\u0213\u0214\7U\2\2\u0214\u0215\7J\2\2\u0215"+ + "\u0216\7Q\2\2\u0216\u0217\7Y\2\2\u0217v\3\2\2\2\u0218\u0219\7U\2\2\u0219"+ + "\u021a\7[\2\2\u021a\u021b\7U\2\2\u021bx\3\2\2\2\u021c\u021d\7V\2\2\u021d"+ + "\u021e\7C\2\2\u021e\u021f\7D\2\2\u021f\u0220\7N\2\2\u0220\u0221\7G\2\2"+ + "\u0221\u0222\7U\2\2\u0222z\3\2\2\2\u0223\u0224\7V\2\2\u0224\u0225\7G\2"+ + "\2\u0225\u0226\7Z\2\2\u0226\u0227\7V\2\2\u0227|\3\2\2\2\u0228\u0229\7"+ + "V\2\2\u0229\u022a\7T\2\2\u022a\u022b\7W\2\2\u022b\u022c\7G\2\2\u022c~"+ + "\3\2\2\2\u022d\u022e\7V\2\2\u022e\u022f\7[\2\2\u022f\u0230\7R\2\2\u0230"+ + "\u0231\7G\2\2\u0231\u0232\7U\2\2\u0232\u0080\3\2\2\2\u0233\u0234\7W\2"+ + "\2\u0234\u0235\7U\2\2\u0235\u0236\7K\2\2\u0236\u0237\7P\2\2\u0237\u0238"+ + "\7I\2\2\u0238\u0082\3\2\2\2\u0239\u023a\7X\2\2\u023a\u023b\7G\2\2\u023b"+ + "\u023c\7T\2\2\u023c\u023d\7K\2\2\u023d\u023e\7H\2\2\u023e\u023f\7[\2\2"+ + "\u023f\u0084\3\2\2\2\u0240\u0241\7Y\2\2\u0241\u0242\7J\2\2\u0242\u0243"+ + "\7G\2\2\u0243\u0244\7T\2\2\u0244\u0245\7G\2\2\u0245\u0086\3\2\2\2\u0246"+ + "\u0247\7Y\2\2\u0247\u0248\7K\2\2\u0248\u0249\7V\2\2\u0249\u024a\7J\2\2"+ + "\u024a\u0088\3\2\2\2\u024b\u024c\7?\2\2\u024c\u008a\3\2\2\2\u024d\u024e"+ + "\7>\2\2\u024e\u0255\7@\2\2\u024f\u0250\7#\2\2\u0250\u0255\7?\2\2\u0251"+ + "\u0252\7>\2\2\u0252\u0253\7?\2\2\u0253\u0255\7@\2\2\u0254\u024d\3\2\2"+ + "\2\u0254\u024f\3\2\2\2\u0254\u0251\3\2\2\2\u0255\u008c\3\2\2\2\u0256\u0257"+ + "\7>\2\2\u0257\u008e\3\2\2\2\u0258\u0259\7>\2\2\u0259\u025a\7?\2\2\u025a"+ + "\u0090\3\2\2\2\u025b\u025c\7@\2\2\u025c\u0092\3\2\2\2\u025d\u025e\7@\2"+ + "\2\u025e\u025f\7?\2\2\u025f\u0094\3\2\2\2\u0260\u0261\7-\2\2\u0261\u0096"+ + "\3\2\2\2\u0262\u0263\7/\2\2\u0263\u0098\3\2\2\2\u0264\u0265\7,\2\2\u0265"+ + "\u009a\3\2\2\2\u0266\u0267\7\61\2\2\u0267\u009c\3\2\2\2\u0268\u0269\7"+ + "\'\2\2\u0269\u009e\3\2\2\2\u026a\u026b\7~\2\2\u026b\u026c\7~\2\2\u026c"+ + "\u00a0\3\2\2\2\u026d\u026e\7\60\2\2\u026e\u00a2\3\2\2\2\u026f\u0275\7"+ + ")\2\2\u0270\u0274\n\2\2\2\u0271\u0272\7)\2\2\u0272\u0274\7)\2\2\u0273"+ + "\u0270\3\2\2\2\u0273\u0271\3\2\2\2\u0274\u0277\3\2\2\2\u0275\u0273\3\2"+ + "\2\2\u0275\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2\2\2\u0278"+ + "\u0279\7)\2\2\u0279\u00a4\3\2\2\2\u027a\u027c\5\u00b5[\2\u027b\u027a\3"+ + "\2\2\2\u027c\u027d\3\2\2\2\u027d\u027b\3\2\2\2\u027d\u027e\3\2\2\2\u027e"+ + "\u00a6\3\2\2\2\u027f\u0281\5\u00b5[\2\u0280\u027f\3\2\2\2\u0281\u0282"+ + "\3\2\2\2\u0282\u0280\3\2\2\2\u0282\u0283\3\2\2\2\u0283\u0284\3\2\2\2\u0284"+ + "\u0288\5\u00a1Q\2\u0285\u0287\5\u00b5[\2\u0286\u0285\3\2\2\2\u0287\u028a"+ + "\3\2\2\2\u0288\u0286\3\2\2\2\u0288\u0289\3\2\2\2\u0289\u02aa\3\2\2\2\u028a"+ + "\u0288\3\2\2\2\u028b\u028d\5\u00a1Q\2\u028c\u028e\5\u00b5[\2\u028d\u028c"+ + "\3\2\2\2\u028e\u028f\3\2\2\2\u028f\u028d\3\2\2\2\u028f\u0290\3\2\2\2\u0290"+ + "\u02aa\3\2\2\2\u0291\u0293\5\u00b5[\2\u0292\u0291\3\2\2\2\u0293\u0294"+ + "\3\2\2\2\u0294\u0292\3\2\2\2\u0294\u0295\3\2\2\2\u0295\u029d\3\2\2\2\u0296"+ + "\u029a\5\u00a1Q\2\u0297\u0299\5\u00b5[\2\u0298\u0297\3\2\2\2\u0299\u029c"+ + "\3\2\2\2\u029a\u0298\3\2\2\2\u029a\u029b\3\2\2\2\u029b\u029e\3\2\2\2\u029c"+ + "\u029a\3\2\2\2\u029d\u0296\3\2\2\2\u029d\u029e\3\2\2\2\u029e\u029f\3\2"+ + "\2\2\u029f\u02a0\5\u00b3Z\2\u02a0\u02aa\3\2\2\2\u02a1\u02a3\5\u00a1Q\2"+ + "\u02a2\u02a4\5\u00b5[\2\u02a3\u02a2\3\2\2\2\u02a4\u02a5\3\2\2\2\u02a5"+ + "\u02a3\3\2\2\2\u02a5\u02a6\3\2\2\2\u02a6\u02a7\3\2\2\2\u02a7\u02a8\5\u00b3"+ + "Z\2\u02a8\u02aa\3\2\2\2\u02a9\u0280\3\2\2\2\u02a9\u028b\3\2\2\2\u02a9"+ + "\u0292\3\2\2\2\u02a9\u02a1\3\2\2\2\u02aa\u00a8\3\2\2\2\u02ab\u02ae\5\u00b7"+ + "\\\2\u02ac\u02ae\7a\2\2\u02ad\u02ab\3\2\2\2\u02ad\u02ac\3\2\2\2\u02ae"+ + "\u02b4\3\2\2\2\u02af\u02b3\5\u00b7\\\2\u02b0\u02b3\5\u00b5[\2\u02b1\u02b3"+ + "\t\3\2\2\u02b2\u02af\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2\u02b1\3\2\2\2\u02b3"+ + "\u02b6\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b4\u02b5\3\2\2\2\u02b5\u00aa\3\2"+ + "\2\2\u02b6\u02b4\3\2\2\2\u02b7\u02bb\5\u00b5[\2\u02b8\u02bc\5\u00b7\\"+ + "\2\u02b9\u02bc\5\u00b5[\2\u02ba\u02bc\t\4\2\2\u02bb\u02b8\3\2\2\2\u02bb"+ + "\u02b9\3\2\2\2\u02bb\u02ba\3\2\2\2\u02bc\u02bd\3\2\2\2\u02bd\u02bb\3\2"+ + "\2\2\u02bd\u02be\3\2\2\2\u02be\u00ac\3\2\2\2\u02bf\u02c4\5\u00b7\\\2\u02c0"+ + "\u02c4\5\u00b5[\2\u02c1\u02c4\t\3\2\2\u02c2\u02c4\5\u0099M\2\u02c3\u02bf"+ + "\3\2\2\2\u02c3\u02c0\3\2\2\2\u02c3\u02c1\3\2\2\2\u02c3\u02c2\3\2\2\2\u02c4"+ + "\u02c5\3\2\2\2\u02c5\u02c3\3\2\2\2\u02c5\u02c6\3\2\2\2\u02c6\u00ae\3\2"+ + "\2\2\u02c7\u02cd\7$\2\2\u02c8\u02cc\n\5\2\2\u02c9\u02ca\7$\2\2\u02ca\u02cc"+ + "\7$\2\2\u02cb\u02c8\3\2\2\2\u02cb\u02c9\3\2\2\2\u02cc\u02cf\3\2\2\2\u02cd"+ + "\u02cb\3\2\2\2\u02cd\u02ce\3\2\2\2\u02ce\u02d0\3\2\2\2\u02cf\u02cd\3\2"+ + "\2\2\u02d0\u02d1\7$\2\2\u02d1\u00b0\3\2\2\2\u02d2\u02d8\7b\2\2\u02d3\u02d7"+ + "\n\6\2\2\u02d4\u02d5\7b\2\2\u02d5\u02d7\7b\2\2\u02d6\u02d3\3\2\2\2\u02d6"+ + "\u02d4\3\2\2\2\u02d7\u02da\3\2\2\2\u02d8\u02d6\3\2\2\2\u02d8\u02d9\3\2"+ + "\2\2\u02d9\u02db\3\2\2\2\u02da\u02d8\3\2\2\2\u02db\u02dc\7b\2\2\u02dc"+ + "\u00b2\3\2\2\2\u02dd\u02df\7G\2\2\u02de\u02e0\t\7\2\2\u02df\u02de\3\2"+ + "\2\2\u02df\u02e0\3\2\2\2\u02e0\u02e2\3\2\2\2\u02e1\u02e3\5\u00b5[\2\u02e2"+ + "\u02e1\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02e2\3\2\2\2\u02e4\u02e5\3\2"+ + "\2\2\u02e5\u00b4\3\2\2\2\u02e6\u02e7\t\b\2\2\u02e7\u00b6\3\2\2\2\u02e8"+ + "\u02e9\t\t\2\2\u02e9\u00b8\3\2\2\2\u02ea\u02eb\7/\2\2\u02eb\u02ec\7/\2"+ + "\2\u02ec\u02f0\3\2\2\2\u02ed\u02ef\n\n\2\2\u02ee\u02ed\3\2\2\2\u02ef\u02f2"+ + "\3\2\2\2\u02f0\u02ee\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u02f4\3\2\2\2\u02f2"+ + "\u02f0\3\2\2\2\u02f3\u02f5\7\17\2\2\u02f4\u02f3\3\2\2\2\u02f4\u02f5\3"+ + "\2\2\2\u02f5\u02f7\3\2\2\2\u02f6\u02f8\7\f\2\2\u02f7\u02f6\3\2\2\2\u02f7"+ + "\u02f8\3\2\2\2\u02f8\u02f9\3\2\2\2\u02f9\u02fa\b]\2\2\u02fa\u00ba\3\2"+ + "\2\2\u02fb\u02fc\7\61\2\2\u02fc\u02fd\7,\2\2\u02fd\u0302\3\2\2\2\u02fe"+ + "\u0301\5\u00bb^\2\u02ff\u0301\13\2\2\2\u0300\u02fe\3\2\2\2\u0300\u02ff"+ + "\3\2\2\2\u0301\u0304\3\2\2\2\u0302\u0303\3\2\2\2\u0302\u0300\3\2\2\2\u0303"+ + "\u0305\3\2\2\2\u0304\u0302\3\2\2\2\u0305\u0306\7,\2\2\u0306\u0307\7\61"+ + "\2\2\u0307\u0308\3\2\2\2\u0308\u0309\b^\2\2\u0309\u00bc\3\2\2\2\u030a"+ + "\u030c\t\13\2\2\u030b\u030a\3\2\2\2\u030c\u030d\3\2\2\2\u030d\u030b\3"+ + "\2\2\2\u030d\u030e\3\2\2\2\u030e\u030f\3\2\2\2\u030f\u0310\b_\2\2\u0310"+ + "\u00be\3\2\2\2\u0311\u0312\13\2\2\2\u0312\u00c0\3\2\2\2\"\2\u0254\u0273"+ + "\u0275\u027d\u0282\u0288\u028f\u0294\u029a\u029d\u02a5\u02a9\u02ad\u02b2"+ + "\u02b4\u02bb\u02bd\u02c3\u02c5\u02cb\u02cd\u02d6\u02d8\u02df\u02e4\u02f0"+ + "\u02f4\u02f7\u0300\u0302\u030d\3\2\3\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseParser.java b/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseParser.java index 34d10dad2b9..41879967f91 100644 --- a/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseParser.java +++ b/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseParser.java @@ -22,20 +22,20 @@ class SqlBaseParser extends Parser { protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache(); public static final int - T__0=1, T__1=2, T__2=3, ALL=4, ANALYZE=5, ANALYZED=6, AND=7, ANY=8, AS=9, - ASC=10, BETWEEN=11, BY=12, CAST=13, COLUMNS=14, DEBUG=15, DESC=16, DESCRIBE=17, - DISTINCT=18, ESCAPE=19, EXECUTABLE=20, EXISTS=21, EXPLAIN=22, EXTRACT=23, - FALSE=24, FORMAT=25, FROM=26, FULL=27, FUNCTIONS=28, GRAPHVIZ=29, GROUP=30, - HAVING=31, IN=32, INNER=33, IS=34, JOIN=35, LEFT=36, LIKE=37, LIMIT=38, - MAPPED=39, MATCH=40, NATURAL=41, NOT=42, NULL=43, ON=44, OPTIMIZED=45, - OR=46, ORDER=47, OUTER=48, PARSED=49, PHYSICAL=50, PLAN=51, RIGHT=52, - RLIKE=53, QUERY=54, SCHEMAS=55, SELECT=56, SHOW=57, SYS=58, TABLES=59, - TEXT=60, TRUE=61, TYPES=62, USING=63, VERIFY=64, WHERE=65, WITH=66, EQ=67, - NEQ=68, LT=69, LTE=70, GT=71, GTE=72, PLUS=73, MINUS=74, ASTERISK=75, - SLASH=76, PERCENT=77, CONCAT=78, DOT=79, STRING=80, INTEGER_VALUE=81, - DECIMAL_VALUE=82, IDENTIFIER=83, DIGIT_IDENTIFIER=84, TABLE_IDENTIFIER=85, - QUOTED_IDENTIFIER=86, BACKQUOTED_IDENTIFIER=87, SIMPLE_COMMENT=88, BRACKETED_COMMENT=89, - WS=90, UNRECOGNIZED=91, DELIMITER=92; + T__0=1, T__1=2, T__2=3, T__3=4, ALL=5, ANALYZE=6, ANALYZED=7, AND=8, ANY=9, + AS=10, ASC=11, BETWEEN=12, BY=13, CAST=14, COLUMNS=15, DEBUG=16, DESC=17, + DESCRIBE=18, DISTINCT=19, ESCAPE=20, EXECUTABLE=21, EXISTS=22, EXPLAIN=23, + EXTRACT=24, FALSE=25, FORMAT=26, FROM=27, FULL=28, FUNCTIONS=29, GRAPHVIZ=30, + GROUP=31, HAVING=32, IN=33, INNER=34, IS=35, JOIN=36, LEFT=37, LIKE=38, + LIMIT=39, MAPPED=40, MATCH=41, NATURAL=42, NOT=43, NULL=44, ON=45, OPTIMIZED=46, + OR=47, ORDER=48, OUTER=49, PARSED=50, PHYSICAL=51, PLAN=52, RIGHT=53, + RLIKE=54, QUERY=55, SCHEMAS=56, SELECT=57, SHOW=58, SYS=59, TABLES=60, + TEXT=61, TRUE=62, TYPES=63, USING=64, VERIFY=65, WHERE=66, WITH=67, EQ=68, + NEQ=69, LT=70, LTE=71, GT=72, GTE=73, PLUS=74, MINUS=75, ASTERISK=76, + SLASH=77, PERCENT=78, CONCAT=79, DOT=80, STRING=81, INTEGER_VALUE=82, + DECIMAL_VALUE=83, IDENTIFIER=84, DIGIT_IDENTIFIER=85, TABLE_IDENTIFIER=86, + QUOTED_IDENTIFIER=87, BACKQUOTED_IDENTIFIER=88, SIMPLE_COMMENT=89, BRACKETED_COMMENT=90, + WS=91, UNRECOGNIZED=92, DELIMITER=93; public static final int RULE_singleStatement = 0, RULE_singleExpression = 1, RULE_statement = 2, RULE_query = 3, RULE_queryNoWith = 4, RULE_queryTerm = 5, RULE_orderBy = 6, @@ -61,8 +61,8 @@ class SqlBaseParser extends Parser { }; private static final String[] _LITERAL_NAMES = { - null, "'('", "')'", "','", "'ALL'", "'ANALYZE'", "'ANALYZED'", "'AND'", - "'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CAST'", "'COLUMNS'", + null, "'('", "')'", "','", "':'", "'ALL'", "'ANALYZE'", "'ANALYZED'", + "'AND'", "'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CAST'", "'COLUMNS'", "'DEBUG'", "'DESC'", "'DESCRIBE'", "'DISTINCT'", "'ESCAPE'", "'EXECUTABLE'", "'EXISTS'", "'EXPLAIN'", "'EXTRACT'", "'FALSE'", "'FORMAT'", "'FROM'", "'FULL'", "'FUNCTIONS'", "'GRAPHVIZ'", "'GROUP'", "'HAVING'", "'IN'", @@ -75,8 +75,8 @@ class SqlBaseParser extends Parser { "'||'", "'.'" }; private static final String[] _SYMBOLIC_NAMES = { - null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY", "AS", - "ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE", + null, null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY", + "AS", "ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE", "DISTINCT", "ESCAPE", "EXECUTABLE", "EXISTS", "EXPLAIN", "EXTRACT", "FALSE", "FORMAT", "FROM", "FULL", "FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING", "IN", "INNER", "IS", "JOIN", "LEFT", "LIKE", "LIMIT", "MAPPED", "MATCH", @@ -572,7 +572,7 @@ class SqlBaseParser extends Parser { setState(93); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 25)) & ~0x3f) == 0 && ((1L << (_la - 25)) & ((1L << (FORMAT - 25)) | (1L << (PLAN - 25)) | (1L << (VERIFY - 25)))) != 0)) { + while (((((_la - 26)) & ~0x3f) == 0 && ((1L << (_la - 26)) & ((1L << (FORMAT - 26)) | (1L << (PLAN - 26)) | (1L << (VERIFY - 26)))) != 0)) { { setState(91); switch (_input.LA(1)) { @@ -1607,7 +1607,7 @@ class SqlBaseParser extends Parser { match(T__0); setState(266); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TRUE) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (PLUS - 64)) | (1L << (MINUS - 64)) | (1L << (ASTERISK - 64)) | (1L << (STRING - 64)) | (1L << (INTEGER_VALUE - 64)) | (1L << (DECIMAL_VALUE - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TRUE) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (PLUS - 65)) | (1L << (MINUS - 65)) | (1L << (ASTERISK - 65)) | (1L << (STRING - 65)) | (1L << (INTEGER_VALUE - 65)) | (1L << (DECIMAL_VALUE - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) { { setState(258); expression(); @@ -1807,7 +1807,7 @@ class SqlBaseParser extends Parser { expression(); setState(285); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) { { setState(282); _la = _input.LA(1); @@ -2292,7 +2292,7 @@ class SqlBaseParser extends Parser { tableIdentifier(); setState(345); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) { { setState(342); _la = _input.LA(1); @@ -2322,7 +2322,7 @@ class SqlBaseParser extends Parser { match(T__1); setState(354); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) { { setState(351); _la = _input.LA(1); @@ -2352,7 +2352,7 @@ class SqlBaseParser extends Parser { match(T__1); setState(363); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) { { setState(360); _la = _input.LA(1); @@ -3288,6 +3288,9 @@ class SqlBaseParser extends Parser { case PLAN: case RLIKE: case QUERY: + case SCHEMAS: + case SHOW: + case SYS: case TABLES: case TEXT: case TRUE: @@ -3353,7 +3356,7 @@ class SqlBaseParser extends Parser { setState(493); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (ASTERISK - 75)) | (1L << (SLASH - 75)) | (1L << (PERCENT - 75)))) != 0)) ) { + if ( !(((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (ASTERISK - 76)) | (1L << (SLASH - 76)) | (1L << (PERCENT - 76)))) != 0)) ) { ((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { consume(); @@ -3685,7 +3688,7 @@ class SqlBaseParser extends Parser { { setState(526); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) { { setState(523); qualifiedName(); @@ -3708,7 +3711,7 @@ class SqlBaseParser extends Parser { match(T__0); setState(542); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ALL) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << COLUMNS) | (1L << DEBUG) | (1L << DISTINCT) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << TABLES) | (1L << TEXT) | (1L << TRUE) | (1L << TYPES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (VERIFY - 64)) | (1L << (PLUS - 64)) | (1L << (MINUS - 64)) | (1L << (ASTERISK - 64)) | (1L << (STRING - 64)) | (1L << (INTEGER_VALUE - 64)) | (1L << (DECIMAL_VALUE - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ALL) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << COLUMNS) | (1L << DEBUG) | (1L << DISTINCT) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TRUE) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (PLUS - 65)) | (1L << (MINUS - 65)) | (1L << (ASTERISK - 65)) | (1L << (STRING - 65)) | (1L << (INTEGER_VALUE - 65)) | (1L << (DECIMAL_VALUE - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) { { setState(532); _la = _input.LA(1); @@ -3993,7 +3996,7 @@ class SqlBaseParser extends Parser { { setState(568); _la = _input.LA(1); - if ( !(((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & ((1L << (EQ - 67)) | (1L << (NEQ - 67)) | (1L << (LT - 67)) | (1L << (LTE - 67)) | (1L << (GT - 67)) | (1L << (GTE - 67)))) != 0)) ) { + if ( !(((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & ((1L << (EQ - 68)) | (1L << (NEQ - 68)) | (1L << (LT - 68)) | (1L << (LTE - 68)) | (1L << (GT - 68)) | (1L << (GTE - 68)))) != 0)) ) { _errHandler.recoverInline(this); } else { consume(); @@ -4239,6 +4242,9 @@ class SqlBaseParser extends Parser { case PLAN: case RLIKE: case QUERY: + case SCHEMAS: + case SHOW: + case SYS: case TABLES: case TEXT: case TYPES: @@ -4267,9 +4273,14 @@ class SqlBaseParser extends Parser { } public static class TableIdentifierContext extends ParserRuleContext { + public IdentifierContext catalog; + public IdentifierContext name; public TerminalNode TABLE_IDENTIFIER() { return getToken(SqlBaseParser.TABLE_IDENTIFIER, 0); } - public IdentifierContext identifier() { - return getRuleContext(IdentifierContext.class,0); + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); } public TableIdentifierContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -4293,48 +4304,48 @@ class SqlBaseParser extends Parser { public final TableIdentifierContext tableIdentifier() throws RecognitionException { TableIdentifierContext _localctx = new TableIdentifierContext(_ctx, getState()); enterRule(_localctx, 66, RULE_tableIdentifier); + int _la; try { - setState(590); - switch (_input.LA(1)) { - case TABLE_IDENTIFIER: + setState(600); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { + case 1: enterOuterAlt(_localctx, 1); { - setState(588); + setState(591); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXPLAIN) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES) | (1L << TEXT) | (1L << TYPES))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (VERIFY - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (DIGIT_IDENTIFIER - 65)) | (1L << (QUOTED_IDENTIFIER - 65)) | (1L << (BACKQUOTED_IDENTIFIER - 65)))) != 0)) { + { + setState(588); + ((TableIdentifierContext)_localctx).catalog = identifier(); + setState(589); + match(T__3); + } + } + + setState(593); match(TABLE_IDENTIFIER); } break; - case ANALYZE: - case ANALYZED: - case COLUMNS: - case DEBUG: - case EXECUTABLE: - case EXPLAIN: - case FORMAT: - case FUNCTIONS: - case GRAPHVIZ: - case MAPPED: - case OPTIMIZED: - case PARSED: - case PHYSICAL: - case PLAN: - case RLIKE: - case QUERY: - case TABLES: - case TEXT: - case TYPES: - case VERIFY: - case IDENTIFIER: - case DIGIT_IDENTIFIER: - case QUOTED_IDENTIFIER: - case BACKQUOTED_IDENTIFIER: + case 2: enterOuterAlt(_localctx, 2); { - setState(589); - identifier(); + setState(597); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { + case 1: + { + setState(594); + ((TableIdentifierContext)_localctx).catalog = identifier(); + setState(595); + match(T__3); + } + break; + } + setState(599); + ((TableIdentifierContext)_localctx).name = identifier(); } break; - default: - throw new NoViableAltException(this); } } catch (RecognitionException re) { @@ -4398,13 +4409,13 @@ class SqlBaseParser extends Parser { QuoteIdentifierContext _localctx = new QuoteIdentifierContext(_ctx, getState()); enterRule(_localctx, 68, RULE_quoteIdentifier); try { - setState(594); + setState(604); switch (_input.LA(1)) { case QUOTED_IDENTIFIER: _localctx = new QuotedIdentifierContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(592); + setState(602); match(QUOTED_IDENTIFIER); } break; @@ -4412,7 +4423,7 @@ class SqlBaseParser extends Parser { _localctx = new BackQuotedIdentifierContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(593); + setState(603); match(BACKQUOTED_IDENTIFIER); } break; @@ -4484,13 +4495,13 @@ class SqlBaseParser extends Parser { UnquoteIdentifierContext _localctx = new UnquoteIdentifierContext(_ctx, getState()); enterRule(_localctx, 70, RULE_unquoteIdentifier); try { - setState(599); + setState(609); switch (_input.LA(1)) { case IDENTIFIER: _localctx = new UnquotedIdentifierContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(596); + setState(606); match(IDENTIFIER); } break; @@ -4510,6 +4521,9 @@ class SqlBaseParser extends Parser { case PLAN: case RLIKE: case QUERY: + case SCHEMAS: + case SHOW: + case SYS: case TABLES: case TEXT: case TYPES: @@ -4517,7 +4531,7 @@ class SqlBaseParser extends Parser { _localctx = new UnquotedIdentifierContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(597); + setState(607); nonReserved(); } break; @@ -4525,7 +4539,7 @@ class SqlBaseParser extends Parser { _localctx = new DigitIdentifierContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(598); + setState(608); match(DIGIT_IDENTIFIER); } break; @@ -4594,13 +4608,13 @@ class SqlBaseParser extends Parser { NumberContext _localctx = new NumberContext(_ctx, getState()); enterRule(_localctx, 72, RULE_number); try { - setState(603); + setState(613); switch (_input.LA(1)) { case DECIMAL_VALUE: _localctx = new DecimalLiteralContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(601); + setState(611); match(DECIMAL_VALUE); } break; @@ -4608,7 +4622,7 @@ class SqlBaseParser extends Parser { _localctx = new IntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(602); + setState(612); match(INTEGER_VALUE); } break; @@ -4644,6 +4658,9 @@ class SqlBaseParser extends Parser { public TerminalNode PLAN() { return getToken(SqlBaseParser.PLAN, 0); } public TerminalNode QUERY() { return getToken(SqlBaseParser.QUERY, 0); } public TerminalNode RLIKE() { return getToken(SqlBaseParser.RLIKE, 0); } + public TerminalNode SCHEMAS() { return getToken(SqlBaseParser.SCHEMAS, 0); } + public TerminalNode SHOW() { return getToken(SqlBaseParser.SHOW, 0); } + public TerminalNode SYS() { return getToken(SqlBaseParser.SYS, 0); } public TerminalNode TABLES() { return getToken(SqlBaseParser.TABLES, 0); } public TerminalNode TEXT() { return getToken(SqlBaseParser.TEXT, 0); } public TerminalNode TYPES() { return getToken(SqlBaseParser.TYPES, 0); } @@ -4674,9 +4691,9 @@ class SqlBaseParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(605); + setState(615); _la = _input.LA(1); - if ( !(((((_la - 5)) & ~0x3f) == 0 && ((1L << (_la - 5)) & ((1L << (ANALYZE - 5)) | (1L << (ANALYZED - 5)) | (1L << (COLUMNS - 5)) | (1L << (DEBUG - 5)) | (1L << (EXECUTABLE - 5)) | (1L << (EXPLAIN - 5)) | (1L << (FORMAT - 5)) | (1L << (FUNCTIONS - 5)) | (1L << (GRAPHVIZ - 5)) | (1L << (MAPPED - 5)) | (1L << (OPTIMIZED - 5)) | (1L << (PARSED - 5)) | (1L << (PHYSICAL - 5)) | (1L << (PLAN - 5)) | (1L << (RLIKE - 5)) | (1L << (QUERY - 5)) | (1L << (TABLES - 5)) | (1L << (TEXT - 5)) | (1L << (TYPES - 5)) | (1L << (VERIFY - 5)))) != 0)) ) { + if ( !(((((_la - 6)) & ~0x3f) == 0 && ((1L << (_la - 6)) & ((1L << (ANALYZE - 6)) | (1L << (ANALYZED - 6)) | (1L << (COLUMNS - 6)) | (1L << (DEBUG - 6)) | (1L << (EXECUTABLE - 6)) | (1L << (EXPLAIN - 6)) | (1L << (FORMAT - 6)) | (1L << (FUNCTIONS - 6)) | (1L << (GRAPHVIZ - 6)) | (1L << (MAPPED - 6)) | (1L << (OPTIMIZED - 6)) | (1L << (PARSED - 6)) | (1L << (PHYSICAL - 6)) | (1L << (PLAN - 6)) | (1L << (RLIKE - 6)) | (1L << (QUERY - 6)) | (1L << (SCHEMAS - 6)) | (1L << (SHOW - 6)) | (1L << (SYS - 6)) | (1L << (TABLES - 6)) | (1L << (TEXT - 6)) | (1L << (TYPES - 6)) | (1L << (VERIFY - 6)))) != 0)) ) { _errHandler.recoverInline(this); } else { consume(); @@ -4725,7 +4742,7 @@ class SqlBaseParser extends Parser { } public static final String _serializedATN = - "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3^\u0262\4\2\t\2\4"+ + "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3_\u026c\4\2\t\2\4"+ "\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+ "\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -4772,201 +4789,204 @@ class SqlBaseParser extends Parser { "\u0221\n\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+ "\5\34\u022f\n\34\3\35\3\35\3\35\3\35\6\35\u0235\n\35\r\35\16\35\u0236"+ "\5\35\u0239\n\35\3\36\3\36\3\37\3\37\3 \3 \3!\3!\3!\7!\u0244\n!\f!\16"+ - "!\u0247\13!\3!\3!\3\"\3\"\5\"\u024d\n\"\3#\3#\5#\u0251\n#\3$\3$\5$\u0255"+ - "\n$\3%\3%\3%\5%\u025a\n%\3&\3&\5&\u025e\n&\3\'\3\'\3\'\2\4,\64(\2\4\6"+ - "\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJL\2\17"+ - "\b\2\6\6\b\b\26\26))//\63\63\4\2\37\37>>\4\2\b\b//\4\2\34\34\"\"\3\2\22"+ - "\23\4\2\6\6SS\4\2\f\f\22\22\4\2\6\6\24\24\3\2KL\3\2MO\3\2EJ\4\2\32\32"+ - "??\17\2\7\b\20\21\26\26\30\30\33\33\36\37))//\63\65\678=>@@BB\u02b3\2"+ - "N\3\2\2\2\4Q\3\2\2\2\6\u00a6\3\2\2\2\b\u00b1\3\2\2\2\n\u00b5\3\2\2\2\f"+ - "\u00cb\3\2\2\2\16\u00cd\3\2\2\2\20\u00d1\3\2\2\2\22\u00ed\3\2\2\2\24\u00f7"+ - "\3\2\2\2\26\u0101\3\2\2\2\30\u0110\3\2\2\2\32\u0112\3\2\2\2\34\u0118\3"+ - "\2\2\2\36\u011a\3\2\2\2 \u0121\3\2\2\2\"\u0133\3\2\2\2$\u0144\3\2\2\2"+ - "&\u0154\3\2\2\2(\u016f\3\2\2\2*\u0171\3\2\2\2,\u01a2\3\2\2\2.\u01af\3"+ - "\2\2\2\60\u01e1\3\2\2\2\62\u01e3\3\2\2\2\64\u01ec\3\2\2\2\66\u022e\3\2"+ - "\2\28\u0238\3\2\2\2:\u023a\3\2\2\2<\u023c\3\2\2\2>\u023e\3\2\2\2@\u0245"+ - "\3\2\2\2B\u024c\3\2\2\2D\u0250\3\2\2\2F\u0254\3\2\2\2H\u0259\3\2\2\2J"+ - "\u025d\3\2\2\2L\u025f\3\2\2\2NO\5\6\4\2OP\7\2\2\3P\3\3\2\2\2QR\5*\26\2"+ - "RS\7\2\2\3S\5\3\2\2\2T\u00a7\5\b\5\2Uc\7\30\2\2V_\7\3\2\2WX\7\65\2\2X"+ - "^\t\2\2\2YZ\7\33\2\2Z^\t\3\2\2[\\\7B\2\2\\^\5<\37\2]W\3\2\2\2]Y\3\2\2"+ - "\2][\3\2\2\2^a\3\2\2\2_]\3\2\2\2_`\3\2\2\2`b\3\2\2\2a_\3\2\2\2bd\7\4\2"+ - "\2cV\3\2\2\2cd\3\2\2\2de\3\2\2\2e\u00a7\5\6\4\2fr\7\21\2\2gn\7\3\2\2h"+ - "i\7\65\2\2im\t\4\2\2jk\7\33\2\2km\t\3\2\2lh\3\2\2\2lj\3\2\2\2mp\3\2\2"+ - "\2nl\3\2\2\2no\3\2\2\2oq\3\2\2\2pn\3\2\2\2qs\7\4\2\2rg\3\2\2\2rs\3\2\2"+ - "\2st\3\2\2\2t\u00a7\5\6\4\2uv\7;\2\2v{\7=\2\2wy\7\'\2\2xw\3\2\2\2xy\3"+ - "\2\2\2yz\3\2\2\2z|\5\62\32\2{x\3\2\2\2{|\3\2\2\2|\u00a7\3\2\2\2}~\7;\2"+ - "\2~\177\7\20\2\2\177\u0080\t\5\2\2\u0080\u00a7\5D#\2\u0081\u0082\t\6\2"+ - "\2\u0082\u00a7\5D#\2\u0083\u0084\7;\2\2\u0084\u0089\7\36\2\2\u0085\u0087"+ - "\7\'\2\2\u0086\u0085\3\2\2\2\u0086\u0087\3\2\2\2\u0087\u0088\3\2\2\2\u0088"+ - "\u008a\5\62\32\2\u0089\u0086\3\2\2\2\u0089\u008a\3\2\2\2\u008a\u00a7\3"+ - "\2\2\2\u008b\u008c\7;\2\2\u008c\u00a7\79\2\2\u008d\u008e\7<\2\2\u008e"+ - "\u0093\7=\2\2\u008f\u0091\7\'\2\2\u0090\u008f\3\2\2\2\u0090\u0091\3\2"+ - "\2\2\u0091\u0092\3\2\2\2\u0092\u0094\5\62\32\2\u0093\u0090\3\2\2\2\u0093"+ - "\u0094\3\2\2\2\u0094\u00a7\3\2\2\2\u0095\u0096\7<\2\2\u0096\u009c\7\20"+ - "\2\2\u0097\u0099\7=\2\2\u0098\u009a\7\'\2\2\u0099\u0098\3\2\2\2\u0099"+ - "\u009a\3\2\2\2\u009a\u009b\3\2\2\2\u009b\u009d\5\62\32\2\u009c\u0097\3"+ - "\2\2\2\u009c\u009d\3\2\2\2\u009d\u00a2\3\2\2\2\u009e\u00a0\7\'\2\2\u009f"+ - "\u009e\3\2\2\2\u009f\u00a0\3\2\2\2\u00a0\u00a1\3\2\2\2\u00a1\u00a3\5\62"+ - "\32\2\u00a2\u009f\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\u00a7\3\2\2\2\u00a4"+ - "\u00a5\7<\2\2\u00a5\u00a7\7@\2\2\u00a6T\3\2\2\2\u00a6U\3\2\2\2\u00a6f"+ - "\3\2\2\2\u00a6u\3\2\2\2\u00a6}\3\2\2\2\u00a6\u0081\3\2\2\2\u00a6\u0083"+ - "\3\2\2\2\u00a6\u008b\3\2\2\2\u00a6\u008d\3\2\2\2\u00a6\u0095\3\2\2\2\u00a6"+ - "\u00a4\3\2\2\2\u00a7\7\3\2\2\2\u00a8\u00a9\7D\2\2\u00a9\u00ae\5\32\16"+ - "\2\u00aa\u00ab\7\5\2\2\u00ab\u00ad\5\32\16\2\u00ac\u00aa\3\2\2\2\u00ad"+ - "\u00b0\3\2\2\2\u00ae\u00ac\3\2\2\2\u00ae\u00af\3\2\2\2\u00af\u00b2\3\2"+ - "\2\2\u00b0\u00ae\3\2\2\2\u00b1\u00a8\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2"+ - "\u00b3\3\2\2\2\u00b3\u00b4\5\n\6\2\u00b4\t\3\2\2\2\u00b5\u00c0\5\f\7\2"+ - "\u00b6\u00b7\7\61\2\2\u00b7\u00b8\7\16\2\2\u00b8\u00bd\5\16\b\2\u00b9"+ - "\u00ba\7\5\2\2\u00ba\u00bc\5\16\b\2\u00bb\u00b9\3\2\2\2\u00bc\u00bf\3"+ - "\2\2\2\u00bd\u00bb\3\2\2\2\u00bd\u00be\3\2\2\2\u00be\u00c1\3\2\2\2\u00bf"+ - "\u00bd\3\2\2\2\u00c0\u00b6\3\2\2\2\u00c0\u00c1\3\2\2\2\u00c1\u00c4\3\2"+ - "\2\2\u00c2\u00c3\7(\2\2\u00c3\u00c5\t\7\2\2\u00c4\u00c2\3\2\2\2\u00c4"+ - "\u00c5\3\2\2\2\u00c5\13\3\2\2\2\u00c6\u00cc\5\20\t\2\u00c7\u00c8\7\3\2"+ - "\2\u00c8\u00c9\5\n\6\2\u00c9\u00ca\7\4\2\2\u00ca\u00cc\3\2\2\2\u00cb\u00c6"+ - "\3\2\2\2\u00cb\u00c7\3\2\2\2\u00cc\r\3\2\2\2\u00cd\u00cf\5*\26\2\u00ce"+ - "\u00d0\t\b\2\2\u00cf\u00ce\3\2\2\2\u00cf\u00d0\3\2\2\2\u00d0\17\3\2\2"+ - "\2\u00d1\u00d3\7:\2\2\u00d2\u00d4\5\34\17\2\u00d3\u00d2\3\2\2\2\u00d3"+ - "\u00d4\3\2\2\2\u00d4\u00d5\3\2\2\2\u00d5\u00da\5\36\20\2\u00d6\u00d7\7"+ - "\5\2\2\u00d7\u00d9\5\36\20\2\u00d8\u00d6\3\2\2\2\u00d9\u00dc\3\2\2\2\u00da"+ - "\u00d8\3\2\2\2\u00da\u00db\3\2\2\2\u00db\u00de\3\2\2\2\u00dc\u00da\3\2"+ - "\2\2\u00dd\u00df\5\22\n\2\u00de\u00dd\3\2\2\2\u00de\u00df\3\2\2\2\u00df"+ - "\u00e2\3\2\2\2\u00e0\u00e1\7C\2\2\u00e1\u00e3\5,\27\2\u00e2\u00e0\3\2"+ - "\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e7\3\2\2\2\u00e4\u00e5\7 \2\2\u00e5"+ - "\u00e6\7\16\2\2\u00e6\u00e8\5\24\13\2\u00e7\u00e4\3\2\2\2\u00e7\u00e8"+ - "\3\2\2\2\u00e8\u00eb\3\2\2\2\u00e9\u00ea\7!\2\2\u00ea\u00ec\5,\27\2\u00eb"+ - "\u00e9\3\2\2\2\u00eb\u00ec\3\2\2\2\u00ec\21\3\2\2\2\u00ed\u00ee\7\34\2"+ - "\2\u00ee\u00f3\5 \21\2\u00ef\u00f0\7\5\2\2\u00f0\u00f2\5 \21\2\u00f1\u00ef"+ - "\3\2\2\2\u00f2\u00f5\3\2\2\2\u00f3\u00f1\3\2\2\2\u00f3\u00f4\3\2\2\2\u00f4"+ - "\23\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f6\u00f8\5\34\17\2\u00f7\u00f6\3\2"+ - "\2\2\u00f7\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fe\5\26\f\2\u00fa"+ - "\u00fb\7\5\2\2\u00fb\u00fd\5\26\f\2\u00fc\u00fa\3\2\2\2\u00fd\u0100\3"+ - "\2\2\2\u00fe\u00fc\3\2\2\2\u00fe\u00ff\3\2\2\2\u00ff\25\3\2\2\2\u0100"+ - "\u00fe\3\2\2\2\u0101\u0102\5\30\r\2\u0102\27\3\2\2\2\u0103\u010c\7\3\2"+ - "\2\u0104\u0109\5*\26\2\u0105\u0106\7\5\2\2\u0106\u0108\5*\26\2\u0107\u0105"+ - "\3\2\2\2\u0108\u010b\3\2\2\2\u0109\u0107\3\2\2\2\u0109\u010a\3\2\2\2\u010a"+ - "\u010d\3\2\2\2\u010b\u0109\3\2\2\2\u010c\u0104\3\2\2\2\u010c\u010d\3\2"+ - "\2\2\u010d\u010e\3\2\2\2\u010e\u0111\7\4\2\2\u010f\u0111\5*\26\2\u0110"+ - "\u0103\3\2\2\2\u0110\u010f\3\2\2\2\u0111\31\3\2\2\2\u0112\u0113\5B\"\2"+ - "\u0113\u0114\7\13\2\2\u0114\u0115\7\3\2\2\u0115\u0116\5\n\6\2\u0116\u0117"+ - "\7\4\2\2\u0117\33\3\2\2\2\u0118\u0119\t\t\2\2\u0119\35\3\2\2\2\u011a\u011f"+ - "\5*\26\2\u011b\u011d\7\13\2\2\u011c\u011b\3\2\2\2\u011c\u011d\3\2\2\2"+ - "\u011d\u011e\3\2\2\2\u011e\u0120\5B\"\2\u011f\u011c\3\2\2\2\u011f\u0120"+ - "\3\2\2\2\u0120\37\3\2\2\2\u0121\u0125\5(\25\2\u0122\u0124\5\"\22\2\u0123"+ - "\u0122\3\2\2\2\u0124\u0127\3\2\2\2\u0125\u0123\3\2\2\2\u0125\u0126\3\2"+ - "\2\2\u0126!\3\2\2\2\u0127\u0125\3\2\2\2\u0128\u0129\5$\23\2\u0129\u012a"+ - "\7%\2\2\u012a\u012c\5(\25\2\u012b\u012d\5&\24\2\u012c\u012b\3\2\2\2\u012c"+ - "\u012d\3\2\2\2\u012d\u0134\3\2\2\2\u012e\u012f\7+\2\2\u012f\u0130\5$\23"+ - "\2\u0130\u0131\7%\2\2\u0131\u0132\5(\25\2\u0132\u0134\3\2\2\2\u0133\u0128"+ - "\3\2\2\2\u0133\u012e\3\2\2\2\u0134#\3\2\2\2\u0135\u0137\7#\2\2\u0136\u0135"+ - "\3\2\2\2\u0136\u0137\3\2\2\2\u0137\u0145\3\2\2\2\u0138\u013a\7&\2\2\u0139"+ - "\u013b\7\62\2\2\u013a\u0139\3\2\2\2\u013a\u013b\3\2\2\2\u013b\u0145\3"+ - "\2\2\2\u013c\u013e\7\66\2\2\u013d\u013f\7\62\2\2\u013e\u013d\3\2\2\2\u013e"+ - "\u013f\3\2\2\2\u013f\u0145\3\2\2\2\u0140\u0142\7\35\2\2\u0141\u0143\7"+ - "\62\2\2\u0142\u0141\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0145\3\2\2\2\u0144"+ - "\u0136\3\2\2\2\u0144\u0138\3\2\2\2\u0144\u013c\3\2\2\2\u0144\u0140\3\2"+ - "\2\2\u0145%\3\2\2\2\u0146\u0147\7.\2\2\u0147\u0155\5,\27\2\u0148\u0149"+ - "\7A\2\2\u0149\u014a\7\3\2\2\u014a\u014f\5B\"\2\u014b\u014c\7\5\2\2\u014c"+ - "\u014e\5B\"\2\u014d\u014b\3\2\2\2\u014e\u0151\3\2\2\2\u014f\u014d\3\2"+ - "\2\2\u014f\u0150\3\2\2\2\u0150\u0152\3\2\2\2\u0151\u014f\3\2\2\2\u0152"+ - "\u0153\7\4\2\2\u0153\u0155\3\2\2\2\u0154\u0146\3\2\2\2\u0154\u0148\3\2"+ - "\2\2\u0155\'\3\2\2\2\u0156\u015b\5D#\2\u0157\u0159\7\13\2\2\u0158\u0157"+ - "\3\2\2\2\u0158\u0159\3\2\2\2\u0159\u015a\3\2\2\2\u015a\u015c\5@!\2\u015b"+ - "\u0158\3\2\2\2\u015b\u015c\3\2\2\2\u015c\u0170\3\2\2\2\u015d\u015e\7\3"+ - "\2\2\u015e\u015f\5\n\6\2\u015f\u0164\7\4\2\2\u0160\u0162\7\13\2\2\u0161"+ - "\u0160\3\2\2\2\u0161\u0162\3\2\2\2\u0162\u0163\3\2\2\2\u0163\u0165\5@"+ - "!\2\u0164\u0161\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0170\3\2\2\2\u0166"+ - "\u0167\7\3\2\2\u0167\u0168\5 \21\2\u0168\u016d\7\4\2\2\u0169\u016b\7\13"+ - "\2\2\u016a\u0169\3\2\2\2\u016a\u016b\3\2\2\2\u016b\u016c\3\2\2\2\u016c"+ + "!\u0247\13!\3!\3!\3\"\3\"\5\"\u024d\n\"\3#\3#\3#\5#\u0252\n#\3#\3#\3#"+ + "\3#\5#\u0258\n#\3#\5#\u025b\n#\3$\3$\5$\u025f\n$\3%\3%\3%\5%\u0264\n%"+ + "\3&\3&\5&\u0268\n&\3\'\3\'\3\'\2\4,\64(\2\4\6\b\n\f\16\20\22\24\26\30"+ + "\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJL\2\17\b\2\7\7\t\t\27\27**\60"+ + "\60\64\64\4\2 ??\4\2\t\t\60\60\4\2\35\35##\3\2\23\24\4\2\7\7TT\4\2\r"+ + "\r\23\23\4\2\7\7\25\25\3\2LM\3\2NP\3\2FK\4\2\33\33@@\17\2\b\t\21\22\27"+ + "\27\31\31\34\34\37 **\60\60\64\668:\u023e\3\2\2\2@\u0245\3\2\2\2B\u024c\3\2\2\2D"+ + "\u025a\3\2\2\2F\u025e\3\2\2\2H\u0263\3\2\2\2J\u0267\3\2\2\2L\u0269\3\2"+ + "\2\2NO\5\6\4\2OP\7\2\2\3P\3\3\2\2\2QR\5*\26\2RS\7\2\2\3S\5\3\2\2\2T\u00a7"+ + "\5\b\5\2Uc\7\31\2\2V_\7\3\2\2WX\7\66\2\2X^\t\2\2\2YZ\7\34\2\2Z^\t\3\2"+ + "\2[\\\7C\2\2\\^\5<\37\2]W\3\2\2\2]Y\3\2\2\2][\3\2\2\2^a\3\2\2\2_]\3\2"+ + "\2\2_`\3\2\2\2`b\3\2\2\2a_\3\2\2\2bd\7\4\2\2cV\3\2\2\2cd\3\2\2\2de\3\2"+ + "\2\2e\u00a7\5\6\4\2fr\7\22\2\2gn\7\3\2\2hi\7\66\2\2im\t\4\2\2jk\7\34\2"+ + "\2km\t\3\2\2lh\3\2\2\2lj\3\2\2\2mp\3\2\2\2nl\3\2\2\2no\3\2\2\2oq\3\2\2"+ + "\2pn\3\2\2\2qs\7\4\2\2rg\3\2\2\2rs\3\2\2\2st\3\2\2\2t\u00a7\5\6\4\2uv"+ + "\7<\2\2v{\7>\2\2wy\7(\2\2xw\3\2\2\2xy\3\2\2\2yz\3\2\2\2z|\5\62\32\2{x"+ + "\3\2\2\2{|\3\2\2\2|\u00a7\3\2\2\2}~\7<\2\2~\177\7\21\2\2\177\u0080\t\5"+ + "\2\2\u0080\u00a7\5D#\2\u0081\u0082\t\6\2\2\u0082\u00a7\5D#\2\u0083\u0084"+ + "\7<\2\2\u0084\u0089\7\37\2\2\u0085\u0087\7(\2\2\u0086\u0085\3\2\2\2\u0086"+ + "\u0087\3\2\2\2\u0087\u0088\3\2\2\2\u0088\u008a\5\62\32\2\u0089\u0086\3"+ + "\2\2\2\u0089\u008a\3\2\2\2\u008a\u00a7\3\2\2\2\u008b\u008c\7<\2\2\u008c"+ + "\u00a7\7:\2\2\u008d\u008e\7=\2\2\u008e\u0093\7>\2\2\u008f\u0091\7(\2\2"+ + "\u0090\u008f\3\2\2\2\u0090\u0091\3\2\2\2\u0091\u0092\3\2\2\2\u0092\u0094"+ + "\5\62\32\2\u0093\u0090\3\2\2\2\u0093\u0094\3\2\2\2\u0094\u00a7\3\2\2\2"+ + "\u0095\u0096\7=\2\2\u0096\u009c\7\21\2\2\u0097\u0099\7>\2\2\u0098\u009a"+ + "\7(\2\2\u0099\u0098\3\2\2\2\u0099\u009a\3\2\2\2\u009a\u009b\3\2\2\2\u009b"+ + "\u009d\5\62\32\2\u009c\u0097\3\2\2\2\u009c\u009d\3\2\2\2\u009d\u00a2\3"+ + "\2\2\2\u009e\u00a0\7(\2\2\u009f\u009e\3\2\2\2\u009f\u00a0\3\2\2\2\u00a0"+ + "\u00a1\3\2\2\2\u00a1\u00a3\5\62\32\2\u00a2\u009f\3\2\2\2\u00a2\u00a3\3"+ + "\2\2\2\u00a3\u00a7\3\2\2\2\u00a4\u00a5\7=\2\2\u00a5\u00a7\7A\2\2\u00a6"+ + "T\3\2\2\2\u00a6U\3\2\2\2\u00a6f\3\2\2\2\u00a6u\3\2\2\2\u00a6}\3\2\2\2"+ + "\u00a6\u0081\3\2\2\2\u00a6\u0083\3\2\2\2\u00a6\u008b\3\2\2\2\u00a6\u008d"+ + "\3\2\2\2\u00a6\u0095\3\2\2\2\u00a6\u00a4\3\2\2\2\u00a7\7\3\2\2\2\u00a8"+ + "\u00a9\7E\2\2\u00a9\u00ae\5\32\16\2\u00aa\u00ab\7\5\2\2\u00ab\u00ad\5"+ + "\32\16\2\u00ac\u00aa\3\2\2\2\u00ad\u00b0\3\2\2\2\u00ae\u00ac\3\2\2\2\u00ae"+ + "\u00af\3\2\2\2\u00af\u00b2\3\2\2\2\u00b0\u00ae\3\2\2\2\u00b1\u00a8\3\2"+ + "\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3\u00b4\5\n\6\2\u00b4"+ + "\t\3\2\2\2\u00b5\u00c0\5\f\7\2\u00b6\u00b7\7\62\2\2\u00b7\u00b8\7\17\2"+ + "\2\u00b8\u00bd\5\16\b\2\u00b9\u00ba\7\5\2\2\u00ba\u00bc\5\16\b\2\u00bb"+ + "\u00b9\3\2\2\2\u00bc\u00bf\3\2\2\2\u00bd\u00bb\3\2\2\2\u00bd\u00be\3\2"+ + "\2\2\u00be\u00c1\3\2\2\2\u00bf\u00bd\3\2\2\2\u00c0\u00b6\3\2\2\2\u00c0"+ + "\u00c1\3\2\2\2\u00c1\u00c4\3\2\2\2\u00c2\u00c3\7)\2\2\u00c3\u00c5\t\7"+ + "\2\2\u00c4\u00c2\3\2\2\2\u00c4\u00c5\3\2\2\2\u00c5\13\3\2\2\2\u00c6\u00cc"+ + "\5\20\t\2\u00c7\u00c8\7\3\2\2\u00c8\u00c9\5\n\6\2\u00c9\u00ca\7\4\2\2"+ + "\u00ca\u00cc\3\2\2\2\u00cb\u00c6\3\2\2\2\u00cb\u00c7\3\2\2\2\u00cc\r\3"+ + "\2\2\2\u00cd\u00cf\5*\26\2\u00ce\u00d0\t\b\2\2\u00cf\u00ce\3\2\2\2\u00cf"+ + "\u00d0\3\2\2\2\u00d0\17\3\2\2\2\u00d1\u00d3\7;\2\2\u00d2\u00d4\5\34\17"+ + "\2\u00d3\u00d2\3\2\2\2\u00d3\u00d4\3\2\2\2\u00d4\u00d5\3\2\2\2\u00d5\u00da"+ + "\5\36\20\2\u00d6\u00d7\7\5\2\2\u00d7\u00d9\5\36\20\2\u00d8\u00d6\3\2\2"+ + "\2\u00d9\u00dc\3\2\2\2\u00da\u00d8\3\2\2\2\u00da\u00db\3\2\2\2\u00db\u00de"+ + "\3\2\2\2\u00dc\u00da\3\2\2\2\u00dd\u00df\5\22\n\2\u00de\u00dd\3\2\2\2"+ + "\u00de\u00df\3\2\2\2\u00df\u00e2\3\2\2\2\u00e0\u00e1\7D\2\2\u00e1\u00e3"+ + "\5,\27\2\u00e2\u00e0\3\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e7\3\2\2\2\u00e4"+ + "\u00e5\7!\2\2\u00e5\u00e6\7\17\2\2\u00e6\u00e8\5\24\13\2\u00e7\u00e4\3"+ + "\2\2\2\u00e7\u00e8\3\2\2\2\u00e8\u00eb\3\2\2\2\u00e9\u00ea\7\"\2\2\u00ea"+ + "\u00ec\5,\27\2\u00eb\u00e9\3\2\2\2\u00eb\u00ec\3\2\2\2\u00ec\21\3\2\2"+ + "\2\u00ed\u00ee\7\35\2\2\u00ee\u00f3\5 \21\2\u00ef\u00f0\7\5\2\2\u00f0"+ + "\u00f2\5 \21\2\u00f1\u00ef\3\2\2\2\u00f2\u00f5\3\2\2\2\u00f3\u00f1\3\2"+ + "\2\2\u00f3\u00f4\3\2\2\2\u00f4\23\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f6\u00f8"+ + "\5\34\17\2\u00f7\u00f6\3\2\2\2\u00f7\u00f8\3\2\2\2\u00f8\u00f9\3\2\2\2"+ + "\u00f9\u00fe\5\26\f\2\u00fa\u00fb\7\5\2\2\u00fb\u00fd\5\26\f\2\u00fc\u00fa"+ + "\3\2\2\2\u00fd\u0100\3\2\2\2\u00fe\u00fc\3\2\2\2\u00fe\u00ff\3\2\2\2\u00ff"+ + "\25\3\2\2\2\u0100\u00fe\3\2\2\2\u0101\u0102\5\30\r\2\u0102\27\3\2\2\2"+ + "\u0103\u010c\7\3\2\2\u0104\u0109\5*\26\2\u0105\u0106\7\5\2\2\u0106\u0108"+ + "\5*\26\2\u0107\u0105\3\2\2\2\u0108\u010b\3\2\2\2\u0109\u0107\3\2\2\2\u0109"+ + "\u010a\3\2\2\2\u010a\u010d\3\2\2\2\u010b\u0109\3\2\2\2\u010c\u0104\3\2"+ + "\2\2\u010c\u010d\3\2\2\2\u010d\u010e\3\2\2\2\u010e\u0111\7\4\2\2\u010f"+ + "\u0111\5*\26\2\u0110\u0103\3\2\2\2\u0110\u010f\3\2\2\2\u0111\31\3\2\2"+ + "\2\u0112\u0113\5B\"\2\u0113\u0114\7\f\2\2\u0114\u0115\7\3\2\2\u0115\u0116"+ + "\5\n\6\2\u0116\u0117\7\4\2\2\u0117\33\3\2\2\2\u0118\u0119\t\t\2\2\u0119"+ + "\35\3\2\2\2\u011a\u011f\5*\26\2\u011b\u011d\7\f\2\2\u011c\u011b\3\2\2"+ + "\2\u011c\u011d\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u0120\5B\"\2\u011f\u011c"+ + "\3\2\2\2\u011f\u0120\3\2\2\2\u0120\37\3\2\2\2\u0121\u0125\5(\25\2\u0122"+ + "\u0124\5\"\22\2\u0123\u0122\3\2\2\2\u0124\u0127\3\2\2\2\u0125\u0123\3"+ + "\2\2\2\u0125\u0126\3\2\2\2\u0126!\3\2\2\2\u0127\u0125\3\2\2\2\u0128\u0129"+ + "\5$\23\2\u0129\u012a\7&\2\2\u012a\u012c\5(\25\2\u012b\u012d\5&\24\2\u012c"+ + "\u012b\3\2\2\2\u012c\u012d\3\2\2\2\u012d\u0134\3\2\2\2\u012e\u012f\7,"+ + "\2\2\u012f\u0130\5$\23\2\u0130\u0131\7&\2\2\u0131\u0132\5(\25\2\u0132"+ + "\u0134\3\2\2\2\u0133\u0128\3\2\2\2\u0133\u012e\3\2\2\2\u0134#\3\2\2\2"+ + "\u0135\u0137\7$\2\2\u0136\u0135\3\2\2\2\u0136\u0137\3\2\2\2\u0137\u0145"+ + "\3\2\2\2\u0138\u013a\7\'\2\2\u0139\u013b\7\63\2\2\u013a\u0139\3\2\2\2"+ + "\u013a\u013b\3\2\2\2\u013b\u0145\3\2\2\2\u013c\u013e\7\67\2\2\u013d\u013f"+ + "\7\63\2\2\u013e\u013d\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0145\3\2\2\2"+ + "\u0140\u0142\7\36\2\2\u0141\u0143\7\63\2\2\u0142\u0141\3\2\2\2\u0142\u0143"+ + "\3\2\2\2\u0143\u0145\3\2\2\2\u0144\u0136\3\2\2\2\u0144\u0138\3\2\2\2\u0144"+ + "\u013c\3\2\2\2\u0144\u0140\3\2\2\2\u0145%\3\2\2\2\u0146\u0147\7/\2\2\u0147"+ + "\u0155\5,\27\2\u0148\u0149\7B\2\2\u0149\u014a\7\3\2\2\u014a\u014f\5B\""+ + "\2\u014b\u014c\7\5\2\2\u014c\u014e\5B\"\2\u014d\u014b\3\2\2\2\u014e\u0151"+ + "\3\2\2\2\u014f\u014d\3\2\2\2\u014f\u0150\3\2\2\2\u0150\u0152\3\2\2\2\u0151"+ + "\u014f\3\2\2\2\u0152\u0153\7\4\2\2\u0153\u0155\3\2\2\2\u0154\u0146\3\2"+ + "\2\2\u0154\u0148\3\2\2\2\u0155\'\3\2\2\2\u0156\u015b\5D#\2\u0157\u0159"+ + "\7\f\2\2\u0158\u0157\3\2\2\2\u0158\u0159\3\2\2\2\u0159\u015a\3\2\2\2\u015a"+ + "\u015c\5@!\2\u015b\u0158\3\2\2\2\u015b\u015c\3\2\2\2\u015c\u0170\3\2\2"+ + "\2\u015d\u015e\7\3\2\2\u015e\u015f\5\n\6\2\u015f\u0164\7\4\2\2\u0160\u0162"+ + "\7\f\2\2\u0161\u0160\3\2\2\2\u0161\u0162\3\2\2\2\u0162\u0163\3\2\2\2\u0163"+ + "\u0165\5@!\2\u0164\u0161\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0170\3\2\2"+ + "\2\u0166\u0167\7\3\2\2\u0167\u0168\5 \21\2\u0168\u016d\7\4\2\2\u0169\u016b"+ + "\7\f\2\2\u016a\u0169\3\2\2\2\u016a\u016b\3\2\2\2\u016b\u016c\3\2\2\2\u016c"+ "\u016e\5@!\2\u016d\u016a\3\2\2\2\u016d\u016e\3\2\2\2\u016e\u0170\3\2\2"+ "\2\u016f\u0156\3\2\2\2\u016f\u015d\3\2\2\2\u016f\u0166\3\2\2\2\u0170)"+ "\3\2\2\2\u0171\u0172\5,\27\2\u0172+\3\2\2\2\u0173\u0174\b\27\1\2\u0174"+ - "\u0175\7,\2\2\u0175\u01a3\5,\27\n\u0176\u0177\7\27\2\2\u0177\u0178\7\3"+ + "\u0175\7-\2\2\u0175\u01a3\5,\27\n\u0176\u0177\7\30\2\2\u0177\u0178\7\3"+ "\2\2\u0178\u0179\5\b\5\2\u0179\u017a\7\4\2\2\u017a\u01a3\3\2\2\2\u017b"+ - "\u017c\78\2\2\u017c\u017d\7\3\2\2\u017d\u0182\7R\2\2\u017e\u017f\7\5\2"+ - "\2\u017f\u0181\7R\2\2\u0180\u017e\3\2\2\2\u0181\u0184\3\2\2\2\u0182\u0180"+ + "\u017c\79\2\2\u017c\u017d\7\3\2\2\u017d\u0182\7S\2\2\u017e\u017f\7\5\2"+ + "\2\u017f\u0181\7S\2\2\u0180\u017e\3\2\2\2\u0181\u0184\3\2\2\2\u0182\u0180"+ "\3\2\2\2\u0182\u0183\3\2\2\2\u0183\u0185\3\2\2\2\u0184\u0182\3\2\2\2\u0185"+ - "\u01a3\7\4\2\2\u0186\u0187\7*\2\2\u0187\u0188\7\3\2\2\u0188\u0189\5@!"+ - "\2\u0189\u018a\7\5\2\2\u018a\u018f\7R\2\2\u018b\u018c\7\5\2\2\u018c\u018e"+ - "\7R\2\2\u018d\u018b\3\2\2\2\u018e\u0191\3\2\2\2\u018f\u018d\3\2\2\2\u018f"+ + "\u01a3\7\4\2\2\u0186\u0187\7+\2\2\u0187\u0188\7\3\2\2\u0188\u0189\5@!"+ + "\2\u0189\u018a\7\5\2\2\u018a\u018f\7S\2\2\u018b\u018c\7\5\2\2\u018c\u018e"+ + "\7S\2\2\u018d\u018b\3\2\2\2\u018e\u0191\3\2\2\2\u018f\u018d\3\2\2\2\u018f"+ "\u0190\3\2\2\2\u0190\u0192\3\2\2\2\u0191\u018f\3\2\2\2\u0192\u0193\7\4"+ - "\2\2\u0193\u01a3\3\2\2\2\u0194\u0195\7*\2\2\u0195\u0196\7\3\2\2\u0196"+ - "\u0197\7R\2\2\u0197\u0198\7\5\2\2\u0198\u019d\7R\2\2\u0199\u019a\7\5\2"+ - "\2\u019a\u019c\7R\2\2\u019b\u0199\3\2\2\2\u019c\u019f\3\2\2\2\u019d\u019b"+ + "\2\2\u0193\u01a3\3\2\2\2\u0194\u0195\7+\2\2\u0195\u0196\7\3\2\2\u0196"+ + "\u0197\7S\2\2\u0197\u0198\7\5\2\2\u0198\u019d\7S\2\2\u0199\u019a\7\5\2"+ + "\2\u019a\u019c\7S\2\2\u019b\u0199\3\2\2\2\u019c\u019f\3\2\2\2\u019d\u019b"+ "\3\2\2\2\u019d\u019e\3\2\2\2\u019e\u01a0\3\2\2\2\u019f\u019d\3\2\2\2\u01a0"+ "\u01a3\7\4\2\2\u01a1\u01a3\5.\30\2\u01a2\u0173\3\2\2\2\u01a2\u0176\3\2"+ "\2\2\u01a2\u017b\3\2\2\2\u01a2\u0186\3\2\2\2\u01a2\u0194\3\2\2\2\u01a2"+ - "\u01a1\3\2\2\2\u01a3\u01ac\3\2\2\2\u01a4\u01a5\f\4\2\2\u01a5\u01a6\7\t"+ - "\2\2\u01a6\u01ab\5,\27\5\u01a7\u01a8\f\3\2\2\u01a8\u01a9\7\60\2\2\u01a9"+ + "\u01a1\3\2\2\2\u01a3\u01ac\3\2\2\2\u01a4\u01a5\f\4\2\2\u01a5\u01a6\7\n"+ + "\2\2\u01a6\u01ab\5,\27\5\u01a7\u01a8\f\3\2\2\u01a8\u01a9\7\61\2\2\u01a9"+ "\u01ab\5,\27\4\u01aa\u01a4\3\2\2\2\u01aa\u01a7\3\2\2\2\u01ab\u01ae\3\2"+ "\2\2\u01ac\u01aa\3\2\2\2\u01ac\u01ad\3\2\2\2\u01ad-\3\2\2\2\u01ae\u01ac"+ "\3\2\2\2\u01af\u01b1\5\64\33\2\u01b0\u01b2\5\60\31\2\u01b1\u01b0\3\2\2"+ - "\2\u01b1\u01b2\3\2\2\2\u01b2/\3\2\2\2\u01b3\u01b5\7,\2\2\u01b4\u01b3\3"+ - "\2\2\2\u01b4\u01b5\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\u01b7\7\r\2\2\u01b7"+ - "\u01b8\5\64\33\2\u01b8\u01b9\7\t\2\2\u01b9\u01ba\5\64\33\2\u01ba\u01e2"+ - "\3\2\2\2\u01bb\u01bd\7,\2\2\u01bc\u01bb\3\2\2\2\u01bc\u01bd\3\2\2\2\u01bd"+ - "\u01be\3\2\2\2\u01be\u01bf\7\"\2\2\u01bf\u01c0\7\3\2\2\u01c0\u01c5\5*"+ - "\26\2\u01c1\u01c2\7\5\2\2\u01c2\u01c4\5*\26\2\u01c3\u01c1\3\2\2\2\u01c4"+ - "\u01c7\3\2\2\2\u01c5\u01c3\3\2\2\2\u01c5\u01c6\3\2\2\2\u01c6\u01c8\3\2"+ - "\2\2\u01c7\u01c5\3\2\2\2\u01c8\u01c9\7\4\2\2\u01c9\u01e2\3\2\2\2\u01ca"+ - "\u01cc\7,\2\2\u01cb\u01ca\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd\3\2"+ - "\2\2\u01cd\u01ce\7\"\2\2\u01ce\u01cf\7\3\2\2\u01cf\u01d0\5\b\5\2\u01d0"+ - "\u01d1\7\4\2\2\u01d1\u01e2\3\2\2\2\u01d2\u01d4\7,\2\2\u01d3\u01d2\3\2"+ - "\2\2\u01d3\u01d4\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d6\7\'\2\2\u01d6"+ - "\u01e2\5\62\32\2\u01d7\u01d9\7,\2\2\u01d8\u01d7\3\2\2\2\u01d8\u01d9\3"+ - "\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01db\7\67\2\2\u01db\u01e2\7R\2\2\u01dc"+ - "\u01de\7$\2\2\u01dd\u01df\7,\2\2\u01de\u01dd\3\2\2\2\u01de\u01df\3\2\2"+ - "\2\u01df\u01e0\3\2\2\2\u01e0\u01e2\7-\2\2\u01e1\u01b4\3\2\2\2\u01e1\u01bc"+ - "\3\2\2\2\u01e1\u01cb\3\2\2\2\u01e1\u01d3\3\2\2\2\u01e1\u01d8\3\2\2\2\u01e1"+ - "\u01dc\3\2\2\2\u01e2\61\3\2\2\2\u01e3\u01e6\7R\2\2\u01e4\u01e5\7\25\2"+ - "\2\u01e5\u01e7\7R\2\2\u01e6\u01e4\3\2\2\2\u01e6\u01e7\3\2\2\2\u01e7\63"+ - "\3\2\2\2\u01e8\u01e9\b\33\1\2\u01e9\u01ed\5\66\34\2\u01ea\u01eb\t\n\2"+ - "\2\u01eb\u01ed\5\64\33\6\u01ec\u01e8\3\2\2\2\u01ec\u01ea\3\2\2\2\u01ed"+ - "\u01fa\3\2\2\2\u01ee\u01ef\f\5\2\2\u01ef\u01f0\t\13\2\2\u01f0\u01f9\5"+ - "\64\33\6\u01f1\u01f2\f\4\2\2\u01f2\u01f3\t\n\2\2\u01f3\u01f9\5\64\33\5"+ - "\u01f4\u01f5\f\3\2\2\u01f5\u01f6\5:\36\2\u01f6\u01f7\5\64\33\4\u01f7\u01f9"+ - "\3\2\2\2\u01f8\u01ee\3\2\2\2\u01f8\u01f1\3\2\2\2\u01f8\u01f4\3\2\2\2\u01f9"+ - "\u01fc\3\2\2\2\u01fa\u01f8\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb\65\3\2\2"+ - "\2\u01fc\u01fa\3\2\2\2\u01fd\u01fe\7\17\2\2\u01fe\u01ff\7\3\2\2\u01ff"+ - "\u0200\5*\26\2\u0200\u0201\7\13\2\2\u0201\u0202\5> \2\u0202\u0203\7\4"+ - "\2\2\u0203\u022f\3\2\2\2\u0204\u0205\7\31\2\2\u0205\u0206\7\3\2\2\u0206"+ - "\u0207\5B\"\2\u0207\u0208\7\34\2\2\u0208\u0209\5\64\33\2\u0209\u020a\7"+ - "\4\2\2\u020a\u022f\3\2\2\2\u020b\u022f\58\35\2\u020c\u022f\7M\2\2\u020d"+ - "\u020e\5@!\2\u020e\u020f\7Q\2\2\u020f\u0211\3\2\2\2\u0210\u020d\3\2\2"+ - "\2\u0210\u0211\3\2\2\2\u0211\u0212\3\2\2\2\u0212\u022f\7M\2\2\u0213\u0214"+ - "\5B\"\2\u0214\u0220\7\3\2\2\u0215\u0217\5\34\17\2\u0216\u0215\3\2\2\2"+ - "\u0216\u0217\3\2\2\2\u0217\u0218\3\2\2\2\u0218\u021d\5*\26\2\u0219\u021a"+ - "\7\5\2\2\u021a\u021c\5*\26\2\u021b\u0219\3\2\2\2\u021c\u021f\3\2\2\2\u021d"+ - "\u021b\3\2\2\2\u021d\u021e\3\2\2\2\u021e\u0221\3\2\2\2\u021f\u021d\3\2"+ - "\2\2\u0220\u0216\3\2\2\2\u0220\u0221\3\2\2\2\u0221\u0222\3\2\2\2\u0222"+ - "\u0223\7\4\2\2\u0223\u022f\3\2\2\2\u0224\u0225\7\3\2\2\u0225\u0226\5\b"+ - "\5\2\u0226\u0227\7\4\2\2\u0227\u022f\3\2\2\2\u0228\u022f\5B\"\2\u0229"+ - "\u022f\5@!\2\u022a\u022b\7\3\2\2\u022b\u022c\5*\26\2\u022c\u022d\7\4\2"+ - "\2\u022d\u022f\3\2\2\2\u022e\u01fd\3\2\2\2\u022e\u0204\3\2\2\2\u022e\u020b"+ - "\3\2\2\2\u022e\u020c\3\2\2\2\u022e\u0210\3\2\2\2\u022e\u0213\3\2\2\2\u022e"+ - "\u0224\3\2\2\2\u022e\u0228\3\2\2\2\u022e\u0229\3\2\2\2\u022e\u022a\3\2"+ - "\2\2\u022f\67\3\2\2\2\u0230\u0239\7-\2\2\u0231\u0239\5J&\2\u0232\u0239"+ - "\5<\37\2\u0233\u0235\7R\2\2\u0234\u0233\3\2\2\2\u0235\u0236\3\2\2\2\u0236"+ - "\u0234\3\2\2\2\u0236\u0237\3\2\2\2\u0237\u0239\3\2\2\2\u0238\u0230\3\2"+ - "\2\2\u0238\u0231\3\2\2\2\u0238\u0232\3\2\2\2\u0238\u0234\3\2\2\2\u0239"+ - "9\3\2\2\2\u023a\u023b\t\f\2\2\u023b;\3\2\2\2\u023c\u023d\t\r\2\2\u023d"+ - "=\3\2\2\2\u023e\u023f\5B\"\2\u023f?\3\2\2\2\u0240\u0241\5B\"\2\u0241\u0242"+ - "\7Q\2\2\u0242\u0244\3\2\2\2\u0243\u0240\3\2\2\2\u0244\u0247\3\2\2\2\u0245"+ - "\u0243\3\2\2\2\u0245\u0246\3\2\2\2\u0246\u0248\3\2\2\2\u0247\u0245\3\2"+ - "\2\2\u0248\u0249\5B\"\2\u0249A\3\2\2\2\u024a\u024d\5F$\2\u024b\u024d\5"+ - "H%\2\u024c\u024a\3\2\2\2\u024c\u024b\3\2\2\2\u024dC\3\2\2\2\u024e\u0251"+ - "\7W\2\2\u024f\u0251\5B\"\2\u0250\u024e\3\2\2\2\u0250\u024f\3\2\2\2\u0251"+ - "E\3\2\2\2\u0252\u0255\7X\2\2\u0253\u0255\7Y\2\2\u0254\u0252\3\2\2\2\u0254"+ - "\u0253\3\2\2\2\u0255G\3\2\2\2\u0256\u025a\7U\2\2\u0257\u025a\5L\'\2\u0258"+ - "\u025a\7V\2\2\u0259\u0256\3\2\2\2\u0259\u0257\3\2\2\2\u0259\u0258\3\2"+ - "\2\2\u025aI\3\2\2\2\u025b\u025e\7T\2\2\u025c\u025e\7S\2\2\u025d\u025b"+ - "\3\2\2\2\u025d\u025c\3\2\2\2\u025eK\3\2\2\2\u025f\u0260\t\16\2\2\u0260"+ - "M\3\2\2\2Y]_clnrx{\u0086\u0089\u0090\u0093\u0099\u009c\u009f\u00a2\u00a6"+ + "\2\u01b1\u01b2\3\2\2\2\u01b2/\3\2\2\2\u01b3\u01b5\7-\2\2\u01b4\u01b3\3"+ + "\2\2\2\u01b4\u01b5\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\u01b7\7\16\2\2\u01b7"+ + "\u01b8\5\64\33\2\u01b8\u01b9\7\n\2\2\u01b9\u01ba\5\64\33\2\u01ba\u01e2"+ + "\3\2\2\2\u01bb\u01bd\7-\2\2\u01bc\u01bb\3\2\2\2\u01bc\u01bd\3\2\2\2\u01bd"+ + "\u01be\3\2\2\2\u01be\u01bf\7#\2\2\u01bf\u01c0\7\3\2\2\u01c0\u01c5\5*\26"+ + "\2\u01c1\u01c2\7\5\2\2\u01c2\u01c4\5*\26\2\u01c3\u01c1\3\2\2\2\u01c4\u01c7"+ + "\3\2\2\2\u01c5\u01c3\3\2\2\2\u01c5\u01c6\3\2\2\2\u01c6\u01c8\3\2\2\2\u01c7"+ + "\u01c5\3\2\2\2\u01c8\u01c9\7\4\2\2\u01c9\u01e2\3\2\2\2\u01ca\u01cc\7-"+ + "\2\2\u01cb\u01ca\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd\3\2\2\2\u01cd"+ + "\u01ce\7#\2\2\u01ce\u01cf\7\3\2\2\u01cf\u01d0\5\b\5\2\u01d0\u01d1\7\4"+ + "\2\2\u01d1\u01e2\3\2\2\2\u01d2\u01d4\7-\2\2\u01d3\u01d2\3\2\2\2\u01d3"+ + "\u01d4\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d6\7(\2\2\u01d6\u01e2\5\62"+ + "\32\2\u01d7\u01d9\7-\2\2\u01d8\u01d7\3\2\2\2\u01d8\u01d9\3\2\2\2\u01d9"+ + "\u01da\3\2\2\2\u01da\u01db\78\2\2\u01db\u01e2\7S\2\2\u01dc\u01de\7%\2"+ + "\2\u01dd\u01df\7-\2\2\u01de\u01dd\3\2\2\2\u01de\u01df\3\2\2\2\u01df\u01e0"+ + "\3\2\2\2\u01e0\u01e2\7.\2\2\u01e1\u01b4\3\2\2\2\u01e1\u01bc\3\2\2\2\u01e1"+ + "\u01cb\3\2\2\2\u01e1\u01d3\3\2\2\2\u01e1\u01d8\3\2\2\2\u01e1\u01dc\3\2"+ + "\2\2\u01e2\61\3\2\2\2\u01e3\u01e6\7S\2\2\u01e4\u01e5\7\26\2\2\u01e5\u01e7"+ + "\7S\2\2\u01e6\u01e4\3\2\2\2\u01e6\u01e7\3\2\2\2\u01e7\63\3\2\2\2\u01e8"+ + "\u01e9\b\33\1\2\u01e9\u01ed\5\66\34\2\u01ea\u01eb\t\n\2\2\u01eb\u01ed"+ + "\5\64\33\6\u01ec\u01e8\3\2\2\2\u01ec\u01ea\3\2\2\2\u01ed\u01fa\3\2\2\2"+ + "\u01ee\u01ef\f\5\2\2\u01ef\u01f0\t\13\2\2\u01f0\u01f9\5\64\33\6\u01f1"+ + "\u01f2\f\4\2\2\u01f2\u01f3\t\n\2\2\u01f3\u01f9\5\64\33\5\u01f4\u01f5\f"+ + "\3\2\2\u01f5\u01f6\5:\36\2\u01f6\u01f7\5\64\33\4\u01f7\u01f9\3\2\2\2\u01f8"+ + "\u01ee\3\2\2\2\u01f8\u01f1\3\2\2\2\u01f8\u01f4\3\2\2\2\u01f9\u01fc\3\2"+ + "\2\2\u01fa\u01f8\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb\65\3\2\2\2\u01fc\u01fa"+ + "\3\2\2\2\u01fd\u01fe\7\20\2\2\u01fe\u01ff\7\3\2\2\u01ff\u0200\5*\26\2"+ + "\u0200\u0201\7\f\2\2\u0201\u0202\5> \2\u0202\u0203\7\4\2\2\u0203\u022f"+ + "\3\2\2\2\u0204\u0205\7\32\2\2\u0205\u0206\7\3\2\2\u0206\u0207\5B\"\2\u0207"+ + "\u0208\7\35\2\2\u0208\u0209\5\64\33\2\u0209\u020a\7\4\2\2\u020a\u022f"+ + "\3\2\2\2\u020b\u022f\58\35\2\u020c\u022f\7N\2\2\u020d\u020e\5@!\2\u020e"+ + "\u020f\7R\2\2\u020f\u0211\3\2\2\2\u0210\u020d\3\2\2\2\u0210\u0211\3\2"+ + "\2\2\u0211\u0212\3\2\2\2\u0212\u022f\7N\2\2\u0213\u0214\5B\"\2\u0214\u0220"+ + "\7\3\2\2\u0215\u0217\5\34\17\2\u0216\u0215\3\2\2\2\u0216\u0217\3\2\2\2"+ + "\u0217\u0218\3\2\2\2\u0218\u021d\5*\26\2\u0219\u021a\7\5\2\2\u021a\u021c"+ + "\5*\26\2\u021b\u0219\3\2\2\2\u021c\u021f\3\2\2\2\u021d\u021b\3\2\2\2\u021d"+ + "\u021e\3\2\2\2\u021e\u0221\3\2\2\2\u021f\u021d\3\2\2\2\u0220\u0216\3\2"+ + "\2\2\u0220\u0221\3\2\2\2\u0221\u0222\3\2\2\2\u0222\u0223\7\4\2\2\u0223"+ + "\u022f\3\2\2\2\u0224\u0225\7\3\2\2\u0225\u0226\5\b\5\2\u0226\u0227\7\4"+ + "\2\2\u0227\u022f\3\2\2\2\u0228\u022f\5B\"\2\u0229\u022f\5@!\2\u022a\u022b"+ + "\7\3\2\2\u022b\u022c\5*\26\2\u022c\u022d\7\4\2\2\u022d\u022f\3\2\2\2\u022e"+ + "\u01fd\3\2\2\2\u022e\u0204\3\2\2\2\u022e\u020b\3\2\2\2\u022e\u020c\3\2"+ + "\2\2\u022e\u0210\3\2\2\2\u022e\u0213\3\2\2\2\u022e\u0224\3\2\2\2\u022e"+ + "\u0228\3\2\2\2\u022e\u0229\3\2\2\2\u022e\u022a\3\2\2\2\u022f\67\3\2\2"+ + "\2\u0230\u0239\7.\2\2\u0231\u0239\5J&\2\u0232\u0239\5<\37\2\u0233\u0235"+ + "\7S\2\2\u0234\u0233\3\2\2\2\u0235\u0236\3\2\2\2\u0236\u0234\3\2\2\2\u0236"+ + "\u0237\3\2\2\2\u0237\u0239\3\2\2\2\u0238\u0230\3\2\2\2\u0238\u0231\3\2"+ + "\2\2\u0238\u0232\3\2\2\2\u0238\u0234\3\2\2\2\u02399\3\2\2\2\u023a\u023b"+ + "\t\f\2\2\u023b;\3\2\2\2\u023c\u023d\t\r\2\2\u023d=\3\2\2\2\u023e\u023f"+ + "\5B\"\2\u023f?\3\2\2\2\u0240\u0241\5B\"\2\u0241\u0242\7R\2\2\u0242\u0244"+ + "\3\2\2\2\u0243\u0240\3\2\2\2\u0244\u0247\3\2\2\2\u0245\u0243\3\2\2\2\u0245"+ + "\u0246\3\2\2\2\u0246\u0248\3\2\2\2\u0247\u0245\3\2\2\2\u0248\u0249\5B"+ + "\"\2\u0249A\3\2\2\2\u024a\u024d\5F$\2\u024b\u024d\5H%\2\u024c\u024a\3"+ + "\2\2\2\u024c\u024b\3\2\2\2\u024dC\3\2\2\2\u024e\u024f\5B\"\2\u024f\u0250"+ + "\7\6\2\2\u0250\u0252\3\2\2\2\u0251\u024e\3\2\2\2\u0251\u0252\3\2\2\2\u0252"+ + "\u0253\3\2\2\2\u0253\u025b\7X\2\2\u0254\u0255\5B\"\2\u0255\u0256\7\6\2"+ + "\2\u0256\u0258\3\2\2\2\u0257\u0254\3\2\2\2\u0257\u0258\3\2\2\2\u0258\u0259"+ + "\3\2\2\2\u0259\u025b\5B\"\2\u025a\u0251\3\2\2\2\u025a\u0257\3\2\2\2\u025b"+ + "E\3\2\2\2\u025c\u025f\7Y\2\2\u025d\u025f\7Z\2\2\u025e\u025c\3\2\2\2\u025e"+ + "\u025d\3\2\2\2\u025fG\3\2\2\2\u0260\u0264\7V\2\2\u0261\u0264\5L\'\2\u0262"+ + "\u0264\7W\2\2\u0263\u0260\3\2\2\2\u0263\u0261\3\2\2\2\u0263\u0262\3\2"+ + "\2\2\u0264I\3\2\2\2\u0265\u0268\7U\2\2\u0266\u0268\7T\2\2\u0267\u0265"+ + "\3\2\2\2\u0267\u0266\3\2\2\2\u0268K\3\2\2\2\u0269\u026a\t\16\2\2\u026a"+ + "M\3\2\2\2[]_clnrx{\u0086\u0089\u0090\u0093\u0099\u009c\u009f\u00a2\u00a6"+ "\u00ae\u00b1\u00bd\u00c0\u00c4\u00cb\u00cf\u00d3\u00da\u00de\u00e2\u00e7"+ "\u00eb\u00f3\u00f7\u00fe\u0109\u010c\u0110\u011c\u011f\u0125\u012c\u0133"+ "\u0136\u013a\u013e\u0142\u0144\u014f\u0154\u0158\u015b\u0161\u0164\u016a"+ "\u016d\u016f\u0182\u018f\u019d\u01a2\u01aa\u01ac\u01b1\u01b4\u01bc\u01c5"+ "\u01cb\u01d3\u01d8\u01de\u01e1\u01e6\u01ec\u01f8\u01fa\u0210\u0216\u021d"+ - "\u0220\u022e\u0236\u0238\u0245\u024c\u0250\u0254\u0259\u025d"; + "\u0220\u022e\u0236\u0238\u0245\u024c\u0251\u0257\u025a\u025e\u0263\u0267"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/TableIdentifier.java b/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/TableIdentifier.java index 1432fa4a147..0d91703679c 100644 --- a/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/TableIdentifier.java +++ b/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/TableIdentifier.java @@ -11,21 +11,28 @@ import java.util.Objects; public class TableIdentifier { - private final String index; private final Location location; - public TableIdentifier(Location location, String index) { + private final String cluster; + private final String index; + + public TableIdentifier(Location location, String catalog, String index) { this.location = location; + this.cluster = catalog; this.index = index; } + public String cluster() { + return cluster; + } + public String index() { return index; } @Override public int hashCode() { - return Objects.hash(index); + return Objects.hash(cluster, index); } @Override @@ -39,7 +46,7 @@ public class TableIdentifier { } TableIdentifier other = (TableIdentifier) obj; - return Objects.equals(index, other.index); + return Objects.equals(index, other.index) && Objects.equals(cluster, other.cluster); } public Location location() { @@ -49,7 +56,11 @@ public class TableIdentifier { @Override public String toString() { StringBuilder builder = new StringBuilder(); - builder.append("[index="); + builder.append("["); + if (cluster != null) { + builder.append(cluster); + } + builder.append("][index="); builder.append(index); builder.append("]"); return builder.toString(); diff --git a/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/session/SqlSession.java b/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/session/SqlSession.java index 3e8e8dca99e..b04bff3810a 100644 --- a/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/session/SqlSession.java +++ b/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/session/SqlSession.java @@ -7,6 +7,7 @@ package org.elasticsearch.xpack.sql.session; import org.elasticsearch.action.ActionListener; import org.elasticsearch.client.Client; +import org.elasticsearch.common.Strings; import org.elasticsearch.xpack.sql.analysis.analyzer.Analyzer; import org.elasticsearch.xpack.sql.analysis.analyzer.PreAnalyzer; import org.elasticsearch.xpack.sql.analysis.analyzer.PreAnalyzer.PreAnalysis; @@ -16,6 +17,7 @@ import org.elasticsearch.xpack.sql.analysis.index.MappingException; import org.elasticsearch.xpack.sql.expression.function.FunctionRegistry; import org.elasticsearch.xpack.sql.optimizer.Optimizer; import org.elasticsearch.xpack.sql.parser.SqlParser; +import org.elasticsearch.xpack.sql.plan.TableIdentifier; import org.elasticsearch.xpack.sql.plan.logical.LogicalPlan; import org.elasticsearch.xpack.sql.plan.physical.PhysicalPlan; import org.elasticsearch.xpack.sql.planner.Planner; @@ -115,8 +117,15 @@ public class SqlSession { // Note: JOINs are not supported but we detect them when listener.onFailure(new MappingException("Queries with multiple indices are not supported")); } else if (preAnalysis.indices.size() == 1) { - String indexName = preAnalysis.indices.get(0); - indexResolver.resolveWithSameMapping(indexName, null, + TableIdentifier table = preAnalysis.indices.get(0); + + String cluster = table.cluster(); + + if (Strings.hasText(cluster) && !indexResolver.clusterName().equals(cluster)) { + listener.onFailure(new MappingException("Cannot inspect indices in cluster/catalog [{}]", cluster)); + } + + indexResolver.resolveWithSameMapping(table.index(), null, wrap(indexResult -> listener.onResponse(action.apply(indexResult)), listener::onFailure)); } else { try { diff --git a/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/analyzer/PreAnalyzerTests.java b/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/analyzer/PreAnalyzerTests.java index b80b6312dde..44d34f67b3e 100644 --- a/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/analyzer/PreAnalyzerTests.java +++ b/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/analysis/analyzer/PreAnalyzerTests.java @@ -11,7 +11,8 @@ import org.elasticsearch.xpack.sql.parser.SqlParser; import org.elasticsearch.xpack.sql.plan.logical.LogicalPlan; import org.joda.time.DateTimeZone; -import static org.hamcrest.Matchers.contains; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; public class PreAnalyzerTests extends ESTestCase { @@ -23,20 +24,53 @@ public class PreAnalyzerTests extends ESTestCase { LogicalPlan plan = parser.createStatement("SELECT * FROM index"); PreAnalysis result = preAnalyzer.preAnalyze(plan); assertThat(plan.preAnalyzed(), is(true)); - assertThat(result.indices, contains("index")); + assertThat(result.indices, hasSize(1)); + assertThat(result.indices.get(0).cluster(), nullValue()); + assertThat(result.indices.get(0).index(), is("index")); + } + + public void testBasicIndexWithCatalog() { + LogicalPlan plan = parser.createStatement("SELECT * FROM elastic:index"); + PreAnalysis result = preAnalyzer.preAnalyze(plan); + assertThat(plan.preAnalyzed(), is(true)); + assertThat(result.indices, hasSize(1)); + assertThat(result.indices.get(0).cluster(), is("elastic")); + assertThat(result.indices.get(0).index(), is("index")); + } + + public void testWildIndexWithCatalog() { + LogicalPlan plan = parser.createStatement("SELECT * FROM elastic:index*"); + PreAnalysis result = preAnalyzer.preAnalyze(plan); + assertThat(plan.preAnalyzed(), is(true)); + assertThat(result.indices, hasSize(1)); + assertThat(result.indices.get(0).cluster(), is("elastic")); + assertThat(result.indices.get(0).index(), is("index*")); } public void testQuotedIndex() { LogicalPlan plan = parser.createStatement("SELECT * FROM \"aaa\""); PreAnalysis result = preAnalyzer.preAnalyze(plan); assertThat(plan.preAnalyzed(), is(true)); - assertThat(result.indices, contains("aaa")); + assertThat(result.indices, hasSize(1)); + assertThat(result.indices.get(0).cluster(), nullValue()); + assertThat(result.indices.get(0).index(), is("aaa")); + } + + public void testQuotedCatalog() { + LogicalPlan plan = parser.createStatement("SELECT * FROM \"elastic\":\"aaa\""); + PreAnalysis result = preAnalyzer.preAnalyze(plan); + assertThat(plan.preAnalyzed(), is(true)); + assertThat(result.indices, hasSize(1)); + assertThat(result.indices.get(0).cluster(), is("elastic")); + assertThat(result.indices.get(0).index(), is("aaa")); } public void testComplicatedQuery() { LogicalPlan plan = parser.createStatement("SELECT MAX(a) FROM aaa WHERE d > 10 GROUP BY b HAVING AVG(c) ORDER BY e ASC"); PreAnalysis result = preAnalyzer.preAnalyze(plan); assertThat(plan.preAnalyzed(), is(true)); - assertThat(result.indices, contains("aaa")); + assertThat(result.indices, hasSize(1)); + assertThat(result.indices.get(0).cluster(), nullValue()); + assertThat(result.indices.get(0).index(), is("aaa")); } } diff --git a/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plan/logical/UnresolvedRelationTests.java b/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plan/logical/UnresolvedRelationTests.java index cb2210b818d..99df12327e1 100644 --- a/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plan/logical/UnresolvedRelationTests.java +++ b/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plan/logical/UnresolvedRelationTests.java @@ -20,7 +20,7 @@ import static org.elasticsearch.test.EqualsHashCodeTestUtils.checkEqualsAndHashC public class UnresolvedRelationTests extends ESTestCase { public void testEqualsAndHashCode() { Location location = new Location(between(1, 1000), between(1, 1000)); - TableIdentifier table = new TableIdentifier(location, randomAlphaOfLength(5)); + TableIdentifier table = new TableIdentifier(location, randomAlphaOfLength(5), randomAlphaOfLength(5)); String alias = randomBoolean() ? null : randomAlphaOfLength(5); String unresolvedMessage = randomAlphaOfLength(5); UnresolvedRelation relation = new UnresolvedRelation(location, table, alias, unresolvedMessage); @@ -32,7 +32,7 @@ public class UnresolvedRelationTests extends ESTestCase { r.unresolvedMessage())); mutators.add(r -> new UnresolvedRelation( r.location(), - new TableIdentifier(r.location(), r.table().index() + "m"), + new TableIdentifier(r.location(), r.table().cluster(), r.table().index() + "m"), r.alias(), r.unresolvedMessage())); mutators.add(r -> new UnresolvedRelation( diff --git a/qa/sql/no-security/src/test/java/org/elasticsearch/xpack/qa/sql/nosecurity/CliExplainIT.java b/qa/sql/no-security/src/test/java/org/elasticsearch/xpack/qa/sql/nosecurity/CliExplainIT.java index f0c8309a189..f913395759c 100644 --- a/qa/sql/no-security/src/test/java/org/elasticsearch/xpack/qa/sql/nosecurity/CliExplainIT.java +++ b/qa/sql/no-security/src/test/java/org/elasticsearch/xpack/qa/sql/nosecurity/CliExplainIT.java @@ -20,7 +20,7 @@ public class CliExplainIT extends CliIntegrationTestCase { assertThat(readLine(), startsWith("----------")); assertThat(readLine(), startsWith("With[{}]")); assertThat(readLine(), startsWith("\\_Project[[?*]]")); - assertThat(readLine(), startsWith(" \\_UnresolvedRelation[[index=test],null,Unknown index [test]]")); + assertThat(readLine(), startsWith(" \\_UnresolvedRelation[[][index=test],null,Unknown index [test]]")); assertEquals("", readLine()); assertThat(command("EXPLAIN " + (randomBoolean() ? "" : "(PLAN ANALYZED) ") + "SELECT * FROM test"), containsString("plan")); @@ -66,7 +66,7 @@ public class CliExplainIT extends CliIntegrationTestCase { assertThat(readLine(), startsWith("With[{}]")); assertThat(readLine(), startsWith("\\_Project[[?*]]")); assertThat(readLine(), startsWith(" \\_Filter[?i = 2]")); - assertThat(readLine(), startsWith(" \\_UnresolvedRelation[[index=test],null,Unknown index [test]]")); + assertThat(readLine(), startsWith(" \\_UnresolvedRelation[[][index=test],null,Unknown index [test]]")); assertEquals("", readLine()); assertThat(command("EXPLAIN " + (randomBoolean() ? "" : "(PLAN ANALYZED) ") + "SELECT * FROM test WHERE i = 2"), @@ -124,7 +124,7 @@ public class CliExplainIT extends CliIntegrationTestCase { assertThat(readLine(), startsWith("----------")); assertThat(readLine(), startsWith("With[{}]")); assertThat(readLine(), startsWith("\\_Project[[?COUNT(?*)]]")); - assertThat(readLine(), startsWith(" \\_UnresolvedRelation[[index=test],null,Unknown index [test]]")); + assertThat(readLine(), startsWith(" \\_UnresolvedRelation[[][index=test],null,Unknown index [test]]")); assertEquals("", readLine()); assertThat(command("EXPLAIN " + (randomBoolean() ? "" : "(PLAN ANALYZED) ") + "SELECT COUNT(*) FROM test"),