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**,