SQL: introduce SYS CATALOGS and TABLE TYPES commands (elastic/x-pack-elasticsearch#3941)

These are the equivalent of JDBC/ODBC getCatalogs and getTableTypes on
the server side.

Original commit: elastic/x-pack-elasticsearch@a6fa733680
This commit is contained in:
Costin Leau 2018-02-15 21:51:23 +02:00 committed by GitHub
parent 42f9a990d1
commit 844c485e0d
17 changed files with 1666 additions and 1249 deletions

View File

@ -728,16 +728,12 @@ class JdbcDatabaseMetaData implements DatabaseMetaData, JdbcWrapper {
@Override
public ResultSet getCatalogs() throws SQLException {
Object[][] data = { { defaultCatalog() } };
return memorySet(con.cfg, columnInfo("CATALOGS",
"TABLE_CAT"), data);
return con.createStatement().executeQuery("SYS CATALOGS");
}
@Override
public ResultSet getTableTypes() throws SQLException {
Object[][] data = { { "TABLE" } };
return memorySet(con.cfg, columnInfo("TABLE_TYPES",
"TABLE_TYPE"), data);
return con.createStatement().executeQuery("SYS TABLE TYPES");
}
@Override

View File

@ -55,9 +55,11 @@ statement
| (DESCRIBE | DESC) tableIdentifier #showColumns
| SHOW FUNCTIONS (LIKE? pattern)? #showFunctions
| SHOW SCHEMAS #showSchemas
| SYS CATALOGS #sysCatalogs
| SYS TABLES (LIKE? pattern)? #sysTables
| SYS COLUMNS (TABLES LIKE? indexPattern=pattern)? (LIKE? columnPattern=pattern)? #sysColumns
| SYS TYPES #sysTypes
| SYS TYPES #sysTypes
| SYS TABLE TYPES #sysTableTypes
;
query
@ -256,7 +258,7 @@ number
// http://developer.mimer.se/validator/sql-reserved-words.tml
nonReserved
: ANALYZE | ANALYZED
| COLUMNS
| CATALOGS | COLUMNS
| DEBUG
| EXECUTABLE | EXPLAIN
| FORMAT | FUNCTIONS
@ -281,6 +283,7 @@ ASC: 'ASC';
BETWEEN: 'BETWEEN';
BY: 'BY';
CAST: 'CAST';
CATALOGS: 'CATALOGS';
COLUMNS: 'COLUMNS';
DEBUG: 'DEBUG';
DESC: 'DESC';
@ -326,6 +329,7 @@ SCHEMAS: 'SCHEMAS';
SELECT: 'SELECT';
SHOW: 'SHOW';
SYS: 'SYS';
TABLE: 'TABLE';
TABLES: 'TABLES';
TEXT: 'TEXT';
TRUE: 'TRUE';

View File

@ -12,85 +12,87 @@ ASC=11
BETWEEN=12
BY=13
CAST=14
COLUMNS=15
DEBUG=16
DESC=17
DESCRIBE=18
DISTINCT=19
ESCAPE=20
EXECUTABLE=21
EXISTS=22
EXPLAIN=23
EXTRACT=24
FALSE=25
FORMAT=26
FROM=27
FULL=28
FUNCTIONS=29
GRAPHVIZ=30
GROUP=31
HAVING=32
IN=33
INNER=34
IS=35
JOIN=36
LEFT=37
LIKE=38
LIMIT=39
MAPPED=40
MATCH=41
NATURAL=42
NOT=43
NULL=44
ON=45
OPTIMIZED=46
OR=47
ORDER=48
OUTER=49
PARSED=50
PHYSICAL=51
PLAN=52
RIGHT=53
RLIKE=54
QUERY=55
SCHEMAS=56
SELECT=57
SHOW=58
SYS=59
TABLES=60
TEXT=61
TRUE=62
TYPES=63
USING=64
VERIFY=65
WHERE=66
WITH=67
EQ=68
NEQ=69
LT=70
LTE=71
GT=72
GTE=73
PLUS=74
MINUS=75
ASTERISK=76
SLASH=77
PERCENT=78
CONCAT=79
DOT=80
STRING=81
INTEGER_VALUE=82
DECIMAL_VALUE=83
IDENTIFIER=84
DIGIT_IDENTIFIER=85
TABLE_IDENTIFIER=86
QUOTED_IDENTIFIER=87
BACKQUOTED_IDENTIFIER=88
SIMPLE_COMMENT=89
BRACKETED_COMMENT=90
WS=91
UNRECOGNIZED=92
DELIMITER=93
CATALOGS=15
COLUMNS=16
DEBUG=17
DESC=18
DESCRIBE=19
DISTINCT=20
ESCAPE=21
EXECUTABLE=22
EXISTS=23
EXPLAIN=24
EXTRACT=25
FALSE=26
FORMAT=27
FROM=28
FULL=29
FUNCTIONS=30
GRAPHVIZ=31
GROUP=32
HAVING=33
IN=34
INNER=35
IS=36
JOIN=37
LEFT=38
LIKE=39
LIMIT=40
MAPPED=41
MATCH=42
NATURAL=43
NOT=44
NULL=45
ON=46
OPTIMIZED=47
OR=48
ORDER=49
OUTER=50
PARSED=51
PHYSICAL=52
PLAN=53
RIGHT=54
RLIKE=55
QUERY=56
SCHEMAS=57
SELECT=58
SHOW=59
SYS=60
TABLE=61
TABLES=62
TEXT=63
TRUE=64
TYPES=65
USING=66
VERIFY=67
WHERE=68
WITH=69
EQ=70
NEQ=71
LT=72
LTE=73
GT=74
GTE=75
PLUS=76
MINUS=77
ASTERISK=78
SLASH=79
PERCENT=80
CONCAT=81
DOT=82
STRING=83
INTEGER_VALUE=84
DECIMAL_VALUE=85
IDENTIFIER=86
DIGIT_IDENTIFIER=87
TABLE_IDENTIFIER=88
QUOTED_IDENTIFIER=89
BACKQUOTED_IDENTIFIER=90
SIMPLE_COMMENT=91
BRACKETED_COMMENT=92
WS=93
UNRECOGNIZED=94
DELIMITER=95
'('=1
')'=2
','=3
@ -105,68 +107,70 @@ DELIMITER=93
'BETWEEN'=12
'BY'=13
'CAST'=14
'COLUMNS'=15
'DEBUG'=16
'DESC'=17
'DESCRIBE'=18
'DISTINCT'=19
'ESCAPE'=20
'EXECUTABLE'=21
'EXISTS'=22
'EXPLAIN'=23
'EXTRACT'=24
'FALSE'=25
'FORMAT'=26
'FROM'=27
'FULL'=28
'FUNCTIONS'=29
'GRAPHVIZ'=30
'GROUP'=31
'HAVING'=32
'IN'=33
'INNER'=34
'IS'=35
'JOIN'=36
'LEFT'=37
'LIKE'=38
'LIMIT'=39
'MAPPED'=40
'MATCH'=41
'NATURAL'=42
'NOT'=43
'NULL'=44
'ON'=45
'OPTIMIZED'=46
'OR'=47
'ORDER'=48
'OUTER'=49
'PARSED'=50
'PHYSICAL'=51
'PLAN'=52
'RIGHT'=53
'RLIKE'=54
'QUERY'=55
'SCHEMAS'=56
'SELECT'=57
'SHOW'=58
'SYS'=59
'TABLES'=60
'TEXT'=61
'TRUE'=62
'TYPES'=63
'USING'=64
'VERIFY'=65
'WHERE'=66
'WITH'=67
'='=68
'<'=70
'<='=71
'>'=72
'>='=73
'+'=74
'-'=75
'*'=76
'/'=77
'%'=78
'||'=79
'.'=80
'CATALOGS'=15
'COLUMNS'=16
'DEBUG'=17
'DESC'=18
'DESCRIBE'=19
'DISTINCT'=20
'ESCAPE'=21
'EXECUTABLE'=22
'EXISTS'=23
'EXPLAIN'=24
'EXTRACT'=25
'FALSE'=26
'FORMAT'=27
'FROM'=28
'FULL'=29
'FUNCTIONS'=30
'GRAPHVIZ'=31
'GROUP'=32
'HAVING'=33
'IN'=34
'INNER'=35
'IS'=36
'JOIN'=37
'LEFT'=38
'LIKE'=39
'LIMIT'=40
'MAPPED'=41
'MATCH'=42
'NATURAL'=43
'NOT'=44
'NULL'=45
'ON'=46
'OPTIMIZED'=47
'OR'=48
'ORDER'=49
'OUTER'=50
'PARSED'=51
'PHYSICAL'=52
'PLAN'=53
'RIGHT'=54
'RLIKE'=55
'QUERY'=56
'SCHEMAS'=57
'SELECT'=58
'SHOW'=59
'SYS'=60
'TABLE'=61
'TABLES'=62
'TEXT'=63
'TRUE'=64
'TYPES'=65
'USING'=66
'VERIFY'=67
'WHERE'=68
'WITH'=69
'='=70
'<'=72
'<='=73
'>'=74
'>='=75
'+'=76
'-'=77
'*'=78
'/'=79
'%'=80
'||'=81
'.'=82

View File

@ -12,84 +12,86 @@ ASC=11
BETWEEN=12
BY=13
CAST=14
COLUMNS=15
DEBUG=16
DESC=17
DESCRIBE=18
DISTINCT=19
ESCAPE=20
EXECUTABLE=21
EXISTS=22
EXPLAIN=23
EXTRACT=24
FALSE=25
FORMAT=26
FROM=27
FULL=28
FUNCTIONS=29
GRAPHVIZ=30
GROUP=31
HAVING=32
IN=33
INNER=34
IS=35
JOIN=36
LEFT=37
LIKE=38
LIMIT=39
MAPPED=40
MATCH=41
NATURAL=42
NOT=43
NULL=44
ON=45
OPTIMIZED=46
OR=47
ORDER=48
OUTER=49
PARSED=50
PHYSICAL=51
PLAN=52
RIGHT=53
RLIKE=54
QUERY=55
SCHEMAS=56
SELECT=57
SHOW=58
SYS=59
TABLES=60
TEXT=61
TRUE=62
TYPES=63
USING=64
VERIFY=65
WHERE=66
WITH=67
EQ=68
NEQ=69
LT=70
LTE=71
GT=72
GTE=73
PLUS=74
MINUS=75
ASTERISK=76
SLASH=77
PERCENT=78
CONCAT=79
DOT=80
STRING=81
INTEGER_VALUE=82
DECIMAL_VALUE=83
IDENTIFIER=84
DIGIT_IDENTIFIER=85
TABLE_IDENTIFIER=86
QUOTED_IDENTIFIER=87
BACKQUOTED_IDENTIFIER=88
SIMPLE_COMMENT=89
BRACKETED_COMMENT=90
WS=91
UNRECOGNIZED=92
CATALOGS=15
COLUMNS=16
DEBUG=17
DESC=18
DESCRIBE=19
DISTINCT=20
ESCAPE=21
EXECUTABLE=22
EXISTS=23
EXPLAIN=24
EXTRACT=25
FALSE=26
FORMAT=27
FROM=28
FULL=29
FUNCTIONS=30
GRAPHVIZ=31
GROUP=32
HAVING=33
IN=34
INNER=35
IS=36
JOIN=37
LEFT=38
LIKE=39
LIMIT=40
MAPPED=41
MATCH=42
NATURAL=43
NOT=44
NULL=45
ON=46
OPTIMIZED=47
OR=48
ORDER=49
OUTER=50
PARSED=51
PHYSICAL=52
PLAN=53
RIGHT=54
RLIKE=55
QUERY=56
SCHEMAS=57
SELECT=58
SHOW=59
SYS=60
TABLE=61
TABLES=62
TEXT=63
TRUE=64
TYPES=65
USING=66
VERIFY=67
WHERE=68
WITH=69
EQ=70
NEQ=71
LT=72
LTE=73
GT=74
GTE=75
PLUS=76
MINUS=77
ASTERISK=78
SLASH=79
PERCENT=80
CONCAT=81
DOT=82
STRING=83
INTEGER_VALUE=84
DECIMAL_VALUE=85
IDENTIFIER=86
DIGIT_IDENTIFIER=87
TABLE_IDENTIFIER=88
QUOTED_IDENTIFIER=89
BACKQUOTED_IDENTIFIER=90
SIMPLE_COMMENT=91
BRACKETED_COMMENT=92
WS=93
UNRECOGNIZED=94
'('=1
')'=2
','=3
@ -104,68 +106,70 @@ UNRECOGNIZED=92
'BETWEEN'=12
'BY'=13
'CAST'=14
'COLUMNS'=15
'DEBUG'=16
'DESC'=17
'DESCRIBE'=18
'DISTINCT'=19
'ESCAPE'=20
'EXECUTABLE'=21
'EXISTS'=22
'EXPLAIN'=23
'EXTRACT'=24
'FALSE'=25
'FORMAT'=26
'FROM'=27
'FULL'=28
'FUNCTIONS'=29
'GRAPHVIZ'=30
'GROUP'=31
'HAVING'=32
'IN'=33
'INNER'=34
'IS'=35
'JOIN'=36
'LEFT'=37
'LIKE'=38
'LIMIT'=39
'MAPPED'=40
'MATCH'=41
'NATURAL'=42
'NOT'=43
'NULL'=44
'ON'=45
'OPTIMIZED'=46
'OR'=47
'ORDER'=48
'OUTER'=49
'PARSED'=50
'PHYSICAL'=51
'PLAN'=52
'RIGHT'=53
'RLIKE'=54
'QUERY'=55
'SCHEMAS'=56
'SELECT'=57
'SHOW'=58
'SYS'=59
'TABLES'=60
'TEXT'=61
'TRUE'=62
'TYPES'=63
'USING'=64
'VERIFY'=65
'WHERE'=66
'WITH'=67
'='=68
'<'=70
'<='=71
'>'=72
'>='=73
'+'=74
'-'=75
'*'=76
'/'=77
'%'=78
'||'=79
'.'=80
'CATALOGS'=15
'COLUMNS'=16
'DEBUG'=17
'DESC'=18
'DESCRIBE'=19
'DISTINCT'=20
'ESCAPE'=21
'EXECUTABLE'=22
'EXISTS'=23
'EXPLAIN'=24
'EXTRACT'=25
'FALSE'=26
'FORMAT'=27
'FROM'=28
'FULL'=29
'FUNCTIONS'=30
'GRAPHVIZ'=31
'GROUP'=32
'HAVING'=33
'IN'=34
'INNER'=35
'IS'=36
'JOIN'=37
'LEFT'=38
'LIKE'=39
'LIMIT'=40
'MAPPED'=41
'MATCH'=42
'NATURAL'=43
'NOT'=44
'NULL'=45
'ON'=46
'OPTIMIZED'=47
'OR'=48
'ORDER'=49
'OUTER'=50
'PARSED'=51
'PHYSICAL'=52
'PLAN'=53
'RIGHT'=54
'RLIKE'=55
'QUERY'=56
'SCHEMAS'=57
'SELECT'=58
'SHOW'=59
'SYS'=60
'TABLE'=61
'TABLES'=62
'TEXT'=63
'TRUE'=64
'TYPES'=65
'USING'=66
'VERIFY'=67
'WHERE'=68
'WITH'=69
'='=70
'<'=72
'<='=73
'>'=74
'>='=75
'+'=76
'-'=77
'*'=78
'/'=79
'%'=80
'||'=81
'.'=82

View File

@ -12,7 +12,9 @@ import org.elasticsearch.xpack.sql.parser.SqlBaseParser.ShowColumnsContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.ShowFunctionsContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.ShowSchemasContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.ShowTablesContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.SysCatalogsContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.SysColumnsContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.SysTableTypesContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.SysTablesContext;
import org.elasticsearch.xpack.sql.parser.SqlBaseParser.SysTypesContext;
import org.elasticsearch.xpack.sql.plan.TableIdentifier;
@ -23,7 +25,9 @@ import org.elasticsearch.xpack.sql.plan.logical.command.ShowColumns;
import org.elasticsearch.xpack.sql.plan.logical.command.ShowFunctions;
import org.elasticsearch.xpack.sql.plan.logical.command.ShowSchemas;
import org.elasticsearch.xpack.sql.plan.logical.command.ShowTables;
import org.elasticsearch.xpack.sql.plan.logical.command.sys.SysCatalogs;
import org.elasticsearch.xpack.sql.plan.logical.command.sys.SysColumns;
import org.elasticsearch.xpack.sql.plan.logical.command.sys.SysTableTypes;
import org.elasticsearch.xpack.sql.plan.logical.command.sys.SysTables;
import org.elasticsearch.xpack.sql.plan.logical.command.sys.SysTypes;
import org.elasticsearch.xpack.sql.tree.Location;
@ -127,19 +131,28 @@ abstract class CommandBuilder extends LogicalPlanBuilder {
return new ShowColumns(source(ctx), identifier.index());
}
@Override
public Object visitSysCatalogs(SysCatalogsContext ctx) {
return new SysCatalogs(source(ctx));
}
@Override
public SysTables visitSysTables(SysTablesContext ctx) {
return new SysTables(source(ctx), visitPattern(ctx.pattern()));
}
@Override
public Object visitSysColumns(SysColumnsContext ctx) {
return new SysColumns(source(ctx), visitPattern(ctx.indexPattern), visitPattern(ctx.columnPattern));
}
@Override
public SysTypes visitSysTypes(SysTypesContext ctx) {
return new SysTypes(source(ctx));
}
@Override
public Object visitSysColumns(SysColumnsContext ctx) {
return new SysColumns(source(ctx), visitPattern(ctx.indexPattern), visitPattern(ctx.columnPattern));
public Object visitSysTableTypes(SysTableTypesContext ctx) {
return new SysTableTypes(source(ctx));
}
}

View File

@ -124,6 +124,18 @@ class SqlBaseBaseListener implements SqlBaseListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitShowSchemas(SqlBaseParser.ShowSchemasContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterSysCatalogs(SqlBaseParser.SysCatalogsContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitSysCatalogs(SqlBaseParser.SysCatalogsContext ctx) { }
/**
* {@inheritDoc}
*
@ -160,6 +172,18 @@ class SqlBaseBaseListener implements SqlBaseListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitSysTypes(SqlBaseParser.SysTypesContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterSysTableTypes(SqlBaseParser.SysTableTypesContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitSysTableTypes(SqlBaseParser.SysTableTypesContext ctx) { }
/**
* {@inheritDoc}
*

View File

@ -79,6 +79,13 @@ class SqlBaseBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements SqlBa
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitShowSchemas(SqlBaseParser.ShowSchemasContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitSysCatalogs(SqlBaseParser.SysCatalogsContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@ -100,6 +107,13 @@ class SqlBaseBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements SqlBa
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitSysTypes(SqlBaseParser.SysTypesContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitSysTableTypes(SqlBaseParser.SysTableTypesContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*

View File

@ -23,67 +23,67 @@ class SqlBaseLexer extends Lexer {
new PredictionContextCache();
public static final int
T__0=1, T__1=2, T__2=3, T__3=4, ALL=5, ANALYZE=6, ANALYZED=7, AND=8, ANY=9,
AS=10, ASC=11, BETWEEN=12, BY=13, CAST=14, COLUMNS=15, DEBUG=16, DESC=17,
DESCRIBE=18, DISTINCT=19, ESCAPE=20, EXECUTABLE=21, EXISTS=22, EXPLAIN=23,
EXTRACT=24, FALSE=25, FORMAT=26, FROM=27, FULL=28, FUNCTIONS=29, GRAPHVIZ=30,
GROUP=31, HAVING=32, IN=33, INNER=34, IS=35, JOIN=36, LEFT=37, LIKE=38,
LIMIT=39, MAPPED=40, MATCH=41, NATURAL=42, NOT=43, NULL=44, ON=45, OPTIMIZED=46,
OR=47, ORDER=48, OUTER=49, PARSED=50, PHYSICAL=51, PLAN=52, RIGHT=53,
RLIKE=54, QUERY=55, SCHEMAS=56, SELECT=57, SHOW=58, SYS=59, TABLES=60,
TEXT=61, TRUE=62, TYPES=63, USING=64, VERIFY=65, WHERE=66, WITH=67, EQ=68,
NEQ=69, LT=70, LTE=71, GT=72, GTE=73, PLUS=74, MINUS=75, ASTERISK=76,
SLASH=77, PERCENT=78, CONCAT=79, DOT=80, STRING=81, INTEGER_VALUE=82,
DECIMAL_VALUE=83, IDENTIFIER=84, DIGIT_IDENTIFIER=85, TABLE_IDENTIFIER=86,
QUOTED_IDENTIFIER=87, BACKQUOTED_IDENTIFIER=88, SIMPLE_COMMENT=89, BRACKETED_COMMENT=90,
WS=91, UNRECOGNIZED=92;
AS=10, ASC=11, BETWEEN=12, BY=13, CAST=14, CATALOGS=15, COLUMNS=16, DEBUG=17,
DESC=18, DESCRIBE=19, DISTINCT=20, ESCAPE=21, EXECUTABLE=22, EXISTS=23,
EXPLAIN=24, EXTRACT=25, FALSE=26, FORMAT=27, FROM=28, FULL=29, FUNCTIONS=30,
GRAPHVIZ=31, GROUP=32, HAVING=33, IN=34, INNER=35, IS=36, JOIN=37, LEFT=38,
LIKE=39, LIMIT=40, MAPPED=41, MATCH=42, NATURAL=43, NOT=44, NULL=45, ON=46,
OPTIMIZED=47, OR=48, ORDER=49, OUTER=50, PARSED=51, PHYSICAL=52, PLAN=53,
RIGHT=54, RLIKE=55, QUERY=56, SCHEMAS=57, SELECT=58, SHOW=59, SYS=60,
TABLE=61, TABLES=62, TEXT=63, TRUE=64, TYPES=65, USING=66, VERIFY=67,
WHERE=68, WITH=69, EQ=70, NEQ=71, LT=72, LTE=73, GT=74, GTE=75, PLUS=76,
MINUS=77, ASTERISK=78, SLASH=79, PERCENT=80, CONCAT=81, DOT=82, STRING=83,
INTEGER_VALUE=84, DECIMAL_VALUE=85, IDENTIFIER=86, DIGIT_IDENTIFIER=87,
TABLE_IDENTIFIER=88, QUOTED_IDENTIFIER=89, BACKQUOTED_IDENTIFIER=90, SIMPLE_COMMENT=91,
BRACKETED_COMMENT=92, WS=93, UNRECOGNIZED=94;
public static String[] modeNames = {
"DEFAULT_MODE"
};
public static final String[] ruleNames = {
"T__0", "T__1", "T__2", "T__3", "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
"AS", "ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE",
"DISTINCT", "ESCAPE", "EXECUTABLE", "EXISTS", "EXPLAIN", "EXTRACT", "FALSE",
"FORMAT", "FROM", "FULL", "FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING",
"IN", "INNER", "IS", "JOIN", "LEFT", "LIKE", "LIMIT", "MAPPED", "MATCH",
"NATURAL", "NOT", "NULL", "ON", "OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED",
"PHYSICAL", "PLAN", "RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SELECT", "SHOW",
"SYS", "TABLES", "TEXT", "TRUE", "TYPES", "USING", "VERIFY", "WHERE",
"WITH", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK",
"SLASH", "PERCENT", "CONCAT", "DOT", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE",
"IDENTIFIER", "DIGIT_IDENTIFIER", "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER",
"BACKQUOTED_IDENTIFIER", "EXPONENT", "DIGIT", "LETTER", "SIMPLE_COMMENT",
"BRACKETED_COMMENT", "WS", "UNRECOGNIZED"
"AS", "ASC", "BETWEEN", "BY", "CAST", "CATALOGS", "COLUMNS", "DEBUG",
"DESC", "DESCRIBE", "DISTINCT", "ESCAPE", "EXECUTABLE", "EXISTS", "EXPLAIN",
"EXTRACT", "FALSE", "FORMAT", "FROM", "FULL", "FUNCTIONS", "GRAPHVIZ",
"GROUP", "HAVING", "IN", "INNER", "IS", "JOIN", "LEFT", "LIKE", "LIMIT",
"MAPPED", "MATCH", "NATURAL", "NOT", "NULL", "ON", "OPTIMIZED", "OR",
"ORDER", "OUTER", "PARSED", "PHYSICAL", "PLAN", "RIGHT", "RLIKE", "QUERY",
"SCHEMAS", "SELECT", "SHOW", "SYS", "TABLE", "TABLES", "TEXT", "TRUE",
"TYPES", "USING", "VERIFY", "WHERE", "WITH", "EQ", "NEQ", "LT", "LTE",
"GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CONCAT",
"DOT", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE", "IDENTIFIER", "DIGIT_IDENTIFIER",
"TABLE_IDENTIFIER", "QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER", "EXPONENT",
"DIGIT", "LETTER", "SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS", "UNRECOGNIZED"
};
private static final String[] _LITERAL_NAMES = {
null, "'('", "')'", "','", "':'", "'ALL'", "'ANALYZE'", "'ANALYZED'",
"'AND'", "'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CAST'", "'COLUMNS'",
"'DEBUG'", "'DESC'", "'DESCRIBE'", "'DISTINCT'", "'ESCAPE'", "'EXECUTABLE'",
"'EXISTS'", "'EXPLAIN'", "'EXTRACT'", "'FALSE'", "'FORMAT'", "'FROM'",
"'FULL'", "'FUNCTIONS'", "'GRAPHVIZ'", "'GROUP'", "'HAVING'", "'IN'",
"'INNER'", "'IS'", "'JOIN'", "'LEFT'", "'LIKE'", "'LIMIT'", "'MAPPED'",
"'AND'", "'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CAST'", "'CATALOGS'",
"'COLUMNS'", "'DEBUG'", "'DESC'", "'DESCRIBE'", "'DISTINCT'", "'ESCAPE'",
"'EXECUTABLE'", "'EXISTS'", "'EXPLAIN'", "'EXTRACT'", "'FALSE'", "'FORMAT'",
"'FROM'", "'FULL'", "'FUNCTIONS'", "'GRAPHVIZ'", "'GROUP'", "'HAVING'",
"'IN'", "'INNER'", "'IS'", "'JOIN'", "'LEFT'", "'LIKE'", "'LIMIT'", "'MAPPED'",
"'MATCH'", "'NATURAL'", "'NOT'", "'NULL'", "'ON'", "'OPTIMIZED'", "'OR'",
"'ORDER'", "'OUTER'", "'PARSED'", "'PHYSICAL'", "'PLAN'", "'RIGHT'", "'RLIKE'",
"'QUERY'", "'SCHEMAS'", "'SELECT'", "'SHOW'", "'SYS'", "'TABLES'", "'TEXT'",
"'TRUE'", "'TYPES'", "'USING'", "'VERIFY'", "'WHERE'", "'WITH'", "'='",
null, "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'",
"'||'", "'.'"
"'QUERY'", "'SCHEMAS'", "'SELECT'", "'SHOW'", "'SYS'", "'TABLE'", "'TABLES'",
"'TEXT'", "'TRUE'", "'TYPES'", "'USING'", "'VERIFY'", "'WHERE'", "'WITH'",
"'='", null, "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'",
"'%'", "'||'", "'.'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
"AS", "ASC", "BETWEEN", "BY", "CAST", "COLUMNS", "DEBUG", "DESC", "DESCRIBE",
"DISTINCT", "ESCAPE", "EXECUTABLE", "EXISTS", "EXPLAIN", "EXTRACT", "FALSE",
"FORMAT", "FROM", "FULL", "FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING",
"IN", "INNER", "IS", "JOIN", "LEFT", "LIKE", "LIMIT", "MAPPED", "MATCH",
"NATURAL", "NOT", "NULL", "ON", "OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED",
"PHYSICAL", "PLAN", "RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SELECT", "SHOW",
"SYS", "TABLES", "TEXT", "TRUE", "TYPES", "USING", "VERIFY", "WHERE",
"WITH", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK",
"SLASH", "PERCENT", "CONCAT", "DOT", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE",
"IDENTIFIER", "DIGIT_IDENTIFIER", "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER",
"BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS",
"UNRECOGNIZED"
"AS", "ASC", "BETWEEN", "BY", "CAST", "CATALOGS", "COLUMNS", "DEBUG",
"DESC", "DESCRIBE", "DISTINCT", "ESCAPE", "EXECUTABLE", "EXISTS", "EXPLAIN",
"EXTRACT", "FALSE", "FORMAT", "FROM", "FULL", "FUNCTIONS", "GRAPHVIZ",
"GROUP", "HAVING", "IN", "INNER", "IS", "JOIN", "LEFT", "LIKE", "LIMIT",
"MAPPED", "MATCH", "NATURAL", "NOT", "NULL", "ON", "OPTIMIZED", "OR",
"ORDER", "OUTER", "PARSED", "PHYSICAL", "PLAN", "RIGHT", "RLIKE", "QUERY",
"SCHEMAS", "SELECT", "SHOW", "SYS", "TABLE", "TABLES", "TEXT", "TRUE",
"TYPES", "USING", "VERIFY", "WHERE", "WITH", "EQ", "NEQ", "LT", "LTE",
"GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CONCAT",
"DOT", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE", "IDENTIFIER", "DIGIT_IDENTIFIER",
"TABLE_IDENTIFIER", "QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT",
"BRACKETED_COMMENT", "WS", "UNRECOGNIZED"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -140,7 +140,7 @@ class SqlBaseLexer extends Lexer {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2^\u0313\b\1\4\2\t"+
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2`\u0326\b\1\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@ -151,263 +151,269 @@ class SqlBaseLexer extends Lexer {
"\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+
"\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+
"\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+
"`\t`\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3"+
"\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\n"+
"\3\n\3\n\3\n\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3"+
"\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20"+
"\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22"+
"\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24"+
"\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26"+
"\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27"+
"\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31"+
"\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33"+
"\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\36\3\36"+
"\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37"+
"\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3#"+
"\3#\3#\3#\3#\3#\3$\3$\3$\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'"+
"\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3+\3+\3"+
"+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3-\3-\3-\3-\3-\3.\3.\3.\3/\3/\3/\3/\3/\3"+
"/\3/\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3"+
"\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3"+
"\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3"+
"\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\39\39\3"+
"9\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3<\3<\3<\3<\3=\3"+
"=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3"+
"A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3"+
"E\3E\3F\3F\3F\3F\3F\3F\3F\5F\u0255\nF\3G\3G\3H\3H\3H\3I\3I\3J\3J\3J\3"+
"K\3K\3L\3L\3M\3M\3N\3N\3O\3O\3P\3P\3P\3Q\3Q\3R\3R\3R\3R\7R\u0274\nR\f"+
"R\16R\u0277\13R\3R\3R\3S\6S\u027c\nS\rS\16S\u027d\3T\6T\u0281\nT\rT\16"+
"T\u0282\3T\3T\7T\u0287\nT\fT\16T\u028a\13T\3T\3T\6T\u028e\nT\rT\16T\u028f"+
"\3T\6T\u0293\nT\rT\16T\u0294\3T\3T\7T\u0299\nT\fT\16T\u029c\13T\5T\u029e"+
"\nT\3T\3T\3T\3T\6T\u02a4\nT\rT\16T\u02a5\3T\3T\5T\u02aa\nT\3U\3U\5U\u02ae"+
"\nU\3U\3U\3U\7U\u02b3\nU\fU\16U\u02b6\13U\3V\3V\3V\3V\6V\u02bc\nV\rV\16"+
"V\u02bd\3W\3W\3W\3W\6W\u02c4\nW\rW\16W\u02c5\3X\3X\3X\3X\7X\u02cc\nX\f"+
"X\16X\u02cf\13X\3X\3X\3Y\3Y\3Y\3Y\7Y\u02d7\nY\fY\16Y\u02da\13Y\3Y\3Y\3"+
"Z\3Z\5Z\u02e0\nZ\3Z\6Z\u02e3\nZ\rZ\16Z\u02e4\3[\3[\3\\\3\\\3]\3]\3]\3"+
"]\7]\u02ef\n]\f]\16]\u02f2\13]\3]\5]\u02f5\n]\3]\5]\u02f8\n]\3]\3]\3^"+
"\3^\3^\3^\3^\7^\u0301\n^\f^\16^\u0304\13^\3^\3^\3^\3^\3^\3_\6_\u030c\n"+
"_\r_\16_\u030d\3_\3_\3`\3`\3\u0302\2a\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21"+
"\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30"+
"/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.["+
"/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083"+
"`\t`\4a\ta\4b\tb\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\7\3"+
"\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t"+
"\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3"+
"\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3"+
"\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3"+
"\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3"+
"\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3"+
"\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3"+
"\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3"+
"\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+
"\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3"+
"\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3"+
"\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3"+
"!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3%\3"+
"&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*"+
"\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-"+
"\3-\3.\3.\3.\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3"+
"\60\3\60\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3"+
"\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3"+
"\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3"+
"\67\3\67\38\38\38\38\38\38\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3"+
";\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3?\3"+
"?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3C\3"+
"C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3"+
"G\3G\3H\3H\3H\3H\3H\3H\3H\5H\u0268\nH\3I\3I\3J\3J\3J\3K\3K\3L\3L\3L\3"+
"M\3M\3N\3N\3O\3O\3P\3P\3Q\3Q\3R\3R\3R\3S\3S\3T\3T\3T\3T\7T\u0287\nT\f"+
"T\16T\u028a\13T\3T\3T\3U\6U\u028f\nU\rU\16U\u0290\3V\6V\u0294\nV\rV\16"+
"V\u0295\3V\3V\7V\u029a\nV\fV\16V\u029d\13V\3V\3V\6V\u02a1\nV\rV\16V\u02a2"+
"\3V\6V\u02a6\nV\rV\16V\u02a7\3V\3V\7V\u02ac\nV\fV\16V\u02af\13V\5V\u02b1"+
"\nV\3V\3V\3V\3V\6V\u02b7\nV\rV\16V\u02b8\3V\3V\5V\u02bd\nV\3W\3W\5W\u02c1"+
"\nW\3W\3W\3W\7W\u02c6\nW\fW\16W\u02c9\13W\3X\3X\3X\3X\6X\u02cf\nX\rX\16"+
"X\u02d0\3Y\3Y\3Y\3Y\6Y\u02d7\nY\rY\16Y\u02d8\3Z\3Z\3Z\3Z\7Z\u02df\nZ\f"+
"Z\16Z\u02e2\13Z\3Z\3Z\3[\3[\3[\3[\7[\u02ea\n[\f[\16[\u02ed\13[\3[\3[\3"+
"\\\3\\\5\\\u02f3\n\\\3\\\6\\\u02f6\n\\\r\\\16\\\u02f7\3]\3]\3^\3^\3_\3"+
"_\3_\3_\7_\u0302\n_\f_\16_\u0305\13_\3_\5_\u0308\n_\3_\5_\u030b\n_\3_"+
"\3_\3`\3`\3`\3`\3`\7`\u0314\n`\f`\16`\u0317\13`\3`\3`\3`\3`\3`\3a\6a\u031f"+
"\na\ra\16a\u0320\3a\3a\3b\3b\3\u0315\2c\3\3\5\4\7\5\t\6\13\7\r\b\17\t"+
"\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27"+
"-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W"+
"-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083"+
"C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097"+
"M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00ab"+
"W\u00adX\u00afY\u00b1Z\u00b3\2\u00b5\2\u00b7\2\u00b9[\u00bb\\\u00bd]\u00bf"+
"^\3\2\f\3\2))\4\2BBaa\5\2<<BBaa\3\2$$\3\2bb\4\2--//\3\2\62;\3\2C\\\4\2"+
"\f\f\17\17\5\2\13\f\17\17\"\"\u0335\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2"+
"\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23"+
"\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2"+
"\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2"+
"\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3"+
"\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2"+
"\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2"+
"\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2["+
"\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2"+
"\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2"+
"\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2"+
"\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089"+
"\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2"+
"\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b"+
"\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2"+
"\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad"+
"\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2"+
"\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\3\u00c1\3\2\2\2\5\u00c3\3\2\2\2\7\u00c5"+
"\3\2\2\2\t\u00c7\3\2\2\2\13\u00c9\3\2\2\2\r\u00cd\3\2\2\2\17\u00d5\3\2"+
"\2\2\21\u00de\3\2\2\2\23\u00e2\3\2\2\2\25\u00e6\3\2\2\2\27\u00e9\3\2\2"+
"\2\31\u00ed\3\2\2\2\33\u00f5\3\2\2\2\35\u00f8\3\2\2\2\37\u00fd\3\2\2\2"+
"!\u0105\3\2\2\2#\u010b\3\2\2\2%\u0110\3\2\2\2\'\u0119\3\2\2\2)\u0122\3"+
"\2\2\2+\u0129\3\2\2\2-\u0134\3\2\2\2/\u013b\3\2\2\2\61\u0143\3\2\2\2\63"+
"\u014b\3\2\2\2\65\u0151\3\2\2\2\67\u0158\3\2\2\29\u015d\3\2\2\2;\u0162"+
"\3\2\2\2=\u016c\3\2\2\2?\u0175\3\2\2\2A\u017b\3\2\2\2C\u0182\3\2\2\2E"+
"\u0185\3\2\2\2G\u018b\3\2\2\2I\u018e\3\2\2\2K\u0193\3\2\2\2M\u0198\3\2"+
"\2\2O\u019d\3\2\2\2Q\u01a3\3\2\2\2S\u01aa\3\2\2\2U\u01b0\3\2\2\2W\u01b8"+
"\3\2\2\2Y\u01bc\3\2\2\2[\u01c1\3\2\2\2]\u01c4\3\2\2\2_\u01ce\3\2\2\2a"+
"\u01d1\3\2\2\2c\u01d7\3\2\2\2e\u01dd\3\2\2\2g\u01e4\3\2\2\2i\u01ed\3\2"+
"\2\2k\u01f2\3\2\2\2m\u01f8\3\2\2\2o\u01fe\3\2\2\2q\u0204\3\2\2\2s\u020c"+
"\3\2\2\2u\u0213\3\2\2\2w\u0218\3\2\2\2y\u021c\3\2\2\2{\u0223\3\2\2\2}"+
"\u0228\3\2\2\2\177\u022d\3\2\2\2\u0081\u0233\3\2\2\2\u0083\u0239\3\2\2"+
"\2\u0085\u0240\3\2\2\2\u0087\u0246\3\2\2\2\u0089\u024b\3\2\2\2\u008b\u0254"+
"\3\2\2\2\u008d\u0256\3\2\2\2\u008f\u0258\3\2\2\2\u0091\u025b\3\2\2\2\u0093"+
"\u025d\3\2\2\2\u0095\u0260\3\2\2\2\u0097\u0262\3\2\2\2\u0099\u0264\3\2"+
"\2\2\u009b\u0266\3\2\2\2\u009d\u0268\3\2\2\2\u009f\u026a\3\2\2\2\u00a1"+
"\u026d\3\2\2\2\u00a3\u026f\3\2\2\2\u00a5\u027b\3\2\2\2\u00a7\u02a9\3\2"+
"\2\2\u00a9\u02ad\3\2\2\2\u00ab\u02b7\3\2\2\2\u00ad\u02c3\3\2\2\2\u00af"+
"\u02c7\3\2\2\2\u00b1\u02d2\3\2\2\2\u00b3\u02dd\3\2\2\2\u00b5\u02e6\3\2"+
"\2\2\u00b7\u02e8\3\2\2\2\u00b9\u02ea\3\2\2\2\u00bb\u02fb\3\2\2\2\u00bd"+
"\u030b\3\2\2\2\u00bf\u0311\3\2\2\2\u00c1\u00c2\7*\2\2\u00c2\4\3\2\2\2"+
"\u00c3\u00c4\7+\2\2\u00c4\6\3\2\2\2\u00c5\u00c6\7.\2\2\u00c6\b\3\2\2\2"+
"\u00c7\u00c8\7<\2\2\u00c8\n\3\2\2\2\u00c9\u00ca\7C\2\2\u00ca\u00cb\7N"+
"\2\2\u00cb\u00cc\7N\2\2\u00cc\f\3\2\2\2\u00cd\u00ce\7C\2\2\u00ce\u00cf"+
"\7P\2\2\u00cf\u00d0\7C\2\2\u00d0\u00d1\7N\2\2\u00d1\u00d2\7[\2\2\u00d2"+
"\u00d3\7\\\2\2\u00d3\u00d4\7G\2\2\u00d4\16\3\2\2\2\u00d5\u00d6\7C\2\2"+
"\u00d6\u00d7\7P\2\2\u00d7\u00d8\7C\2\2\u00d8\u00d9\7N\2\2\u00d9\u00da"+
"\7[\2\2\u00da\u00db\7\\\2\2\u00db\u00dc\7G\2\2\u00dc\u00dd\7F\2\2\u00dd"+
"\20\3\2\2\2\u00de\u00df\7C\2\2\u00df\u00e0\7P\2\2\u00e0\u00e1\7F\2\2\u00e1"+
"\22\3\2\2\2\u00e2\u00e3\7C\2\2\u00e3\u00e4\7P\2\2\u00e4\u00e5\7[\2\2\u00e5"+
"\24\3\2\2\2\u00e6\u00e7\7C\2\2\u00e7\u00e8\7U\2\2\u00e8\26\3\2\2\2\u00e9"+
"\u00ea\7C\2\2\u00ea\u00eb\7U\2\2\u00eb\u00ec\7E\2\2\u00ec\30\3\2\2\2\u00ed"+
"\u00ee\7D\2\2\u00ee\u00ef\7G\2\2\u00ef\u00f0\7V\2\2\u00f0\u00f1\7Y\2\2"+
"\u00f1\u00f2\7G\2\2\u00f2\u00f3\7G\2\2\u00f3\u00f4\7P\2\2\u00f4\32\3\2"+
"\2\2\u00f5\u00f6\7D\2\2\u00f6\u00f7\7[\2\2\u00f7\34\3\2\2\2\u00f8\u00f9"+
"\7E\2\2\u00f9\u00fa\7C\2\2\u00fa\u00fb\7U\2\2\u00fb\u00fc\7V\2\2\u00fc"+
"\36\3\2\2\2\u00fd\u00fe\7E\2\2\u00fe\u00ff\7Q\2\2\u00ff\u0100\7N\2\2\u0100"+
"\u0101\7W\2\2\u0101\u0102\7O\2\2\u0102\u0103\7P\2\2\u0103\u0104\7U\2\2"+
"\u0104 \3\2\2\2\u0105\u0106\7F\2\2\u0106\u0107\7G\2\2\u0107\u0108\7D\2"+
"\2\u0108\u0109\7W\2\2\u0109\u010a\7I\2\2\u010a\"\3\2\2\2\u010b\u010c\7"+
"F\2\2\u010c\u010d\7G\2\2\u010d\u010e\7U\2\2\u010e\u010f\7E\2\2\u010f$"+
"\3\2\2\2\u0110\u0111\7F\2\2\u0111\u0112\7G\2\2\u0112\u0113\7U\2\2\u0113"+
"\u0114\7E\2\2\u0114\u0115\7T\2\2\u0115\u0116\7K\2\2\u0116\u0117\7D\2\2"+
"\u0117\u0118\7G\2\2\u0118&\3\2\2\2\u0119\u011a\7F\2\2\u011a\u011b\7K\2"+
"\2\u011b\u011c\7U\2\2\u011c\u011d\7V\2\2\u011d\u011e\7K\2\2\u011e\u011f"+
"\7P\2\2\u011f\u0120\7E\2\2\u0120\u0121\7V\2\2\u0121(\3\2\2\2\u0122\u0123"+
"\7G\2\2\u0123\u0124\7U\2\2\u0124\u0125\7E\2\2\u0125\u0126\7C\2\2\u0126"+
"\u0127\7R\2\2\u0127\u0128\7G\2\2\u0128*\3\2\2\2\u0129\u012a\7G\2\2\u012a"+
"\u012b\7Z\2\2\u012b\u012c\7G\2\2\u012c\u012d\7E\2\2\u012d\u012e\7W\2\2"+
"\u012e\u012f\7V\2\2\u012f\u0130\7C\2\2\u0130\u0131\7D\2\2\u0131\u0132"+
"\7N\2\2\u0132\u0133\7G\2\2\u0133,\3\2\2\2\u0134\u0135\7G\2\2\u0135\u0136"+
"\7Z\2\2\u0136\u0137\7K\2\2\u0137\u0138\7U\2\2\u0138\u0139\7V\2\2\u0139"+
"\u013a\7U\2\2\u013a.\3\2\2\2\u013b\u013c\7G\2\2\u013c\u013d\7Z\2\2\u013d"+
"\u013e\7R\2\2\u013e\u013f\7N\2\2\u013f\u0140\7C\2\2\u0140\u0141\7K\2\2"+
"\u0141\u0142\7P\2\2\u0142\60\3\2\2\2\u0143\u0144\7G\2\2\u0144\u0145\7"+
"Z\2\2\u0145\u0146\7V\2\2\u0146\u0147\7T\2\2\u0147\u0148\7C\2\2\u0148\u0149"+
"\7E\2\2\u0149\u014a\7V\2\2\u014a\62\3\2\2\2\u014b\u014c\7H\2\2\u014c\u014d"+
"\7C\2\2\u014d\u014e\7N\2\2\u014e\u014f\7U\2\2\u014f\u0150\7G\2\2\u0150"+
"\64\3\2\2\2\u0151\u0152\7H\2\2\u0152\u0153\7Q\2\2\u0153\u0154\7T\2\2\u0154"+
"\u0155\7O\2\2\u0155\u0156\7C\2\2\u0156\u0157\7V\2\2\u0157\66\3\2\2\2\u0158"+
"\u0159\7H\2\2\u0159\u015a\7T\2\2\u015a\u015b\7Q\2\2\u015b\u015c\7O\2\2"+
"\u015c8\3\2\2\2\u015d\u015e\7H\2\2\u015e\u015f\7W\2\2\u015f\u0160\7N\2"+
"\2\u0160\u0161\7N\2\2\u0161:\3\2\2\2\u0162\u0163\7H\2\2\u0163\u0164\7"+
"W\2\2\u0164\u0165\7P\2\2\u0165\u0166\7E\2\2\u0166\u0167\7V\2\2\u0167\u0168"+
"\7K\2\2\u0168\u0169\7Q\2\2\u0169\u016a\7P\2\2\u016a\u016b\7U\2\2\u016b"+
"<\3\2\2\2\u016c\u016d\7I\2\2\u016d\u016e\7T\2\2\u016e\u016f\7C\2\2\u016f"+
"\u0170\7R\2\2\u0170\u0171\7J\2\2\u0171\u0172\7X\2\2\u0172\u0173\7K\2\2"+
"\u0173\u0174\7\\\2\2\u0174>\3\2\2\2\u0175\u0176\7I\2\2\u0176\u0177\7T"+
"\2\2\u0177\u0178\7Q\2\2\u0178\u0179\7W\2\2\u0179\u017a\7R\2\2\u017a@\3"+
"\2\2\2\u017b\u017c\7J\2\2\u017c\u017d\7C\2\2\u017d\u017e\7X\2\2\u017e"+
"\u017f\7K\2\2\u017f\u0180\7P\2\2\u0180\u0181\7I\2\2\u0181B\3\2\2\2\u0182"+
"\u0183\7K\2\2\u0183\u0184\7P\2\2\u0184D\3\2\2\2\u0185\u0186\7K\2\2\u0186"+
"\u0187\7P\2\2\u0187\u0188\7P\2\2\u0188\u0189\7G\2\2\u0189\u018a\7T\2\2"+
"\u018aF\3\2\2\2\u018b\u018c\7K\2\2\u018c\u018d\7U\2\2\u018dH\3\2\2\2\u018e"+
"\u018f\7L\2\2\u018f\u0190\7Q\2\2\u0190\u0191\7K\2\2\u0191\u0192\7P\2\2"+
"\u0192J\3\2\2\2\u0193\u0194\7N\2\2\u0194\u0195\7G\2\2\u0195\u0196\7H\2"+
"\2\u0196\u0197\7V\2\2\u0197L\3\2\2\2\u0198\u0199\7N\2\2\u0199\u019a\7"+
"K\2\2\u019a\u019b\7M\2\2\u019b\u019c\7G\2\2\u019cN\3\2\2\2\u019d\u019e"+
"\7N\2\2\u019e\u019f\7K\2\2\u019f\u01a0\7O\2\2\u01a0\u01a1\7K\2\2\u01a1"+
"\u01a2\7V\2\2\u01a2P\3\2\2\2\u01a3\u01a4\7O\2\2\u01a4\u01a5\7C\2\2\u01a5"+
"\u01a6\7R\2\2\u01a6\u01a7\7R\2\2\u01a7\u01a8\7G\2\2\u01a8\u01a9\7F\2\2"+
"\u01a9R\3\2\2\2\u01aa\u01ab\7O\2\2\u01ab\u01ac\7C\2\2\u01ac\u01ad\7V\2"+
"\2\u01ad\u01ae\7E\2\2\u01ae\u01af\7J\2\2\u01afT\3\2\2\2\u01b0\u01b1\7"+
"P\2\2\u01b1\u01b2\7C\2\2\u01b2\u01b3\7V\2\2\u01b3\u01b4\7W\2\2\u01b4\u01b5"+
"\7T\2\2\u01b5\u01b6\7C\2\2\u01b6\u01b7\7N\2\2\u01b7V\3\2\2\2\u01b8\u01b9"+
"\7P\2\2\u01b9\u01ba\7Q\2\2\u01ba\u01bb\7V\2\2\u01bbX\3\2\2\2\u01bc\u01bd"+
"\7P\2\2\u01bd\u01be\7W\2\2\u01be\u01bf\7N\2\2\u01bf\u01c0\7N\2\2\u01c0"+
"Z\3\2\2\2\u01c1\u01c2\7Q\2\2\u01c2\u01c3\7P\2\2\u01c3\\\3\2\2\2\u01c4"+
"\u01c5\7Q\2\2\u01c5\u01c6\7R\2\2\u01c6\u01c7\7V\2\2\u01c7\u01c8\7K\2\2"+
"\u01c8\u01c9\7O\2\2\u01c9\u01ca\7K\2\2\u01ca\u01cb\7\\\2\2\u01cb\u01cc"+
"\7G\2\2\u01cc\u01cd\7F\2\2\u01cd^\3\2\2\2\u01ce\u01cf\7Q\2\2\u01cf\u01d0"+
"\7T\2\2\u01d0`\3\2\2\2\u01d1\u01d2\7Q\2\2\u01d2\u01d3\7T\2\2\u01d3\u01d4"+
"\7F\2\2\u01d4\u01d5\7G\2\2\u01d5\u01d6\7T\2\2\u01d6b\3\2\2\2\u01d7\u01d8"+
"\7Q\2\2\u01d8\u01d9\7W\2\2\u01d9\u01da\7V\2\2\u01da\u01db\7G\2\2\u01db"+
"\u01dc\7T\2\2\u01dcd\3\2\2\2\u01dd\u01de\7R\2\2\u01de\u01df\7C\2\2\u01df"+
"\u01e0\7T\2\2\u01e0\u01e1\7U\2\2\u01e1\u01e2\7G\2\2\u01e2\u01e3\7F\2\2"+
"\u01e3f\3\2\2\2\u01e4\u01e5\7R\2\2\u01e5\u01e6\7J\2\2\u01e6\u01e7\7[\2"+
"\2\u01e7\u01e8\7U\2\2\u01e8\u01e9\7K\2\2\u01e9\u01ea\7E\2\2\u01ea\u01eb"+
"\7C\2\2\u01eb\u01ec\7N\2\2\u01ech\3\2\2\2\u01ed\u01ee\7R\2\2\u01ee\u01ef"+
"\7N\2\2\u01ef\u01f0\7C\2\2\u01f0\u01f1\7P\2\2\u01f1j\3\2\2\2\u01f2\u01f3"+
"\7T\2\2\u01f3\u01f4\7K\2\2\u01f4\u01f5\7I\2\2\u01f5\u01f6\7J\2\2\u01f6"+
"\u01f7\7V\2\2\u01f7l\3\2\2\2\u01f8\u01f9\7T\2\2\u01f9\u01fa\7N\2\2\u01fa"+
"\u01fb\7K\2\2\u01fb\u01fc\7M\2\2\u01fc\u01fd\7G\2\2\u01fdn\3\2\2\2\u01fe"+
"\u01ff\7S\2\2\u01ff\u0200\7W\2\2\u0200\u0201\7G\2\2\u0201\u0202\7T\2\2"+
"\u0202\u0203\7[\2\2\u0203p\3\2\2\2\u0204\u0205\7U\2\2\u0205\u0206\7E\2"+
"\2\u0206\u0207\7J\2\2\u0207\u0208\7G\2\2\u0208\u0209\7O\2\2\u0209\u020a"+
"\7C\2\2\u020a\u020b\7U\2\2\u020br\3\2\2\2\u020c\u020d\7U\2\2\u020d\u020e"+
"\7G\2\2\u020e\u020f\7N\2\2\u020f\u0210\7G\2\2\u0210\u0211\7E\2\2\u0211"+
"\u0212\7V\2\2\u0212t\3\2\2\2\u0213\u0214\7U\2\2\u0214\u0215\7J\2\2\u0215"+
"\u0216\7Q\2\2\u0216\u0217\7Y\2\2\u0217v\3\2\2\2\u0218\u0219\7U\2\2\u0219"+
"\u021a\7[\2\2\u021a\u021b\7U\2\2\u021bx\3\2\2\2\u021c\u021d\7V\2\2\u021d"+
"\u021e\7C\2\2\u021e\u021f\7D\2\2\u021f\u0220\7N\2\2\u0220\u0221\7G\2\2"+
"\u0221\u0222\7U\2\2\u0222z\3\2\2\2\u0223\u0224\7V\2\2\u0224\u0225\7G\2"+
"\2\u0225\u0226\7Z\2\2\u0226\u0227\7V\2\2\u0227|\3\2\2\2\u0228\u0229\7"+
"V\2\2\u0229\u022a\7T\2\2\u022a\u022b\7W\2\2\u022b\u022c\7G\2\2\u022c~"+
"\3\2\2\2\u022d\u022e\7V\2\2\u022e\u022f\7[\2\2\u022f\u0230\7R\2\2\u0230"+
"\u0231\7G\2\2\u0231\u0232\7U\2\2\u0232\u0080\3\2\2\2\u0233\u0234\7W\2"+
"\2\u0234\u0235\7U\2\2\u0235\u0236\7K\2\2\u0236\u0237\7P\2\2\u0237\u0238"+
"\7I\2\2\u0238\u0082\3\2\2\2\u0239\u023a\7X\2\2\u023a\u023b\7G\2\2\u023b"+
"\u023c\7T\2\2\u023c\u023d\7K\2\2\u023d\u023e\7H\2\2\u023e\u023f\7[\2\2"+
"\u023f\u0084\3\2\2\2\u0240\u0241\7Y\2\2\u0241\u0242\7J\2\2\u0242\u0243"+
"\7G\2\2\u0243\u0244\7T\2\2\u0244\u0245\7G\2\2\u0245\u0086\3\2\2\2\u0246"+
"\u0247\7Y\2\2\u0247\u0248\7K\2\2\u0248\u0249\7V\2\2\u0249\u024a\7J\2\2"+
"\u024a\u0088\3\2\2\2\u024b\u024c\7?\2\2\u024c\u008a\3\2\2\2\u024d\u024e"+
"\7>\2\2\u024e\u0255\7@\2\2\u024f\u0250\7#\2\2\u0250\u0255\7?\2\2\u0251"+
"\u0252\7>\2\2\u0252\u0253\7?\2\2\u0253\u0255\7@\2\2\u0254\u024d\3\2\2"+
"\2\u0254\u024f\3\2\2\2\u0254\u0251\3\2\2\2\u0255\u008c\3\2\2\2\u0256\u0257"+
"\7>\2\2\u0257\u008e\3\2\2\2\u0258\u0259\7>\2\2\u0259\u025a\7?\2\2\u025a"+
"\u0090\3\2\2\2\u025b\u025c\7@\2\2\u025c\u0092\3\2\2\2\u025d\u025e\7@\2"+
"\2\u025e\u025f\7?\2\2\u025f\u0094\3\2\2\2\u0260\u0261\7-\2\2\u0261\u0096"+
"\3\2\2\2\u0262\u0263\7/\2\2\u0263\u0098\3\2\2\2\u0264\u0265\7,\2\2\u0265"+
"\u009a\3\2\2\2\u0266\u0267\7\61\2\2\u0267\u009c\3\2\2\2\u0268\u0269\7"+
"\'\2\2\u0269\u009e\3\2\2\2\u026a\u026b\7~\2\2\u026b\u026c\7~\2\2\u026c"+
"\u00a0\3\2\2\2\u026d\u026e\7\60\2\2\u026e\u00a2\3\2\2\2\u026f\u0275\7"+
")\2\2\u0270\u0274\n\2\2\2\u0271\u0272\7)\2\2\u0272\u0274\7)\2\2\u0273"+
"\u0270\3\2\2\2\u0273\u0271\3\2\2\2\u0274\u0277\3\2\2\2\u0275\u0273\3\2"+
"\2\2\u0275\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2\2\2\u0278"+
"\u0279\7)\2\2\u0279\u00a4\3\2\2\2\u027a\u027c\5\u00b5[\2\u027b\u027a\3"+
"\2\2\2\u027c\u027d\3\2\2\2\u027d\u027b\3\2\2\2\u027d\u027e\3\2\2\2\u027e"+
"\u00a6\3\2\2\2\u027f\u0281\5\u00b5[\2\u0280\u027f\3\2\2\2\u0281\u0282"+
"\3\2\2\2\u0282\u0280\3\2\2\2\u0282\u0283\3\2\2\2\u0283\u0284\3\2\2\2\u0284"+
"\u0288\5\u00a1Q\2\u0285\u0287\5\u00b5[\2\u0286\u0285\3\2\2\2\u0287\u028a"+
"\3\2\2\2\u0288\u0286\3\2\2\2\u0288\u0289\3\2\2\2\u0289\u02aa\3\2\2\2\u028a"+
"\u0288\3\2\2\2\u028b\u028d\5\u00a1Q\2\u028c\u028e\5\u00b5[\2\u028d\u028c"+
"\3\2\2\2\u028e\u028f\3\2\2\2\u028f\u028d\3\2\2\2\u028f\u0290\3\2\2\2\u0290"+
"\u02aa\3\2\2\2\u0291\u0293\5\u00b5[\2\u0292\u0291\3\2\2\2\u0293\u0294"+
"\3\2\2\2\u0294\u0292\3\2\2\2\u0294\u0295\3\2\2\2\u0295\u029d\3\2\2\2\u0296"+
"\u029a\5\u00a1Q\2\u0297\u0299\5\u00b5[\2\u0298\u0297\3\2\2\2\u0299\u029c"+
"\3\2\2\2\u029a\u0298\3\2\2\2\u029a\u029b\3\2\2\2\u029b\u029e\3\2\2\2\u029c"+
"\u029a\3\2\2\2\u029d\u0296\3\2\2\2\u029d\u029e\3\2\2\2\u029e\u029f\3\2"+
"\2\2\u029f\u02a0\5\u00b3Z\2\u02a0\u02aa\3\2\2\2\u02a1\u02a3\5\u00a1Q\2"+
"\u02a2\u02a4\5\u00b5[\2\u02a3\u02a2\3\2\2\2\u02a4\u02a5\3\2\2\2\u02a5"+
"\u02a3\3\2\2\2\u02a5\u02a6\3\2\2\2\u02a6\u02a7\3\2\2\2\u02a7\u02a8\5\u00b3"+
"Z\2\u02a8\u02aa\3\2\2\2\u02a9\u0280\3\2\2\2\u02a9\u028b\3\2\2\2\u02a9"+
"\u0292\3\2\2\2\u02a9\u02a1\3\2\2\2\u02aa\u00a8\3\2\2\2\u02ab\u02ae\5\u00b7"+
"\\\2\u02ac\u02ae\7a\2\2\u02ad\u02ab\3\2\2\2\u02ad\u02ac\3\2\2\2\u02ae"+
"\u02b4\3\2\2\2\u02af\u02b3\5\u00b7\\\2\u02b0\u02b3\5\u00b5[\2\u02b1\u02b3"+
"\t\3\2\2\u02b2\u02af\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2\u02b1\3\2\2\2\u02b3"+
"\u02b6\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b4\u02b5\3\2\2\2\u02b5\u00aa\3\2"+
"\2\2\u02b6\u02b4\3\2\2\2\u02b7\u02bb\5\u00b5[\2\u02b8\u02bc\5\u00b7\\"+
"\2\u02b9\u02bc\5\u00b5[\2\u02ba\u02bc\t\4\2\2\u02bb\u02b8\3\2\2\2\u02bb"+
"\u02b9\3\2\2\2\u02bb\u02ba\3\2\2\2\u02bc\u02bd\3\2\2\2\u02bd\u02bb\3\2"+
"\2\2\u02bd\u02be\3\2\2\2\u02be\u00ac\3\2\2\2\u02bf\u02c4\5\u00b7\\\2\u02c0"+
"\u02c4\5\u00b5[\2\u02c1\u02c4\t\3\2\2\u02c2\u02c4\5\u0099M\2\u02c3\u02bf"+
"\3\2\2\2\u02c3\u02c0\3\2\2\2\u02c3\u02c1\3\2\2\2\u02c3\u02c2\3\2\2\2\u02c4"+
"\u02c5\3\2\2\2\u02c5\u02c3\3\2\2\2\u02c5\u02c6\3\2\2\2\u02c6\u00ae\3\2"+
"\2\2\u02c7\u02cd\7$\2\2\u02c8\u02cc\n\5\2\2\u02c9\u02ca\7$\2\2\u02ca\u02cc"+
"\7$\2\2\u02cb\u02c8\3\2\2\2\u02cb\u02c9\3\2\2\2\u02cc\u02cf\3\2\2\2\u02cd"+
"\u02cb\3\2\2\2\u02cd\u02ce\3\2\2\2\u02ce\u02d0\3\2\2\2\u02cf\u02cd\3\2"+
"\2\2\u02d0\u02d1\7$\2\2\u02d1\u00b0\3\2\2\2\u02d2\u02d8\7b\2\2\u02d3\u02d7"+
"\n\6\2\2\u02d4\u02d5\7b\2\2\u02d5\u02d7\7b\2\2\u02d6\u02d3\3\2\2\2\u02d6"+
"\u02d4\3\2\2\2\u02d7\u02da\3\2\2\2\u02d8\u02d6\3\2\2\2\u02d8\u02d9\3\2"+
"\2\2\u02d9\u02db\3\2\2\2\u02da\u02d8\3\2\2\2\u02db\u02dc\7b\2\2\u02dc"+
"\u00b2\3\2\2\2\u02dd\u02df\7G\2\2\u02de\u02e0\t\7\2\2\u02df\u02de\3\2"+
"\2\2\u02df\u02e0\3\2\2\2\u02e0\u02e2\3\2\2\2\u02e1\u02e3\5\u00b5[\2\u02e2"+
"\u02e1\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4\u02e2\3\2\2\2\u02e4\u02e5\3\2"+
"\2\2\u02e5\u00b4\3\2\2\2\u02e6\u02e7\t\b\2\2\u02e7\u00b6\3\2\2\2\u02e8"+
"\u02e9\t\t\2\2\u02e9\u00b8\3\2\2\2\u02ea\u02eb\7/\2\2\u02eb\u02ec\7/\2"+
"\2\u02ec\u02f0\3\2\2\2\u02ed\u02ef\n\n\2\2\u02ee\u02ed\3\2\2\2\u02ef\u02f2"+
"\3\2\2\2\u02f0\u02ee\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u02f4\3\2\2\2\u02f2"+
"\u02f0\3\2\2\2\u02f3\u02f5\7\17\2\2\u02f4\u02f3\3\2\2\2\u02f4\u02f5\3"+
"\2\2\2\u02f5\u02f7\3\2\2\2\u02f6\u02f8\7\f\2\2\u02f7\u02f6\3\2\2\2\u02f7"+
"\u02f8\3\2\2\2\u02f8\u02f9\3\2\2\2\u02f9\u02fa\b]\2\2\u02fa\u00ba\3\2"+
"\2\2\u02fb\u02fc\7\61\2\2\u02fc\u02fd\7,\2\2\u02fd\u0302\3\2\2\2\u02fe"+
"\u0301\5\u00bb^\2\u02ff\u0301\13\2\2\2\u0300\u02fe\3\2\2\2\u0300\u02ff"+
"\3\2\2\2\u0301\u0304\3\2\2\2\u0302\u0303\3\2\2\2\u0302\u0300\3\2\2\2\u0303"+
"\u0305\3\2\2\2\u0304\u0302\3\2\2\2\u0305\u0306\7,\2\2\u0306\u0307\7\61"+
"\2\2\u0307\u0308\3\2\2\2\u0308\u0309\b^\2\2\u0309\u00bc\3\2\2\2\u030a"+
"\u030c\t\13\2\2\u030b\u030a\3\2\2\2\u030c\u030d\3\2\2\2\u030d\u030b\3"+
"\2\2\2\u030d\u030e\3\2\2\2\u030e\u030f\3\2\2\2\u030f\u0310\b_\2\2\u0310"+
"\u00be\3\2\2\2\u0311\u0312\13\2\2\2\u0312\u00c0\3\2\2\2\"\2\u0254\u0273"+
"\u0275\u027d\u0282\u0288\u028f\u0294\u029a\u029d\u02a5\u02a9\u02ad\u02b2"+
"\u02b4\u02bb\u02bd\u02c3\u02c5\u02cb\u02cd\u02d6\u02d8\u02df\u02e4\u02f0"+
"\u02f4\u02f7\u0300\u0302\u030d\3\2\3\2";
"W\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7\2\u00b9\2\u00bb\2\u00bd]\u00bf"+
"^\u00c1_\u00c3`\3\2\f\3\2))\4\2BBaa\5\2<<BBaa\3\2$$\3\2bb\4\2--//\3\2"+
"\62;\3\2C\\\4\2\f\f\17\17\5\2\13\f\17\17\"\"\u0348\2\3\3\2\2\2\2\5\3\2"+
"\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21"+
"\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2"+
"\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3"+
"\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3"+
"\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3"+
"\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2"+
"\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2"+
"Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3"+
"\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2"+
"\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2"+
"\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3"+
"\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2"+
"\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099"+
"\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2"+
"\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab"+
"\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2"+
"\2\2\u00b5\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3"+
"\3\2\2\2\3\u00c5\3\2\2\2\5\u00c7\3\2\2\2\7\u00c9\3\2\2\2\t\u00cb\3\2\2"+
"\2\13\u00cd\3\2\2\2\r\u00d1\3\2\2\2\17\u00d9\3\2\2\2\21\u00e2\3\2\2\2"+
"\23\u00e6\3\2\2\2\25\u00ea\3\2\2\2\27\u00ed\3\2\2\2\31\u00f1\3\2\2\2\33"+
"\u00f9\3\2\2\2\35\u00fc\3\2\2\2\37\u0101\3\2\2\2!\u010a\3\2\2\2#\u0112"+
"\3\2\2\2%\u0118\3\2\2\2\'\u011d\3\2\2\2)\u0126\3\2\2\2+\u012f\3\2\2\2"+
"-\u0136\3\2\2\2/\u0141\3\2\2\2\61\u0148\3\2\2\2\63\u0150\3\2\2\2\65\u0158"+
"\3\2\2\2\67\u015e\3\2\2\29\u0165\3\2\2\2;\u016a\3\2\2\2=\u016f\3\2\2\2"+
"?\u0179\3\2\2\2A\u0182\3\2\2\2C\u0188\3\2\2\2E\u018f\3\2\2\2G\u0192\3"+
"\2\2\2I\u0198\3\2\2\2K\u019b\3\2\2\2M\u01a0\3\2\2\2O\u01a5\3\2\2\2Q\u01aa"+
"\3\2\2\2S\u01b0\3\2\2\2U\u01b7\3\2\2\2W\u01bd\3\2\2\2Y\u01c5\3\2\2\2["+
"\u01c9\3\2\2\2]\u01ce\3\2\2\2_\u01d1\3\2\2\2a\u01db\3\2\2\2c\u01de\3\2"+
"\2\2e\u01e4\3\2\2\2g\u01ea\3\2\2\2i\u01f1\3\2\2\2k\u01fa\3\2\2\2m\u01ff"+
"\3\2\2\2o\u0205\3\2\2\2q\u020b\3\2\2\2s\u0211\3\2\2\2u\u0219\3\2\2\2w"+
"\u0220\3\2\2\2y\u0225\3\2\2\2{\u0229\3\2\2\2}\u022f\3\2\2\2\177\u0236"+
"\3\2\2\2\u0081\u023b\3\2\2\2\u0083\u0240\3\2\2\2\u0085\u0246\3\2\2\2\u0087"+
"\u024c\3\2\2\2\u0089\u0253\3\2\2\2\u008b\u0259\3\2\2\2\u008d\u025e\3\2"+
"\2\2\u008f\u0267\3\2\2\2\u0091\u0269\3\2\2\2\u0093\u026b\3\2\2\2\u0095"+
"\u026e\3\2\2\2\u0097\u0270\3\2\2\2\u0099\u0273\3\2\2\2\u009b\u0275\3\2"+
"\2\2\u009d\u0277\3\2\2\2\u009f\u0279\3\2\2\2\u00a1\u027b\3\2\2\2\u00a3"+
"\u027d\3\2\2\2\u00a5\u0280\3\2\2\2\u00a7\u0282\3\2\2\2\u00a9\u028e\3\2"+
"\2\2\u00ab\u02bc\3\2\2\2\u00ad\u02c0\3\2\2\2\u00af\u02ca\3\2\2\2\u00b1"+
"\u02d6\3\2\2\2\u00b3\u02da\3\2\2\2\u00b5\u02e5\3\2\2\2\u00b7\u02f0\3\2"+
"\2\2\u00b9\u02f9\3\2\2\2\u00bb\u02fb\3\2\2\2\u00bd\u02fd\3\2\2\2\u00bf"+
"\u030e\3\2\2\2\u00c1\u031e\3\2\2\2\u00c3\u0324\3\2\2\2\u00c5\u00c6\7*"+
"\2\2\u00c6\4\3\2\2\2\u00c7\u00c8\7+\2\2\u00c8\6\3\2\2\2\u00c9\u00ca\7"+
".\2\2\u00ca\b\3\2\2\2\u00cb\u00cc\7<\2\2\u00cc\n\3\2\2\2\u00cd\u00ce\7"+
"C\2\2\u00ce\u00cf\7N\2\2\u00cf\u00d0\7N\2\2\u00d0\f\3\2\2\2\u00d1\u00d2"+
"\7C\2\2\u00d2\u00d3\7P\2\2\u00d3\u00d4\7C\2\2\u00d4\u00d5\7N\2\2\u00d5"+
"\u00d6\7[\2\2\u00d6\u00d7\7\\\2\2\u00d7\u00d8\7G\2\2\u00d8\16\3\2\2\2"+
"\u00d9\u00da\7C\2\2\u00da\u00db\7P\2\2\u00db\u00dc\7C\2\2\u00dc\u00dd"+
"\7N\2\2\u00dd\u00de\7[\2\2\u00de\u00df\7\\\2\2\u00df\u00e0\7G\2\2\u00e0"+
"\u00e1\7F\2\2\u00e1\20\3\2\2\2\u00e2\u00e3\7C\2\2\u00e3\u00e4\7P\2\2\u00e4"+
"\u00e5\7F\2\2\u00e5\22\3\2\2\2\u00e6\u00e7\7C\2\2\u00e7\u00e8\7P\2\2\u00e8"+
"\u00e9\7[\2\2\u00e9\24\3\2\2\2\u00ea\u00eb\7C\2\2\u00eb\u00ec\7U\2\2\u00ec"+
"\26\3\2\2\2\u00ed\u00ee\7C\2\2\u00ee\u00ef\7U\2\2\u00ef\u00f0\7E\2\2\u00f0"+
"\30\3\2\2\2\u00f1\u00f2\7D\2\2\u00f2\u00f3\7G\2\2\u00f3\u00f4\7V\2\2\u00f4"+
"\u00f5\7Y\2\2\u00f5\u00f6\7G\2\2\u00f6\u00f7\7G\2\2\u00f7\u00f8\7P\2\2"+
"\u00f8\32\3\2\2\2\u00f9\u00fa\7D\2\2\u00fa\u00fb\7[\2\2\u00fb\34\3\2\2"+
"\2\u00fc\u00fd\7E\2\2\u00fd\u00fe\7C\2\2\u00fe\u00ff\7U\2\2\u00ff\u0100"+
"\7V\2\2\u0100\36\3\2\2\2\u0101\u0102\7E\2\2\u0102\u0103\7C\2\2\u0103\u0104"+
"\7V\2\2\u0104\u0105\7C\2\2\u0105\u0106\7N\2\2\u0106\u0107\7Q\2\2\u0107"+
"\u0108\7I\2\2\u0108\u0109\7U\2\2\u0109 \3\2\2\2\u010a\u010b\7E\2\2\u010b"+
"\u010c\7Q\2\2\u010c\u010d\7N\2\2\u010d\u010e\7W\2\2\u010e\u010f\7O\2\2"+
"\u010f\u0110\7P\2\2\u0110\u0111\7U\2\2\u0111\"\3\2\2\2\u0112\u0113\7F"+
"\2\2\u0113\u0114\7G\2\2\u0114\u0115\7D\2\2\u0115\u0116\7W\2\2\u0116\u0117"+
"\7I\2\2\u0117$\3\2\2\2\u0118\u0119\7F\2\2\u0119\u011a\7G\2\2\u011a\u011b"+
"\7U\2\2\u011b\u011c\7E\2\2\u011c&\3\2\2\2\u011d\u011e\7F\2\2\u011e\u011f"+
"\7G\2\2\u011f\u0120\7U\2\2\u0120\u0121\7E\2\2\u0121\u0122\7T\2\2\u0122"+
"\u0123\7K\2\2\u0123\u0124\7D\2\2\u0124\u0125\7G\2\2\u0125(\3\2\2\2\u0126"+
"\u0127\7F\2\2\u0127\u0128\7K\2\2\u0128\u0129\7U\2\2\u0129\u012a\7V\2\2"+
"\u012a\u012b\7K\2\2\u012b\u012c\7P\2\2\u012c\u012d\7E\2\2\u012d\u012e"+
"\7V\2\2\u012e*\3\2\2\2\u012f\u0130\7G\2\2\u0130\u0131\7U\2\2\u0131\u0132"+
"\7E\2\2\u0132\u0133\7C\2\2\u0133\u0134\7R\2\2\u0134\u0135\7G\2\2\u0135"+
",\3\2\2\2\u0136\u0137\7G\2\2\u0137\u0138\7Z\2\2\u0138\u0139\7G\2\2\u0139"+
"\u013a\7E\2\2\u013a\u013b\7W\2\2\u013b\u013c\7V\2\2\u013c\u013d\7C\2\2"+
"\u013d\u013e\7D\2\2\u013e\u013f\7N\2\2\u013f\u0140\7G\2\2\u0140.\3\2\2"+
"\2\u0141\u0142\7G\2\2\u0142\u0143\7Z\2\2\u0143\u0144\7K\2\2\u0144\u0145"+
"\7U\2\2\u0145\u0146\7V\2\2\u0146\u0147\7U\2\2\u0147\60\3\2\2\2\u0148\u0149"+
"\7G\2\2\u0149\u014a\7Z\2\2\u014a\u014b\7R\2\2\u014b\u014c\7N\2\2\u014c"+
"\u014d\7C\2\2\u014d\u014e\7K\2\2\u014e\u014f\7P\2\2\u014f\62\3\2\2\2\u0150"+
"\u0151\7G\2\2\u0151\u0152\7Z\2\2\u0152\u0153\7V\2\2\u0153\u0154\7T\2\2"+
"\u0154\u0155\7C\2\2\u0155\u0156\7E\2\2\u0156\u0157\7V\2\2\u0157\64\3\2"+
"\2\2\u0158\u0159\7H\2\2\u0159\u015a\7C\2\2\u015a\u015b\7N\2\2\u015b\u015c"+
"\7U\2\2\u015c\u015d\7G\2\2\u015d\66\3\2\2\2\u015e\u015f\7H\2\2\u015f\u0160"+
"\7Q\2\2\u0160\u0161\7T\2\2\u0161\u0162\7O\2\2\u0162\u0163\7C\2\2\u0163"+
"\u0164\7V\2\2\u01648\3\2\2\2\u0165\u0166\7H\2\2\u0166\u0167\7T\2\2\u0167"+
"\u0168\7Q\2\2\u0168\u0169\7O\2\2\u0169:\3\2\2\2\u016a\u016b\7H\2\2\u016b"+
"\u016c\7W\2\2\u016c\u016d\7N\2\2\u016d\u016e\7N\2\2\u016e<\3\2\2\2\u016f"+
"\u0170\7H\2\2\u0170\u0171\7W\2\2\u0171\u0172\7P\2\2\u0172\u0173\7E\2\2"+
"\u0173\u0174\7V\2\2\u0174\u0175\7K\2\2\u0175\u0176\7Q\2\2\u0176\u0177"+
"\7P\2\2\u0177\u0178\7U\2\2\u0178>\3\2\2\2\u0179\u017a\7I\2\2\u017a\u017b"+
"\7T\2\2\u017b\u017c\7C\2\2\u017c\u017d\7R\2\2\u017d\u017e\7J\2\2\u017e"+
"\u017f\7X\2\2\u017f\u0180\7K\2\2\u0180\u0181\7\\\2\2\u0181@\3\2\2\2\u0182"+
"\u0183\7I\2\2\u0183\u0184\7T\2\2\u0184\u0185\7Q\2\2\u0185\u0186\7W\2\2"+
"\u0186\u0187\7R\2\2\u0187B\3\2\2\2\u0188\u0189\7J\2\2\u0189\u018a\7C\2"+
"\2\u018a\u018b\7X\2\2\u018b\u018c\7K\2\2\u018c\u018d\7P\2\2\u018d\u018e"+
"\7I\2\2\u018eD\3\2\2\2\u018f\u0190\7K\2\2\u0190\u0191\7P\2\2\u0191F\3"+
"\2\2\2\u0192\u0193\7K\2\2\u0193\u0194\7P\2\2\u0194\u0195\7P\2\2\u0195"+
"\u0196\7G\2\2\u0196\u0197\7T\2\2\u0197H\3\2\2\2\u0198\u0199\7K\2\2\u0199"+
"\u019a\7U\2\2\u019aJ\3\2\2\2\u019b\u019c\7L\2\2\u019c\u019d\7Q\2\2\u019d"+
"\u019e\7K\2\2\u019e\u019f\7P\2\2\u019fL\3\2\2\2\u01a0\u01a1\7N\2\2\u01a1"+
"\u01a2\7G\2\2\u01a2\u01a3\7H\2\2\u01a3\u01a4\7V\2\2\u01a4N\3\2\2\2\u01a5"+
"\u01a6\7N\2\2\u01a6\u01a7\7K\2\2\u01a7\u01a8\7M\2\2\u01a8\u01a9\7G\2\2"+
"\u01a9P\3\2\2\2\u01aa\u01ab\7N\2\2\u01ab\u01ac\7K\2\2\u01ac\u01ad\7O\2"+
"\2\u01ad\u01ae\7K\2\2\u01ae\u01af\7V\2\2\u01afR\3\2\2\2\u01b0\u01b1\7"+
"O\2\2\u01b1\u01b2\7C\2\2\u01b2\u01b3\7R\2\2\u01b3\u01b4\7R\2\2\u01b4\u01b5"+
"\7G\2\2\u01b5\u01b6\7F\2\2\u01b6T\3\2\2\2\u01b7\u01b8\7O\2\2\u01b8\u01b9"+
"\7C\2\2\u01b9\u01ba\7V\2\2\u01ba\u01bb\7E\2\2\u01bb\u01bc\7J\2\2\u01bc"+
"V\3\2\2\2\u01bd\u01be\7P\2\2\u01be\u01bf\7C\2\2\u01bf\u01c0\7V\2\2\u01c0"+
"\u01c1\7W\2\2\u01c1\u01c2\7T\2\2\u01c2\u01c3\7C\2\2\u01c3\u01c4\7N\2\2"+
"\u01c4X\3\2\2\2\u01c5\u01c6\7P\2\2\u01c6\u01c7\7Q\2\2\u01c7\u01c8\7V\2"+
"\2\u01c8Z\3\2\2\2\u01c9\u01ca\7P\2\2\u01ca\u01cb\7W\2\2\u01cb\u01cc\7"+
"N\2\2\u01cc\u01cd\7N\2\2\u01cd\\\3\2\2\2\u01ce\u01cf\7Q\2\2\u01cf\u01d0"+
"\7P\2\2\u01d0^\3\2\2\2\u01d1\u01d2\7Q\2\2\u01d2\u01d3\7R\2\2\u01d3\u01d4"+
"\7V\2\2\u01d4\u01d5\7K\2\2\u01d5\u01d6\7O\2\2\u01d6\u01d7\7K\2\2\u01d7"+
"\u01d8\7\\\2\2\u01d8\u01d9\7G\2\2\u01d9\u01da\7F\2\2\u01da`\3\2\2\2\u01db"+
"\u01dc\7Q\2\2\u01dc\u01dd\7T\2\2\u01ddb\3\2\2\2\u01de\u01df\7Q\2\2\u01df"+
"\u01e0\7T\2\2\u01e0\u01e1\7F\2\2\u01e1\u01e2\7G\2\2\u01e2\u01e3\7T\2\2"+
"\u01e3d\3\2\2\2\u01e4\u01e5\7Q\2\2\u01e5\u01e6\7W\2\2\u01e6\u01e7\7V\2"+
"\2\u01e7\u01e8\7G\2\2\u01e8\u01e9\7T\2\2\u01e9f\3\2\2\2\u01ea\u01eb\7"+
"R\2\2\u01eb\u01ec\7C\2\2\u01ec\u01ed\7T\2\2\u01ed\u01ee\7U\2\2\u01ee\u01ef"+
"\7G\2\2\u01ef\u01f0\7F\2\2\u01f0h\3\2\2\2\u01f1\u01f2\7R\2\2\u01f2\u01f3"+
"\7J\2\2\u01f3\u01f4\7[\2\2\u01f4\u01f5\7U\2\2\u01f5\u01f6\7K\2\2\u01f6"+
"\u01f7\7E\2\2\u01f7\u01f8\7C\2\2\u01f8\u01f9\7N\2\2\u01f9j\3\2\2\2\u01fa"+
"\u01fb\7R\2\2\u01fb\u01fc\7N\2\2\u01fc\u01fd\7C\2\2\u01fd\u01fe\7P\2\2"+
"\u01fel\3\2\2\2\u01ff\u0200\7T\2\2\u0200\u0201\7K\2\2\u0201\u0202\7I\2"+
"\2\u0202\u0203\7J\2\2\u0203\u0204\7V\2\2\u0204n\3\2\2\2\u0205\u0206\7"+
"T\2\2\u0206\u0207\7N\2\2\u0207\u0208\7K\2\2\u0208\u0209\7M\2\2\u0209\u020a"+
"\7G\2\2\u020ap\3\2\2\2\u020b\u020c\7S\2\2\u020c\u020d\7W\2\2\u020d\u020e"+
"\7G\2\2\u020e\u020f\7T\2\2\u020f\u0210\7[\2\2\u0210r\3\2\2\2\u0211\u0212"+
"\7U\2\2\u0212\u0213\7E\2\2\u0213\u0214\7J\2\2\u0214\u0215\7G\2\2\u0215"+
"\u0216\7O\2\2\u0216\u0217\7C\2\2\u0217\u0218\7U\2\2\u0218t\3\2\2\2\u0219"+
"\u021a\7U\2\2\u021a\u021b\7G\2\2\u021b\u021c\7N\2\2\u021c\u021d\7G\2\2"+
"\u021d\u021e\7E\2\2\u021e\u021f\7V\2\2\u021fv\3\2\2\2\u0220\u0221\7U\2"+
"\2\u0221\u0222\7J\2\2\u0222\u0223\7Q\2\2\u0223\u0224\7Y\2\2\u0224x\3\2"+
"\2\2\u0225\u0226\7U\2\2\u0226\u0227\7[\2\2\u0227\u0228\7U\2\2\u0228z\3"+
"\2\2\2\u0229\u022a\7V\2\2\u022a\u022b\7C\2\2\u022b\u022c\7D\2\2\u022c"+
"\u022d\7N\2\2\u022d\u022e\7G\2\2\u022e|\3\2\2\2\u022f\u0230\7V\2\2\u0230"+
"\u0231\7C\2\2\u0231\u0232\7D\2\2\u0232\u0233\7N\2\2\u0233\u0234\7G\2\2"+
"\u0234\u0235\7U\2\2\u0235~\3\2\2\2\u0236\u0237\7V\2\2\u0237\u0238\7G\2"+
"\2\u0238\u0239\7Z\2\2\u0239\u023a\7V\2\2\u023a\u0080\3\2\2\2\u023b\u023c"+
"\7V\2\2\u023c\u023d\7T\2\2\u023d\u023e\7W\2\2\u023e\u023f\7G\2\2\u023f"+
"\u0082\3\2\2\2\u0240\u0241\7V\2\2\u0241\u0242\7[\2\2\u0242\u0243\7R\2"+
"\2\u0243\u0244\7G\2\2\u0244\u0245\7U\2\2\u0245\u0084\3\2\2\2\u0246\u0247"+
"\7W\2\2\u0247\u0248\7U\2\2\u0248\u0249\7K\2\2\u0249\u024a\7P\2\2\u024a"+
"\u024b\7I\2\2\u024b\u0086\3\2\2\2\u024c\u024d\7X\2\2\u024d\u024e\7G\2"+
"\2\u024e\u024f\7T\2\2\u024f\u0250\7K\2\2\u0250\u0251\7H\2\2\u0251\u0252"+
"\7[\2\2\u0252\u0088\3\2\2\2\u0253\u0254\7Y\2\2\u0254\u0255\7J\2\2\u0255"+
"\u0256\7G\2\2\u0256\u0257\7T\2\2\u0257\u0258\7G\2\2\u0258\u008a\3\2\2"+
"\2\u0259\u025a\7Y\2\2\u025a\u025b\7K\2\2\u025b\u025c\7V\2\2\u025c\u025d"+
"\7J\2\2\u025d\u008c\3\2\2\2\u025e\u025f\7?\2\2\u025f\u008e\3\2\2\2\u0260"+
"\u0261\7>\2\2\u0261\u0268\7@\2\2\u0262\u0263\7#\2\2\u0263\u0268\7?\2\2"+
"\u0264\u0265\7>\2\2\u0265\u0266\7?\2\2\u0266\u0268\7@\2\2\u0267\u0260"+
"\3\2\2\2\u0267\u0262\3\2\2\2\u0267\u0264\3\2\2\2\u0268\u0090\3\2\2\2\u0269"+
"\u026a\7>\2\2\u026a\u0092\3\2\2\2\u026b\u026c\7>\2\2\u026c\u026d\7?\2"+
"\2\u026d\u0094\3\2\2\2\u026e\u026f\7@\2\2\u026f\u0096\3\2\2\2\u0270\u0271"+
"\7@\2\2\u0271\u0272\7?\2\2\u0272\u0098\3\2\2\2\u0273\u0274\7-\2\2\u0274"+
"\u009a\3\2\2\2\u0275\u0276\7/\2\2\u0276\u009c\3\2\2\2\u0277\u0278\7,\2"+
"\2\u0278\u009e\3\2\2\2\u0279\u027a\7\61\2\2\u027a\u00a0\3\2\2\2\u027b"+
"\u027c\7\'\2\2\u027c\u00a2\3\2\2\2\u027d\u027e\7~\2\2\u027e\u027f\7~\2"+
"\2\u027f\u00a4\3\2\2\2\u0280\u0281\7\60\2\2\u0281\u00a6\3\2\2\2\u0282"+
"\u0288\7)\2\2\u0283\u0287\n\2\2\2\u0284\u0285\7)\2\2\u0285\u0287\7)\2"+
"\2\u0286\u0283\3\2\2\2\u0286\u0284\3\2\2\2\u0287\u028a\3\2\2\2\u0288\u0286"+
"\3\2\2\2\u0288\u0289\3\2\2\2\u0289\u028b\3\2\2\2\u028a\u0288\3\2\2\2\u028b"+
"\u028c\7)\2\2\u028c\u00a8\3\2\2\2\u028d\u028f\5\u00b9]\2\u028e\u028d\3"+
"\2\2\2\u028f\u0290\3\2\2\2\u0290\u028e\3\2\2\2\u0290\u0291\3\2\2\2\u0291"+
"\u00aa\3\2\2\2\u0292\u0294\5\u00b9]\2\u0293\u0292\3\2\2\2\u0294\u0295"+
"\3\2\2\2\u0295\u0293\3\2\2\2\u0295\u0296\3\2\2\2\u0296\u0297\3\2\2\2\u0297"+
"\u029b\5\u00a5S\2\u0298\u029a\5\u00b9]\2\u0299\u0298\3\2\2\2\u029a\u029d"+
"\3\2\2\2\u029b\u0299\3\2\2\2\u029b\u029c\3\2\2\2\u029c\u02bd\3\2\2\2\u029d"+
"\u029b\3\2\2\2\u029e\u02a0\5\u00a5S\2\u029f\u02a1\5\u00b9]\2\u02a0\u029f"+
"\3\2\2\2\u02a1\u02a2\3\2\2\2\u02a2\u02a0\3\2\2\2\u02a2\u02a3\3\2\2\2\u02a3"+
"\u02bd\3\2\2\2\u02a4\u02a6\5\u00b9]\2\u02a5\u02a4\3\2\2\2\u02a6\u02a7"+
"\3\2\2\2\u02a7\u02a5\3\2\2\2\u02a7\u02a8\3\2\2\2\u02a8\u02b0\3\2\2\2\u02a9"+
"\u02ad\5\u00a5S\2\u02aa\u02ac\5\u00b9]\2\u02ab\u02aa\3\2\2\2\u02ac\u02af"+
"\3\2\2\2\u02ad\u02ab\3\2\2\2\u02ad\u02ae\3\2\2\2\u02ae\u02b1\3\2\2\2\u02af"+
"\u02ad\3\2\2\2\u02b0\u02a9\3\2\2\2\u02b0\u02b1\3\2\2\2\u02b1\u02b2\3\2"+
"\2\2\u02b2\u02b3\5\u00b7\\\2\u02b3\u02bd\3\2\2\2\u02b4\u02b6\5\u00a5S"+
"\2\u02b5\u02b7\5\u00b9]\2\u02b6\u02b5\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b8"+
"\u02b6\3\2\2\2\u02b8\u02b9\3\2\2\2\u02b9\u02ba\3\2\2\2\u02ba\u02bb\5\u00b7"+
"\\\2\u02bb\u02bd\3\2\2\2\u02bc\u0293\3\2\2\2\u02bc\u029e\3\2\2\2\u02bc"+
"\u02a5\3\2\2\2\u02bc\u02b4\3\2\2\2\u02bd\u00ac\3\2\2\2\u02be\u02c1\5\u00bb"+
"^\2\u02bf\u02c1\7a\2\2\u02c0\u02be\3\2\2\2\u02c0\u02bf\3\2\2\2\u02c1\u02c7"+
"\3\2\2\2\u02c2\u02c6\5\u00bb^\2\u02c3\u02c6\5\u00b9]\2\u02c4\u02c6\t\3"+
"\2\2\u02c5\u02c2\3\2\2\2\u02c5\u02c3\3\2\2\2\u02c5\u02c4\3\2\2\2\u02c6"+
"\u02c9\3\2\2\2\u02c7\u02c5\3\2\2\2\u02c7\u02c8\3\2\2\2\u02c8\u00ae\3\2"+
"\2\2\u02c9\u02c7\3\2\2\2\u02ca\u02ce\5\u00b9]\2\u02cb\u02cf\5\u00bb^\2"+
"\u02cc\u02cf\5\u00b9]\2\u02cd\u02cf\t\4\2\2\u02ce\u02cb\3\2\2\2\u02ce"+
"\u02cc\3\2\2\2\u02ce\u02cd\3\2\2\2\u02cf\u02d0\3\2\2\2\u02d0\u02ce\3\2"+
"\2\2\u02d0\u02d1\3\2\2\2\u02d1\u00b0\3\2\2\2\u02d2\u02d7\5\u00bb^\2\u02d3"+
"\u02d7\5\u00b9]\2\u02d4\u02d7\t\3\2\2\u02d5\u02d7\5\u009dO\2\u02d6\u02d2"+
"\3\2\2\2\u02d6\u02d3\3\2\2\2\u02d6\u02d4\3\2\2\2\u02d6\u02d5\3\2\2\2\u02d7"+
"\u02d8\3\2\2\2\u02d8\u02d6\3\2\2\2\u02d8\u02d9\3\2\2\2\u02d9\u00b2\3\2"+
"\2\2\u02da\u02e0\7$\2\2\u02db\u02df\n\5\2\2\u02dc\u02dd\7$\2\2\u02dd\u02df"+
"\7$\2\2\u02de\u02db\3\2\2\2\u02de\u02dc\3\2\2\2\u02df\u02e2\3\2\2\2\u02e0"+
"\u02de\3\2\2\2\u02e0\u02e1\3\2\2\2\u02e1\u02e3\3\2\2\2\u02e2\u02e0\3\2"+
"\2\2\u02e3\u02e4\7$\2\2\u02e4\u00b4\3\2\2\2\u02e5\u02eb\7b\2\2\u02e6\u02ea"+
"\n\6\2\2\u02e7\u02e8\7b\2\2\u02e8\u02ea\7b\2\2\u02e9\u02e6\3\2\2\2\u02e9"+
"\u02e7\3\2\2\2\u02ea\u02ed\3\2\2\2\u02eb\u02e9\3\2\2\2\u02eb\u02ec\3\2"+
"\2\2\u02ec\u02ee\3\2\2\2\u02ed\u02eb\3\2\2\2\u02ee\u02ef\7b\2\2\u02ef"+
"\u00b6\3\2\2\2\u02f0\u02f2\7G\2\2\u02f1\u02f3\t\7\2\2\u02f2\u02f1\3\2"+
"\2\2\u02f2\u02f3\3\2\2\2\u02f3\u02f5\3\2\2\2\u02f4\u02f6\5\u00b9]\2\u02f5"+
"\u02f4\3\2\2\2\u02f6\u02f7\3\2\2\2\u02f7\u02f5\3\2\2\2\u02f7\u02f8\3\2"+
"\2\2\u02f8\u00b8\3\2\2\2\u02f9\u02fa\t\b\2\2\u02fa\u00ba\3\2\2\2\u02fb"+
"\u02fc\t\t\2\2\u02fc\u00bc\3\2\2\2\u02fd\u02fe\7/\2\2\u02fe\u02ff\7/\2"+
"\2\u02ff\u0303\3\2\2\2\u0300\u0302\n\n\2\2\u0301\u0300\3\2\2\2\u0302\u0305"+
"\3\2\2\2\u0303\u0301\3\2\2\2\u0303\u0304\3\2\2\2\u0304\u0307\3\2\2\2\u0305"+
"\u0303\3\2\2\2\u0306\u0308\7\17\2\2\u0307\u0306\3\2\2\2\u0307\u0308\3"+
"\2\2\2\u0308\u030a\3\2\2\2\u0309\u030b\7\f\2\2\u030a\u0309\3\2\2\2\u030a"+
"\u030b\3\2\2\2\u030b\u030c\3\2\2\2\u030c\u030d\b_\2\2\u030d\u00be\3\2"+
"\2\2\u030e\u030f\7\61\2\2\u030f\u0310\7,\2\2\u0310\u0315\3\2\2\2\u0311"+
"\u0314\5\u00bf`\2\u0312\u0314\13\2\2\2\u0313\u0311\3\2\2\2\u0313\u0312"+
"\3\2\2\2\u0314\u0317\3\2\2\2\u0315\u0316\3\2\2\2\u0315\u0313\3\2\2\2\u0316"+
"\u0318\3\2\2\2\u0317\u0315\3\2\2\2\u0318\u0319\7,\2\2\u0319\u031a\7\61"+
"\2\2\u031a\u031b\3\2\2\2\u031b\u031c\b`\2\2\u031c\u00c0\3\2\2\2\u031d"+
"\u031f\t\13\2\2\u031e\u031d\3\2\2\2\u031f\u0320\3\2\2\2\u0320\u031e\3"+
"\2\2\2\u0320\u0321\3\2\2\2\u0321\u0322\3\2\2\2\u0322\u0323\ba\2\2\u0323"+
"\u00c2\3\2\2\2\u0324\u0325\13\2\2\2\u0325\u00c4\3\2\2\2\"\2\u0267\u0286"+
"\u0288\u0290\u0295\u029b\u02a2\u02a7\u02ad\u02b0\u02b8\u02bc\u02c0\u02c5"+
"\u02c7\u02ce\u02d0\u02d6\u02d8\u02de\u02e0\u02e9\u02eb\u02f2\u02f7\u0303"+
"\u0307\u030a\u0313\u0315\u0320\3\2\3\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -116,6 +116,18 @@ interface SqlBaseListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitShowSchemas(SqlBaseParser.ShowSchemasContext ctx);
/**
* Enter a parse tree produced by the {@code sysCatalogs}
* labeled alternative in {@link SqlBaseParser#statement}.
* @param ctx the parse tree
*/
void enterSysCatalogs(SqlBaseParser.SysCatalogsContext ctx);
/**
* Exit a parse tree produced by the {@code sysCatalogs}
* labeled alternative in {@link SqlBaseParser#statement}.
* @param ctx the parse tree
*/
void exitSysCatalogs(SqlBaseParser.SysCatalogsContext ctx);
/**
* Enter a parse tree produced by the {@code sysTables}
* labeled alternative in {@link SqlBaseParser#statement}.
@ -152,6 +164,18 @@ interface SqlBaseListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitSysTypes(SqlBaseParser.SysTypesContext ctx);
/**
* Enter a parse tree produced by the {@code sysTableTypes}
* labeled alternative in {@link SqlBaseParser#statement}.
* @param ctx the parse tree
*/
void enterSysTableTypes(SqlBaseParser.SysTableTypesContext ctx);
/**
* Exit a parse tree produced by the {@code sysTableTypes}
* labeled alternative in {@link SqlBaseParser#statement}.
* @param ctx the parse tree
*/
void exitSysTableTypes(SqlBaseParser.SysTableTypesContext ctx);
/**
* Enter a parse tree produced by {@link SqlBaseParser#query}.
* @param ctx the parse tree

View File

@ -76,6 +76,13 @@ interface SqlBaseVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitShowSchemas(SqlBaseParser.ShowSchemasContext ctx);
/**
* Visit a parse tree produced by the {@code sysCatalogs}
* labeled alternative in {@link SqlBaseParser#statement}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitSysCatalogs(SqlBaseParser.SysCatalogsContext ctx);
/**
* Visit a parse tree produced by the {@code sysTables}
* labeled alternative in {@link SqlBaseParser#statement}.
@ -97,6 +104,13 @@ interface SqlBaseVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitSysTypes(SqlBaseParser.SysTypesContext ctx);
/**
* Visit a parse tree produced by the {@code sysTableTypes}
* labeled alternative in {@link SqlBaseParser#statement}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitSysTableTypes(SqlBaseParser.SysTableTypesContext ctx);
/**
* Visit a parse tree produced by {@link SqlBaseParser#query}.
* @param ctx the parse tree

View File

@ -0,0 +1,64 @@
/*
* 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.plan.logical.command.sys;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.xpack.sql.expression.Attribute;
import org.elasticsearch.xpack.sql.plan.logical.command.Command;
import org.elasticsearch.xpack.sql.session.Rows;
import org.elasticsearch.xpack.sql.session.SchemaRowSet;
import org.elasticsearch.xpack.sql.session.SqlSession;
import org.elasticsearch.xpack.sql.tree.Location;
import org.elasticsearch.xpack.sql.tree.NodeInfo;
import java.util.List;
import static java.util.Collections.singletonList;
/**
* System command returning the catalogs (clusters) available.
* Currently returns only the current cluster name.
*/
public class SysCatalogs extends Command {
public SysCatalogs(Location location) {
super(location);
}
@Override
protected NodeInfo<SysCatalogs> info() {
return NodeInfo.create(this);
}
@Override
public List<Attribute> output() {
return singletonList(keyword("TABLE_CAT"));
}
@Override
public final void execute(SqlSession session, ActionListener<SchemaRowSet> listener) {
String cluster = session.indexResolver().clusterName();
listener.onResponse(Rows.of(output(), singletonList(singletonList(cluster))));
}
@Override
public int hashCode() {
return getClass().hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
return true;
}
}

View File

@ -0,0 +1,68 @@
/*
* 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.plan.logical.command.sys;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.xpack.sql.analysis.index.IndexResolver.IndexType;
import org.elasticsearch.xpack.sql.expression.Attribute;
import org.elasticsearch.xpack.sql.plan.logical.command.Command;
import org.elasticsearch.xpack.sql.session.Rows;
import org.elasticsearch.xpack.sql.session.SchemaRowSet;
import org.elasticsearch.xpack.sql.session.SqlSession;
import org.elasticsearch.xpack.sql.tree.Location;
import org.elasticsearch.xpack.sql.tree.NodeInfo;
import java.util.List;
import java.util.stream.Stream;
import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.toList;
/**
* System command returning the types of tables supported,
* index and alias.
*/
public class SysTableTypes extends Command {
public SysTableTypes(Location location) {
super(location);
}
@Override
protected NodeInfo<SysTableTypes> info() {
return NodeInfo.create(this);
}
@Override
public List<Attribute> output() {
return singletonList(keyword("TABLE_TYPE"));
}
@Override
public final void execute(SqlSession session, ActionListener<SchemaRowSet> listener) {
listener.onResponse(Rows.of(output(), Stream.of(IndexType.values())
.map(t -> singletonList(t.toSql()))
.collect(toList())));
}
@Override
public int hashCode() {
return getClass().hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
return true;
}
}

View File

@ -12,8 +12,8 @@ public abstract class AbstractRowSet implements RowSet {
@Override
public Object column(int index) {
Check.isTrue(index >= 0, "Invalid index %d; needs to be positive", index);
Check.isTrue(index < columnCount(), "Invalid index %d for row of size %d", index, columnCount());
Check.isTrue(index >= 0, "Invalid index {}; needs to be positive", index);
Check.isTrue(index < columnCount(), "Invalid index {} for row of size {}", index, columnCount());
Check.isTrue(hasCurrentRow(), "RowSet contains no (more) entries; use hasCurrent() to check its status");
return getColumn(index);
}

View File

@ -0,0 +1,48 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
package org.elasticsearch.xpack.sql.plan.logical.command.sys;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.common.collect.Tuple;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.xpack.sql.analysis.analyzer.Analyzer;
import org.elasticsearch.xpack.sql.analysis.index.EsIndex;
import org.elasticsearch.xpack.sql.analysis.index.IndexResolution;
import org.elasticsearch.xpack.sql.analysis.index.IndexResolver;
import org.elasticsearch.xpack.sql.expression.function.FunctionRegistry;
import org.elasticsearch.xpack.sql.parser.SqlParser;
import org.elasticsearch.xpack.sql.plan.logical.command.Command;
import org.elasticsearch.xpack.sql.session.SqlSession;
import org.elasticsearch.xpack.sql.type.TypesTests;
import org.joda.time.DateTimeZone;
import static org.mockito.Mockito.mock;
public class SysCatalogTests extends ESTestCase {
private final SqlParser parser = new SqlParser(DateTimeZone.UTC);
private Tuple<Command, SqlSession> sql(String sql) {
EsIndex test = new EsIndex("test", TypesTests.loadMapping("mapping-multi-field-with-nested.json", true));
Analyzer analyzer = new Analyzer(new FunctionRegistry(), IndexResolution.valid(test), DateTimeZone.UTC);
Command cmd = (Command) analyzer.analyze(parser.createStatement(sql), true);
IndexResolver resolver = mock(IndexResolver.class);
SqlSession session = new SqlSession(null, null, null, resolver, null, null, null);
return new Tuple<>(cmd, session);
}
public void testSysCatalogs() throws Exception {
Tuple<Command, SqlSession> sql = sql("SYS TABLE TYPES");
sql.v1().execute(sql.v2(), ActionListener.wrap(r -> {
assertEquals(2, r.size());
assertEquals("BASE TABLE", r.column(0));
r.advanceRow();
assertEquals("ALIAS", r.column(0));
}, ex -> fail(ex.getMessage())));
}
}

View File

@ -0,0 +1,58 @@
/*
* 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.plan.logical.command.sys;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.common.collect.Tuple;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.xpack.sql.analysis.analyzer.Analyzer;
import org.elasticsearch.xpack.sql.analysis.index.EsIndex;
import org.elasticsearch.xpack.sql.analysis.index.IndexResolution;
import org.elasticsearch.xpack.sql.analysis.index.IndexResolver;
import org.elasticsearch.xpack.sql.expression.function.FunctionRegistry;
import org.elasticsearch.xpack.sql.parser.SqlParser;
import org.elasticsearch.xpack.sql.plan.logical.command.Command;
import org.elasticsearch.xpack.sql.session.SqlSession;
import org.elasticsearch.xpack.sql.type.TypesTests;
import org.joda.time.DateTimeZone;
import static java.util.Collections.singletonList;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class SysTableTypesTests extends ESTestCase {
private final SqlParser parser = new SqlParser(DateTimeZone.UTC);
@SuppressWarnings({ "rawtypes", "unchecked" })
private Tuple<Command, SqlSession> sql(String sql) {
EsIndex test = new EsIndex("test", TypesTests.loadMapping("mapping-multi-field-with-nested.json", true));
Analyzer analyzer = new Analyzer(new FunctionRegistry(), IndexResolution.valid(test), DateTimeZone.UTC);
Command cmd = (Command) analyzer.analyze(parser.createStatement(sql), true);
IndexResolver resolver = mock(IndexResolver.class);
when(resolver.clusterName()).thenReturn("cluster");
doAnswer(invocation -> {
((ActionListener) invocation.getArguments()[2]).onResponse(singletonList(test));
return Void.TYPE;
}).when(resolver).resolveAsSeparateMappings(any(), any(), any());
SqlSession session = new SqlSession(null, null, null, resolver, null, null, null);
return new Tuple<>(cmd, session);
}
public void testSysCatalogs() throws Exception {
Tuple<Command, SqlSession> sql = sql("SYS CATALOGS");
sql.v1().execute(sql.v2(), ActionListener.wrap(r -> {
assertEquals(1, r.size());
assertEquals("cluster", r.column(0));
}, ex -> fail(ex.getMessage())));
}
}

View File

@ -0,0 +1,11 @@
//
// Sys Commands
//
sysTableTypes
SYS TABLE TYPES;
TABLE_TYPE:s
BASE TABLE
ALIAS
;