From 31c59e01265536e5f06d567f1bf8dfc2c3f55781 Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Tue, 18 Sep 2018 18:14:48 +0200 Subject: [PATCH 1/2] SQL: Fix issue with options for QUERY() and MATCH(). Previously multiple comma separated lists of options where not recognized correctly which resulted in only the last of them to be taked into account, e.g.: For the following query: SELECT * FROM test WHERE QUERY('search', 'default_field=foo', 'default_operator=and')" only the `default_operator=and` was finally passed to the ES query. Fixes: #32602 --- x-pack/plugin/sql/src/main/antlr/SqlBase.g4 | 10 +- .../predicate/fulltext/FullTextUtils.java | 12 +- .../xpack/sql/parser/ExpressionBuilder.java | 19 +- .../xpack/sql/parser/SqlBaseBaseListener.java | 12 + .../xpack/sql/parser/SqlBaseBaseVisitor.java | 7 + .../xpack/sql/parser/SqlBaseListener.java | 10 + .../xpack/sql/parser/SqlBaseParser.java | 1721 +++++++++-------- .../xpack/sql/parser/SqlBaseVisitor.java | 6 + .../xpack/sql/parser/SqlParserTests.java | 46 +- .../sql/src/main/resources/fulltext.csv-spec | 21 + 10 files changed, 996 insertions(+), 868 deletions(-) diff --git a/x-pack/plugin/sql/src/main/antlr/SqlBase.g4 b/x-pack/plugin/sql/src/main/antlr/SqlBase.g4 index 396cc70920aeb..ca6fdece28153 100644 --- a/x-pack/plugin/sql/src/main/antlr/SqlBase.g4 +++ b/x-pack/plugin/sql/src/main/antlr/SqlBase.g4 @@ -163,14 +163,18 @@ expression booleanExpression : NOT booleanExpression #logicalNot | EXISTS '(' query ')' #exists - | QUERY '(' queryString=string (',' options=string)* ')' #stringQuery - | MATCH '(' singleField=qualifiedName ',' queryString=string (',' options=string)* ')' #matchQuery - | MATCH '(' multiFields=string ',' queryString=string (',' options=string)* ')' #multiMatchQuery + | QUERY '(' queryString=string matchQueryOptions ')' #stringQuery + | MATCH '(' singleField=qualifiedName ',' queryString=string matchQueryOptions ')' #matchQuery + | MATCH '(' multiFields=string ',' queryString=string matchQueryOptions ')' #multiMatchQuery | predicated #booleanDefault | left=booleanExpression operator=AND right=booleanExpression #logicalBinary | left=booleanExpression operator=OR right=booleanExpression #logicalBinary ; +matchQueryOptions + : (',' string)* + ; + // workaround for: // https://github.com/antlr/antlr4/issues/780 // https://github.com/antlr/antlr4/issues/781 diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextUtils.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextUtils.java index f22f46cad2b03..bb57c7a154930 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextUtils.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextUtils.java @@ -5,16 +5,16 @@ */ package org.elasticsearch.xpack.sql.expression.predicate.fulltext; -import java.util.LinkedHashMap; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - import org.elasticsearch.common.Strings; import org.elasticsearch.xpack.sql.expression.predicate.fulltext.FullTextPredicate.Operator; import org.elasticsearch.xpack.sql.parser.ParsingException; import org.elasticsearch.xpack.sql.tree.Location; +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + import static java.util.Collections.emptyMap; abstract class FullTextUtils { @@ -26,7 +26,7 @@ static Map parseSettings(String options, Location location) { return emptyMap(); } String[] list = Strings.delimitedListToStringArray(options, DELIMITER); - Map op = new LinkedHashMap(list.length); + Map op = new LinkedHashMap<>(list.length); for (String entry : list) { String[] split = splitInTwo(entry, "="); diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java index 2719d39bbecb2..539713f3285b5 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/ExpressionBuilder.java @@ -67,6 +67,7 @@ import org.elasticsearch.xpack.sql.parser.SqlBaseParser.LogicalBinaryContext; import org.elasticsearch.xpack.sql.parser.SqlBaseParser.LogicalNotContext; import org.elasticsearch.xpack.sql.parser.SqlBaseParser.MatchQueryContext; +import org.elasticsearch.xpack.sql.parser.SqlBaseParser.MatchQueryOptionsContext; import org.elasticsearch.xpack.sql.parser.SqlBaseParser.MultiMatchQueryContext; import org.elasticsearch.xpack.sql.parser.SqlBaseParser.NullLiteralContext; import org.elasticsearch.xpack.sql.parser.SqlBaseParser.OrderByContext; @@ -99,6 +100,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.StringJoiner; import static java.util.Collections.singletonList; import static org.elasticsearch.xpack.sql.type.DataTypeConversion.conversionFor; @@ -324,18 +326,27 @@ public Object visitArithmeticBinary(ArithmeticBinaryContext ctx) { // @Override public Object visitStringQuery(StringQueryContext ctx) { - return new StringQueryPredicate(source(ctx), string(ctx.queryString), string(ctx.options)); + return new StringQueryPredicate(source(ctx), string(ctx.queryString), getQueryOptions(ctx.matchQueryOptions())); } @Override public Object visitMatchQuery(MatchQueryContext ctx) { return new MatchQueryPredicate(source(ctx), new UnresolvedAttribute(source(ctx.singleField), - visitQualifiedName(ctx.singleField)), string(ctx.queryString), string(ctx.options)); + visitQualifiedName(ctx.singleField)), string(ctx.queryString), getQueryOptions(ctx.matchQueryOptions())); } @Override public Object visitMultiMatchQuery(MultiMatchQueryContext ctx) { - return new MultiMatchQueryPredicate(source(ctx), string(ctx.multiFields), string(ctx.queryString), string(ctx.options)); + return new MultiMatchQueryPredicate(source(ctx), string(ctx.multiFields), string(ctx.queryString), + getQueryOptions(ctx.matchQueryOptions())); + } + + private String getQueryOptions(MatchQueryOptionsContext optionsCtx) { + StringJoiner sj = new StringJoiner(";"); + for (StringContext sc: optionsCtx.string()) { + sj.add(string(sc)); + } + return sj.toString(); } @Override @@ -676,4 +687,4 @@ public Literal visitGuidEscapedLiteral(GuidEscapedLiteralContext ctx) { return new Literal(source(ctx), string, DataType.KEYWORD); } -} \ No newline at end of file +} diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseListener.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseListener.java index 8f261c0d3d001..d3c025d240c16 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseListener.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseListener.java @@ -527,6 +527,18 @@ class SqlBaseBaseListener implements SqlBaseListener { *

The default implementation does nothing.

*/ @Override public void exitLogicalBinary(SqlBaseParser.LogicalBinaryContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMatchQueryOptions(SqlBaseParser.MatchQueryOptionsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMatchQueryOptions(SqlBaseParser.MatchQueryOptionsContext ctx) { } /** * {@inheritDoc} * diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseVisitor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseVisitor.java index 837e5057c36d5..8e7603947e799 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseVisitor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseBaseVisitor.java @@ -312,6 +312,13 @@ class SqlBaseBaseVisitor extends AbstractParseTreeVisitor implements SqlBa * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitLogicalBinary(SqlBaseParser.LogicalBinaryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMatchQueryOptions(SqlBaseParser.MatchQueryOptionsContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseListener.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseListener.java index 82c2ac90e7782..1c7364a970d8c 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseListener.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseListener.java @@ -489,6 +489,16 @@ interface SqlBaseListener extends ParseTreeListener { * @param ctx the parse tree */ void exitLogicalBinary(SqlBaseParser.LogicalBinaryContext ctx); + /** + * Enter a parse tree produced by {@link SqlBaseParser#matchQueryOptions}. + * @param ctx the parse tree + */ + void enterMatchQueryOptions(SqlBaseParser.MatchQueryOptionsContext ctx); + /** + * Exit a parse tree produced by {@link SqlBaseParser#matchQueryOptions}. + * @param ctx the parse tree + */ + void exitMatchQueryOptions(SqlBaseParser.MatchQueryOptionsContext ctx); /** * Enter a parse tree produced by {@link SqlBaseParser#predicated}. * @param ctx the parse tree diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseParser.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseParser.java index 164eacd402bf7..246de0cf1a9fe 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseParser.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseParser.java @@ -40,27 +40,27 @@ class SqlBaseParser extends Parser { RULE_groupingElement = 11, RULE_groupingExpressions = 12, RULE_namedQuery = 13, RULE_setQuantifier = 14, RULE_selectItem = 15, RULE_relation = 16, RULE_joinRelation = 17, RULE_joinType = 18, RULE_joinCriteria = 19, RULE_relationPrimary = 20, - RULE_expression = 21, RULE_booleanExpression = 22, RULE_predicated = 23, - RULE_predicate = 24, RULE_likePattern = 25, RULE_pattern = 26, RULE_patternEscape = 27, - RULE_valueExpression = 28, RULE_primaryExpression = 29, RULE_castExpression = 30, - RULE_castTemplate = 31, RULE_extractExpression = 32, RULE_extractTemplate = 33, - RULE_functionExpression = 34, RULE_functionTemplate = 35, RULE_functionName = 36, - RULE_constant = 37, RULE_comparisonOperator = 38, RULE_booleanValue = 39, - RULE_dataType = 40, RULE_qualifiedName = 41, RULE_identifier = 42, RULE_tableIdentifier = 43, - RULE_quoteIdentifier = 44, RULE_unquoteIdentifier = 45, RULE_number = 46, - RULE_string = 47, RULE_nonReserved = 48; + RULE_expression = 21, RULE_booleanExpression = 22, RULE_matchQueryOptions = 23, + RULE_predicated = 24, RULE_predicate = 25, RULE_likePattern = 26, RULE_pattern = 27, + RULE_patternEscape = 28, RULE_valueExpression = 29, RULE_primaryExpression = 30, + RULE_castExpression = 31, RULE_castTemplate = 32, RULE_extractExpression = 33, + RULE_extractTemplate = 34, RULE_functionExpression = 35, RULE_functionTemplate = 36, + RULE_functionName = 37, RULE_constant = 38, RULE_comparisonOperator = 39, + RULE_booleanValue = 40, RULE_dataType = 41, RULE_qualifiedName = 42, RULE_identifier = 43, + RULE_tableIdentifier = 44, RULE_quoteIdentifier = 45, RULE_unquoteIdentifier = 46, + RULE_number = 47, RULE_string = 48, RULE_nonReserved = 49; public static final String[] ruleNames = { "singleStatement", "singleExpression", "statement", "query", "queryNoWith", "limitClause", "queryTerm", "orderBy", "querySpecification", "fromClause", "groupBy", "groupingElement", "groupingExpressions", "namedQuery", "setQuantifier", "selectItem", "relation", "joinRelation", "joinType", "joinCriteria", - "relationPrimary", "expression", "booleanExpression", "predicated", "predicate", - "likePattern", "pattern", "patternEscape", "valueExpression", "primaryExpression", - "castExpression", "castTemplate", "extractExpression", "extractTemplate", - "functionExpression", "functionTemplate", "functionName", "constant", - "comparisonOperator", "booleanValue", "dataType", "qualifiedName", "identifier", - "tableIdentifier", "quoteIdentifier", "unquoteIdentifier", "number", "string", - "nonReserved" + "relationPrimary", "expression", "booleanExpression", "matchQueryOptions", + "predicated", "predicate", "likePattern", "pattern", "patternEscape", + "valueExpression", "primaryExpression", "castExpression", "castTemplate", + "extractExpression", "extractTemplate", "functionExpression", "functionTemplate", + "functionName", "constant", "comparisonOperator", "booleanValue", "dataType", + "qualifiedName", "identifier", "tableIdentifier", "quoteIdentifier", "unquoteIdentifier", + "number", "string", "nonReserved" }; private static final String[] _LITERAL_NAMES = { @@ -174,9 +174,9 @@ public final SingleStatementContext singleStatement() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(98); + setState(100); statement(); - setState(99); + setState(101); match(EOF); } } @@ -221,9 +221,9 @@ public final SingleExpressionContext singleExpression() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(101); + setState(103); expression(); - setState(102); + setState(104); match(EOF); } } @@ -617,14 +617,14 @@ public final StatementContext statement() throws RecognitionException { enterRule(_localctx, 4, RULE_statement); int _la; try { - setState(204); + setState(206); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { case 1: _localctx = new StatementDefaultContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(104); + setState(106); query(); } break; @@ -632,27 +632,27 @@ public final StatementContext statement() throws RecognitionException { _localctx = new ExplainContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(105); + setState(107); match(EXPLAIN); - setState(119); + setState(121); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: { - setState(106); + setState(108); match(T__0); - setState(115); + setState(117); _errHandler.sync(this); _la = _input.LA(1); while (((((_la - 28)) & ~0x3f) == 0 && ((1L << (_la - 28)) & ((1L << (FORMAT - 28)) | (1L << (PLAN - 28)) | (1L << (VERIFY - 28)))) != 0)) { { - setState(113); + setState(115); switch (_input.LA(1)) { case PLAN: { - setState(107); + setState(109); match(PLAN); - setState(108); + setState(110); ((ExplainContext)_localctx).type = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALL) | (1L << ANALYZED) | (1L << EXECUTABLE) | (1L << MAPPED) | (1L << OPTIMIZED) | (1L << PARSED))) != 0)) ) { @@ -664,9 +664,9 @@ public final StatementContext statement() throws RecognitionException { break; case FORMAT: { - setState(109); + setState(111); match(FORMAT); - setState(110); + setState(112); ((ExplainContext)_localctx).format = _input.LT(1); _la = _input.LA(1); if ( !(_la==GRAPHVIZ || _la==TEXT) ) { @@ -678,9 +678,9 @@ public final StatementContext statement() throws RecognitionException { break; case VERIFY: { - setState(111); + setState(113); match(VERIFY); - setState(112); + setState(114); ((ExplainContext)_localctx).verify = booleanValue(); } break; @@ -688,16 +688,16 @@ public final StatementContext statement() throws RecognitionException { throw new NoViableAltException(this); } } - setState(117); + setState(119); _errHandler.sync(this); _la = _input.LA(1); } - setState(118); + setState(120); match(T__1); } break; } - setState(121); + setState(123); statement(); } break; @@ -705,27 +705,27 @@ public final StatementContext statement() throws RecognitionException { _localctx = new DebugContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(122); + setState(124); match(DEBUG); - setState(134); + setState(136); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) { case 1: { - setState(123); + setState(125); match(T__0); - setState(130); + setState(132); _errHandler.sync(this); _la = _input.LA(1); while (_la==FORMAT || _la==PLAN) { { - setState(128); + setState(130); switch (_input.LA(1)) { case PLAN: { - setState(124); + setState(126); match(PLAN); - setState(125); + setState(127); ((DebugContext)_localctx).type = _input.LT(1); _la = _input.LA(1); if ( !(_la==ANALYZED || _la==OPTIMIZED) ) { @@ -737,9 +737,9 @@ public final StatementContext statement() throws RecognitionException { break; case FORMAT: { - setState(126); + setState(128); match(FORMAT); - setState(127); + setState(129); ((DebugContext)_localctx).format = _input.LT(1); _la = _input.LA(1); if ( !(_la==GRAPHVIZ || _la==TEXT) ) { @@ -753,16 +753,16 @@ public final StatementContext statement() throws RecognitionException { throw new NoViableAltException(this); } } - setState(132); + setState(134); _errHandler.sync(this); _la = _input.LA(1); } - setState(133); + setState(135); match(T__1); } break; } - setState(136); + setState(138); statement(); } break; @@ -770,15 +770,15 @@ public final StatementContext statement() throws RecognitionException { _localctx = new ShowTablesContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(137); + setState(139); match(SHOW); - setState(138); + setState(140); match(TABLES); - setState(141); + setState(143); switch (_input.LA(1)) { case LIKE: { - setState(139); + setState(141); ((ShowTablesContext)_localctx).tableLike = likePattern(); } break; @@ -813,7 +813,7 @@ public final StatementContext statement() throws RecognitionException { case QUOTED_IDENTIFIER: case BACKQUOTED_IDENTIFIER: { - setState(140); + setState(142); ((ShowTablesContext)_localctx).tableIdent = tableIdentifier(); } break; @@ -828,22 +828,22 @@ public final StatementContext statement() throws RecognitionException { _localctx = new ShowColumnsContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(143); + setState(145); match(SHOW); - setState(144); + setState(146); match(COLUMNS); - setState(145); + setState(147); _la = _input.LA(1); if ( !(_la==FROM || _la==IN) ) { _errHandler.recoverInline(this); } else { consume(); } - setState(148); + setState(150); switch (_input.LA(1)) { case LIKE: { - setState(146); + setState(148); ((ShowColumnsContext)_localctx).tableLike = likePattern(); } break; @@ -878,7 +878,7 @@ public final StatementContext statement() throws RecognitionException { case QUOTED_IDENTIFIER: case BACKQUOTED_IDENTIFIER: { - setState(147); + setState(149); ((ShowColumnsContext)_localctx).tableIdent = tableIdentifier(); } break; @@ -891,18 +891,18 @@ public final StatementContext statement() throws RecognitionException { _localctx = new ShowColumnsContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(150); + setState(152); _la = _input.LA(1); if ( !(_la==DESC || _la==DESCRIBE) ) { _errHandler.recoverInline(this); } else { consume(); } - setState(153); + setState(155); switch (_input.LA(1)) { case LIKE: { - setState(151); + setState(153); ((ShowColumnsContext)_localctx).tableLike = likePattern(); } break; @@ -937,7 +937,7 @@ public final StatementContext statement() throws RecognitionException { case QUOTED_IDENTIFIER: case BACKQUOTED_IDENTIFIER: { - setState(152); + setState(154); ((ShowColumnsContext)_localctx).tableIdent = tableIdentifier(); } break; @@ -950,15 +950,15 @@ public final StatementContext statement() throws RecognitionException { _localctx = new ShowFunctionsContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(155); + setState(157); match(SHOW); - setState(156); - match(FUNCTIONS); setState(158); + match(FUNCTIONS); + setState(160); _la = _input.LA(1); if (_la==LIKE) { { - setState(157); + setState(159); likePattern(); } } @@ -969,9 +969,9 @@ public final StatementContext statement() throws RecognitionException { _localctx = new ShowSchemasContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(160); + setState(162); match(SHOW); - setState(161); + setState(163); match(SCHEMAS); } break; @@ -979,9 +979,9 @@ public final StatementContext statement() throws RecognitionException { _localctx = new SysCatalogsContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(162); + setState(164); match(SYS); - setState(163); + setState(165); match(CATALOGS); } break; @@ -989,58 +989,58 @@ public final StatementContext statement() throws RecognitionException { _localctx = new SysTablesContext(_localctx); enterOuterAlt(_localctx, 10); { - setState(164); + setState(166); match(SYS); - setState(165); + setState(167); match(TABLES); - setState(168); + setState(170); _la = _input.LA(1); if (_la==CATALOG) { { - setState(166); + setState(168); match(CATALOG); - setState(167); + setState(169); ((SysTablesContext)_localctx).clusterLike = likePattern(); } } - setState(172); + setState(174); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: { - setState(170); + setState(172); ((SysTablesContext)_localctx).tableLike = likePattern(); } break; case 2: { - setState(171); + setState(173); ((SysTablesContext)_localctx).tableIdent = tableIdentifier(); } break; } - setState(183); + setState(185); _la = _input.LA(1); if (_la==TYPE) { { - setState(174); + setState(176); match(TYPE); - setState(175); + setState(177); string(); - setState(180); + setState(182); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(176); + setState(178); match(T__2); - setState(177); + setState(179); string(); } } - setState(182); + setState(184); _errHandler.sync(this); _la = _input.LA(1); } @@ -1053,28 +1053,28 @@ public final StatementContext statement() throws RecognitionException { _localctx = new SysColumnsContext(_localctx); enterOuterAlt(_localctx, 11); { - setState(185); + setState(187); match(SYS); - setState(186); + setState(188); match(COLUMNS); - setState(189); + setState(191); _la = _input.LA(1); if (_la==CATALOG) { { - setState(187); + setState(189); match(CATALOG); - setState(188); + setState(190); ((SysColumnsContext)_localctx).cluster = string(); } } - setState(194); + setState(196); switch (_input.LA(1)) { case TABLE: { - setState(191); + setState(193); match(TABLE); - setState(192); + setState(194); ((SysColumnsContext)_localctx).tableLike = likePattern(); } break; @@ -1109,7 +1109,7 @@ public final StatementContext statement() throws RecognitionException { case QUOTED_IDENTIFIER: case BACKQUOTED_IDENTIFIER: { - setState(193); + setState(195); ((SysColumnsContext)_localctx).tableIdent = tableIdentifier(); } break; @@ -1119,11 +1119,11 @@ public final StatementContext statement() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(197); + setState(199); _la = _input.LA(1); if (_la==LIKE) { { - setState(196); + setState(198); ((SysColumnsContext)_localctx).columnPattern = likePattern(); } } @@ -1134,9 +1134,9 @@ public final StatementContext statement() throws RecognitionException { _localctx = new SysTypesContext(_localctx); enterOuterAlt(_localctx, 12); { - setState(199); + setState(201); match(SYS); - setState(200); + setState(202); match(TYPES); } break; @@ -1144,11 +1144,11 @@ public final StatementContext statement() throws RecognitionException { _localctx = new SysTableTypesContext(_localctx); enterOuterAlt(_localctx, 13); { - setState(201); + setState(203); match(SYS); - setState(202); + setState(204); match(TABLE); - setState(203); + setState(205); match(TYPES); } break; @@ -1202,34 +1202,34 @@ public final QueryContext query() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(215); + setState(217); _la = _input.LA(1); if (_la==WITH) { { - setState(206); + setState(208); match(WITH); - setState(207); + setState(209); namedQuery(); - setState(212); + setState(214); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(208); + setState(210); match(T__2); - setState(209); + setState(211); namedQuery(); } } - setState(214); + setState(216); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(217); + setState(219); queryNoWith(); } } @@ -1285,42 +1285,42 @@ public final QueryNoWithContext queryNoWith() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(219); + setState(221); queryTerm(); - setState(230); + setState(232); _la = _input.LA(1); if (_la==ORDER) { { - setState(220); + setState(222); match(ORDER); - setState(221); + setState(223); match(BY); - setState(222); + setState(224); orderBy(); - setState(227); + setState(229); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(223); + setState(225); match(T__2); - setState(224); + setState(226); orderBy(); } } - setState(229); + setState(231); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(233); + setState(235); _la = _input.LA(1); if (_la==LIMIT || _la==LIMIT_ESC) { { - setState(232); + setState(234); limitClause(); } } @@ -1369,14 +1369,14 @@ public final LimitClauseContext limitClause() throws RecognitionException { enterRule(_localctx, 10, RULE_limitClause); int _la; try { - setState(240); + setState(242); switch (_input.LA(1)) { case LIMIT: enterOuterAlt(_localctx, 1); { - setState(235); + setState(237); match(LIMIT); - setState(236); + setState(238); ((LimitClauseContext)_localctx).limit = _input.LT(1); _la = _input.LA(1); if ( !(_la==ALL || _la==INTEGER_VALUE) ) { @@ -1389,9 +1389,9 @@ public final LimitClauseContext limitClause() throws RecognitionException { case LIMIT_ESC: enterOuterAlt(_localctx, 2); { - setState(237); + setState(239); match(LIMIT_ESC); - setState(238); + setState(240); ((LimitClauseContext)_localctx).limit = _input.LT(1); _la = _input.LA(1); if ( !(_la==ALL || _la==INTEGER_VALUE) ) { @@ -1399,7 +1399,7 @@ public final LimitClauseContext limitClause() throws RecognitionException { } else { consume(); } - setState(239); + setState(241); match(ESC_END); } break; @@ -1472,13 +1472,13 @@ public final QueryTermContext queryTerm() throws RecognitionException { QueryTermContext _localctx = new QueryTermContext(_ctx, getState()); enterRule(_localctx, 12, RULE_queryTerm); try { - setState(247); + setState(249); switch (_input.LA(1)) { case SELECT: _localctx = new QueryPrimaryDefaultContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(242); + setState(244); querySpecification(); } break; @@ -1486,11 +1486,11 @@ public final QueryTermContext queryTerm() throws RecognitionException { _localctx = new SubqueryContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(243); + setState(245); match(T__0); - setState(244); + setState(246); queryNoWith(); - setState(245); + setState(247); match(T__1); } break; @@ -1542,13 +1542,13 @@ public final OrderByContext orderBy() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(249); - expression(); setState(251); + expression(); + setState(253); _la = _input.LA(1); if (_la==ASC || _la==DESC) { { - setState(250); + setState(252); ((OrderByContext)_localctx).ordering = _input.LT(1); _la = _input.LA(1); if ( !(_la==ASC || _la==DESC) ) { @@ -1627,75 +1627,75 @@ public final QuerySpecificationContext querySpecification() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(253); - match(SELECT); setState(255); + match(SELECT); + setState(257); _la = _input.LA(1); if (_la==ALL || _la==DISTINCT) { { - setState(254); + setState(256); setQuantifier(); } } - setState(257); + setState(259); selectItem(); - setState(262); + setState(264); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(258); + setState(260); match(T__2); - setState(259); + setState(261); selectItem(); } } - setState(264); + setState(266); _errHandler.sync(this); _la = _input.LA(1); } - setState(266); + setState(268); _la = _input.LA(1); if (_la==FROM) { { - setState(265); + setState(267); fromClause(); } } - setState(270); + setState(272); _la = _input.LA(1); if (_la==WHERE) { { - setState(268); + setState(270); match(WHERE); - setState(269); + setState(271); ((QuerySpecificationContext)_localctx).where = booleanExpression(0); } } - setState(275); + setState(277); _la = _input.LA(1); if (_la==GROUP) { { - setState(272); + setState(274); match(GROUP); - setState(273); + setState(275); match(BY); - setState(274); + setState(276); groupBy(); } } - setState(279); + setState(281); _la = _input.LA(1); if (_la==HAVING) { { - setState(277); + setState(279); match(HAVING); - setState(278); + setState(280); ((QuerySpecificationContext)_localctx).having = booleanExpression(0); } } @@ -1747,23 +1747,23 @@ public final FromClauseContext fromClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(281); + setState(283); match(FROM); - setState(282); + setState(284); relation(); - setState(287); + setState(289); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(283); + setState(285); match(T__2); - setState(284); + setState(286); relation(); } } - setState(289); + setState(291); _errHandler.sync(this); _la = _input.LA(1); } @@ -1816,30 +1816,30 @@ public final GroupByContext groupBy() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(291); + setState(293); _la = _input.LA(1); if (_la==ALL || _la==DISTINCT) { { - setState(290); + setState(292); setQuantifier(); } } - setState(293); + setState(295); groupingElement(); - setState(298); + setState(300); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(294); + setState(296); match(T__2); - setState(295); + setState(297); groupingElement(); } } - setState(300); + setState(302); _errHandler.sync(this); _la = _input.LA(1); } @@ -1894,7 +1894,7 @@ public final GroupingElementContext groupingElement() throws RecognitionExceptio _localctx = new SingleGroupingSetContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(301); + setState(303); groupingExpressions(); } } @@ -1940,47 +1940,47 @@ public final GroupingExpressionsContext groupingExpressions() throws Recognition enterRule(_localctx, 24, RULE_groupingExpressions); int _la; try { - setState(316); + setState(318); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(303); + setState(305); match(T__0); - setState(312); + setState(314); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << LEFT) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RIGHT) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TEXT - 64)) | (1L << (TRUE - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (FUNCTION_ESC - 64)) | (1L << (DATE_ESC - 64)) | (1L << (TIME_ESC - 64)) | (1L << (TIMESTAMP_ESC - 64)) | (1L << (GUID_ESC - 64)) | (1L << (PLUS - 64)) | (1L << (MINUS - 64)) | (1L << (ASTERISK - 64)) | (1L << (PARAM - 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)) { { - setState(304); + setState(306); expression(); - setState(309); + setState(311); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(305); + setState(307); match(T__2); - setState(306); + setState(308); expression(); } } - setState(311); + setState(313); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(314); + setState(316); match(T__1); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(315); + setState(317); expression(); } break; @@ -2031,15 +2031,15 @@ public final NamedQueryContext namedQuery() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(318); + setState(320); ((NamedQueryContext)_localctx).name = identifier(); - setState(319); + setState(321); match(AS); - setState(320); + setState(322); match(T__0); - setState(321); + setState(323); queryNoWith(); - setState(322); + setState(324); match(T__1); } } @@ -2083,7 +2083,7 @@ public final SetQuantifierContext setQuantifier() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(324); + setState(326); _la = _input.LA(1); if ( !(_la==ALL || _la==DISTINCT) ) { _errHandler.recoverInline(this); @@ -2146,22 +2146,22 @@ public final SelectItemContext selectItem() throws RecognitionException { _localctx = new SelectExpressionContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(326); + setState(328); expression(); - setState(331); + setState(333); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (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))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) { { - setState(328); + setState(330); _la = _input.LA(1); if (_la==AS) { { - setState(327); + setState(329); match(AS); } } - setState(330); + setState(332); identifier(); } } @@ -2215,19 +2215,19 @@ public final RelationContext relation() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(333); + setState(335); relationPrimary(); - setState(337); + setState(339); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FULL) | (1L << INNER) | (1L << JOIN) | (1L << LEFT) | (1L << NATURAL) | (1L << RIGHT))) != 0)) { { { - setState(334); + setState(336); joinRelation(); } } - setState(339); + setState(341); _errHandler.sync(this); _la = _input.LA(1); } @@ -2281,7 +2281,7 @@ public final JoinRelationContext joinRelation() throws RecognitionException { enterRule(_localctx, 34, RULE_joinRelation); int _la; try { - setState(351); + setState(353); switch (_input.LA(1)) { case FULL: case INNER: @@ -2291,18 +2291,18 @@ public final JoinRelationContext joinRelation() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(340); + setState(342); joinType(); } - setState(341); + setState(343); match(JOIN); - setState(342); - ((JoinRelationContext)_localctx).right = relationPrimary(); setState(344); + ((JoinRelationContext)_localctx).right = relationPrimary(); + setState(346); _la = _input.LA(1); if (_la==ON || _la==USING) { { - setState(343); + setState(345); joinCriteria(); } } @@ -2312,13 +2312,13 @@ public final JoinRelationContext joinRelation() throws RecognitionException { case NATURAL: enterOuterAlt(_localctx, 2); { - setState(346); + setState(348); match(NATURAL); - setState(347); + setState(349); joinType(); - setState(348); + setState(350); match(JOIN); - setState(349); + setState(351); ((JoinRelationContext)_localctx).right = relationPrimary(); } break; @@ -2367,17 +2367,17 @@ public final JoinTypeContext joinType() throws RecognitionException { enterRule(_localctx, 36, RULE_joinType); int _la; try { - setState(368); + setState(370); switch (_input.LA(1)) { case INNER: case JOIN: enterOuterAlt(_localctx, 1); { - setState(354); + setState(356); _la = _input.LA(1); if (_la==INNER) { { - setState(353); + setState(355); match(INNER); } } @@ -2387,13 +2387,13 @@ public final JoinTypeContext joinType() throws RecognitionException { case LEFT: enterOuterAlt(_localctx, 2); { - setState(356); - match(LEFT); setState(358); + match(LEFT); + setState(360); _la = _input.LA(1); if (_la==OUTER) { { - setState(357); + setState(359); match(OUTER); } } @@ -2403,13 +2403,13 @@ public final JoinTypeContext joinType() throws RecognitionException { case RIGHT: enterOuterAlt(_localctx, 3); { - setState(360); - match(RIGHT); setState(362); + match(RIGHT); + setState(364); _la = _input.LA(1); if (_la==OUTER) { { - setState(361); + setState(363); match(OUTER); } } @@ -2419,13 +2419,13 @@ public final JoinTypeContext joinType() throws RecognitionException { case FULL: enterOuterAlt(_localctx, 4); { - setState(364); - match(FULL); setState(366); + match(FULL); + setState(368); _la = _input.LA(1); if (_la==OUTER) { { - setState(365); + setState(367); match(OUTER); } } @@ -2483,43 +2483,43 @@ public final JoinCriteriaContext joinCriteria() throws RecognitionException { enterRule(_localctx, 38, RULE_joinCriteria); int _la; try { - setState(384); + setState(386); switch (_input.LA(1)) { case ON: enterOuterAlt(_localctx, 1); { - setState(370); + setState(372); match(ON); - setState(371); + setState(373); booleanExpression(0); } break; case USING: enterOuterAlt(_localctx, 2); { - setState(372); + setState(374); match(USING); - setState(373); + setState(375); match(T__0); - setState(374); + setState(376); identifier(); - setState(379); + setState(381); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(375); + setState(377); match(T__2); - setState(376); + setState(378); identifier(); } } - setState(381); + setState(383); _errHandler.sync(this); _la = _input.LA(1); } - setState(382); + setState(384); match(T__1); } break; @@ -2624,29 +2624,29 @@ public final RelationPrimaryContext relationPrimary() throws RecognitionExceptio enterRule(_localctx, 40, RULE_relationPrimary); int _la; try { - setState(411); + setState(413); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { case 1: _localctx = new TableNameContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(386); + setState(388); tableIdentifier(); - setState(391); + setState(393); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (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))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) { { - setState(388); + setState(390); _la = _input.LA(1); if (_la==AS) { { - setState(387); + setState(389); match(AS); } } - setState(390); + setState(392); qualifiedName(); } } @@ -2657,26 +2657,26 @@ public final RelationPrimaryContext relationPrimary() throws RecognitionExceptio _localctx = new AliasedQueryContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(393); + setState(395); match(T__0); - setState(394); + setState(396); queryNoWith(); - setState(395); + setState(397); match(T__1); - setState(400); + setState(402); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (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))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) { { - setState(397); + setState(399); _la = _input.LA(1); if (_la==AS) { { - setState(396); + setState(398); match(AS); } } - setState(399); + setState(401); qualifiedName(); } } @@ -2687,26 +2687,26 @@ public final RelationPrimaryContext relationPrimary() throws RecognitionExceptio _localctx = new AliasedRelationContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(402); + setState(404); match(T__0); - setState(403); + setState(405); relation(); - setState(404); + setState(406); match(T__1); - setState(409); + setState(411); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << AS) | (1L << CATALOGS) | (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))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) { { - setState(406); + setState(408); _la = _input.LA(1); if (_la==AS) { { - setState(405); + setState(407); match(AS); } } - setState(408); + setState(410); qualifiedName(); } } @@ -2755,7 +2755,7 @@ public final ExpressionContext expression() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(413); + setState(415); booleanExpression(0); } } @@ -2803,13 +2803,12 @@ public T accept(ParseTreeVisitor visitor) { } public static class StringQueryContext extends BooleanExpressionContext { public StringContext queryString; - public StringContext options; public TerminalNode QUERY() { return getToken(SqlBaseParser.QUERY, 0); } - public List string() { - return getRuleContexts(StringContext.class); + public MatchQueryOptionsContext matchQueryOptions() { + return getRuleContext(MatchQueryOptionsContext.class,0); } - public StringContext string(int i) { - return getRuleContext(StringContext.class,i); + public StringContext string() { + return getRuleContext(StringContext.class,0); } public StringQueryContext(BooleanExpressionContext ctx) { copyFrom(ctx); } @Override @@ -2868,8 +2867,10 @@ public T accept(ParseTreeVisitor visitor) { public static class MultiMatchQueryContext extends BooleanExpressionContext { public StringContext multiFields; public StringContext queryString; - public StringContext options; public TerminalNode MATCH() { return getToken(SqlBaseParser.MATCH, 0); } + public MatchQueryOptionsContext matchQueryOptions() { + return getRuleContext(MatchQueryOptionsContext.class,0); + } public List string() { return getRuleContexts(StringContext.class); } @@ -2894,16 +2895,15 @@ public T accept(ParseTreeVisitor visitor) { public static class MatchQueryContext extends BooleanExpressionContext { public QualifiedNameContext singleField; public StringContext queryString; - public StringContext options; public TerminalNode MATCH() { return getToken(SqlBaseParser.MATCH, 0); } + public MatchQueryOptionsContext matchQueryOptions() { + return getRuleContext(MatchQueryOptionsContext.class,0); + } public QualifiedNameContext qualifiedName() { return getRuleContext(QualifiedNameContext.class,0); } - public List string() { - return getRuleContexts(StringContext.class); - } - public StringContext string(int i) { - return getRuleContext(StringContext.class,i); + public StringContext string() { + return getRuleContext(StringContext.class,0); } public MatchQueryContext(BooleanExpressionContext ctx) { copyFrom(ctx); } @Override @@ -2959,23 +2959,22 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc BooleanExpressionContext _prevctx = _localctx; int _startState = 44; enterRecursionRule(_localctx, 44, RULE_booleanExpression, _p); - int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(464); + setState(448); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: { _localctx = new LogicalNotContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(416); + setState(418); match(NOT); - setState(417); + setState(419); booleanExpression(8); } break; @@ -2984,13 +2983,13 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new ExistsContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(418); + setState(420); match(EXISTS); - setState(419); + setState(421); match(T__0); - setState(420); + setState(422); query(); - setState(421); + setState(423); match(T__1); } break; @@ -2999,29 +2998,15 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new StringQueryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(423); + setState(425); match(QUERY); - setState(424); + setState(426); match(T__0); - setState(425); + setState(427); ((StringQueryContext)_localctx).queryString = string(); - setState(430); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==T__2) { - { - { - setState(426); - match(T__2); - setState(427); - ((StringQueryContext)_localctx).options = string(); - } - } - setState(432); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(433); + setState(428); + matchQueryOptions(); + setState(429); match(T__1); } break; @@ -3030,33 +3015,19 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new MatchQueryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(435); + setState(431); match(MATCH); - setState(436); + setState(432); match(T__0); - setState(437); + setState(433); ((MatchQueryContext)_localctx).singleField = qualifiedName(); - setState(438); + setState(434); match(T__2); - setState(439); + setState(435); ((MatchQueryContext)_localctx).queryString = string(); - setState(444); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==T__2) { - { - { - setState(440); - match(T__2); - setState(441); - ((MatchQueryContext)_localctx).options = string(); - } - } - setState(446); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(447); + setState(436); + matchQueryOptions(); + setState(437); match(T__1); } break; @@ -3065,33 +3036,19 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new MultiMatchQueryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(449); + setState(439); match(MATCH); - setState(450); + setState(440); match(T__0); - setState(451); + setState(441); ((MultiMatchQueryContext)_localctx).multiFields = string(); - setState(452); + setState(442); match(T__2); - setState(453); + setState(443); ((MultiMatchQueryContext)_localctx).queryString = string(); - setState(458); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==T__2) { - { - { - setState(454); - match(T__2); - setState(455); - ((MultiMatchQueryContext)_localctx).options = string(); - } - } - setState(460); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(461); + setState(444); + matchQueryOptions(); + setState(445); match(T__1); } break; @@ -3100,33 +3057,33 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new BooleanDefaultContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(463); + setState(447); predicated(); } break; } _ctx.stop = _input.LT(-1); - setState(474); + setState(458); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,62,_ctx); + _alt = getInterpreter().adaptivePredict(_input,59,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(472); + setState(456); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: { _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(466); + setState(450); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(467); + setState(451); ((LogicalBinaryContext)_localctx).operator = match(AND); - setState(468); + setState(452); ((LogicalBinaryContext)_localctx).right = booleanExpression(3); } break; @@ -3135,20 +3092,20 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(469); + setState(453); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(470); + setState(454); ((LogicalBinaryContext)_localctx).operator = match(OR); - setState(471); + setState(455); ((LogicalBinaryContext)_localctx).right = booleanExpression(2); } break; } } } - setState(476); + setState(460); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,62,_ctx); + _alt = getInterpreter().adaptivePredict(_input,59,_ctx); } } } @@ -3163,6 +3120,68 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc return _localctx; } + public static class MatchQueryOptionsContext extends ParserRuleContext { + public List string() { + return getRuleContexts(StringContext.class); + } + public StringContext string(int i) { + return getRuleContext(StringContext.class,i); + } + public MatchQueryOptionsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_matchQueryOptions; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SqlBaseListener ) ((SqlBaseListener)listener).enterMatchQueryOptions(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SqlBaseListener ) ((SqlBaseListener)listener).exitMatchQueryOptions(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof SqlBaseVisitor ) return ((SqlBaseVisitor)visitor).visitMatchQueryOptions(this); + else return visitor.visitChildren(this); + } + } + + public final MatchQueryOptionsContext matchQueryOptions() throws RecognitionException { + MatchQueryOptionsContext _localctx = new MatchQueryOptionsContext(_ctx, getState()); + enterRule(_localctx, 46, RULE_matchQueryOptions); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(465); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==T__2) { + { + { + setState(461); + match(T__2); + setState(462); + string(); + } + } + setState(467); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class PredicatedContext extends ParserRuleContext { public ValueExpressionContext valueExpression() { return getRuleContext(ValueExpressionContext.class,0); @@ -3191,18 +3210,18 @@ public T accept(ParseTreeVisitor visitor) { public final PredicatedContext predicated() throws RecognitionException { PredicatedContext _localctx = new PredicatedContext(_ctx, getState()); - enterRule(_localctx, 46, RULE_predicated); + enterRule(_localctx, 48, RULE_predicated); try { enterOuterAlt(_localctx, 1); { - setState(477); + setState(468); valueExpression(0); - setState(479); + setState(470); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { case 1: { - setState(478); + setState(469); predicate(); } break; @@ -3275,145 +3294,145 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateContext predicate() throws RecognitionException { PredicateContext _localctx = new PredicateContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_predicate); + enterRule(_localctx, 50, RULE_predicate); int _la; try { - setState(527); + setState(518); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(482); + setState(473); _la = _input.LA(1); if (_la==NOT) { { - setState(481); + setState(472); match(NOT); } } - setState(484); + setState(475); ((PredicateContext)_localctx).kind = match(BETWEEN); - setState(485); + setState(476); ((PredicateContext)_localctx).lower = valueExpression(0); - setState(486); + setState(477); match(AND); - setState(487); + setState(478); ((PredicateContext)_localctx).upper = valueExpression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(490); + setState(481); _la = _input.LA(1); if (_la==NOT) { { - setState(489); + setState(480); match(NOT); } } - setState(492); + setState(483); ((PredicateContext)_localctx).kind = match(IN); - setState(493); + setState(484); match(T__0); - setState(494); + setState(485); expression(); - setState(499); + setState(490); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(495); + setState(486); match(T__2); - setState(496); + setState(487); expression(); } } - setState(501); + setState(492); _errHandler.sync(this); _la = _input.LA(1); } - setState(502); + setState(493); match(T__1); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(505); + setState(496); _la = _input.LA(1); if (_la==NOT) { { - setState(504); + setState(495); match(NOT); } } - setState(507); + setState(498); ((PredicateContext)_localctx).kind = match(IN); - setState(508); + setState(499); match(T__0); - setState(509); + setState(500); query(); - setState(510); + setState(501); match(T__1); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(513); + setState(504); _la = _input.LA(1); if (_la==NOT) { { - setState(512); + setState(503); match(NOT); } } - setState(515); + setState(506); ((PredicateContext)_localctx).kind = match(LIKE); - setState(516); + setState(507); pattern(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(518); + setState(509); _la = _input.LA(1); if (_la==NOT) { { - setState(517); + setState(508); match(NOT); } } - setState(520); + setState(511); ((PredicateContext)_localctx).kind = match(RLIKE); - setState(521); + setState(512); ((PredicateContext)_localctx).regex = string(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(522); + setState(513); match(IS); - setState(524); + setState(515); _la = _input.LA(1); if (_la==NOT) { { - setState(523); + setState(514); match(NOT); } } - setState(526); + setState(517); ((PredicateContext)_localctx).kind = match(NULL); } break; @@ -3456,13 +3475,13 @@ public T accept(ParseTreeVisitor visitor) { public final LikePatternContext likePattern() throws RecognitionException { LikePatternContext _localctx = new LikePatternContext(_ctx, getState()); - enterRule(_localctx, 50, RULE_likePattern); + enterRule(_localctx, 52, RULE_likePattern); try { enterOuterAlt(_localctx, 1); { - setState(529); + setState(520); match(LIKE); - setState(530); + setState(521); pattern(); } } @@ -3506,18 +3525,18 @@ public T accept(ParseTreeVisitor visitor) { public final PatternContext pattern() throws RecognitionException { PatternContext _localctx = new PatternContext(_ctx, getState()); - enterRule(_localctx, 52, RULE_pattern); + enterRule(_localctx, 54, RULE_pattern); try { enterOuterAlt(_localctx, 1); { - setState(532); + setState(523); ((PatternContext)_localctx).value = string(); - setState(534); + setState(525); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { case 1: { - setState(533); + setState(524); patternEscape(); } break; @@ -3563,27 +3582,27 @@ public T accept(ParseTreeVisitor visitor) { public final PatternEscapeContext patternEscape() throws RecognitionException { PatternEscapeContext _localctx = new PatternEscapeContext(_ctx, getState()); - enterRule(_localctx, 54, RULE_patternEscape); + enterRule(_localctx, 56, RULE_patternEscape); try { - setState(542); + setState(533); switch (_input.LA(1)) { case ESCAPE: enterOuterAlt(_localctx, 1); { - setState(536); + setState(527); match(ESCAPE); - setState(537); + setState(528); ((PatternEscapeContext)_localctx).escape = string(); } break; case ESCAPE_ESC: enterOuterAlt(_localctx, 2); { - setState(538); + setState(529); match(ESCAPE_ESC); - setState(539); + setState(530); ((PatternEscapeContext)_localctx).escape = string(); - setState(540); + setState(531); match(ESC_END); } break; @@ -3721,23 +3740,23 @@ private ValueExpressionContext valueExpression(int _p) throws RecognitionExcepti int _parentState = getState(); ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, _parentState); ValueExpressionContext _prevctx = _localctx; - int _startState = 56; - enterRecursionRule(_localctx, 56, RULE_valueExpression, _p); + int _startState = 58; + enterRecursionRule(_localctx, 58, RULE_valueExpression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(548); + setState(539); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { case 1: { _localctx = new ValueExpressionDefaultContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(545); + setState(536); primaryExpression(); } break; @@ -3746,7 +3765,7 @@ private ValueExpressionContext valueExpression(int _p) throws RecognitionExcepti _localctx = new ArithmeticUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(546); + setState(537); ((ArithmeticUnaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -3754,31 +3773,31 @@ private ValueExpressionContext valueExpression(int _p) throws RecognitionExcepti } else { consume(); } - setState(547); + setState(538); valueExpression(4); } break; } _ctx.stop = _input.LT(-1); - setState(562); + setState(553); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,76,_ctx); + _alt = getInterpreter().adaptivePredict(_input,74,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(560); + setState(551); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: { _localctx = new ArithmeticBinaryContext(new ValueExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_valueExpression); - setState(550); + setState(541); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(551); + setState(542); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 88)) & ~0x3f) == 0 && ((1L << (_la - 88)) & ((1L << (ASTERISK - 88)) | (1L << (SLASH - 88)) | (1L << (PERCENT - 88)))) != 0)) ) { @@ -3786,7 +3805,7 @@ private ValueExpressionContext valueExpression(int _p) throws RecognitionExcepti } else { consume(); } - setState(552); + setState(543); ((ArithmeticBinaryContext)_localctx).right = valueExpression(4); } break; @@ -3795,9 +3814,9 @@ private ValueExpressionContext valueExpression(int _p) throws RecognitionExcepti _localctx = new ArithmeticBinaryContext(new ValueExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_valueExpression); - setState(553); + setState(544); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(554); + setState(545); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -3805,7 +3824,7 @@ private ValueExpressionContext valueExpression(int _p) throws RecognitionExcepti } else { consume(); } - setState(555); + setState(546); ((ArithmeticBinaryContext)_localctx).right = valueExpression(3); } break; @@ -3814,20 +3833,20 @@ private ValueExpressionContext valueExpression(int _p) throws RecognitionExcepti _localctx = new ComparisonContext(new ValueExpressionContext(_parentctx, _parentState)); ((ComparisonContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_valueExpression); - setState(556); + setState(547); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(557); + setState(548); comparisonOperator(); - setState(558); + setState(549); ((ComparisonContext)_localctx).right = valueExpression(2); } break; } } } - setState(564); + setState(555); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,76,_ctx); + _alt = getInterpreter().adaptivePredict(_input,74,_ctx); } } } @@ -4029,17 +4048,17 @@ public T accept(ParseTreeVisitor visitor) { public final PrimaryExpressionContext primaryExpression() throws RecognitionException { PrimaryExpressionContext _localctx = new PrimaryExpressionContext(_ctx, getState()); - enterRule(_localctx, 58, RULE_primaryExpression); + enterRule(_localctx, 60, RULE_primaryExpression); int _la; try { - setState(586); + setState(577); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: _localctx = new CastContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(565); + setState(556); castExpression(); } break; @@ -4047,7 +4066,7 @@ public final PrimaryExpressionContext primaryExpression() throws RecognitionExce _localctx = new ExtractContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(566); + setState(557); extractExpression(); } break; @@ -4055,7 +4074,7 @@ public final PrimaryExpressionContext primaryExpression() throws RecognitionExce _localctx = new ConstantDefaultContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(567); + setState(558); constant(); } break; @@ -4063,7 +4082,7 @@ public final PrimaryExpressionContext primaryExpression() throws RecognitionExce _localctx = new StarContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(568); + setState(559); match(ASTERISK); } break; @@ -4071,18 +4090,18 @@ public final PrimaryExpressionContext primaryExpression() throws RecognitionExce _localctx = new StarContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(572); + setState(563); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << CATALOGS) | (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))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) { { - setState(569); + setState(560); qualifiedName(); - setState(570); + setState(561); match(DOT); } } - setState(574); + setState(565); match(ASTERISK); } break; @@ -4090,7 +4109,7 @@ public final PrimaryExpressionContext primaryExpression() throws RecognitionExce _localctx = new FunctionContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(575); + setState(566); functionExpression(); } break; @@ -4098,11 +4117,11 @@ public final PrimaryExpressionContext primaryExpression() throws RecognitionExce _localctx = new SubqueryExpressionContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(576); + setState(567); match(T__0); - setState(577); + setState(568); query(); - setState(578); + setState(569); match(T__1); } break; @@ -4110,7 +4129,7 @@ public final PrimaryExpressionContext primaryExpression() throws RecognitionExce _localctx = new ColumnReferenceContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(580); + setState(571); identifier(); } break; @@ -4118,7 +4137,7 @@ public final PrimaryExpressionContext primaryExpression() throws RecognitionExce _localctx = new DereferenceContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(581); + setState(572); qualifiedName(); } break; @@ -4126,11 +4145,11 @@ public final PrimaryExpressionContext primaryExpression() throws RecognitionExce _localctx = new ParenthesizedExpressionContext(_localctx); enterOuterAlt(_localctx, 10); { - setState(582); + setState(573); match(T__0); - setState(583); + setState(574); expression(); - setState(584); + setState(575); match(T__1); } break; @@ -4174,25 +4193,25 @@ public T accept(ParseTreeVisitor visitor) { public final CastExpressionContext castExpression() throws RecognitionException { CastExpressionContext _localctx = new CastExpressionContext(_ctx, getState()); - enterRule(_localctx, 60, RULE_castExpression); + enterRule(_localctx, 62, RULE_castExpression); try { - setState(593); + setState(584); switch (_input.LA(1)) { case CAST: enterOuterAlt(_localctx, 1); { - setState(588); + setState(579); castTemplate(); } break; case FUNCTION_ESC: enterOuterAlt(_localctx, 2); { - setState(589); + setState(580); match(FUNCTION_ESC); - setState(590); + setState(581); castTemplate(); - setState(591); + setState(582); match(ESC_END); } break; @@ -4241,21 +4260,21 @@ public T accept(ParseTreeVisitor visitor) { public final CastTemplateContext castTemplate() throws RecognitionException { CastTemplateContext _localctx = new CastTemplateContext(_ctx, getState()); - enterRule(_localctx, 62, RULE_castTemplate); + enterRule(_localctx, 64, RULE_castTemplate); try { enterOuterAlt(_localctx, 1); { - setState(595); + setState(586); match(CAST); - setState(596); + setState(587); match(T__0); - setState(597); + setState(588); expression(); - setState(598); + setState(589); match(AS); - setState(599); + setState(590); dataType(); - setState(600); + setState(591); match(T__1); } } @@ -4297,25 +4316,25 @@ public T accept(ParseTreeVisitor visitor) { public final ExtractExpressionContext extractExpression() throws RecognitionException { ExtractExpressionContext _localctx = new ExtractExpressionContext(_ctx, getState()); - enterRule(_localctx, 64, RULE_extractExpression); + enterRule(_localctx, 66, RULE_extractExpression); try { - setState(607); + setState(598); switch (_input.LA(1)) { case EXTRACT: enterOuterAlt(_localctx, 1); { - setState(602); + setState(593); extractTemplate(); } break; case FUNCTION_ESC: enterOuterAlt(_localctx, 2); { - setState(603); + setState(594); match(FUNCTION_ESC); - setState(604); + setState(595); extractTemplate(); - setState(605); + setState(596); match(ESC_END); } break; @@ -4365,21 +4384,21 @@ public T accept(ParseTreeVisitor visitor) { public final ExtractTemplateContext extractTemplate() throws RecognitionException { ExtractTemplateContext _localctx = new ExtractTemplateContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_extractTemplate); + enterRule(_localctx, 68, RULE_extractTemplate); try { enterOuterAlt(_localctx, 1); { - setState(609); + setState(600); match(EXTRACT); - setState(610); + setState(601); match(T__0); - setState(611); + setState(602); ((ExtractTemplateContext)_localctx).field = identifier(); - setState(612); + setState(603); match(FROM); - setState(613); + setState(604); valueExpression(0); - setState(614); + setState(605); match(T__1); } } @@ -4420,9 +4439,9 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionExpressionContext functionExpression() throws RecognitionException { FunctionExpressionContext _localctx = new FunctionExpressionContext(_ctx, getState()); - enterRule(_localctx, 68, RULE_functionExpression); + enterRule(_localctx, 70, RULE_functionExpression); try { - setState(621); + setState(612); switch (_input.LA(1)) { case ANALYZE: case ANALYZED: @@ -4457,18 +4476,18 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx case BACKQUOTED_IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(616); + setState(607); functionTemplate(); } break; case FUNCTION_ESC: enterOuterAlt(_localctx, 2); { - setState(617); + setState(608); match(FUNCTION_ESC); - setState(618); + setState(609); functionTemplate(); - setState(619); + setState(610); match(ESC_END); } break; @@ -4521,50 +4540,50 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTemplateContext functionTemplate() throws RecognitionException { FunctionTemplateContext _localctx = new FunctionTemplateContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_functionTemplate); + enterRule(_localctx, 72, RULE_functionTemplate); int _la; try { enterOuterAlt(_localctx, 1); { - setState(623); + setState(614); functionName(); - setState(624); + setState(615); match(T__0); - setState(636); + setState(627); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ALL) | (1L << ANALYZE) | (1L << ANALYZED) | (1L << CAST) | (1L << CATALOGS) | (1L << COLUMNS) | (1L << DEBUG) | (1L << DISTINCT) | (1L << EXECUTABLE) | (1L << EXISTS) | (1L << EXPLAIN) | (1L << EXTRACT) | (1L << FALSE) | (1L << FORMAT) | (1L << FUNCTIONS) | (1L << GRAPHVIZ) | (1L << LEFT) | (1L << MAPPED) | (1L << MATCH) | (1L << NOT) | (1L << NULL) | (1L << OPTIMIZED) | (1L << PARSED) | (1L << PHYSICAL) | (1L << PLAN) | (1L << RIGHT) | (1L << RLIKE) | (1L << QUERY) | (1L << SCHEMAS) | (1L << SHOW) | (1L << SYS) | (1L << TABLES))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TEXT - 64)) | (1L << (TRUE - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (FUNCTION_ESC - 64)) | (1L << (DATE_ESC - 64)) | (1L << (TIME_ESC - 64)) | (1L << (TIMESTAMP_ESC - 64)) | (1L << (GUID_ESC - 64)) | (1L << (PLUS - 64)) | (1L << (MINUS - 64)) | (1L << (ASTERISK - 64)) | (1L << (PARAM - 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)) { { - setState(626); + setState(617); _la = _input.LA(1); if (_la==ALL || _la==DISTINCT) { { - setState(625); + setState(616); setQuantifier(); } } - setState(628); + setState(619); expression(); - setState(633); + setState(624); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(629); + setState(620); match(T__2); - setState(630); + setState(621); expression(); } } - setState(635); + setState(626); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(638); + setState(629); match(T__1); } } @@ -4606,21 +4625,21 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionNameContext functionName() throws RecognitionException { FunctionNameContext _localctx = new FunctionNameContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_functionName); + enterRule(_localctx, 74, RULE_functionName); try { - setState(643); + setState(634); switch (_input.LA(1)) { case LEFT: enterOuterAlt(_localctx, 1); { - setState(640); + setState(631); match(LEFT); } break; case RIGHT: enterOuterAlt(_localctx, 2); { - setState(641); + setState(632); match(RIGHT); } break; @@ -4655,7 +4674,7 @@ public final FunctionNameContext functionName() throws RecognitionException { case BACKQUOTED_IDENTIFIER: enterOuterAlt(_localctx, 3); { - setState(642); + setState(633); identifier(); } break; @@ -4864,16 +4883,16 @@ public T accept(ParseTreeVisitor visitor) { public final ConstantContext constant() throws RecognitionException { ConstantContext _localctx = new ConstantContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_constant); + enterRule(_localctx, 76, RULE_constant); try { int _alt; - setState(670); + setState(661); switch (_input.LA(1)) { case NULL: _localctx = new NullLiteralContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(645); + setState(636); match(NULL); } break; @@ -4884,7 +4903,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new NumericLiteralContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(646); + setState(637); number(); } break; @@ -4893,7 +4912,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanLiteralContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(647); + setState(638); booleanValue(); } break; @@ -4901,7 +4920,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringLiteralContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(649); + setState(640); _errHandler.sync(this); _alt = 1; do { @@ -4909,7 +4928,7 @@ public final ConstantContext constant() throws RecognitionException { case 1: { { - setState(648); + setState(639); match(STRING); } } @@ -4917,9 +4936,9 @@ public final ConstantContext constant() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(651); + setState(642); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,86,_ctx); + _alt = getInterpreter().adaptivePredict(_input,84,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } break; @@ -4927,7 +4946,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new ParamLiteralContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(653); + setState(644); match(PARAM); } break; @@ -4935,11 +4954,11 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new DateEscapedLiteralContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(654); + setState(645); match(DATE_ESC); - setState(655); + setState(646); string(); - setState(656); + setState(647); match(ESC_END); } break; @@ -4947,11 +4966,11 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new TimeEscapedLiteralContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(658); + setState(649); match(TIME_ESC); - setState(659); + setState(650); string(); - setState(660); + setState(651); match(ESC_END); } break; @@ -4959,11 +4978,11 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new TimestampEscapedLiteralContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(662); + setState(653); match(TIMESTAMP_ESC); - setState(663); + setState(654); string(); - setState(664); + setState(655); match(ESC_END); } break; @@ -4971,11 +4990,11 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new GuidEscapedLiteralContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(666); + setState(657); match(GUID_ESC); - setState(667); + setState(658); string(); - setState(668); + setState(659); match(ESC_END); } break; @@ -5022,12 +5041,12 @@ public T accept(ParseTreeVisitor visitor) { public final ComparisonOperatorContext comparisonOperator() throws RecognitionException { ComparisonOperatorContext _localctx = new ComparisonOperatorContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_comparisonOperator); + enterRule(_localctx, 78, RULE_comparisonOperator); int _la; try { enterOuterAlt(_localctx, 1); { - setState(672); + setState(663); _la = _input.LA(1); if ( !(((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (EQ - 80)) | (1L << (NEQ - 80)) | (1L << (LT - 80)) | (1L << (LTE - 80)) | (1L << (GT - 80)) | (1L << (GTE - 80)))) != 0)) ) { _errHandler.recoverInline(this); @@ -5071,12 +5090,12 @@ public T accept(ParseTreeVisitor visitor) { public final BooleanValueContext booleanValue() throws RecognitionException { BooleanValueContext _localctx = new BooleanValueContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_booleanValue); + enterRule(_localctx, 80, RULE_booleanValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(674); + setState(665); _la = _input.LA(1); if ( !(_la==FALSE || _la==TRUE) ) { _errHandler.recoverInline(this); @@ -5129,12 +5148,12 @@ public T accept(ParseTreeVisitor visitor) { public final DataTypeContext dataType() throws RecognitionException { DataTypeContext _localctx = new DataTypeContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_dataType); + enterRule(_localctx, 82, RULE_dataType); try { _localctx = new PrimitiveDataTypeContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(676); + setState(667); identifier(); } } @@ -5181,30 +5200,30 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedNameContext qualifiedName() throws RecognitionException { QualifiedNameContext _localctx = new QualifiedNameContext(_ctx, getState()); - enterRule(_localctx, 82, RULE_qualifiedName); + enterRule(_localctx, 84, RULE_qualifiedName); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(683); + setState(674); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,88,_ctx); + _alt = getInterpreter().adaptivePredict(_input,86,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(678); + setState(669); identifier(); - setState(679); + setState(670); match(DOT); } } } - setState(685); + setState(676); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,88,_ctx); + _alt = getInterpreter().adaptivePredict(_input,86,_ctx); } - setState(686); + setState(677); identifier(); } } @@ -5247,15 +5266,15 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierContext identifier() throws RecognitionException { IdentifierContext _localctx = new IdentifierContext(_ctx, getState()); - enterRule(_localctx, 84, RULE_identifier); + enterRule(_localctx, 86, RULE_identifier); try { - setState(690); + setState(681); switch (_input.LA(1)) { case QUOTED_IDENTIFIER: case BACKQUOTED_IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(688); + setState(679); quoteIdentifier(); } break; @@ -5288,7 +5307,7 @@ public final IdentifierContext identifier() throws RecognitionException { case DIGIT_IDENTIFIER: enterOuterAlt(_localctx, 2); { - setState(689); + setState(680); unquoteIdentifier(); } break; @@ -5338,46 +5357,46 @@ public T accept(ParseTreeVisitor visitor) { public final TableIdentifierContext tableIdentifier() throws RecognitionException { TableIdentifierContext _localctx = new TableIdentifierContext(_ctx, getState()); - enterRule(_localctx, 86, RULE_tableIdentifier); + enterRule(_localctx, 88, RULE_tableIdentifier); int _la; try { - setState(704); + setState(695); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,92,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(695); + setState(686); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ANALYZE) | (1L << ANALYZED) | (1L << CATALOGS) | (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))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TEXT - 64)) | (1L << (TYPE - 64)) | (1L << (TYPES - 64)) | (1L << (VERIFY - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (DIGIT_IDENTIFIER - 64)) | (1L << (QUOTED_IDENTIFIER - 64)) | (1L << (BACKQUOTED_IDENTIFIER - 64)))) != 0)) { { - setState(692); + setState(683); ((TableIdentifierContext)_localctx).catalog = identifier(); - setState(693); + setState(684); match(T__3); } } - setState(697); + setState(688); match(TABLE_IDENTIFIER); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(701); + setState(692); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { case 1: { - setState(698); + setState(689); ((TableIdentifierContext)_localctx).catalog = identifier(); - setState(699); + setState(690); match(T__3); } break; } - setState(703); + setState(694); ((TableIdentifierContext)_localctx).name = identifier(); } break; @@ -5442,15 +5461,15 @@ public T accept(ParseTreeVisitor visitor) { public final QuoteIdentifierContext quoteIdentifier() throws RecognitionException { QuoteIdentifierContext _localctx = new QuoteIdentifierContext(_ctx, getState()); - enterRule(_localctx, 88, RULE_quoteIdentifier); + enterRule(_localctx, 90, RULE_quoteIdentifier); try { - setState(708); + setState(699); switch (_input.LA(1)) { case QUOTED_IDENTIFIER: _localctx = new QuotedIdentifierContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(706); + setState(697); match(QUOTED_IDENTIFIER); } break; @@ -5458,7 +5477,7 @@ public final QuoteIdentifierContext quoteIdentifier() throws RecognitionExceptio _localctx = new BackQuotedIdentifierContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(707); + setState(698); match(BACKQUOTED_IDENTIFIER); } break; @@ -5528,15 +5547,15 @@ public T accept(ParseTreeVisitor visitor) { public final UnquoteIdentifierContext unquoteIdentifier() throws RecognitionException { UnquoteIdentifierContext _localctx = new UnquoteIdentifierContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_unquoteIdentifier); + enterRule(_localctx, 92, RULE_unquoteIdentifier); try { - setState(713); + setState(704); switch (_input.LA(1)) { case IDENTIFIER: _localctx = new UnquotedIdentifierContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(710); + setState(701); match(IDENTIFIER); } break; @@ -5568,7 +5587,7 @@ public final UnquoteIdentifierContext unquoteIdentifier() throws RecognitionExce _localctx = new UnquotedIdentifierContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(711); + setState(702); nonReserved(); } break; @@ -5576,7 +5595,7 @@ public final UnquoteIdentifierContext unquoteIdentifier() throws RecognitionExce _localctx = new DigitIdentifierContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(712); + setState(703); match(DIGIT_IDENTIFIER); } break; @@ -5647,21 +5666,21 @@ public T accept(ParseTreeVisitor visitor) { public final NumberContext number() throws RecognitionException { NumberContext _localctx = new NumberContext(_ctx, getState()); - enterRule(_localctx, 92, RULE_number); + enterRule(_localctx, 94, RULE_number); int _la; try { - setState(723); + setState(714); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { case 1: _localctx = new DecimalLiteralContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(716); + setState(707); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(715); + setState(706); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -5671,7 +5690,7 @@ public final NumberContext number() throws RecognitionException { } } - setState(718); + setState(709); match(DECIMAL_VALUE); } break; @@ -5679,11 +5698,11 @@ public final NumberContext number() throws RecognitionException { _localctx = new IntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(720); + setState(711); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(719); + setState(710); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -5693,7 +5712,7 @@ public final NumberContext number() throws RecognitionException { } } - setState(722); + setState(713); match(INTEGER_VALUE); } break; @@ -5734,12 +5753,12 @@ public T accept(ParseTreeVisitor visitor) { public final StringContext string() throws RecognitionException { StringContext _localctx = new StringContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_string); + enterRule(_localctx, 96, RULE_string); int _la; try { enterOuterAlt(_localctx, 1); { - setState(725); + setState(716); _la = _input.LA(1); if ( !(_la==PARAM || _la==STRING) ) { _errHandler.recoverInline(this); @@ -5806,12 +5825,12 @@ public T accept(ParseTreeVisitor visitor) { public final NonReservedContext nonReserved() throws RecognitionException { NonReservedContext _localctx = new NonReservedContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_nonReserved); + enterRule(_localctx, 98, RULE_nonReserved); int _la; try { enterOuterAlt(_localctx, 1); { - setState(727); + setState(718); _la = _input.LA(1); if ( !(((((_la - 6)) & ~0x3f) == 0 && ((1L << (_la - 6)) & ((1L << (ANALYZE - 6)) | (1L << (ANALYZED - 6)) | (1L << (CATALOGS - 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 << (TYPE - 6)) | (1L << (TYPES - 6)) | (1L << (VERIFY - 6)))) != 0)) ) { _errHandler.recoverInline(this); @@ -5835,7 +5854,7 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { case 22: return booleanExpression_sempred((BooleanExpressionContext)_localctx, predIndex); - case 28: + case 29: return valueExpression_sempred((ValueExpressionContext)_localctx, predIndex); } return true; @@ -5862,296 +5881,290 @@ private boolean valueExpression_sempred(ValueExpressionContext _localctx, int pr } public static final String _serializedATN = - "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3l\u02dc\4\2\t\2\4"+ + "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3l\u02d3\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"+ "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ - ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\3\2\3\2\3\2\3\3\3"+ - "\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\7\4t\n\4\f\4\16\4w\13\4\3\4"+ - "\5\4z\n\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\7\4\u0083\n\4\f\4\16\4\u0086\13"+ - "\4\3\4\5\4\u0089\n\4\3\4\3\4\3\4\3\4\3\4\5\4\u0090\n\4\3\4\3\4\3\4\3\4"+ - "\3\4\5\4\u0097\n\4\3\4\3\4\3\4\5\4\u009c\n\4\3\4\3\4\3\4\5\4\u00a1\n\4"+ - "\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4\u00ab\n\4\3\4\3\4\5\4\u00af\n\4\3"+ - "\4\3\4\3\4\3\4\7\4\u00b5\n\4\f\4\16\4\u00b8\13\4\5\4\u00ba\n\4\3\4\3\4"+ - "\3\4\3\4\5\4\u00c0\n\4\3\4\3\4\3\4\5\4\u00c5\n\4\3\4\5\4\u00c8\n\4\3\4"+ - "\3\4\3\4\3\4\3\4\5\4\u00cf\n\4\3\5\3\5\3\5\3\5\7\5\u00d5\n\5\f\5\16\5"+ - "\u00d8\13\5\5\5\u00da\n\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\7\6\u00e4\n"+ - "\6\f\6\16\6\u00e7\13\6\5\6\u00e9\n\6\3\6\5\6\u00ec\n\6\3\7\3\7\3\7\3\7"+ - "\3\7\5\7\u00f3\n\7\3\b\3\b\3\b\3\b\3\b\5\b\u00fa\n\b\3\t\3\t\5\t\u00fe"+ - "\n\t\3\n\3\n\5\n\u0102\n\n\3\n\3\n\3\n\7\n\u0107\n\n\f\n\16\n\u010a\13"+ - "\n\3\n\5\n\u010d\n\n\3\n\3\n\5\n\u0111\n\n\3\n\3\n\3\n\5\n\u0116\n\n\3"+ - "\n\3\n\5\n\u011a\n\n\3\13\3\13\3\13\3\13\7\13\u0120\n\13\f\13\16\13\u0123"+ - "\13\13\3\f\5\f\u0126\n\f\3\f\3\f\3\f\7\f\u012b\n\f\f\f\16\f\u012e\13\f"+ - "\3\r\3\r\3\16\3\16\3\16\3\16\7\16\u0136\n\16\f\16\16\16\u0139\13\16\5"+ - "\16\u013b\n\16\3\16\3\16\5\16\u013f\n\16\3\17\3\17\3\17\3\17\3\17\3\17"+ - "\3\20\3\20\3\21\3\21\5\21\u014b\n\21\3\21\5\21\u014e\n\21\3\22\3\22\7"+ - "\22\u0152\n\22\f\22\16\22\u0155\13\22\3\23\3\23\3\23\3\23\5\23\u015b\n"+ - "\23\3\23\3\23\3\23\3\23\3\23\5\23\u0162\n\23\3\24\5\24\u0165\n\24\3\24"+ - "\3\24\5\24\u0169\n\24\3\24\3\24\5\24\u016d\n\24\3\24\3\24\5\24\u0171\n"+ - "\24\5\24\u0173\n\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\7\25\u017c\n\25"+ - "\f\25\16\25\u017f\13\25\3\25\3\25\5\25\u0183\n\25\3\26\3\26\5\26\u0187"+ - "\n\26\3\26\5\26\u018a\n\26\3\26\3\26\3\26\3\26\5\26\u0190\n\26\3\26\5"+ - "\26\u0193\n\26\3\26\3\26\3\26\3\26\5\26\u0199\n\26\3\26\5\26\u019c\n\26"+ - "\5\26\u019e\n\26\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+ - "\3\30\3\30\3\30\3\30\7\30\u01af\n\30\f\30\16\30\u01b2\13\30\3\30\3\30"+ - "\3\30\3\30\3\30\3\30\3\30\3\30\3\30\7\30\u01bd\n\30\f\30\16\30\u01c0\13"+ - "\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\7\30\u01cb\n\30\f\30"+ - "\16\30\u01ce\13\30\3\30\3\30\3\30\5\30\u01d3\n\30\3\30\3\30\3\30\3\30"+ - "\3\30\3\30\7\30\u01db\n\30\f\30\16\30\u01de\13\30\3\31\3\31\5\31\u01e2"+ - "\n\31\3\32\5\32\u01e5\n\32\3\32\3\32\3\32\3\32\3\32\3\32\5\32\u01ed\n"+ - "\32\3\32\3\32\3\32\3\32\3\32\7\32\u01f4\n\32\f\32\16\32\u01f7\13\32\3"+ - "\32\3\32\3\32\5\32\u01fc\n\32\3\32\3\32\3\32\3\32\3\32\3\32\5\32\u0204"+ - "\n\32\3\32\3\32\3\32\5\32\u0209\n\32\3\32\3\32\3\32\3\32\5\32\u020f\n"+ - "\32\3\32\5\32\u0212\n\32\3\33\3\33\3\33\3\34\3\34\5\34\u0219\n\34\3\35"+ - "\3\35\3\35\3\35\3\35\3\35\5\35\u0221\n\35\3\36\3\36\3\36\3\36\5\36\u0227"+ - "\n\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u0233\n\36"+ - "\f\36\16\36\u0236\13\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37\u023f"+ - "\n\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37"+ - "\u024d\n\37\3 \3 \3 \3 \3 \5 \u0254\n \3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3"+ - "\"\3\"\3\"\5\"\u0262\n\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\5$\u0270"+ - "\n$\3%\3%\3%\5%\u0275\n%\3%\3%\3%\7%\u027a\n%\f%\16%\u027d\13%\5%\u027f"+ - "\n%\3%\3%\3&\3&\3&\5&\u0286\n&\3\'\3\'\3\'\3\'\6\'\u028c\n\'\r\'\16\'"+ - "\u028d\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'"+ - "\3\'\5\'\u02a1\n\'\3(\3(\3)\3)\3*\3*\3+\3+\3+\7+\u02ac\n+\f+\16+\u02af"+ - "\13+\3+\3+\3,\3,\5,\u02b5\n,\3-\3-\3-\5-\u02ba\n-\3-\3-\3-\3-\5-\u02c0"+ - "\n-\3-\5-\u02c3\n-\3.\3.\5.\u02c7\n.\3/\3/\3/\5/\u02cc\n/\3\60\5\60\u02cf"+ - "\n\60\3\60\3\60\5\60\u02d3\n\60\3\60\5\60\u02d6\n\60\3\61\3\61\3\62\3"+ - "\62\3\62\2\4.:\63\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62"+ - "\64\668:<>@BDFHJLNPRTVXZ\\^`b\2\20\b\2\7\7\t\t\31\31,,\62\62\66\66\4\2"+ - "\"\"BB\4\2\t\t\62\62\4\2\37\37%%\3\2\25\26\4\2\7\7aa\4\2\r\r\25\25\4\2"+ - "\7\7\27\27\3\2XY\3\2Z\\\3\2RW\4\2\35\35CC\3\2_`\20\2\b\t\22\24\31\31\33"+ - "\33\36\36!\",,\62\62\668:<>?ABDEGG\u0338\2d\3\2\2\2\4g\3\2\2\2\6\u00ce"+ - "\3\2\2\2\b\u00d9\3\2\2\2\n\u00dd\3\2\2\2\f\u00f2\3\2\2\2\16\u00f9\3\2"+ - "\2\2\20\u00fb\3\2\2\2\22\u00ff\3\2\2\2\24\u011b\3\2\2\2\26\u0125\3\2\2"+ - "\2\30\u012f\3\2\2\2\32\u013e\3\2\2\2\34\u0140\3\2\2\2\36\u0146\3\2\2\2"+ - " \u0148\3\2\2\2\"\u014f\3\2\2\2$\u0161\3\2\2\2&\u0172\3\2\2\2(\u0182\3"+ - "\2\2\2*\u019d\3\2\2\2,\u019f\3\2\2\2.\u01d2\3\2\2\2\60\u01df\3\2\2\2\62"+ - "\u0211\3\2\2\2\64\u0213\3\2\2\2\66\u0216\3\2\2\28\u0220\3\2\2\2:\u0226"+ - "\3\2\2\2<\u024c\3\2\2\2>\u0253\3\2\2\2@\u0255\3\2\2\2B\u0261\3\2\2\2D"+ - "\u0263\3\2\2\2F\u026f\3\2\2\2H\u0271\3\2\2\2J\u0285\3\2\2\2L\u02a0\3\2"+ - "\2\2N\u02a2\3\2\2\2P\u02a4\3\2\2\2R\u02a6\3\2\2\2T\u02ad\3\2\2\2V\u02b4"+ - "\3\2\2\2X\u02c2\3\2\2\2Z\u02c6\3\2\2\2\\\u02cb\3\2\2\2^\u02d5\3\2\2\2"+ - "`\u02d7\3\2\2\2b\u02d9\3\2\2\2de\5\6\4\2ef\7\2\2\3f\3\3\2\2\2gh\5,\27"+ - "\2hi\7\2\2\3i\5\3\2\2\2j\u00cf\5\b\5\2ky\7\33\2\2lu\7\3\2\2mn\78\2\2n"+ - "t\t\2\2\2op\7\36\2\2pt\t\3\2\2qr\7G\2\2rt\5P)\2sm\3\2\2\2so\3\2\2\2sq"+ - "\3\2\2\2tw\3\2\2\2us\3\2\2\2uv\3\2\2\2vx\3\2\2\2wu\3\2\2\2xz\7\4\2\2y"+ - "l\3\2\2\2yz\3\2\2\2z{\3\2\2\2{\u00cf\5\6\4\2|\u0088\7\24\2\2}\u0084\7"+ - "\3\2\2~\177\78\2\2\177\u0083\t\4\2\2\u0080\u0081\7\36\2\2\u0081\u0083"+ - "\t\3\2\2\u0082~\3\2\2\2\u0082\u0080\3\2\2\2\u0083\u0086\3\2\2\2\u0084"+ - "\u0082\3\2\2\2\u0084\u0085\3\2\2\2\u0085\u0087\3\2\2\2\u0086\u0084\3\2"+ - "\2\2\u0087\u0089\7\4\2\2\u0088}\3\2\2\2\u0088\u0089\3\2\2\2\u0089\u008a"+ - "\3\2\2\2\u008a\u00cf\5\6\4\2\u008b\u008c\7>\2\2\u008c\u008f\7A\2\2\u008d"+ - "\u0090\5\64\33\2\u008e\u0090\5X-\2\u008f\u008d\3\2\2\2\u008f\u008e\3\2"+ - "\2\2\u008f\u0090\3\2\2\2\u0090\u00cf\3\2\2\2\u0091\u0092\7>\2\2\u0092"+ - "\u0093\7\23\2\2\u0093\u0096\t\5\2\2\u0094\u0097\5\64\33\2\u0095\u0097"+ - "\5X-\2\u0096\u0094\3\2\2\2\u0096\u0095\3\2\2\2\u0097\u00cf\3\2\2\2\u0098"+ - "\u009b\t\6\2\2\u0099\u009c\5\64\33\2\u009a\u009c\5X-\2\u009b\u0099\3\2"+ - "\2\2\u009b\u009a\3\2\2\2\u009c\u00cf\3\2\2\2\u009d\u009e\7>\2\2\u009e"+ - "\u00a0\7!\2\2\u009f\u00a1\5\64\33\2\u00a0\u009f\3\2\2\2\u00a0\u00a1\3"+ - "\2\2\2\u00a1\u00cf\3\2\2\2\u00a2\u00a3\7>\2\2\u00a3\u00cf\7<\2\2\u00a4"+ - "\u00a5\7?\2\2\u00a5\u00cf\7\22\2\2\u00a6\u00a7\7?\2\2\u00a7\u00aa\7A\2"+ - "\2\u00a8\u00a9\7\21\2\2\u00a9\u00ab\5\64\33\2\u00aa\u00a8\3\2\2\2\u00aa"+ - "\u00ab\3\2\2\2\u00ab\u00ae\3\2\2\2\u00ac\u00af\5\64\33\2\u00ad\u00af\5"+ - "X-\2\u00ae\u00ac\3\2\2\2\u00ae\u00ad\3\2\2\2\u00ae\u00af\3\2\2\2\u00af"+ - "\u00b9\3\2\2\2\u00b0\u00b1\7D\2\2\u00b1\u00b6\5`\61\2\u00b2\u00b3\7\5"+ - "\2\2\u00b3\u00b5\5`\61\2\u00b4\u00b2\3\2\2\2\u00b5\u00b8\3\2\2\2\u00b6"+ - "\u00b4\3\2\2\2\u00b6\u00b7\3\2\2\2\u00b7\u00ba\3\2\2\2\u00b8\u00b6\3\2"+ - "\2\2\u00b9\u00b0\3\2\2\2\u00b9\u00ba\3\2\2\2\u00ba\u00cf\3\2\2\2\u00bb"+ - "\u00bc\7?\2\2\u00bc\u00bf\7\23\2\2\u00bd\u00be\7\21\2\2\u00be\u00c0\5"+ - "`\61\2\u00bf\u00bd\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00c4\3\2\2\2\u00c1"+ - "\u00c2\7@\2\2\u00c2\u00c5\5\64\33\2\u00c3\u00c5\5X-\2\u00c4\u00c1\3\2"+ - "\2\2\u00c4\u00c3\3\2\2\2\u00c4\u00c5\3\2\2\2\u00c5\u00c7\3\2\2\2\u00c6"+ - "\u00c8\5\64\33\2\u00c7\u00c6\3\2\2\2\u00c7\u00c8\3\2\2\2\u00c8\u00cf\3"+ - "\2\2\2\u00c9\u00ca\7?\2\2\u00ca\u00cf\7E\2\2\u00cb\u00cc\7?\2\2\u00cc"+ - "\u00cd\7@\2\2\u00cd\u00cf\7E\2\2\u00cej\3\2\2\2\u00cek\3\2\2\2\u00ce|"+ - "\3\2\2\2\u00ce\u008b\3\2\2\2\u00ce\u0091\3\2\2\2\u00ce\u0098\3\2\2\2\u00ce"+ - "\u009d\3\2\2\2\u00ce\u00a2\3\2\2\2\u00ce\u00a4\3\2\2\2\u00ce\u00a6\3\2"+ - "\2\2\u00ce\u00bb\3\2\2\2\u00ce\u00c9\3\2\2\2\u00ce\u00cb\3\2\2\2\u00cf"+ - "\7\3\2\2\2\u00d0\u00d1\7I\2\2\u00d1\u00d6\5\34\17\2\u00d2\u00d3\7\5\2"+ - "\2\u00d3\u00d5\5\34\17\2\u00d4\u00d2\3\2\2\2\u00d5\u00d8\3\2\2\2\u00d6"+ - "\u00d4\3\2\2\2\u00d6\u00d7\3\2\2\2\u00d7\u00da\3\2\2\2\u00d8\u00d6\3\2"+ - "\2\2\u00d9\u00d0\3\2\2\2\u00d9\u00da\3\2\2\2\u00da\u00db\3\2\2\2\u00db"+ - "\u00dc\5\n\6\2\u00dc\t\3\2\2\2\u00dd\u00e8\5\16\b\2\u00de\u00df\7\64\2"+ - "\2\u00df\u00e0\7\17\2\2\u00e0\u00e5\5\20\t\2\u00e1\u00e2\7\5\2\2\u00e2"+ - "\u00e4\5\20\t\2\u00e3\u00e1\3\2\2\2\u00e4\u00e7\3\2\2\2\u00e5\u00e3\3"+ - "\2\2\2\u00e5\u00e6\3\2\2\2\u00e6\u00e9\3\2\2\2\u00e7\u00e5\3\2\2\2\u00e8"+ - "\u00de\3\2\2\2\u00e8\u00e9\3\2\2\2\u00e9\u00eb\3\2\2\2\u00ea\u00ec\5\f"+ - "\7\2\u00eb\u00ea\3\2\2\2\u00eb\u00ec\3\2\2\2\u00ec\13\3\2\2\2\u00ed\u00ee"+ - "\7+\2\2\u00ee\u00f3\t\7\2\2\u00ef\u00f0\7L\2\2\u00f0\u00f1\t\7\2\2\u00f1"+ - "\u00f3\7Q\2\2\u00f2\u00ed\3\2\2\2\u00f2\u00ef\3\2\2\2\u00f3\r\3\2\2\2"+ - "\u00f4\u00fa\5\22\n\2\u00f5\u00f6\7\3\2\2\u00f6\u00f7\5\n\6\2\u00f7\u00f8"+ - "\7\4\2\2\u00f8\u00fa\3\2\2\2\u00f9\u00f4\3\2\2\2\u00f9\u00f5\3\2\2\2\u00fa"+ - "\17\3\2\2\2\u00fb\u00fd\5,\27\2\u00fc\u00fe\t\b\2\2\u00fd\u00fc\3\2\2"+ - "\2\u00fd\u00fe\3\2\2\2\u00fe\21\3\2\2\2\u00ff\u0101\7=\2\2\u0100\u0102"+ - "\5\36\20\2\u0101\u0100\3\2\2\2\u0101\u0102\3\2\2\2\u0102\u0103\3\2\2\2"+ - "\u0103\u0108\5 \21\2\u0104\u0105\7\5\2\2\u0105\u0107\5 \21\2\u0106\u0104"+ - "\3\2\2\2\u0107\u010a\3\2\2\2\u0108\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109"+ - "\u010c\3\2\2\2\u010a\u0108\3\2\2\2\u010b\u010d\5\24\13\2\u010c\u010b\3"+ - "\2\2\2\u010c\u010d\3\2\2\2\u010d\u0110\3\2\2\2\u010e\u010f\7H\2\2\u010f"+ - "\u0111\5.\30\2\u0110\u010e\3\2\2\2\u0110\u0111\3\2\2\2\u0111\u0115\3\2"+ - "\2\2\u0112\u0113\7#\2\2\u0113\u0114\7\17\2\2\u0114\u0116\5\26\f\2\u0115"+ - "\u0112\3\2\2\2\u0115\u0116\3\2\2\2\u0116\u0119\3\2\2\2\u0117\u0118\7$"+ - "\2\2\u0118\u011a\5.\30\2\u0119\u0117\3\2\2\2\u0119\u011a\3\2\2\2\u011a"+ - "\23\3\2\2\2\u011b\u011c\7\37\2\2\u011c\u0121\5\"\22\2\u011d\u011e\7\5"+ - "\2\2\u011e\u0120\5\"\22\2\u011f\u011d\3\2\2\2\u0120\u0123\3\2\2\2\u0121"+ - "\u011f\3\2\2\2\u0121\u0122\3\2\2\2\u0122\25\3\2\2\2\u0123\u0121\3\2\2"+ - "\2\u0124\u0126\5\36\20\2\u0125\u0124\3\2\2\2\u0125\u0126\3\2\2\2\u0126"+ - "\u0127\3\2\2\2\u0127\u012c\5\30\r\2\u0128\u0129\7\5\2\2\u0129\u012b\5"+ - "\30\r\2\u012a\u0128\3\2\2\2\u012b\u012e\3\2\2\2\u012c\u012a\3\2\2\2\u012c"+ - "\u012d\3\2\2\2\u012d\27\3\2\2\2\u012e\u012c\3\2\2\2\u012f\u0130\5\32\16"+ - "\2\u0130\31\3\2\2\2\u0131\u013a\7\3\2\2\u0132\u0137\5,\27\2\u0133\u0134"+ - "\7\5\2\2\u0134\u0136\5,\27\2\u0135\u0133\3\2\2\2\u0136\u0139\3\2\2\2\u0137"+ - "\u0135\3\2\2\2\u0137\u0138\3\2\2\2\u0138\u013b\3\2\2\2\u0139\u0137\3\2"+ - "\2\2\u013a\u0132\3\2\2\2\u013a\u013b\3\2\2\2\u013b\u013c\3\2\2\2\u013c"+ - "\u013f\7\4\2\2\u013d\u013f\5,\27\2\u013e\u0131\3\2\2\2\u013e\u013d\3\2"+ - "\2\2\u013f\33\3\2\2\2\u0140\u0141\5V,\2\u0141\u0142\7\f\2\2\u0142\u0143"+ - "\7\3\2\2\u0143\u0144\5\n\6\2\u0144\u0145\7\4\2\2\u0145\35\3\2\2\2\u0146"+ - "\u0147\t\t\2\2\u0147\37\3\2\2\2\u0148\u014d\5,\27\2\u0149\u014b\7\f\2"+ - "\2\u014a\u0149\3\2\2\2\u014a\u014b\3\2\2\2\u014b\u014c\3\2\2\2\u014c\u014e"+ - "\5V,\2\u014d\u014a\3\2\2\2\u014d\u014e\3\2\2\2\u014e!\3\2\2\2\u014f\u0153"+ - "\5*\26\2\u0150\u0152\5$\23\2\u0151\u0150\3\2\2\2\u0152\u0155\3\2\2\2\u0153"+ - "\u0151\3\2\2\2\u0153\u0154\3\2\2\2\u0154#\3\2\2\2\u0155\u0153\3\2\2\2"+ - "\u0156\u0157\5&\24\2\u0157\u0158\7(\2\2\u0158\u015a\5*\26\2\u0159\u015b"+ - "\5(\25\2\u015a\u0159\3\2\2\2\u015a\u015b\3\2\2\2\u015b\u0162\3\2\2\2\u015c"+ - "\u015d\7.\2\2\u015d\u015e\5&\24\2\u015e\u015f\7(\2\2\u015f\u0160\5*\26"+ - "\2\u0160\u0162\3\2\2\2\u0161\u0156\3\2\2\2\u0161\u015c\3\2\2\2\u0162%"+ - "\3\2\2\2\u0163\u0165\7&\2\2\u0164\u0163\3\2\2\2\u0164\u0165\3\2\2\2\u0165"+ - "\u0173\3\2\2\2\u0166\u0168\7)\2\2\u0167\u0169\7\65\2\2\u0168\u0167\3\2"+ - "\2\2\u0168\u0169\3\2\2\2\u0169\u0173\3\2\2\2\u016a\u016c\79\2\2\u016b"+ - "\u016d\7\65\2\2\u016c\u016b\3\2\2\2\u016c\u016d\3\2\2\2\u016d\u0173\3"+ - "\2\2\2\u016e\u0170\7 \2\2\u016f\u0171\7\65\2\2\u0170\u016f\3\2\2\2\u0170"+ - "\u0171\3\2\2\2\u0171\u0173\3\2\2\2\u0172\u0164\3\2\2\2\u0172\u0166\3\2"+ - "\2\2\u0172\u016a\3\2\2\2\u0172\u016e\3\2\2\2\u0173\'\3\2\2\2\u0174\u0175"+ - "\7\61\2\2\u0175\u0183\5.\30\2\u0176\u0177\7F\2\2\u0177\u0178\7\3\2\2\u0178"+ - "\u017d\5V,\2\u0179\u017a\7\5\2\2\u017a\u017c\5V,\2\u017b\u0179\3\2\2\2"+ - "\u017c\u017f\3\2\2\2\u017d\u017b\3\2\2\2\u017d\u017e\3\2\2\2\u017e\u0180"+ - "\3\2\2\2\u017f\u017d\3\2\2\2\u0180\u0181\7\4\2\2\u0181\u0183\3\2\2\2\u0182"+ - "\u0174\3\2\2\2\u0182\u0176\3\2\2\2\u0183)\3\2\2\2\u0184\u0189\5X-\2\u0185"+ - "\u0187\7\f\2\2\u0186\u0185\3\2\2\2\u0186\u0187\3\2\2\2\u0187\u0188\3\2"+ - "\2\2\u0188\u018a\5T+\2\u0189\u0186\3\2\2\2\u0189\u018a\3\2\2\2\u018a\u019e"+ - "\3\2\2\2\u018b\u018c\7\3\2\2\u018c\u018d\5\n\6\2\u018d\u0192\7\4\2\2\u018e"+ - "\u0190\7\f\2\2\u018f\u018e\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0191\3\2"+ - "\2\2\u0191\u0193\5T+\2\u0192\u018f\3\2\2\2\u0192\u0193\3\2\2\2\u0193\u019e"+ - "\3\2\2\2\u0194\u0195\7\3\2\2\u0195\u0196\5\"\22\2\u0196\u019b\7\4\2\2"+ - "\u0197\u0199\7\f\2\2\u0198\u0197\3\2\2\2\u0198\u0199\3\2\2\2\u0199\u019a"+ - "\3\2\2\2\u019a\u019c\5T+\2\u019b\u0198\3\2\2\2\u019b\u019c\3\2\2\2\u019c"+ - "\u019e\3\2\2\2\u019d\u0184\3\2\2\2\u019d\u018b\3\2\2\2\u019d\u0194\3\2"+ - "\2\2\u019e+\3\2\2\2\u019f\u01a0\5.\30\2\u01a0-\3\2\2\2\u01a1\u01a2\b\30"+ - "\1\2\u01a2\u01a3\7/\2\2\u01a3\u01d3\5.\30\n\u01a4\u01a5\7\32\2\2\u01a5"+ - "\u01a6\7\3\2\2\u01a6\u01a7\5\b\5\2\u01a7\u01a8\7\4\2\2\u01a8\u01d3\3\2"+ - "\2\2\u01a9\u01aa\7;\2\2\u01aa\u01ab\7\3\2\2\u01ab\u01b0\5`\61\2\u01ac"+ - "\u01ad\7\5\2\2\u01ad\u01af\5`\61\2\u01ae\u01ac\3\2\2\2\u01af\u01b2\3\2"+ - "\2\2\u01b0\u01ae\3\2\2\2\u01b0\u01b1\3\2\2\2\u01b1\u01b3\3\2\2\2\u01b2"+ - "\u01b0\3\2\2\2\u01b3\u01b4\7\4\2\2\u01b4\u01d3\3\2\2\2\u01b5\u01b6\7-"+ - "\2\2\u01b6\u01b7\7\3\2\2\u01b7\u01b8\5T+\2\u01b8\u01b9\7\5\2\2\u01b9\u01be"+ - "\5`\61\2\u01ba\u01bb\7\5\2\2\u01bb\u01bd\5`\61\2\u01bc\u01ba\3\2\2\2\u01bd"+ - "\u01c0\3\2\2\2\u01be\u01bc\3\2\2\2\u01be\u01bf\3\2\2\2\u01bf\u01c1\3\2"+ - "\2\2\u01c0\u01be\3\2\2\2\u01c1\u01c2\7\4\2\2\u01c2\u01d3\3\2\2\2\u01c3"+ - "\u01c4\7-\2\2\u01c4\u01c5\7\3\2\2\u01c5\u01c6\5`\61\2\u01c6\u01c7\7\5"+ - "\2\2\u01c7\u01cc\5`\61\2\u01c8\u01c9\7\5\2\2\u01c9\u01cb\5`\61\2\u01ca"+ - "\u01c8\3\2\2\2\u01cb\u01ce\3\2\2\2\u01cc\u01ca\3\2\2\2\u01cc\u01cd\3\2"+ - "\2\2\u01cd\u01cf\3\2\2\2\u01ce\u01cc\3\2\2\2\u01cf\u01d0\7\4\2\2\u01d0"+ - "\u01d3\3\2\2\2\u01d1\u01d3\5\60\31\2\u01d2\u01a1\3\2\2\2\u01d2\u01a4\3"+ - "\2\2\2\u01d2\u01a9\3\2\2\2\u01d2\u01b5\3\2\2\2\u01d2\u01c3\3\2\2\2\u01d2"+ - "\u01d1\3\2\2\2\u01d3\u01dc\3\2\2\2\u01d4\u01d5\f\4\2\2\u01d5\u01d6\7\n"+ - "\2\2\u01d6\u01db\5.\30\5\u01d7\u01d8\f\3\2\2\u01d8\u01d9\7\63\2\2\u01d9"+ - "\u01db\5.\30\4\u01da\u01d4\3\2\2\2\u01da\u01d7\3\2\2\2\u01db\u01de\3\2"+ - "\2\2\u01dc\u01da\3\2\2\2\u01dc\u01dd\3\2\2\2\u01dd/\3\2\2\2\u01de\u01dc"+ - "\3\2\2\2\u01df\u01e1\5:\36\2\u01e0\u01e2\5\62\32\2\u01e1\u01e0\3\2\2\2"+ - "\u01e1\u01e2\3\2\2\2\u01e2\61\3\2\2\2\u01e3\u01e5\7/\2\2\u01e4\u01e3\3"+ - "\2\2\2\u01e4\u01e5\3\2\2\2\u01e5\u01e6\3\2\2\2\u01e6\u01e7\7\16\2\2\u01e7"+ - "\u01e8\5:\36\2\u01e8\u01e9\7\n\2\2\u01e9\u01ea\5:\36\2\u01ea\u0212\3\2"+ - "\2\2\u01eb\u01ed\7/\2\2\u01ec\u01eb\3\2\2\2\u01ec\u01ed\3\2\2\2\u01ed"+ - "\u01ee\3\2\2\2\u01ee\u01ef\7%\2\2\u01ef\u01f0\7\3\2\2\u01f0\u01f5\5,\27"+ - "\2\u01f1\u01f2\7\5\2\2\u01f2\u01f4\5,\27\2\u01f3\u01f1\3\2\2\2\u01f4\u01f7"+ - "\3\2\2\2\u01f5\u01f3\3\2\2\2\u01f5\u01f6\3\2\2\2\u01f6\u01f8\3\2\2\2\u01f7"+ - "\u01f5\3\2\2\2\u01f8\u01f9\7\4\2\2\u01f9\u0212\3\2\2\2\u01fa\u01fc\7/"+ - "\2\2\u01fb\u01fa\3\2\2\2\u01fb\u01fc\3\2\2\2\u01fc\u01fd\3\2\2\2\u01fd"+ - "\u01fe\7%\2\2\u01fe\u01ff\7\3\2\2\u01ff\u0200\5\b\5\2\u0200\u0201\7\4"+ - "\2\2\u0201\u0212\3\2\2\2\u0202\u0204\7/\2\2\u0203\u0202\3\2\2\2\u0203"+ - "\u0204\3\2\2\2\u0204\u0205\3\2\2\2\u0205\u0206\7*\2\2\u0206\u0212\5\66"+ - "\34\2\u0207\u0209\7/\2\2\u0208\u0207\3\2\2\2\u0208\u0209\3\2\2\2\u0209"+ - "\u020a\3\2\2\2\u020a\u020b\7:\2\2\u020b\u0212\5`\61\2\u020c\u020e\7\'"+ - "\2\2\u020d\u020f\7/\2\2\u020e\u020d\3\2\2\2\u020e\u020f\3\2\2\2\u020f"+ - "\u0210\3\2\2\2\u0210\u0212\7\60\2\2\u0211\u01e4\3\2\2\2\u0211\u01ec\3"+ - "\2\2\2\u0211\u01fb\3\2\2\2\u0211\u0203\3\2\2\2\u0211\u0208\3\2\2\2\u0211"+ - "\u020c\3\2\2\2\u0212\63\3\2\2\2\u0213\u0214\7*\2\2\u0214\u0215\5\66\34"+ - "\2\u0215\65\3\2\2\2\u0216\u0218\5`\61\2\u0217\u0219\58\35\2\u0218\u0217"+ - "\3\2\2\2\u0218\u0219\3\2\2\2\u0219\67\3\2\2\2\u021a\u021b\7\30\2\2\u021b"+ - "\u0221\5`\61\2\u021c\u021d\7J\2\2\u021d\u021e\5`\61\2\u021e\u021f\7Q\2"+ - "\2\u021f\u0221\3\2\2\2\u0220\u021a\3\2\2\2\u0220\u021c\3\2\2\2\u02219"+ - "\3\2\2\2\u0222\u0223\b\36\1\2\u0223\u0227\5<\37\2\u0224\u0225\t\n\2\2"+ - "\u0225\u0227\5:\36\6\u0226\u0222\3\2\2\2\u0226\u0224\3\2\2\2\u0227\u0234"+ - "\3\2\2\2\u0228\u0229\f\5\2\2\u0229\u022a\t\13\2\2\u022a\u0233\5:\36\6"+ - "\u022b\u022c\f\4\2\2\u022c\u022d\t\n\2\2\u022d\u0233\5:\36\5\u022e\u022f"+ - "\f\3\2\2\u022f\u0230\5N(\2\u0230\u0231\5:\36\4\u0231\u0233\3\2\2\2\u0232"+ - "\u0228\3\2\2\2\u0232\u022b\3\2\2\2\u0232\u022e\3\2\2\2\u0233\u0236\3\2"+ - "\2\2\u0234\u0232\3\2\2\2\u0234\u0235\3\2\2\2\u0235;\3\2\2\2\u0236\u0234"+ - "\3\2\2\2\u0237\u024d\5> \2\u0238\u024d\5B\"\2\u0239\u024d\5L\'\2\u023a"+ - "\u024d\7Z\2\2\u023b\u023c\5T+\2\u023c\u023d\7^\2\2\u023d\u023f\3\2\2\2"+ - "\u023e\u023b\3\2\2\2\u023e\u023f\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u024d"+ - "\7Z\2\2\u0241\u024d\5F$\2\u0242\u0243\7\3\2\2\u0243\u0244\5\b\5\2\u0244"+ - "\u0245\7\4\2\2\u0245\u024d\3\2\2\2\u0246\u024d\5V,\2\u0247\u024d\5T+\2"+ - "\u0248\u0249\7\3\2\2\u0249\u024a\5,\27\2\u024a\u024b\7\4\2\2\u024b\u024d"+ - "\3\2\2\2\u024c\u0237\3\2\2\2\u024c\u0238\3\2\2\2\u024c\u0239\3\2\2\2\u024c"+ - "\u023a\3\2\2\2\u024c\u023e\3\2\2\2\u024c\u0241\3\2\2\2\u024c\u0242\3\2"+ - "\2\2\u024c\u0246\3\2\2\2\u024c\u0247\3\2\2\2\u024c\u0248\3\2\2\2\u024d"+ - "=\3\2\2\2\u024e\u0254\5@!\2\u024f\u0250\7K\2\2\u0250\u0251\5@!\2\u0251"+ - "\u0252\7Q\2\2\u0252\u0254\3\2\2\2\u0253\u024e\3\2\2\2\u0253\u024f\3\2"+ - "\2\2\u0254?\3\2\2\2\u0255\u0256\7\20\2\2\u0256\u0257\7\3\2\2\u0257\u0258"+ - "\5,\27\2\u0258\u0259\7\f\2\2\u0259\u025a\5R*\2\u025a\u025b\7\4\2\2\u025b"+ - "A\3\2\2\2\u025c\u0262\5D#\2\u025d\u025e\7K\2\2\u025e\u025f\5D#\2\u025f"+ - "\u0260\7Q\2\2\u0260\u0262\3\2\2\2\u0261\u025c\3\2\2\2\u0261\u025d\3\2"+ - "\2\2\u0262C\3\2\2\2\u0263\u0264\7\34\2\2\u0264\u0265\7\3\2\2\u0265\u0266"+ - "\5V,\2\u0266\u0267\7\37\2\2\u0267\u0268\5:\36\2\u0268\u0269\7\4\2\2\u0269"+ - "E\3\2\2\2\u026a\u0270\5H%\2\u026b\u026c\7K\2\2\u026c\u026d\5H%\2\u026d"+ - "\u026e\7Q\2\2\u026e\u0270\3\2\2\2\u026f\u026a\3\2\2\2\u026f\u026b\3\2"+ - "\2\2\u0270G\3\2\2\2\u0271\u0272\5J&\2\u0272\u027e\7\3\2\2\u0273\u0275"+ - "\5\36\20\2\u0274\u0273\3\2\2\2\u0274\u0275\3\2\2\2\u0275\u0276\3\2\2\2"+ - "\u0276\u027b\5,\27\2\u0277\u0278\7\5\2\2\u0278\u027a\5,\27\2\u0279\u0277"+ - "\3\2\2\2\u027a\u027d\3\2\2\2\u027b\u0279\3\2\2\2\u027b\u027c\3\2\2\2\u027c"+ - "\u027f\3\2\2\2\u027d\u027b\3\2\2\2\u027e\u0274\3\2\2\2\u027e\u027f\3\2"+ - "\2\2\u027f\u0280\3\2\2\2\u0280\u0281\7\4\2\2\u0281I\3\2\2\2\u0282\u0286"+ - "\7)\2\2\u0283\u0286\79\2\2\u0284\u0286\5V,\2\u0285\u0282\3\2\2\2\u0285"+ - "\u0283\3\2\2\2\u0285\u0284\3\2\2\2\u0286K\3\2\2\2\u0287\u02a1\7\60\2\2"+ - "\u0288\u02a1\5^\60\2\u0289\u02a1\5P)\2\u028a\u028c\7`\2\2\u028b\u028a"+ - "\3\2\2\2\u028c\u028d\3\2\2\2\u028d\u028b\3\2\2\2\u028d\u028e\3\2\2\2\u028e"+ - "\u02a1\3\2\2\2\u028f\u02a1\7_\2\2\u0290\u0291\7M\2\2\u0291\u0292\5`\61"+ - "\2\u0292\u0293\7Q\2\2\u0293\u02a1\3\2\2\2\u0294\u0295\7N\2\2\u0295\u0296"+ - "\5`\61\2\u0296\u0297\7Q\2\2\u0297\u02a1\3\2\2\2\u0298\u0299\7O\2\2\u0299"+ - "\u029a\5`\61\2\u029a\u029b\7Q\2\2\u029b\u02a1\3\2\2\2\u029c\u029d\7P\2"+ - "\2\u029d\u029e\5`\61\2\u029e\u029f\7Q\2\2\u029f\u02a1\3\2\2\2\u02a0\u0287"+ - "\3\2\2\2\u02a0\u0288\3\2\2\2\u02a0\u0289\3\2\2\2\u02a0\u028b\3\2\2\2\u02a0"+ - "\u028f\3\2\2\2\u02a0\u0290\3\2\2\2\u02a0\u0294\3\2\2\2\u02a0\u0298\3\2"+ - "\2\2\u02a0\u029c\3\2\2\2\u02a1M\3\2\2\2\u02a2\u02a3\t\f\2\2\u02a3O\3\2"+ - "\2\2\u02a4\u02a5\t\r\2\2\u02a5Q\3\2\2\2\u02a6\u02a7\5V,\2\u02a7S\3\2\2"+ - "\2\u02a8\u02a9\5V,\2\u02a9\u02aa\7^\2\2\u02aa\u02ac\3\2\2\2\u02ab\u02a8"+ - "\3\2\2\2\u02ac\u02af\3\2\2\2\u02ad\u02ab\3\2\2\2\u02ad\u02ae\3\2\2\2\u02ae"+ - "\u02b0\3\2\2\2\u02af\u02ad\3\2\2\2\u02b0\u02b1\5V,\2\u02b1U\3\2\2\2\u02b2"+ - "\u02b5\5Z.\2\u02b3\u02b5\5\\/\2\u02b4\u02b2\3\2\2\2\u02b4\u02b3\3\2\2"+ - "\2\u02b5W\3\2\2\2\u02b6\u02b7\5V,\2\u02b7\u02b8\7\6\2\2\u02b8\u02ba\3"+ - "\2\2\2\u02b9\u02b6\3\2\2\2\u02b9\u02ba\3\2\2\2\u02ba\u02bb\3\2\2\2\u02bb"+ - "\u02c3\7e\2\2\u02bc\u02bd\5V,\2\u02bd\u02be\7\6\2\2\u02be\u02c0\3\2\2"+ - "\2\u02bf\u02bc\3\2\2\2\u02bf\u02c0\3\2\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c3"+ - "\5V,\2\u02c2\u02b9\3\2\2\2\u02c2\u02bf\3\2\2\2\u02c3Y\3\2\2\2\u02c4\u02c7"+ - "\7f\2\2\u02c5\u02c7\7g\2\2\u02c6\u02c4\3\2\2\2\u02c6\u02c5\3\2\2\2\u02c7"+ - "[\3\2\2\2\u02c8\u02cc\7c\2\2\u02c9\u02cc\5b\62\2\u02ca\u02cc\7d\2\2\u02cb"+ - "\u02c8\3\2\2\2\u02cb\u02c9\3\2\2\2\u02cb\u02ca\3\2\2\2\u02cc]\3\2\2\2"+ - "\u02cd\u02cf\t\n\2\2\u02ce\u02cd\3\2\2\2\u02ce\u02cf\3\2\2\2\u02cf\u02d0"+ - "\3\2\2\2\u02d0\u02d6\7b\2\2\u02d1\u02d3\t\n\2\2\u02d2\u02d1\3\2\2\2\u02d2"+ - "\u02d3\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4\u02d6\7a\2\2\u02d5\u02ce\3\2"+ - "\2\2\u02d5\u02d2\3\2\2\2\u02d6_\3\2\2\2\u02d7\u02d8\t\16\2\2\u02d8a\3"+ - "\2\2\2\u02d9\u02da\t\17\2\2\u02dac\3\2\2\2dsuy\u0082\u0084\u0088\u008f"+ - "\u0096\u009b\u00a0\u00aa\u00ae\u00b6\u00b9\u00bf\u00c4\u00c7\u00ce\u00d6"+ - "\u00d9\u00e5\u00e8\u00eb\u00f2\u00f9\u00fd\u0101\u0108\u010c\u0110\u0115"+ - "\u0119\u0121\u0125\u012c\u0137\u013a\u013e\u014a\u014d\u0153\u015a\u0161"+ - "\u0164\u0168\u016c\u0170\u0172\u017d\u0182\u0186\u0189\u018f\u0192\u0198"+ - "\u019b\u019d\u01b0\u01be\u01cc\u01d2\u01da\u01dc\u01e1\u01e4\u01ec\u01f5"+ - "\u01fb\u0203\u0208\u020e\u0211\u0218\u0220\u0226\u0232\u0234\u023e\u024c"+ - "\u0253\u0261\u026f\u0274\u027b\u027e\u0285\u028d\u02a0\u02ad\u02b4\u02b9"+ - "\u02bf\u02c2\u02c6\u02cb\u02ce\u02d2\u02d5"; + ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\3\2\3\2"+ + "\3\2\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\7\4v\n\4\f\4\16\4"+ + "y\13\4\3\4\5\4|\n\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\7\4\u0085\n\4\f\4\16\4"+ + "\u0088\13\4\3\4\5\4\u008b\n\4\3\4\3\4\3\4\3\4\3\4\5\4\u0092\n\4\3\4\3"+ + "\4\3\4\3\4\3\4\5\4\u0099\n\4\3\4\3\4\3\4\5\4\u009e\n\4\3\4\3\4\3\4\5\4"+ + "\u00a3\n\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4\u00ad\n\4\3\4\3\4\5\4\u00b1"+ + "\n\4\3\4\3\4\3\4\3\4\7\4\u00b7\n\4\f\4\16\4\u00ba\13\4\5\4\u00bc\n\4\3"+ + "\4\3\4\3\4\3\4\5\4\u00c2\n\4\3\4\3\4\3\4\5\4\u00c7\n\4\3\4\5\4\u00ca\n"+ + "\4\3\4\3\4\3\4\3\4\3\4\5\4\u00d1\n\4\3\5\3\5\3\5\3\5\7\5\u00d7\n\5\f\5"+ + "\16\5\u00da\13\5\5\5\u00dc\n\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\7\6\u00e6"+ + "\n\6\f\6\16\6\u00e9\13\6\5\6\u00eb\n\6\3\6\5\6\u00ee\n\6\3\7\3\7\3\7\3"+ + "\7\3\7\5\7\u00f5\n\7\3\b\3\b\3\b\3\b\3\b\5\b\u00fc\n\b\3\t\3\t\5\t\u0100"+ + "\n\t\3\n\3\n\5\n\u0104\n\n\3\n\3\n\3\n\7\n\u0109\n\n\f\n\16\n\u010c\13"+ + "\n\3\n\5\n\u010f\n\n\3\n\3\n\5\n\u0113\n\n\3\n\3\n\3\n\5\n\u0118\n\n\3"+ + "\n\3\n\5\n\u011c\n\n\3\13\3\13\3\13\3\13\7\13\u0122\n\13\f\13\16\13\u0125"+ + "\13\13\3\f\5\f\u0128\n\f\3\f\3\f\3\f\7\f\u012d\n\f\f\f\16\f\u0130\13\f"+ + "\3\r\3\r\3\16\3\16\3\16\3\16\7\16\u0138\n\16\f\16\16\16\u013b\13\16\5"+ + "\16\u013d\n\16\3\16\3\16\5\16\u0141\n\16\3\17\3\17\3\17\3\17\3\17\3\17"+ + "\3\20\3\20\3\21\3\21\5\21\u014d\n\21\3\21\5\21\u0150\n\21\3\22\3\22\7"+ + "\22\u0154\n\22\f\22\16\22\u0157\13\22\3\23\3\23\3\23\3\23\5\23\u015d\n"+ + "\23\3\23\3\23\3\23\3\23\3\23\5\23\u0164\n\23\3\24\5\24\u0167\n\24\3\24"+ + "\3\24\5\24\u016b\n\24\3\24\3\24\5\24\u016f\n\24\3\24\3\24\5\24\u0173\n"+ + "\24\5\24\u0175\n\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\7\25\u017e\n\25"+ + "\f\25\16\25\u0181\13\25\3\25\3\25\5\25\u0185\n\25\3\26\3\26\5\26\u0189"+ + "\n\26\3\26\5\26\u018c\n\26\3\26\3\26\3\26\3\26\5\26\u0192\n\26\3\26\5"+ + "\26\u0195\n\26\3\26\3\26\3\26\3\26\5\26\u019b\n\26\3\26\5\26\u019e\n\26"+ + "\5\26\u01a0\n\26\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+ + "\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+ + "\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\5\30\u01c3\n\30\3\30\3\30\3\30"+ + "\3\30\3\30\3\30\7\30\u01cb\n\30\f\30\16\30\u01ce\13\30\3\31\3\31\7\31"+ + "\u01d2\n\31\f\31\16\31\u01d5\13\31\3\32\3\32\5\32\u01d9\n\32\3\33\5\33"+ + "\u01dc\n\33\3\33\3\33\3\33\3\33\3\33\3\33\5\33\u01e4\n\33\3\33\3\33\3"+ + "\33\3\33\3\33\7\33\u01eb\n\33\f\33\16\33\u01ee\13\33\3\33\3\33\3\33\5"+ + "\33\u01f3\n\33\3\33\3\33\3\33\3\33\3\33\3\33\5\33\u01fb\n\33\3\33\3\33"+ + "\3\33\5\33\u0200\n\33\3\33\3\33\3\33\3\33\5\33\u0206\n\33\3\33\5\33\u0209"+ + "\n\33\3\34\3\34\3\34\3\35\3\35\5\35\u0210\n\35\3\36\3\36\3\36\3\36\3\36"+ + "\3\36\5\36\u0218\n\36\3\37\3\37\3\37\3\37\5\37\u021e\n\37\3\37\3\37\3"+ + "\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\7\37\u022a\n\37\f\37\16\37\u022d"+ + "\13\37\3 \3 \3 \3 \3 \3 \3 \5 \u0236\n \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 "+ + "\3 \3 \5 \u0244\n \3!\3!\3!\3!\3!\5!\u024b\n!\3\"\3\"\3\"\3\"\3\"\3\""+ + "\3\"\3#\3#\3#\3#\3#\5#\u0259\n#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\5"+ + "%\u0267\n%\3&\3&\3&\5&\u026c\n&\3&\3&\3&\7&\u0271\n&\f&\16&\u0274\13&"+ + "\5&\u0276\n&\3&\3&\3\'\3\'\3\'\5\'\u027d\n\'\3(\3(\3(\3(\6(\u0283\n(\r"+ + "(\16(\u0284\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\5(\u0298"+ + "\n(\3)\3)\3*\3*\3+\3+\3,\3,\3,\7,\u02a3\n,\f,\16,\u02a6\13,\3,\3,\3-\3"+ + "-\5-\u02ac\n-\3.\3.\3.\5.\u02b1\n.\3.\3.\3.\3.\5.\u02b7\n.\3.\5.\u02ba"+ + "\n.\3/\3/\5/\u02be\n/\3\60\3\60\3\60\5\60\u02c3\n\60\3\61\5\61\u02c6\n"+ + "\61\3\61\3\61\5\61\u02ca\n\61\3\61\5\61\u02cd\n\61\3\62\3\62\3\63\3\63"+ + "\3\63\2\4.<\64\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64"+ + "\668:<>@BDFHJLNPRTVXZ\\^`bd\2\20\b\2\7\7\t\t\31\31,,\62\62\66\66\4\2\""+ + "\"BB\4\2\t\t\62\62\4\2\37\37%%\3\2\25\26\4\2\7\7aa\4\2\r\r\25\25\4\2\7"+ + "\7\27\27\3\2XY\3\2Z\\\3\2RW\4\2\35\35CC\3\2_`\20\2\b\t\22\24\31\31\33"+ + "\33\36\36!\",,\62\62\668:<>?ABDEGG\u032c\2f\3\2\2\2\4i\3\2\2\2\6\u00d0"+ + "\3\2\2\2\b\u00db\3\2\2\2\n\u00df\3\2\2\2\f\u00f4\3\2\2\2\16\u00fb\3\2"+ + "\2\2\20\u00fd\3\2\2\2\22\u0101\3\2\2\2\24\u011d\3\2\2\2\26\u0127\3\2\2"+ + "\2\30\u0131\3\2\2\2\32\u0140\3\2\2\2\34\u0142\3\2\2\2\36\u0148\3\2\2\2"+ + " \u014a\3\2\2\2\"\u0151\3\2\2\2$\u0163\3\2\2\2&\u0174\3\2\2\2(\u0184\3"+ + "\2\2\2*\u019f\3\2\2\2,\u01a1\3\2\2\2.\u01c2\3\2\2\2\60\u01d3\3\2\2\2\62"+ + "\u01d6\3\2\2\2\64\u0208\3\2\2\2\66\u020a\3\2\2\28\u020d\3\2\2\2:\u0217"+ + "\3\2\2\2<\u021d\3\2\2\2>\u0243\3\2\2\2@\u024a\3\2\2\2B\u024c\3\2\2\2D"+ + "\u0258\3\2\2\2F\u025a\3\2\2\2H\u0266\3\2\2\2J\u0268\3\2\2\2L\u027c\3\2"+ + "\2\2N\u0297\3\2\2\2P\u0299\3\2\2\2R\u029b\3\2\2\2T\u029d\3\2\2\2V\u02a4"+ + "\3\2\2\2X\u02ab\3\2\2\2Z\u02b9\3\2\2\2\\\u02bd\3\2\2\2^\u02c2\3\2\2\2"+ + "`\u02cc\3\2\2\2b\u02ce\3\2\2\2d\u02d0\3\2\2\2fg\5\6\4\2gh\7\2\2\3h\3\3"+ + "\2\2\2ij\5,\27\2jk\7\2\2\3k\5\3\2\2\2l\u00d1\5\b\5\2m{\7\33\2\2nw\7\3"+ + "\2\2op\78\2\2pv\t\2\2\2qr\7\36\2\2rv\t\3\2\2st\7G\2\2tv\5R*\2uo\3\2\2"+ + "\2uq\3\2\2\2us\3\2\2\2vy\3\2\2\2wu\3\2\2\2wx\3\2\2\2xz\3\2\2\2yw\3\2\2"+ + "\2z|\7\4\2\2{n\3\2\2\2{|\3\2\2\2|}\3\2\2\2}\u00d1\5\6\4\2~\u008a\7\24"+ + "\2\2\177\u0086\7\3\2\2\u0080\u0081\78\2\2\u0081\u0085\t\4\2\2\u0082\u0083"+ + "\7\36\2\2\u0083\u0085\t\3\2\2\u0084\u0080\3\2\2\2\u0084\u0082\3\2\2\2"+ + "\u0085\u0088\3\2\2\2\u0086\u0084\3\2\2\2\u0086\u0087\3\2\2\2\u0087\u0089"+ + "\3\2\2\2\u0088\u0086\3\2\2\2\u0089\u008b\7\4\2\2\u008a\177\3\2\2\2\u008a"+ + "\u008b\3\2\2\2\u008b\u008c\3\2\2\2\u008c\u00d1\5\6\4\2\u008d\u008e\7>"+ + "\2\2\u008e\u0091\7A\2\2\u008f\u0092\5\66\34\2\u0090\u0092\5Z.\2\u0091"+ + "\u008f\3\2\2\2\u0091\u0090\3\2\2\2\u0091\u0092\3\2\2\2\u0092\u00d1\3\2"+ + "\2\2\u0093\u0094\7>\2\2\u0094\u0095\7\23\2\2\u0095\u0098\t\5\2\2\u0096"+ + "\u0099\5\66\34\2\u0097\u0099\5Z.\2\u0098\u0096\3\2\2\2\u0098\u0097\3\2"+ + "\2\2\u0099\u00d1\3\2\2\2\u009a\u009d\t\6\2\2\u009b\u009e\5\66\34\2\u009c"+ + "\u009e\5Z.\2\u009d\u009b\3\2\2\2\u009d\u009c\3\2\2\2\u009e\u00d1\3\2\2"+ + "\2\u009f\u00a0\7>\2\2\u00a0\u00a2\7!\2\2\u00a1\u00a3\5\66\34\2\u00a2\u00a1"+ + "\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\u00d1\3\2\2\2\u00a4\u00a5\7>\2\2\u00a5"+ + "\u00d1\7<\2\2\u00a6\u00a7\7?\2\2\u00a7\u00d1\7\22\2\2\u00a8\u00a9\7?\2"+ + "\2\u00a9\u00ac\7A\2\2\u00aa\u00ab\7\21\2\2\u00ab\u00ad\5\66\34\2\u00ac"+ + "\u00aa\3\2\2\2\u00ac\u00ad\3\2\2\2\u00ad\u00b0\3\2\2\2\u00ae\u00b1\5\66"+ + "\34\2\u00af\u00b1\5Z.\2\u00b0\u00ae\3\2\2\2\u00b0\u00af\3\2\2\2\u00b0"+ + "\u00b1\3\2\2\2\u00b1\u00bb\3\2\2\2\u00b2\u00b3\7D\2\2\u00b3\u00b8\5b\62"+ + "\2\u00b4\u00b5\7\5\2\2\u00b5\u00b7\5b\62\2\u00b6\u00b4\3\2\2\2\u00b7\u00ba"+ + "\3\2\2\2\u00b8\u00b6\3\2\2\2\u00b8\u00b9\3\2\2\2\u00b9\u00bc\3\2\2\2\u00ba"+ + "\u00b8\3\2\2\2\u00bb\u00b2\3\2\2\2\u00bb\u00bc\3\2\2\2\u00bc\u00d1\3\2"+ + "\2\2\u00bd\u00be\7?\2\2\u00be\u00c1\7\23\2\2\u00bf\u00c0\7\21\2\2\u00c0"+ + "\u00c2\5b\62\2\u00c1\u00bf\3\2\2\2\u00c1\u00c2\3\2\2\2\u00c2\u00c6\3\2"+ + "\2\2\u00c3\u00c4\7@\2\2\u00c4\u00c7\5\66\34\2\u00c5\u00c7\5Z.\2\u00c6"+ + "\u00c3\3\2\2\2\u00c6\u00c5\3\2\2\2\u00c6\u00c7\3\2\2\2\u00c7\u00c9\3\2"+ + "\2\2\u00c8\u00ca\5\66\34\2\u00c9\u00c8\3\2\2\2\u00c9\u00ca\3\2\2\2\u00ca"+ + "\u00d1\3\2\2\2\u00cb\u00cc\7?\2\2\u00cc\u00d1\7E\2\2\u00cd\u00ce\7?\2"+ + "\2\u00ce\u00cf\7@\2\2\u00cf\u00d1\7E\2\2\u00d0l\3\2\2\2\u00d0m\3\2\2\2"+ + "\u00d0~\3\2\2\2\u00d0\u008d\3\2\2\2\u00d0\u0093\3\2\2\2\u00d0\u009a\3"+ + "\2\2\2\u00d0\u009f\3\2\2\2\u00d0\u00a4\3\2\2\2\u00d0\u00a6\3\2\2\2\u00d0"+ + "\u00a8\3\2\2\2\u00d0\u00bd\3\2\2\2\u00d0\u00cb\3\2\2\2\u00d0\u00cd\3\2"+ + "\2\2\u00d1\7\3\2\2\2\u00d2\u00d3\7I\2\2\u00d3\u00d8\5\34\17\2\u00d4\u00d5"+ + "\7\5\2\2\u00d5\u00d7\5\34\17\2\u00d6\u00d4\3\2\2\2\u00d7\u00da\3\2\2\2"+ + "\u00d8\u00d6\3\2\2\2\u00d8\u00d9\3\2\2\2\u00d9\u00dc\3\2\2\2\u00da\u00d8"+ + "\3\2\2\2\u00db\u00d2\3\2\2\2\u00db\u00dc\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd"+ + "\u00de\5\n\6\2\u00de\t\3\2\2\2\u00df\u00ea\5\16\b\2\u00e0\u00e1\7\64\2"+ + "\2\u00e1\u00e2\7\17\2\2\u00e2\u00e7\5\20\t\2\u00e3\u00e4\7\5\2\2\u00e4"+ + "\u00e6\5\20\t\2\u00e5\u00e3\3\2\2\2\u00e6\u00e9\3\2\2\2\u00e7\u00e5\3"+ + "\2\2\2\u00e7\u00e8\3\2\2\2\u00e8\u00eb\3\2\2\2\u00e9\u00e7\3\2\2\2\u00ea"+ + "\u00e0\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb\u00ed\3\2\2\2\u00ec\u00ee\5\f"+ + "\7\2\u00ed\u00ec\3\2\2\2\u00ed\u00ee\3\2\2\2\u00ee\13\3\2\2\2\u00ef\u00f0"+ + "\7+\2\2\u00f0\u00f5\t\7\2\2\u00f1\u00f2\7L\2\2\u00f2\u00f3\t\7\2\2\u00f3"+ + "\u00f5\7Q\2\2\u00f4\u00ef\3\2\2\2\u00f4\u00f1\3\2\2\2\u00f5\r\3\2\2\2"+ + "\u00f6\u00fc\5\22\n\2\u00f7\u00f8\7\3\2\2\u00f8\u00f9\5\n\6\2\u00f9\u00fa"+ + "\7\4\2\2\u00fa\u00fc\3\2\2\2\u00fb\u00f6\3\2\2\2\u00fb\u00f7\3\2\2\2\u00fc"+ + "\17\3\2\2\2\u00fd\u00ff\5,\27\2\u00fe\u0100\t\b\2\2\u00ff\u00fe\3\2\2"+ + "\2\u00ff\u0100\3\2\2\2\u0100\21\3\2\2\2\u0101\u0103\7=\2\2\u0102\u0104"+ + "\5\36\20\2\u0103\u0102\3\2\2\2\u0103\u0104\3\2\2\2\u0104\u0105\3\2\2\2"+ + "\u0105\u010a\5 \21\2\u0106\u0107\7\5\2\2\u0107\u0109\5 \21\2\u0108\u0106"+ + "\3\2\2\2\u0109\u010c\3\2\2\2\u010a\u0108\3\2\2\2\u010a\u010b\3\2\2\2\u010b"+ + "\u010e\3\2\2\2\u010c\u010a\3\2\2\2\u010d\u010f\5\24\13\2\u010e\u010d\3"+ + "\2\2\2\u010e\u010f\3\2\2\2\u010f\u0112\3\2\2\2\u0110\u0111\7H\2\2\u0111"+ + "\u0113\5.\30\2\u0112\u0110\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u0117\3\2"+ + "\2\2\u0114\u0115\7#\2\2\u0115\u0116\7\17\2\2\u0116\u0118\5\26\f\2\u0117"+ + "\u0114\3\2\2\2\u0117\u0118\3\2\2\2\u0118\u011b\3\2\2\2\u0119\u011a\7$"+ + "\2\2\u011a\u011c\5.\30\2\u011b\u0119\3\2\2\2\u011b\u011c\3\2\2\2\u011c"+ + "\23\3\2\2\2\u011d\u011e\7\37\2\2\u011e\u0123\5\"\22\2\u011f\u0120\7\5"+ + "\2\2\u0120\u0122\5\"\22\2\u0121\u011f\3\2\2\2\u0122\u0125\3\2\2\2\u0123"+ + "\u0121\3\2\2\2\u0123\u0124\3\2\2\2\u0124\25\3\2\2\2\u0125\u0123\3\2\2"+ + "\2\u0126\u0128\5\36\20\2\u0127\u0126\3\2\2\2\u0127\u0128\3\2\2\2\u0128"+ + "\u0129\3\2\2\2\u0129\u012e\5\30\r\2\u012a\u012b\7\5\2\2\u012b\u012d\5"+ + "\30\r\2\u012c\u012a\3\2\2\2\u012d\u0130\3\2\2\2\u012e\u012c\3\2\2\2\u012e"+ + "\u012f\3\2\2\2\u012f\27\3\2\2\2\u0130\u012e\3\2\2\2\u0131\u0132\5\32\16"+ + "\2\u0132\31\3\2\2\2\u0133\u013c\7\3\2\2\u0134\u0139\5,\27\2\u0135\u0136"+ + "\7\5\2\2\u0136\u0138\5,\27\2\u0137\u0135\3\2\2\2\u0138\u013b\3\2\2\2\u0139"+ + "\u0137\3\2\2\2\u0139\u013a\3\2\2\2\u013a\u013d\3\2\2\2\u013b\u0139\3\2"+ + "\2\2\u013c\u0134\3\2\2\2\u013c\u013d\3\2\2\2\u013d\u013e\3\2\2\2\u013e"+ + "\u0141\7\4\2\2\u013f\u0141\5,\27\2\u0140\u0133\3\2\2\2\u0140\u013f\3\2"+ + "\2\2\u0141\33\3\2\2\2\u0142\u0143\5X-\2\u0143\u0144\7\f\2\2\u0144\u0145"+ + "\7\3\2\2\u0145\u0146\5\n\6\2\u0146\u0147\7\4\2\2\u0147\35\3\2\2\2\u0148"+ + "\u0149\t\t\2\2\u0149\37\3\2\2\2\u014a\u014f\5,\27\2\u014b\u014d\7\f\2"+ + "\2\u014c\u014b\3\2\2\2\u014c\u014d\3\2\2\2\u014d\u014e\3\2\2\2\u014e\u0150"+ + "\5X-\2\u014f\u014c\3\2\2\2\u014f\u0150\3\2\2\2\u0150!\3\2\2\2\u0151\u0155"+ + "\5*\26\2\u0152\u0154\5$\23\2\u0153\u0152\3\2\2\2\u0154\u0157\3\2\2\2\u0155"+ + "\u0153\3\2\2\2\u0155\u0156\3\2\2\2\u0156#\3\2\2\2\u0157\u0155\3\2\2\2"+ + "\u0158\u0159\5&\24\2\u0159\u015a\7(\2\2\u015a\u015c\5*\26\2\u015b\u015d"+ + "\5(\25\2\u015c\u015b\3\2\2\2\u015c\u015d\3\2\2\2\u015d\u0164\3\2\2\2\u015e"+ + "\u015f\7.\2\2\u015f\u0160\5&\24\2\u0160\u0161\7(\2\2\u0161\u0162\5*\26"+ + "\2\u0162\u0164\3\2\2\2\u0163\u0158\3\2\2\2\u0163\u015e\3\2\2\2\u0164%"+ + "\3\2\2\2\u0165\u0167\7&\2\2\u0166\u0165\3\2\2\2\u0166\u0167\3\2\2\2\u0167"+ + "\u0175\3\2\2\2\u0168\u016a\7)\2\2\u0169\u016b\7\65\2\2\u016a\u0169\3\2"+ + "\2\2\u016a\u016b\3\2\2\2\u016b\u0175\3\2\2\2\u016c\u016e\79\2\2\u016d"+ + "\u016f\7\65\2\2\u016e\u016d\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0175\3"+ + "\2\2\2\u0170\u0172\7 \2\2\u0171\u0173\7\65\2\2\u0172\u0171\3\2\2\2\u0172"+ + "\u0173\3\2\2\2\u0173\u0175\3\2\2\2\u0174\u0166\3\2\2\2\u0174\u0168\3\2"+ + "\2\2\u0174\u016c\3\2\2\2\u0174\u0170\3\2\2\2\u0175\'\3\2\2\2\u0176\u0177"+ + "\7\61\2\2\u0177\u0185\5.\30\2\u0178\u0179\7F\2\2\u0179\u017a\7\3\2\2\u017a"+ + "\u017f\5X-\2\u017b\u017c\7\5\2\2\u017c\u017e\5X-\2\u017d\u017b\3\2\2\2"+ + "\u017e\u0181\3\2\2\2\u017f\u017d\3\2\2\2\u017f\u0180\3\2\2\2\u0180\u0182"+ + "\3\2\2\2\u0181\u017f\3\2\2\2\u0182\u0183\7\4\2\2\u0183\u0185\3\2\2\2\u0184"+ + "\u0176\3\2\2\2\u0184\u0178\3\2\2\2\u0185)\3\2\2\2\u0186\u018b\5Z.\2\u0187"+ + "\u0189\7\f\2\2\u0188\u0187\3\2\2\2\u0188\u0189\3\2\2\2\u0189\u018a\3\2"+ + "\2\2\u018a\u018c\5V,\2\u018b\u0188\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u01a0"+ + "\3\2\2\2\u018d\u018e\7\3\2\2\u018e\u018f\5\n\6\2\u018f\u0194\7\4\2\2\u0190"+ + "\u0192\7\f\2\2\u0191\u0190\3\2\2\2\u0191\u0192\3\2\2\2\u0192\u0193\3\2"+ + "\2\2\u0193\u0195\5V,\2\u0194\u0191\3\2\2\2\u0194\u0195\3\2\2\2\u0195\u01a0"+ + "\3\2\2\2\u0196\u0197\7\3\2\2\u0197\u0198\5\"\22\2\u0198\u019d\7\4\2\2"+ + "\u0199\u019b\7\f\2\2\u019a\u0199\3\2\2\2\u019a\u019b\3\2\2\2\u019b\u019c"+ + "\3\2\2\2\u019c\u019e\5V,\2\u019d\u019a\3\2\2\2\u019d\u019e\3\2\2\2\u019e"+ + "\u01a0\3\2\2\2\u019f\u0186\3\2\2\2\u019f\u018d\3\2\2\2\u019f\u0196\3\2"+ + "\2\2\u01a0+\3\2\2\2\u01a1\u01a2\5.\30\2\u01a2-\3\2\2\2\u01a3\u01a4\b\30"+ + "\1\2\u01a4\u01a5\7/\2\2\u01a5\u01c3\5.\30\n\u01a6\u01a7\7\32\2\2\u01a7"+ + "\u01a8\7\3\2\2\u01a8\u01a9\5\b\5\2\u01a9\u01aa\7\4\2\2\u01aa\u01c3\3\2"+ + "\2\2\u01ab\u01ac\7;\2\2\u01ac\u01ad\7\3\2\2\u01ad\u01ae\5b\62\2\u01ae"+ + "\u01af\5\60\31\2\u01af\u01b0\7\4\2\2\u01b0\u01c3\3\2\2\2\u01b1\u01b2\7"+ + "-\2\2\u01b2\u01b3\7\3\2\2\u01b3\u01b4\5V,\2\u01b4\u01b5\7\5\2\2\u01b5"+ + "\u01b6\5b\62\2\u01b6\u01b7\5\60\31\2\u01b7\u01b8\7\4\2\2\u01b8\u01c3\3"+ + "\2\2\2\u01b9\u01ba\7-\2\2\u01ba\u01bb\7\3\2\2\u01bb\u01bc\5b\62\2\u01bc"+ + "\u01bd\7\5\2\2\u01bd\u01be\5b\62\2\u01be\u01bf\5\60\31\2\u01bf\u01c0\7"+ + "\4\2\2\u01c0\u01c3\3\2\2\2\u01c1\u01c3\5\62\32\2\u01c2\u01a3\3\2\2\2\u01c2"+ + "\u01a6\3\2\2\2\u01c2\u01ab\3\2\2\2\u01c2\u01b1\3\2\2\2\u01c2\u01b9\3\2"+ + "\2\2\u01c2\u01c1\3\2\2\2\u01c3\u01cc\3\2\2\2\u01c4\u01c5\f\4\2\2\u01c5"+ + "\u01c6\7\n\2\2\u01c6\u01cb\5.\30\5\u01c7\u01c8\f\3\2\2\u01c8\u01c9\7\63"+ + "\2\2\u01c9\u01cb\5.\30\4\u01ca\u01c4\3\2\2\2\u01ca\u01c7\3\2\2\2\u01cb"+ + "\u01ce\3\2\2\2\u01cc\u01ca\3\2\2\2\u01cc\u01cd\3\2\2\2\u01cd/\3\2\2\2"+ + "\u01ce\u01cc\3\2\2\2\u01cf\u01d0\7\5\2\2\u01d0\u01d2\5b\62\2\u01d1\u01cf"+ + "\3\2\2\2\u01d2\u01d5\3\2\2\2\u01d3\u01d1\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4"+ + "\61\3\2\2\2\u01d5\u01d3\3\2\2\2\u01d6\u01d8\5<\37\2\u01d7\u01d9\5\64\33"+ + "\2\u01d8\u01d7\3\2\2\2\u01d8\u01d9\3\2\2\2\u01d9\63\3\2\2\2\u01da\u01dc"+ + "\7/\2\2\u01db\u01da\3\2\2\2\u01db\u01dc\3\2\2\2\u01dc\u01dd\3\2\2\2\u01dd"+ + "\u01de\7\16\2\2\u01de\u01df\5<\37\2\u01df\u01e0\7\n\2\2\u01e0\u01e1\5"+ + "<\37\2\u01e1\u0209\3\2\2\2\u01e2\u01e4\7/\2\2\u01e3\u01e2\3\2\2\2\u01e3"+ + "\u01e4\3\2\2\2\u01e4\u01e5\3\2\2\2\u01e5\u01e6\7%\2\2\u01e6\u01e7\7\3"+ + "\2\2\u01e7\u01ec\5,\27\2\u01e8\u01e9\7\5\2\2\u01e9\u01eb\5,\27\2\u01ea"+ + "\u01e8\3\2\2\2\u01eb\u01ee\3\2\2\2\u01ec\u01ea\3\2\2\2\u01ec\u01ed\3\2"+ + "\2\2\u01ed\u01ef\3\2\2\2\u01ee\u01ec\3\2\2\2\u01ef\u01f0\7\4\2\2\u01f0"+ + "\u0209\3\2\2\2\u01f1\u01f3\7/\2\2\u01f2\u01f1\3\2\2\2\u01f2\u01f3\3\2"+ + "\2\2\u01f3\u01f4\3\2\2\2\u01f4\u01f5\7%\2\2\u01f5\u01f6\7\3\2\2\u01f6"+ + "\u01f7\5\b\5\2\u01f7\u01f8\7\4\2\2\u01f8\u0209\3\2\2\2\u01f9\u01fb\7/"+ + "\2\2\u01fa\u01f9\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb\u01fc\3\2\2\2\u01fc"+ + "\u01fd\7*\2\2\u01fd\u0209\58\35\2\u01fe\u0200\7/\2\2\u01ff\u01fe\3\2\2"+ + "\2\u01ff\u0200\3\2\2\2\u0200\u0201\3\2\2\2\u0201\u0202\7:\2\2\u0202\u0209"+ + "\5b\62\2\u0203\u0205\7\'\2\2\u0204\u0206\7/\2\2\u0205\u0204\3\2\2\2\u0205"+ + "\u0206\3\2\2\2\u0206\u0207\3\2\2\2\u0207\u0209\7\60\2\2\u0208\u01db\3"+ + "\2\2\2\u0208\u01e3\3\2\2\2\u0208\u01f2\3\2\2\2\u0208\u01fa\3\2\2\2\u0208"+ + "\u01ff\3\2\2\2\u0208\u0203\3\2\2\2\u0209\65\3\2\2\2\u020a\u020b\7*\2\2"+ + "\u020b\u020c\58\35\2\u020c\67\3\2\2\2\u020d\u020f\5b\62\2\u020e\u0210"+ + "\5:\36\2\u020f\u020e\3\2\2\2\u020f\u0210\3\2\2\2\u02109\3\2\2\2\u0211"+ + "\u0212\7\30\2\2\u0212\u0218\5b\62\2\u0213\u0214\7J\2\2\u0214\u0215\5b"+ + "\62\2\u0215\u0216\7Q\2\2\u0216\u0218\3\2\2\2\u0217\u0211\3\2\2\2\u0217"+ + "\u0213\3\2\2\2\u0218;\3\2\2\2\u0219\u021a\b\37\1\2\u021a\u021e\5> \2\u021b"+ + "\u021c\t\n\2\2\u021c\u021e\5<\37\6\u021d\u0219\3\2\2\2\u021d\u021b\3\2"+ + "\2\2\u021e\u022b\3\2\2\2\u021f\u0220\f\5\2\2\u0220\u0221\t\13\2\2\u0221"+ + "\u022a\5<\37\6\u0222\u0223\f\4\2\2\u0223\u0224\t\n\2\2\u0224\u022a\5<"+ + "\37\5\u0225\u0226\f\3\2\2\u0226\u0227\5P)\2\u0227\u0228\5<\37\4\u0228"+ + "\u022a\3\2\2\2\u0229\u021f\3\2\2\2\u0229\u0222\3\2\2\2\u0229\u0225\3\2"+ + "\2\2\u022a\u022d\3\2\2\2\u022b\u0229\3\2\2\2\u022b\u022c\3\2\2\2\u022c"+ + "=\3\2\2\2\u022d\u022b\3\2\2\2\u022e\u0244\5@!\2\u022f\u0244\5D#\2\u0230"+ + "\u0244\5N(\2\u0231\u0244\7Z\2\2\u0232\u0233\5V,\2\u0233\u0234\7^\2\2\u0234"+ + "\u0236\3\2\2\2\u0235\u0232\3\2\2\2\u0235\u0236\3\2\2\2\u0236\u0237\3\2"+ + "\2\2\u0237\u0244\7Z\2\2\u0238\u0244\5H%\2\u0239\u023a\7\3\2\2\u023a\u023b"+ + "\5\b\5\2\u023b\u023c\7\4\2\2\u023c\u0244\3\2\2\2\u023d\u0244\5X-\2\u023e"+ + "\u0244\5V,\2\u023f\u0240\7\3\2\2\u0240\u0241\5,\27\2\u0241\u0242\7\4\2"+ + "\2\u0242\u0244\3\2\2\2\u0243\u022e\3\2\2\2\u0243\u022f\3\2\2\2\u0243\u0230"+ + "\3\2\2\2\u0243\u0231\3\2\2\2\u0243\u0235\3\2\2\2\u0243\u0238\3\2\2\2\u0243"+ + "\u0239\3\2\2\2\u0243\u023d\3\2\2\2\u0243\u023e\3\2\2\2\u0243\u023f\3\2"+ + "\2\2\u0244?\3\2\2\2\u0245\u024b\5B\"\2\u0246\u0247\7K\2\2\u0247\u0248"+ + "\5B\"\2\u0248\u0249\7Q\2\2\u0249\u024b\3\2\2\2\u024a\u0245\3\2\2\2\u024a"+ + "\u0246\3\2\2\2\u024bA\3\2\2\2\u024c\u024d\7\20\2\2\u024d\u024e\7\3\2\2"+ + "\u024e\u024f\5,\27\2\u024f\u0250\7\f\2\2\u0250\u0251\5T+\2\u0251\u0252"+ + "\7\4\2\2\u0252C\3\2\2\2\u0253\u0259\5F$\2\u0254\u0255\7K\2\2\u0255\u0256"+ + "\5F$\2\u0256\u0257\7Q\2\2\u0257\u0259\3\2\2\2\u0258\u0253\3\2\2\2\u0258"+ + "\u0254\3\2\2\2\u0259E\3\2\2\2\u025a\u025b\7\34\2\2\u025b\u025c\7\3\2\2"+ + "\u025c\u025d\5X-\2\u025d\u025e\7\37\2\2\u025e\u025f\5<\37\2\u025f\u0260"+ + "\7\4\2\2\u0260G\3\2\2\2\u0261\u0267\5J&\2\u0262\u0263\7K\2\2\u0263\u0264"+ + "\5J&\2\u0264\u0265\7Q\2\2\u0265\u0267\3\2\2\2\u0266\u0261\3\2\2\2\u0266"+ + "\u0262\3\2\2\2\u0267I\3\2\2\2\u0268\u0269\5L\'\2\u0269\u0275\7\3\2\2\u026a"+ + "\u026c\5\36\20\2\u026b\u026a\3\2\2\2\u026b\u026c\3\2\2\2\u026c\u026d\3"+ + "\2\2\2\u026d\u0272\5,\27\2\u026e\u026f\7\5\2\2\u026f\u0271\5,\27\2\u0270"+ + "\u026e\3\2\2\2\u0271\u0274\3\2\2\2\u0272\u0270\3\2\2\2\u0272\u0273\3\2"+ + "\2\2\u0273\u0276\3\2\2\2\u0274\u0272\3\2\2\2\u0275\u026b\3\2\2\2\u0275"+ + "\u0276\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u0278\7\4\2\2\u0278K\3\2\2\2"+ + "\u0279\u027d\7)\2\2\u027a\u027d\79\2\2\u027b\u027d\5X-\2\u027c\u0279\3"+ + "\2\2\2\u027c\u027a\3\2\2\2\u027c\u027b\3\2\2\2\u027dM\3\2\2\2\u027e\u0298"+ + "\7\60\2\2\u027f\u0298\5`\61\2\u0280\u0298\5R*\2\u0281\u0283\7`\2\2\u0282"+ + "\u0281\3\2\2\2\u0283\u0284\3\2\2\2\u0284\u0282\3\2\2\2\u0284\u0285\3\2"+ + "\2\2\u0285\u0298\3\2\2\2\u0286\u0298\7_\2\2\u0287\u0288\7M\2\2\u0288\u0289"+ + "\5b\62\2\u0289\u028a\7Q\2\2\u028a\u0298\3\2\2\2\u028b\u028c\7N\2\2\u028c"+ + "\u028d\5b\62\2\u028d\u028e\7Q\2\2\u028e\u0298\3\2\2\2\u028f\u0290\7O\2"+ + "\2\u0290\u0291\5b\62\2\u0291\u0292\7Q\2\2\u0292\u0298\3\2\2\2\u0293\u0294"+ + "\7P\2\2\u0294\u0295\5b\62\2\u0295\u0296\7Q\2\2\u0296\u0298\3\2\2\2\u0297"+ + "\u027e\3\2\2\2\u0297\u027f\3\2\2\2\u0297\u0280\3\2\2\2\u0297\u0282\3\2"+ + "\2\2\u0297\u0286\3\2\2\2\u0297\u0287\3\2\2\2\u0297\u028b\3\2\2\2\u0297"+ + "\u028f\3\2\2\2\u0297\u0293\3\2\2\2\u0298O\3\2\2\2\u0299\u029a\t\f\2\2"+ + "\u029aQ\3\2\2\2\u029b\u029c\t\r\2\2\u029cS\3\2\2\2\u029d\u029e\5X-\2\u029e"+ + "U\3\2\2\2\u029f\u02a0\5X-\2\u02a0\u02a1\7^\2\2\u02a1\u02a3\3\2\2\2\u02a2"+ + "\u029f\3\2\2\2\u02a3\u02a6\3\2\2\2\u02a4\u02a2\3\2\2\2\u02a4\u02a5\3\2"+ + "\2\2\u02a5\u02a7\3\2\2\2\u02a6\u02a4\3\2\2\2\u02a7\u02a8\5X-\2\u02a8W"+ + "\3\2\2\2\u02a9\u02ac\5\\/\2\u02aa\u02ac\5^\60\2\u02ab\u02a9\3\2\2\2\u02ab"+ + "\u02aa\3\2\2\2\u02acY\3\2\2\2\u02ad\u02ae\5X-\2\u02ae\u02af\7\6\2\2\u02af"+ + "\u02b1\3\2\2\2\u02b0\u02ad\3\2\2\2\u02b0\u02b1\3\2\2\2\u02b1\u02b2\3\2"+ + "\2\2\u02b2\u02ba\7e\2\2\u02b3\u02b4\5X-\2\u02b4\u02b5\7\6\2\2\u02b5\u02b7"+ + "\3\2\2\2\u02b6\u02b3\3\2\2\2\u02b6\u02b7\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b8"+ + "\u02ba\5X-\2\u02b9\u02b0\3\2\2\2\u02b9\u02b6\3\2\2\2\u02ba[\3\2\2\2\u02bb"+ + "\u02be\7f\2\2\u02bc\u02be\7g\2\2\u02bd\u02bb\3\2\2\2\u02bd\u02bc\3\2\2"+ + "\2\u02be]\3\2\2\2\u02bf\u02c3\7c\2\2\u02c0\u02c3\5d\63\2\u02c1\u02c3\7"+ + "d\2\2\u02c2\u02bf\3\2\2\2\u02c2\u02c0\3\2\2\2\u02c2\u02c1\3\2\2\2\u02c3"+ + "_\3\2\2\2\u02c4\u02c6\t\n\2\2\u02c5\u02c4\3\2\2\2\u02c5\u02c6\3\2\2\2"+ + "\u02c6\u02c7\3\2\2\2\u02c7\u02cd\7b\2\2\u02c8\u02ca\t\n\2\2\u02c9\u02c8"+ + "\3\2\2\2\u02c9\u02ca\3\2\2\2\u02ca\u02cb\3\2\2\2\u02cb\u02cd\7a\2\2\u02cc"+ + "\u02c5\3\2\2\2\u02cc\u02c9\3\2\2\2\u02cda\3\2\2\2\u02ce\u02cf\t\16\2\2"+ + "\u02cfc\3\2\2\2\u02d0\u02d1\t\17\2\2\u02d1e\3\2\2\2buw{\u0084\u0086\u008a"+ + "\u0091\u0098\u009d\u00a2\u00ac\u00b0\u00b8\u00bb\u00c1\u00c6\u00c9\u00d0"+ + "\u00d8\u00db\u00e7\u00ea\u00ed\u00f4\u00fb\u00ff\u0103\u010a\u010e\u0112"+ + "\u0117\u011b\u0123\u0127\u012e\u0139\u013c\u0140\u014c\u014f\u0155\u015c"+ + "\u0163\u0166\u016a\u016e\u0172\u0174\u017f\u0184\u0188\u018b\u0191\u0194"+ + "\u019a\u019d\u019f\u01c2\u01ca\u01cc\u01d3\u01d8\u01db\u01e3\u01ec\u01f2"+ + "\u01fa\u01ff\u0205\u0208\u020f\u0217\u021d\u0229\u022b\u0235\u0243\u024a"+ + "\u0258\u0266\u026b\u0272\u0275\u027c\u0284\u0297\u02a4\u02ab\u02b0\u02b6"+ + "\u02b9\u02bd\u02c2\u02c5\u02c9\u02cc"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseVisitor.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseVisitor.java index 2c28b18cdf2ee..3b1b730e81bb7 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseVisitor.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/parser/SqlBaseVisitor.java @@ -294,6 +294,12 @@ interface SqlBaseVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitLogicalBinary(SqlBaseParser.LogicalBinaryContext ctx); + /** + * Visit a parse tree produced by {@link SqlBaseParser#matchQueryOptions}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMatchQueryOptions(SqlBaseParser.MatchQueryOptionsContext ctx); /** * Visit a parse tree produced by {@link SqlBaseParser#predicated}. * @param ctx the parse tree diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/SqlParserTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/SqlParserTests.java index de9c6c56da099..3e7e562e599d0 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/SqlParserTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/parser/SqlParserTests.java @@ -11,6 +11,10 @@ import org.elasticsearch.xpack.sql.expression.UnresolvedAttribute; import org.elasticsearch.xpack.sql.expression.UnresolvedStar; import org.elasticsearch.xpack.sql.expression.function.UnresolvedFunction; +import org.elasticsearch.xpack.sql.expression.predicate.fulltext.MatchQueryPredicate; +import org.elasticsearch.xpack.sql.expression.predicate.fulltext.MultiMatchQueryPredicate; +import org.elasticsearch.xpack.sql.expression.predicate.fulltext.StringQueryPredicate; +import org.elasticsearch.xpack.sql.plan.logical.Filter; import org.elasticsearch.xpack.sql.plan.logical.LogicalPlan; import org.elasticsearch.xpack.sql.plan.logical.OrderBy; import org.elasticsearch.xpack.sql.plan.logical.Project; @@ -19,6 +23,7 @@ import java.util.List; import static java.util.stream.Collectors.toList; +import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.instanceOf; @@ -92,6 +97,45 @@ public void testOrderByTwo() { assertEquals("baz", a.name()); } + public void testStringQuery() { + LogicalPlan plan = + parseStatement("SELECT * FROM FOO WHERE " + + "QUERY('foo', 'default_field=last_name;lenient=true', 'fuzzy_rewrite=scoring_boolean')"); + + StringQueryPredicate sqp = (StringQueryPredicate) ((Filter) plan.children().get(0).children().get(0)).condition(); + assertEquals("foo", sqp.query()); + assertEquals(3, sqp.optionMap().size()); + assertThat(sqp.optionMap(), hasEntry("default_field", "last_name")); + assertThat(sqp.optionMap(), hasEntry("lenient", "true")); + assertThat(sqp.optionMap(), hasEntry("fuzzy_rewrite", "scoring_boolean")); + } + + public void testMatchQuery() { + LogicalPlan plan = parseStatement("SELECT * FROM FOO WHERE " + + "MATCH(first_name, 'foo', 'operator=AND;lenient=true', 'fuzzy_rewrite=scoring_boolean')"); + + MatchQueryPredicate mqp = (MatchQueryPredicate) ((Filter) plan.children().get(0).children().get(0)).condition(); + assertEquals("foo", mqp.query()); + assertEquals("?first_name", mqp.field().toString()); + assertEquals(3, mqp.optionMap().size()); + assertThat(mqp.optionMap(), hasEntry("operator", "AND")); + assertThat(mqp.optionMap(), hasEntry("lenient", "true")); + assertThat(mqp.optionMap(), hasEntry("fuzzy_rewrite", "scoring_boolean")); + } + + public void testMultiMatchQuery() { + LogicalPlan plan = parseStatement("SELECT * FROM FOO WHERE " + + "MATCH('first_name,last_name', 'foo', 'operator=AND;type=best_fields', 'fuzzy_rewrite=scoring_boolean')"); + + MultiMatchQueryPredicate mmqp = (MultiMatchQueryPredicate) ((Filter) plan.children().get(0).children().get(0)).condition(); + assertEquals("foo", mmqp.query()); + assertEquals("first_name,last_name", mmqp.fieldString()); + assertEquals(3, mmqp.optionMap().size()); + assertThat(mmqp.optionMap(), hasEntry("operator", "AND")); + assertThat(mmqp.optionMap(), hasEntry("type", "best_fields")); + assertThat(mmqp.optionMap(), hasEntry("fuzzy_rewrite", "scoring_boolean")); + } + private LogicalPlan parseStatement(String sql) { return new SqlParser().createStatement(sql); } @@ -132,4 +176,4 @@ private String stringForDirection(Order.OrderDirection dir) { String dirStr = dir.toString(); return randomBoolean() && dirStr.equals("ASC") ? "" : " " + dirStr; } -} \ No newline at end of file +} diff --git a/x-pack/qa/sql/src/main/resources/fulltext.csv-spec b/x-pack/qa/sql/src/main/resources/fulltext.csv-spec index 5c032917ff153..93493ffdc2acb 100644 --- a/x-pack/qa/sql/src/main/resources/fulltext.csv-spec +++ b/x-pack/qa/sql/src/main/resources/fulltext.csv-spec @@ -23,6 +23,13 @@ SELECT emp_no, first_name, gender, last_name FROM test_emp WHERE QUERY('Man*', ' 10096 |Jayson |M |Mandell ; +simpleQueryOptionsInMultipleCommaSeparatedStrings +SELECT emp_no, first_name, gender, last_name FROM test_emp WHERE QUERY('Man*', 'default_field=last_name;lenient=true', 'fuzzy_rewrite=scoring_boolean') LIMIT 5; + + emp_no:i | first_name:s | gender:s | last_name:s +10096 |Jayson |M |Mandell +; + matchQuery SELECT emp_no, first_name, gender, last_name FROM test_emp WHERE MATCH(first_name, 'Erez'); @@ -37,6 +44,13 @@ SELECT emp_no, first_name, gender, last_name FROM test_emp WHERE MATCH(first_nam 10076 |Erez |F |Ritzmann ; +matchQueryWithOptionsInMultipleCommaSeparatedStrings +SELECT emp_no, first_name, gender, last_name FROM test_emp WHERE MATCH(first_name, 'Erez', 'lenient=true;cutoff_frequency=2','fuzzy_rewrite=scoring_boolean;minimum_should_match=1','operator=AND', 'max_expansions=30;prefix_length=1;analyzer=english;auto_generate_synonyms_phrase_query=true;fuzzy_transpositions=true'); + + emp_no:i | first_name:s | gender:s | last_name:s +10076 |Erez |F |Ritzmann +; + multiMatchQuery SELECT emp_no, first_name, gender, last_name FROM test_emp WHERE MATCH('first_name,last_name', 'Morton', 'type=best_fields;operator=OR'); @@ -51,6 +65,13 @@ SELECT emp_no, first_name, gender, last_name FROM test_emp WHERE MATCH('first_na 10095 |Hilari |M |Morton ; +multiMatchQueryWithInMultipleCommaSeparatedStrings +SELECT emp_no, first_name, gender, last_name FROM test_emp WHERE MATCH('first_name,last_name', 'Morton', 'slop=1;lenient=true', 'cutoff_frequency=2','tie_breaker=0.1;use_dis_max=true;fuzzy_rewrite=scoring_boolean','minimum_should_match=1;operator=AND;max_expansions=30;prefix_length=1;analyzer=english;type=best_fields;auto_generate_synonyms_phrase_query=true;fuzzy_transpositions=true'); + + emp_no:i | first_name:s | gender:s | last_name:s +10095 |Hilari |M |Morton +; + score SELECT emp_no, first_name, SCORE() FROM test_emp WHERE MATCH(first_name, 'Erez') ORDER BY SCORE(); From 32075e6787b68a573e546bdf8a58dbb2884fdb14 Mon Sep 17 00:00:00 2001 From: Marios Trivyzas Date: Tue, 18 Sep 2018 19:27:23 +0200 Subject: [PATCH 2/2] Added unit tests --- .../fulltext/FullTextUtilsTests.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextUtilsTests.java diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextUtilsTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextUtilsTests.java new file mode 100644 index 0000000000000..7dd08e9c34cef --- /dev/null +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/predicate/fulltext/FullTextUtilsTests.java @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.sql.expression.predicate.fulltext; + +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.xpack.sql.parser.ParsingException; +import org.elasticsearch.xpack.sql.tree.Location; + +import java.util.Map; + +import static org.hamcrest.Matchers.hasEntry; +import static org.hamcrest.Matchers.is; + +public class FullTextUtilsTests extends ESTestCase { + + public void testColonDelimited() { + Map options = FullTextUtils.parseSettings("k1=v1;k2=v2", new Location(1, 1)); + assertThat(options.size(), is(2)); + assertThat(options, hasEntry("k1", "v1")); + assertThat(options, hasEntry("k2", "v2")); + } + + public void testColonDelimitedErrorString() { + ParsingException e = expectThrows(ParsingException.class, + () -> FullTextUtils.parseSettings("k1=v1;k2v2", new Location(1, 1))); + assertThat(e.getMessage(), is("line 1:3: Cannot parse entry k2v2 in options k1=v1;k2v2")); + assertThat(e.getLineNumber(), is(1)); + assertThat(e.getColumnNumber(), is(3)); + } + + public void testColonDelimitedErrorDuplicate() { + ParsingException e = expectThrows(ParsingException.class, + () -> FullTextUtils.parseSettings("k1=v1;k1=v2", new Location(1, 1))); + assertThat(e.getMessage(), is("line 1:3: Duplicate option k1=v2 detected in options k1=v1;k1=v2")); + assertThat(e.getLineNumber(), is(1)); + assertThat(e.getColumnNumber(), is(3)); + } +}