SQL: Implement CASE... WHEN... THEN... ELSE... END (#41349)
Implement the ANSI SQL CASE expression which provides the if/else functionality common to most programming languages. The CASE expression can have multiple WHEN branches and becomes a powerful tool for SQL queries as it can be used in SELECT, WHERE, GROUP BY, HAVING and ORDER BY clauses. Closes: #36200 (cherry picked from commit 8b2577406f47ae60d15803058921d128390af0b6)
This commit is contained in:
parent
eb2295ac81
commit
67d4e399c2
|
@ -1,10 +1,103 @@
|
||||||
[role="xpack"]
|
[role="xpack"]
|
||||||
[testenv="basic"]
|
[testenv="basic"]
|
||||||
[[sql-functions-conditional]]
|
[[sql-functions-conditional]]
|
||||||
=== Conditional Functions
|
=== Conditional Functions And Expressions
|
||||||
|
|
||||||
Functions that return one of their arguments by evaluating in an if-else manner.
|
Functions that return one of their arguments by evaluating in an if-else manner.
|
||||||
|
|
||||||
|
[[sql-functions-conditional-case]]
|
||||||
|
==== `CASE`
|
||||||
|
|
||||||
|
.Synopsis:
|
||||||
|
[source, sql]
|
||||||
|
----
|
||||||
|
CASE WHEN condition THEN result
|
||||||
|
[WHEN ...]
|
||||||
|
[ELSE default_result]
|
||||||
|
END
|
||||||
|
----
|
||||||
|
|
||||||
|
*Input*:
|
||||||
|
|
||||||
|
One or multiple _WHEN *condition* THEN *result_* clauses are used and the expression can optionally have
|
||||||
|
an _ELSE *default_result_* clause. Every *condition* should be a boolean expression.
|
||||||
|
|
||||||
|
*Output*: one of the *result* expressions if the corresponding _WHEN *condition_* evaluates to `true` or
|
||||||
|
the *default_result* if all _WHEN *condition_* clauses evaluate to `false`. If the optional _ELSE *default_result_*
|
||||||
|
clause is missing and all _WHEN *condition_* clauses evaluate to `false` then `null` is returned.
|
||||||
|
|
||||||
|
.Description
|
||||||
|
|
||||||
|
The CASE expression is a generic conditional expression which simulates if/else statements of other programming languages
|
||||||
|
If the condition’s result is true, the value of the result expression that follows the condition will be the returned
|
||||||
|
the subsequent when clauses will be skipped and not processed.
|
||||||
|
|
||||||
|
|
||||||
|
["source","sql",subs="attributes,callouts,macros"]
|
||||||
|
----
|
||||||
|
include-tagged::{sql-specs}/docs/docs.csv-spec[case]
|
||||||
|
----
|
||||||
|
|
||||||
|
["source","sql",subs="attributes,callouts,macros"]
|
||||||
|
----
|
||||||
|
include-tagged::{sql-specs}/docs/docs.csv-spec[caseReturnNull]
|
||||||
|
----
|
||||||
|
|
||||||
|
["source","sql",subs="attributes,callouts,macros"]
|
||||||
|
----
|
||||||
|
include-tagged::{sql-specs}/docs/docs.csv-spec[caseWithElse]
|
||||||
|
----
|
||||||
|
|
||||||
|
|
||||||
|
As a variant, a case expression can be expressed with a syntax similar to *switch-case* of other programming languages:
|
||||||
|
[source, sql]
|
||||||
|
----
|
||||||
|
CASE expression
|
||||||
|
WHEN value1 THEN result1
|
||||||
|
[WHEN value2 THEN result2]
|
||||||
|
[WHEN ...]
|
||||||
|
[ELSE default_result]
|
||||||
|
END
|
||||||
|
----
|
||||||
|
|
||||||
|
In this case it's transformed internally to:
|
||||||
|
[source, sql]
|
||||||
|
----
|
||||||
|
CASE WHEN expression = value1 THEN result1
|
||||||
|
[WHEN expression = value2 THEN result2]
|
||||||
|
[WHEN ...]
|
||||||
|
[ELSE default_result]
|
||||||
|
END
|
||||||
|
----
|
||||||
|
|
||||||
|
["source","sql",subs="attributes,callouts,macros"]
|
||||||
|
----
|
||||||
|
include-tagged::{sql-specs}/docs/docs.csv-spec[caseWithOperand]
|
||||||
|
----
|
||||||
|
|
||||||
|
["source","sql",subs="attributes,callouts,macros"]
|
||||||
|
----
|
||||||
|
include-tagged::{sql-specs}/docs/docs.csv-spec[caseWithOperandAndElse]
|
||||||
|
----
|
||||||
|
|
||||||
|
[NOTE]
|
||||||
|
===============================
|
||||||
|
All result expressions must be of compatible data types. More specifically all result
|
||||||
|
expressions should have a compatible data type with the 1st _non-null_ result expression.
|
||||||
|
E.g.:
|
||||||
|
|
||||||
|
for the following query:
|
||||||
|
|
||||||
|
[source, sql]
|
||||||
|
CASE WHEN a = 1 THEN null
|
||||||
|
WHEN a > 2 THEN 10
|
||||||
|
WHEN a > 5 THEN 'foo'
|
||||||
|
END
|
||||||
|
|
||||||
|
an error message would be returned, mentioning that *'foo'* is of data type *keyword*,
|
||||||
|
which does not match the expected data type *integer* (based on result *10*).
|
||||||
|
===============================
|
||||||
|
|
||||||
[[sql-functions-conditional-coalesce]]
|
[[sql-functions-conditional-coalesce]]
|
||||||
==== `COALESCE`
|
==== `COALESCE`
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,7 @@
|
||||||
** <<sql-functions-type-conversion-cast>>
|
** <<sql-functions-type-conversion-cast>>
|
||||||
** <<sql-functions-type-conversion-convert>>
|
** <<sql-functions-type-conversion-convert>>
|
||||||
* <<sql-functions-conditional>>
|
* <<sql-functions-conditional>>
|
||||||
|
** <<sql-functions-conditional-case>>
|
||||||
** <<sql-functions-conditional-coalesce>>
|
** <<sql-functions-conditional-coalesce>>
|
||||||
** <<sql-functions-conditional-greatest>>
|
** <<sql-functions-conditional-greatest>>
|
||||||
** <<sql-functions-conditional-ifnull>>
|
** <<sql-functions-conditional-ifnull>>
|
||||||
|
|
|
@ -25,6 +25,7 @@ STDDEV_POP |AGGREGATE
|
||||||
SUM_OF_SQUARES |AGGREGATE
|
SUM_OF_SQUARES |AGGREGATE
|
||||||
VAR_POP |AGGREGATE
|
VAR_POP |AGGREGATE
|
||||||
HISTOGRAM |GROUPING
|
HISTOGRAM |GROUPING
|
||||||
|
CASE |CONDITIONAL
|
||||||
COALESCE |CONDITIONAL
|
COALESCE |CONDITIONAL
|
||||||
GREATEST |CONDITIONAL
|
GREATEST |CONDITIONAL
|
||||||
IFNULL |CONDITIONAL
|
IFNULL |CONDITIONAL
|
||||||
|
|
|
@ -0,0 +1,181 @@
|
||||||
|
caseField
|
||||||
|
SELECT emp_no, CASE WHEN emp_no - 10000 < 10 THEN 'First 10' ELSE 'Second 10' END as "case" FROM test_emp WHERE emp_no >= 10005
|
||||||
|
ORDER BY emp_no LIMIT 10;
|
||||||
|
|
||||||
|
emp_no | case
|
||||||
|
--------+-----------
|
||||||
|
10005 | First 10
|
||||||
|
10006 | First 10
|
||||||
|
10007 | First 10
|
||||||
|
10008 | First 10
|
||||||
|
10009 | First 10
|
||||||
|
10010 | Second 10
|
||||||
|
10011 | Second 10
|
||||||
|
10012 | Second 10
|
||||||
|
10013 | Second 10
|
||||||
|
10014 | Second 10
|
||||||
|
;
|
||||||
|
|
||||||
|
caseFieldWithoutAlias
|
||||||
|
SELECT emp_no, CASE WHEN emp_no - 10000 < 10 THEN emp_no ELSE emp_no % 10 END FROM test_emp WHERE emp_no >= 10005
|
||||||
|
ORDER BY emp_no LIMIT 10;
|
||||||
|
|
||||||
|
emp_no | CASE WHEN emp_no - 10000 < 10 THEN emp_no ELSE emp_no % 10 END
|
||||||
|
--------+----------------------------------------------------------------
|
||||||
|
10005 | 10005
|
||||||
|
10006 | 10006
|
||||||
|
10007 | 10007
|
||||||
|
10008 | 10008
|
||||||
|
10009 | 10009
|
||||||
|
10010 | 0
|
||||||
|
10011 | 1
|
||||||
|
10012 | 2
|
||||||
|
10013 | 3
|
||||||
|
10014 | 4
|
||||||
|
;
|
||||||
|
|
||||||
|
caseFieldNoElse
|
||||||
|
SELECT emp_no, CASE WHEN emp_no - 10000 < 10 THEN 'First 10' END as "case" FROM test_emp WHERE emp_no >= 10005
|
||||||
|
ORDER BY emp_no LIMIT 10;
|
||||||
|
|
||||||
|
emp_no | case
|
||||||
|
--------+----------
|
||||||
|
10005 | First 10
|
||||||
|
10006 | First 10
|
||||||
|
10007 | First 10
|
||||||
|
10008 | First 10
|
||||||
|
10009 | First 10
|
||||||
|
10010 | null
|
||||||
|
10011 | null
|
||||||
|
10012 | null
|
||||||
|
10013 | null
|
||||||
|
10014 | null
|
||||||
|
;
|
||||||
|
|
||||||
|
caseWhere
|
||||||
|
SELECT last_name FROM test_emp WHERE CASE WHEN LENGTH(last_name) < 7 THEN 'ShortName' ELSE 'LongName' END = 'LongName'
|
||||||
|
ORDER BY emp_no LIMIT 10;
|
||||||
|
|
||||||
|
last_name
|
||||||
|
-----------
|
||||||
|
Facello
|
||||||
|
Bamford
|
||||||
|
Koblick
|
||||||
|
Maliniak
|
||||||
|
Preusig
|
||||||
|
Zielinski
|
||||||
|
Kalloufi
|
||||||
|
Piveteau
|
||||||
|
Bridgland
|
||||||
|
Nooteboom
|
||||||
|
;
|
||||||
|
|
||||||
|
caseWhereNoElse
|
||||||
|
SELECT last_name FROM test_emp WHERE CASE WHEN LENGTH(last_name) < 7 THEN 'ShortName' END IS NOT NULL
|
||||||
|
ORDER BY emp_no LIMIT 10;
|
||||||
|
|
||||||
|
last_name
|
||||||
|
-----------
|
||||||
|
Simmel
|
||||||
|
Peac
|
||||||
|
Sluis
|
||||||
|
Terkki
|
||||||
|
Genin
|
||||||
|
Peha
|
||||||
|
Erde
|
||||||
|
Famili
|
||||||
|
Pettey
|
||||||
|
Heyers
|
||||||
|
;
|
||||||
|
|
||||||
|
caseOrderBy
|
||||||
|
schema::last_name:s|languages:byte|emp_no:i
|
||||||
|
SELECT last_name, languages, emp_no FROM test_emp WHERE emp_no BETWEEN 10005 AND 10015
|
||||||
|
ORDER BY CASE WHEN languages >= 3 THEN 'first' ELSE 'second' END, emp_no LIMIT 10;
|
||||||
|
|
||||||
|
last_name | languages | emp_no
|
||||||
|
-----------+-----------+--------
|
||||||
|
Preusig | 3 | 10006
|
||||||
|
Zielinski | 4 | 10007
|
||||||
|
Piveteau | 4 | 10010
|
||||||
|
Sluis | 5 | 10011
|
||||||
|
Bridgland | 5 | 10012
|
||||||
|
Genin | 5 | 10014
|
||||||
|
Nooteboom | 5 | 10015
|
||||||
|
Maliniak | 1 | 10005
|
||||||
|
Kalloufi | 2 | 10008
|
||||||
|
Peac | 1 | 10009
|
||||||
|
;
|
||||||
|
|
||||||
|
caseOrderByNoElse
|
||||||
|
schema::last_name:s|languages:byte|emp_no:i
|
||||||
|
SELECT last_name, languages, emp_no FROM test_emp WHERE emp_no BETWEEN 10005 AND 10015
|
||||||
|
ORDER BY CASE WHEN languages >= 3 THEN 'first' END NULLS FIRST, emp_no LIMIT 10;
|
||||||
|
|
||||||
|
last_name | languages | emp_no
|
||||||
|
-----------+-----------+--------
|
||||||
|
Maliniak | 1 | 10005
|
||||||
|
Kalloufi | 2 | 10008
|
||||||
|
Peac | 1 | 10009
|
||||||
|
Terkki | 1 | 10013
|
||||||
|
Preusig | 3 | 10006
|
||||||
|
Zielinski | 4 | 10007
|
||||||
|
Piveteau | 4 | 10010
|
||||||
|
Sluis | 5 | 10011
|
||||||
|
Bridgland | 5 | 10012
|
||||||
|
Genin | 5 | 10014
|
||||||
|
;
|
||||||
|
|
||||||
|
caseGroupBy
|
||||||
|
schema::count:l|lang_skills:s
|
||||||
|
SELECT count(*) AS count, CASE WHEN NVL(languages, 0) <= 1 THEN 'zero-to-one' ELSE 'multilingual' END as lang_skills
|
||||||
|
FROM test_emp GROUP BY lang_skills ORDER BY lang_skills;
|
||||||
|
|
||||||
|
count | lang_skills
|
||||||
|
-------+--------------
|
||||||
|
75 | multilingual
|
||||||
|
25 | zero-to-one
|
||||||
|
;
|
||||||
|
|
||||||
|
caseGroupByNoElse
|
||||||
|
schema::count:l|lang_skills:s
|
||||||
|
SELECT count(*) AS count, CASE WHEN NVL(languages, 0) <= 1 THEN 'zero-to-one' END as lang_skills
|
||||||
|
FROM test_emp GROUP BY lang_skills ORDER BY lang_skills;
|
||||||
|
|
||||||
|
count | lang_skills
|
||||||
|
-------+-------------
|
||||||
|
75 | null
|
||||||
|
25 | zero-to-one
|
||||||
|
;
|
||||||
|
|
||||||
|
caseGroupByComplexNested
|
||||||
|
schema::count:l|lang_skills:s
|
||||||
|
SELECT count(*) AS count,
|
||||||
|
CASE WHEN NVL(languages, 0) = 0 THEN 'zero'
|
||||||
|
WHEN languages = 1 THEN 'one'
|
||||||
|
WHEN languages = 2 THEN 'bilingual'
|
||||||
|
WHEN languages = 3 THEN 'trilingual'
|
||||||
|
ELSE 'multilingual'
|
||||||
|
END as lang_skills FROM test_emp GROUP BY lang_skills ORDER BY 2;
|
||||||
|
|
||||||
|
count | lang_skills
|
||||||
|
-------+--------------
|
||||||
|
19 | bilingual
|
||||||
|
39 | multilingual
|
||||||
|
15 | one
|
||||||
|
17 | trilingual
|
||||||
|
10 | zero
|
||||||
|
;
|
||||||
|
|
||||||
|
caseGroupByAndHaving
|
||||||
|
schema::count:l|gender:s|languages:byte
|
||||||
|
SELECT count(*) AS count, gender, languages FROM test_emp
|
||||||
|
GROUP BY 2, 3 HAVING CASE WHEN count(*) > 10 THEN 'many' ELSE 'a few' END = 'many'
|
||||||
|
ORDER BY 2, 3;
|
||||||
|
|
||||||
|
count | gender | languages
|
||||||
|
----------+-------------+---------------
|
||||||
|
11 | M | 2
|
||||||
|
11 | M | 3
|
||||||
|
11 | M | 4
|
||||||
|
;
|
|
@ -202,6 +202,7 @@ STDDEV_POP |AGGREGATE
|
||||||
SUM_OF_SQUARES |AGGREGATE
|
SUM_OF_SQUARES |AGGREGATE
|
||||||
VAR_POP |AGGREGATE
|
VAR_POP |AGGREGATE
|
||||||
HISTOGRAM |GROUPING
|
HISTOGRAM |GROUPING
|
||||||
|
CASE |CONDITIONAL
|
||||||
COALESCE |CONDITIONAL
|
COALESCE |CONDITIONAL
|
||||||
GREATEST |CONDITIONAL
|
GREATEST |CONDITIONAL
|
||||||
IFNULL |CONDITIONAL
|
IFNULL |CONDITIONAL
|
||||||
|
@ -1987,10 +1988,81 @@ SELECT TRUNCATE(-345.153, 1) AS trimmed;
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
//
|
//
|
||||||
// Null handling
|
// Conditional
|
||||||
//
|
//
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
|
case
|
||||||
|
schema::case:s
|
||||||
|
// tag::case
|
||||||
|
SELECT CASE WHEN 1 > 2 THEN 'elastic'
|
||||||
|
WHEN 2 <= 3 THEN 'search'
|
||||||
|
END AS "case";
|
||||||
|
|
||||||
|
case
|
||||||
|
---------------
|
||||||
|
search
|
||||||
|
// end::case
|
||||||
|
;
|
||||||
|
|
||||||
|
caseReturnNull
|
||||||
|
schema::case:s
|
||||||
|
// tag::caseReturnNull
|
||||||
|
SELECT CASE WHEN 1 > 2 THEN 'elastic'
|
||||||
|
WHEN 2 > 10 THEN 'search'
|
||||||
|
END AS "case";
|
||||||
|
|
||||||
|
case
|
||||||
|
---------------
|
||||||
|
null
|
||||||
|
// end::caseReturnNull
|
||||||
|
;
|
||||||
|
|
||||||
|
caseWithElse
|
||||||
|
schema::case:s
|
||||||
|
// tag::caseWithElse
|
||||||
|
SELECT CASE WHEN 1 > 2 THEN 'elastic'
|
||||||
|
WHEN 2 > 10 THEN 'search'
|
||||||
|
ELSE 'default'
|
||||||
|
END AS "case";
|
||||||
|
|
||||||
|
case
|
||||||
|
---------------
|
||||||
|
default
|
||||||
|
// end::caseWithElse
|
||||||
|
;
|
||||||
|
|
||||||
|
caseWithOperand
|
||||||
|
schema::case:s
|
||||||
|
// tag::caseWithOperand
|
||||||
|
SELECT CASE 5
|
||||||
|
WHEN 1 THEN 'elastic'
|
||||||
|
WHEN 2 THEN 'search'
|
||||||
|
WHEN 5 THEN 'elasticsearch'
|
||||||
|
END AS "case";
|
||||||
|
|
||||||
|
case
|
||||||
|
---------------
|
||||||
|
elasticsearch
|
||||||
|
// end::caseWithOperand
|
||||||
|
;
|
||||||
|
|
||||||
|
caseWithOperandAndElse
|
||||||
|
schema::case:s
|
||||||
|
// tag::caseWithOperandAndElse
|
||||||
|
SELECT CASE 5
|
||||||
|
WHEN 1 THEN 'elastic'
|
||||||
|
WHEN 2 THEN 'search'
|
||||||
|
WHEN 3 THEN 'elasticsearch'
|
||||||
|
ELSE 'default'
|
||||||
|
END AS "case";
|
||||||
|
|
||||||
|
case
|
||||||
|
---------------
|
||||||
|
default
|
||||||
|
// end::caseWithOperandAndElse
|
||||||
|
;
|
||||||
|
|
||||||
coalesceReturnNonNull
|
coalesceReturnNonNull
|
||||||
// tag::coalesceReturnNonNull
|
// tag::coalesceReturnNonNull
|
||||||
SELECT COALESCE(null, 'elastic', 'search') AS "coalesce";
|
SELECT COALESCE(null, 'elastic', 'search') AS "coalesce";
|
||||||
|
|
|
@ -38,45 +38,9 @@ c
|
||||||
null
|
null
|
||||||
;
|
;
|
||||||
|
|
||||||
coalesceFirstNotNull
|
|
||||||
SELECT COALESCE(123) AS c;
|
|
||||||
|
|
||||||
c
|
|
||||||
123
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
coalesceWithFirstNullOfString
|
|
||||||
SELECT COALESCE(null, 'first') AS c;
|
|
||||||
|
|
||||||
c:s
|
|
||||||
first
|
|
||||||
;
|
|
||||||
|
|
||||||
coalesceWithFirstNullOfNumber
|
|
||||||
SELECT COALESCE(null, 123) AS c;
|
|
||||||
|
|
||||||
c:i
|
|
||||||
123
|
|
||||||
;
|
|
||||||
|
|
||||||
coalesceMixed
|
coalesceMixed
|
||||||
SELECT COALESCE(null, 123, null, 321);
|
SELECT COALESCE(null, 123, null, 321);
|
||||||
|
|
||||||
COALESCE(null, 123, null, 321):i
|
COALESCE(null, 123, null, 321):i
|
||||||
123
|
123
|
||||||
;
|
;
|
||||||
|
|
||||||
coalesceMixedWithAlias
|
|
||||||
SELECT COALESCE(null, 123, null, 321) AS c;
|
|
||||||
|
|
||||||
c:i
|
|
||||||
123
|
|
||||||
;
|
|
||||||
|
|
||||||
coalesceScalar
|
|
||||||
SELECT COALESCE(null, ABS(123) + 1) AS c;
|
|
||||||
|
|
||||||
c:i
|
|
||||||
124
|
|
||||||
;
|
|
||||||
|
|
|
@ -1,7 +1,22 @@
|
||||||
//
|
//
|
||||||
// Null expressions
|
// Null conditionals
|
||||||
//
|
//
|
||||||
|
|
||||||
|
coalesceFirstNotNull
|
||||||
|
SELECT COALESCE(123) AS c;
|
||||||
|
|
||||||
|
coalesceWithFirstNullOfString
|
||||||
|
SELECT COALESCE(null, 'first') AS c;
|
||||||
|
|
||||||
|
coalesceWithFirstNullOfNumber
|
||||||
|
SELECT COALESCE(null, 123) AS c;
|
||||||
|
|
||||||
|
coalesceMixedWithAlias
|
||||||
|
SELECT COALESCE(null, 123, null, 321) AS c;
|
||||||
|
|
||||||
|
coalesceScalar
|
||||||
|
SELECT COALESCE(null, ABS(123) + 1) AS c;
|
||||||
|
|
||||||
coalesceField
|
coalesceField
|
||||||
SELECT COALESCE(null, ABS(emp_no) + 1) AS c FROM test_emp ORDER BY emp_no LIMIT 5;
|
SELECT COALESCE(null, ABS(emp_no) + 1) AS c FROM test_emp ORDER BY emp_no LIMIT 5;
|
||||||
|
|
||||||
|
|
|
@ -213,16 +213,17 @@ valueExpression
|
||||||
;
|
;
|
||||||
|
|
||||||
primaryExpression
|
primaryExpression
|
||||||
: castExpression #cast
|
: castExpression #cast
|
||||||
| primaryExpression CAST_OP dataType #castOperatorExpression
|
| primaryExpression CAST_OP dataType #castOperatorExpression
|
||||||
| extractExpression #extract
|
| extractExpression #extract
|
||||||
| builtinDateTimeFunction #currentDateTimeFunction
|
| builtinDateTimeFunction #currentDateTimeFunction
|
||||||
| constant #constantDefault
|
| constant #constantDefault
|
||||||
| (qualifiedName DOT)? ASTERISK #star
|
| (qualifiedName DOT)? ASTERISK #star
|
||||||
| functionExpression #function
|
| functionExpression #function
|
||||||
| '(' query ')' #subqueryExpression
|
| '(' query ')' #subqueryExpression
|
||||||
| qualifiedName #dereference
|
| qualifiedName #dereference
|
||||||
| '(' expression ')' #parenthesizedExpression
|
| '(' expression ')' #parenthesizedExpression
|
||||||
|
| CASE (operand=booleanExpression)? whenClause+ (ELSE elseClause=booleanExpression)? END #case
|
||||||
;
|
;
|
||||||
|
|
||||||
builtinDateTimeFunction
|
builtinDateTimeFunction
|
||||||
|
@ -337,6 +338,10 @@ string
|
||||||
| STRING
|
| STRING
|
||||||
;
|
;
|
||||||
|
|
||||||
|
whenClause
|
||||||
|
: WHEN condition=expression THEN result=expression
|
||||||
|
;
|
||||||
|
|
||||||
// http://developer.mimer.se/validator/sql-reserved-words.tml
|
// http://developer.mimer.se/validator/sql-reserved-words.tml
|
||||||
nonReserved
|
nonReserved
|
||||||
: ANALYZE | ANALYZED
|
: ANALYZE | ANALYZED
|
||||||
|
@ -368,6 +373,7 @@ AS: 'AS';
|
||||||
ASC: 'ASC';
|
ASC: 'ASC';
|
||||||
BETWEEN: 'BETWEEN';
|
BETWEEN: 'BETWEEN';
|
||||||
BY: 'BY';
|
BY: 'BY';
|
||||||
|
CASE: 'CASE';
|
||||||
CAST: 'CAST';
|
CAST: 'CAST';
|
||||||
CATALOG: 'CATALOG';
|
CATALOG: 'CATALOG';
|
||||||
CATALOGS: 'CATALOGS';
|
CATALOGS: 'CATALOGS';
|
||||||
|
@ -382,6 +388,8 @@ DEBUG: 'DEBUG';
|
||||||
DESC: 'DESC';
|
DESC: 'DESC';
|
||||||
DESCRIBE: 'DESCRIBE';
|
DESCRIBE: 'DESCRIBE';
|
||||||
DISTINCT: 'DISTINCT';
|
DISTINCT: 'DISTINCT';
|
||||||
|
ELSE: 'ELSE';
|
||||||
|
END: 'END';
|
||||||
ESCAPE: 'ESCAPE';
|
ESCAPE: 'ESCAPE';
|
||||||
EXECUTABLE: 'EXECUTABLE';
|
EXECUTABLE: 'EXECUTABLE';
|
||||||
EXISTS: 'EXISTS';
|
EXISTS: 'EXISTS';
|
||||||
|
@ -437,12 +445,14 @@ SYS: 'SYS';
|
||||||
TABLE: 'TABLE';
|
TABLE: 'TABLE';
|
||||||
TABLES: 'TABLES';
|
TABLES: 'TABLES';
|
||||||
TEXT: 'TEXT';
|
TEXT: 'TEXT';
|
||||||
|
THEN: 'THEN';
|
||||||
TRUE: 'TRUE';
|
TRUE: 'TRUE';
|
||||||
TO: 'TO';
|
TO: 'TO';
|
||||||
TYPE: 'TYPE';
|
TYPE: 'TYPE';
|
||||||
TYPES: 'TYPES';
|
TYPES: 'TYPES';
|
||||||
USING: 'USING';
|
USING: 'USING';
|
||||||
VERIFY: 'VERIFY';
|
VERIFY: 'VERIFY';
|
||||||
|
WHEN: 'WHEN';
|
||||||
WHERE: 'WHERE';
|
WHERE: 'WHERE';
|
||||||
WITH: 'WITH';
|
WITH: 'WITH';
|
||||||
YEAR: 'YEAR';
|
YEAR: 'YEAR';
|
||||||
|
|
|
@ -11,122 +11,127 @@ AS=10
|
||||||
ASC=11
|
ASC=11
|
||||||
BETWEEN=12
|
BETWEEN=12
|
||||||
BY=13
|
BY=13
|
||||||
CAST=14
|
CASE=14
|
||||||
CATALOG=15
|
CAST=15
|
||||||
CATALOGS=16
|
CATALOG=16
|
||||||
COLUMNS=17
|
CATALOGS=17
|
||||||
CONVERT=18
|
COLUMNS=18
|
||||||
CURRENT_DATE=19
|
CONVERT=19
|
||||||
CURRENT_TIME=20
|
CURRENT_DATE=20
|
||||||
CURRENT_TIMESTAMP=21
|
CURRENT_TIME=21
|
||||||
DAY=22
|
CURRENT_TIMESTAMP=22
|
||||||
DAYS=23
|
DAY=23
|
||||||
DEBUG=24
|
DAYS=24
|
||||||
DESC=25
|
DEBUG=25
|
||||||
DESCRIBE=26
|
DESC=26
|
||||||
DISTINCT=27
|
DESCRIBE=27
|
||||||
ESCAPE=28
|
DISTINCT=28
|
||||||
EXECUTABLE=29
|
ELSE=29
|
||||||
EXISTS=30
|
END=30
|
||||||
EXPLAIN=31
|
ESCAPE=31
|
||||||
EXTRACT=32
|
EXECUTABLE=32
|
||||||
FALSE=33
|
EXISTS=33
|
||||||
FIRST=34
|
EXPLAIN=34
|
||||||
FORMAT=35
|
EXTRACT=35
|
||||||
FROM=36
|
FALSE=36
|
||||||
FULL=37
|
FIRST=37
|
||||||
FUNCTIONS=38
|
FORMAT=38
|
||||||
GRAPHVIZ=39
|
FROM=39
|
||||||
GROUP=40
|
FULL=40
|
||||||
HAVING=41
|
FUNCTIONS=41
|
||||||
HOUR=42
|
GRAPHVIZ=42
|
||||||
HOURS=43
|
GROUP=43
|
||||||
IN=44
|
HAVING=44
|
||||||
INNER=45
|
HOUR=45
|
||||||
INTERVAL=46
|
HOURS=46
|
||||||
IS=47
|
IN=47
|
||||||
JOIN=48
|
INNER=48
|
||||||
LAST=49
|
INTERVAL=49
|
||||||
LEFT=50
|
IS=50
|
||||||
LIKE=51
|
JOIN=51
|
||||||
LIMIT=52
|
LAST=52
|
||||||
MAPPED=53
|
LEFT=53
|
||||||
MATCH=54
|
LIKE=54
|
||||||
MINUTE=55
|
LIMIT=55
|
||||||
MINUTES=56
|
MAPPED=56
|
||||||
MONTH=57
|
MATCH=57
|
||||||
MONTHS=58
|
MINUTE=58
|
||||||
NATURAL=59
|
MINUTES=59
|
||||||
NOT=60
|
MONTH=60
|
||||||
NULL=61
|
MONTHS=61
|
||||||
NULLS=62
|
NATURAL=62
|
||||||
ON=63
|
NOT=63
|
||||||
OPTIMIZED=64
|
NULL=64
|
||||||
OR=65
|
NULLS=65
|
||||||
ORDER=66
|
ON=66
|
||||||
OUTER=67
|
OPTIMIZED=67
|
||||||
PARSED=68
|
OR=68
|
||||||
PHYSICAL=69
|
ORDER=69
|
||||||
PLAN=70
|
OUTER=70
|
||||||
RIGHT=71
|
PARSED=71
|
||||||
RLIKE=72
|
PHYSICAL=72
|
||||||
QUERY=73
|
PLAN=73
|
||||||
SCHEMAS=74
|
RIGHT=74
|
||||||
SECOND=75
|
RLIKE=75
|
||||||
SECONDS=76
|
QUERY=76
|
||||||
SELECT=77
|
SCHEMAS=77
|
||||||
SHOW=78
|
SECOND=78
|
||||||
SYS=79
|
SECONDS=79
|
||||||
TABLE=80
|
SELECT=80
|
||||||
TABLES=81
|
SHOW=81
|
||||||
TEXT=82
|
SYS=82
|
||||||
TRUE=83
|
TABLE=83
|
||||||
TO=84
|
TABLES=84
|
||||||
TYPE=85
|
TEXT=85
|
||||||
TYPES=86
|
THEN=86
|
||||||
USING=87
|
TRUE=87
|
||||||
VERIFY=88
|
TO=88
|
||||||
WHERE=89
|
TYPE=89
|
||||||
WITH=90
|
TYPES=90
|
||||||
YEAR=91
|
USING=91
|
||||||
YEARS=92
|
VERIFY=92
|
||||||
ESCAPE_ESC=93
|
WHEN=93
|
||||||
FUNCTION_ESC=94
|
WHERE=94
|
||||||
LIMIT_ESC=95
|
WITH=95
|
||||||
DATE_ESC=96
|
YEAR=96
|
||||||
TIME_ESC=97
|
YEARS=97
|
||||||
TIMESTAMP_ESC=98
|
ESCAPE_ESC=98
|
||||||
GUID_ESC=99
|
FUNCTION_ESC=99
|
||||||
ESC_END=100
|
LIMIT_ESC=100
|
||||||
EQ=101
|
DATE_ESC=101
|
||||||
NULLEQ=102
|
TIME_ESC=102
|
||||||
NEQ=103
|
TIMESTAMP_ESC=103
|
||||||
LT=104
|
GUID_ESC=104
|
||||||
LTE=105
|
ESC_END=105
|
||||||
GT=106
|
EQ=106
|
||||||
GTE=107
|
NULLEQ=107
|
||||||
PLUS=108
|
NEQ=108
|
||||||
MINUS=109
|
LT=109
|
||||||
ASTERISK=110
|
LTE=110
|
||||||
SLASH=111
|
GT=111
|
||||||
PERCENT=112
|
GTE=112
|
||||||
CAST_OP=113
|
PLUS=113
|
||||||
CONCAT=114
|
MINUS=114
|
||||||
DOT=115
|
ASTERISK=115
|
||||||
PARAM=116
|
SLASH=116
|
||||||
STRING=117
|
PERCENT=117
|
||||||
INTEGER_VALUE=118
|
CAST_OP=118
|
||||||
DECIMAL_VALUE=119
|
CONCAT=119
|
||||||
IDENTIFIER=120
|
DOT=120
|
||||||
DIGIT_IDENTIFIER=121
|
PARAM=121
|
||||||
TABLE_IDENTIFIER=122
|
STRING=122
|
||||||
QUOTED_IDENTIFIER=123
|
INTEGER_VALUE=123
|
||||||
BACKQUOTED_IDENTIFIER=124
|
DECIMAL_VALUE=124
|
||||||
SIMPLE_COMMENT=125
|
IDENTIFIER=125
|
||||||
BRACKETED_COMMENT=126
|
DIGIT_IDENTIFIER=126
|
||||||
WS=127
|
TABLE_IDENTIFIER=127
|
||||||
UNRECOGNIZED=128
|
QUOTED_IDENTIFIER=128
|
||||||
DELIMITER=129
|
BACKQUOTED_IDENTIFIER=129
|
||||||
|
SIMPLE_COMMENT=130
|
||||||
|
BRACKETED_COMMENT=131
|
||||||
|
WS=132
|
||||||
|
UNRECOGNIZED=133
|
||||||
|
DELIMITER=134
|
||||||
'('=1
|
'('=1
|
||||||
')'=2
|
')'=2
|
||||||
','=3
|
','=3
|
||||||
|
@ -140,105 +145,110 @@ DELIMITER=129
|
||||||
'ASC'=11
|
'ASC'=11
|
||||||
'BETWEEN'=12
|
'BETWEEN'=12
|
||||||
'BY'=13
|
'BY'=13
|
||||||
'CAST'=14
|
'CASE'=14
|
||||||
'CATALOG'=15
|
'CAST'=15
|
||||||
'CATALOGS'=16
|
'CATALOG'=16
|
||||||
'COLUMNS'=17
|
'CATALOGS'=17
|
||||||
'CONVERT'=18
|
'COLUMNS'=18
|
||||||
'CURRENT_DATE'=19
|
'CONVERT'=19
|
||||||
'CURRENT_TIME'=20
|
'CURRENT_DATE'=20
|
||||||
'CURRENT_TIMESTAMP'=21
|
'CURRENT_TIME'=21
|
||||||
'DAY'=22
|
'CURRENT_TIMESTAMP'=22
|
||||||
'DAYS'=23
|
'DAY'=23
|
||||||
'DEBUG'=24
|
'DAYS'=24
|
||||||
'DESC'=25
|
'DEBUG'=25
|
||||||
'DESCRIBE'=26
|
'DESC'=26
|
||||||
'DISTINCT'=27
|
'DESCRIBE'=27
|
||||||
'ESCAPE'=28
|
'DISTINCT'=28
|
||||||
'EXECUTABLE'=29
|
'ELSE'=29
|
||||||
'EXISTS'=30
|
'END'=30
|
||||||
'EXPLAIN'=31
|
'ESCAPE'=31
|
||||||
'EXTRACT'=32
|
'EXECUTABLE'=32
|
||||||
'FALSE'=33
|
'EXISTS'=33
|
||||||
'FIRST'=34
|
'EXPLAIN'=34
|
||||||
'FORMAT'=35
|
'EXTRACT'=35
|
||||||
'FROM'=36
|
'FALSE'=36
|
||||||
'FULL'=37
|
'FIRST'=37
|
||||||
'FUNCTIONS'=38
|
'FORMAT'=38
|
||||||
'GRAPHVIZ'=39
|
'FROM'=39
|
||||||
'GROUP'=40
|
'FULL'=40
|
||||||
'HAVING'=41
|
'FUNCTIONS'=41
|
||||||
'HOUR'=42
|
'GRAPHVIZ'=42
|
||||||
'HOURS'=43
|
'GROUP'=43
|
||||||
'IN'=44
|
'HAVING'=44
|
||||||
'INNER'=45
|
'HOUR'=45
|
||||||
'INTERVAL'=46
|
'HOURS'=46
|
||||||
'IS'=47
|
'IN'=47
|
||||||
'JOIN'=48
|
'INNER'=48
|
||||||
'LAST'=49
|
'INTERVAL'=49
|
||||||
'LEFT'=50
|
'IS'=50
|
||||||
'LIKE'=51
|
'JOIN'=51
|
||||||
'LIMIT'=52
|
'LAST'=52
|
||||||
'MAPPED'=53
|
'LEFT'=53
|
||||||
'MATCH'=54
|
'LIKE'=54
|
||||||
'MINUTE'=55
|
'LIMIT'=55
|
||||||
'MINUTES'=56
|
'MAPPED'=56
|
||||||
'MONTH'=57
|
'MATCH'=57
|
||||||
'MONTHS'=58
|
'MINUTE'=58
|
||||||
'NATURAL'=59
|
'MINUTES'=59
|
||||||
'NOT'=60
|
'MONTH'=60
|
||||||
'NULL'=61
|
'MONTHS'=61
|
||||||
'NULLS'=62
|
'NATURAL'=62
|
||||||
'ON'=63
|
'NOT'=63
|
||||||
'OPTIMIZED'=64
|
'NULL'=64
|
||||||
'OR'=65
|
'NULLS'=65
|
||||||
'ORDER'=66
|
'ON'=66
|
||||||
'OUTER'=67
|
'OPTIMIZED'=67
|
||||||
'PARSED'=68
|
'OR'=68
|
||||||
'PHYSICAL'=69
|
'ORDER'=69
|
||||||
'PLAN'=70
|
'OUTER'=70
|
||||||
'RIGHT'=71
|
'PARSED'=71
|
||||||
'RLIKE'=72
|
'PHYSICAL'=72
|
||||||
'QUERY'=73
|
'PLAN'=73
|
||||||
'SCHEMAS'=74
|
'RIGHT'=74
|
||||||
'SECOND'=75
|
'RLIKE'=75
|
||||||
'SECONDS'=76
|
'QUERY'=76
|
||||||
'SELECT'=77
|
'SCHEMAS'=77
|
||||||
'SHOW'=78
|
'SECOND'=78
|
||||||
'SYS'=79
|
'SECONDS'=79
|
||||||
'TABLE'=80
|
'SELECT'=80
|
||||||
'TABLES'=81
|
'SHOW'=81
|
||||||
'TEXT'=82
|
'SYS'=82
|
||||||
'TRUE'=83
|
'TABLE'=83
|
||||||
'TO'=84
|
'TABLES'=84
|
||||||
'TYPE'=85
|
'TEXT'=85
|
||||||
'TYPES'=86
|
'THEN'=86
|
||||||
'USING'=87
|
'TRUE'=87
|
||||||
'VERIFY'=88
|
'TO'=88
|
||||||
'WHERE'=89
|
'TYPE'=89
|
||||||
'WITH'=90
|
'TYPES'=90
|
||||||
'YEAR'=91
|
'USING'=91
|
||||||
'YEARS'=92
|
'VERIFY'=92
|
||||||
'{ESCAPE'=93
|
'WHEN'=93
|
||||||
'{FN'=94
|
'WHERE'=94
|
||||||
'{LIMIT'=95
|
'WITH'=95
|
||||||
'{D'=96
|
'YEAR'=96
|
||||||
'{T'=97
|
'YEARS'=97
|
||||||
'{TS'=98
|
'{ESCAPE'=98
|
||||||
'{GUID'=99
|
'{FN'=99
|
||||||
'}'=100
|
'{LIMIT'=100
|
||||||
'='=101
|
'{D'=101
|
||||||
'<=>'=102
|
'{T'=102
|
||||||
'<'=104
|
'{TS'=103
|
||||||
'<='=105
|
'{GUID'=104
|
||||||
'>'=106
|
'}'=105
|
||||||
'>='=107
|
'='=106
|
||||||
'+'=108
|
'<=>'=107
|
||||||
'-'=109
|
'<'=109
|
||||||
'*'=110
|
'<='=110
|
||||||
'/'=111
|
'>'=111
|
||||||
'%'=112
|
'>='=112
|
||||||
'::'=113
|
'+'=113
|
||||||
'||'=114
|
'-'=114
|
||||||
'.'=115
|
'*'=115
|
||||||
'?'=116
|
'/'=116
|
||||||
|
'%'=117
|
||||||
|
'::'=118
|
||||||
|
'||'=119
|
||||||
|
'.'=120
|
||||||
|
'?'=121
|
||||||
|
|
|
@ -11,121 +11,126 @@ AS=10
|
||||||
ASC=11
|
ASC=11
|
||||||
BETWEEN=12
|
BETWEEN=12
|
||||||
BY=13
|
BY=13
|
||||||
CAST=14
|
CASE=14
|
||||||
CATALOG=15
|
CAST=15
|
||||||
CATALOGS=16
|
CATALOG=16
|
||||||
COLUMNS=17
|
CATALOGS=17
|
||||||
CONVERT=18
|
COLUMNS=18
|
||||||
CURRENT_DATE=19
|
CONVERT=19
|
||||||
CURRENT_TIME=20
|
CURRENT_DATE=20
|
||||||
CURRENT_TIMESTAMP=21
|
CURRENT_TIME=21
|
||||||
DAY=22
|
CURRENT_TIMESTAMP=22
|
||||||
DAYS=23
|
DAY=23
|
||||||
DEBUG=24
|
DAYS=24
|
||||||
DESC=25
|
DEBUG=25
|
||||||
DESCRIBE=26
|
DESC=26
|
||||||
DISTINCT=27
|
DESCRIBE=27
|
||||||
ESCAPE=28
|
DISTINCT=28
|
||||||
EXECUTABLE=29
|
ELSE=29
|
||||||
EXISTS=30
|
END=30
|
||||||
EXPLAIN=31
|
ESCAPE=31
|
||||||
EXTRACT=32
|
EXECUTABLE=32
|
||||||
FALSE=33
|
EXISTS=33
|
||||||
FIRST=34
|
EXPLAIN=34
|
||||||
FORMAT=35
|
EXTRACT=35
|
||||||
FROM=36
|
FALSE=36
|
||||||
FULL=37
|
FIRST=37
|
||||||
FUNCTIONS=38
|
FORMAT=38
|
||||||
GRAPHVIZ=39
|
FROM=39
|
||||||
GROUP=40
|
FULL=40
|
||||||
HAVING=41
|
FUNCTIONS=41
|
||||||
HOUR=42
|
GRAPHVIZ=42
|
||||||
HOURS=43
|
GROUP=43
|
||||||
IN=44
|
HAVING=44
|
||||||
INNER=45
|
HOUR=45
|
||||||
INTERVAL=46
|
HOURS=46
|
||||||
IS=47
|
IN=47
|
||||||
JOIN=48
|
INNER=48
|
||||||
LAST=49
|
INTERVAL=49
|
||||||
LEFT=50
|
IS=50
|
||||||
LIKE=51
|
JOIN=51
|
||||||
LIMIT=52
|
LAST=52
|
||||||
MAPPED=53
|
LEFT=53
|
||||||
MATCH=54
|
LIKE=54
|
||||||
MINUTE=55
|
LIMIT=55
|
||||||
MINUTES=56
|
MAPPED=56
|
||||||
MONTH=57
|
MATCH=57
|
||||||
MONTHS=58
|
MINUTE=58
|
||||||
NATURAL=59
|
MINUTES=59
|
||||||
NOT=60
|
MONTH=60
|
||||||
NULL=61
|
MONTHS=61
|
||||||
NULLS=62
|
NATURAL=62
|
||||||
ON=63
|
NOT=63
|
||||||
OPTIMIZED=64
|
NULL=64
|
||||||
OR=65
|
NULLS=65
|
||||||
ORDER=66
|
ON=66
|
||||||
OUTER=67
|
OPTIMIZED=67
|
||||||
PARSED=68
|
OR=68
|
||||||
PHYSICAL=69
|
ORDER=69
|
||||||
PLAN=70
|
OUTER=70
|
||||||
RIGHT=71
|
PARSED=71
|
||||||
RLIKE=72
|
PHYSICAL=72
|
||||||
QUERY=73
|
PLAN=73
|
||||||
SCHEMAS=74
|
RIGHT=74
|
||||||
SECOND=75
|
RLIKE=75
|
||||||
SECONDS=76
|
QUERY=76
|
||||||
SELECT=77
|
SCHEMAS=77
|
||||||
SHOW=78
|
SECOND=78
|
||||||
SYS=79
|
SECONDS=79
|
||||||
TABLE=80
|
SELECT=80
|
||||||
TABLES=81
|
SHOW=81
|
||||||
TEXT=82
|
SYS=82
|
||||||
TRUE=83
|
TABLE=83
|
||||||
TO=84
|
TABLES=84
|
||||||
TYPE=85
|
TEXT=85
|
||||||
TYPES=86
|
THEN=86
|
||||||
USING=87
|
TRUE=87
|
||||||
VERIFY=88
|
TO=88
|
||||||
WHERE=89
|
TYPE=89
|
||||||
WITH=90
|
TYPES=90
|
||||||
YEAR=91
|
USING=91
|
||||||
YEARS=92
|
VERIFY=92
|
||||||
ESCAPE_ESC=93
|
WHEN=93
|
||||||
FUNCTION_ESC=94
|
WHERE=94
|
||||||
LIMIT_ESC=95
|
WITH=95
|
||||||
DATE_ESC=96
|
YEAR=96
|
||||||
TIME_ESC=97
|
YEARS=97
|
||||||
TIMESTAMP_ESC=98
|
ESCAPE_ESC=98
|
||||||
GUID_ESC=99
|
FUNCTION_ESC=99
|
||||||
ESC_END=100
|
LIMIT_ESC=100
|
||||||
EQ=101
|
DATE_ESC=101
|
||||||
NULLEQ=102
|
TIME_ESC=102
|
||||||
NEQ=103
|
TIMESTAMP_ESC=103
|
||||||
LT=104
|
GUID_ESC=104
|
||||||
LTE=105
|
ESC_END=105
|
||||||
GT=106
|
EQ=106
|
||||||
GTE=107
|
NULLEQ=107
|
||||||
PLUS=108
|
NEQ=108
|
||||||
MINUS=109
|
LT=109
|
||||||
ASTERISK=110
|
LTE=110
|
||||||
SLASH=111
|
GT=111
|
||||||
PERCENT=112
|
GTE=112
|
||||||
CAST_OP=113
|
PLUS=113
|
||||||
CONCAT=114
|
MINUS=114
|
||||||
DOT=115
|
ASTERISK=115
|
||||||
PARAM=116
|
SLASH=116
|
||||||
STRING=117
|
PERCENT=117
|
||||||
INTEGER_VALUE=118
|
CAST_OP=118
|
||||||
DECIMAL_VALUE=119
|
CONCAT=119
|
||||||
IDENTIFIER=120
|
DOT=120
|
||||||
DIGIT_IDENTIFIER=121
|
PARAM=121
|
||||||
TABLE_IDENTIFIER=122
|
STRING=122
|
||||||
QUOTED_IDENTIFIER=123
|
INTEGER_VALUE=123
|
||||||
BACKQUOTED_IDENTIFIER=124
|
DECIMAL_VALUE=124
|
||||||
SIMPLE_COMMENT=125
|
IDENTIFIER=125
|
||||||
BRACKETED_COMMENT=126
|
DIGIT_IDENTIFIER=126
|
||||||
WS=127
|
TABLE_IDENTIFIER=127
|
||||||
UNRECOGNIZED=128
|
QUOTED_IDENTIFIER=128
|
||||||
|
BACKQUOTED_IDENTIFIER=129
|
||||||
|
SIMPLE_COMMENT=130
|
||||||
|
BRACKETED_COMMENT=131
|
||||||
|
WS=132
|
||||||
|
UNRECOGNIZED=133
|
||||||
'('=1
|
'('=1
|
||||||
')'=2
|
')'=2
|
||||||
','=3
|
','=3
|
||||||
|
@ -139,105 +144,110 @@ UNRECOGNIZED=128
|
||||||
'ASC'=11
|
'ASC'=11
|
||||||
'BETWEEN'=12
|
'BETWEEN'=12
|
||||||
'BY'=13
|
'BY'=13
|
||||||
'CAST'=14
|
'CASE'=14
|
||||||
'CATALOG'=15
|
'CAST'=15
|
||||||
'CATALOGS'=16
|
'CATALOG'=16
|
||||||
'COLUMNS'=17
|
'CATALOGS'=17
|
||||||
'CONVERT'=18
|
'COLUMNS'=18
|
||||||
'CURRENT_DATE'=19
|
'CONVERT'=19
|
||||||
'CURRENT_TIME'=20
|
'CURRENT_DATE'=20
|
||||||
'CURRENT_TIMESTAMP'=21
|
'CURRENT_TIME'=21
|
||||||
'DAY'=22
|
'CURRENT_TIMESTAMP'=22
|
||||||
'DAYS'=23
|
'DAY'=23
|
||||||
'DEBUG'=24
|
'DAYS'=24
|
||||||
'DESC'=25
|
'DEBUG'=25
|
||||||
'DESCRIBE'=26
|
'DESC'=26
|
||||||
'DISTINCT'=27
|
'DESCRIBE'=27
|
||||||
'ESCAPE'=28
|
'DISTINCT'=28
|
||||||
'EXECUTABLE'=29
|
'ELSE'=29
|
||||||
'EXISTS'=30
|
'END'=30
|
||||||
'EXPLAIN'=31
|
'ESCAPE'=31
|
||||||
'EXTRACT'=32
|
'EXECUTABLE'=32
|
||||||
'FALSE'=33
|
'EXISTS'=33
|
||||||
'FIRST'=34
|
'EXPLAIN'=34
|
||||||
'FORMAT'=35
|
'EXTRACT'=35
|
||||||
'FROM'=36
|
'FALSE'=36
|
||||||
'FULL'=37
|
'FIRST'=37
|
||||||
'FUNCTIONS'=38
|
'FORMAT'=38
|
||||||
'GRAPHVIZ'=39
|
'FROM'=39
|
||||||
'GROUP'=40
|
'FULL'=40
|
||||||
'HAVING'=41
|
'FUNCTIONS'=41
|
||||||
'HOUR'=42
|
'GRAPHVIZ'=42
|
||||||
'HOURS'=43
|
'GROUP'=43
|
||||||
'IN'=44
|
'HAVING'=44
|
||||||
'INNER'=45
|
'HOUR'=45
|
||||||
'INTERVAL'=46
|
'HOURS'=46
|
||||||
'IS'=47
|
'IN'=47
|
||||||
'JOIN'=48
|
'INNER'=48
|
||||||
'LAST'=49
|
'INTERVAL'=49
|
||||||
'LEFT'=50
|
'IS'=50
|
||||||
'LIKE'=51
|
'JOIN'=51
|
||||||
'LIMIT'=52
|
'LAST'=52
|
||||||
'MAPPED'=53
|
'LEFT'=53
|
||||||
'MATCH'=54
|
'LIKE'=54
|
||||||
'MINUTE'=55
|
'LIMIT'=55
|
||||||
'MINUTES'=56
|
'MAPPED'=56
|
||||||
'MONTH'=57
|
'MATCH'=57
|
||||||
'MONTHS'=58
|
'MINUTE'=58
|
||||||
'NATURAL'=59
|
'MINUTES'=59
|
||||||
'NOT'=60
|
'MONTH'=60
|
||||||
'NULL'=61
|
'MONTHS'=61
|
||||||
'NULLS'=62
|
'NATURAL'=62
|
||||||
'ON'=63
|
'NOT'=63
|
||||||
'OPTIMIZED'=64
|
'NULL'=64
|
||||||
'OR'=65
|
'NULLS'=65
|
||||||
'ORDER'=66
|
'ON'=66
|
||||||
'OUTER'=67
|
'OPTIMIZED'=67
|
||||||
'PARSED'=68
|
'OR'=68
|
||||||
'PHYSICAL'=69
|
'ORDER'=69
|
||||||
'PLAN'=70
|
'OUTER'=70
|
||||||
'RIGHT'=71
|
'PARSED'=71
|
||||||
'RLIKE'=72
|
'PHYSICAL'=72
|
||||||
'QUERY'=73
|
'PLAN'=73
|
||||||
'SCHEMAS'=74
|
'RIGHT'=74
|
||||||
'SECOND'=75
|
'RLIKE'=75
|
||||||
'SECONDS'=76
|
'QUERY'=76
|
||||||
'SELECT'=77
|
'SCHEMAS'=77
|
||||||
'SHOW'=78
|
'SECOND'=78
|
||||||
'SYS'=79
|
'SECONDS'=79
|
||||||
'TABLE'=80
|
'SELECT'=80
|
||||||
'TABLES'=81
|
'SHOW'=81
|
||||||
'TEXT'=82
|
'SYS'=82
|
||||||
'TRUE'=83
|
'TABLE'=83
|
||||||
'TO'=84
|
'TABLES'=84
|
||||||
'TYPE'=85
|
'TEXT'=85
|
||||||
'TYPES'=86
|
'THEN'=86
|
||||||
'USING'=87
|
'TRUE'=87
|
||||||
'VERIFY'=88
|
'TO'=88
|
||||||
'WHERE'=89
|
'TYPE'=89
|
||||||
'WITH'=90
|
'TYPES'=90
|
||||||
'YEAR'=91
|
'USING'=91
|
||||||
'YEARS'=92
|
'VERIFY'=92
|
||||||
'{ESCAPE'=93
|
'WHEN'=93
|
||||||
'{FN'=94
|
'WHERE'=94
|
||||||
'{LIMIT'=95
|
'WITH'=95
|
||||||
'{D'=96
|
'YEAR'=96
|
||||||
'{T'=97
|
'YEARS'=97
|
||||||
'{TS'=98
|
'{ESCAPE'=98
|
||||||
'{GUID'=99
|
'{FN'=99
|
||||||
'}'=100
|
'{LIMIT'=100
|
||||||
'='=101
|
'{D'=101
|
||||||
'<=>'=102
|
'{T'=102
|
||||||
'<'=104
|
'{TS'=103
|
||||||
'<='=105
|
'{GUID'=104
|
||||||
'>'=106
|
'}'=105
|
||||||
'>='=107
|
'='=106
|
||||||
'+'=108
|
'<=>'=107
|
||||||
'-'=109
|
'<'=109
|
||||||
'*'=110
|
'<='=110
|
||||||
'/'=111
|
'>'=111
|
||||||
'%'=112
|
'>='=112
|
||||||
'::'=113
|
'+'=113
|
||||||
'||'=114
|
'-'=114
|
||||||
'.'=115
|
'*'=115
|
||||||
'?'=116
|
'/'=116
|
||||||
|
'%'=117
|
||||||
|
'::'=118
|
||||||
|
'||'=119
|
||||||
|
'.'=120
|
||||||
|
'?'=121
|
||||||
|
|
|
@ -94,6 +94,7 @@ import org.elasticsearch.xpack.sql.expression.function.scalar.string.Right;
|
||||||
import org.elasticsearch.xpack.sql.expression.function.scalar.string.Space;
|
import org.elasticsearch.xpack.sql.expression.function.scalar.string.Space;
|
||||||
import org.elasticsearch.xpack.sql.expression.function.scalar.string.Substring;
|
import org.elasticsearch.xpack.sql.expression.function.scalar.string.Substring;
|
||||||
import org.elasticsearch.xpack.sql.expression.function.scalar.string.UCase;
|
import org.elasticsearch.xpack.sql.expression.function.scalar.string.UCase;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Case;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Coalesce;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Coalesce;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Greatest;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Greatest;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.IfNull;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.IfNull;
|
||||||
|
@ -169,7 +170,8 @@ public class FunctionRegistry {
|
||||||
addToMap(def(Histogram.class, Histogram::new, "HISTOGRAM"));
|
addToMap(def(Histogram.class, Histogram::new, "HISTOGRAM"));
|
||||||
// Scalar functions
|
// Scalar functions
|
||||||
// Conditional
|
// Conditional
|
||||||
addToMap(def(Coalesce.class, Coalesce::new, "COALESCE"),
|
addToMap(def(Case.class, Case::new, "CASE"),
|
||||||
|
def(Coalesce.class, Coalesce::new, "COALESCE"),
|
||||||
def(IfNull.class, IfNull::new, "IFNULL", "ISNULL", "NVL"),
|
def(IfNull.class, IfNull::new, "IFNULL", "ISNULL", "NVL"),
|
||||||
def(NullIf.class, NullIf::new, "NULLIF"),
|
def(NullIf.class, NullIf::new, "NULLIF"),
|
||||||
def(Greatest.class, Greatest::new, "GREATEST"),
|
def(Greatest.class, Greatest::new, "GREATEST"),
|
||||||
|
|
|
@ -28,6 +28,7 @@ import org.elasticsearch.xpack.sql.expression.gen.processor.ChainingProcessor;
|
||||||
import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor;
|
import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor;
|
||||||
import org.elasticsearch.xpack.sql.expression.gen.processor.HitExtractorProcessor;
|
import org.elasticsearch.xpack.sql.expression.gen.processor.HitExtractorProcessor;
|
||||||
import org.elasticsearch.xpack.sql.expression.gen.processor.Processor;
|
import org.elasticsearch.xpack.sql.expression.gen.processor.Processor;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.CaseProcessor;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.ConditionalProcessor;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.ConditionalProcessor;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.NullIfProcessor;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.NullIfProcessor;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.logical.BinaryLogicProcessor;
|
import org.elasticsearch.xpack.sql.expression.predicate.logical.BinaryLogicProcessor;
|
||||||
|
@ -62,7 +63,8 @@ public final class Processors {
|
||||||
// logical
|
// logical
|
||||||
entries.add(new Entry(Processor.class, BinaryLogicProcessor.NAME, BinaryLogicProcessor::new));
|
entries.add(new Entry(Processor.class, BinaryLogicProcessor.NAME, BinaryLogicProcessor::new));
|
||||||
entries.add(new Entry(Processor.class, NotProcessor.NAME, NotProcessor::new));
|
entries.add(new Entry(Processor.class, NotProcessor.NAME, NotProcessor::new));
|
||||||
// null
|
// conditionals
|
||||||
|
entries.add(new Entry(Processor.class, CaseProcessor.NAME, CaseProcessor::new));
|
||||||
entries.add(new Entry(Processor.class, CheckNullProcessor.NAME, CheckNullProcessor::new));
|
entries.add(new Entry(Processor.class, CheckNullProcessor.NAME, CheckNullProcessor::new));
|
||||||
entries.add(new Entry(Processor.class, ConditionalProcessor.NAME, ConditionalProcessor::new));
|
entries.add(new Entry(Processor.class, ConditionalProcessor.NAME, ConditionalProcessor::new));
|
||||||
entries.add(new Entry(Processor.class, NullIfProcessor.NAME, NullIfProcessor::new));
|
entries.add(new Entry(Processor.class, NullIfProcessor.NAME, NullIfProcessor::new));
|
||||||
|
|
|
@ -26,6 +26,7 @@ import org.elasticsearch.xpack.sql.expression.function.scalar.string.StringProce
|
||||||
import org.elasticsearch.xpack.sql.expression.function.scalar.string.SubstringFunctionProcessor;
|
import org.elasticsearch.xpack.sql.expression.function.scalar.string.SubstringFunctionProcessor;
|
||||||
import org.elasticsearch.xpack.sql.expression.literal.IntervalDayTime;
|
import org.elasticsearch.xpack.sql.expression.literal.IntervalDayTime;
|
||||||
import org.elasticsearch.xpack.sql.expression.literal.IntervalYearMonth;
|
import org.elasticsearch.xpack.sql.expression.literal.IntervalYearMonth;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.CaseProcessor;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.ConditionalProcessor.ConditionalOperation;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.ConditionalProcessor.ConditionalOperation;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.NullIfProcessor;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.NullIfProcessor;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.logical.BinaryLogicProcessor.BinaryLogicOperation;
|
import org.elasticsearch.xpack.sql.expression.predicate.logical.BinaryLogicProcessor.BinaryLogicOperation;
|
||||||
|
@ -146,8 +147,12 @@ public final class InternalSqlScriptUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Null
|
// Conditional
|
||||||
//
|
//
|
||||||
|
public static Object caseFunction(List<Object> expressions) {
|
||||||
|
return CaseProcessor.apply(expressions);
|
||||||
|
}
|
||||||
|
|
||||||
public static Object coalesce(List<Object> expressions) {
|
public static Object coalesce(List<Object> expressions) {
|
||||||
return ConditionalOperation.COALESCE.apply(expressions);
|
return ConditionalOperation.COALESCE.apply(expressions);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,164 @@
|
||||||
|
/*
|
||||||
|
* 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.conditional;
|
||||||
|
|
||||||
|
import org.elasticsearch.xpack.sql.expression.Expression;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.Expressions;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.gen.script.ScriptTemplate;
|
||||||
|
import org.elasticsearch.xpack.sql.optimizer.Optimizer;
|
||||||
|
import org.elasticsearch.xpack.sql.tree.NodeInfo;
|
||||||
|
import org.elasticsearch.xpack.sql.tree.Source;
|
||||||
|
import org.elasticsearch.xpack.sql.type.DataType;
|
||||||
|
import org.elasticsearch.xpack.sql.type.DataTypeConversion;
|
||||||
|
import org.elasticsearch.xpack.sql.type.DataTypes;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.StringJoiner;
|
||||||
|
|
||||||
|
import static org.elasticsearch.common.logging.LoggerMessageFormat.format;
|
||||||
|
import static org.elasticsearch.xpack.sql.expression.gen.script.ParamsBuilder.paramsBuilder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements the CASE WHEN ... THEN ... ELSE ... END expression
|
||||||
|
*/
|
||||||
|
public class Case extends ConditionalFunction {
|
||||||
|
|
||||||
|
private final List<IfConditional> conditions;
|
||||||
|
private final Expression defaultElse;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public Case(Source source, List<Expression> expressions) {
|
||||||
|
super(source, expressions);
|
||||||
|
this.conditions = (List<IfConditional>) (List<?>) expressions.subList(0, expressions.size() - 1);
|
||||||
|
this.defaultElse = expressions.get(expressions.size() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<IfConditional> conditions() {
|
||||||
|
return conditions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Expression defaultElse() {
|
||||||
|
return defaultElse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DataType dataType() {
|
||||||
|
if (dataType == null) {
|
||||||
|
if (conditions.isEmpty()) {
|
||||||
|
dataType = defaultElse().dataType();
|
||||||
|
} else {
|
||||||
|
dataType = DataType.NULL;
|
||||||
|
|
||||||
|
for (IfConditional conditional : conditions) {
|
||||||
|
dataType = DataTypeConversion.commonType(dataType, conditional.dataType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dataType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Expression replaceChildren(List<Expression> newChildren) {
|
||||||
|
return new Case(source(), newChildren);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected NodeInfo<? extends Expression> info() {
|
||||||
|
return NodeInfo.create(this, Case::new, children());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected TypeResolution resolveType() {
|
||||||
|
DataType expectedResultDataType = null;
|
||||||
|
for (IfConditional ifConditional : conditions) {
|
||||||
|
if (DataTypes.isNull(ifConditional.result().dataType()) == false) {
|
||||||
|
expectedResultDataType = ifConditional.result().dataType();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (expectedResultDataType == null) {
|
||||||
|
expectedResultDataType = defaultElse().dataType();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (IfConditional conditional : conditions) {
|
||||||
|
if (conditional.condition().dataType() != DataType.BOOLEAN) {
|
||||||
|
return new TypeResolution(format(null, "condition of [{}] must be [boolean], found value [{}] type [{}]",
|
||||||
|
conditional.sourceText(),
|
||||||
|
Expressions.name(conditional.condition()),
|
||||||
|
conditional.condition().dataType().typeName));
|
||||||
|
}
|
||||||
|
if (DataTypes.areTypesCompatible(expectedResultDataType, conditional.dataType()) == false) {
|
||||||
|
return new TypeResolution(format(null, "result of [{}] must be [{}], found value [{}] type [{}]",
|
||||||
|
conditional.sourceText(),
|
||||||
|
expectedResultDataType.typeName,
|
||||||
|
Expressions.name(conditional.result()),
|
||||||
|
conditional.dataType().typeName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DataTypes.areTypesCompatible(expectedResultDataType, defaultElse.dataType()) == false) {
|
||||||
|
return new TypeResolution(format(null, "ELSE clause of [{}] must be [{}], found value [{}] type [{}]",
|
||||||
|
defaultElse.sourceText(),
|
||||||
|
expectedResultDataType.typeName,
|
||||||
|
Expressions.name(defaultElse),
|
||||||
|
defaultElse.dataType().typeName));
|
||||||
|
}
|
||||||
|
|
||||||
|
return TypeResolution.TYPE_RESOLVED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All foldable conditions that fold to FALSE should have
|
||||||
|
* been removed by the {@link Optimizer}.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean foldable() {
|
||||||
|
return (conditions.isEmpty() && defaultElse.foldable()) ||
|
||||||
|
(conditions.size() == 1 && conditions.get(0).condition().foldable() && conditions.get(0).result().foldable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object fold() {
|
||||||
|
if (conditions.isEmpty() == false && conditions.get(0).condition().fold() == Boolean.TRUE) {
|
||||||
|
return conditions.get(0).result().fold();
|
||||||
|
}
|
||||||
|
return defaultElse.fold();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Pipe makePipe() {
|
||||||
|
List<Pipe> pipes = new ArrayList<>(conditions.size() + 1);
|
||||||
|
for (IfConditional ifConditional : conditions) {
|
||||||
|
pipes.add(Expressions.pipe(ifConditional.condition()));
|
||||||
|
pipes.add(Expressions.pipe(ifConditional.result()));
|
||||||
|
}
|
||||||
|
pipes.add(Expressions.pipe(defaultElse));
|
||||||
|
return new CasePipe(source(), this, pipes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ScriptTemplate asScript() {
|
||||||
|
List<ScriptTemplate> templates = new ArrayList<>();
|
||||||
|
for (IfConditional ifConditional : conditions) {
|
||||||
|
templates.add(asScript(ifConditional.condition()));
|
||||||
|
templates.add(asScript(ifConditional.result()));
|
||||||
|
}
|
||||||
|
templates.add(asScript(defaultElse));
|
||||||
|
|
||||||
|
StringJoiner template = new StringJoiner(",", "{sql}.caseFunction([", "])");
|
||||||
|
ParamsBuilder params = paramsBuilder();
|
||||||
|
|
||||||
|
for (ScriptTemplate scriptTemplate : templates) {
|
||||||
|
template.add(scriptTemplate.template());
|
||||||
|
params.script(scriptTemplate.params());
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ScriptTemplate(formatTemplate(template.toString()), params.build(), dataType());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* 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.conditional;
|
||||||
|
|
||||||
|
import org.elasticsearch.xpack.sql.expression.Expression;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.gen.pipeline.MultiPipe;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.gen.processor.Processor;
|
||||||
|
import org.elasticsearch.xpack.sql.tree.NodeInfo;
|
||||||
|
import org.elasticsearch.xpack.sql.tree.Source;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class CasePipe extends MultiPipe {
|
||||||
|
|
||||||
|
public CasePipe(Source source, Expression expression, List<Pipe> children) {
|
||||||
|
super(source, expression, children);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected NodeInfo<CasePipe> info() {
|
||||||
|
return NodeInfo.create(this, CasePipe::new, expression(), children());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Pipe replaceChildren(List<Pipe> newChildren) {
|
||||||
|
return new CasePipe(source(), expression(), newChildren);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Processor asProcessor(List<Processor> procs) {
|
||||||
|
return new CaseProcessor(procs);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
* 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.conditional;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.gen.processor.Processor;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class CaseProcessor implements Processor {
|
||||||
|
|
||||||
|
public static final String NAME = "case";
|
||||||
|
|
||||||
|
private final List<Processor> processors;
|
||||||
|
|
||||||
|
public CaseProcessor(List<Processor> processors) {
|
||||||
|
this.processors = processors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CaseProcessor(StreamInput in) throws IOException {
|
||||||
|
processors = in.readNamedWriteableList(Processor.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getWriteableName() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeTo(StreamOutput out) throws IOException {
|
||||||
|
out.writeNamedWriteableList(processors);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object process(Object input) {
|
||||||
|
List<Object> objects = new ArrayList<>(processors.size());
|
||||||
|
for (Processor processor : processors) {
|
||||||
|
objects.add(processor.process(input));
|
||||||
|
}
|
||||||
|
return apply(objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object apply(List<Object> objects) {
|
||||||
|
for (int i = 0; i < objects.size() - 2; i += 2) {
|
||||||
|
if (objects.get(i) == Boolean.TRUE) {
|
||||||
|
return objects.get(i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// resort to default value
|
||||||
|
return objects.get(objects.size() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (o == null || getClass() != o.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CaseProcessor that = (CaseProcessor) o;
|
||||||
|
return Objects.equals(processors, that.processors);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(processors);
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,6 +15,7 @@ import org.elasticsearch.xpack.sql.type.DataType;
|
||||||
import org.elasticsearch.xpack.sql.type.DataTypeConversion;
|
import org.elasticsearch.xpack.sql.type.DataTypeConversion;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import static org.elasticsearch.common.logging.LoggerMessageFormat.format;
|
import static org.elasticsearch.common.logging.LoggerMessageFormat.format;
|
||||||
import static org.elasticsearch.xpack.sql.type.DataTypes.areTypesCompatible;
|
import static org.elasticsearch.xpack.sql.type.DataTypes.areTypesCompatible;
|
||||||
|
@ -75,4 +76,21 @@ public abstract class ConditionalFunction extends ScalarFunction {
|
||||||
public Nullability nullable() {
|
public Nullability nullable() {
|
||||||
return Nullability.UNKNOWN;
|
return Nullability.UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (o == null || getClass() != o.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ConditionalFunction that = (ConditionalFunction) o;
|
||||||
|
return children().equals(that.children());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(children());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
/*
|
||||||
|
* 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.conditional;
|
||||||
|
|
||||||
|
import org.elasticsearch.xpack.sql.expression.Expression;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.Nullability;
|
||||||
|
import org.elasticsearch.xpack.sql.tree.NodeInfo;
|
||||||
|
import org.elasticsearch.xpack.sql.tree.Source;
|
||||||
|
import org.elasticsearch.xpack.sql.type.DataType;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper expression (cannot be created directly from a query) to model a
|
||||||
|
* {@code WHEN <condition> ELSE <result>} clause of {@link Case} expression
|
||||||
|
*/
|
||||||
|
public class IfConditional extends Expression {
|
||||||
|
|
||||||
|
private final Expression condition;
|
||||||
|
private final Expression result;
|
||||||
|
|
||||||
|
public IfConditional(Source source, Expression condition, Expression result) {
|
||||||
|
super(source, Arrays.asList(condition, result));
|
||||||
|
this.condition = condition;
|
||||||
|
this.result = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Expression condition() {
|
||||||
|
return condition;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Expression result() {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Nullability nullable() {
|
||||||
|
return Nullability.UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DataType dataType() {
|
||||||
|
return result.dataType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Expression replaceChildren(List<Expression> newChildren) {
|
||||||
|
if (newChildren.size() < 2) {
|
||||||
|
throw new IllegalArgumentException("expected at least [2] children but received [" + newChildren.size() + "]");
|
||||||
|
}
|
||||||
|
return new IfConditional(source(), newChildren.get(0), newChildren.get(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected NodeInfo<? extends Expression> info() {
|
||||||
|
return NodeInfo.create(this, IfConditional::new, condition, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected TypeResolution resolveType() {
|
||||||
|
// Verification takes place is Case function to be
|
||||||
|
// able to generate more accurate error messages
|
||||||
|
return TypeResolution.TYPE_RESOLVED;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (o == null || getClass() != o.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!super.equals(o)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
IfConditional that = (IfConditional) o;
|
||||||
|
return Objects.equals(condition, that.condition) &&
|
||||||
|
Objects.equals(result, that.result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(condition, result);
|
||||||
|
}
|
||||||
|
}
|
|
@ -48,7 +48,9 @@ import org.elasticsearch.xpack.sql.expression.predicate.Negatable;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.Predicates;
|
import org.elasticsearch.xpack.sql.expression.predicate.Predicates;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.Range;
|
import org.elasticsearch.xpack.sql.expression.predicate.Range;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.ArbitraryConditionalFunction;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.ArbitraryConditionalFunction;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Case;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Coalesce;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Coalesce;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.IfConditional;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.logical.And;
|
import org.elasticsearch.xpack.sql.expression.predicate.logical.And;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.logical.Not;
|
import org.elasticsearch.xpack.sql.expression.predicate.logical.Not;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.logical.Or;
|
import org.elasticsearch.xpack.sql.expression.predicate.logical.Or;
|
||||||
|
@ -127,6 +129,7 @@ public class Optimizer extends RuleExecutor<LogicalPlan> {
|
||||||
new FoldNull(),
|
new FoldNull(),
|
||||||
new ConstantFolding(),
|
new ConstantFolding(),
|
||||||
new SimplifyConditional(),
|
new SimplifyConditional(),
|
||||||
|
new SimplifyCase(),
|
||||||
// boolean
|
// boolean
|
||||||
new BooleanSimplification(),
|
new BooleanSimplification(),
|
||||||
new BooleanLiteralsOnTheRight(),
|
new BooleanLiteralsOnTheRight(),
|
||||||
|
@ -1227,6 +1230,40 @@ public class Optimizer extends RuleExecutor<LogicalPlan> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class SimplifyCase extends OptimizerExpressionRule {
|
||||||
|
|
||||||
|
SimplifyCase() {
|
||||||
|
super(TransformDirection.DOWN);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Expression rule(Expression e) {
|
||||||
|
if (e instanceof Case) {
|
||||||
|
Case c = (Case) e;
|
||||||
|
|
||||||
|
// Remove or foldable conditions that fold to FALSE
|
||||||
|
// Stop at the 1st foldable condition that folds to TRUE
|
||||||
|
List<IfConditional> newConditions = new ArrayList<>();
|
||||||
|
for (IfConditional conditional : c.conditions()) {
|
||||||
|
if (conditional.condition().foldable()) {
|
||||||
|
Boolean res = (Boolean) conditional.condition().fold();
|
||||||
|
if (res == Boolean.TRUE) {
|
||||||
|
newConditions.add(conditional);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
newConditions.add(conditional);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newConditions.size() < c.children().size()) {
|
||||||
|
return c.replaceChildren(combine(newConditions, c.defaultElse()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static class BooleanSimplification extends OptimizerExpressionRule {
|
static class BooleanSimplification extends OptimizerExpressionRule {
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,8 @@ import org.elasticsearch.xpack.sql.expression.literal.IntervalYearMonth;
|
||||||
import org.elasticsearch.xpack.sql.expression.literal.Intervals;
|
import org.elasticsearch.xpack.sql.expression.literal.Intervals;
|
||||||
import org.elasticsearch.xpack.sql.expression.literal.Intervals.TimeUnit;
|
import org.elasticsearch.xpack.sql.expression.literal.Intervals.TimeUnit;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.Range;
|
import org.elasticsearch.xpack.sql.expression.predicate.Range;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Case;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.IfConditional;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.fulltext.MatchQueryPredicate;
|
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.MultiMatchQueryPredicate;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.fulltext.StringQueryPredicate;
|
import org.elasticsearch.xpack.sql.expression.predicate.fulltext.StringQueryPredicate;
|
||||||
|
@ -116,6 +118,7 @@ import java.time.Duration;
|
||||||
import java.time.Period;
|
import java.time.Period;
|
||||||
import java.time.format.DateTimeParseException;
|
import java.time.format.DateTimeParseException;
|
||||||
import java.time.temporal.TemporalAmount;
|
import java.time.temporal.TemporalAmount;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
@ -459,6 +462,25 @@ abstract class ExpressionBuilder extends IdentifierBuilder {
|
||||||
return new ScalarSubquery(source(ctx), plan(ctx.query()));
|
return new ScalarSubquery(source(ctx), plan(ctx.query()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object visitCase(SqlBaseParser.CaseContext ctx) {
|
||||||
|
List<Expression> expressions = new ArrayList<>(ctx.whenClause().size());
|
||||||
|
for (SqlBaseParser.WhenClauseContext when : ctx.whenClause()) {
|
||||||
|
if (ctx.operand != null) {
|
||||||
|
expressions.add(new IfConditional(source(when),
|
||||||
|
new Equals(source(when), expression(ctx.operand), expression(when.condition)), expression(when.result)));
|
||||||
|
} else {
|
||||||
|
expressions.add(new IfConditional(source(when), expression(when.condition), expression(when.result)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ctx.elseClause != null) {
|
||||||
|
expressions.add(expression(ctx.elseClause));
|
||||||
|
} else {
|
||||||
|
expressions.add(Literal.NULL);
|
||||||
|
}
|
||||||
|
return new Case(source(ctx), expressions);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Expression visitParenthesizedExpression(ParenthesizedExpressionContext ctx) {
|
public Expression visitParenthesizedExpression(ParenthesizedExpressionContext ctx) {
|
||||||
return expression(ctx.expression());
|
return expression(ctx.expression());
|
||||||
|
|
|
@ -743,6 +743,18 @@ class SqlBaseBaseListener implements SqlBaseListener {
|
||||||
* <p>The default implementation does nothing.</p>
|
* <p>The default implementation does nothing.</p>
|
||||||
*/
|
*/
|
||||||
@Override public void exitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { }
|
@Override public void exitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { }
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*
|
||||||
|
* <p>The default implementation does nothing.</p>
|
||||||
|
*/
|
||||||
|
@Override public void enterCase(SqlBaseParser.CaseContext ctx) { }
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*
|
||||||
|
* <p>The default implementation does nothing.</p>
|
||||||
|
*/
|
||||||
|
@Override public void exitCase(SqlBaseParser.CaseContext ctx) { }
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*
|
*
|
||||||
|
@ -1151,6 +1163,18 @@ class SqlBaseBaseListener implements SqlBaseListener {
|
||||||
* <p>The default implementation does nothing.</p>
|
* <p>The default implementation does nothing.</p>
|
||||||
*/
|
*/
|
||||||
@Override public void exitString(SqlBaseParser.StringContext ctx) { }
|
@Override public void exitString(SqlBaseParser.StringContext ctx) { }
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*
|
||||||
|
* <p>The default implementation does nothing.</p>
|
||||||
|
*/
|
||||||
|
@Override public void enterWhenClause(SqlBaseParser.WhenClauseContext ctx) { }
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*
|
||||||
|
* <p>The default implementation does nothing.</p>
|
||||||
|
*/
|
||||||
|
@Override public void exitWhenClause(SqlBaseParser.WhenClauseContext ctx) { }
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*
|
*
|
||||||
|
|
|
@ -438,6 +438,13 @@ class SqlBaseBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements SqlBa
|
||||||
* {@link #visitChildren} on {@code ctx}.</p>
|
* {@link #visitChildren} on {@code ctx}.</p>
|
||||||
*/
|
*/
|
||||||
@Override public T visitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { return visitChildren(ctx); }
|
@Override public T visitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx) { return visitChildren(ctx); }
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*
|
||||||
|
* <p>The default implementation returns the result of calling
|
||||||
|
* {@link #visitChildren} on {@code ctx}.</p>
|
||||||
|
*/
|
||||||
|
@Override public T visitCase(SqlBaseParser.CaseContext ctx) { return visitChildren(ctx); }
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*
|
*
|
||||||
|
@ -676,6 +683,13 @@ class SqlBaseBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements SqlBa
|
||||||
* {@link #visitChildren} on {@code ctx}.</p>
|
* {@link #visitChildren} on {@code ctx}.</p>
|
||||||
*/
|
*/
|
||||||
@Override public T visitString(SqlBaseParser.StringContext ctx) { return visitChildren(ctx); }
|
@Override public T visitString(SqlBaseParser.StringContext ctx) { return visitChildren(ctx); }
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*
|
||||||
|
* <p>The default implementation returns the result of calling
|
||||||
|
* {@link #visitChildren} on {@code ctx}.</p>
|
||||||
|
*/
|
||||||
|
@Override public T visitWhenClause(SqlBaseParser.WhenClauseContext ctx) { return visitChildren(ctx); }
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,13 +1,16 @@
|
||||||
// ANTLR GENERATED CODE: DO NOT EDIT
|
// ANTLR GENERATED CODE: DO NOT EDIT
|
||||||
package org.elasticsearch.xpack.sql.parser;
|
package org.elasticsearch.xpack.sql.parser;
|
||||||
import org.antlr.v4.runtime.Lexer;
|
|
||||||
import org.antlr.v4.runtime.CharStream;
|
import org.antlr.v4.runtime.CharStream;
|
||||||
import org.antlr.v4.runtime.Token;
|
import org.antlr.v4.runtime.Lexer;
|
||||||
import org.antlr.v4.runtime.TokenStream;
|
import org.antlr.v4.runtime.RuntimeMetaData;
|
||||||
import org.antlr.v4.runtime.*;
|
import org.antlr.v4.runtime.Vocabulary;
|
||||||
import org.antlr.v4.runtime.atn.*;
|
import org.antlr.v4.runtime.VocabularyImpl;
|
||||||
|
import org.antlr.v4.runtime.atn.ATN;
|
||||||
|
import org.antlr.v4.runtime.atn.ATNDeserializer;
|
||||||
|
import org.antlr.v4.runtime.atn.LexerATNSimulator;
|
||||||
|
import org.antlr.v4.runtime.atn.PredictionContextCache;
|
||||||
import org.antlr.v4.runtime.dfa.DFA;
|
import org.antlr.v4.runtime.dfa.DFA;
|
||||||
import org.antlr.v4.runtime.misc.*;
|
|
||||||
|
|
||||||
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
|
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
|
||||||
class SqlBaseLexer extends Lexer {
|
class SqlBaseLexer extends Lexer {
|
||||||
|
@ -18,88 +21,90 @@ class SqlBaseLexer extends Lexer {
|
||||||
new PredictionContextCache();
|
new PredictionContextCache();
|
||||||
public static final int
|
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,
|
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, CATALOG=15, CATALOGS=16, COLUMNS=17,
|
AS=10, ASC=11, BETWEEN=12, BY=13, CASE=14, CAST=15, CATALOG=16, CATALOGS=17,
|
||||||
CONVERT=18, CURRENT_DATE=19, CURRENT_TIME=20, CURRENT_TIMESTAMP=21, DAY=22,
|
COLUMNS=18, CONVERT=19, CURRENT_DATE=20, CURRENT_TIME=21, CURRENT_TIMESTAMP=22,
|
||||||
DAYS=23, DEBUG=24, DESC=25, DESCRIBE=26, DISTINCT=27, ESCAPE=28, EXECUTABLE=29,
|
DAY=23, DAYS=24, DEBUG=25, DESC=26, DESCRIBE=27, DISTINCT=28, ELSE=29,
|
||||||
EXISTS=30, EXPLAIN=31, EXTRACT=32, FALSE=33, FIRST=34, FORMAT=35, FROM=36,
|
END=30, ESCAPE=31, EXECUTABLE=32, EXISTS=33, EXPLAIN=34, EXTRACT=35, FALSE=36,
|
||||||
FULL=37, FUNCTIONS=38, GRAPHVIZ=39, GROUP=40, HAVING=41, HOUR=42, HOURS=43,
|
FIRST=37, FORMAT=38, FROM=39, FULL=40, FUNCTIONS=41, GRAPHVIZ=42, GROUP=43,
|
||||||
IN=44, INNER=45, INTERVAL=46, IS=47, JOIN=48, LAST=49, LEFT=50, LIKE=51,
|
HAVING=44, HOUR=45, HOURS=46, IN=47, INNER=48, INTERVAL=49, IS=50, JOIN=51,
|
||||||
LIMIT=52, MAPPED=53, MATCH=54, MINUTE=55, MINUTES=56, MONTH=57, MONTHS=58,
|
LAST=52, LEFT=53, LIKE=54, LIMIT=55, MAPPED=56, MATCH=57, MINUTE=58, MINUTES=59,
|
||||||
NATURAL=59, NOT=60, NULL=61, NULLS=62, ON=63, OPTIMIZED=64, OR=65, ORDER=66,
|
MONTH=60, MONTHS=61, NATURAL=62, NOT=63, NULL=64, NULLS=65, ON=66, OPTIMIZED=67,
|
||||||
OUTER=67, PARSED=68, PHYSICAL=69, PLAN=70, RIGHT=71, RLIKE=72, QUERY=73,
|
OR=68, ORDER=69, OUTER=70, PARSED=71, PHYSICAL=72, PLAN=73, RIGHT=74,
|
||||||
SCHEMAS=74, SECOND=75, SECONDS=76, SELECT=77, SHOW=78, SYS=79, TABLE=80,
|
RLIKE=75, QUERY=76, SCHEMAS=77, SECOND=78, SECONDS=79, SELECT=80, SHOW=81,
|
||||||
TABLES=81, TEXT=82, TRUE=83, TO=84, TYPE=85, TYPES=86, USING=87, VERIFY=88,
|
SYS=82, TABLE=83, TABLES=84, TEXT=85, THEN=86, TRUE=87, TO=88, TYPE=89,
|
||||||
WHERE=89, WITH=90, YEAR=91, YEARS=92, ESCAPE_ESC=93, FUNCTION_ESC=94,
|
TYPES=90, USING=91, VERIFY=92, WHEN=93, WHERE=94, WITH=95, YEAR=96, YEARS=97,
|
||||||
LIMIT_ESC=95, DATE_ESC=96, TIME_ESC=97, TIMESTAMP_ESC=98, GUID_ESC=99,
|
ESCAPE_ESC=98, FUNCTION_ESC=99, LIMIT_ESC=100, DATE_ESC=101, TIME_ESC=102,
|
||||||
ESC_END=100, EQ=101, NULLEQ=102, NEQ=103, LT=104, LTE=105, GT=106, GTE=107,
|
TIMESTAMP_ESC=103, GUID_ESC=104, ESC_END=105, EQ=106, NULLEQ=107, NEQ=108,
|
||||||
PLUS=108, MINUS=109, ASTERISK=110, SLASH=111, PERCENT=112, CAST_OP=113,
|
LT=109, LTE=110, GT=111, GTE=112, PLUS=113, MINUS=114, ASTERISK=115, SLASH=116,
|
||||||
CONCAT=114, DOT=115, PARAM=116, STRING=117, INTEGER_VALUE=118, DECIMAL_VALUE=119,
|
PERCENT=117, CAST_OP=118, CONCAT=119, DOT=120, PARAM=121, STRING=122,
|
||||||
IDENTIFIER=120, DIGIT_IDENTIFIER=121, TABLE_IDENTIFIER=122, QUOTED_IDENTIFIER=123,
|
INTEGER_VALUE=123, DECIMAL_VALUE=124, IDENTIFIER=125, DIGIT_IDENTIFIER=126,
|
||||||
BACKQUOTED_IDENTIFIER=124, SIMPLE_COMMENT=125, BRACKETED_COMMENT=126,
|
TABLE_IDENTIFIER=127, QUOTED_IDENTIFIER=128, BACKQUOTED_IDENTIFIER=129,
|
||||||
WS=127, UNRECOGNIZED=128;
|
SIMPLE_COMMENT=130, BRACKETED_COMMENT=131, WS=132, UNRECOGNIZED=133;
|
||||||
public static String[] modeNames = {
|
public static String[] modeNames = {
|
||||||
"DEFAULT_MODE"
|
"DEFAULT_MODE"
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final String[] ruleNames = {
|
public static final String[] ruleNames = {
|
||||||
"T__0", "T__1", "T__2", "T__3", "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
|
"T__0", "T__1", "T__2", "T__3", "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
|
||||||
"AS", "ASC", "BETWEEN", "BY", "CAST", "CATALOG", "CATALOGS", "COLUMNS",
|
"AS", "ASC", "BETWEEN", "BY", "CASE", "CAST", "CATALOG", "CATALOGS", "COLUMNS",
|
||||||
"CONVERT", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "DAY",
|
"CONVERT", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "DAY",
|
||||||
"DAYS", "DEBUG", "DESC", "DESCRIBE", "DISTINCT", "ESCAPE", "EXECUTABLE",
|
"DAYS", "DEBUG", "DESC", "DESCRIBE", "DISTINCT", "ELSE", "END", "ESCAPE",
|
||||||
"EXISTS", "EXPLAIN", "EXTRACT", "FALSE", "FIRST", "FORMAT", "FROM", "FULL",
|
"EXECUTABLE", "EXISTS", "EXPLAIN", "EXTRACT", "FALSE", "FIRST", "FORMAT",
|
||||||
"FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING", "HOUR", "HOURS", "IN", "INNER",
|
"FROM", "FULL", "FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING", "HOUR", "HOURS",
|
||||||
"INTERVAL", "IS", "JOIN", "LAST", "LEFT", "LIKE", "LIMIT", "MAPPED", "MATCH",
|
"IN", "INNER", "INTERVAL", "IS", "JOIN", "LAST", "LEFT", "LIKE", "LIMIT",
|
||||||
"MINUTE", "MINUTES", "MONTH", "MONTHS", "NATURAL", "NOT", "NULL", "NULLS",
|
"MAPPED", "MATCH", "MINUTE", "MINUTES", "MONTH", "MONTHS", "NATURAL",
|
||||||
"ON", "OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED", "PHYSICAL", "PLAN",
|
"NOT", "NULL", "NULLS", "ON", "OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED",
|
||||||
"RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SECOND", "SECONDS", "SELECT", "SHOW",
|
"PHYSICAL", "PLAN", "RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SECOND", "SECONDS",
|
||||||
"SYS", "TABLE", "TABLES", "TEXT", "TRUE", "TO", "TYPE", "TYPES", "USING",
|
"SELECT", "SHOW", "SYS", "TABLE", "TABLES", "TEXT", "THEN", "TRUE", "TO",
|
||||||
"VERIFY", "WHERE", "WITH", "YEAR", "YEARS", "ESCAPE_ESC", "FUNCTION_ESC",
|
"TYPE", "TYPES", "USING", "VERIFY", "WHEN", "WHERE", "WITH", "YEAR", "YEARS",
|
||||||
"LIMIT_ESC", "DATE_ESC", "TIME_ESC", "TIMESTAMP_ESC", "GUID_ESC", "ESC_END",
|
"ESCAPE_ESC", "FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC", "TIME_ESC", "TIMESTAMP_ESC",
|
||||||
"EQ", "NULLEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK",
|
"GUID_ESC", "ESC_END", "EQ", "NULLEQ", "NEQ", "LT", "LTE", "GT", "GTE",
|
||||||
"SLASH", "PERCENT", "CAST_OP", "CONCAT", "DOT", "PARAM", "STRING", "INTEGER_VALUE",
|
"PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CAST_OP", "CONCAT",
|
||||||
"DECIMAL_VALUE", "IDENTIFIER", "DIGIT_IDENTIFIER", "TABLE_IDENTIFIER",
|
"DOT", "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE", "IDENTIFIER",
|
||||||
"QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER", "EXPONENT", "DIGIT", "LETTER",
|
"DIGIT_IDENTIFIER", "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER",
|
||||||
"SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS", "UNRECOGNIZED"
|
"EXPONENT", "DIGIT", "LETTER", "SIMPLE_COMMENT", "BRACKETED_COMMENT",
|
||||||
|
"WS", "UNRECOGNIZED"
|
||||||
};
|
};
|
||||||
|
|
||||||
private static final String[] _LITERAL_NAMES = {
|
private static final String[] _LITERAL_NAMES = {
|
||||||
null, "'('", "')'", "','", "':'", "'ALL'", "'ANALYZE'", "'ANALYZED'",
|
null, "'('", "')'", "','", "':'", "'ALL'", "'ANALYZE'", "'ANALYZED'",
|
||||||
"'AND'", "'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CAST'", "'CATALOG'",
|
"'AND'", "'ANY'", "'AS'", "'ASC'", "'BETWEEN'", "'BY'", "'CASE'", "'CAST'",
|
||||||
"'CATALOGS'", "'COLUMNS'", "'CONVERT'", "'CURRENT_DATE'", "'CURRENT_TIME'",
|
"'CATALOG'", "'CATALOGS'", "'COLUMNS'", "'CONVERT'", "'CURRENT_DATE'",
|
||||||
"'CURRENT_TIMESTAMP'", "'DAY'", "'DAYS'", "'DEBUG'", "'DESC'", "'DESCRIBE'",
|
"'CURRENT_TIME'", "'CURRENT_TIMESTAMP'", "'DAY'", "'DAYS'", "'DEBUG'",
|
||||||
"'DISTINCT'", "'ESCAPE'", "'EXECUTABLE'", "'EXISTS'", "'EXPLAIN'", "'EXTRACT'",
|
"'DESC'", "'DESCRIBE'", "'DISTINCT'", "'ELSE'", "'END'", "'ESCAPE'", "'EXECUTABLE'",
|
||||||
"'FALSE'", "'FIRST'", "'FORMAT'", "'FROM'", "'FULL'", "'FUNCTIONS'", "'GRAPHVIZ'",
|
"'EXISTS'", "'EXPLAIN'", "'EXTRACT'", "'FALSE'", "'FIRST'", "'FORMAT'",
|
||||||
"'GROUP'", "'HAVING'", "'HOUR'", "'HOURS'", "'IN'", "'INNER'", "'INTERVAL'",
|
"'FROM'", "'FULL'", "'FUNCTIONS'", "'GRAPHVIZ'", "'GROUP'", "'HAVING'",
|
||||||
"'IS'", "'JOIN'", "'LAST'", "'LEFT'", "'LIKE'", "'LIMIT'", "'MAPPED'",
|
"'HOUR'", "'HOURS'", "'IN'", "'INNER'", "'INTERVAL'", "'IS'", "'JOIN'",
|
||||||
"'MATCH'", "'MINUTE'", "'MINUTES'", "'MONTH'", "'MONTHS'", "'NATURAL'",
|
"'LAST'", "'LEFT'", "'LIKE'", "'LIMIT'", "'MAPPED'", "'MATCH'", "'MINUTE'",
|
||||||
"'NOT'", "'NULL'", "'NULLS'", "'ON'", "'OPTIMIZED'", "'OR'", "'ORDER'",
|
"'MINUTES'", "'MONTH'", "'MONTHS'", "'NATURAL'", "'NOT'", "'NULL'", "'NULLS'",
|
||||||
"'OUTER'", "'PARSED'", "'PHYSICAL'", "'PLAN'", "'RIGHT'", "'RLIKE'", "'QUERY'",
|
"'ON'", "'OPTIMIZED'", "'OR'", "'ORDER'", "'OUTER'", "'PARSED'", "'PHYSICAL'",
|
||||||
"'SCHEMAS'", "'SECOND'", "'SECONDS'", "'SELECT'", "'SHOW'", "'SYS'", "'TABLE'",
|
"'PLAN'", "'RIGHT'", "'RLIKE'", "'QUERY'", "'SCHEMAS'", "'SECOND'", "'SECONDS'",
|
||||||
"'TABLES'", "'TEXT'", "'TRUE'", "'TO'", "'TYPE'", "'TYPES'", "'USING'",
|
"'SELECT'", "'SHOW'", "'SYS'", "'TABLE'", "'TABLES'", "'TEXT'", "'THEN'",
|
||||||
"'VERIFY'", "'WHERE'", "'WITH'", "'YEAR'", "'YEARS'", "'{ESCAPE'", "'{FN'",
|
"'TRUE'", "'TO'", "'TYPE'", "'TYPES'", "'USING'", "'VERIFY'", "'WHEN'",
|
||||||
"'{LIMIT'", "'{D'", "'{T'", "'{TS'", "'{GUID'", "'}'", "'='", "'<=>'",
|
"'WHERE'", "'WITH'", "'YEAR'", "'YEARS'", "'{ESCAPE'", "'{FN'", "'{LIMIT'",
|
||||||
null, "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'",
|
"'{D'", "'{T'", "'{TS'", "'{GUID'", "'}'", "'='", "'<=>'", null, "'<'",
|
||||||
"'::'", "'||'", "'.'", "'?'"
|
"'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", "'::'", "'||'",
|
||||||
|
"'.'", "'?'"
|
||||||
};
|
};
|
||||||
private static final String[] _SYMBOLIC_NAMES = {
|
private static final String[] _SYMBOLIC_NAMES = {
|
||||||
null, null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
|
null, null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
|
||||||
"AS", "ASC", "BETWEEN", "BY", "CAST", "CATALOG", "CATALOGS", "COLUMNS",
|
"AS", "ASC", "BETWEEN", "BY", "CASE", "CAST", "CATALOG", "CATALOGS", "COLUMNS",
|
||||||
"CONVERT", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "DAY",
|
"CONVERT", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "DAY",
|
||||||
"DAYS", "DEBUG", "DESC", "DESCRIBE", "DISTINCT", "ESCAPE", "EXECUTABLE",
|
"DAYS", "DEBUG", "DESC", "DESCRIBE", "DISTINCT", "ELSE", "END", "ESCAPE",
|
||||||
"EXISTS", "EXPLAIN", "EXTRACT", "FALSE", "FIRST", "FORMAT", "FROM", "FULL",
|
"EXECUTABLE", "EXISTS", "EXPLAIN", "EXTRACT", "FALSE", "FIRST", "FORMAT",
|
||||||
"FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING", "HOUR", "HOURS", "IN", "INNER",
|
"FROM", "FULL", "FUNCTIONS", "GRAPHVIZ", "GROUP", "HAVING", "HOUR", "HOURS",
|
||||||
"INTERVAL", "IS", "JOIN", "LAST", "LEFT", "LIKE", "LIMIT", "MAPPED", "MATCH",
|
"IN", "INNER", "INTERVAL", "IS", "JOIN", "LAST", "LEFT", "LIKE", "LIMIT",
|
||||||
"MINUTE", "MINUTES", "MONTH", "MONTHS", "NATURAL", "NOT", "NULL", "NULLS",
|
"MAPPED", "MATCH", "MINUTE", "MINUTES", "MONTH", "MONTHS", "NATURAL",
|
||||||
"ON", "OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED", "PHYSICAL", "PLAN",
|
"NOT", "NULL", "NULLS", "ON", "OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED",
|
||||||
"RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SECOND", "SECONDS", "SELECT", "SHOW",
|
"PHYSICAL", "PLAN", "RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SECOND", "SECONDS",
|
||||||
"SYS", "TABLE", "TABLES", "TEXT", "TRUE", "TO", "TYPE", "TYPES", "USING",
|
"SELECT", "SHOW", "SYS", "TABLE", "TABLES", "TEXT", "THEN", "TRUE", "TO",
|
||||||
"VERIFY", "WHERE", "WITH", "YEAR", "YEARS", "ESCAPE_ESC", "FUNCTION_ESC",
|
"TYPE", "TYPES", "USING", "VERIFY", "WHEN", "WHERE", "WITH", "YEAR", "YEARS",
|
||||||
"LIMIT_ESC", "DATE_ESC", "TIME_ESC", "TIMESTAMP_ESC", "GUID_ESC", "ESC_END",
|
"ESCAPE_ESC", "FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC", "TIME_ESC", "TIMESTAMP_ESC",
|
||||||
"EQ", "NULLEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK",
|
"GUID_ESC", "ESC_END", "EQ", "NULLEQ", "NEQ", "LT", "LTE", "GT", "GTE",
|
||||||
"SLASH", "PERCENT", "CAST_OP", "CONCAT", "DOT", "PARAM", "STRING", "INTEGER_VALUE",
|
"PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CAST_OP", "CONCAT",
|
||||||
"DECIMAL_VALUE", "IDENTIFIER", "DIGIT_IDENTIFIER", "TABLE_IDENTIFIER",
|
"DOT", "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE", "IDENTIFIER",
|
||||||
"QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER", "SIMPLE_COMMENT", "BRACKETED_COMMENT",
|
"DIGIT_IDENTIFIER", "TABLE_IDENTIFIER", "QUOTED_IDENTIFIER", "BACKQUOTED_IDENTIFIER",
|
||||||
"WS", "UNRECOGNIZED"
|
"SIMPLE_COMMENT", "BRACKETED_COMMENT", "WS", "UNRECOGNIZED"
|
||||||
};
|
};
|
||||||
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
|
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
|
||||||
|
|
||||||
|
@ -156,7 +161,7 @@ class SqlBaseLexer extends Lexer {
|
||||||
public ATN getATN() { return _ATN; }
|
public ATN getATN() { return _ATN; }
|
||||||
|
|
||||||
public static final String _serializedATN =
|
public static final String _serializedATN =
|
||||||
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2\u0082\u043c\b\1\4"+
|
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2\u0087\u045e\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"+
|
"\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"+
|
"\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\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"+
|
||||||
|
@ -171,55 +176,60 @@ class SqlBaseLexer extends Lexer {
|
||||||
"\tk\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv"+
|
"\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\177\t\177\4\u0080\t"+
|
"\4w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t"+
|
||||||
"\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084"+
|
"\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084"+
|
||||||
"\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"+
|
"\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089"+
|
||||||
"\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"+
|
"\t\u0089\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"+
|
||||||
"\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"+
|
"\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"+
|
||||||
"\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"+
|
"\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"+
|
||||||
"\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\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"+
|
||||||
"\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3"+
|
"\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"+
|
||||||
"\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3"+
|
"\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\24\3\24"+
|
||||||
"\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3"+
|
"\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"+
|
||||||
"\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3"+
|
"\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"+
|
||||||
"\26\3\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3"+
|
"\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"+
|
||||||
"\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3"+
|
"\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\31\3\31"+
|
||||||
"\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3"+
|
"\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"+
|
||||||
"\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"+
|
"\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35"+
|
||||||
"\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3"+
|
"\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 \3"+
|
||||||
"!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3$\3"+
|
" \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\""+
|
||||||
"$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'"+
|
"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3"+
|
||||||
"\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3*\3*\3"+
|
"%\3%\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3)\3"+
|
||||||
"*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3-\3-\3-\3.\3.\3.\3.\3"+
|
")\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\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,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3"+
|
||||||
"\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64"+
|
"/\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\64\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\66"+
|
"\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\65\3\65"+
|
||||||
"\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\39\39\39\39\39\39"+
|
"\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\38\3"+
|
||||||
"\39\39\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3<"+
|
"8\38\38\38\38\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3;\3;\3;\3;\3;\3"+
|
||||||
"\3=\3=\3=\3=\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3@\3@\3@\3A\3A\3A\3A\3A"+
|
";\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\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3E\3E\3E"+
|
"?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3"+
|
||||||
"\3E\3E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H"+
|
"C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3F\3F\3F\3F\3F\3F\3G\3"+
|
||||||
"\3H\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L"+
|
"G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3"+
|
||||||
"\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O"+
|
"J\3J\3J\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3N\3N\3"+
|
||||||
"\3O\3O\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S"+
|
"N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3"+
|
||||||
"\3S\3T\3T\3T\3T\3T\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3X\3X\3X"+
|
"Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3U\3U\3U\3"+
|
||||||
"\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3\\\3"+
|
"U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Z\3"+
|
||||||
"\\\3\\\3\\\3\\\3]\3]\3]\3]\3]\3]\3^\3^\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3"+
|
"Z\3Z\3Z\3Z\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\3b\3b\3b\3c\3c\3c\3c\3d\3d\3d\3d\3d\3d\3"+
|
"]\3]\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3a\3a\3a\3a\3a\3"+
|
||||||
"e\3e\3f\3f\3g\3g\3g\3g\3h\3h\3h\3h\5h\u037a\nh\3i\3i\3j\3j\3j\3k\3k\3"+
|
"b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3c\3c\3d\3d\3d\3d\3e\3e\3e\3e\3e\3"+
|
||||||
"l\3l\3l\3m\3m\3n\3n\3o\3o\3p\3p\3q\3q\3r\3r\3r\3s\3s\3s\3t\3t\3u\3u\3"+
|
"e\3e\3f\3f\3f\3g\3g\3g\3h\3h\3h\3h\3i\3i\3i\3i\3i\3i\3j\3j\3k\3k\3l\3"+
|
||||||
"v\3v\3v\3v\7v\u039e\nv\fv\16v\u03a1\13v\3v\3v\3w\6w\u03a6\nw\rw\16w\u03a7"+
|
"l\3l\3l\3m\3m\3m\3m\5m\u039c\nm\3n\3n\3o\3o\3o\3p\3p\3q\3q\3q\3r\3r\3"+
|
||||||
"\3x\6x\u03ab\nx\rx\16x\u03ac\3x\3x\7x\u03b1\nx\fx\16x\u03b4\13x\3x\3x"+
|
"s\3s\3t\3t\3u\3u\3v\3v\3w\3w\3w\3x\3x\3x\3y\3y\3z\3z\3{\3{\3{\3{\7{\u03c0"+
|
||||||
"\6x\u03b8\nx\rx\16x\u03b9\3x\6x\u03bd\nx\rx\16x\u03be\3x\3x\7x\u03c3\n"+
|
"\n{\f{\16{\u03c3\13{\3{\3{\3|\6|\u03c8\n|\r|\16|\u03c9\3}\6}\u03cd\n}"+
|
||||||
"x\fx\16x\u03c6\13x\5x\u03c8\nx\3x\3x\3x\3x\6x\u03ce\nx\rx\16x\u03cf\3"+
|
"\r}\16}\u03ce\3}\3}\7}\u03d3\n}\f}\16}\u03d6\13}\3}\3}\6}\u03da\n}\r}"+
|
||||||
"x\3x\5x\u03d4\nx\3y\3y\5y\u03d8\ny\3y\3y\3y\7y\u03dd\ny\fy\16y\u03e0\13"+
|
"\16}\u03db\3}\6}\u03df\n}\r}\16}\u03e0\3}\3}\7}\u03e5\n}\f}\16}\u03e8"+
|
||||||
"y\3z\3z\3z\3z\6z\u03e6\nz\rz\16z\u03e7\3{\3{\3{\6{\u03ed\n{\r{\16{\u03ee"+
|
"\13}\5}\u03ea\n}\3}\3}\3}\3}\6}\u03f0\n}\r}\16}\u03f1\3}\3}\5}\u03f6\n"+
|
||||||
"\3|\3|\3|\3|\7|\u03f5\n|\f|\16|\u03f8\13|\3|\3|\3}\3}\3}\3}\7}\u0400\n"+
|
"}\3~\3~\5~\u03fa\n~\3~\3~\3~\7~\u03ff\n~\f~\16~\u0402\13~\3\177\3\177"+
|
||||||
"}\f}\16}\u0403\13}\3}\3}\3~\3~\5~\u0409\n~\3~\6~\u040c\n~\r~\16~\u040d"+
|
"\3\177\3\177\6\177\u0408\n\177\r\177\16\177\u0409\3\u0080\3\u0080\3\u0080"+
|
||||||
"\3\177\3\177\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0081\7\u0081\u0418"+
|
"\6\u0080\u040f\n\u0080\r\u0080\16\u0080\u0410\3\u0081\3\u0081\3\u0081"+
|
||||||
"\n\u0081\f\u0081\16\u0081\u041b\13\u0081\3\u0081\5\u0081\u041e\n\u0081"+
|
"\3\u0081\7\u0081\u0417\n\u0081\f\u0081\16\u0081\u041a\13\u0081\3\u0081"+
|
||||||
"\3\u0081\5\u0081\u0421\n\u0081\3\u0081\3\u0081\3\u0082\3\u0082\3\u0082"+
|
"\3\u0081\3\u0082\3\u0082\3\u0082\3\u0082\7\u0082\u0422\n\u0082\f\u0082"+
|
||||||
"\3\u0082\3\u0082\7\u0082\u042a\n\u0082\f\u0082\16\u0082\u042d\13\u0082"+
|
"\16\u0082\u0425\13\u0082\3\u0082\3\u0082\3\u0083\3\u0083\5\u0083\u042b"+
|
||||||
"\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0083\6\u0083\u0435\n\u0083"+
|
"\n\u0083\3\u0083\6\u0083\u042e\n\u0083\r\u0083\16\u0083\u042f\3\u0084"+
|
||||||
"\r\u0083\16\u0083\u0436\3\u0083\3\u0083\3\u0084\3\u0084\3\u042b\2\u0085"+
|
"\3\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\3\u0086\7\u0086\u043a"+
|
||||||
|
"\n\u0086\f\u0086\16\u0086\u043d\13\u0086\3\u0086\5\u0086\u0440\n\u0086"+
|
||||||
|
"\3\u0086\5\u0086\u0443\n\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087"+
|
||||||
|
"\3\u0087\3\u0087\7\u0087\u044c\n\u0087\f\u0087\16\u0087\u044f\13\u0087"+
|
||||||
|
"\3\u0087\3\u0087\3\u0087\3\u0087\3\u0087\3\u0088\6\u0088\u0457\n\u0088"+
|
||||||
|
"\r\u0088\16\u0088\u0458\3\u0088\3\u0088\3\u0089\3\u0089\3\u044d\2\u008a"+
|
||||||
"\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"+
|
"\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"+
|
"\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37"+
|
||||||
"= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o"+
|
"= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o"+
|
||||||
|
@ -229,302 +239,313 @@ class SqlBaseLexer extends Lexer {
|
||||||
"\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9"+
|
"\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9"+
|
||||||
"f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00dd"+
|
"f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00dd"+
|
||||||
"p\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00edx\u00efy\u00f1"+
|
"p\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00edx\u00efy\u00f1"+
|
||||||
"z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb\2\u00fd\2\u00ff\2\u0101\177\u0103"+
|
"z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb\177\u00fd\u0080\u00ff\u0081\u0101"+
|
||||||
"\u0080\u0105\u0081\u0107\u0082\3\2\13\3\2))\4\2BBaa\3\2$$\3\2bb\4\2--"+
|
"\u0082\u0103\u0083\u0105\2\u0107\2\u0109\2\u010b\u0084\u010d\u0085\u010f"+
|
||||||
"//\3\2\62;\3\2C\\\4\2\f\f\17\17\5\2\13\f\17\17\"\"\u045c\2\3\3\2\2\2\2"+
|
"\u0086\u0111\u0087\3\2\13\3\2))\4\2BBaa\3\2$$\3\2bb\4\2--//\3\2\62;\3"+
|
||||||
"\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"+
|
"\2C\\\4\2\f\f\17\17\5\2\13\f\17\17\"\"\u047e\2\3\3\2\2\2\2\5\3\2\2\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"+
|
"\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"+
|
||||||
"\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\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\'\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\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\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\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?\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\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"+
|
||||||
"K\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\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\2"+
|
||||||
"\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"+
|
"M\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\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\2"+
|
"\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"+
|
||||||
"q\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\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\2"+
|
||||||
"\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"+
|
"s\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"+
|
||||||
"\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\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2"+
|
||||||
"\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\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"+
|
||||||
"\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\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2"+
|
||||||
"\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\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"+
|
||||||
"\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\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2"+
|
||||||
"\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\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"+
|
||||||
"\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\2\u00c5"+
|
"\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2"+
|
||||||
"\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2"+
|
"\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7"+
|
||||||
"\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7"+
|
"\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2"+
|
||||||
"\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2"+
|
"\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9"+
|
||||||
"\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9"+
|
"\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2"+
|
||||||
"\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2"+
|
"\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb"+
|
||||||
"\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2\2\2\u0101"+
|
"\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2"+
|
||||||
"\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\3\u0109\3\2\2"+
|
"\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd"+
|
||||||
"\2\5\u010b\3\2\2\2\7\u010d\3\2\2\2\t\u010f\3\2\2\2\13\u0111\3\2\2\2\r"+
|
"\3\2\2\2\2\u00ff\3\2\2\2\2\u0101\3\2\2\2\2\u0103\3\2\2\2\2\u010b\3\2\2"+
|
||||||
"\u0115\3\2\2\2\17\u011d\3\2\2\2\21\u0126\3\2\2\2\23\u012a\3\2\2\2\25\u012e"+
|
"\2\2\u010d\3\2\2\2\2\u010f\3\2\2\2\2\u0111\3\2\2\2\3\u0113\3\2\2\2\5\u0115"+
|
||||||
"\3\2\2\2\27\u0131\3\2\2\2\31\u0135\3\2\2\2\33\u013d\3\2\2\2\35\u0140\3"+
|
"\3\2\2\2\7\u0117\3\2\2\2\t\u0119\3\2\2\2\13\u011b\3\2\2\2\r\u011f\3\2"+
|
||||||
"\2\2\2\37\u0145\3\2\2\2!\u014d\3\2\2\2#\u0156\3\2\2\2%\u015e\3\2\2\2\'"+
|
"\2\2\17\u0127\3\2\2\2\21\u0130\3\2\2\2\23\u0134\3\2\2\2\25\u0138\3\2\2"+
|
||||||
"\u0166\3\2\2\2)\u0173\3\2\2\2+\u0180\3\2\2\2-\u0192\3\2\2\2/\u0196\3\2"+
|
"\2\27\u013b\3\2\2\2\31\u013f\3\2\2\2\33\u0147\3\2\2\2\35\u014a\3\2\2\2"+
|
||||||
"\2\2\61\u019b\3\2\2\2\63\u01a1\3\2\2\2\65\u01a6\3\2\2\2\67\u01af\3\2\2"+
|
"\37\u014f\3\2\2\2!\u0154\3\2\2\2#\u015c\3\2\2\2%\u0165\3\2\2\2\'\u016d"+
|
||||||
"\29\u01b8\3\2\2\2;\u01bf\3\2\2\2=\u01ca\3\2\2\2?\u01d1\3\2\2\2A\u01d9"+
|
"\3\2\2\2)\u0175\3\2\2\2+\u0182\3\2\2\2-\u018f\3\2\2\2/\u01a1\3\2\2\2\61"+
|
||||||
"\3\2\2\2C\u01e1\3\2\2\2E\u01e7\3\2\2\2G\u01ed\3\2\2\2I\u01f4\3\2\2\2K"+
|
"\u01a5\3\2\2\2\63\u01aa\3\2\2\2\65\u01b0\3\2\2\2\67\u01b5\3\2\2\29\u01be"+
|
||||||
"\u01f9\3\2\2\2M\u01fe\3\2\2\2O\u0208\3\2\2\2Q\u0211\3\2\2\2S\u0217\3\2"+
|
"\3\2\2\2;\u01c7\3\2\2\2=\u01cc\3\2\2\2?\u01d0\3\2\2\2A\u01d7\3\2\2\2C"+
|
||||||
"\2\2U\u021e\3\2\2\2W\u0223\3\2\2\2Y\u0229\3\2\2\2[\u022c\3\2\2\2]\u0232"+
|
"\u01e2\3\2\2\2E\u01e9\3\2\2\2G\u01f1\3\2\2\2I\u01f9\3\2\2\2K\u01ff\3\2"+
|
||||||
"\3\2\2\2_\u023b\3\2\2\2a\u023e\3\2\2\2c\u0243\3\2\2\2e\u0248\3\2\2\2g"+
|
"\2\2M\u0205\3\2\2\2O\u020c\3\2\2\2Q\u0211\3\2\2\2S\u0216\3\2\2\2U\u0220"+
|
||||||
"\u024d\3\2\2\2i\u0252\3\2\2\2k\u0258\3\2\2\2m\u025f\3\2\2\2o\u0265\3\2"+
|
"\3\2\2\2W\u0229\3\2\2\2Y\u022f\3\2\2\2[\u0236\3\2\2\2]\u023b\3\2\2\2_"+
|
||||||
"\2\2q\u026c\3\2\2\2s\u0274\3\2\2\2u\u027a\3\2\2\2w\u0281\3\2\2\2y\u0289"+
|
"\u0241\3\2\2\2a\u0244\3\2\2\2c\u024a\3\2\2\2e\u0253\3\2\2\2g\u0256\3\2"+
|
||||||
"\3\2\2\2{\u028d\3\2\2\2}\u0292\3\2\2\2\177\u0298\3\2\2\2\u0081\u029b\3"+
|
"\2\2i\u025b\3\2\2\2k\u0260\3\2\2\2m\u0265\3\2\2\2o\u026a\3\2\2\2q\u0270"+
|
||||||
"\2\2\2\u0083\u02a5\3\2\2\2\u0085\u02a8\3\2\2\2\u0087\u02ae\3\2\2\2\u0089"+
|
"\3\2\2\2s\u0277\3\2\2\2u\u027d\3\2\2\2w\u0284\3\2\2\2y\u028c\3\2\2\2{"+
|
||||||
"\u02b4\3\2\2\2\u008b\u02bb\3\2\2\2\u008d\u02c4\3\2\2\2\u008f\u02c9\3\2"+
|
"\u0292\3\2\2\2}\u0299\3\2\2\2\177\u02a1\3\2\2\2\u0081\u02a5\3\2\2\2\u0083"+
|
||||||
"\2\2\u0091\u02cf\3\2\2\2\u0093\u02d5\3\2\2\2\u0095\u02db\3\2\2\2\u0097"+
|
"\u02aa\3\2\2\2\u0085\u02b0\3\2\2\2\u0087\u02b3\3\2\2\2\u0089\u02bd\3\2"+
|
||||||
"\u02e3\3\2\2\2\u0099\u02ea\3\2\2\2\u009b\u02f2\3\2\2\2\u009d\u02f9\3\2"+
|
"\2\2\u008b\u02c0\3\2\2\2\u008d\u02c6\3\2\2\2\u008f\u02cc\3\2\2\2\u0091"+
|
||||||
"\2\2\u009f\u02fe\3\2\2\2\u00a1\u0302\3\2\2\2\u00a3\u0308\3\2\2\2\u00a5"+
|
"\u02d3\3\2\2\2\u0093\u02dc\3\2\2\2\u0095\u02e1\3\2\2\2\u0097\u02e7\3\2"+
|
||||||
"\u030f\3\2\2\2\u00a7\u0314\3\2\2\2\u00a9\u0319\3\2\2\2\u00ab\u031c\3\2"+
|
"\2\2\u0099\u02ed\3\2\2\2\u009b\u02f3\3\2\2\2\u009d\u02fb\3\2\2\2\u009f"+
|
||||||
"\2\2\u00ad\u0321\3\2\2\2\u00af\u0327\3\2\2\2\u00b1\u032d\3\2\2\2\u00b3"+
|
"\u0302\3\2\2\2\u00a1\u030a\3\2\2\2\u00a3\u0311\3\2\2\2\u00a5\u0316\3\2"+
|
||||||
"\u0334\3\2\2\2\u00b5\u033a\3\2\2\2\u00b7\u033f\3\2\2\2\u00b9\u0344\3\2"+
|
"\2\2\u00a7\u031a\3\2\2\2\u00a9\u0320\3\2\2\2\u00ab\u0327\3\2\2\2\u00ad"+
|
||||||
"\2\2\u00bb\u034a\3\2\2\2\u00bd\u0352\3\2\2\2\u00bf\u0356\3\2\2\2\u00c1"+
|
"\u032c\3\2\2\2\u00af\u0331\3\2\2\2\u00b1\u0336\3\2\2\2\u00b3\u0339\3\2"+
|
||||||
"\u035d\3\2\2\2\u00c3\u0360\3\2\2\2\u00c5\u0363\3\2\2\2\u00c7\u0367\3\2"+
|
"\2\2\u00b5\u033e\3\2\2\2\u00b7\u0344\3\2\2\2\u00b9\u034a\3\2\2\2\u00bb"+
|
||||||
"\2\2\u00c9\u036d\3\2\2\2\u00cb\u036f\3\2\2\2\u00cd\u0371\3\2\2\2\u00cf"+
|
"\u0351\3\2\2\2\u00bd\u0356\3\2\2\2\u00bf\u035c\3\2\2\2\u00c1\u0361\3\2"+
|
||||||
"\u0379\3\2\2\2\u00d1\u037b\3\2\2\2\u00d3\u037d\3\2\2\2\u00d5\u0380\3\2"+
|
"\2\2\u00c3\u0366\3\2\2\2\u00c5\u036c\3\2\2\2\u00c7\u0374\3\2\2\2\u00c9"+
|
||||||
"\2\2\u00d7\u0382\3\2\2\2\u00d9\u0385\3\2\2\2\u00db\u0387\3\2\2\2\u00dd"+
|
"\u0378\3\2\2\2\u00cb\u037f\3\2\2\2\u00cd\u0382\3\2\2\2\u00cf\u0385\3\2"+
|
||||||
"\u0389\3\2\2\2\u00df\u038b\3\2\2\2\u00e1\u038d\3\2\2\2\u00e3\u038f\3\2"+
|
"\2\2\u00d1\u0389\3\2\2\2\u00d3\u038f\3\2\2\2\u00d5\u0391\3\2\2\2\u00d7"+
|
||||||
"\2\2\u00e5\u0392\3\2\2\2\u00e7\u0395\3\2\2\2\u00e9\u0397\3\2\2\2\u00eb"+
|
"\u0393\3\2\2\2\u00d9\u039b\3\2\2\2\u00db\u039d\3\2\2\2\u00dd\u039f\3\2"+
|
||||||
"\u0399\3\2\2\2\u00ed\u03a5\3\2\2\2\u00ef\u03d3\3\2\2\2\u00f1\u03d7\3\2"+
|
"\2\2\u00df\u03a2\3\2\2\2\u00e1\u03a4\3\2\2\2\u00e3\u03a7\3\2\2\2\u00e5"+
|
||||||
"\2\2\u00f3\u03e1\3\2\2\2\u00f5\u03ec\3\2\2\2\u00f7\u03f0\3\2\2\2\u00f9"+
|
"\u03a9\3\2\2\2\u00e7\u03ab\3\2\2\2\u00e9\u03ad\3\2\2\2\u00eb\u03af\3\2"+
|
||||||
"\u03fb\3\2\2\2\u00fb\u0406\3\2\2\2\u00fd\u040f\3\2\2\2\u00ff\u0411\3\2"+
|
"\2\2\u00ed\u03b1\3\2\2\2\u00ef\u03b4\3\2\2\2\u00f1\u03b7\3\2\2\2\u00f3"+
|
||||||
"\2\2\u0101\u0413\3\2\2\2\u0103\u0424\3\2\2\2\u0105\u0434\3\2\2\2\u0107"+
|
"\u03b9\3\2\2\2\u00f5\u03bb\3\2\2\2\u00f7\u03c7\3\2\2\2\u00f9\u03f5\3\2"+
|
||||||
"\u043a\3\2\2\2\u0109\u010a\7*\2\2\u010a\4\3\2\2\2\u010b\u010c\7+\2\2\u010c"+
|
"\2\2\u00fb\u03f9\3\2\2\2\u00fd\u0403\3\2\2\2\u00ff\u040e\3\2\2\2\u0101"+
|
||||||
"\6\3\2\2\2\u010d\u010e\7.\2\2\u010e\b\3\2\2\2\u010f\u0110\7<\2\2\u0110"+
|
"\u0412\3\2\2\2\u0103\u041d\3\2\2\2\u0105\u0428\3\2\2\2\u0107\u0431\3\2"+
|
||||||
"\n\3\2\2\2\u0111\u0112\7C\2\2\u0112\u0113\7N\2\2\u0113\u0114\7N\2\2\u0114"+
|
"\2\2\u0109\u0433\3\2\2\2\u010b\u0435\3\2\2\2\u010d\u0446\3\2\2\2\u010f"+
|
||||||
"\f\3\2\2\2\u0115\u0116\7C\2\2\u0116\u0117\7P\2\2\u0117\u0118\7C\2\2\u0118"+
|
"\u0456\3\2\2\2\u0111\u045c\3\2\2\2\u0113\u0114\7*\2\2\u0114\4\3\2\2\2"+
|
||||||
"\u0119\7N\2\2\u0119\u011a\7[\2\2\u011a\u011b\7\\\2\2\u011b\u011c\7G\2"+
|
"\u0115\u0116\7+\2\2\u0116\6\3\2\2\2\u0117\u0118\7.\2\2\u0118\b\3\2\2\2"+
|
||||||
"\2\u011c\16\3\2\2\2\u011d\u011e\7C\2\2\u011e\u011f\7P\2\2\u011f\u0120"+
|
"\u0119\u011a\7<\2\2\u011a\n\3\2\2\2\u011b\u011c\7C\2\2\u011c\u011d\7N"+
|
||||||
"\7C\2\2\u0120\u0121\7N\2\2\u0121\u0122\7[\2\2\u0122\u0123\7\\\2\2\u0123"+
|
"\2\2\u011d\u011e\7N\2\2\u011e\f\3\2\2\2\u011f\u0120\7C\2\2\u0120\u0121"+
|
||||||
"\u0124\7G\2\2\u0124\u0125\7F\2\2\u0125\20\3\2\2\2\u0126\u0127\7C\2\2\u0127"+
|
"\7P\2\2\u0121\u0122\7C\2\2\u0122\u0123\7N\2\2\u0123\u0124\7[\2\2\u0124"+
|
||||||
"\u0128\7P\2\2\u0128\u0129\7F\2\2\u0129\22\3\2\2\2\u012a\u012b\7C\2\2\u012b"+
|
"\u0125\7\\\2\2\u0125\u0126\7G\2\2\u0126\16\3\2\2\2\u0127\u0128\7C\2\2"+
|
||||||
"\u012c\7P\2\2\u012c\u012d\7[\2\2\u012d\24\3\2\2\2\u012e\u012f\7C\2\2\u012f"+
|
"\u0128\u0129\7P\2\2\u0129\u012a\7C\2\2\u012a\u012b\7N\2\2\u012b\u012c"+
|
||||||
"\u0130\7U\2\2\u0130\26\3\2\2\2\u0131\u0132\7C\2\2\u0132\u0133\7U\2\2\u0133"+
|
"\7[\2\2\u012c\u012d\7\\\2\2\u012d\u012e\7G\2\2\u012e\u012f\7F\2\2\u012f"+
|
||||||
"\u0134\7E\2\2\u0134\30\3\2\2\2\u0135\u0136\7D\2\2\u0136\u0137\7G\2\2\u0137"+
|
"\20\3\2\2\2\u0130\u0131\7C\2\2\u0131\u0132\7P\2\2\u0132\u0133\7F\2\2\u0133"+
|
||||||
"\u0138\7V\2\2\u0138\u0139\7Y\2\2\u0139\u013a\7G\2\2\u013a\u013b\7G\2\2"+
|
"\22\3\2\2\2\u0134\u0135\7C\2\2\u0135\u0136\7P\2\2\u0136\u0137\7[\2\2\u0137"+
|
||||||
"\u013b\u013c\7P\2\2\u013c\32\3\2\2\2\u013d\u013e\7D\2\2\u013e\u013f\7"+
|
"\24\3\2\2\2\u0138\u0139\7C\2\2\u0139\u013a\7U\2\2\u013a\26\3\2\2\2\u013b"+
|
||||||
"[\2\2\u013f\34\3\2\2\2\u0140\u0141\7E\2\2\u0141\u0142\7C\2\2\u0142\u0143"+
|
"\u013c\7C\2\2\u013c\u013d\7U\2\2\u013d\u013e\7E\2\2\u013e\30\3\2\2\2\u013f"+
|
||||||
"\7U\2\2\u0143\u0144\7V\2\2\u0144\36\3\2\2\2\u0145\u0146\7E\2\2\u0146\u0147"+
|
"\u0140\7D\2\2\u0140\u0141\7G\2\2\u0141\u0142\7V\2\2\u0142\u0143\7Y\2\2"+
|
||||||
"\7C\2\2\u0147\u0148\7V\2\2\u0148\u0149\7C\2\2\u0149\u014a\7N\2\2\u014a"+
|
"\u0143\u0144\7G\2\2\u0144\u0145\7G\2\2\u0145\u0146\7P\2\2\u0146\32\3\2"+
|
||||||
"\u014b\7Q\2\2\u014b\u014c\7I\2\2\u014c \3\2\2\2\u014d\u014e\7E\2\2\u014e"+
|
"\2\2\u0147\u0148\7D\2\2\u0148\u0149\7[\2\2\u0149\34\3\2\2\2\u014a\u014b"+
|
||||||
"\u014f\7C\2\2\u014f\u0150\7V\2\2\u0150\u0151\7C\2\2\u0151\u0152\7N\2\2"+
|
"\7E\2\2\u014b\u014c\7C\2\2\u014c\u014d\7U\2\2\u014d\u014e\7G\2\2\u014e"+
|
||||||
"\u0152\u0153\7Q\2\2\u0153\u0154\7I\2\2\u0154\u0155\7U\2\2\u0155\"\3\2"+
|
"\36\3\2\2\2\u014f\u0150\7E\2\2\u0150\u0151\7C\2\2\u0151\u0152\7U\2\2\u0152"+
|
||||||
"\2\2\u0156\u0157\7E\2\2\u0157\u0158\7Q\2\2\u0158\u0159\7N\2\2\u0159\u015a"+
|
"\u0153\7V\2\2\u0153 \3\2\2\2\u0154\u0155\7E\2\2\u0155\u0156\7C\2\2\u0156"+
|
||||||
"\7W\2\2\u015a\u015b\7O\2\2\u015b\u015c\7P\2\2\u015c\u015d\7U\2\2\u015d"+
|
"\u0157\7V\2\2\u0157\u0158\7C\2\2\u0158\u0159\7N\2\2\u0159\u015a\7Q\2\2"+
|
||||||
"$\3\2\2\2\u015e\u015f\7E\2\2\u015f\u0160\7Q\2\2\u0160\u0161\7P\2\2\u0161"+
|
"\u015a\u015b\7I\2\2\u015b\"\3\2\2\2\u015c\u015d\7E\2\2\u015d\u015e\7C"+
|
||||||
"\u0162\7X\2\2\u0162\u0163\7G\2\2\u0163\u0164\7T\2\2\u0164\u0165\7V\2\2"+
|
"\2\2\u015e\u015f\7V\2\2\u015f\u0160\7C\2\2\u0160\u0161\7N\2\2\u0161\u0162"+
|
||||||
"\u0165&\3\2\2\2\u0166\u0167\7E\2\2\u0167\u0168\7W\2\2\u0168\u0169\7T\2"+
|
"\7Q\2\2\u0162\u0163\7I\2\2\u0163\u0164\7U\2\2\u0164$\3\2\2\2\u0165\u0166"+
|
||||||
"\2\u0169\u016a\7T\2\2\u016a\u016b\7G\2\2\u016b\u016c\7P\2\2\u016c\u016d"+
|
"\7E\2\2\u0166\u0167\7Q\2\2\u0167\u0168\7N\2\2\u0168\u0169\7W\2\2\u0169"+
|
||||||
"\7V\2\2\u016d\u016e\7a\2\2\u016e\u016f\7F\2\2\u016f\u0170\7C\2\2\u0170"+
|
"\u016a\7O\2\2\u016a\u016b\7P\2\2\u016b\u016c\7U\2\2\u016c&\3\2\2\2\u016d"+
|
||||||
"\u0171\7V\2\2\u0171\u0172\7G\2\2\u0172(\3\2\2\2\u0173\u0174\7E\2\2\u0174"+
|
"\u016e\7E\2\2\u016e\u016f\7Q\2\2\u016f\u0170\7P\2\2\u0170\u0171\7X\2\2"+
|
||||||
"\u0175\7W\2\2\u0175\u0176\7T\2\2\u0176\u0177\7T\2\2\u0177\u0178\7G\2\2"+
|
"\u0171\u0172\7G\2\2\u0172\u0173\7T\2\2\u0173\u0174\7V\2\2\u0174(\3\2\2"+
|
||||||
"\u0178\u0179\7P\2\2\u0179\u017a\7V\2\2\u017a\u017b\7a\2\2\u017b\u017c"+
|
"\2\u0175\u0176\7E\2\2\u0176\u0177\7W\2\2\u0177\u0178\7T\2\2\u0178\u0179"+
|
||||||
"\7V\2\2\u017c\u017d\7K\2\2\u017d\u017e\7O\2\2\u017e\u017f\7G\2\2\u017f"+
|
"\7T\2\2\u0179\u017a\7G\2\2\u017a\u017b\7P\2\2\u017b\u017c\7V\2\2\u017c"+
|
||||||
"*\3\2\2\2\u0180\u0181\7E\2\2\u0181\u0182\7W\2\2\u0182\u0183\7T\2\2\u0183"+
|
"\u017d\7a\2\2\u017d\u017e\7F\2\2\u017e\u017f\7C\2\2\u017f\u0180\7V\2\2"+
|
||||||
"\u0184\7T\2\2\u0184\u0185\7G\2\2\u0185\u0186\7P\2\2\u0186\u0187\7V\2\2"+
|
"\u0180\u0181\7G\2\2\u0181*\3\2\2\2\u0182\u0183\7E\2\2\u0183\u0184\7W\2"+
|
||||||
"\u0187\u0188\7a\2\2\u0188\u0189\7V\2\2\u0189\u018a\7K\2\2\u018a\u018b"+
|
"\2\u0184\u0185\7T\2\2\u0185\u0186\7T\2\2\u0186\u0187\7G\2\2\u0187\u0188"+
|
||||||
"\7O\2\2\u018b\u018c\7G\2\2\u018c\u018d\7U\2\2\u018d\u018e\7V\2\2\u018e"+
|
"\7P\2\2\u0188\u0189\7V\2\2\u0189\u018a\7a\2\2\u018a\u018b\7V\2\2\u018b"+
|
||||||
"\u018f\7C\2\2\u018f\u0190\7O\2\2\u0190\u0191\7R\2\2\u0191,\3\2\2\2\u0192"+
|
"\u018c\7K\2\2\u018c\u018d\7O\2\2\u018d\u018e\7G\2\2\u018e,\3\2\2\2\u018f"+
|
||||||
"\u0193\7F\2\2\u0193\u0194\7C\2\2\u0194\u0195\7[\2\2\u0195.\3\2\2\2\u0196"+
|
"\u0190\7E\2\2\u0190\u0191\7W\2\2\u0191\u0192\7T\2\2\u0192\u0193\7T\2\2"+
|
||||||
"\u0197\7F\2\2\u0197\u0198\7C\2\2\u0198\u0199\7[\2\2\u0199\u019a\7U\2\2"+
|
"\u0193\u0194\7G\2\2\u0194\u0195\7P\2\2\u0195\u0196\7V\2\2\u0196\u0197"+
|
||||||
"\u019a\60\3\2\2\2\u019b\u019c\7F\2\2\u019c\u019d\7G\2\2\u019d\u019e\7"+
|
"\7a\2\2\u0197\u0198\7V\2\2\u0198\u0199\7K\2\2\u0199\u019a\7O\2\2\u019a"+
|
||||||
"D\2\2\u019e\u019f\7W\2\2\u019f\u01a0\7I\2\2\u01a0\62\3\2\2\2\u01a1\u01a2"+
|
"\u019b\7G\2\2\u019b\u019c\7U\2\2\u019c\u019d\7V\2\2\u019d\u019e\7C\2\2"+
|
||||||
"\7F\2\2\u01a2\u01a3\7G\2\2\u01a3\u01a4\7U\2\2\u01a4\u01a5\7E\2\2\u01a5"+
|
"\u019e\u019f\7O\2\2\u019f\u01a0\7R\2\2\u01a0.\3\2\2\2\u01a1\u01a2\7F\2"+
|
||||||
"\64\3\2\2\2\u01a6\u01a7\7F\2\2\u01a7\u01a8\7G\2\2\u01a8\u01a9\7U\2\2\u01a9"+
|
"\2\u01a2\u01a3\7C\2\2\u01a3\u01a4\7[\2\2\u01a4\60\3\2\2\2\u01a5\u01a6"+
|
||||||
"\u01aa\7E\2\2\u01aa\u01ab\7T\2\2\u01ab\u01ac\7K\2\2\u01ac\u01ad\7D\2\2"+
|
"\7F\2\2\u01a6\u01a7\7C\2\2\u01a7\u01a8\7[\2\2\u01a8\u01a9\7U\2\2\u01a9"+
|
||||||
"\u01ad\u01ae\7G\2\2\u01ae\66\3\2\2\2\u01af\u01b0\7F\2\2\u01b0\u01b1\7"+
|
"\62\3\2\2\2\u01aa\u01ab\7F\2\2\u01ab\u01ac\7G\2\2\u01ac\u01ad\7D\2\2\u01ad"+
|
||||||
"K\2\2\u01b1\u01b2\7U\2\2\u01b2\u01b3\7V\2\2\u01b3\u01b4\7K\2\2\u01b4\u01b5"+
|
"\u01ae\7W\2\2\u01ae\u01af\7I\2\2\u01af\64\3\2\2\2\u01b0\u01b1\7F\2\2\u01b1"+
|
||||||
"\7P\2\2\u01b5\u01b6\7E\2\2\u01b6\u01b7\7V\2\2\u01b78\3\2\2\2\u01b8\u01b9"+
|
"\u01b2\7G\2\2\u01b2\u01b3\7U\2\2\u01b3\u01b4\7E\2\2\u01b4\66\3\2\2\2\u01b5"+
|
||||||
"\7G\2\2\u01b9\u01ba\7U\2\2\u01ba\u01bb\7E\2\2\u01bb\u01bc\7C\2\2\u01bc"+
|
"\u01b6\7F\2\2\u01b6\u01b7\7G\2\2\u01b7\u01b8\7U\2\2\u01b8\u01b9\7E\2\2"+
|
||||||
"\u01bd\7R\2\2\u01bd\u01be\7G\2\2\u01be:\3\2\2\2\u01bf\u01c0\7G\2\2\u01c0"+
|
"\u01b9\u01ba\7T\2\2\u01ba\u01bb\7K\2\2\u01bb\u01bc\7D\2\2\u01bc\u01bd"+
|
||||||
"\u01c1\7Z\2\2\u01c1\u01c2\7G\2\2\u01c2\u01c3\7E\2\2\u01c3\u01c4\7W\2\2"+
|
"\7G\2\2\u01bd8\3\2\2\2\u01be\u01bf\7F\2\2\u01bf\u01c0\7K\2\2\u01c0\u01c1"+
|
||||||
"\u01c4\u01c5\7V\2\2\u01c5\u01c6\7C\2\2\u01c6\u01c7\7D\2\2\u01c7\u01c8"+
|
"\7U\2\2\u01c1\u01c2\7V\2\2\u01c2\u01c3\7K\2\2\u01c3\u01c4\7P\2\2\u01c4"+
|
||||||
"\7N\2\2\u01c8\u01c9\7G\2\2\u01c9<\3\2\2\2\u01ca\u01cb\7G\2\2\u01cb\u01cc"+
|
"\u01c5\7E\2\2\u01c5\u01c6\7V\2\2\u01c6:\3\2\2\2\u01c7\u01c8\7G\2\2\u01c8"+
|
||||||
"\7Z\2\2\u01cc\u01cd\7K\2\2\u01cd\u01ce\7U\2\2\u01ce\u01cf\7V\2\2\u01cf"+
|
"\u01c9\7N\2\2\u01c9\u01ca\7U\2\2\u01ca\u01cb\7G\2\2\u01cb<\3\2\2\2\u01cc"+
|
||||||
"\u01d0\7U\2\2\u01d0>\3\2\2\2\u01d1\u01d2\7G\2\2\u01d2\u01d3\7Z\2\2\u01d3"+
|
"\u01cd\7G\2\2\u01cd\u01ce\7P\2\2\u01ce\u01cf\7F\2\2\u01cf>\3\2\2\2\u01d0"+
|
||||||
"\u01d4\7R\2\2\u01d4\u01d5\7N\2\2\u01d5\u01d6\7C\2\2\u01d6\u01d7\7K\2\2"+
|
"\u01d1\7G\2\2\u01d1\u01d2\7U\2\2\u01d2\u01d3\7E\2\2\u01d3\u01d4\7C\2\2"+
|
||||||
"\u01d7\u01d8\7P\2\2\u01d8@\3\2\2\2\u01d9\u01da\7G\2\2\u01da\u01db\7Z\2"+
|
"\u01d4\u01d5\7R\2\2\u01d5\u01d6\7G\2\2\u01d6@\3\2\2\2\u01d7\u01d8\7G\2"+
|
||||||
"\2\u01db\u01dc\7V\2\2\u01dc\u01dd\7T\2\2\u01dd\u01de\7C\2\2\u01de\u01df"+
|
"\2\u01d8\u01d9\7Z\2\2\u01d9\u01da\7G\2\2\u01da\u01db\7E\2\2\u01db\u01dc"+
|
||||||
"\7E\2\2\u01df\u01e0\7V\2\2\u01e0B\3\2\2\2\u01e1\u01e2\7H\2\2\u01e2\u01e3"+
|
"\7W\2\2\u01dc\u01dd\7V\2\2\u01dd\u01de\7C\2\2\u01de\u01df\7D\2\2\u01df"+
|
||||||
"\7C\2\2\u01e3\u01e4\7N\2\2\u01e4\u01e5\7U\2\2\u01e5\u01e6\7G\2\2\u01e6"+
|
"\u01e0\7N\2\2\u01e0\u01e1\7G\2\2\u01e1B\3\2\2\2\u01e2\u01e3\7G\2\2\u01e3"+
|
||||||
"D\3\2\2\2\u01e7\u01e8\7H\2\2\u01e8\u01e9\7K\2\2\u01e9\u01ea\7T\2\2\u01ea"+
|
"\u01e4\7Z\2\2\u01e4\u01e5\7K\2\2\u01e5\u01e6\7U\2\2\u01e6\u01e7\7V\2\2"+
|
||||||
"\u01eb\7U\2\2\u01eb\u01ec\7V\2\2\u01ecF\3\2\2\2\u01ed\u01ee\7H\2\2\u01ee"+
|
"\u01e7\u01e8\7U\2\2\u01e8D\3\2\2\2\u01e9\u01ea\7G\2\2\u01ea\u01eb\7Z\2"+
|
||||||
"\u01ef\7Q\2\2\u01ef\u01f0\7T\2\2\u01f0\u01f1\7O\2\2\u01f1\u01f2\7C\2\2"+
|
"\2\u01eb\u01ec\7R\2\2\u01ec\u01ed\7N\2\2\u01ed\u01ee\7C\2\2\u01ee\u01ef"+
|
||||||
"\u01f2\u01f3\7V\2\2\u01f3H\3\2\2\2\u01f4\u01f5\7H\2\2\u01f5\u01f6\7T\2"+
|
"\7K\2\2\u01ef\u01f0\7P\2\2\u01f0F\3\2\2\2\u01f1\u01f2\7G\2\2\u01f2\u01f3"+
|
||||||
"\2\u01f6\u01f7\7Q\2\2\u01f7\u01f8\7O\2\2\u01f8J\3\2\2\2\u01f9\u01fa\7"+
|
"\7Z\2\2\u01f3\u01f4\7V\2\2\u01f4\u01f5\7T\2\2\u01f5\u01f6\7C\2\2\u01f6"+
|
||||||
"H\2\2\u01fa\u01fb\7W\2\2\u01fb\u01fc\7N\2\2\u01fc\u01fd\7N\2\2\u01fdL"+
|
"\u01f7\7E\2\2\u01f7\u01f8\7V\2\2\u01f8H\3\2\2\2\u01f9\u01fa\7H\2\2\u01fa"+
|
||||||
"\3\2\2\2\u01fe\u01ff\7H\2\2\u01ff\u0200\7W\2\2\u0200\u0201\7P\2\2\u0201"+
|
"\u01fb\7C\2\2\u01fb\u01fc\7N\2\2\u01fc\u01fd\7U\2\2\u01fd\u01fe\7G\2\2"+
|
||||||
"\u0202\7E\2\2\u0202\u0203\7V\2\2\u0203\u0204\7K\2\2\u0204\u0205\7Q\2\2"+
|
"\u01feJ\3\2\2\2\u01ff\u0200\7H\2\2\u0200\u0201\7K\2\2\u0201\u0202\7T\2"+
|
||||||
"\u0205\u0206\7P\2\2\u0206\u0207\7U\2\2\u0207N\3\2\2\2\u0208\u0209\7I\2"+
|
"\2\u0202\u0203\7U\2\2\u0203\u0204\7V\2\2\u0204L\3\2\2\2\u0205\u0206\7"+
|
||||||
"\2\u0209\u020a\7T\2\2\u020a\u020b\7C\2\2\u020b\u020c\7R\2\2\u020c\u020d"+
|
"H\2\2\u0206\u0207\7Q\2\2\u0207\u0208\7T\2\2\u0208\u0209\7O\2\2\u0209\u020a"+
|
||||||
"\7J\2\2\u020d\u020e\7X\2\2\u020e\u020f\7K\2\2\u020f\u0210\7\\\2\2\u0210"+
|
"\7C\2\2\u020a\u020b\7V\2\2\u020bN\3\2\2\2\u020c\u020d\7H\2\2\u020d\u020e"+
|
||||||
"P\3\2\2\2\u0211\u0212\7I\2\2\u0212\u0213\7T\2\2\u0213\u0214\7Q\2\2\u0214"+
|
"\7T\2\2\u020e\u020f\7Q\2\2\u020f\u0210\7O\2\2\u0210P\3\2\2\2\u0211\u0212"+
|
||||||
"\u0215\7W\2\2\u0215\u0216\7R\2\2\u0216R\3\2\2\2\u0217\u0218\7J\2\2\u0218"+
|
"\7H\2\2\u0212\u0213\7W\2\2\u0213\u0214\7N\2\2\u0214\u0215\7N\2\2\u0215"+
|
||||||
"\u0219\7C\2\2\u0219\u021a\7X\2\2\u021a\u021b\7K\2\2\u021b\u021c\7P\2\2"+
|
"R\3\2\2\2\u0216\u0217\7H\2\2\u0217\u0218\7W\2\2\u0218\u0219\7P\2\2\u0219"+
|
||||||
"\u021c\u021d\7I\2\2\u021dT\3\2\2\2\u021e\u021f\7J\2\2\u021f\u0220\7Q\2"+
|
"\u021a\7E\2\2\u021a\u021b\7V\2\2\u021b\u021c\7K\2\2\u021c\u021d\7Q\2\2"+
|
||||||
"\2\u0220\u0221\7W\2\2\u0221\u0222\7T\2\2\u0222V\3\2\2\2\u0223\u0224\7"+
|
"\u021d\u021e\7P\2\2\u021e\u021f\7U\2\2\u021fT\3\2\2\2\u0220\u0221\7I\2"+
|
||||||
"J\2\2\u0224\u0225\7Q\2\2\u0225\u0226\7W\2\2\u0226\u0227\7T\2\2\u0227\u0228"+
|
"\2\u0221\u0222\7T\2\2\u0222\u0223\7C\2\2\u0223\u0224\7R\2\2\u0224\u0225"+
|
||||||
"\7U\2\2\u0228X\3\2\2\2\u0229\u022a\7K\2\2\u022a\u022b\7P\2\2\u022bZ\3"+
|
"\7J\2\2\u0225\u0226\7X\2\2\u0226\u0227\7K\2\2\u0227\u0228\7\\\2\2\u0228"+
|
||||||
"\2\2\2\u022c\u022d\7K\2\2\u022d\u022e\7P\2\2\u022e\u022f\7P\2\2\u022f"+
|
"V\3\2\2\2\u0229\u022a\7I\2\2\u022a\u022b\7T\2\2\u022b\u022c\7Q\2\2\u022c"+
|
||||||
"\u0230\7G\2\2\u0230\u0231\7T\2\2\u0231\\\3\2\2\2\u0232\u0233\7K\2\2\u0233"+
|
"\u022d\7W\2\2\u022d\u022e\7R\2\2\u022eX\3\2\2\2\u022f\u0230\7J\2\2\u0230"+
|
||||||
"\u0234\7P\2\2\u0234\u0235\7V\2\2\u0235\u0236\7G\2\2\u0236\u0237\7T\2\2"+
|
"\u0231\7C\2\2\u0231\u0232\7X\2\2\u0232\u0233\7K\2\2\u0233\u0234\7P\2\2"+
|
||||||
"\u0237\u0238\7X\2\2\u0238\u0239\7C\2\2\u0239\u023a\7N\2\2\u023a^\3\2\2"+
|
"\u0234\u0235\7I\2\2\u0235Z\3\2\2\2\u0236\u0237\7J\2\2\u0237\u0238\7Q\2"+
|
||||||
"\2\u023b\u023c\7K\2\2\u023c\u023d\7U\2\2\u023d`\3\2\2\2\u023e\u023f\7"+
|
"\2\u0238\u0239\7W\2\2\u0239\u023a\7T\2\2\u023a\\\3\2\2\2\u023b\u023c\7"+
|
||||||
"L\2\2\u023f\u0240\7Q\2\2\u0240\u0241\7K\2\2\u0241\u0242\7P\2\2\u0242b"+
|
"J\2\2\u023c\u023d\7Q\2\2\u023d\u023e\7W\2\2\u023e\u023f\7T\2\2\u023f\u0240"+
|
||||||
"\3\2\2\2\u0243\u0244\7N\2\2\u0244\u0245\7C\2\2\u0245\u0246\7U\2\2\u0246"+
|
"\7U\2\2\u0240^\3\2\2\2\u0241\u0242\7K\2\2\u0242\u0243\7P\2\2\u0243`\3"+
|
||||||
"\u0247\7V\2\2\u0247d\3\2\2\2\u0248\u0249\7N\2\2\u0249\u024a\7G\2\2\u024a"+
|
"\2\2\2\u0244\u0245\7K\2\2\u0245\u0246\7P\2\2\u0246\u0247\7P\2\2\u0247"+
|
||||||
"\u024b\7H\2\2\u024b\u024c\7V\2\2\u024cf\3\2\2\2\u024d\u024e\7N\2\2\u024e"+
|
"\u0248\7G\2\2\u0248\u0249\7T\2\2\u0249b\3\2\2\2\u024a\u024b\7K\2\2\u024b"+
|
||||||
"\u024f\7K\2\2\u024f\u0250\7M\2\2\u0250\u0251\7G\2\2\u0251h\3\2\2\2\u0252"+
|
"\u024c\7P\2\2\u024c\u024d\7V\2\2\u024d\u024e\7G\2\2\u024e\u024f\7T\2\2"+
|
||||||
"\u0253\7N\2\2\u0253\u0254\7K\2\2\u0254\u0255\7O\2\2\u0255\u0256\7K\2\2"+
|
"\u024f\u0250\7X\2\2\u0250\u0251\7C\2\2\u0251\u0252\7N\2\2\u0252d\3\2\2"+
|
||||||
"\u0256\u0257\7V\2\2\u0257j\3\2\2\2\u0258\u0259\7O\2\2\u0259\u025a\7C\2"+
|
"\2\u0253\u0254\7K\2\2\u0254\u0255\7U\2\2\u0255f\3\2\2\2\u0256\u0257\7"+
|
||||||
"\2\u025a\u025b\7R\2\2\u025b\u025c\7R\2\2\u025c\u025d\7G\2\2\u025d\u025e"+
|
"L\2\2\u0257\u0258\7Q\2\2\u0258\u0259\7K\2\2\u0259\u025a\7P\2\2\u025ah"+
|
||||||
"\7F\2\2\u025el\3\2\2\2\u025f\u0260\7O\2\2\u0260\u0261\7C\2\2\u0261\u0262"+
|
"\3\2\2\2\u025b\u025c\7N\2\2\u025c\u025d\7C\2\2\u025d\u025e\7U\2\2\u025e"+
|
||||||
"\7V\2\2\u0262\u0263\7E\2\2\u0263\u0264\7J\2\2\u0264n\3\2\2\2\u0265\u0266"+
|
"\u025f\7V\2\2\u025fj\3\2\2\2\u0260\u0261\7N\2\2\u0261\u0262\7G\2\2\u0262"+
|
||||||
"\7O\2\2\u0266\u0267\7K\2\2\u0267\u0268\7P\2\2\u0268\u0269\7W\2\2\u0269"+
|
"\u0263\7H\2\2\u0263\u0264\7V\2\2\u0264l\3\2\2\2\u0265\u0266\7N\2\2\u0266"+
|
||||||
"\u026a\7V\2\2\u026a\u026b\7G\2\2\u026bp\3\2\2\2\u026c\u026d\7O\2\2\u026d"+
|
"\u0267\7K\2\2\u0267\u0268\7M\2\2\u0268\u0269\7G\2\2\u0269n\3\2\2\2\u026a"+
|
||||||
"\u026e\7K\2\2\u026e\u026f\7P\2\2\u026f\u0270\7W\2\2\u0270\u0271\7V\2\2"+
|
"\u026b\7N\2\2\u026b\u026c\7K\2\2\u026c\u026d\7O\2\2\u026d\u026e\7K\2\2"+
|
||||||
"\u0271\u0272\7G\2\2\u0272\u0273\7U\2\2\u0273r\3\2\2\2\u0274\u0275\7O\2"+
|
"\u026e\u026f\7V\2\2\u026fp\3\2\2\2\u0270\u0271\7O\2\2\u0271\u0272\7C\2"+
|
||||||
"\2\u0275\u0276\7Q\2\2\u0276\u0277\7P\2\2\u0277\u0278\7V\2\2\u0278\u0279"+
|
"\2\u0272\u0273\7R\2\2\u0273\u0274\7R\2\2\u0274\u0275\7G\2\2\u0275\u0276"+
|
||||||
"\7J\2\2\u0279t\3\2\2\2\u027a\u027b\7O\2\2\u027b\u027c\7Q\2\2\u027c\u027d"+
|
"\7F\2\2\u0276r\3\2\2\2\u0277\u0278\7O\2\2\u0278\u0279\7C\2\2\u0279\u027a"+
|
||||||
"\7P\2\2\u027d\u027e\7V\2\2\u027e\u027f\7J\2\2\u027f\u0280\7U\2\2\u0280"+
|
"\7V\2\2\u027a\u027b\7E\2\2\u027b\u027c\7J\2\2\u027ct\3\2\2\2\u027d\u027e"+
|
||||||
"v\3\2\2\2\u0281\u0282\7P\2\2\u0282\u0283\7C\2\2\u0283\u0284\7V\2\2\u0284"+
|
"\7O\2\2\u027e\u027f\7K\2\2\u027f\u0280\7P\2\2\u0280\u0281\7W\2\2\u0281"+
|
||||||
"\u0285\7W\2\2\u0285\u0286\7T\2\2\u0286\u0287\7C\2\2\u0287\u0288\7N\2\2"+
|
"\u0282\7V\2\2\u0282\u0283\7G\2\2\u0283v\3\2\2\2\u0284\u0285\7O\2\2\u0285"+
|
||||||
"\u0288x\3\2\2\2\u0289\u028a\7P\2\2\u028a\u028b\7Q\2\2\u028b\u028c\7V\2"+
|
"\u0286\7K\2\2\u0286\u0287\7P\2\2\u0287\u0288\7W\2\2\u0288\u0289\7V\2\2"+
|
||||||
"\2\u028cz\3\2\2\2\u028d\u028e\7P\2\2\u028e\u028f\7W\2\2\u028f\u0290\7"+
|
"\u0289\u028a\7G\2\2\u028a\u028b\7U\2\2\u028bx\3\2\2\2\u028c\u028d\7O\2"+
|
||||||
"N\2\2\u0290\u0291\7N\2\2\u0291|\3\2\2\2\u0292\u0293\7P\2\2\u0293\u0294"+
|
"\2\u028d\u028e\7Q\2\2\u028e\u028f\7P\2\2\u028f\u0290\7V\2\2\u0290\u0291"+
|
||||||
"\7W\2\2\u0294\u0295\7N\2\2\u0295\u0296\7N\2\2\u0296\u0297\7U\2\2\u0297"+
|
"\7J\2\2\u0291z\3\2\2\2\u0292\u0293\7O\2\2\u0293\u0294\7Q\2\2\u0294\u0295"+
|
||||||
"~\3\2\2\2\u0298\u0299\7Q\2\2\u0299\u029a\7P\2\2\u029a\u0080\3\2\2\2\u029b"+
|
"\7P\2\2\u0295\u0296\7V\2\2\u0296\u0297\7J\2\2\u0297\u0298\7U\2\2\u0298"+
|
||||||
"\u029c\7Q\2\2\u029c\u029d\7R\2\2\u029d\u029e\7V\2\2\u029e\u029f\7K\2\2"+
|
"|\3\2\2\2\u0299\u029a\7P\2\2\u029a\u029b\7C\2\2\u029b\u029c\7V\2\2\u029c"+
|
||||||
"\u029f\u02a0\7O\2\2\u02a0\u02a1\7K\2\2\u02a1\u02a2\7\\\2\2\u02a2\u02a3"+
|
"\u029d\7W\2\2\u029d\u029e\7T\2\2\u029e\u029f\7C\2\2\u029f\u02a0\7N\2\2"+
|
||||||
"\7G\2\2\u02a3\u02a4\7F\2\2\u02a4\u0082\3\2\2\2\u02a5\u02a6\7Q\2\2\u02a6"+
|
"\u02a0~\3\2\2\2\u02a1\u02a2\7P\2\2\u02a2\u02a3\7Q\2\2\u02a3\u02a4\7V\2"+
|
||||||
"\u02a7\7T\2\2\u02a7\u0084\3\2\2\2\u02a8\u02a9\7Q\2\2\u02a9\u02aa\7T\2"+
|
"\2\u02a4\u0080\3\2\2\2\u02a5\u02a6\7P\2\2\u02a6\u02a7\7W\2\2\u02a7\u02a8"+
|
||||||
"\2\u02aa\u02ab\7F\2\2\u02ab\u02ac\7G\2\2\u02ac\u02ad\7T\2\2\u02ad\u0086"+
|
"\7N\2\2\u02a8\u02a9\7N\2\2\u02a9\u0082\3\2\2\2\u02aa\u02ab\7P\2\2\u02ab"+
|
||||||
"\3\2\2\2\u02ae\u02af\7Q\2\2\u02af\u02b0\7W\2\2\u02b0\u02b1\7V\2\2\u02b1"+
|
"\u02ac\7W\2\2\u02ac\u02ad\7N\2\2\u02ad\u02ae\7N\2\2\u02ae\u02af\7U\2\2"+
|
||||||
"\u02b2\7G\2\2\u02b2\u02b3\7T\2\2\u02b3\u0088\3\2\2\2\u02b4\u02b5\7R\2"+
|
"\u02af\u0084\3\2\2\2\u02b0\u02b1\7Q\2\2\u02b1\u02b2\7P\2\2\u02b2\u0086"+
|
||||||
"\2\u02b5\u02b6\7C\2\2\u02b6\u02b7\7T\2\2\u02b7\u02b8\7U\2\2\u02b8\u02b9"+
|
"\3\2\2\2\u02b3\u02b4\7Q\2\2\u02b4\u02b5\7R\2\2\u02b5\u02b6\7V\2\2\u02b6"+
|
||||||
"\7G\2\2\u02b9\u02ba\7F\2\2\u02ba\u008a\3\2\2\2\u02bb\u02bc\7R\2\2\u02bc"+
|
"\u02b7\7K\2\2\u02b7\u02b8\7O\2\2\u02b8\u02b9\7K\2\2\u02b9\u02ba\7\\\2"+
|
||||||
"\u02bd\7J\2\2\u02bd\u02be\7[\2\2\u02be\u02bf\7U\2\2\u02bf\u02c0\7K\2\2"+
|
"\2\u02ba\u02bb\7G\2\2\u02bb\u02bc\7F\2\2\u02bc\u0088\3\2\2\2\u02bd\u02be"+
|
||||||
"\u02c0\u02c1\7E\2\2\u02c1\u02c2\7C\2\2\u02c2\u02c3\7N\2\2\u02c3\u008c"+
|
"\7Q\2\2\u02be\u02bf\7T\2\2\u02bf\u008a\3\2\2\2\u02c0\u02c1\7Q\2\2\u02c1"+
|
||||||
"\3\2\2\2\u02c4\u02c5\7R\2\2\u02c5\u02c6\7N\2\2\u02c6\u02c7\7C\2\2\u02c7"+
|
"\u02c2\7T\2\2\u02c2\u02c3\7F\2\2\u02c3\u02c4\7G\2\2\u02c4\u02c5\7T\2\2"+
|
||||||
"\u02c8\7P\2\2\u02c8\u008e\3\2\2\2\u02c9\u02ca\7T\2\2\u02ca\u02cb\7K\2"+
|
"\u02c5\u008c\3\2\2\2\u02c6\u02c7\7Q\2\2\u02c7\u02c8\7W\2\2\u02c8\u02c9"+
|
||||||
"\2\u02cb\u02cc\7I\2\2\u02cc\u02cd\7J\2\2\u02cd\u02ce\7V\2\2\u02ce\u0090"+
|
"\7V\2\2\u02c9\u02ca\7G\2\2\u02ca\u02cb\7T\2\2\u02cb\u008e\3\2\2\2\u02cc"+
|
||||||
"\3\2\2\2\u02cf\u02d0\7T\2\2\u02d0\u02d1\7N\2\2\u02d1\u02d2\7K\2\2\u02d2"+
|
"\u02cd\7R\2\2\u02cd\u02ce\7C\2\2\u02ce\u02cf\7T\2\2\u02cf\u02d0\7U\2\2"+
|
||||||
"\u02d3\7M\2\2\u02d3\u02d4\7G\2\2\u02d4\u0092\3\2\2\2\u02d5\u02d6\7S\2"+
|
"\u02d0\u02d1\7G\2\2\u02d1\u02d2\7F\2\2\u02d2\u0090\3\2\2\2\u02d3\u02d4"+
|
||||||
"\2\u02d6\u02d7\7W\2\2\u02d7\u02d8\7G\2\2\u02d8\u02d9\7T\2\2\u02d9\u02da"+
|
"\7R\2\2\u02d4\u02d5\7J\2\2\u02d5\u02d6\7[\2\2\u02d6\u02d7\7U\2\2\u02d7"+
|
||||||
"\7[\2\2\u02da\u0094\3\2\2\2\u02db\u02dc\7U\2\2\u02dc\u02dd\7E\2\2\u02dd"+
|
"\u02d8\7K\2\2\u02d8\u02d9\7E\2\2\u02d9\u02da\7C\2\2\u02da\u02db\7N\2\2"+
|
||||||
"\u02de\7J\2\2\u02de\u02df\7G\2\2\u02df\u02e0\7O\2\2\u02e0\u02e1\7C\2\2"+
|
"\u02db\u0092\3\2\2\2\u02dc\u02dd\7R\2\2\u02dd\u02de\7N\2\2\u02de\u02df"+
|
||||||
"\u02e1\u02e2\7U\2\2\u02e2\u0096\3\2\2\2\u02e3\u02e4\7U\2\2\u02e4\u02e5"+
|
"\7C\2\2\u02df\u02e0\7P\2\2\u02e0\u0094\3\2\2\2\u02e1\u02e2\7T\2\2\u02e2"+
|
||||||
"\7G\2\2\u02e5\u02e6\7E\2\2\u02e6\u02e7\7Q\2\2\u02e7\u02e8\7P\2\2\u02e8"+
|
"\u02e3\7K\2\2\u02e3\u02e4\7I\2\2\u02e4\u02e5\7J\2\2\u02e5\u02e6\7V\2\2"+
|
||||||
"\u02e9\7F\2\2\u02e9\u0098\3\2\2\2\u02ea\u02eb\7U\2\2\u02eb\u02ec\7G\2"+
|
"\u02e6\u0096\3\2\2\2\u02e7\u02e8\7T\2\2\u02e8\u02e9\7N\2\2\u02e9\u02ea"+
|
||||||
"\2\u02ec\u02ed\7E\2\2\u02ed\u02ee\7Q\2\2\u02ee\u02ef\7P\2\2\u02ef\u02f0"+
|
"\7K\2\2\u02ea\u02eb\7M\2\2\u02eb\u02ec\7G\2\2\u02ec\u0098\3\2\2\2\u02ed"+
|
||||||
"\7F\2\2\u02f0\u02f1\7U\2\2\u02f1\u009a\3\2\2\2\u02f2\u02f3\7U\2\2\u02f3"+
|
"\u02ee\7S\2\2\u02ee\u02ef\7W\2\2\u02ef\u02f0\7G\2\2\u02f0\u02f1\7T\2\2"+
|
||||||
"\u02f4\7G\2\2\u02f4\u02f5\7N\2\2\u02f5\u02f6\7G\2\2\u02f6\u02f7\7E\2\2"+
|
"\u02f1\u02f2\7[\2\2\u02f2\u009a\3\2\2\2\u02f3\u02f4\7U\2\2\u02f4\u02f5"+
|
||||||
"\u02f7\u02f8\7V\2\2\u02f8\u009c\3\2\2\2\u02f9\u02fa\7U\2\2\u02fa\u02fb"+
|
"\7E\2\2\u02f5\u02f6\7J\2\2\u02f6\u02f7\7G\2\2\u02f7\u02f8\7O\2\2\u02f8"+
|
||||||
"\7J\2\2\u02fb\u02fc\7Q\2\2\u02fc\u02fd\7Y\2\2\u02fd\u009e\3\2\2\2\u02fe"+
|
"\u02f9\7C\2\2\u02f9\u02fa\7U\2\2\u02fa\u009c\3\2\2\2\u02fb\u02fc\7U\2"+
|
||||||
"\u02ff\7U\2\2\u02ff\u0300\7[\2\2\u0300\u0301\7U\2\2\u0301\u00a0\3\2\2"+
|
"\2\u02fc\u02fd\7G\2\2\u02fd\u02fe\7E\2\2\u02fe\u02ff\7Q\2\2\u02ff\u0300"+
|
||||||
"\2\u0302\u0303\7V\2\2\u0303\u0304\7C\2\2\u0304\u0305\7D\2\2\u0305\u0306"+
|
"\7P\2\2\u0300\u0301\7F\2\2\u0301\u009e\3\2\2\2\u0302\u0303\7U\2\2\u0303"+
|
||||||
"\7N\2\2\u0306\u0307\7G\2\2\u0307\u00a2\3\2\2\2\u0308\u0309\7V\2\2\u0309"+
|
"\u0304\7G\2\2\u0304\u0305\7E\2\2\u0305\u0306\7Q\2\2\u0306\u0307\7P\2\2"+
|
||||||
"\u030a\7C\2\2\u030a\u030b\7D\2\2\u030b\u030c\7N\2\2\u030c\u030d\7G\2\2"+
|
"\u0307\u0308\7F\2\2\u0308\u0309\7U\2\2\u0309\u00a0\3\2\2\2\u030a\u030b"+
|
||||||
"\u030d\u030e\7U\2\2\u030e\u00a4\3\2\2\2\u030f\u0310\7V\2\2\u0310\u0311"+
|
"\7U\2\2\u030b\u030c\7G\2\2\u030c\u030d\7N\2\2\u030d\u030e\7G\2\2\u030e"+
|
||||||
"\7G\2\2\u0311\u0312\7Z\2\2\u0312\u0313\7V\2\2\u0313\u00a6\3\2\2\2\u0314"+
|
"\u030f\7E\2\2\u030f\u0310\7V\2\2\u0310\u00a2\3\2\2\2\u0311\u0312\7U\2"+
|
||||||
"\u0315\7V\2\2\u0315\u0316\7T\2\2\u0316\u0317\7W\2\2\u0317\u0318\7G\2\2"+
|
"\2\u0312\u0313\7J\2\2\u0313\u0314\7Q\2\2\u0314\u0315\7Y\2\2\u0315\u00a4"+
|
||||||
"\u0318\u00a8\3\2\2\2\u0319\u031a\7V\2\2\u031a\u031b\7Q\2\2\u031b\u00aa"+
|
"\3\2\2\2\u0316\u0317\7U\2\2\u0317\u0318\7[\2\2\u0318\u0319\7U\2\2\u0319"+
|
||||||
"\3\2\2\2\u031c\u031d\7V\2\2\u031d\u031e\7[\2\2\u031e\u031f\7R\2\2\u031f"+
|
"\u00a6\3\2\2\2\u031a\u031b\7V\2\2\u031b\u031c\7C\2\2\u031c\u031d\7D\2"+
|
||||||
"\u0320\7G\2\2\u0320\u00ac\3\2\2\2\u0321\u0322\7V\2\2\u0322\u0323\7[\2"+
|
"\2\u031d\u031e\7N\2\2\u031e\u031f\7G\2\2\u031f\u00a8\3\2\2\2\u0320\u0321"+
|
||||||
"\2\u0323\u0324\7R\2\2\u0324\u0325\7G\2\2\u0325\u0326\7U\2\2\u0326\u00ae"+
|
"\7V\2\2\u0321\u0322\7C\2\2\u0322\u0323\7D\2\2\u0323\u0324\7N\2\2\u0324"+
|
||||||
"\3\2\2\2\u0327\u0328\7W\2\2\u0328\u0329\7U\2\2\u0329\u032a\7K\2\2\u032a"+
|
"\u0325\7G\2\2\u0325\u0326\7U\2\2\u0326\u00aa\3\2\2\2\u0327\u0328\7V\2"+
|
||||||
"\u032b\7P\2\2\u032b\u032c\7I\2\2\u032c\u00b0\3\2\2\2\u032d\u032e\7X\2"+
|
"\2\u0328\u0329\7G\2\2\u0329\u032a\7Z\2\2\u032a\u032b\7V\2\2\u032b\u00ac"+
|
||||||
"\2\u032e\u032f\7G\2\2\u032f\u0330\7T\2\2\u0330\u0331\7K\2\2\u0331\u0332"+
|
"\3\2\2\2\u032c\u032d\7V\2\2\u032d\u032e\7J\2\2\u032e\u032f\7G\2\2\u032f"+
|
||||||
"\7H\2\2\u0332\u0333\7[\2\2\u0333\u00b2\3\2\2\2\u0334\u0335\7Y\2\2\u0335"+
|
"\u0330\7P\2\2\u0330\u00ae\3\2\2\2\u0331\u0332\7V\2\2\u0332\u0333\7T\2"+
|
||||||
"\u0336\7J\2\2\u0336\u0337\7G\2\2\u0337\u0338\7T\2\2\u0338\u0339\7G\2\2"+
|
"\2\u0333\u0334\7W\2\2\u0334\u0335\7G\2\2\u0335\u00b0\3\2\2\2\u0336\u0337"+
|
||||||
"\u0339\u00b4\3\2\2\2\u033a\u033b\7Y\2\2\u033b\u033c\7K\2\2\u033c\u033d"+
|
"\7V\2\2\u0337\u0338\7Q\2\2\u0338\u00b2\3\2\2\2\u0339\u033a\7V\2\2\u033a"+
|
||||||
"\7V\2\2\u033d\u033e\7J\2\2\u033e\u00b6\3\2\2\2\u033f\u0340\7[\2\2\u0340"+
|
"\u033b\7[\2\2\u033b\u033c\7R\2\2\u033c\u033d\7G\2\2\u033d\u00b4\3\2\2"+
|
||||||
"\u0341\7G\2\2\u0341\u0342\7C\2\2\u0342\u0343\7T\2\2\u0343\u00b8\3\2\2"+
|
"\2\u033e\u033f\7V\2\2\u033f\u0340\7[\2\2\u0340\u0341\7R\2\2\u0341\u0342"+
|
||||||
"\2\u0344\u0345\7[\2\2\u0345\u0346\7G\2\2\u0346\u0347\7C\2\2\u0347\u0348"+
|
"\7G\2\2\u0342\u0343\7U\2\2\u0343\u00b6\3\2\2\2\u0344\u0345\7W\2\2\u0345"+
|
||||||
"\7T\2\2\u0348\u0349\7U\2\2\u0349\u00ba\3\2\2\2\u034a\u034b\7}\2\2\u034b"+
|
"\u0346\7U\2\2\u0346\u0347\7K\2\2\u0347\u0348\7P\2\2\u0348\u0349\7I\2\2"+
|
||||||
"\u034c\7G\2\2\u034c\u034d\7U\2\2\u034d\u034e\7E\2\2\u034e\u034f\7C\2\2"+
|
"\u0349\u00b8\3\2\2\2\u034a\u034b\7X\2\2\u034b\u034c\7G\2\2\u034c\u034d"+
|
||||||
"\u034f\u0350\7R\2\2\u0350\u0351\7G\2\2\u0351\u00bc\3\2\2\2\u0352\u0353"+
|
"\7T\2\2\u034d\u034e\7K\2\2\u034e\u034f\7H\2\2\u034f\u0350\7[\2\2\u0350"+
|
||||||
"\7}\2\2\u0353\u0354\7H\2\2\u0354\u0355\7P\2\2\u0355\u00be\3\2\2\2\u0356"+
|
"\u00ba\3\2\2\2\u0351\u0352\7Y\2\2\u0352\u0353\7J\2\2\u0353\u0354\7G\2"+
|
||||||
"\u0357\7}\2\2\u0357\u0358\7N\2\2\u0358\u0359\7K\2\2\u0359\u035a\7O\2\2"+
|
"\2\u0354\u0355\7P\2\2\u0355\u00bc\3\2\2\2\u0356\u0357\7Y\2\2\u0357\u0358"+
|
||||||
"\u035a\u035b\7K\2\2\u035b\u035c\7V\2\2\u035c\u00c0\3\2\2\2\u035d\u035e"+
|
"\7J\2\2\u0358\u0359\7G\2\2\u0359\u035a\7T\2\2\u035a\u035b\7G\2\2\u035b"+
|
||||||
"\7}\2\2\u035e\u035f\7F\2\2\u035f\u00c2\3\2\2\2\u0360\u0361\7}\2\2\u0361"+
|
"\u00be\3\2\2\2\u035c\u035d\7Y\2\2\u035d\u035e\7K\2\2\u035e\u035f\7V\2"+
|
||||||
"\u0362\7V\2\2\u0362\u00c4\3\2\2\2\u0363\u0364\7}\2\2\u0364\u0365\7V\2"+
|
"\2\u035f\u0360\7J\2\2\u0360\u00c0\3\2\2\2\u0361\u0362\7[\2\2\u0362\u0363"+
|
||||||
"\2\u0365\u0366\7U\2\2\u0366\u00c6\3\2\2\2\u0367\u0368\7}\2\2\u0368\u0369"+
|
"\7G\2\2\u0363\u0364\7C\2\2\u0364\u0365\7T\2\2\u0365\u00c2\3\2\2\2\u0366"+
|
||||||
"\7I\2\2\u0369\u036a\7W\2\2\u036a\u036b\7K\2\2\u036b\u036c\7F\2\2\u036c"+
|
"\u0367\7[\2\2\u0367\u0368\7G\2\2\u0368\u0369\7C\2\2\u0369\u036a\7T\2\2"+
|
||||||
"\u00c8\3\2\2\2\u036d\u036e\7\177\2\2\u036e\u00ca\3\2\2\2\u036f\u0370\7"+
|
"\u036a\u036b\7U\2\2\u036b\u00c4\3\2\2\2\u036c\u036d\7}\2\2\u036d\u036e"+
|
||||||
"?\2\2\u0370\u00cc\3\2\2\2\u0371\u0372\7>\2\2\u0372\u0373\7?\2\2\u0373"+
|
"\7G\2\2\u036e\u036f\7U\2\2\u036f\u0370\7E\2\2\u0370\u0371\7C\2\2\u0371"+
|
||||||
"\u0374\7@\2\2\u0374\u00ce\3\2\2\2\u0375\u0376\7>\2\2\u0376\u037a\7@\2"+
|
"\u0372\7R\2\2\u0372\u0373\7G\2\2\u0373\u00c6\3\2\2\2\u0374\u0375\7}\2"+
|
||||||
"\2\u0377\u0378\7#\2\2\u0378\u037a\7?\2\2\u0379\u0375\3\2\2\2\u0379\u0377"+
|
"\2\u0375\u0376\7H\2\2\u0376\u0377\7P\2\2\u0377\u00c8\3\2\2\2\u0378\u0379"+
|
||||||
"\3\2\2\2\u037a\u00d0\3\2\2\2\u037b\u037c\7>\2\2\u037c\u00d2\3\2\2\2\u037d"+
|
"\7}\2\2\u0379\u037a\7N\2\2\u037a\u037b\7K\2\2\u037b\u037c\7O\2\2\u037c"+
|
||||||
"\u037e\7>\2\2\u037e\u037f\7?\2\2\u037f\u00d4\3\2\2\2\u0380\u0381\7@\2"+
|
"\u037d\7K\2\2\u037d\u037e\7V\2\2\u037e\u00ca\3\2\2\2\u037f\u0380\7}\2"+
|
||||||
"\2\u0381\u00d6\3\2\2\2\u0382\u0383\7@\2\2\u0383\u0384\7?\2\2\u0384\u00d8"+
|
"\2\u0380\u0381\7F\2\2\u0381\u00cc\3\2\2\2\u0382\u0383\7}\2\2\u0383\u0384"+
|
||||||
"\3\2\2\2\u0385\u0386\7-\2\2\u0386\u00da\3\2\2\2\u0387\u0388\7/\2\2\u0388"+
|
"\7V\2\2\u0384\u00ce\3\2\2\2\u0385\u0386\7}\2\2\u0386\u0387\7V\2\2\u0387"+
|
||||||
"\u00dc\3\2\2\2\u0389\u038a\7,\2\2\u038a\u00de\3\2\2\2\u038b\u038c\7\61"+
|
"\u0388\7U\2\2\u0388\u00d0\3\2\2\2\u0389\u038a\7}\2\2\u038a\u038b\7I\2"+
|
||||||
"\2\2\u038c\u00e0\3\2\2\2\u038d\u038e\7\'\2\2\u038e\u00e2\3\2\2\2\u038f"+
|
"\2\u038b\u038c\7W\2\2\u038c\u038d\7K\2\2\u038d\u038e\7F\2\2\u038e\u00d2"+
|
||||||
"\u0390\7<\2\2\u0390\u0391\7<\2\2\u0391\u00e4\3\2\2\2\u0392\u0393\7~\2"+
|
"\3\2\2\2\u038f\u0390\7\177\2\2\u0390\u00d4\3\2\2\2\u0391\u0392\7?\2\2"+
|
||||||
"\2\u0393\u0394\7~\2\2\u0394\u00e6\3\2\2\2\u0395\u0396\7\60\2\2\u0396\u00e8"+
|
"\u0392\u00d6\3\2\2\2\u0393\u0394\7>\2\2\u0394\u0395\7?\2\2\u0395\u0396"+
|
||||||
"\3\2\2\2\u0397\u0398\7A\2\2\u0398\u00ea\3\2\2\2\u0399\u039f\7)\2\2\u039a"+
|
"\7@\2\2\u0396\u00d8\3\2\2\2\u0397\u0398\7>\2\2\u0398\u039c\7@\2\2\u0399"+
|
||||||
"\u039e\n\2\2\2\u039b\u039c\7)\2\2\u039c\u039e\7)\2\2\u039d\u039a\3\2\2"+
|
"\u039a\7#\2\2\u039a\u039c\7?\2\2\u039b\u0397\3\2\2\2\u039b\u0399\3\2\2"+
|
||||||
"\2\u039d\u039b\3\2\2\2\u039e\u03a1\3\2\2\2\u039f\u039d\3\2\2\2\u039f\u03a0"+
|
"\2\u039c\u00da\3\2\2\2\u039d\u039e\7>\2\2\u039e\u00dc\3\2\2\2\u039f\u03a0"+
|
||||||
"\3\2\2\2\u03a0\u03a2\3\2\2\2\u03a1\u039f\3\2\2\2\u03a2\u03a3\7)\2\2\u03a3"+
|
"\7>\2\2\u03a0\u03a1\7?\2\2\u03a1\u00de\3\2\2\2\u03a2\u03a3\7@\2\2\u03a3"+
|
||||||
"\u00ec\3\2\2\2\u03a4\u03a6\5\u00fd\177\2\u03a5\u03a4\3\2\2\2\u03a6\u03a7"+
|
"\u00e0\3\2\2\2\u03a4\u03a5\7@\2\2\u03a5\u03a6\7?\2\2\u03a6\u00e2\3\2\2"+
|
||||||
"\3\2\2\2\u03a7\u03a5\3\2\2\2\u03a7\u03a8\3\2\2\2\u03a8\u00ee\3\2\2\2\u03a9"+
|
"\2\u03a7\u03a8\7-\2\2\u03a8\u00e4\3\2\2\2\u03a9\u03aa\7/\2\2\u03aa\u00e6"+
|
||||||
"\u03ab\5\u00fd\177\2\u03aa\u03a9\3\2\2\2\u03ab\u03ac\3\2\2\2\u03ac\u03aa"+
|
"\3\2\2\2\u03ab\u03ac\7,\2\2\u03ac\u00e8\3\2\2\2\u03ad\u03ae\7\61\2\2\u03ae"+
|
||||||
"\3\2\2\2\u03ac\u03ad\3\2\2\2\u03ad\u03ae\3\2\2\2\u03ae\u03b2\5\u00e7t"+
|
"\u00ea\3\2\2\2\u03af\u03b0\7\'\2\2\u03b0\u00ec\3\2\2\2\u03b1\u03b2\7<"+
|
||||||
"\2\u03af\u03b1\5\u00fd\177\2\u03b0\u03af\3\2\2\2\u03b1\u03b4\3\2\2\2\u03b2"+
|
"\2\2\u03b2\u03b3\7<\2\2\u03b3\u00ee\3\2\2\2\u03b4\u03b5\7~\2\2\u03b5\u03b6"+
|
||||||
"\u03b0\3\2\2\2\u03b2\u03b3\3\2\2\2\u03b3\u03d4\3\2\2\2\u03b4\u03b2\3\2"+
|
"\7~\2\2\u03b6\u00f0\3\2\2\2\u03b7\u03b8\7\60\2\2\u03b8\u00f2\3\2\2\2\u03b9"+
|
||||||
"\2\2\u03b5\u03b7\5\u00e7t\2\u03b6\u03b8\5\u00fd\177\2\u03b7\u03b6\3\2"+
|
"\u03ba\7A\2\2\u03ba\u00f4\3\2\2\2\u03bb\u03c1\7)\2\2\u03bc\u03c0\n\2\2"+
|
||||||
"\2\2\u03b8\u03b9\3\2\2\2\u03b9\u03b7\3\2\2\2\u03b9\u03ba\3\2\2\2\u03ba"+
|
"\2\u03bd\u03be\7)\2\2\u03be\u03c0\7)\2\2\u03bf\u03bc\3\2\2\2\u03bf\u03bd"+
|
||||||
"\u03d4\3\2\2\2\u03bb\u03bd\5\u00fd\177\2\u03bc\u03bb\3\2\2\2\u03bd\u03be"+
|
"\3\2\2\2\u03c0\u03c3\3\2\2\2\u03c1\u03bf\3\2\2\2\u03c1\u03c2\3\2\2\2\u03c2"+
|
||||||
"\3\2\2\2\u03be\u03bc\3\2\2\2\u03be\u03bf\3\2\2\2\u03bf\u03c7\3\2\2\2\u03c0"+
|
"\u03c4\3\2\2\2\u03c3\u03c1\3\2\2\2\u03c4\u03c5\7)\2\2\u03c5\u00f6\3\2"+
|
||||||
"\u03c4\5\u00e7t\2\u03c1\u03c3\5\u00fd\177\2\u03c2\u03c1\3\2\2\2\u03c3"+
|
"\2\2\u03c6\u03c8\5\u0107\u0084\2\u03c7\u03c6\3\2\2\2\u03c8\u03c9\3\2\2"+
|
||||||
"\u03c6\3\2\2\2\u03c4\u03c2\3\2\2\2\u03c4\u03c5\3\2\2\2\u03c5\u03c8\3\2"+
|
"\2\u03c9\u03c7\3\2\2\2\u03c9\u03ca\3\2\2\2\u03ca\u00f8\3\2\2\2\u03cb\u03cd"+
|
||||||
"\2\2\u03c6\u03c4\3\2\2\2\u03c7\u03c0\3\2\2\2\u03c7\u03c8\3\2\2\2\u03c8"+
|
"\5\u0107\u0084\2\u03cc\u03cb\3\2\2\2\u03cd\u03ce\3\2\2\2\u03ce\u03cc\3"+
|
||||||
"\u03c9\3\2\2\2\u03c9\u03ca\5\u00fb~\2\u03ca\u03d4\3\2\2\2\u03cb\u03cd"+
|
"\2\2\2\u03ce\u03cf\3\2\2\2\u03cf\u03d0\3\2\2\2\u03d0\u03d4\5\u00f1y\2"+
|
||||||
"\5\u00e7t\2\u03cc\u03ce\5\u00fd\177\2\u03cd\u03cc\3\2\2\2\u03ce\u03cf"+
|
"\u03d1\u03d3\5\u0107\u0084\2\u03d2\u03d1\3\2\2\2\u03d3\u03d6\3\2\2\2\u03d4"+
|
||||||
"\3\2\2\2\u03cf\u03cd\3\2\2\2\u03cf\u03d0\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1"+
|
"\u03d2\3\2\2\2\u03d4\u03d5\3\2\2\2\u03d5\u03f6\3\2\2\2\u03d6\u03d4\3\2"+
|
||||||
"\u03d2\5\u00fb~\2\u03d2\u03d4\3\2\2\2\u03d3\u03aa\3\2\2\2\u03d3\u03b5"+
|
"\2\2\u03d7\u03d9\5\u00f1y\2\u03d8\u03da\5\u0107\u0084\2\u03d9\u03d8\3"+
|
||||||
"\3\2\2\2\u03d3\u03bc\3\2\2\2\u03d3\u03cb\3\2\2\2\u03d4\u00f0\3\2\2\2\u03d5"+
|
"\2\2\2\u03da\u03db\3\2\2\2\u03db\u03d9\3\2\2\2\u03db\u03dc\3\2\2\2\u03dc"+
|
||||||
"\u03d8\5\u00ff\u0080\2\u03d6\u03d8\7a\2\2\u03d7\u03d5\3\2\2\2\u03d7\u03d6"+
|
"\u03f6\3\2\2\2\u03dd\u03df\5\u0107\u0084\2\u03de\u03dd\3\2\2\2\u03df\u03e0"+
|
||||||
"\3\2\2\2\u03d8\u03de\3\2\2\2\u03d9\u03dd\5\u00ff\u0080\2\u03da\u03dd\5"+
|
"\3\2\2\2\u03e0\u03de\3\2\2\2\u03e0\u03e1\3\2\2\2\u03e1\u03e9\3\2\2\2\u03e2"+
|
||||||
"\u00fd\177\2\u03db\u03dd\t\3\2\2\u03dc\u03d9\3\2\2\2\u03dc\u03da\3\2\2"+
|
"\u03e6\5\u00f1y\2\u03e3\u03e5\5\u0107\u0084\2\u03e4\u03e3\3\2\2\2\u03e5"+
|
||||||
"\2\u03dc\u03db\3\2\2\2\u03dd\u03e0\3\2\2\2\u03de\u03dc\3\2\2\2\u03de\u03df"+
|
"\u03e8\3\2\2\2\u03e6\u03e4\3\2\2\2\u03e6\u03e7\3\2\2\2\u03e7\u03ea\3\2"+
|
||||||
"\3\2\2\2\u03df\u00f2\3\2\2\2\u03e0\u03de\3\2\2\2\u03e1\u03e5\5\u00fd\177"+
|
"\2\2\u03e8\u03e6\3\2\2\2\u03e9\u03e2\3\2\2\2\u03e9\u03ea\3\2\2\2\u03ea"+
|
||||||
"\2\u03e2\u03e6\5\u00ff\u0080\2\u03e3\u03e6\5\u00fd\177\2\u03e4\u03e6\t"+
|
"\u03eb\3\2\2\2\u03eb\u03ec\5\u0105\u0083\2\u03ec\u03f6\3\2\2\2\u03ed\u03ef"+
|
||||||
"\3\2\2\u03e5\u03e2\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5\u03e4\3\2\2\2\u03e6"+
|
"\5\u00f1y\2\u03ee\u03f0\5\u0107\u0084\2\u03ef\u03ee\3\2\2\2\u03f0\u03f1"+
|
||||||
"\u03e7\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e7\u03e8\3\2\2\2\u03e8\u00f4\3\2"+
|
"\3\2\2\2\u03f1\u03ef\3\2\2\2\u03f1\u03f2\3\2\2\2\u03f2\u03f3\3\2\2\2\u03f3"+
|
||||||
"\2\2\u03e9\u03ed\5\u00ff\u0080\2\u03ea\u03ed\5\u00fd\177\2\u03eb\u03ed"+
|
"\u03f4\5\u0105\u0083\2\u03f4\u03f6\3\2\2\2\u03f5\u03cc\3\2\2\2\u03f5\u03d7"+
|
||||||
"\7a\2\2\u03ec\u03e9\3\2\2\2\u03ec\u03ea\3\2\2\2\u03ec\u03eb\3\2\2\2\u03ed"+
|
"\3\2\2\2\u03f5\u03de\3\2\2\2\u03f5\u03ed\3\2\2\2\u03f6\u00fa\3\2\2\2\u03f7"+
|
||||||
"\u03ee\3\2\2\2\u03ee\u03ec\3\2\2\2\u03ee\u03ef\3\2\2\2\u03ef\u00f6\3\2"+
|
"\u03fa\5\u0109\u0085\2\u03f8\u03fa\7a\2\2\u03f9\u03f7\3\2\2\2\u03f9\u03f8"+
|
||||||
"\2\2\u03f0\u03f6\7$\2\2\u03f1\u03f5\n\4\2\2\u03f2\u03f3\7$\2\2\u03f3\u03f5"+
|
"\3\2\2\2\u03fa\u0400\3\2\2\2\u03fb\u03ff\5\u0109\u0085\2\u03fc\u03ff\5"+
|
||||||
"\7$\2\2\u03f4\u03f1\3\2\2\2\u03f4\u03f2\3\2\2\2\u03f5\u03f8\3\2\2\2\u03f6"+
|
"\u0107\u0084\2\u03fd\u03ff\t\3\2\2\u03fe\u03fb\3\2\2\2\u03fe\u03fc\3\2"+
|
||||||
"\u03f4\3\2\2\2\u03f6\u03f7\3\2\2\2\u03f7\u03f9\3\2\2\2\u03f8\u03f6\3\2"+
|
"\2\2\u03fe\u03fd\3\2\2\2\u03ff\u0402\3\2\2\2\u0400\u03fe\3\2\2\2\u0400"+
|
||||||
"\2\2\u03f9\u03fa\7$\2\2\u03fa\u00f8\3\2\2\2\u03fb\u0401\7b\2\2\u03fc\u0400"+
|
"\u0401\3\2\2\2\u0401\u00fc\3\2\2\2\u0402\u0400\3\2\2\2\u0403\u0407\5\u0107"+
|
||||||
"\n\5\2\2\u03fd\u03fe\7b\2\2\u03fe\u0400\7b\2\2\u03ff\u03fc\3\2\2\2\u03ff"+
|
"\u0084\2\u0404\u0408\5\u0109\u0085\2\u0405\u0408\5\u0107\u0084\2\u0406"+
|
||||||
"\u03fd\3\2\2\2\u0400\u0403\3\2\2\2\u0401\u03ff\3\2\2\2\u0401\u0402\3\2"+
|
"\u0408\t\3\2\2\u0407\u0404\3\2\2\2\u0407\u0405\3\2\2\2\u0407\u0406\3\2"+
|
||||||
"\2\2\u0402\u0404\3\2\2\2\u0403\u0401\3\2\2\2\u0404\u0405\7b\2\2\u0405"+
|
"\2\2\u0408\u0409\3\2\2\2\u0409\u0407\3\2\2\2\u0409\u040a\3\2\2\2\u040a"+
|
||||||
"\u00fa\3\2\2\2\u0406\u0408\7G\2\2\u0407\u0409\t\6\2\2\u0408\u0407\3\2"+
|
"\u00fe\3\2\2\2\u040b\u040f\5\u0109\u0085\2\u040c\u040f\5\u0107\u0084\2"+
|
||||||
"\2\2\u0408\u0409\3\2\2\2\u0409\u040b\3\2\2\2\u040a\u040c\5\u00fd\177\2"+
|
"\u040d\u040f\7a\2\2\u040e\u040b\3\2\2\2\u040e\u040c\3\2\2\2\u040e\u040d"+
|
||||||
"\u040b\u040a\3\2\2\2\u040c\u040d\3\2\2\2\u040d\u040b\3\2\2\2\u040d\u040e"+
|
"\3\2\2\2\u040f\u0410\3\2\2\2\u0410\u040e\3\2\2\2\u0410\u0411\3\2\2\2\u0411"+
|
||||||
"\3\2\2\2\u040e\u00fc\3\2\2\2\u040f\u0410\t\7\2\2\u0410\u00fe\3\2\2\2\u0411"+
|
"\u0100\3\2\2\2\u0412\u0418\7$\2\2\u0413\u0417\n\4\2\2\u0414\u0415\7$\2"+
|
||||||
"\u0412\t\b\2\2\u0412\u0100\3\2\2\2\u0413\u0414\7/\2\2\u0414\u0415\7/\2"+
|
"\2\u0415\u0417\7$\2\2\u0416\u0413\3\2\2\2\u0416\u0414\3\2\2\2\u0417\u041a"+
|
||||||
"\2\u0415\u0419\3\2\2\2\u0416\u0418\n\t\2\2\u0417\u0416\3\2\2\2\u0418\u041b"+
|
"\3\2\2\2\u0418\u0416\3\2\2\2\u0418\u0419\3\2\2\2\u0419\u041b\3\2\2\2\u041a"+
|
||||||
"\3\2\2\2\u0419\u0417\3\2\2\2\u0419\u041a\3\2\2\2\u041a\u041d\3\2\2\2\u041b"+
|
"\u0418\3\2\2\2\u041b\u041c\7$\2\2\u041c\u0102\3\2\2\2\u041d\u0423\7b\2"+
|
||||||
"\u0419\3\2\2\2\u041c\u041e\7\17\2\2\u041d\u041c\3\2\2\2\u041d\u041e\3"+
|
"\2\u041e\u0422\n\5\2\2\u041f\u0420\7b\2\2\u0420\u0422\7b\2\2\u0421\u041e"+
|
||||||
"\2\2\2\u041e\u0420\3\2\2\2\u041f\u0421\7\f\2\2\u0420\u041f\3\2\2\2\u0420"+
|
"\3\2\2\2\u0421\u041f\3\2\2\2\u0422\u0425\3\2\2\2\u0423\u0421\3\2\2\2\u0423"+
|
||||||
"\u0421\3\2\2\2\u0421\u0422\3\2\2\2\u0422\u0423\b\u0081\2\2\u0423\u0102"+
|
"\u0424\3\2\2\2\u0424\u0426\3\2\2\2\u0425\u0423\3\2\2\2\u0426\u0427\7b"+
|
||||||
"\3\2\2\2\u0424\u0425\7\61\2\2\u0425\u0426\7,\2\2\u0426\u042b\3\2\2\2\u0427"+
|
"\2\2\u0427\u0104\3\2\2\2\u0428\u042a\7G\2\2\u0429\u042b\t\6\2\2\u042a"+
|
||||||
"\u042a\5\u0103\u0082\2\u0428\u042a\13\2\2\2\u0429\u0427\3\2\2\2\u0429"+
|
"\u0429\3\2\2\2\u042a\u042b\3\2\2\2\u042b\u042d\3\2\2\2\u042c\u042e\5\u0107"+
|
||||||
"\u0428\3\2\2\2\u042a\u042d\3\2\2\2\u042b\u042c\3\2\2\2\u042b\u0429\3\2"+
|
"\u0084\2\u042d\u042c\3\2\2\2\u042e\u042f\3\2\2\2\u042f\u042d\3\2\2\2\u042f"+
|
||||||
"\2\2\u042c\u042e\3\2\2\2\u042d\u042b\3\2\2\2\u042e\u042f\7,\2\2\u042f"+
|
"\u0430\3\2\2\2\u0430\u0106\3\2\2\2\u0431\u0432\t\7\2\2\u0432\u0108\3\2"+
|
||||||
"\u0430\7\61\2\2\u0430\u0431\3\2\2\2\u0431\u0432\b\u0082\2\2\u0432\u0104"+
|
"\2\2\u0433\u0434\t\b\2\2\u0434\u010a\3\2\2\2\u0435\u0436\7/\2\2\u0436"+
|
||||||
"\3\2\2\2\u0433\u0435\t\n\2\2\u0434\u0433\3\2\2\2\u0435\u0436\3\2\2\2\u0436"+
|
"\u0437\7/\2\2\u0437\u043b\3\2\2\2\u0438\u043a\n\t\2\2\u0439\u0438\3\2"+
|
||||||
"\u0434\3\2\2\2\u0436\u0437\3\2\2\2\u0437\u0438\3\2\2\2\u0438\u0439\b\u0083"+
|
"\2\2\u043a\u043d\3\2\2\2\u043b\u0439\3\2\2\2\u043b\u043c\3\2\2\2\u043c"+
|
||||||
"\2\2\u0439\u0106\3\2\2\2\u043a\u043b\13\2\2\2\u043b\u0108\3\2\2\2\"\2"+
|
"\u043f\3\2\2\2\u043d\u043b\3\2\2\2\u043e\u0440\7\17\2\2\u043f\u043e\3"+
|
||||||
"\u0379\u039d\u039f\u03a7\u03ac\u03b2\u03b9\u03be\u03c4\u03c7\u03cf\u03d3"+
|
"\2\2\2\u043f\u0440\3\2\2\2\u0440\u0442\3\2\2\2\u0441\u0443\7\f\2\2\u0442"+
|
||||||
"\u03d7\u03dc\u03de\u03e5\u03e7\u03ec\u03ee\u03f4\u03f6\u03ff\u0401\u0408"+
|
"\u0441\3\2\2\2\u0442\u0443\3\2\2\2\u0443\u0444\3\2\2\2\u0444\u0445\b\u0086"+
|
||||||
"\u040d\u0419\u041d\u0420\u0429\u042b\u0436\3\2\3\2";
|
"\2\2\u0445\u010c\3\2\2\2\u0446\u0447\7\61\2\2\u0447\u0448\7,\2\2\u0448"+
|
||||||
|
"\u044d\3\2\2\2\u0449\u044c\5\u010d\u0087\2\u044a\u044c\13\2\2\2\u044b"+
|
||||||
|
"\u0449\3\2\2\2\u044b\u044a\3\2\2\2\u044c\u044f\3\2\2\2\u044d\u044e\3\2"+
|
||||||
|
"\2\2\u044d\u044b\3\2\2\2\u044e\u0450\3\2\2\2\u044f\u044d\3\2\2\2\u0450"+
|
||||||
|
"\u0451\7,\2\2\u0451\u0452\7\61\2\2\u0452\u0453\3\2\2\2\u0453\u0454\b\u0087"+
|
||||||
|
"\2\2\u0454\u010e\3\2\2\2\u0455\u0457\t\n\2\2\u0456\u0455\3\2\2\2\u0457"+
|
||||||
|
"\u0458\3\2\2\2\u0458\u0456\3\2\2\2\u0458\u0459\3\2\2\2\u0459\u045a\3\2"+
|
||||||
|
"\2\2\u045a\u045b\b\u0088\2\2\u045b\u0110\3\2\2\2\u045c\u045d\13\2\2\2"+
|
||||||
|
"\u045d\u0112\3\2\2\2\"\2\u039b\u03bf\u03c1\u03c9\u03ce\u03d4\u03db\u03e0"+
|
||||||
|
"\u03e6\u03e9\u03f1\u03f5\u03f9\u03fe\u0400\u0407\u0409\u040e\u0410\u0416"+
|
||||||
|
"\u0418\u0421\u0423\u042a\u042f\u043b\u043f\u0442\u044b\u044d\u0458\3\2"+
|
||||||
|
"\3\2";
|
||||||
public static final ATN _ATN =
|
public static final ATN _ATN =
|
||||||
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
|
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
|
||||||
static {
|
static {
|
||||||
|
|
|
@ -693,6 +693,18 @@ interface SqlBaseListener extends ParseTreeListener {
|
||||||
* @param ctx the parse tree
|
* @param ctx the parse tree
|
||||||
*/
|
*/
|
||||||
void exitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx);
|
void exitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx);
|
||||||
|
/**
|
||||||
|
* Enter a parse tree produced by the {@code case}
|
||||||
|
* labeled alternative in {@link SqlBaseParser#primaryExpression}.
|
||||||
|
* @param ctx the parse tree
|
||||||
|
*/
|
||||||
|
void enterCase(SqlBaseParser.CaseContext ctx);
|
||||||
|
/**
|
||||||
|
* Exit a parse tree produced by the {@code case}
|
||||||
|
* labeled alternative in {@link SqlBaseParser#primaryExpression}.
|
||||||
|
* @param ctx the parse tree
|
||||||
|
*/
|
||||||
|
void exitCase(SqlBaseParser.CaseContext ctx);
|
||||||
/**
|
/**
|
||||||
* Enter a parse tree produced by {@link SqlBaseParser#builtinDateTimeFunction}.
|
* Enter a parse tree produced by {@link SqlBaseParser#builtinDateTimeFunction}.
|
||||||
* @param ctx the parse tree
|
* @param ctx the parse tree
|
||||||
|
@ -1067,6 +1079,16 @@ interface SqlBaseListener extends ParseTreeListener {
|
||||||
* @param ctx the parse tree
|
* @param ctx the parse tree
|
||||||
*/
|
*/
|
||||||
void exitString(SqlBaseParser.StringContext ctx);
|
void exitString(SqlBaseParser.StringContext ctx);
|
||||||
|
/**
|
||||||
|
* Enter a parse tree produced by {@link SqlBaseParser#whenClause}.
|
||||||
|
* @param ctx the parse tree
|
||||||
|
*/
|
||||||
|
void enterWhenClause(SqlBaseParser.WhenClauseContext ctx);
|
||||||
|
/**
|
||||||
|
* Exit a parse tree produced by {@link SqlBaseParser#whenClause}.
|
||||||
|
* @param ctx the parse tree
|
||||||
|
*/
|
||||||
|
void exitWhenClause(SqlBaseParser.WhenClauseContext ctx);
|
||||||
/**
|
/**
|
||||||
* Enter a parse tree produced by {@link SqlBaseParser#nonReserved}.
|
* Enter a parse tree produced by {@link SqlBaseParser#nonReserved}.
|
||||||
* @param ctx the parse tree
|
* @param ctx the parse tree
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -414,6 +414,13 @@ interface SqlBaseVisitor<T> extends ParseTreeVisitor<T> {
|
||||||
* @return the visitor result
|
* @return the visitor result
|
||||||
*/
|
*/
|
||||||
T visitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx);
|
T visitSubqueryExpression(SqlBaseParser.SubqueryExpressionContext ctx);
|
||||||
|
/**
|
||||||
|
* Visit a parse tree produced by the {@code case}
|
||||||
|
* labeled alternative in {@link SqlBaseParser#primaryExpression}.
|
||||||
|
* @param ctx the parse tree
|
||||||
|
* @return the visitor result
|
||||||
|
*/
|
||||||
|
T visitCase(SqlBaseParser.CaseContext ctx);
|
||||||
/**
|
/**
|
||||||
* Visit a parse tree produced by {@link SqlBaseParser#builtinDateTimeFunction}.
|
* Visit a parse tree produced by {@link SqlBaseParser#builtinDateTimeFunction}.
|
||||||
* @param ctx the parse tree
|
* @param ctx the parse tree
|
||||||
|
@ -635,6 +642,12 @@ interface SqlBaseVisitor<T> extends ParseTreeVisitor<T> {
|
||||||
* @return the visitor result
|
* @return the visitor result
|
||||||
*/
|
*/
|
||||||
T visitString(SqlBaseParser.StringContext ctx);
|
T visitString(SqlBaseParser.StringContext ctx);
|
||||||
|
/**
|
||||||
|
* Visit a parse tree produced by {@link SqlBaseParser#whenClause}.
|
||||||
|
* @param ctx the parse tree
|
||||||
|
* @return the visitor result
|
||||||
|
*/
|
||||||
|
T visitWhenClause(SqlBaseParser.WhenClauseContext ctx);
|
||||||
/**
|
/**
|
||||||
* Visit a parse tree produced by {@link SqlBaseParser#nonReserved}.
|
* Visit a parse tree produced by {@link SqlBaseParser#nonReserved}.
|
||||||
* @param ctx the parse tree
|
* @param ctx the parse tree
|
||||||
|
|
|
@ -47,8 +47,9 @@ class org.elasticsearch.xpack.sql.expression.function.scalar.whitelist.InternalS
|
||||||
Boolean isNotNull(Object)
|
Boolean isNotNull(Object)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Null
|
# Conditional
|
||||||
#
|
#
|
||||||
|
def caseFunction(java.util.List)
|
||||||
def coalesce(java.util.List)
|
def coalesce(java.util.List)
|
||||||
def greatest(java.util.List)
|
def greatest(java.util.List)
|
||||||
def least(java.util.List)
|
def least(java.util.List)
|
||||||
|
|
|
@ -598,6 +598,26 @@ public class VerifierErrorMessagesTests extends ESTestCase {
|
||||||
error("SELECT 1 = 1 OR " + arbirtraryArgsFunction + "(null, 3, '4') > 1"));
|
error("SELECT 1 = 1 OR " + arbirtraryArgsFunction + "(null, 3, '4') > 1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testCaseWithNonBooleanConditionExpression() {
|
||||||
|
assertEquals("1:8: condition of [WHEN abs(int) THEN 'foo'] must be [boolean], found value [abs(int)] type [integer]",
|
||||||
|
error("SELECT CASE WHEN int = 1 THEN 'one' WHEN abs(int) THEN 'foo' END FROM test"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCaseWithDifferentResultDataTypes() {
|
||||||
|
assertEquals("1:8: result of [WHEN int > 10 THEN 10] must be [keyword], found value [10] type [integer]",
|
||||||
|
error("SELECT CASE WHEN int > 20 THEN 'foo' WHEN int > 10 THEN 10 ELSE 'bar' END FROM test"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCaseWithDifferentResultAndDefaultValueDataTypes() {
|
||||||
|
assertEquals("1:8: ELSE clause of [date] must be [keyword], found value [date] type [datetime]",
|
||||||
|
error("SELECT CASE WHEN int > 20 THEN 'foo' ELSE date END FROM test"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCaseWithDifferentResultAndDefaultValueDataTypesAndNullTypesSkipped() {
|
||||||
|
assertEquals("1:8: ELSE clause of [date] must be [keyword], found value [date] type [datetime]",
|
||||||
|
error("SELECT CASE WHEN int > 20 THEN null WHEN int > 10 THEN null WHEN int > 5 THEN 'foo' ELSE date END FROM test"));
|
||||||
|
}
|
||||||
|
|
||||||
public void testAggsInWhere() {
|
public void testAggsInWhere() {
|
||||||
assertEquals("1:33: Cannot use WHERE filtering on aggregate function [MAX(int)], use HAVING instead",
|
assertEquals("1:33: Cannot use WHERE filtering on aggregate function [MAX(int)], use HAVING instead",
|
||||||
error("SELECT MAX(int) FROM test WHERE MAX(int) > 10 GROUP BY bool"));
|
error("SELECT MAX(int) FROM test WHERE MAX(int) > 10 GROUP BY bool"));
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License;
|
||||||
|
* you may not use this file except in compliance with the Elastic License.
|
||||||
|
*/
|
||||||
|
package org.elasticsearch.xpack.sql.expression.predicate.conditional;
|
||||||
|
|
||||||
|
import org.elasticsearch.xpack.sql.expression.Expression;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.Equals;
|
||||||
|
import org.elasticsearch.xpack.sql.tree.AbstractNodeTestCase;
|
||||||
|
import org.elasticsearch.xpack.sql.tree.NodeSubclassTests;
|
||||||
|
import org.elasticsearch.xpack.sql.tree.Source;
|
||||||
|
import org.elasticsearch.xpack.sql.tree.SourceTests;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomIntLiteral;
|
||||||
|
import static org.elasticsearch.xpack.sql.expression.function.scalar.FunctionTestUtils.randomStringLiteral;
|
||||||
|
import static org.elasticsearch.xpack.sql.tree.SourceTests.randomSource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Needed to override tests in {@link NodeSubclassTests} as Case is special since its children are not usual
|
||||||
|
* expressions but {@link IfConditional}s.
|
||||||
|
*/
|
||||||
|
public class CaseTests extends AbstractNodeTestCase<Case, Expression> {
|
||||||
|
|
||||||
|
public static Case randomCase() {
|
||||||
|
int noConditionals = randomIntBetween(1, 5);
|
||||||
|
List<Expression> expressions = new ArrayList<>(noConditionals + 1);
|
||||||
|
for (int i = 0; i < noConditionals; i++) {
|
||||||
|
expressions.add(new IfConditional(
|
||||||
|
randomSource(), new Equals(randomSource(), randomStringLiteral(), randomStringLiteral()), randomIntLiteral()));
|
||||||
|
|
||||||
|
}
|
||||||
|
// default else
|
||||||
|
expressions.add(randomIntLiteral());
|
||||||
|
return new Case(randomSource(), expressions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Case randomInstance() {
|
||||||
|
return randomCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Case mutate(Case instance) {
|
||||||
|
Case c = randomCase();
|
||||||
|
return new Case(c.source(), mutateChildren(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Case copy(Case instance) {
|
||||||
|
return new Case(instance.source(), instance.children());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testTransform() {
|
||||||
|
Case c = randomCase();
|
||||||
|
|
||||||
|
Source newSource = randomValueOtherThan(c.source(), SourceTests::randomSource);
|
||||||
|
assertEquals(new Case(c.source(), c.children()),
|
||||||
|
c.transformPropertiesOnly(p -> Objects.equals(p, c.source()) ? newSource: p, Object.class));
|
||||||
|
|
||||||
|
String newName = randomValueOtherThan(c.name(), () -> randomAlphaOfLength(5));
|
||||||
|
assertEquals(new Case(c.source(), c.children()),
|
||||||
|
c.transformPropertiesOnly(p -> Objects.equals(p, c.name()) ? newName : p, Object.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testReplaceChildren() {
|
||||||
|
Case c = randomCase();
|
||||||
|
|
||||||
|
List<Expression> newChildren = mutateChildren(c);
|
||||||
|
assertEquals(new Case(c.source(), newChildren), c.replaceChildren(newChildren));
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Expression> mutateChildren(Case c) {
|
||||||
|
boolean removeConditional = randomBoolean();
|
||||||
|
List<Expression> expressions = new ArrayList<>(c.children().size());
|
||||||
|
if (removeConditional) {
|
||||||
|
expressions.addAll(c.children().subList(0, c.children().size() - 2));
|
||||||
|
} else {
|
||||||
|
int rndIdx = randomInt(c.conditions().size());
|
||||||
|
for (int i = 0; i < c.conditions().size(); i++) {
|
||||||
|
if (i == rndIdx) {
|
||||||
|
expressions.add(new IfConditional(randomValueOtherThan(c.conditions().get(i).source(), SourceTests::randomSource),
|
||||||
|
new Equals(randomSource(), randomStringLiteral(), randomStringLiteral()),
|
||||||
|
randomValueOtherThan(c.conditions().get(i).condition(), FunctionTestUtils::randomStringLiteral)));
|
||||||
|
} else {
|
||||||
|
expressions.add(c.conditions().get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expressions.add(c.defaultElse());
|
||||||
|
return expressions;
|
||||||
|
}
|
||||||
|
}
|
|
@ -44,9 +44,11 @@ import org.elasticsearch.xpack.sql.expression.function.scalar.string.Repeat;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator;
|
import org.elasticsearch.xpack.sql.expression.predicate.BinaryOperator;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.Range;
|
import org.elasticsearch.xpack.sql.expression.predicate.Range;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.ArbitraryConditionalFunction;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.ArbitraryConditionalFunction;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Case;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Coalesce;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Coalesce;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.ConditionalFunction;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.ConditionalFunction;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Greatest;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Greatest;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.IfConditional;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.IfNull;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.IfNull;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Least;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Least;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.NullIf;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.NullIf;
|
||||||
|
@ -112,9 +114,12 @@ import static org.elasticsearch.xpack.sql.expression.Literal.FALSE;
|
||||||
import static org.elasticsearch.xpack.sql.expression.Literal.NULL;
|
import static org.elasticsearch.xpack.sql.expression.Literal.NULL;
|
||||||
import static org.elasticsearch.xpack.sql.expression.Literal.TRUE;
|
import static org.elasticsearch.xpack.sql.expression.Literal.TRUE;
|
||||||
import static org.elasticsearch.xpack.sql.expression.Literal.of;
|
import static org.elasticsearch.xpack.sql.expression.Literal.of;
|
||||||
|
import static org.elasticsearch.xpack.sql.optimizer.Optimizer.SimplifyCase;
|
||||||
|
import static org.elasticsearch.xpack.sql.optimizer.Optimizer.SortAggregateOnOrderBy;
|
||||||
import static org.elasticsearch.xpack.sql.tree.Source.EMPTY;
|
import static org.elasticsearch.xpack.sql.tree.Source.EMPTY;
|
||||||
import static org.elasticsearch.xpack.sql.util.DateUtils.UTC;
|
import static org.elasticsearch.xpack.sql.util.DateUtils.UTC;
|
||||||
import static org.hamcrest.Matchers.contains;
|
import static org.hamcrest.Matchers.contains;
|
||||||
|
import static org.hamcrest.Matchers.startsWith;
|
||||||
|
|
||||||
public class OptimizerTests extends ESTestCase {
|
public class OptimizerTests extends ESTestCase {
|
||||||
|
|
||||||
|
@ -595,6 +600,91 @@ public class OptimizerTests extends ESTestCase {
|
||||||
assertEquals(StringUtils.EMPTY, foldNull.rule(new Concat(EMPTY, NULL, NULL)).fold());
|
assertEquals(StringUtils.EMPTY, foldNull.rule(new Concat(EMPTY, NULL, NULL)).fold());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testSimplifyCaseConditionsFoldWhenFalse() {
|
||||||
|
// CASE WHEN a = 1 THEN 'foo1'
|
||||||
|
// WHEN 1 = 2 THEN 'bar1'
|
||||||
|
// WHEN 2 = 1 THEN 'bar2'
|
||||||
|
// WHEN a > 1 THEN 'foo2'
|
||||||
|
// ELSE 'default'
|
||||||
|
// END
|
||||||
|
//
|
||||||
|
// ==>
|
||||||
|
//
|
||||||
|
// CASE WHEN a = 1 THEN 'foo1'
|
||||||
|
// WHEN a > 1 THEN 'foo2'
|
||||||
|
// ELSE 'default'
|
||||||
|
// END
|
||||||
|
|
||||||
|
Case c = new Case(EMPTY, Arrays.asList(
|
||||||
|
new IfConditional(EMPTY, new Equals(EMPTY, getFieldAttribute(), ONE), Literal.of(EMPTY, "foo1")),
|
||||||
|
new IfConditional(EMPTY, new Equals(EMPTY, ONE, TWO), Literal.of(EMPTY, "bar1")),
|
||||||
|
new IfConditional(EMPTY, new Equals(EMPTY, TWO, ONE), Literal.of(EMPTY, "bar2")),
|
||||||
|
new IfConditional(EMPTY, new GreaterThan(EMPTY, getFieldAttribute(), ONE), Literal.of(EMPTY, "foo2")),
|
||||||
|
Literal.of(EMPTY, "default")));
|
||||||
|
Expression e = new SimplifyCase().rule(c);
|
||||||
|
assertEquals(Case.class, e.getClass());
|
||||||
|
c = (Case) e;
|
||||||
|
assertEquals(2, c.conditions().size());
|
||||||
|
assertThat(c.conditions().get(0).condition().toString(), startsWith("Equals[a{f}#"));
|
||||||
|
assertThat(c.conditions().get(1).condition().toString(), startsWith("GreaterThan[a{f}#"));
|
||||||
|
assertFalse(c.foldable());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSimplifyCaseConditionsFoldWhenTrue() {
|
||||||
|
// CASE WHEN a = 1 THEN 'foo1'
|
||||||
|
// WHEN 1 = 1 THEN 'bar1'
|
||||||
|
// WHEN 2 = 1 THEN 'bar2'
|
||||||
|
// WHEN a > 1 THEN 'foo2'
|
||||||
|
// ELSE 'default'
|
||||||
|
// END
|
||||||
|
//
|
||||||
|
// ==>
|
||||||
|
//
|
||||||
|
// CASE WHEN a = 1 THEN 'foo1'
|
||||||
|
// WHEN 1 = 1 THEN 'bar1'
|
||||||
|
// ELSE 'default'
|
||||||
|
// END
|
||||||
|
|
||||||
|
SimplifyCase rule = new SimplifyCase();
|
||||||
|
Case c = new Case(EMPTY, Arrays.asList(
|
||||||
|
new IfConditional(EMPTY, new Equals(EMPTY, getFieldAttribute(), ONE), Literal.of(EMPTY, "foo1")),
|
||||||
|
new IfConditional(EMPTY, new Equals(EMPTY, ONE, ONE), Literal.of(EMPTY, "bar1")),
|
||||||
|
new IfConditional(EMPTY, new Equals(EMPTY, TWO, ONE), Literal.of(EMPTY, "bar2")),
|
||||||
|
new IfConditional(EMPTY, new GreaterThan(EMPTY, getFieldAttribute(), ONE), Literal.of(EMPTY, "foo2")),
|
||||||
|
Literal.of(EMPTY, "default")));
|
||||||
|
Expression e = rule.rule(c);
|
||||||
|
assertEquals(Case.class, e.getClass());
|
||||||
|
c = (Case) e;
|
||||||
|
assertEquals(2, c.conditions().size());
|
||||||
|
assertThat(c.conditions().get(0).condition().toString(), startsWith("Equals[a{f}#"));
|
||||||
|
assertThat(c.conditions().get(1).condition().toString(), startsWith("Equals[=1,=1]#"));
|
||||||
|
assertFalse(c.foldable());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSimplifyCaseConditionsFoldCompletely() {
|
||||||
|
// CASE WHEN 1 = 2 THEN 'foo1'
|
||||||
|
// WHEN 1 = 1 THEN 'foo2'
|
||||||
|
// ELSE 'default'
|
||||||
|
// END
|
||||||
|
//
|
||||||
|
// ==>
|
||||||
|
//
|
||||||
|
// 'foo2'
|
||||||
|
|
||||||
|
SimplifyCase rule = new SimplifyCase();
|
||||||
|
Case c = new Case(EMPTY, Arrays.asList(
|
||||||
|
new IfConditional(EMPTY, new Equals(EMPTY, ONE, TWO), Literal.of(EMPTY, "foo1")),
|
||||||
|
new IfConditional(EMPTY, new Equals(EMPTY, ONE, ONE), Literal.of(EMPTY, "foo2")),
|
||||||
|
Literal.of(EMPTY, "default")));
|
||||||
|
Expression e = rule.rule(c);
|
||||||
|
assertEquals(Case.class, e.getClass());
|
||||||
|
c = (Case) e;
|
||||||
|
assertEquals(1, c.conditions().size());
|
||||||
|
assertThat(c.conditions().get(0).condition().toString(), startsWith("Equals[=1,=1]#"));
|
||||||
|
assertTrue(c.foldable());
|
||||||
|
assertEquals("foo2", c.fold());
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Logical simplifications
|
// Logical simplifications
|
||||||
//
|
//
|
||||||
|
@ -1318,7 +1408,7 @@ public class OptimizerTests extends ESTestCase {
|
||||||
OrderBy orderByPlan = new OrderBy(EMPTY,
|
OrderBy orderByPlan = new OrderBy(EMPTY,
|
||||||
new Aggregate(EMPTY, FROM(), Arrays.asList(secondField, firstField), Arrays.asList(secondAlias, firstAlias)),
|
new Aggregate(EMPTY, FROM(), Arrays.asList(secondField, firstField), Arrays.asList(secondAlias, firstAlias)),
|
||||||
Arrays.asList(firstOrderBy, secondOrderBy));
|
Arrays.asList(firstOrderBy, secondOrderBy));
|
||||||
LogicalPlan result = new Optimizer.SortAggregateOnOrderBy().apply(orderByPlan);
|
LogicalPlan result = new SortAggregateOnOrderBy().apply(orderByPlan);
|
||||||
|
|
||||||
assertTrue(result instanceof OrderBy);
|
assertTrue(result instanceof OrderBy);
|
||||||
List<Order> order = ((OrderBy) result).order();
|
List<Order> order = ((OrderBy) result).order();
|
||||||
|
@ -1350,7 +1440,7 @@ public class OptimizerTests extends ESTestCase {
|
||||||
OrderBy orderByPlan = new OrderBy(EMPTY,
|
OrderBy orderByPlan = new OrderBy(EMPTY,
|
||||||
new Aggregate(EMPTY, FROM(), Arrays.asList(secondAlias, firstAlias), Arrays.asList(secondAlias, firstAlias)),
|
new Aggregate(EMPTY, FROM(), Arrays.asList(secondAlias, firstAlias), Arrays.asList(secondAlias, firstAlias)),
|
||||||
Arrays.asList(firstOrderBy, secondOrderBy));
|
Arrays.asList(firstOrderBy, secondOrderBy));
|
||||||
LogicalPlan result = new Optimizer.SortAggregateOnOrderBy().apply(orderByPlan);
|
LogicalPlan result = new SortAggregateOnOrderBy().apply(orderByPlan);
|
||||||
|
|
||||||
assertTrue(result instanceof OrderBy);
|
assertTrue(result instanceof OrderBy);
|
||||||
List<Order> order = ((OrderBy) result).order();
|
List<Order> order = ((OrderBy) result).order();
|
||||||
|
|
|
@ -11,6 +11,8 @@ import org.elasticsearch.xpack.sql.expression.Literal;
|
||||||
import org.elasticsearch.xpack.sql.expression.function.UnresolvedFunction;
|
import org.elasticsearch.xpack.sql.expression.function.UnresolvedFunction;
|
||||||
import org.elasticsearch.xpack.sql.expression.function.scalar.Cast;
|
import org.elasticsearch.xpack.sql.expression.function.scalar.Cast;
|
||||||
import org.elasticsearch.xpack.sql.expression.literal.Interval;
|
import org.elasticsearch.xpack.sql.expression.literal.Interval;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.Case;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.IfConditional;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Add;
|
import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Add;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Mul;
|
import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Mul;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Neg;
|
import org.elasticsearch.xpack.sql.expression.predicate.operator.arithmetic.Neg;
|
||||||
|
@ -26,6 +28,7 @@ import java.time.temporal.TemporalAmount;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
import static java.lang.String.format;
|
import static java.lang.String.format;
|
||||||
|
import static org.hamcrest.Matchers.startsWith;
|
||||||
|
|
||||||
public class ExpressionTests extends ESTestCase {
|
public class ExpressionTests extends ESTestCase {
|
||||||
|
|
||||||
|
@ -447,4 +450,63 @@ public class ExpressionTests extends ESTestCase {
|
||||||
Expression expr = parser.createExpression(s);
|
Expression expr = parser.createExpression(s);
|
||||||
assertEquals(s, expr.sourceText());
|
assertEquals(s, expr.sourceText());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testCaseWithoutOperand() {
|
||||||
|
Expression expr = parser.createExpression(
|
||||||
|
"CASE WHEN a = 1 THEN 'one'" +
|
||||||
|
" WHEN a > 2 THEN 'a few'" +
|
||||||
|
" WHEN a > 10 THEN 'many' " +
|
||||||
|
"END");
|
||||||
|
|
||||||
|
assertEquals(Case.class, expr.getClass());
|
||||||
|
Case c = (Case) expr;
|
||||||
|
assertEquals(3, c.conditions().size());
|
||||||
|
IfConditional ifc = c.conditions().get(0);
|
||||||
|
assertEquals("WHEN a = 1 THEN 'one'", ifc.sourceText());
|
||||||
|
assertThat(ifc.condition().toString(), startsWith("Equals[?a,1]#"));
|
||||||
|
assertEquals("'one'=one", ifc.result().toString());
|
||||||
|
assertEquals(Literal.NULL, c.defaultElse());
|
||||||
|
|
||||||
|
expr = parser.createExpression(
|
||||||
|
"CASE WHEN a = 1 THEN 'one'" +
|
||||||
|
" WHEN a <= 2 THEN 'a few'" +
|
||||||
|
"ELSE 'many' " +
|
||||||
|
"END");
|
||||||
|
|
||||||
|
assertEquals(Case.class, expr.getClass());
|
||||||
|
c = (Case) expr;
|
||||||
|
assertEquals(2, c.conditions().size());
|
||||||
|
ifc = c.conditions().get(0);
|
||||||
|
assertEquals("WHEN a = 1 THEN 'one'", ifc.sourceText());
|
||||||
|
assertEquals("'many'=many", c.defaultElse().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCaseWithOperand() {
|
||||||
|
Expression expr = parser.createExpression(
|
||||||
|
"CASE a WHEN 1 THEN 'one'" +
|
||||||
|
" WHEN 2 THEN 'two'" +
|
||||||
|
" WHEN 3 THEN 'three' " +
|
||||||
|
"END");
|
||||||
|
|
||||||
|
assertEquals(Case.class, expr.getClass());
|
||||||
|
Case c = (Case) expr;
|
||||||
|
assertEquals(3, c.conditions().size());
|
||||||
|
IfConditional ifc = c.conditions().get(0);
|
||||||
|
assertEquals("WHEN 1 THEN 'one'", ifc.sourceText());
|
||||||
|
assertThat(ifc.condition().toString(), startsWith("Equals[?a,1]#"));
|
||||||
|
assertEquals("'one'=one", ifc.result().toString());
|
||||||
|
assertEquals(Literal.NULL, c.defaultElse());
|
||||||
|
|
||||||
|
expr = parser.createExpression(
|
||||||
|
"CASE a WHEN 1 THEN 'one'" +
|
||||||
|
" WHEN 2 THEN 'two'" +
|
||||||
|
"ELSE 'many' " +
|
||||||
|
"END");
|
||||||
|
assertEquals(Case.class, expr.getClass());
|
||||||
|
c = (Case) expr;
|
||||||
|
assertEquals(2, c.conditions().size());
|
||||||
|
ifc = c.conditions().get(0);
|
||||||
|
assertEquals("WHEN 1 THEN 'one'", ifc.sourceText());
|
||||||
|
assertEquals("'many'=many", c.defaultElse().toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -587,6 +587,21 @@ public class QueryTranslatorTests extends ESTestCase {
|
||||||
assertEquals("[{v=int}, {v=10}]", scriptTemplate.params().toString());
|
assertEquals("[{v=int}, {v=10}]", scriptTemplate.params().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testTranslateCase_GroupBy_Painless() {
|
||||||
|
LogicalPlan p = plan("SELECT CASE WHEN int > 10 THEN 'foo' WHEN int > 20 THEN 'bar' ELSE 'default' END FROM test GROUP BY 1");
|
||||||
|
assertTrue(p instanceof Aggregate);
|
||||||
|
Expression condition = ((Aggregate) p).groupings().get(0);
|
||||||
|
assertFalse(condition.foldable());
|
||||||
|
QueryTranslator.GroupingContext groupingContext = QueryTranslator.groupBy(((Aggregate) p).groupings());
|
||||||
|
assertNotNull(groupingContext);
|
||||||
|
ScriptTemplate scriptTemplate = groupingContext.tail.script();
|
||||||
|
assertEquals("InternalSqlScriptUtils.caseFunction([InternalSqlScriptUtils.gt(InternalSqlScriptUtils.docValue(" + "" +
|
||||||
|
"doc,params.v0),params.v1),params.v2,InternalSqlScriptUtils.gt(InternalSqlScriptUtils.docValue(doc,params.v3)," +
|
||||||
|
"params.v4),params.v5,params.v6])",
|
||||||
|
scriptTemplate.toString());
|
||||||
|
assertEquals("[{v=int}, {v=10}, {v=foo}, {v=int}, {v=20}, {v=bar}, {v=default}]", scriptTemplate.params().toString());
|
||||||
|
}
|
||||||
|
|
||||||
public void testGroupByDateHistogram() {
|
public void testGroupByDateHistogram() {
|
||||||
LogicalPlan p = plan("SELECT MAX(int) FROM test GROUP BY HISTOGRAM(int, 1000)");
|
LogicalPlan p = plan("SELECT MAX(int) FROM test GROUP BY HISTOGRAM(int, 1000)");
|
||||||
assertTrue(p instanceof Aggregate);
|
assertTrue(p instanceof Aggregate);
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
package org.elasticsearch.xpack.sql.tree;
|
package org.elasticsearch.xpack.sql.tree;
|
||||||
|
|
||||||
import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
|
import com.carrotsearch.randomizedtesting.annotations.ParametersFactory;
|
||||||
|
|
||||||
import org.elasticsearch.common.Strings;
|
import org.elasticsearch.common.Strings;
|
||||||
import org.elasticsearch.common.io.PathUtils;
|
import org.elasticsearch.common.io.PathUtils;
|
||||||
import org.elasticsearch.test.ESTestCase;
|
import org.elasticsearch.test.ESTestCase;
|
||||||
|
@ -29,6 +28,7 @@ import org.elasticsearch.xpack.sql.expression.gen.pipeline.BinaryPipesTests;
|
||||||
import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe;
|
import org.elasticsearch.xpack.sql.expression.gen.pipeline.Pipe;
|
||||||
import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor;
|
import org.elasticsearch.xpack.sql.expression.gen.processor.ConstantProcessor;
|
||||||
import org.elasticsearch.xpack.sql.expression.gen.processor.Processor;
|
import org.elasticsearch.xpack.sql.expression.gen.processor.Processor;
|
||||||
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.IfConditional;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.conditional.IfNull;
|
import org.elasticsearch.xpack.sql.expression.predicate.conditional.IfNull;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.fulltext.FullTextPredicate;
|
import org.elasticsearch.xpack.sql.expression.predicate.fulltext.FullTextPredicate;
|
||||||
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.In;
|
import org.elasticsearch.xpack.sql.expression.predicate.operator.comparison.In;
|
||||||
|
@ -92,8 +92,8 @@ import static org.mockito.Mockito.mock;
|
||||||
*/
|
*/
|
||||||
public class NodeSubclassTests<T extends B, B extends Node<B>> extends ESTestCase {
|
public class NodeSubclassTests<T extends B, B extends Node<B>> extends ESTestCase {
|
||||||
|
|
||||||
private static final List<Class<?>> CLASSES_WITH_MIN_TWO_CHILDREN = Arrays.asList(IfNull.class, In.class, InPipe.class,
|
private static final List<Class<?>> CLASSES_WITH_MIN_TWO_CHILDREN = Arrays.asList(IfConditional.class, IfNull.class,
|
||||||
Percentile.class, Percentiles.class, PercentileRanks.class);
|
In.class, InPipe.class, Percentile.class, Percentiles.class, PercentileRanks.class);
|
||||||
|
|
||||||
private final Class<T> subclass;
|
private final Class<T> subclass;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue