You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2017/04/25 03:53:42 UTC
[1/3] calcite git commit: [CALCITE-1759] Add SQL:2014 reserved words
to parser
Repository: calcite
Updated Branches:
refs/heads/master aed5bca7c -> c850e227d
http://git-wip-us.apache.org/repos/asf/calcite/blob/d97c14c5/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
index 0666dec..94551f9 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
@@ -5486,7 +5486,7 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
@Ignore("bug: should fail if sub-query does not have alias")
@Test public void testJoinSubQuery() {
// Sub-queries require alias
- checkFails("select * from (select 1 as one from emp)\n"
+ checkFails("select * from (select 1 as uno from emp)\n"
+ "join (values (1), (2)) on true",
"require alias");
}
@@ -5637,8 +5637,8 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
checkResultType("with emp2 as (select * from emp),\n"
+ " dept2 as (select * from dept),\n"
+ " empDept as (select emp2.empno, dept2.deptno from dept2 join emp2 using (deptno))\n"
- + "select 1 as one from empDept",
- "RecordType(INTEGER NOT NULL ONE) NOT NULL");
+ + "select 1 as uno from empDept",
+ "RecordType(INTEGER NOT NULL UNO) NOT NULL");
}
/** Tests the {@code WITH} clause with UNION. */
@@ -5679,8 +5679,8 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
+ " with dept2 as (select * from dept)\n"
+ " (\n"
+ " with empDept as (select emp2.empno, dept2.deptno from dept2 join emp2 using (deptno))\n"
- + " select 1 as one from empDept))",
- "RecordType(INTEGER NOT NULL ONE) NOT NULL");
+ + " select 1 as uno from empDept))",
+ "RecordType(INTEGER NOT NULL UNO) NOT NULL");
// WITH inside WHERE can see enclosing tables
checkResultType("select * from emp\n"
@@ -5707,15 +5707,15 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
checkResultType("select e.empno, d.* from emp as e\n"
+ "join (\n"
+ " with dept2 as (select * from dept where dept.deptno > 10)\n"
- + " select deptno, 1 as one from dept2) as d using (deptno)",
+ + " select deptno, 1 as uno from dept2) as d using (deptno)",
"RecordType(INTEGER NOT NULL EMPNO,"
+ " INTEGER NOT NULL DEPTNO,"
- + " INTEGER NOT NULL ONE) NOT NULL");
+ + " INTEGER NOT NULL UNO) NOT NULL");
checkFails("select ^e^.empno, d.* from emp\n"
+ "join (\n"
+ " with dept2 as (select * from dept where dept.deptno > 10)\n"
- + " select deptno, 1 as one from dept2) as d using (deptno)",
+ + " select deptno, 1 as uno from dept2) as d using (deptno)",
"Table 'E' not found");
}
@@ -7526,7 +7526,7 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
+ " CATALOG.SALES.DEPT.DEPTNO,"
+ " CATALOG.SALES.DEPT.NAME}");
- tester.checkFieldOrigin("select distinct emp.empno, hiredate, 1 as one,\n"
+ tester.checkFieldOrigin("select distinct emp.empno, hiredate, 1 as uno,\n"
+ " emp.empno * 2 as twiceEmpno\n"
+ "from emp join dept on true",
"{CATALOG.SALES.EMP.EMPNO,"
http://git-wip-us.apache.org/repos/asf/calcite/blob/d97c14c5/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
index f949786..85bdd75 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -1247,7 +1247,7 @@ where c like 'X%']]>
<![CDATA[
LogicalProject(EXPR$0=[+($0, $1)])
LogicalFilter(condition=[LIKE($2, 'X%')])
- LogicalProject(DEPTNO=[$0], ONE=[1], NAME=[$1])
+ LogicalProject(DEPTNO=[$0], UNO=[1], NAME=[$1])
LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
]]>
</Resource>
http://git-wip-us.apache.org/repos/asf/calcite/blob/d97c14c5/file/src/test/java/org/apache/calcite/adapter/file/SqlTest.java
----------------------------------------------------------------------
diff --git a/file/src/test/java/org/apache/calcite/adapter/file/SqlTest.java b/file/src/test/java/org/apache/calcite/adapter/file/SqlTest.java
index 27cc0f0..82a60c9 100644
--- a/file/src/test/java/org/apache/calcite/adapter/file/SqlTest.java
+++ b/file/src/test/java/org/apache/calcite/adapter/file/SqlTest.java
@@ -256,7 +256,7 @@ public class SqlTest {
* therefore the table has a system-generated column called
* "EmptyFileHasNoColumns". */
@Test public void testCsvSalesEmpty() throws SQLException {
- final String sql = "select * from sales.empty";
+ final String sql = "select * from sales.\"EMPTY\"";
checkSql(sql, "sales-csv", new Function<ResultSet, Void>() {
public Void apply(ResultSet resultSet) {
try {
http://git-wip-us.apache.org/repos/asf/calcite/blob/d97c14c5/site/_docs/reference.md
----------------------------------------------------------------------
diff --git a/site/_docs/reference.md b/site/_docs/reference.md
index 728f5e1..d4d64f2 100644
--- a/site/_docs/reference.md
+++ b/site/_docs/reference.md
@@ -243,6 +243,7 @@ ALWAYS,
APPLY,
**ARE**,
**ARRAY**,
+**ARRAY_MAX_CARDINALITY**,
**AS**,
ASC,
**ASENSITIVE**,
@@ -257,6 +258,8 @@ ATTRIBUTES,
**AVG**,
BEFORE,
**BEGIN**,
+**BEGIN_FRAME**,
+**BEGIN_PARTITION**,
BERNOULLI,
**BETWEEN**,
**BIGINT**,
@@ -291,6 +294,7 @@ CHARACTER_SET_NAME,
CHARACTER_SET_SCHEMA,
**CHAR_LENGTH**,
**CHECK**,
+**CLASSIFIER**,
CLASS_ORIGIN,
**CLOB**,
**CLOSE**,
@@ -319,7 +323,7 @@ CONSTRAINT_CATALOG,
CONSTRAINT_NAME,
CONSTRAINT_SCHEMA,
CONSTRUCTOR,
-CONTAINS,
+**CONTAINS**,
CONTINUE,
**CONVERT**,
**CORR**,
@@ -337,6 +341,7 @@ CONTINUE,
**CURRENT_DEFAULT_TRANSFORM_GROUP**,
**CURRENT_PATH**,
**CURRENT_ROLE**,
+**CURRENT_ROW**,
**CURRENT_SCHEMA**,
**CURRENT_TIME**,
**CURRENT_TIMESTAMP**,
@@ -390,10 +395,13 @@ DYNAMIC_FUNCTION_CODE,
**EACH**,
**ELEMENT**,
**ELSE**,
+**EMPTY**,
**END**,
**END-EXEC**,
+**END_FRAME**,
+**END_PARTITION**,
EPOCH,
-EQUALS,
+**EQUALS**,
**ESCAPE**,
**EVERY**,
**EXCEPT**,
@@ -422,6 +430,7 @@ FOLLOWING,
FORTRAN,
FOUND,
FRAC_SECOND,
+**FRAME_ROW**,
**FREE**,
**FROM**,
**FULL**,
@@ -438,6 +447,7 @@ GOTO,
GRANTED,
**GROUP**,
**GROUPING**,
+**GROUPS**,
**HAVING**,
HIERARCHY,
**HOLD**,
@@ -450,6 +460,7 @@ IMPLEMENTATION,
INCLUDING,
INCREMENT,
**INDICATOR**,
+**INITIAL**,
INITIALLY,
**INNER**,
**INOUT**,
@@ -475,17 +486,20 @@ KEY,
KEY_MEMBER,
KEY_TYPE,
LABEL,
+**LAG**,
**LANGUAGE**,
**LARGE**,
LAST,
**LAST_VALUE**,
**LATERAL**,
+**LEAD**,
**LEADING**,
**LEFT**,
LENGTH,
LEVEL,
LIBRARY,
**LIKE**,
+**LIKE_REGEX**,
**LIMIT**,
**LN**,
**LOCAL**,
@@ -497,6 +511,8 @@ M,
MAP,
**MATCH**,
MATCHED,
+**MATCHES**,
+**MATCH_NUMBER**,
**MATCH_RECOGNIZE**,
**MAX**,
MAXVALUE,
@@ -534,6 +550,8 @@ NESTING,
**NORMALIZE**,
NORMALIZED,
**NOT**,
+**NTH_VALUE**,
+**NTILE**,
**NULL**,
NULLABLE,
**NULLIF**,
@@ -541,12 +559,15 @@ NULLS,
NUMBER,
**NUMERIC**,
OBJECT,
+**OCCURRENCES_REGEX**,
OCTETS,
**OCTET_LENGTH**,
**OF**,
**OFFSET**,
**OLD**,
+**OMIT**,
**ON**,
+**ONE**,
**ONLY**,
**OPEN**,
OPTION,
@@ -577,15 +598,21 @@ PASCAL,
PASSTHROUGH,
PATH,
**PATTERN**,
+**PER**,
+**PERCENT**,
**PERCENTILE_CONT**,
**PERCENTILE_DISC**,
**PERCENT_RANK**,
+**PERIOD**,
**PERMUTE**,
PLACING,
PLAN,
PLI,
+**PORTION**,
**POSITION**,
+**POSITION_REGEX**,
**POWER**,
+**PRECEDES**,
PRECEDING,
**PRECISION**,
**PREPARE**,
@@ -656,6 +683,7 @@ SCOPE_SCHEMA,
**SECOND**,
SECTION,
SECURITY,
+**SEEK**,
**SELECT**,
SELF,
**SENSITIVE**,
@@ -667,9 +695,11 @@ SESSION,
**SESSION_USER**,
**SET**,
SETS,
+**SHOW**,
**SIMILAR**,
SIMPLE,
SIZE,
+**SKIP**,
**SMALLINT**,
**SOME**,
SOURCE,
@@ -742,11 +772,15 @@ STRUCTURE,
STYLE,
SUBCLASS_ORIGIN,
**SUBMULTISET**,
+**SUBSET**,
SUBSTITUTE,
**SUBSTRING**,
+**SUBSTRING_REGEX**,
+**SUCCEEDS**,
**SUM**,
**SYMMETRIC**,
**SYSTEM**,
+**SYSTEM_TIME**,
**SYSTEM_USER**,
**TABLE**,
**TABLESAMPLE**,
@@ -771,6 +805,7 @@ TRANSACTIONS_ROLLED_BACK,
TRANSFORM,
TRANSFORMS,
**TRANSLATE**,
+**TRANSLATE_REGEX**,
**TRANSLATION**,
**TREAT**,
**TRIGGER**,
@@ -778,7 +813,9 @@ TRIGGER_CATALOG,
TRIGGER_NAME,
TRIGGER_SCHEMA,
**TRIM**,
+**TRIM_ARRAY**,
**TRUE**,
+**TRUNCATE**,
TYPE,
**UESCAPE**,
UNBOUNDED,
@@ -801,12 +838,14 @@ USER_DEFINED_TYPE_SCHEMA,
**USING**,
**VALUE**,
**VALUES**,
+**VALUE_OF**,
**VARBINARY**,
**VARCHAR**,
**VARYING**,
**VAR_POP**,
**VAR_SAMP**,
VERSION,
+**VERSIONING**,
VIEW,
WEEK,
**WHEN**,
@@ -1450,7 +1489,7 @@ matchRecognize:
[ PARTITION BY expression [, expression ]* ]
[ ORDER BY orderItem [, orderItem ]* ]
[ MEASURES measureColumn [, measureColumn ]* ]
- [ ON ROW PER MATCH | ALL ROWS PER MATCH ]
+ [ ONE ROW PER MATCH | ALL ROWS PER MATCH ]
[ AFTER MATCH
( SKIP TO NEXT ROW
| SKIP PAST LAST ROW
[2/3] calcite git commit: [CALCITE-1759] Add SQL:2014 reserved words
to parser
Posted by jh...@apache.org.
[CALCITE-1759] Add SQL:2014 reserved words to parser
Between SQL:2011 and SQL:2014, the following keywords were added:
ARRAY_MAX_CARDINALITY, BEGIN_FRAME, BEGIN_PARTITION, CLASSIFIER,
CURRENT_ROW, DEFINE, EMPTY, END_FRAME, END_PARTITION, FRAME_ROW, GROUPS,
INITIAL, MATCHES, MATCH_NUMBER, MATCH_RECOGNIZE, OMIT, ONE, PATTERN,
PER, PERCENT, PERIOD, PORTION, RUNNING, SEEK, SHOW, SKIP, SUBSET,
SYSTEM_TIME, VALUE_OF. All of these are now reserved in Calcite; some of
them were reserved already.
SQL:2014 removed: DAYS, FOREVER, HOURS, KEEP, MAX_CARDINALITY, MINUTES,
SECONDS. None of these were ever reserved in Calcite.
The following became reserved in SQL:2011, and are now reserved in
Calcite: LAG, LEAG, LIKE_REGEX, NTH_VALUE, NTILE, OCCURRENCES_REGEX,
POSITION_REGEX, SUBSTRING_REGEX, TRANSLATE_REGEX, TRIM_ARRAY, TRUNCATE,
VERSIONING.
Sort the reserved word list in the parser.
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/d97c14c5
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/d97c14c5
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/d97c14c5
Branch: refs/heads/master
Commit: d97c14c5dd62ed55da4d771e585973213affcb6e
Parents: aed5bca
Author: Hongbin Ma <ma...@apache.org>
Authored: Sun Apr 16 22:14:17 2017 +0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Apr 24 18:23:24 2017 -0700
----------------------------------------------------------------------
core/src/main/codegen/templates/Parser.jj | 78 +-
.../calcite/sql/parser/SqlParserTest.java | 904 ++++++++++---------
.../apache/calcite/sql/test/SqlAdvisorTest.java | 4 +
.../java/org/apache/calcite/test/JdbcTest.java | 2 +-
.../calcite/test/SqlToRelConverterTest.java | 2 +-
.../apache/calcite/test/SqlValidatorTest.java | 18 +-
.../calcite/test/SqlToRelConverterTest.xml | 2 +-
.../apache/calcite/adapter/file/SqlTest.java | 2 +-
site/_docs/reference.md | 45 +-
9 files changed, 588 insertions(+), 469 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/d97c14c5/core/src/main/codegen/templates/Parser.jj
----------------------------------------------------------------------
diff --git a/core/src/main/codegen/templates/Parser.jj b/core/src/main/codegen/templates/Parser.jj
index 9b04cb5..64d5936 100644
--- a/core/src/main/codegen/templates/Parser.jj
+++ b/core/src/main/codegen/templates/Parser.jj
@@ -855,7 +855,7 @@ void Arg0(List list, ExprContext exprContext) :
name = SimpleIdentifier() <NAMED_ARGUMENT_ASSIGNMENT>
]
(
- <DEFAULT_KW> {
+ <DEFAULT_> {
e = SqlStdOperatorTable.DEFAULT.createCall(getPos());
}
|
@@ -883,7 +883,7 @@ void Arg(List list, ExprContext exprContext) :
name = SimpleIdentifier() <NAMED_ARGUMENT_ASSIGNMENT>
]
(
- <DEFAULT_KW> {
+ <DEFAULT_> {
e = SqlStdOperatorTable.DEFAULT.createCall(getPos());
}
|
@@ -5132,6 +5132,8 @@ SqlIdentifier ReservedFunctionName() :
| <FUSION>
| <GROUPING>
| <HOUR>
+ | <LAG>
+ | <LEAD>
| <LAST_VALUE>
| <LN>
| <LOCALTIME>
@@ -5142,6 +5144,7 @@ SqlIdentifier ReservedFunctionName() :
| <MINUTE>
| <MOD>
| <MONTH>
+ | <NTILE>
| <NULLIF>
| <OCTET_LENGTH>
| <PERCENT_RANK>
@@ -5156,6 +5159,7 @@ SqlIdentifier ReservedFunctionName() :
| <STDDEV_SAMP>
| <SUM>
| <UPPER>
+ | <TRUNCATE>
| <USER>
| <VAR_POP>
| <VAR_SAMP>
@@ -5238,6 +5242,9 @@ SqlNode JdbcFunctionCall() :
// INSERT is a reserved word, but we need to handle {fn insert}
<INSERT> { name = unquotedIdentifier(); }
|
+ // TRUNCATE is a reserved word, but we need to handle {fn truncate}
+ <TRUNCATE> { name = unquotedIdentifier(); }
+ |
// For cases like {fn power(1,2)} and {fn lower('a')}
id = ReservedFunctionName() { name = id.getSimple(); }
|
@@ -5448,12 +5455,14 @@ SqlPostfixOperator PostfixRowOperator() :
| < ALL: "ALL" >
| < ALLOCATE: "ALLOCATE" >
| < ALLOW: "ALLOW" >
- | < ALWAYS: "ALWAYS" >
| < ALTER: "ALTER" >
+ | < ALWAYS: "ALWAYS" >
| < AND: "AND" >
| < ANY: "ANY" >
+ | < APPLY: "APPLY" >
| < ARE: "ARE" >
| < ARRAY: "ARRAY" >
+ | < ARRAY_MAX_CARDINALITY: "ARRAY_MAX_CARDINALITY" >
| < AS: "AS" >
| < ASC: "ASC" >
| < ASENSITIVE: "ASENSITIVE" >
@@ -5468,6 +5477,8 @@ SqlPostfixOperator PostfixRowOperator() :
| < AVG: "AVG" >
| < BEFORE: "BEFORE" >
| < BEGIN: "BEGIN" >
+ | < BEGIN_FRAME: "BEGIN_FRAME" >
+ | < BEGIN_PARTITION: "BEGIN_PARTITION" >
| < BERNOULLI: "BERNOULLI" >
| < BETWEEN: "BETWEEN" >
| < BIGINT: "BIGINT" >
@@ -5502,6 +5513,7 @@ SqlPostfixOperator PostfixRowOperator() :
| < CHARACTERISTICS: "CHARACTERISTICS" >
| < CHARACTERS: "CHARACTERS" >
| < CHECK: "CHECK" >
+ | < CLASSIFIER: "CLASSIFIER" >
| < CLASS_ORIGIN: "CLASS_ORIGIN" >
| < CLOB: "CLOB" >
| < CLOSE: "CLOSE" >
@@ -5531,8 +5543,8 @@ SqlPostfixOperator PostfixRowOperator() :
| < CONSTRAINTS: "CONSTRAINTS" >
| < CONSTRUCTOR: "CONSTRUCTOR" >
| < CONTAINS: "CONTAINS" >
- | < CONVERT: "CONVERT" >
| < CONTINUE: "CONTINUE" >
+ | < CONVERT: "CONVERT" >
| < CORR: "CORR" >
| < CORRESPONDING: "CORRESPONDING" >
| < COUNT: "COUNT" >
@@ -5548,6 +5560,7 @@ SqlPostfixOperator PostfixRowOperator() :
| < CURRENT_DEFAULT_TRANSFORM_GROUP: "CURRENT_DEFAULT_TRANSFORM_GROUP" >
| < CURRENT_PATH: "CURRENT_PATH" >
| < CURRENT_ROLE: "CURRENT_ROLE" >
+ | < CURRENT_ROW: "CURRENT_ROW" >
| < CURRENT_SCHEMA: "CURRENT_SCHEMA" >
| < CURRENT_TIME: "CURRENT_TIME" >
| < CURRENT_TIMESTAMP: "CURRENT_TIMESTAMP" >
@@ -5567,7 +5580,7 @@ SqlPostfixOperator PostfixRowOperator() :
| < DECADE: "DECADE" >
| < DECIMAL: "DECIMAL" >
| < DECLARE: "DECLARE" >
- | < DEFAULT_KW: "DEFAULT" >
+ | < DEFAULT_: "DEFAULT" >
| < DEFAULTS: "DEFAULTS" >
| < DEFERRABLE: "DEFERRABLE" >
| < DEFERRED: "DEFERRED" >
@@ -5580,8 +5593,8 @@ SqlPostfixOperator PostfixRowOperator() :
| < DEPTH: "DEPTH" >
| < DEREF: "DEREF" >
| < DERIVED: "DERIVED" >
- | < DESCRIBE: "DESCRIBE" >
| < DESC: "DESC" >
+ | < DESCRIBE: "DESCRIBE" >
| < DESCRIPTION: "DESCRIPTION" >
| < DESCRIPTOR: "DESCRIPTOR" >
| < DETERMINISTIC: "DETERMINISTIC" >
@@ -5601,8 +5614,11 @@ SqlPostfixOperator PostfixRowOperator() :
| < EACH: "EACH" >
| < ELEMENT: "ELEMENT" >
| < ELSE: "ELSE" >
+ | < EMPTY: "EMPTY" >
| < END: "END" >
| < END_EXEC: "END-EXEC" >
+ | < END_FRAME: "END_FRAME" >
+ | < END_PARTITION: "END_PARTITION" >
| < EPOCH: "EPOCH" >
| < EQUALS: "EQUALS" >
| < ESCAPE: "ESCAPE" >
@@ -5616,8 +5632,8 @@ SqlPostfixOperator PostfixRowOperator() :
| < EXISTS: "EXISTS" >
| < EXP: "EXP" >
| < EXPLAIN: "EXPLAIN" >
- | < EXTERNAL: "EXTERNAL" >
| < EXTEND: "EXTEND" >
+ | < EXTERNAL: "EXTERNAL" >
| < EXTRACT: "EXTRACT" >
| < FALSE: "FALSE" >
| < FETCH: "FETCH" >
@@ -5633,6 +5649,7 @@ SqlPostfixOperator PostfixRowOperator() :
| < FORTRAN: "FORTRAN" >
| < FOUND: "FOUND" >
| < FRAC_SECOND: "FRAC_SECOND" >
+ | < FRAME_ROW: "FRAME_ROW" >
| < FREE: "FREE" >
| < FROM: "FROM" >
| < FULL: "FULL" >
@@ -5649,6 +5666,7 @@ SqlPostfixOperator PostfixRowOperator() :
| < GRANTED: "GRANTED" >
| < GROUP: "GROUP" >
| < GROUPING: "GROUPING" >
+ | < GROUPS: "GROUPS" >
| < HAVING: "HAVING" >
| < HIERARCHY: "HIERARCHY" >
| < HOLD: "HOLD" >
@@ -5658,9 +5676,10 @@ SqlPostfixOperator PostfixRowOperator() :
| < IMPLEMENTATION: "IMPLEMENTATION" >
| < IMPORT: "IMPORT" >
| < IN: "IN" >
- | < INDICATOR: "INDICATOR" >
| < INCLUDING: "INCLUDING" >
| < INCREMENT: "INCREMENT" >
+ | < INDICATOR: "INDICATOR" >
+ | < INITIAL: "INITIAL" >
| < INITIALLY: "INITIALLY" >
| < INNER: "INNER" >
| < INOUT: "INOUT" >
@@ -5686,17 +5705,20 @@ SqlPostfixOperator PostfixRowOperator() :
| < KEY_MEMBER: "KEY_MEMBER" >
| < KEY_TYPE: "KEY_TYPE" >
| < LABEL: "LABEL" >
+ | < LAG: "LAG" >
| < LANGUAGE: "LANGUAGE" >
| < LARGE: "LARGE" >
| < LAST: "LAST" >
| < LAST_VALUE: "LAST_VALUE" >
| < LATERAL: "LATERAL" >
+ | < LEAD: "LEAD" >
| < LEADING: "LEADING" >
| < LEFT: "LEFT" >
| < LENGTH: "LENGTH" >
| < LEVEL: "LEVEL" >
| < LIBRARY: "LIBRARY" >
| < LIKE: "LIKE" >
+ | < LIKE_REGEX: "LIKE_REGEX" >
| < LIMIT: "LIMIT" >
| < LN: "LN" >
| < LOCAL: "LOCAL" >
@@ -5708,6 +5730,8 @@ SqlPostfixOperator PostfixRowOperator() :
| < MAP: "MAP" >
| < MATCH: "MATCH" >
| < MATCHED: "MATCHED" >
+ | < MATCHES: "MATCHES" >
+ | < MATCH_NUMBER: "MATCH_NUMBER">
| < MATCH_RECOGNIZE: "MATCH_RECOGNIZE">
| < MAX: "MAX" >
| < MAXVALUE: "MAXVALUE" >
@@ -5727,7 +5751,7 @@ SqlPostfixOperator PostfixRowOperator() :
| < MODIFIES: "MODIFIES" >
| < MODULE: "MODULE" >
| < MONTH: "MONTH" >
- | < MORE_KW: "MORE" >
+ | < MORE_: "MORE" >
| < MULTISET: "MULTISET" >
| < MUMPS: "MUMPS" >
| < NAME: "NAME" >
@@ -5744,6 +5768,8 @@ SqlPostfixOperator PostfixRowOperator() :
| < NORMALIZE: "NORMALIZE" >
| < NORMALIZED: "NORMALIZED" >
| < NOT: "NOT" >
+ | < NTH_VALUE: "NTH_VALUE" >
+ | < NTILE: "NTILE" >
| < NULL: "NULL" >
| < NULLABLE: "NULLABLE" >
| < NULLIF: "NULLIF" >
@@ -5751,12 +5777,15 @@ SqlPostfixOperator PostfixRowOperator() :
| < NUMBER: "NUMBER" >
| < NUMERIC: "NUMERIC" >
| < OBJECT: "OBJECT" >
+ | < OCCURRENCES_REGEX: "OCCURRENCES_REGEX" >
| < OCTET_LENGTH: "OCTET_LENGTH" >
| < OCTETS: "OCTETS" >
| < OF: "OF" >
| < OFFSET: "OFFSET" >
| < OLD: "OLD" >
+ | < OMIT: "OMIT" >
| < ON: "ON" >
+ | < ONE: "ONE" >
| < ONLY: "ONLY" >
| < OPEN: "OPEN" >
| < OPTION: "OPTION" >
@@ -5787,15 +5816,21 @@ SqlPostfixOperator PostfixRowOperator() :
| < PASSTHROUGH: "PASSTHROUGH" >
| < PATH: "PATH" >
| < PATTERN: "PATTERN" >
- | < PERMUTE: "PERMUTE" >
- | < PERCENT_RANK: "PERCENT_RANK" >
+ | < PER: "PER" >
+ | < PERCENT: "PERCENT" >
| < PERCENTILE_CONT: "PERCENTILE_CONT" >
| < PERCENTILE_DISC: "PERCENTILE_DISC" >
+ | < PERCENT_RANK: "PERCENT_RANK" >
+ | < PERIOD: "PERIOD" >
+ | < PERMUTE: "PERMUTE" >
| < PLACING: "PLACING" >
| < PLAN: "PLAN" >
| < PLI: "PLI" >
+ | < PORTION: "PORTION" >
| < POSITION: "POSITION" >
+ | < POSITION_REGEX: "POSITION_REGEX" >
| < POWER: "POWER" >
+ | < PRECEDES: "PRECEDES" >
| < PRECEDING: "PRECEDING" >
| < PRECISION: "PRECISION" >
| < PREPARE: "PREPARE" >
@@ -5866,6 +5901,7 @@ SqlPostfixOperator PostfixRowOperator() :
| < SECOND: "SECOND" >
| < SECTION: "SECTION" >
| < SECURITY: "SECURITY" >
+ | < SEEK: "SEEK" >
| < SELECT: "SELECT" >
| < SELF: "SELF" >
| < SENSITIVE: "SENSITIVE" >
@@ -5878,9 +5914,11 @@ SqlPostfixOperator PostfixRowOperator() :
| < SET: "SET" >
| < SETS: "SETS" >
| < SET_MINUS: "MINUS">
+ | < SHOW: "SHOW" >
| < SIMILAR: "SIMILAR" >
| < SIMPLE: "SIMPLE" >
| < SIZE: "SIZE" >
+ | < SKIP_: "SKIP" >
| < SMALLINT: "SMALLINT" >
| < SOME: "SOME" >
| < SOURCE: "SOURCE" >
@@ -5953,11 +5991,15 @@ SqlPostfixOperator PostfixRowOperator() :
| < STYLE: "STYLE" >
| < SUBCLASS_ORIGIN: "SUBCLASS_ORIGIN" >
| < SUBMULTISET: "SUBMULTISET" >
- | < SUBSTRING: "SUBSTRING" >
+ | < SUBSET: "SUBSET" >
| < SUBSTITUTE: "SUBSTITUTE" >
+ | < SUBSTRING: "SUBSTRING" >
+ | < SUBSTRING_REGEX: "SUBSTRING_REGEX" >
+ | < SUCCEEDS: "SUCCEEDS" >
| < SUM: "SUM" >
| < SYMMETRIC: "SYMMETRIC" >
| < SYSTEM: "SYSTEM" >
+ | < SYSTEM_TIME: "SYSTEM_TIME" >
| < SYSTEM_USER: "SYSTEM_USER" >
| < TABLE: "TABLE" >
| < TABLE_NAME: "TABLE_NAME" >
@@ -5982,6 +6024,7 @@ SqlPostfixOperator PostfixRowOperator() :
| < TRANSFORM: "TRANSFORM" >
| < TRANSFORMS: "TRANSFORMS" >
| < TRANSLATE: "TRANSLATE" >
+ | < TRANSLATE_REGEX: "TRANSLATE_REGEX" >
| < TRANSLATION: "TRANSLATION" >
| < TREAT: "TREAT" >
| < TRIGGER: "TRIGGER" >
@@ -5989,7 +6032,9 @@ SqlPostfixOperator PostfixRowOperator() :
| < TRIGGER_NAME: "TRIGGER_NAME" >
| < TRIGGER_SCHEMA: "TRIGGER_SCHEMA" >
| < TRIM: "TRIM" >
+ | < TRIM_ARRAY: "TRIM_ARRAY" >
| < TRUE: "TRUE" >
+ | < TRUNCATE: "TRUNCATE" >
| < TYPE: "TYPE" >
| < UESCAPE: "UESCAPE" >
| < UNBOUNDED: "UNBOUNDED" >
@@ -6012,12 +6057,14 @@ SqlPostfixOperator PostfixRowOperator() :
| < USING: "USING" >
| < VALUE: "VALUE" >
| < VALUES: "VALUES" >
+ | < VALUE_OF: "VALUE_OF" >
| < VAR_POP: "VAR_POP" >
| < VAR_SAMP: "VAR_SAMP" >
- | < VARCHAR: "VARCHAR" >
| < VARBINARY: "VARBINARY" >
+ | < VARCHAR: "VARCHAR" >
| < VARYING: "VARYING" >
| < VERSION: "VERSION" >
+ | < VERSIONING: "VERSIONING" >
| < VIEW: "VIEW" >
| < WEEK: "WEEK" >
| < WHEN: "WHEN" >
@@ -6034,7 +6081,6 @@ SqlPostfixOperator PostfixRowOperator() :
| < XML: "XML" >
| < YEAR: "YEAR" >
| < ZONE: "ZONE" >
- | < APPLY: "APPLY" >
<#-- additional parser keywords are included here -->
<#list parser.keywords as keyword>
| < ${keyword}: "${keyword}" >
@@ -6113,7 +6159,6 @@ String CommonNonReservedKeyWord() :
| <CONSTRAINT_SCHEMA>
| <CONSTRAINTS>
| <CONSTRUCTOR>
- | <CONTAINS>
| <CONTINUE>
| <CURSOR_NAME>
| <DATA>
@@ -6140,7 +6185,6 @@ String CommonNonReservedKeyWord() :
| <DYNAMIC_FUNCTION>
| <DYNAMIC_FUNCTION_CODE>
| <EPOCH>
- | <EQUALS>
| <EXCEPTION>
| <EXCLUDE>
| <EXCLUDING>
@@ -6189,7 +6233,7 @@ String CommonNonReservedKeyWord() :
| <MESSAGE_TEXT>
| <MILLENNIUM>
| <MINVALUE>
- | <MORE_KW>
+ | <MORE_>
| <MUMPS>
| <NAME>
| <NAMES>
http://git-wip-us.apache.org/repos/asf/calcite/blob/d97c14c5/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
index e743622..37c6c3a 100644
--- a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
@@ -80,442 +80,471 @@ public class SqlParserTest {
* List of reserved keywords.
*
* <p>Each keyword is followed by tokens indicating whether it is reserved in
- * the SQL:92, SQL:99, SQL:2003 standards and in Calcite.
+ * the SQL:92, SQL:99, SQL:2003, SQL:2011, SQL:2014 standards and in Calcite.
*
* <p>The standard keywords are derived from
- * <a href="http://developer.mimer.com/validator/sql-reserved-words.tml">Mimer</a>.
+ * <a href="http://developer.mimer.com/validator/sql-reserved-words.tml">Mimer</a>
+ * and from the specification.
*
* <p>If a new <b>reserved</b> keyword is added to the parser, include it in
* this list, flagged "c". If the keyword is not intended to be a reserved
* keyword, add it to the non-reserved keyword list in the parser.
*/
private static final List<String> RESERVED_KEYWORDS = ImmutableList.of(
- "ABS", "2011", "c",
- "ABSOLUTE", "92", "99",
- "ACTION", "92", "99",
- "ADD", "92", "99", "2003",
- "AFTER", "99",
- "ALL", "92", "99", "2003", "2011", "c",
- "ALLOCATE", "92", "99", "2003", "2011", "c",
- "ALLOW", "c",
- "ALTER", "92", "99", "2003", "2011", "c",
- "AND", "92", "99", "2003", "2011", "c",
- "ANY", "92", "99", "2003", "2011", "c",
- "ARE", "92", "99", "2003", "2011", "c",
- "ARRAY", "99", "2003", "2011", "c",
- "ARRAY_AGG", "2011",
- "AS", "92", "99", "2003", "2011", "c",
- "ASC", "92", "99",
- "ASENSITIVE", "99", "2003", "2011", "c",
- "ASSERTION", "92", "99",
- "ASYMMETRIC", "99", "2003", "2011", "c",
- "AT", "92", "99", "2003", "2011", "c",
- "ATOMIC", "99", "2003", "2011", "c",
- "AUTHORIZATION", "92", "99", "2003", "2011", "c",
- "AVG", "92", "2011", "c",
- "BEFORE", "99",
- "BEGIN", "92", "99", "2003", "2011", "c",
- "BETWEEN", "92", "99", "2003", "2011", "c",
- "BIGINT", "2003", "2011", "c",
- "BINARY", "99", "2003", "2011", "c",
- "BIT", "92", "99", "c",
- "BIT_LENGTH", "92",
- "BLOB", "99", "2003", "2011", "c",
- "BOOLEAN", "99", "2003", "2011", "c",
- "BOTH", "92", "99", "2003", "2011", "c",
- "BREADTH", "99",
- "BY", "92", "99", "2003", "2011", "c",
- "CALL", "92", "99", "2003", "2011", "c",
- "CALLED", "2003", "2011", "c",
- "CARDINALITY", "2011", "c",
- "CASCADE", "92", "99",
- "CASCADED", "92", "99", "2003", "2011", "c",
- "CASE", "92", "99", "2003", "2011", "c",
- "CAST", "92", "99", "2003", "2011", "c",
- "CATALOG", "92", "99",
- "CEIL", "2011", "c",
- "CEILING", "2011", "c",
- "CHAR", "92", "99", "2003", "2011", "c",
- "CHARACTER", "92", "99", "2003", "2011", "c",
- "CHARACTER_LENGTH", "92", "2011", "c",
- "CHAR_LENGTH", "92", "2011", "c",
- "CHECK", "92", "99", "2003", "2011", "c",
- "CLOB", "99", "2003", "2011", "c",
- "CLOSE", "92", "99", "2003", "2011", "c",
- "COALESCE", "92", "2011", "c",
- "COLLATE", "92", "99", "2003", "2011", "c",
- "COLLATION", "92", "99",
- "COLLECT", "2011", "c",
- "COLUMN", "92", "99", "2003", "2011", "c",
- "COMMIT", "92", "99", "2003", "2011", "c",
- "CONDITION", "92", "99", "2003", "2011", "c",
- "CONNECT", "92", "99", "2003", "2011", "c",
- "CONNECTION", "92", "99",
- "CONSTRAINT", "92", "99", "2003", "2011", "c",
- "CONSTRAINTS", "92", "99",
- "CONSTRUCTOR", "99",
- "CONTAINS", "92",
- "CONTINUE", "92", "99", "2003",
- "CONVERT", "92", "2011", "c",
- "CORR", "2011", "c",
- "CORRESPONDING", "92", "99", "2003", "2011", "c",
- "COUNT", "92", "2011", "c",
- "COVAR_POP", "2011", "c",
- "COVAR_SAMP", "2011", "c",
- "CREATE", "92", "99", "2003", "2011", "c",
- "CROSS", "92", "99", "2003", "2011", "c",
- "CUBE", "99", "2003", "2011", "c",
- "CUME_DIST", "2011", "c",
- "CURRENT", "92", "99", "2003", "2011", "c",
- "CURRENT_CATALOG", "2011", "c",
- "CURRENT_DATE", "92", "99", "2003", "2011", "c",
- "CURRENT_DEFAULT_TRANSFORM_GROUP", "99", "2003", "2011", "c",
- "CURRENT_PATH", "92", "99", "2003", "2011", "c",
- "CURRENT_ROLE", "99", "2003", "2011", "c",
- "CURRENT_SCHEMA", "2011", "c",
- "CURRENT_TIME", "92", "99", "2003", "2011", "c",
- "CURRENT_TIMESTAMP", "92", "99", "2003", "2011", "c",
- "CURRENT_TRANSFORM_GROUP_FOR_TYPE", "99", "2003", "2011", "c",
- "CURRENT_USER", "92", "99", "2003", "2011", "c",
- "CURSOR", "92", "99", "2003", "2011", "c",
- "CYCLE", "99", "2003", "2011", "c",
- "DATA", "99",
- "DATE", "92", "99", "2003", "2011", "c",
- "DAY", "92", "99", "2003", "2011", "c",
- "DAYS", "2011",
- "DEALLOCATE", "92", "99", "2003", "2011", "c",
- "DEC", "92", "99", "2003", "2011", "c",
- "DECIMAL", "92", "99", "2003", "2011", "c",
- "DECLARE", "92", "99", "2003", "2011", "c",
- "DEFAULT", "92", "99", "2003", "2011", "c",
- "DEFERRABLE", "92", "99",
- "DEFERRED", "92", "99",
- "DEFINE", "c",
- "DELETE", "92", "99", "2003", "2011", "c",
- "DENSE_RANK", "2011", "c",
- "DEPTH", "99",
- "DEREF", "99", "2003", "2011", "c",
- "DESC", "92", "99",
- "DESCRIBE", "92", "99", "2003", "2011", "c",
- "DESCRIPTOR", "92", "99",
- "DETERMINISTIC", "92", "99", "2003", "2011", "c",
- "DIAGNOSTICS", "92", "99",
- "DISALLOW", "c",
- "DISCONNECT", "92", "99", "2003", "2011", "c",
- "DISTINCT", "92", "99", "2003", "2011", "c",
- "DO", "92", "99", "2003",
- "DOMAIN", "92", "99",
- "DOUBLE", "92", "99", "2003", "2011", "c",
- "DROP", "92", "99", "2003", "2011", "c",
- "DYNAMIC", "99", "2003", "2011", "c",
- "EACH", "99", "2003", "2011", "c",
- "ELEMENT", "2003", "2011", "c",
- "ELSE", "92", "99", "2003", "2011", "c",
- "ELSEIF", "92", "99", "2003",
- "END", "92", "99", "2003", "2011", "c",
- "END-EXEC", "2011", "c",
- "EQUALS", "99",
- "ESCAPE", "92", "99", "2003", "2011", "c",
- "EVERY", "2011", "c",
- "EXCEPT", "92", "99", "2003", "2011", "c",
- "EXCEPTION", "92", "99",
- "EXEC", "92", "99", "2003", "2011", "c",
- "EXECUTE", "92", "99", "2003", "2011", "c",
- "EXISTS", "92", "99", "2003", "2011", "c",
- "EXIT", "92", "99", "2003",
- "EXP", "2011", "c",
- "EXPLAIN", "c",
- "EXTEND", "c",
- "EXTERNAL", "92", "99", "2003", "2011", "c",
- "EXTRACT", "92", "2011", "c",
- "FALSE", "92", "99", "2003", "2011", "c",
- "FETCH", "92", "99", "2003", "2011", "c",
- "FILTER", "99", "2003", "2011", "c",
- "FIRST", "92", "99",
- "FIRST_VALUE", "2011", "c",
- "FLOAT", "92", "99", "2003", "2011", "c",
- "FLOOR", "2011", "c",
- "FOR", "92", "99", "2003", "2011", "c",
- "FOREIGN", "92", "99", "2003", "2011", "c",
- "FOREVER", "2011",
- "FOUND", "92", "99",
- "FREE", "99", "2003", "2011", "c",
- "FROM", "92", "99", "2003", "2011", "c",
- "FULL", "92", "99", "2003", "2011", "c",
- "FUNCTION", "92", "99", "2003", "2011", "c",
- "FUSION", "2011", "c",
- "GENERAL", "99",
- "GET", "92", "99", "2003", "2011", "c",
- "GLOBAL", "92", "99", "2003", "2011", "c",
- "GO", "92", "99",
- "GOTO", "92", "99",
- "GRANT", "92", "99", "2003", "2011", "c",
- "GROUP", "92", "99", "2003", "2011", "c",
- "GROUPING", "99", "2003", "2011", "c",
- "HANDLER", "92", "99", "2003",
- "HAVING", "92", "99", "2003", "2011", "c",
- "HOLD", "99", "2003", "2011", "c",
- "HOUR", "92", "99", "2003", "2011", "c",
- "HOURS", "2011",
- "IDENTITY", "92", "99", "2003", "2011", "c",
- "IF", "92", "99", "2003",
- "IMMEDIATE", "92", "99", "2003",
- "IMPORT", "c",
- "IN", "92", "99", "2003", "2011", "c",
- "INDICATOR", "92", "99", "2003", "2011", "c",
- "INITIALLY", "92", "99",
- "INNER", "92", "99", "2003", "2011", "c",
- "INOUT", "92", "99", "2003", "2011", "c",
- "INPUT", "92", "99", "2003",
- "INSENSITIVE", "92", "99", "2003", "2011", "c",
- "INSERT", "92", "99", "2003", "2011", "c",
- "INT", "92", "99", "2003", "2011", "c",
- "INTEGER", "92", "99", "2003", "2011", "c",
- "INTERSECT", "92", "99", "2003", "2011", "c",
- "INTERSECTION", "2011", "c",
- "INTERVAL", "92", "99", "2003", "2011", "c",
- "INTO", "92", "99", "2003", "2011", "c",
- "IS", "92", "99", "2003", "2011", "c",
- "ISOLATION", "92", "99",
- "ITERATE", "99", "2003",
- "JOIN", "92", "99", "2003", "2011", "c",
- "KEEP", "2011",
- "KEY", "92", "99",
- "LAG", "2011",
- "LANGUAGE", "92", "99", "2003", "2011", "c",
- "LARGE", "99", "2003", "2011", "c",
- "LAST", "92", "99",
- "LAST_VALUE", "2011", "c",
- "LATERAL", "99", "2003", "2011", "c",
- "LEAD", "2011",
- "LEADING", "92", "99", "2003", "2011", "c",
- "LEAVE", "92", "99", "2003",
- "LEFT", "92", "99", "2003", "2011", "c",
- "LEVEL", "92", "99",
- "LIKE", "92", "99", "2003", "2011", "c",
- "LIKE_REGEX", "2011",
- "LIMIT", "c",
- "LN", "2011", "c",
- "LOCAL", "92", "99", "2003", "2011", "c",
- "LOCALTIME", "99", "2003", "2011", "c",
- "LOCALTIMESTAMP", "99", "2003", "2011", "c",
- "LOCATOR", "99",
- "LOOP", "92", "99", "2003",
- "LOWER", "92", "2011", "c",
- "MAP", "99",
- "MATCH", "92", "99", "2003", "2011", "c",
- "MATCH_RECOGNIZE", "c",
- "MAX", "92", "2011", "c",
- "MAX_CARDINALITY", "2011",
- "MEASURES", "c",
- "MEMBER", "2003", "2011", "c",
- "MERGE", "2003", "2011", "c",
- "METHOD", "99", "2003", "2011", "c",
- "MIN", "92", "2011", "c",
- "MINUS", "c",
- "MINUTE", "92", "99", "2003", "2011", "c",
- "MINUTES", "2011",
- "MOD", "2011", "c",
- "MODIFIES", "99", "2003", "2011", "c",
- "MODULE", "92", "99", "2003", "2011", "c",
- "MONTH", "92", "99", "2003", "2011", "c",
- "MULTISET", "2003", "2011", "c",
- "NAMES", "92", "99",
- "NATIONAL", "92", "99", "2003", "2011", "c",
- "NATURAL", "92", "99", "2003", "2011", "c",
- "NCHAR", "92", "99", "2003", "2011", "c",
- "NCLOB", "99", "2003", "2011", "c",
- "NEW", "99", "2003", "2011", "c",
- "NEXT", "92", "99", "c",
- "NO", "92", "99", "2003", "2011", "c",
- "NONE", "99", "2003", "2011", "c",
- "NORMALIZE", "2011", "c",
- "NOT", "92", "99", "2003", "2011", "c",
- "NTH_VALUE", "2011",
- "NTILE", "2011",
- "NULL", "92", "99", "2003", "2011", "c",
- "NULLIF", "92", "2011", "c",
- "NUMERIC", "92", "99", "2003", "2011", "c",
- "OBJECT", "99",
- "OCCURRENCES_REGEX", "2011",
- "OCTET_LENGTH", "92", "2011", "c",
- "OF", "92", "99", "2003", "2011", "c",
- "OFFSET", "2011", "c",
- "OLD", "99", "2003", "2011", "c",
- "ON", "92", "99", "2003", "2011", "c",
- "ONLY", "92", "99", "2003", "2011", "c",
- "OPEN", "92", "99", "2003", "2011", "c",
- "OPTION", "92", "99",
- "OR", "92", "99", "2003", "2011", "c",
- "ORDER", "92", "99", "2003", "2011", "c",
- "ORDINALITY", "99",
- "OUT", "92", "99", "2003", "2011", "c",
- "OUTER", "92", "99", "2003", "2011", "c",
- "OUTPUT", "92", "99", "2003",
- "OVER", "99", "2003", "2011", "c",
- "OVERLAPS", "92", "99", "2003", "2011", "c",
- "OVERLAY", "2011", "c",
- "PAD", "92", "99",
- "PARAMETER", "92", "99", "2003", "2011", "c",
- "PARTIAL", "92", "99",
- "PARTITION", "99", "2003", "2011", "c",
- "PATH", "92", "99",
- "PATTERN", "c",
- "PERCENTILE_CONT", "2011", "c",
- "PERCENTILE_DISC", "2011", "c",
- "PERCENT_RANK", "2011", "c",
- "PERMUTE", "c",
- "POSITION", "92", "2011", "c",
- "POSITION_REGEX", "2011",
- "POWER", "2011", "c",
- "PRECISION", "92", "99", "2003", "2011", "c",
- "PREPARE", "92", "99", "2003", "2011", "c",
- "PRESERVE", "92", "99",
- "PREV", "c",
- "PRIMARY", "92", "99", "2003", "2011", "c",
- "PRIOR", "92", "99",
- "PRIVILEGES", "92", "99",
- "PROCEDURE", "92", "99", "2003", "2011", "c",
- "PUBLIC", "92", "99",
- "RANGE", "99", "2003", "2011", "c",
- "RANK", "2011", "c",
- "READ", "92", "99",
- "READS", "99", "2003", "2011", "c",
- "REAL", "92", "99", "2003", "2011", "c",
- "RECURSIVE", "99", "2003", "2011", "c",
- "REF", "99", "2003", "2011", "c",
- "REFERENCES", "92", "99", "2003", "2011", "c",
- "REFERENCING", "99", "2003", "2011", "c",
- "REGR_AVGX", "2011", "c",
- "REGR_AVGY", "2011", "c",
- "REGR_COUNT", "2011", "c",
- "REGR_INTERCEPT", "2011", "c",
- "REGR_R2", "2011", "c",
- "REGR_SLOPE", "2011", "c",
- "REGR_SXX", "2011", "c",
- "REGR_SXY", "2011", "c",
- "REGR_SYY", "2011", "c",
- "RELATIVE", "92", "99",
- "RELEASE", "99", "2003", "2011", "c",
- "REPEAT", "92", "99", "2003",
- "RESET", "c",
- "RESIGNAL", "92", "99", "2003",
- "RESTRICT", "92", "99",
- "RESULT", "99", "2003", "2011", "c",
- "RETURN", "92", "99", "2003", "2011", "c",
- "RETURNS", "92", "99", "2003", "2011", "c",
- "REVOKE", "92", "99", "2003", "2011", "c",
- "RIGHT", "92", "99", "2003", "2011", "c",
- "ROLE", "99",
- "ROLLBACK", "92", "99", "2003", "2011", "c",
- "ROLLUP", "99", "2003", "2011", "c",
- "ROUTINE", "92", "99",
- "ROW", "99", "2003", "2011", "c",
- "ROWS", "92", "99", "2003", "2011", "c",
- "ROW_NUMBER", "2011", "c",
- "RUNNING", "c",
- "SAVEPOINT", "99", "2003", "2011", "c",
- "SCHEMA", "92", "99",
- "SCOPE", "99", "2003", "2011", "c",
- "SCROLL", "92", "99", "2003", "2011", "c",
- "SEARCH", "99", "2003", "2011", "c",
- "SECOND", "92", "99", "2003", "2011", "c",
- "SECONDS", "2011",
- "SECTION", "92", "99",
- "SELECT", "92", "99", "2003", "2011", "c",
- "SENSITIVE", "99", "2003", "2011", "c",
- "SESSION", "92", "99",
- "SESSION_USER", "92", "99", "2003", "2011", "c",
- "SET", "92", "99", "2003", "2011", "c",
- "SETS", "99",
- "SIGNAL", "92", "99", "2003",
- "SIMILAR", "99", "2003", "2011", "c",
- "SIZE", "92", "99",
- "SMALLINT", "92", "99", "2003", "2011", "c",
- "SOME", "92", "99", "2003", "2011", "c",
- "SPACE", "92", "99",
- "SPECIFIC", "92", "99", "2003", "2011", "c",
- "SPECIFICTYPE", "99", "2003", "2011", "c",
- "SQL", "92", "99", "2003", "2011", "c",
- "SQLCODE", "92",
- "SQLERROR", "92",
- "SQLEXCEPTION", "92", "99", "2003", "2011", "c",
- "SQLSTATE", "92", "99", "2003", "2011", "c",
- "SQLWARNING", "92", "99", "2003", "2011", "c",
- "SQRT", "2011", "c",
- "START", "99", "2003", "2011", "c",
- "STATE", "99",
- "STATIC", "99", "2003", "2011", "c",
- "STDDEV_POP", "2011", "c",
- "STDDEV_SAMP", "2011", "c",
- "STREAM", "c",
- "SUBMULTISET", "2003", "2011", "c",
- "SUBSTRING", "92", "2011", "c",
- "SUBSTRING_REGEX", "2011",
- "SUM", "92", "2011", "c",
- "SYMMETRIC", "99", "2003", "2011", "c",
- "SYSTEM", "99", "2003", "2011", "c",
- "SYSTEM_USER", "92", "99", "2003", "2011", "c",
- "TABLE", "92", "99", "2003", "2011", "c",
- "TABLESAMPLE", "2003", "2011", "c",
- "TEMPORARY", "92", "99",
- "THEN", "92", "99", "2003", "2011", "c",
- "TIME", "92", "99", "2003", "2011", "c",
- "TIMESTAMP", "92", "99", "2003", "2011", "c",
- "TIMEZONE_HOUR", "92", "99", "2003", "2011", "c",
- "TIMEZONE_MINUTE", "92", "99", "2003", "2011", "c",
- "TINYINT", "c",
- "TO", "92", "99", "2003", "2011", "c",
- "TRAILING", "92", "99", "2003", "2011", "c",
- "TRANSACTION", "92", "99",
- "TRANSLATE", "92", "2011", "c",
- "TRANSLATE_REGEX", "2011",
- "TRANSLATION", "92", "99", "2003", "2011", "c",
- "TREAT", "99", "2003", "2011", "c",
- "TRIGGER", "99", "2003", "2011", "c",
- "TRIM", "92", "2011", "c",
- "TRIM_ARRAY", "2011",
- "TRUE", "92", "99", "2003", "2011", "c",
- "TRUNCATE", "2011",
- "UESCAPE", "2011", "c",
- "UNDER", "99",
- "UNDO", "92", "99", "2003",
- "UNION", "92", "99", "2003", "2011", "c",
- "UNIQUE", "92", "99", "2003", "2011", "c",
- "UNKNOWN", "92", "99", "2003", "2011", "c",
- "UNNEST", "99", "2003", "2011", "c",
- "UNTIL", "92", "99", "2003",
- "UPDATE", "92", "99", "2003", "2011", "c",
- "UPPER", "92", "2011", "c",
- "UPSERT", "c",
- "USAGE", "92", "99",
- "USER", "92", "99", "2003", "2011", "c",
- "USING", "92", "99", "2003", "2011", "c",
- "VALUE", "92", "99", "2003", "2011", "c",
- "VALUES", "92", "99", "2003", "2011", "c",
- "VARBINARY", "2011", "c",
- "VARCHAR", "92", "99", "2003", "2011", "c",
- "VARYING", "92", "99", "2003", "2011", "c",
- "VAR_POP", "2011", "c",
- "VAR_SAMP", "2011", "c",
- "VERSION", "2011",
- "VERSIONING", "2011",
- "VERSIONS", "2011",
- "VIEW", "92", "99",
- "WHEN", "92", "99", "2003", "2011", "c",
- "WHENEVER", "92", "99", "2003", "2011", "c",
- "WHERE", "92", "99", "2003", "2011", "c",
- "WHILE", "92", "99", "2003",
- "WIDTH_BUCKET", "2011", "c",
- "WINDOW", "99", "2003", "2011", "c",
- "WITH", "92", "99", "2003", "2011", "c",
- "WITHIN", "99", "2003", "2011", "c",
- "WITHOUT", "99", "2003", "2011", "c",
- "WORK", "92", "99",
- "WRITE", "92", "99",
- "YEAR", "92", "99", "2003", "2011", "c",
- "YEARS", "2011",
- "ZONE", "92", "99");
+ "ABS", "2011", "2014", "c",
+ "ABSOLUTE", "92", "99",
+ "ACTION", "92", "99",
+ "ADD", "92", "99", "2003",
+ "AFTER", "99",
+ "ALL", "92", "99", "2003", "2011", "2014", "c",
+ "ALLOCATE", "92", "99", "2003", "2011", "2014", "c",
+ "ALLOW", "c",
+ "ALTER", "92", "99", "2003", "2011", "2014", "c",
+ "AND", "92", "99", "2003", "2011", "2014", "c",
+ "ANY", "92", "99", "2003", "2011", "2014", "c",
+ "ARE", "92", "99", "2003", "2011", "2014", "c",
+ "ARRAY", "99", "2003", "2011", "2014", "c",
+ "ARRAY_AGG", "2011",
+ "ARRAY_MAX_CARDINALITY", "2014", "c",
+ "AS", "92", "99", "2003", "2011", "2014", "c",
+ "ASC", "92", "99",
+ "ASENSITIVE", "99", "2003", "2011", "2014", "c",
+ "ASSERTION", "92", "99",
+ "ASYMMETRIC", "99", "2003", "2011", "2014", "c",
+ "AT", "92", "99", "2003", "2011", "2014", "c",
+ "ATOMIC", "99", "2003", "2011", "2014", "c",
+ "AUTHORIZATION", "92", "99", "2003", "2011", "2014", "c",
+ "AVG", "92", "2011", "2014", "c",
+ "BEFORE", "99",
+ "BEGIN", "92", "99", "2003", "2011", "2014", "c",
+ "BEGIN_FRAME", "2014", "c",
+ "BEGIN_PARTITION", "2014", "c",
+ "BETWEEN", "92", "99", "2003", "2011", "2014", "c",
+ "BIGINT", "2003", "2011", "2014", "c",
+ "BINARY", "99", "2003", "2011", "2014", "c",
+ "BIT", "92", "99", "c",
+ "BIT_LENGTH", "92",
+ "BLOB", "99", "2003", "2011", "2014", "c",
+ "BOOLEAN", "99", "2003", "2011", "2014", "c",
+ "BOTH", "92", "99", "2003", "2011", "2014", "c",
+ "BREADTH", "99",
+ "BY", "92", "99", "2003", "2011", "2014", "c",
+ "CALL", "92", "99", "2003", "2011", "2014", "c",
+ "CALLED", "2003", "2011", "2014", "c",
+ "CARDINALITY", "2011", "2014", "c",
+ "CASCADE", "92", "99",
+ "CASCADED", "92", "99", "2003", "2011", "2014", "c",
+ "CASE", "92", "99", "2003", "2011", "2014", "c",
+ "CAST", "92", "99", "2003", "2011", "2014", "c",
+ "CATALOG", "92", "99",
+ "CEIL", "2011", "2014", "c",
+ "CEILING", "2011", "2014", "c",
+ "CHAR", "92", "99", "2003", "2011", "2014", "c",
+ "CHARACTER", "92", "99", "2003", "2011", "2014", "c",
+ "CHARACTER_LENGTH", "92", "2011", "2014", "c",
+ "CHAR_LENGTH", "92", "2011", "2014", "c",
+ "CHECK", "92", "99", "2003", "2011", "2014", "c",
+ "CLASSIFIER", "2014", "c",
+ "CLOB", "99", "2003", "2011", "2014", "c",
+ "CLOSE", "92", "99", "2003", "2011", "2014", "c",
+ "COALESCE", "92", "2011", "2014", "c",
+ "COLLATE", "92", "99", "2003", "2011", "2014", "c",
+ "COLLATION", "92", "99",
+ "COLLECT", "2011", "2014", "c",
+ "COLUMN", "92", "99", "2003", "2011", "2014", "c",
+ "COMMIT", "92", "99", "2003", "2011", "2014", "c",
+ "CONDITION", "92", "99", "2003", "2011", "2014", "c",
+ "CONNECT", "92", "99", "2003", "2011", "2014", "c",
+ "CONNECTION", "92", "99",
+ "CONSTRAINT", "92", "99", "2003", "2011", "2014", "c",
+ "CONSTRAINTS", "92", "99",
+ "CONSTRUCTOR", "99",
+ "CONTAINS", "92", "2011", "2014", "c",
+ "CONTINUE", "92", "99", "2003",
+ "CONVERT", "92", "2011", "2014", "c",
+ "CORR", "2011", "2014", "c",
+ "CORRESPONDING", "92", "99", "2003", "2011", "2014", "c",
+ "COUNT", "92", "2011", "2014", "c",
+ "COVAR_POP", "2011", "2014", "c",
+ "COVAR_SAMP", "2011", "2014", "c",
+ "CREATE", "92", "99", "2003", "2011", "2014", "c",
+ "CROSS", "92", "99", "2003", "2011", "2014", "c",
+ "CUBE", "99", "2003", "2011", "2014", "c",
+ "CUME_DIST", "2011", "2014", "c",
+ "CURRENT", "92", "99", "2003", "2011", "2014", "c",
+ "CURRENT_CATALOG", "2011", "2014", "c",
+ "CURRENT_DATE", "92", "99", "2003", "2011", "2014", "c",
+ "CURRENT_DEFAULT_TRANSFORM_GROUP", "99", "2003", "2011", "2014", "c",
+ "CURRENT_PATH", "92", "99", "2003", "2011", "2014", "c",
+ "CURRENT_ROLE", "99", "2003", "2011", "2014", "c",
+ "CURRENT_ROW", "2014", "c",
+ "CURRENT_SCHEMA", "2011", "2014", "c",
+ "CURRENT_TIME", "92", "99", "2003", "2011", "2014", "c",
+ "CURRENT_TIMESTAMP", "92", "99", "2003", "2011", "2014", "c",
+ "CURRENT_TRANSFORM_GROUP_FOR_TYPE", "99", "2003", "2011", "2014", "c",
+ "CURRENT_USER", "92", "99", "2003", "2011", "2014", "c",
+ "CURSOR", "92", "99", "2003", "2011", "2014", "c",
+ "CYCLE", "99", "2003", "2011", "2014", "c",
+ "DATA", "99",
+ "DATE", "92", "99", "2003", "2011", "2014", "c",
+ "DAY", "92", "99", "2003", "2011", "2014", "c",
+ "DAYS", "2011",
+ "DEALLOCATE", "92", "99", "2003", "2011", "2014", "c",
+ "DEC", "92", "99", "2003", "2011", "2014", "c",
+ "DECIMAL", "92", "99", "2003", "2011", "2014", "c",
+ "DECLARE", "92", "99", "2003", "2011", "2014", "c",
+ "DEFAULT", "92", "99", "2003", "2011", "2014", "c",
+ "DEFERRABLE", "92", "99",
+ "DEFERRED", "92", "99",
+ "DEFINE", "2014", "c",
+ "DELETE", "92", "99", "2003", "2011", "2014", "c",
+ "DENSE_RANK", "2011", "2014", "c",
+ "DEPTH", "99",
+ "DEREF", "99", "2003", "2011", "2014", "c",
+ "DESC", "92", "99",
+ "DESCRIBE", "92", "99", "2003", "2011", "2014", "c",
+ "DESCRIPTOR", "92", "99",
+ "DETERMINISTIC", "92", "99", "2003", "2011", "2014", "c",
+ "DIAGNOSTICS", "92", "99",
+ "DISALLOW", "c",
+ "DISCONNECT", "92", "99", "2003", "2011", "2014", "c",
+ "DISTINCT", "92", "99", "2003", "2011", "2014", "c",
+ "DO", "92", "99", "2003",
+ "DOMAIN", "92", "99",
+ "DOUBLE", "92", "99", "2003", "2011", "2014", "c",
+ "DROP", "92", "99", "2003", "2011", "2014", "c",
+ "DYNAMIC", "99", "2003", "2011", "2014", "c",
+ "EACH", "99", "2003", "2011", "2014", "c",
+ "ELEMENT", "2003", "2011", "2014", "c",
+ "ELSE", "92", "99", "2003", "2011", "2014", "c",
+ "ELSEIF", "92", "99", "2003",
+ "EMPTY", "2014", "c",
+ "END", "92", "99", "2003", "2011", "2014", "c",
+ "END-EXEC", "2011", "2014", "c",
+ "END_FRAME", "2014", "c",
+ "END_PARTITION", "2014", "c",
+ "EQUALS", "99", "2014", "c",
+ "ESCAPE", "92", "99", "2003", "2011", "2014", "c",
+ "EVERY", "2011", "2014", "c",
+ "EXCEPT", "92", "99", "2003", "2011", "2014", "c",
+ "EXCEPTION", "92", "99",
+ "EXEC", "92", "99", "2003", "2011", "2014", "c",
+ "EXECUTE", "92", "99", "2003", "2011", "2014", "c",
+ "EXISTS", "92", "99", "2003", "2011", "2014", "c",
+ "EXIT", "92", "99", "2003",
+ "EXP", "2011", "2014", "c",
+ "EXPLAIN", "c",
+ "EXTEND", "c",
+ "EXTERNAL", "92", "99", "2003", "2011", "2014", "c",
+ "EXTRACT", "92", "2011", "2014", "c",
+ "FALSE", "92", "99", "2003", "2011", "2014", "c",
+ "FETCH", "92", "99", "2003", "2011", "2014", "c",
+ "FILTER", "99", "2003", "2011", "2014", "c",
+ "FIRST", "92", "99",
+ "FIRST_VALUE", "2011", "2014", "c",
+ "FLOAT", "92", "99", "2003", "2011", "2014", "c",
+ "FLOOR", "2011", "2014", "c",
+ "FOR", "92", "99", "2003", "2011", "2014", "c",
+ "FOREIGN", "92", "99", "2003", "2011", "2014", "c",
+ "FOREVER", "2011",
+ "FOUND", "92", "99",
+ "FRAME_ROW", "2014", "c",
+ "FREE", "99", "2003", "2011", "2014", "c",
+ "FROM", "92", "99", "2003", "2011", "2014", "c",
+ "FULL", "92", "99", "2003", "2011", "2014", "c",
+ "FUNCTION", "92", "99", "2003", "2011", "2014", "c",
+ "FUSION", "2011", "2014", "c",
+ "GENERAL", "99",
+ "GET", "92", "99", "2003", "2011", "2014", "c",
+ "GLOBAL", "92", "99", "2003", "2011", "2014", "c",
+ "GO", "92", "99",
+ "GOTO", "92", "99",
+ "GRANT", "92", "99", "2003", "2011", "2014", "c",
+ "GROUP", "92", "99", "2003", "2011", "2014", "c",
+ "GROUPING", "99", "2003", "2011", "2014", "c",
+ "GROUPS", "2014", "c",
+ "HANDLER", "92", "99", "2003",
+ "HAVING", "92", "99", "2003", "2011", "2014", "c",
+ "HOLD", "99", "2003", "2011", "2014", "c",
+ "HOUR", "92", "99", "2003", "2011", "2014", "c",
+ "HOURS", "2011",
+ "IDENTITY", "92", "99", "2003", "2011", "2014", "c",
+ "IF", "92", "99", "2003",
+ "IMMEDIATE", "92", "99", "2003",
+ "IMMEDIATELY",
+ "IMPORT", "c",
+ "IN", "92", "99", "2003", "2011", "2014", "c",
+ "INDICATOR", "92", "99", "2003", "2011", "2014", "c",
+ "INITIAL", "2014", "c",
+ "INITIALLY", "92", "99",
+ "INNER", "92", "99", "2003", "2011", "2014", "c",
+ "INOUT", "92", "99", "2003", "2011", "2014", "c",
+ "INPUT", "92", "99", "2003",
+ "INSENSITIVE", "92", "99", "2003", "2011", "2014", "c",
+ "INSERT", "92", "99", "2003", "2011", "2014", "c",
+ "INT", "92", "99", "2003", "2011", "2014", "c",
+ "INTEGER", "92", "99", "2003", "2011", "2014", "c",
+ "INTERSECT", "92", "99", "2003", "2011", "2014", "c",
+ "INTERSECTION", "2011", "2014", "c",
+ "INTERVAL", "92", "99", "2003", "2011", "2014", "c",
+ "INTO", "92", "99", "2003", "2011", "2014", "c",
+ "IS", "92", "99", "2003", "2011", "2014", "c",
+ "ISOLATION", "92", "99",
+ "ITERATE", "99", "2003",
+ "JOIN", "92", "99", "2003", "2011", "2014", "c",
+ "KEEP", "2011",
+ "KEY", "92", "99",
+ "LAG", "2011", "2014", "c",
+ "LANGUAGE", "92", "99", "2003", "2011", "2014", "c",
+ "LARGE", "99", "2003", "2011", "2014", "c",
+ "LAST", "92", "99",
+ "LAST_VALUE", "2011", "2014", "c",
+ "LATERAL", "99", "2003", "2011", "2014", "c",
+ "LEAD", "2011", "2014", "c",
+ "LEADING", "92", "99", "2003", "2011", "2014", "c",
+ "LEAVE", "92", "99", "2003",
+ "LEFT", "92", "99", "2003", "2011", "2014", "c",
+ "LEVEL", "92", "99",
+ "LIKE", "92", "99", "2003", "2011", "2014", "c",
+ "LIKE_REGEX", "2011", "2014", "c",
+ "LIMIT", "c",
+ "LN", "2011", "2014", "c",
+ "LOCAL", "92", "99", "2003", "2011", "2014", "c",
+ "LOCALTIME", "99", "2003", "2011", "2014", "c",
+ "LOCALTIMESTAMP", "99", "2003", "2011", "2014", "c",
+ "LOCATOR", "99",
+ "LOOP", "92", "99", "2003",
+ "LOWER", "92", "2011", "2014", "c",
+ "MAP", "99",
+ "MATCH", "92", "99", "2003", "2011", "2014", "c",
+ "MATCHES", "2014", "c",
+ "MATCH_NUMBER", "2014", "c",
+ "MATCH_RECOGNIZE", "2014", "c",
+ "MAX", "92", "2011", "2014", "c",
+ "MAX_CARDINALITY", "2011",
+ "MEASURES", "c",
+ "MEMBER", "2003", "2011", "2014", "c",
+ "MERGE", "2003", "2011", "2014", "c",
+ "METHOD", "99", "2003", "2011", "2014", "c",
+ "MIN", "92", "2011", "2014", "c",
+ "MINUS", "c",
+ "MINUTE", "92", "99", "2003", "2011", "2014", "c",
+ "MINUTES", "2011",
+ "MOD", "2011", "2014", "c",
+ "MODIFIES", "99", "2003", "2011", "2014", "c",
+ "MODULE", "92", "99", "2003", "2011", "2014", "c",
+ "MONTH", "92", "99", "2003", "2011", "2014", "c",
+ "MULTISET", "2003", "2011", "2014", "c",
+ "NAMES", "92", "99",
+ "NATIONAL", "92", "99", "2003", "2011", "2014", "c",
+ "NATURAL", "92", "99", "2003", "2011", "2014", "c",
+ "NCHAR", "92", "99", "2003", "2011", "2014", "c",
+ "NCLOB", "99", "2003", "2011", "2014", "c",
+ "NEW", "99", "2003", "2011", "2014", "c",
+ "NEXT", "92", "99", "c",
+ "NO", "92", "99", "2003", "2011", "2014", "c",
+ "NONE", "99", "2003", "2011", "2014", "c",
+ "NORMALIZE", "2011", "2014", "c",
+ "NOT", "92", "99", "2003", "2011", "2014", "c",
+ "NTH_VALUE", "2011", "2014", "c",
+ "NTILE", "2011", "2014", "c",
+ "NULL", "92", "99", "2003", "2011", "2014", "c",
+ "NULLIF", "92", "2011", "2014", "c",
+ "NUMERIC", "92", "99", "2003", "2011", "2014", "c",
+ "OBJECT", "99",
+ "OCCURRENCES_REGEX", "2011", "2014", "c",
+ "OCTET_LENGTH", "92", "2011", "2014", "c",
+ "OF", "92", "99", "2003", "2011", "2014", "c",
+ "OFFSET", "2011", "2014", "c",
+ "OLD", "99", "2003", "2011", "2014", "c",
+ "OMIT", "2014", "c",
+ "ON", "92", "99", "2003", "2011", "2014", "c",
+ "ONE", "2014", "c",
+ "ONLY", "92", "99", "2003", "2011", "2014", "c",
+ "OPEN", "92", "99", "2003", "2011", "2014", "c",
+ "OPTION", "92", "99",
+ "OR", "92", "99", "2003", "2011", "2014", "c",
+ "ORDER", "92", "99", "2003", "2011", "2014", "c",
+ "ORDINALITY", "99",
+ "OUT", "92", "99", "2003", "2011", "2014", "c",
+ "OUTER", "92", "99", "2003", "2011", "2014", "c",
+ "OUTPUT", "92", "99", "2003",
+ "OVER", "99", "2003", "2011", "2014", "c",
+ "OVERLAPS", "92", "99", "2003", "2011", "2014", "c",
+ "OVERLAY", "2011", "2014", "c",
+ "PAD", "92", "99",
+ "PARAMETER", "92", "99", "2003", "2011", "2014", "c",
+ "PARTIAL", "92", "99",
+ "PARTITION", "99", "2003", "2011", "2014", "c",
+ "PATH", "92", "99",
+ "PATTERN", "2014", "c",
+ "PER", "2014", "c",
+ "PERCENT", "2014", "c",
+ "PERCENTILE_CONT", "2011", "2014", "c",
+ "PERCENTILE_DISC", "2011", "2014", "c",
+ "PERCENT_RANK", "2011", "2014", "c",
+ "PERIOD", "2014", "c",
+ "PERMUTE", "c",
+ "PORTION", "2014", "c",
+ "POSITION", "92", "2011", "2014", "c",
+ "POSITION_REGEX", "2011", "2014", "c",
+ "POWER", "2011", "2014", "c",
+ "PRECEDES", "2014", "c",
+ "PRECISION", "92", "99", "2003", "2011", "2014", "c",
+ "PREPARE", "92", "99", "2003", "2011", "2014", "c",
+ "PRESERVE", "92", "99",
+ "PREV", "c",
+ "PRIMARY", "92", "99", "2003", "2011", "2014", "c",
+ "PRIOR", "92", "99",
+ "PRIVILEGES", "92", "99",
+ "PROCEDURE", "92", "99", "2003", "2011", "2014", "c",
+ "PUBLIC", "92", "99",
+ "RANGE", "99", "2003", "2011", "2014", "c",
+ "RANK", "2011", "2014", "c",
+ "READ", "92", "99",
+ "READS", "99", "2003", "2011", "2014", "c",
+ "REAL", "92", "99", "2003", "2011", "2014", "c",
+ "RECURSIVE", "99", "2003", "2011", "2014", "c",
+ "REF", "99", "2003", "2011", "2014", "c",
+ "REFERENCES", "92", "99", "2003", "2011", "2014", "c",
+ "REFERENCING", "99", "2003", "2011", "2014", "c",
+ "REGR_AVGX", "2011", "2014", "c",
+ "REGR_AVGY", "2011", "2014", "c",
+ "REGR_COUNT", "2011", "2014", "c",
+ "REGR_INTERCEPT", "2011", "2014", "c",
+ "REGR_R2", "2011", "2014", "c",
+ "REGR_SLOPE", "2011", "2014", "c",
+ "REGR_SXX", "2011", "2014", "c",
+ "REGR_SXY", "2011", "2014", "c",
+ "REGR_SYY", "2011", "2014", "c",
+ "RELATIVE", "92", "99",
+ "RELEASE", "99", "2003", "2011", "2014", "c",
+ "REPEAT", "92", "99", "2003",
+ "RESET", "c",
+ "RESIGNAL", "92", "99", "2003",
+ "RESTRICT", "92", "99",
+ "RESULT", "99", "2003", "2011", "2014", "c",
+ "RETURN", "92", "99", "2003", "2011", "2014", "c",
+ "RETURNS", "92", "99", "2003", "2011", "2014", "c",
+ "REVOKE", "92", "99", "2003", "2011", "2014", "c",
+ "RIGHT", "92", "99", "2003", "2011", "2014", "c",
+ "ROLE", "99",
+ "ROLLBACK", "92", "99", "2003", "2011", "2014", "c",
+ "ROLLUP", "99", "2003", "2011", "2014", "c",
+ "ROUTINE", "92", "99",
+ "ROW", "99", "2003", "2011", "2014", "c",
+ "ROWS", "92", "99", "2003", "2011", "2014", "c",
+ "ROW_NUMBER", "2011", "2014", "c",
+ "RUNNING", "2014", "c",
+ "SAVEPOINT", "99", "2003", "2011", "2014", "c",
+ "SCHEMA", "92", "99",
+ "SCOPE", "99", "2003", "2011", "2014", "c",
+ "SCROLL", "92", "99", "2003", "2011", "2014", "c",
+ "SEARCH", "99", "2003", "2011", "2014", "c",
+ "SECOND", "92", "99", "2003", "2011", "2014", "c",
+ "SECONDS", "2011",
+ "SECTION", "92", "99",
+ "SEEK", "2014", "c",
+ "SELECT", "92", "99", "2003", "2011", "2014", "c",
+ "SENSITIVE", "99", "2003", "2011", "2014", "c",
+ "SESSION", "92", "99",
+ "SESSION_USER", "92", "99", "2003", "2011", "2014", "c",
+ "SET", "92", "99", "2003", "2011", "2014", "c",
+ "SETS", "99",
+ "SHOW", "2014", "c",
+ "SIGNAL", "92", "99", "2003",
+ "SIMILAR", "99", "2003", "2011", "2014", "c",
+ "SIZE", "92", "99",
+ "SKIP", "2014", "c",
+ "SMALLINT", "92", "99", "2003", "2011", "2014", "c",
+ "SOME", "92", "99", "2003", "2011", "2014", "c",
+ "SPACE", "92", "99",
+ "SPECIFIC", "92", "99", "2003", "2011", "2014", "c",
+ "SPECIFICTYPE", "99", "2003", "2011", "2014", "c",
+ "SQL", "92", "99", "2003", "2011", "2014", "c",
+ "SQLCODE", "92",
+ "SQLERROR", "92",
+ "SQLEXCEPTION", "92", "99", "2003", "2011", "2014", "c",
+ "SQLSTATE", "92", "99", "2003", "2011", "2014", "c",
+ "SQLWARNING", "92", "99", "2003", "2011", "2014", "c",
+ "SQRT", "2011", "2014", "c",
+ "START", "99", "2003", "2011", "2014", "c",
+ "STATE", "99",
+ "STATIC", "99", "2003", "2011", "2014", "c",
+ "STDDEV_POP", "2011", "2014", "c",
+ "STDDEV_SAMP", "2011", "2014", "c",
+ "STREAM", "c",
+ "SUBMULTISET", "2003", "2011", "2014", "c",
+ "SUBSET", "2014", "c",
+ "SUBSTRING", "92", "2011", "2014", "c",
+ "SUBSTRING_REGEX", "2011", "2014", "c",
+ "SUCCEEDS", "2014", "c",
+ "SUM", "92", "2011", "2014", "c",
+ "SYMMETRIC", "99", "2003", "2011", "2014", "c",
+ "SYSTEM", "99", "2003", "2011", "2014", "c",
+ "SYSTEM_TIME", "2014", "c",
+ "SYSTEM_USER", "92", "99", "2003", "2011", "2014", "c",
+ "TABLE", "92", "99", "2003", "2011", "2014", "c",
+ "TABLESAMPLE", "2003", "2011", "2014", "c",
+ "TEMPORARY", "92", "99",
+ "THEN", "92", "99", "2003", "2011", "2014", "c",
+ "TIME", "92", "99", "2003", "2011", "2014", "c",
+ "TIMESTAMP", "92", "99", "2003", "2011", "2014", "c",
+ "TIMEZONE_HOUR", "92", "99", "2003", "2011", "2014", "c",
+ "TIMEZONE_MINUTE", "92", "99", "2003", "2011", "2014", "c",
+ "TINYINT", "c",
+ "TO", "92", "99", "2003", "2011", "2014", "c",
+ "TRAILING", "92", "99", "2003", "2011", "2014", "c",
+ "TRANSACTION", "92", "99",
+ "TRANSLATE", "92", "2011", "2014", "c",
+ "TRANSLATE_REGEX", "2011", "2014", "c",
+ "TRANSLATION", "92", "99", "2003", "2011", "2014", "c",
+ "TREAT", "99", "2003", "2011", "2014", "c",
+ "TRIGGER", "99", "2003", "2011", "2014", "c",
+ "TRIM", "92", "2011", "2014", "c",
+ "TRIM_ARRAY", "2011", "2014", "c",
+ "TRUE", "92", "99", "2003", "2011", "2014", "c",
+ "TRUNCATE", "2011", "2014", "c",
+ "UESCAPE", "2011", "2014", "c",
+ "UNDER", "99",
+ "UNDO", "92", "99", "2003",
+ "UNION", "92", "99", "2003", "2011", "2014", "c",
+ "UNIQUE", "92", "99", "2003", "2011", "2014", "c",
+ "UNKNOWN", "92", "99", "2003", "2011", "2014", "c",
+ "UNNEST", "99", "2003", "2011", "2014", "c",
+ "UNTIL", "92", "99", "2003",
+ "UPDATE", "92", "99", "2003", "2011", "2014", "c",
+ "UPPER", "92", "2011", "2014", "c",
+ "UPSERT", "c",
+ "USAGE", "92", "99",
+ "USER", "92", "99", "2003", "2011", "2014", "c",
+ "USING", "92", "99", "2003", "2011", "2014", "c",
+ "VALUE", "92", "99", "2003", "2011", "2014", "c",
+ "VALUES", "92", "99", "2003", "2011", "2014", "c",
+ "VALUE_OF", "2014", "c",
+ "VARBINARY", "2011", "2014", "c",
+ "VARCHAR", "92", "99", "2003", "2011", "2014", "c",
+ "VARYING", "92", "99", "2003", "2011", "2014", "c",
+ "VAR_POP", "2011", "2014", "c",
+ "VAR_SAMP", "2011", "2014", "c",
+ "VERSION", "2011",
+ "VERSIONING", "2011", "2014", "c",
+ "VERSIONS", "2011",
+ "VIEW", "92", "99",
+ "WHEN", "92", "99", "2003", "2011", "2014", "c",
+ "WHENEVER", "92", "99", "2003", "2011", "2014", "c",
+ "WHERE", "92", "99", "2003", "2011", "2014", "c",
+ "WHILE", "92", "99", "2003",
+ "WIDTH_BUCKET", "2011", "2014", "c",
+ "WINDOW", "99", "2003", "2011", "2014", "c",
+ "WITH", "92", "99", "2003", "2011", "2014", "c",
+ "WITHIN", "99", "2003", "2011", "2014", "c",
+ "WITHOUT", "99", "2003", "2011", "2014", "c",
+ "WORK", "92", "99",
+ "WRITE", "92", "99",
+ "YEAR", "92", "99", "2003", "2011", "2014", "c",
+ "YEARS", "2011",
+ "ZONE", "92", "99");
private static final String ANY = "(?s).*";
@@ -628,6 +657,7 @@ public class SqlParserTest {
case "99":
case "2003":
case "2011":
+ case "2014":
case "c":
assert r != null;
if (dialect == null || dialect.equals(w)) {
@@ -1602,7 +1632,7 @@ public class SqlParserTest {
// SQL standard does not allow WITH to contain WITH
checkFails("with emp2 as (select * from emp)\n"
+ "^with^ dept2 as (select * from dept)\n"
- + "select 1 as one from emp, dept",
+ + "select 1 as uno from emp, dept",
"(?s)Encountered \"with\" at .*");
}
@@ -1611,10 +1641,10 @@ public class SqlParserTest {
check("with emp2 as (select * from emp)\n"
+ "(\n"
+ " with dept2 as (select * from dept)\n"
- + " select 1 as one from empDept)",
+ + " select 1 as uno from empDept)",
"WITH `EMP2` AS (SELECT *\n"
+ "FROM `EMP`) (WITH `DEPT2` AS (SELECT *\n"
- + "FROM `DEPT`) (SELECT 1 AS `ONE`\n"
+ + "FROM `DEPT`) (SELECT 1 AS `UNO`\n"
+ "FROM `EMPDEPT`))");
}
@@ -2172,8 +2202,8 @@ public class SqlParserTest {
checkExpSame("'foo'");
checkExpSame("100");
check(
- "select 1 as one, 'x' as x, null as n from emp",
- "SELECT 1 AS `ONE`, 'x' AS `X`, NULL AS `N`\n"
+ "select 1 as uno, 'x' as x, null as n from emp",
+ "SELECT 1 AS `UNO`, 'x' AS `X`, NULL AS `N`\n"
+ "FROM `EMP`");
// Even though it looks like a date, it's just a string.
@@ -6865,9 +6895,11 @@ public class SqlParserTest {
}
}
- assertThat("At least one new reserved keyword is added in parser. "
- + "Make sure to check the new keywords are intended to be a reserved keywords.",
- reservedKeywords, is(getReservedKeywords()));
+ final String reason = "The parser has at least one new reserved keyword. "
+ + "Are you sure it should be reserved? Difference:\n"
+ + DiffTestCase.diffLines(ImmutableList.copyOf(getReservedKeywords()),
+ ImmutableList.copyOf(reservedKeywords));
+ assertThat(reason, reservedKeywords, is(getReservedKeywords()));
}
/** Generates a copy of {@code reference.md} with the current set of key
http://git-wip-us.apache.org/repos/asf/calcite/blob/d97c14c5/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java b/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java
index d598fbf..356709b 100644
--- a/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/test/SqlAdvisorTest.java
@@ -157,7 +157,9 @@ public class SqlAdvisorTest extends SqlValidatorTestCase {
"KEYWORD(GROUPING)",
"KEYWORD(HOUR)",
"KEYWORD(INTERVAL)",
+ "KEYWORD(LAG)",
"KEYWORD(LAST_VALUE)",
+ "KEYWORD(LEAD)",
"KEYWORD(LN)",
"KEYWORD(LOCALTIME)",
"KEYWORD(LOCALTIMESTAMP)",
@@ -171,6 +173,7 @@ public class SqlAdvisorTest extends SqlValidatorTestCase {
"KEYWORD(NEW)",
"KEYWORD(NEXT)",
"KEYWORD(NOT)",
+ "KEYWORD(NTILE)",
"KEYWORD(NULL)",
"KEYWORD(NULLIF)",
"KEYWORD(OCTET_LENGTH)",
@@ -199,6 +202,7 @@ public class SqlAdvisorTest extends SqlValidatorTestCase {
"KEYWORD(TRANSLATE)",
"KEYWORD(TRIM)",
"KEYWORD(TRUE)",
+ "KEYWORD(TRUNCATE)",
"KEYWORD(UNKNOWN)",
"KEYWORD(UPPER)",
"KEYWORD(USER)",
http://git-wip-us.apache.org/repos/asf/calcite/blob/d97c14c5/core/src/test/java/org/apache/calcite/test/JdbcTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
index 8138ebf..6819052 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
@@ -376,7 +376,7 @@ public class JdbcTest {
.runs();
modelWithView(
- "select \"name\", \"empid\" as e, \"salary\", \"empid\" + 3 as e3, 1 as one\n"
+ "select \"name\", \"empid\" as e, \"salary\", \"empid\" + 3 as e3, 1 as uno\n"
+ "from \"MUTABLE_EMPLOYEES\"\n"
+ "where \"commission\" = 100 AND \"deptno\" = 20",
true)
http://git-wip-us.apache.org/repos/asf/calcite/blob/d97c14c5/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
index 494ec44..64ff7a5 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -97,7 +97,7 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
@Test public void testAliasList() {
final String sql = "select a + b from (\n"
- + " select deptno, 1 as one, name from dept\n"
+ + " select deptno, 1 as uno, name from dept\n"
+ ") as d(a, b, c)\n"
+ "where c like 'X%'";
sql(sql).ok();
[3/3] calcite git commit: [CALCITE-1643] AFTER MATCH sub-clause of
MATCH_RECOGNIZE clause (Zhiqiang-He)
Posted by jh...@apache.org.
[CALCITE-1643] AFTER MATCH sub-clause of MATCH_RECOGNIZE clause (Zhiqiang-He)
Close apache/calcite#429
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/c850e227
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/c850e227
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/c850e227
Branch: refs/heads/master
Commit: c850e227db583a697c8cc46585b33274b63ed2d0
Parents: d97c14c
Author: Zhiqiang-He <ab...@qq.com>
Authored: Fri Apr 14 20:58:21 2017 +0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Apr 24 18:26:09 2017 -0700
----------------------------------------------------------------------
core/src/main/codegen/templates/Parser.jj | 38 ++++-
.../java/org/apache/calcite/rel/core/Match.java | 15 +-
.../apache/calcite/rel/core/RelFactories.java | 6 +-
.../calcite/rel/logical/LogicalMatch.java | 13 +-
.../calcite/rel/rel2sql/RelToSqlConverter.java | 14 +-
.../java/org/apache/calcite/sql/SqlKind.java | 14 +-
.../apache/calcite/sql/SqlMatchRecognize.java | 58 +++++++-
.../calcite/sql2rel/SqlToRelConverter.java | 39 ++++--
.../rel/rel2sql/RelToSqlConverterTest.java | 139 +++++++++++++++++++
.../calcite/sql/parser/SqlParserTest.java | 105 ++++++++++++++
.../apache/calcite/test/SqlValidatorTest.java | 63 ++++++---
site/_docs/reference.md | 1 +
12 files changed, 458 insertions(+), 47 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/c850e227/core/src/main/codegen/templates/Parser.jj
----------------------------------------------------------------------
diff --git a/core/src/main/codegen/templates/Parser.jj b/core/src/main/codegen/templates/Parser.jj
index 64d5936..a6672db 100644
--- a/core/src/main/codegen/templates/Parser.jj
+++ b/core/src/main/codegen/templates/Parser.jj
@@ -2497,6 +2497,9 @@ SqlMatchRecognize MatchRecognizeOpt(SqlNode tableRef) :
SqlNodeList measureList = SqlNodeList.EMPTY;
SqlNode pattern;
SqlNodeList patternDefList;
+ final SqlNode after;
+ final SqlParserPos pos;
+ final SqlNode var;
SqlLiteral isStrictStarts = SqlLiteral.createBoolean(false, getPos());
SqlLiteral isStrictEnds = SqlLiteral.createBoolean(false, getPos());
}
@@ -2506,6 +2509,36 @@ SqlMatchRecognize MatchRecognizeOpt(SqlNode tableRef) :
<MEASURES>
measureList = MeasureColumnCommaList(getPos())
]
+ (
+ <AFTER> { pos = getPos(); } <MATCH> <SKIP_>
+ (
+ <TO>
+ (
+ LOOKAHEAD(2)
+ <NEXT> <ROW> {
+ after = SqlMatchRecognize.AfterOption.SKIP_TO_NEXT_ROW
+ .symbol(pos.plus(getPos()));
+ }
+ |
+ <FIRST> var = SimpleIdentifier() {
+ after = SqlMatchRecognize.SKIP_TO_FIRST.createCall(
+ pos.plus(var.getParserPosition()), var);
+ }
+ |
+ [ <LAST> ] var = SimpleIdentifier() {
+ after = SqlMatchRecognize.SKIP_TO_LAST.createCall(
+ pos.plus(var.getParserPosition()), var);
+ }
+ )
+ |
+ <PAST> <LAST> <ROW> {
+ after = SqlMatchRecognize.AfterOption.SKIP_PAST_LAST_ROW
+ .symbol(pos.plus(getPos()));
+ }
+ )
+ |
+ { after = null; }
+ )
<PATTERN>
<LPAREN>
(
@@ -2524,7 +2557,8 @@ SqlMatchRecognize MatchRecognizeOpt(SqlNode tableRef) :
patternDefList = PatternDefinitionCommaList(getPos())
<RPAREN> {
return new SqlMatchRecognize(startPos.plus(getPos()), tableRef,
- pattern, isStrictStarts, isStrictEnds, patternDefList, measureList);
+ pattern, isStrictStarts, isStrictEnds, patternDefList, measureList,
+ after);
}
}
@@ -5814,6 +5848,7 @@ SqlPostfixOperator PostfixRowOperator() :
| < PARTITION: "PARTITION" >
| < PASCAL: "PASCAL" >
| < PASSTHROUGH: "PASSTHROUGH" >
+ | < PAST: "PAST" >
| < PATH: "PATH" >
| < PATTERN: "PATTERN" >
| < PER: "PER" >
@@ -6261,6 +6296,7 @@ String CommonNonReservedKeyWord() :
| <PARTIAL>
| <PASCAL>
| <PASSTHROUGH>
+ | <PAST>
| <PATH>
| <PLACING>
| <PLAN>
http://git-wip-us.apache.org/repos/asf/calcite/blob/c850e227/core/src/main/java/org/apache/calcite/rel/core/Match.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Match.java b/core/src/main/java/org/apache/calcite/rel/core/Match.java
index 84ef106..ae5215d 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Match.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Match.java
@@ -59,6 +59,7 @@ public abstract class Match extends SingleRel {
protected final RexNode pattern;
protected final boolean strictStart;
protected final boolean strictEnd;
+ protected final RexNode after;
protected final ImmutableMap<String, RexNode> patternDefinitions;
protected final Set<RexMRAggCall> aggregateCalls;
protected final Map<String, SortedSet<RexMRAggCall>> aggregateCallsPreVar;
@@ -76,20 +77,22 @@ public abstract class Match extends SingleRel {
* @param strictEnd Whether it is a strict end pattern
* @param patternDefinitions Pattern definitions
* @param measures Measure definitions
+ * @param after After match definitions
* @param rowType Row type
*/
protected Match(RelOptCluster cluster, RelTraitSet traitSet,
RelNode input, RexNode pattern, boolean strictStart, boolean strictEnd,
Map<String, RexNode> patternDefinitions, Map<String, RexNode> measures,
- RelDataType rowType) {
+ RexNode after, RelDataType rowType) {
super(cluster, traitSet, input);
this.pattern = Preconditions.checkNotNull(pattern);
Preconditions.checkArgument(patternDefinitions.size() > 0);
this.strictStart = strictStart;
this.strictEnd = strictEnd;
this.patternDefinitions = ImmutableMap.copyOf(patternDefinitions);
- this.rowType = rowType;
+ this.rowType = Preconditions.checkNotNull(rowType);
this.measures = ImmutableMap.copyOf(measures);
+ this.after = Preconditions.checkNotNull(after);
final AggregateFinder aggregateFinder = new AggregateFinder();
for (RexNode rex : this.patternDefinitions.values()) {
@@ -126,6 +129,10 @@ public abstract class Match extends SingleRel {
return measures;
}
+ public RexNode getAfter() {
+ return after;
+ }
+
public RexNode getPattern() {
return pattern;
}
@@ -145,7 +152,7 @@ public abstract class Match extends SingleRel {
public abstract Match copy(RelNode input, RexNode pattern,
boolean strictStart, boolean strictEnd,
Map<String, RexNode> patternDefinitions, Map<String, RexNode> measures,
- RelDataType rowType);
+ RexNode after, RelDataType rowType);
@Override public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) {
if (getInputs().equals(inputs)
@@ -154,7 +161,7 @@ public abstract class Match extends SingleRel {
}
return copy(inputs.get(0), pattern, strictStart, strictEnd,
- patternDefinitions, measures, rowType);
+ patternDefinitions, measures, after, rowType);
}
@Override public RelWriter explainTerms(RelWriter pw) {
http://git-wip-us.apache.org/repos/asf/calcite/blob/c850e227/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java b/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
index 10f9a10..5404666 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/RelFactories.java
@@ -397,7 +397,7 @@ public class RelFactories {
RelNode createMatchRecognize(RelNode input, RexNode pattern,
boolean strictStart, boolean strictEnd,
Map<String, RexNode> patternDefinitions, Map<String, RexNode> measures,
- RelDataType rowType);
+ RexNode after, RelDataType rowType);
}
/**
@@ -408,9 +408,9 @@ public class RelFactories {
public RelNode createMatchRecognize(RelNode input, RexNode pattern,
boolean strictStart, boolean strictEnd,
Map<String, RexNode> patternDefinitions, Map<String, RexNode> measures,
- RelDataType rowType) {
+ RexNode after, RelDataType rowType) {
return LogicalMatch.create(input, pattern, strictStart, strictEnd,
- patternDefinitions, measures, rowType);
+ patternDefinitions, measures, after, rowType);
}
}
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/c850e227/core/src/main/java/org/apache/calcite/rel/logical/LogicalMatch.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalMatch.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalMatch.java
index 524e8a5..62a9814 100644
--- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalMatch.java
+++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalMatch.java
@@ -43,14 +43,15 @@ public class LogicalMatch extends Match {
* @param strictEnd Whether it is a strict end pattern
* @param patternDefinitions Pattern definitions
* @param measures Measure definitions
+ * @param after After match definitions
* @param rowType Row type
*/
public LogicalMatch(RelOptCluster cluster, RelTraitSet traitSet,
RelNode input, RexNode pattern, boolean strictStart, boolean strictEnd,
Map<String, RexNode> patternDefinitions, Map<String, RexNode> measures,
- RelDataType rowType) {
+ RexNode after, RelDataType rowType) {
super(cluster, traitSet, input, pattern, strictStart, strictEnd,
- patternDefinitions, measures, rowType);
+ patternDefinitions, measures, after, rowType);
}
/**
@@ -59,11 +60,11 @@ public class LogicalMatch extends Match {
public static LogicalMatch create(RelNode input, RexNode pattern,
boolean strictStart, boolean strictEnd,
Map<String, RexNode> patternDefinitions, Map<String, RexNode> measures,
- RelDataType rowType) {
+ RexNode after, RelDataType rowType) {
final RelOptCluster cluster = input.getCluster();
final RelTraitSet traitSet = cluster.traitSetOf(Convention.NONE);
return new LogicalMatch(cluster, traitSet, input, pattern,
- strictStart, strictEnd, patternDefinitions, measures, rowType);
+ strictStart, strictEnd, patternDefinitions, measures, after, rowType);
}
//~ Methods ------------------------------------------------------
@@ -71,11 +72,11 @@ public class LogicalMatch extends Match {
@Override public Match copy(RelNode input, RexNode pattern,
boolean strictStart, boolean strictEnd,
Map<String, RexNode> patternDefinitions, Map<String, RexNode> measures,
- RelDataType rowType) {
+ RexNode after, RelDataType rowType) {
final RelTraitSet traitSet = getCluster().traitSetOf(Convention.NONE);
return new LogicalMatch(getCluster(), traitSet,
input, pattern, strictStart, strictEnd, patternDefinitions, measures,
- rowType);
+ after, rowType);
}
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/c850e227/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
index ecb75a0..cec0e03 100644
--- a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
+++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
@@ -35,6 +35,7 @@ import org.apache.calcite.rel.core.TableScan;
import org.apache.calcite.rel.core.Union;
import org.apache.calcite.rel.core.Values;
import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rex.RexCall;
import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.rex.RexLocalRef;
import org.apache.calcite.rex.RexNode;
@@ -378,6 +379,17 @@ public class RelToSqlConverter extends SqlImplementor
SqlNode tableRef = x.asQueryOrValues();
+ final SqlNode after;
+ if (e.getAfter() instanceof RexLiteral) {
+ SqlMatchRecognize.AfterOption value = (SqlMatchRecognize.AfterOption)
+ ((RexLiteral) e.getAfter()).getValue2();
+ after = SqlLiteral.createSymbol(value, POS);
+ } else {
+ RexCall call = (RexCall) e.getAfter();
+ String operand = RexLiteral.stringValue(call.getOperands().get(0));
+ after = call.getOperator().createCall(POS, new SqlIdentifier(operand, POS));
+ }
+
RexNode rexPattern = e.getPattern();
final SqlNode pattern = context.toSql(null, rexPattern);
final SqlLiteral strictStart = SqlLiteral.createBoolean(e.isStrictStart(), POS);
@@ -398,7 +410,7 @@ public class RelToSqlConverter extends SqlImplementor
}
final SqlNode matchRecognize = new SqlMatchRecognize(POS, tableRef,
- pattern, strictStart, strictEnd, patternDefList, measureList);
+ pattern, strictStart, strictEnd, patternDefList, measureList, after);
return result(matchRecognize, Expressions.list(Clause.FROM), e, null);
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/c850e227/core/src/main/java/org/apache/calcite/sql/SqlKind.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlKind.java b/core/src/main/java/org/apache/calcite/sql/SqlKind.java
index 8f49591..7a33772 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlKind.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlKind.java
@@ -469,6 +469,18 @@ public enum SqlKind {
MATCH_NUMBER,
+ /**
+ * The "SKIP TO FIRST" qualifier of restarting point in a MATCH_RECOGNIZE
+ * clause.
+ */
+ SKIP_TO_FIRST,
+
+ /**
+ * The "SKIP TO LAST" qualifier of restarting point in a MATCH_RECOGNIZE
+ * clause.
+ */
+ SKIP_TO_LAST,
+
// postfix operators
/**
@@ -1026,7 +1038,7 @@ public enum SqlKind {
TIMESTAMP_ADD, TIMESTAMP_DIFF, EXTRACT,
LITERAL_CHAIN, JDBC_FN, PRECEDING, FOLLOWING, ORDER_BY,
NULLS_FIRST, NULLS_LAST, COLLECTION_TABLE, TABLESAMPLE,
- VALUES, WITH, WITH_ITEM),
+ VALUES, WITH, WITH_ITEM, SKIP_TO_FIRST, SKIP_TO_LAST),
AGGREGATE, DML, DDL));
/**
http://git-wip-us.apache.org/repos/asf/calcite/blob/c850e227/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java b/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java
index 300e886..7fdc765 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java
@@ -29,7 +29,7 @@ import java.util.List;
import javax.annotation.Nonnull;
/**
- * SqlNode for Match_recognize clause
+ * SqlNode for MATCH_RECOGNIZE clause.
*/
public class SqlMatchRecognize extends SqlCall {
public static final int OPERAND_TABLE_REF = 0;
@@ -38,6 +38,15 @@ public class SqlMatchRecognize extends SqlCall {
public static final int OPERAND_STRICT_END = 3;
public static final int OPERAND_PATTERN_DEFINES = 4;
public static final int OPERAND_MEASURES = 5;
+ public static final int OPERAND_AFTER = 6;
+
+ public static final SqlPrefixOperator SKIP_TO_FIRST =
+ new SqlPrefixOperator("SKIP TO FIRST", SqlKind.SKIP_TO_FIRST, 20, null,
+ null, null);
+
+ public static final SqlPrefixOperator SKIP_TO_LAST =
+ new SqlPrefixOperator("SKIP TO LAST", SqlKind.SKIP_TO_LAST, 20, null,
+ null, null);
//~ Instance fields -------------------------------------------
@@ -47,11 +56,12 @@ public class SqlMatchRecognize extends SqlCall {
private SqlLiteral strictEnd;
private SqlNodeList patternDefList;
private SqlNodeList measureList;
+ private SqlNode after;
/** Creates a SqlMatchRecognize. */
public SqlMatchRecognize(SqlParserPos pos, SqlNode tableRef, SqlNode pattern,
SqlLiteral strictStart, SqlLiteral strictEnd, SqlNodeList patternDefList,
- SqlNodeList measureList) {
+ SqlNodeList measureList, SqlNode after) {
super(pos);
this.tableRef = Preconditions.checkNotNull(tableRef);
this.pattern = Preconditions.checkNotNull(pattern);
@@ -60,6 +70,7 @@ public class SqlMatchRecognize extends SqlCall {
this.patternDefList = Preconditions.checkNotNull(patternDefList);
Preconditions.checkArgument(patternDefList.size() > 0);
this.measureList = Preconditions.checkNotNull(measureList);
+ this.after = after;
}
// ~ Methods
@@ -74,7 +85,7 @@ public class SqlMatchRecognize extends SqlCall {
@Override public List<SqlNode> getOperandList() {
return ImmutableNullableList.of(tableRef, pattern, strictStart, strictEnd,
- patternDefList, measureList);
+ patternDefList, measureList, after);
}
@Override public void unparse(SqlWriter writer, int leftPrec,
@@ -107,6 +118,9 @@ public class SqlMatchRecognize extends SqlCall {
case OPERAND_MEASURES:
measureList = Preconditions.checkNotNull((SqlNodeList) operand);
break;
+ case OPERAND_AFTER:
+ after = operand;
+ break;
default:
throw new AssertionError(i);
}
@@ -136,6 +150,36 @@ public class SqlMatchRecognize extends SqlCall {
return measureList;
}
+ public SqlNode getAfter() {
+ return after;
+ }
+
+ /**
+ * Options for {@code AFTER MATCH} clause.
+ */
+ public enum AfterOption {
+ SKIP_TO_NEXT_ROW("SKIP TO NEXT ROW"),
+ SKIP_PAST_LAST_ROW("SKIP PAST LAST ROW");
+
+ private final String sql;
+
+ AfterOption(String sql) {
+ this.sql = sql;
+ }
+
+ @Override public String toString() {
+ return sql;
+ }
+
+ /**
+ * Creates a parse-tree node representing an occurrence of this symbol
+ * at a particular position in the parsed text.
+ */
+ public SqlLiteral symbol(SqlParserPos pos) {
+ return SqlLiteral.createSymbol(this, pos);
+ }
+ }
+
/**
* An operator describing a MATCH_RECOGNIZE specification.
*/
@@ -160,7 +204,7 @@ public class SqlMatchRecognize extends SqlCall {
return new SqlMatchRecognize(pos, operands[0], operands[1],
(SqlLiteral) operands[2], (SqlLiteral) operands[3],
- (SqlNodeList) operands[4], (SqlNodeList) operands[5]);
+ (SqlNodeList) operands[4], (SqlNodeList) operands[5], operands[6]);
}
@Override public <R> void acceptCall(
@@ -208,6 +252,12 @@ public class SqlMatchRecognize extends SqlCall {
writer.endList(measureFrame);
}
+ if (pattern.after != null) {
+ writer.newlineAndIndent();
+ writer.sep("AFTER MATCH");
+ pattern.after.unparse(writer, 0, 0);
+ }
+
writer.newlineAndIndent();
writer.sep("PATTERN");
http://git-wip-us.apache.org/repos/asf/calcite/blob/c850e227/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
index 573214e..abf3fca 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -2082,12 +2082,12 @@ public class SqlToRelConverter {
final SqlValidatorNamespace ns = validator.getNamespace(matchRecognize);
final SqlValidatorScope scope = validator.getMatchRecognizeScope(matchRecognize);
- final Blackboard mrBlackBoard = createBlackboard(scope, null, false);
+ final Blackboard matchBb = createBlackboard(scope, null, false);
final RelDataType rowType = ns.getRowType();
// convert inner query, could be a table name or a derived table
SqlNode expr = matchRecognize.getTableRef();
- convertFrom(mrBlackBoard, expr);
- final RelNode input = mrBlackBoard.root;
+ convertFrom(matchBb, expr);
+ final RelNode input = matchBb.root;
// convert pattern
final Set<String> patternVarsSet = new HashSet<>();
@@ -2120,7 +2120,29 @@ public class SqlToRelConverter {
};
final RexNode patternNode = pattern.accept(patternVarVisitor);
- mrBlackBoard.setPatternVarRef(true);
+ SqlNode afterMatch = matchRecognize.getAfter();
+ if (afterMatch == null) {
+ afterMatch =
+ SqlMatchRecognize.AfterOption.SKIP_TO_NEXT_ROW.symbol(SqlParserPos.ZERO);
+ }
+
+ final RexNode after;
+ if (afterMatch instanceof SqlCall) {
+ List<SqlNode> operands = ((SqlCall) afterMatch).getOperandList();
+ SqlOperator operator = ((SqlCall) afterMatch).getOperator();
+ assert operands.size() == 1;
+ SqlIdentifier id = (SqlIdentifier) operands.get(0);
+ assert patternVarsSet.contains(id.getSimple())
+ : id.getSimple() + " not defined in pattern";
+ RexNode rex = rexBuilder.makeLiteral(id.getSimple());
+ after =
+ rexBuilder.makeCall(validator.getUnknownType(), operator,
+ ImmutableList.of(rex));
+ } else {
+ after = matchBb.convertExpression(afterMatch);
+ }
+
+ matchBb.setPatternVarRef(true);
// convert measures
final ImmutableMap.Builder<String, RexNode> measureNodes =
@@ -2128,7 +2150,7 @@ public class SqlToRelConverter {
for (SqlNode measure : matchRecognize.getMeasureList()) {
List<SqlNode> operands = ((SqlCall) measure).getOperandList();
String alias = ((SqlIdentifier) operands.get(1)).getSimple();
- RexNode rex = mrBlackBoard.convertExpression(operands.get(0));
+ RexNode rex = matchBb.convertExpression(operands.get(0));
measureNodes.put(alias, rex);
}
@@ -2138,11 +2160,11 @@ public class SqlToRelConverter {
for (SqlNode def : matchRecognize.getPatternDefList()) {
List<SqlNode> operands = ((SqlCall) def).getOperandList();
String alias = ((SqlIdentifier) operands.get(1)).getSimple();
- RexNode rex = mrBlackBoard.convertExpression(operands.get(0));
+ RexNode rex = matchBb.convertExpression(operands.get(0));
definitionNodes.put(alias, rex);
}
- mrBlackBoard.setPatternVarRef(false);
+ matchBb.setPatternVarRef(false);
final RelFactories.MatchFactory factory =
RelFactories.DEFAULT_MATCH_FACTORY;
@@ -2150,8 +2172,7 @@ public class SqlToRelConverter {
factory.createMatchRecognize(input, patternNode,
matchRecognize.getStrictStart().booleanValue(),
matchRecognize.getStrictEnd().booleanValue(),
- definitionNodes.build(),
- measureNodes.build(),
+ definitionNodes.build(), measureNodes.build(), after,
rowType);
bb.setRoot(rel, false);
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/c850e227/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
index 15c8063..0357c6b 100644
--- a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
@@ -627,6 +627,7 @@ public class RelToSqlConverterTest {
String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -648,6 +649,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" + $)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -669,6 +671,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (^ \"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -690,6 +693,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (^ \"STRT\" \"DOWN\" + \"UP\" + $)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -711,6 +715,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" * \"UP\" ?)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -732,6 +737,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" {- \"DOWN\" -} \"UP\" ?)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -754,6 +760,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" { 2 } \"UP\" { 3, })\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -775,6 +782,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" { , 2 } \"UP\" { 3, 5 })\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -796,6 +804,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" {- \"DOWN\" + -} {- \"UP\" * -})\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -818,6 +827,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN "
+ "(\"A\" \"B\" \"C\" | \"A\" \"C\" \"B\" | \"B\" \"A\" \"C\" "
+ "| \"B\" \"C\" \"A\" | \"C\" \"A\" \"B\" | \"C\" \"B\" \"A\")\n"
@@ -840,6 +850,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -861,6 +872,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -900,6 +912,7 @@ public class RelToSqlConverterTest {
+ "WHERE \"customer\".\"city\" = 'San Francisco' "
+ "AND \"product_class\".\"product_department\" = 'Snacks') "
+ "MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -922,6 +935,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0)"
@@ -943,6 +957,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) "
@@ -964,6 +979,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -986,6 +1002,7 @@ public class RelToSqlConverterTest {
final String expected = "SELECT *\n"
+ "FROM (SELECT *\n"
+ "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -1016,6 +1033,7 @@ public class RelToSqlConverterTest {
+ "FINAL \"STRT\".\"net_weight\" AS \"START_NW\", "
+ "FINAL LAST(\"DOWN\".\"net_weight\", 0) AS \"BOTTOM_NW\", "
+ "FINAL LAST(\"UP\".\"net_weight\", 0) AS \"END_NW\"\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -1046,6 +1064,7 @@ public class RelToSqlConverterTest {
+ "FINAL \"STRT\".\"net_weight\" AS \"START_NW\", "
+ "FINAL LAST(\"DOWN\".\"net_weight\", 0) AS \"BOTTOM_NW\", "
+ "FINAL LAST(\"UP\".\"net_weight\", 0) AS \"END_NW\"\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -1076,6 +1095,7 @@ public class RelToSqlConverterTest {
+ "FINAL \"STRT\".\"net_weight\" AS \"START_NW\", "
+ "FINAL (RUNNING LAST(\"DOWN\".\"net_weight\", 0)) AS \"BOTTOM_NW\", "
+ "FINAL LAST(\"UP\".\"net_weight\", 0) AS \"END_NW\"\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -1106,6 +1126,7 @@ public class RelToSqlConverterTest {
+ "FINAL COUNT(\"UP\".\"net_weight\") AS \"UP_CNT\", "
+ "FINAL COUNT(\"*\".\"net_weight\") AS \"DOWN_CNT\", "
+ "FINAL (RUNNING COUNT(\"*\".\"net_weight\")) AS \"RUNNING_CNT\"\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -1138,6 +1159,7 @@ public class RelToSqlConverterTest {
+ "FINAL LAST(\"UP\".\"net_weight\", 0) AS \"UP_CNT\", "
+ "FINAL (SUM(\"DOWN\".\"net_weight\") / COUNT(\"DOWN\".\"net_weight\")) "
+ "AS \"DOWN_CNT\"\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
+ "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0) < "
@@ -1168,6 +1190,7 @@ public class RelToSqlConverterTest {
+ "FINAL FIRST(\"STRT\".\"net_weight\", 0) AS \"START_NW\", "
+ "FINAL LAST(\"DOWN\".\"net_weight\", 0) AS \"UP_CNT\", "
+ "FINAL SUM(\"DOWN\".\"net_weight\") AS \"DOWN_CNT\"\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN "
+ "(\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
@@ -1199,6 +1222,7 @@ public class RelToSqlConverterTest {
+ "FINAL FIRST(\"STRT\".\"net_weight\", 0) AS \"START_NW\", "
+ "FINAL LAST(\"DOWN\".\"net_weight\", 0) AS \"UP_CNT\", "
+ "FINAL SUM(\"DOWN\".\"net_weight\") AS \"DOWN_CNT\"\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ "PATTERN "
+ "(\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ "DEFINE "
@@ -1210,6 +1234,121 @@ public class RelToSqlConverterTest {
sql(sql).ok(expected);
}
+ @Test public void testMatchRecognizePatternSkip1() {
+ final String sql = "select *\n"
+ + " from \"product\" match_recognize\n"
+ + " (\n"
+ + " after match skip to next row\n"
+ + " pattern (strt down+ up+)\n"
+ + " define\n"
+ + " down as down.\"net_weight\" < PREV(down.\"net_weight\"),\n"
+ + " up as up.\"net_weight\" > NEXT(up.\"net_weight\")\n"
+ + " ) mr";
+ final String expected = "SELECT *\n"
+ + "FROM (SELECT *\n"
+ + "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ + "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ + "DEFINE "
+ + "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0)"
+ + " < PREV(\"DOWN\".\"net_weight\", 1), "
+ + "\"UP\" AS PREV(\"UP\".\"net_weight\", 0)"
+ + " > NEXT(PREV(\"UP\".\"net_weight\", 0), 1))";
+ sql(sql).ok(expected);
+ }
+
+ @Test public void testMatchRecognizePatternSkip2() {
+ final String sql = "select *\n"
+ + " from \"product\" match_recognize\n"
+ + " (\n"
+ + " after match skip past last row\n"
+ + " pattern (strt down+ up+)\n"
+ + " define\n"
+ + " down as down.\"net_weight\" < PREV(down.\"net_weight\"),\n"
+ + " up as up.\"net_weight\" > NEXT(up.\"net_weight\")\n"
+ + " ) mr";
+ final String expected = "SELECT *\n"
+ + "FROM (SELECT *\n"
+ + "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP PAST LAST ROW\n"
+ + "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ + "DEFINE "
+ + "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0)"
+ + " < PREV(\"DOWN\".\"net_weight\", 1), "
+ + "\"UP\" AS PREV(\"UP\".\"net_weight\", 0)"
+ + " > NEXT(PREV(\"UP\".\"net_weight\", 0), 1))";
+ sql(sql).ok(expected);
+ }
+
+ @Test public void testMatchRecognizePatternSkip3() {
+ final String sql = "select *\n"
+ + " from \"product\" match_recognize\n"
+ + " (\n"
+ + " after match skip to FIRST down\n"
+ + " pattern (strt down+ up+)\n"
+ + " define\n"
+ + " down as down.\"net_weight\" < PREV(down.\"net_weight\"),\n"
+ + " up as up.\"net_weight\" > NEXT(up.\"net_weight\")\n"
+ + " ) mr";
+ final String expected = "SELECT *\n"
+ + "FROM (SELECT *\n"
+ + "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO FIRST \"DOWN\"\n"
+ + "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ + "DEFINE "
+ + "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0)"
+ + " < PREV(\"DOWN\".\"net_weight\", 1), "
+ + "\"UP\" AS PREV(\"UP\".\"net_weight\", 0)"
+ + " > NEXT(PREV(\"UP\".\"net_weight\", 0), 1))";
+ sql(sql).ok(expected);
+ }
+
+ @Test public void testMatchRecognizePatternSkip4() {
+ final String sql = "select *\n"
+ + " from \"product\" match_recognize\n"
+ + " (\n"
+ + " after match skip to last down\n"
+ + " pattern (strt down+ up+)\n"
+ + " define\n"
+ + " down as down.\"net_weight\" < PREV(down.\"net_weight\"),\n"
+ + " up as up.\"net_weight\" > NEXT(up.\"net_weight\")\n"
+ + " ) mr";
+ final String expected = "SELECT *\n"
+ + "FROM (SELECT *\n"
+ + "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO LAST \"DOWN\"\n"
+ + "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ + "DEFINE "
+ + "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0)"
+ + " < PREV(\"DOWN\".\"net_weight\", 1), "
+ + "\"UP\" AS PREV(\"UP\".\"net_weight\", 0)"
+ + " > NEXT(PREV(\"UP\".\"net_weight\", 0), 1))";
+ sql(sql).ok(expected);
+ }
+
+ @Test public void testMatchRecognizePatternSkip5() {
+ final String sql = "select *\n"
+ + " from \"product\" match_recognize\n"
+ + " (\n"
+ + " after match skip to down\n"
+ + " pattern (strt down+ up+)\n"
+ + " define\n"
+ + " down as down.\"net_weight\" < PREV(down.\"net_weight\"),\n"
+ + " up as up.\"net_weight\" > NEXT(up.\"net_weight\")\n"
+ + " ) mr";
+ final String expected = "SELECT *\n"
+ + "FROM (SELECT *\n"
+ + "FROM \"foodmart\".\"product\") MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO LAST \"DOWN\"\n"
+ + "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n"
+ + "DEFINE "
+ + "\"DOWN\" AS PREV(\"DOWN\".\"net_weight\", 0)"
+ + " < PREV(\"DOWN\".\"net_weight\", 1), "
+ + "\"UP\" AS PREV(\"UP\".\"net_weight\", 0)"
+ + " > NEXT(PREV(\"UP\".\"net_weight\", 0), 1))";
+ sql(sql).ok(expected);
+ }
+
/** Fluid interface to run tests. */
private static class Sql {
private CalciteAssert.SchemaSpec schemaSpec;
http://git-wip-us.apache.org/repos/asf/calcite/blob/c850e227/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
index 37c6c3a..05089bf 100644
--- a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
@@ -7636,6 +7636,111 @@ public class SqlParserTest {
sql(sql).ok(expected);
}
+ @Test public void testMatchRecognizePatternSkip1() {
+ final String sql = "select *\n"
+ + " from t match_recognize\n"
+ + " (\n"
+ + " after match skip to next row\n"
+ + " pattern (strt down+ up+)\n"
+ + " define\n"
+ + " down as down.price < PREV(down.price),\n"
+ + " up as up.price > prev(up.price)\n"
+ + " ) mr";
+ final String expected = "SELECT *\n"
+ + "FROM `T` MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO NEXT ROW\n"
+ + "PATTERN (((`STRT` (`DOWN` +)) (`UP` +)))\n"
+ + "DEFINE "
+ + "`DOWN` AS (`DOWN`.`PRICE` < PREV(`DOWN`.`PRICE`, 1)), "
+ + "`UP` AS (`UP`.`PRICE` > PREV(`UP`.`PRICE`, 1))"
+ + ") AS `MR`";
+ sql(sql).ok(expected);
+ }
+
+ @Test public void testMatchRecognizePatternSkip2() {
+ final String sql = "select *\n"
+ + " from t match_recognize\n"
+ + " (\n"
+ + " after match skip past last row\n"
+ + " pattern (strt down+ up+)\n"
+ + " define\n"
+ + " down as down.price < PREV(down.price),\n"
+ + " up as up.price > prev(up.price)\n"
+ + " ) mr";
+ final String expected = "SELECT *\n"
+ + "FROM `T` MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP PAST LAST ROW\n"
+ + "PATTERN (((`STRT` (`DOWN` +)) (`UP` +)))\n"
+ + "DEFINE "
+ + "`DOWN` AS (`DOWN`.`PRICE` < PREV(`DOWN`.`PRICE`, 1)), "
+ + "`UP` AS (`UP`.`PRICE` > PREV(`UP`.`PRICE`, 1))"
+ + ") AS `MR`";
+ sql(sql).ok(expected);
+ }
+
+ @Test public void testMatchRecognizePatternSkip3() {
+ final String sql = "select *\n"
+ + " from t match_recognize\n"
+ + " (\n"
+ + " after match skip to FIRST down\n"
+ + " pattern (strt down+ up+)\n"
+ + " define\n"
+ + " down as down.price < PREV(down.price),\n"
+ + " up as up.price > prev(up.price)\n"
+ + " ) mr";
+ final String expected = "SELECT *\n"
+ + "FROM `T` MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO FIRST `DOWN`\n"
+ + "PATTERN (((`STRT` (`DOWN` +)) (`UP` +)))\n"
+ + "DEFINE "
+ + "`DOWN` AS (`DOWN`.`PRICE` < PREV(`DOWN`.`PRICE`, 1)), "
+ + "`UP` AS (`UP`.`PRICE` > PREV(`UP`.`PRICE`, 1))"
+ + ") AS `MR`";
+ sql(sql).ok(expected);
+ }
+
+ @Test public void testMatchRecognizePatternSkip4() {
+ final String sql = "select *\n"
+ + " from t match_recognize\n"
+ + " (\n"
+ + " after match skip to LAST down\n"
+ + " pattern (strt down+ up+)\n"
+ + " define\n"
+ + " down as down.price < PREV(down.price),\n"
+ + " up as up.price > prev(up.price)\n"
+ + " ) mr";
+ final String expected = "SELECT *\n"
+ + "FROM `T` MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO LAST `DOWN`\n"
+ + "PATTERN (((`STRT` (`DOWN` +)) (`UP` +)))\n"
+ + "DEFINE "
+ + "`DOWN` AS (`DOWN`.`PRICE` < PREV(`DOWN`.`PRICE`, 1)), "
+ + "`UP` AS (`UP`.`PRICE` > PREV(`UP`.`PRICE`, 1))"
+ + ") AS `MR`";
+ sql(sql).ok(expected);
+ }
+
+ @Test public void testMatchRecognizePatternSkip5() {
+ final String sql = "select *\n"
+ + " from t match_recognize\n"
+ + " (\n"
+ + " after match skip to down\n"
+ + " pattern (strt down+ up+)\n"
+ + " define\n"
+ + " down as down.price < PREV(down.price),\n"
+ + " up as up.price > prev(up.price)\n"
+ + " ) mr";
+ final String expected = "SELECT *\n"
+ + "FROM `T` MATCH_RECOGNIZE(\n"
+ + "AFTER MATCH SKIP TO LAST `DOWN`\n"
+ + "PATTERN (((`STRT` (`DOWN` +)) (`UP` +)))\n"
+ + "DEFINE "
+ + "`DOWN` AS (`DOWN`.`PRICE` < PREV(`DOWN`.`PRICE`, 1)), "
+ + "`UP` AS (`UP`.`PRICE` > PREV(`UP`.`PRICE`, 1))"
+ + ") AS `MR`";
+ sql(sql).ok(expected);
+ }
+
//~ Inner Interfaces -------------------------------------------------------
/**
http://git-wip-us.apache.org/repos/asf/calcite/blob/c850e227/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
index 94551f9..fe9261d 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
@@ -9225,11 +9225,10 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
}
@Test public void testMatchRecognizeDefines4() throws Exception {
- final String sql = "select * \n"
- + " from emp match_recognize \n"
- + " (\n"
+ final String sql = "select *\n"
+ + " from emp match_recognize (\n"
+ " pattern (strt down+ up+)\n"
- + " define \n"
+ + " define\n"
+ " down as down.sal < PREV(down.sal),\n"
+ " up as up.sal > FIRST(^PREV(up.sal)^)\n"
+ " ) mr";
@@ -9238,11 +9237,10 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
}
@Test public void testMatchRecognizeDefines5() throws Exception {
- final String sql = "select * \n"
- + " from emp match_recognize \n"
- + " (\n"
+ final String sql = "select *\n"
+ + " from emp match_recognize (\n"
+ " pattern (strt down+ up+)\n"
- + " define \n"
+ + " define\n"
+ " down as down.sal < PREV(down.sal),\n"
+ " up as up.sal > FIRST(^FIRST(up.sal)^)\n"
+ " ) mr";
@@ -9251,11 +9249,10 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
}
@Test public void testMatchRecognizeDefines6() throws Exception {
- final String sql = "select * \n"
- + " from emp match_recognize \n"
- + " (\n"
+ final String sql = "select *\n"
+ + " from emp match_recognize (\n"
+ " pattern (strt down+ up+)\n"
- + " define \n"
+ + " define\n"
+ " down as down.sal < PREV(down.sal),\n"
+ " up as up.sal > ^COUNT(down.sal, up.sal)^\n"
+ " ) mr";
@@ -9653,12 +9650,10 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
@Test public void testMatchRecognizeMeasures1() throws Exception {
final String sql = "select *\n"
- + " from emp match_recognize\n"
- + " (\n"
- + " measures "
- + " STRT.sal as start_sal,"
- + " ^LAST(null)^ as bottom_sal,"
- + " LAST(up.ts) as end_sal"
+ + " from emp match_recognize (\n"
+ + " measures STRT.sal as start_sal,"
+ + " ^LAST(null)^ as bottom_sal,"
+ + " LAST(up.ts) as end_sal"
+ " pattern (strt down+ up+)\n"
+ " define\n"
+ " down as down.sal < PREV(down.sal),\n"
@@ -9668,6 +9663,38 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
.fails("Null parameters in 'LAST\\(NULL, 0\\)'");
}
+ @Test public void testMatchRecognizeSkipTo1() throws Exception {
+ final String sql = "select *\n"
+ + " from emp match_recognize (\n"
+ + " after match skip to ^null^\n"
+ + " measures\n"
+ + " STRT.sal as start_sal,\n"
+ + " LAST(up.ts) as end_sal\n"
+ + " pattern (strt down+ up+)\n"
+ + " define\n"
+ + " down as down.sal < PREV(down.sal),\n"
+ + " up as up.sal > prev(up.sal)\n"
+ + " ) mr";
+ sql(sql)
+ .fails("(?s).*Encountered \"to null\" at .*");
+ }
+
+ @Test public void testMatchRecognizeSkipTo2() throws Exception {
+ final String sql = "select *\n"
+ + " from emp match_recognize (\n"
+ + " after match skip to ^no_exists^\n"
+ + " measures\n"
+ + " STRT.sal as start_sal,"
+ + " LAST(up.ts) as end_sal"
+ + " pattern (strt down+ up+)\n"
+ + " define\n"
+ + " down as down.sal < PREV(down.sal),\n"
+ + " up as up.sal > prev(up.sal)\n"
+ + " ) mr";
+ sql(sql)
+ .fails("(?s).*Encountered \"measures\" at .*");
+ }
+
}
// End SqlValidatorTest.java
http://git-wip-us.apache.org/repos/asf/calcite/blob/c850e227/site/_docs/reference.md
----------------------------------------------------------------------
diff --git a/site/_docs/reference.md b/site/_docs/reference.md
index d4d64f2..c942c14 100644
--- a/site/_docs/reference.md
+++ b/site/_docs/reference.md
@@ -596,6 +596,7 @@ PARTIAL,
**PARTITION**,
PASCAL,
PASSTHROUGH,
+PAST,
PATH,
**PATTERN**,
**PER**,