Nic,

I was able to reproduce this, but only when I introduced the temporary
view. Applying the query directly to primary_2 worked fine.

It looks like the same problem was fixed in Flink 1.12 with FLINK-20077
[1]. Since then we've had a test for this [2], so I wonder what's going on.

It does seem appropriate to create a JIRA ticket.

David

[1] https://issues.apache.org/jira/browse/FLINK-20077
[2]
https://github.com/apache/flink/blob/release-2.2/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/operations/SqlDdlToOperationConverterTest.java#L2490

On Tue, Mar 17, 2026 at 5:12 AM Nic Townsend <[email protected]> wrote:

> Hi all,
>
> Before I raise a Jira issue I wanted to check if this is a known issue -
> or at least, whether I'm doing something wrong.
>
> tEnv.executeSql(
> "CREATE TABLE primary_2 (" +
> " ts TIMESTAMP_LTZ(3)," +
> " name STRING," +
> " contact ROW<address ROW<line1 STRING, line2 STRING>>," +
> " WATERMARK FOR ts AS ts" +
> ") WITH (" +
> " 'connector' = 'datagen'," +
> " 'rows-per-second' = '1'," +
> " 'scan.parallelism' = '1'," +
> " 'fields.name.length' = '1'," +
> " 'fields.contact.address.line1.length' = '1'," +
> " 'fields.contact.address.line2.length' = '1'" +
> ")");
>
> tEnv.executeSql("create temporary view primary_2_view as SELECT * FROM
> primary_2 MATCH_RECOGNIZE( PARTITION BY name ORDER BY ts MEASURES A.name AS
> matchname PATTERN (A) DEFINE A AS name = 'nic');");
>
> tEnv.executeSql("SELECT * FROM primary_2_view").print();
>
>
> In Flink 1.20.0, this runs correctly (it's not expected to find a pattern).
> In Flink 2.20.0 I get a SQL parse exception:
>
>
> Exception in thread "main" org.apache.flink.table.api.SqlParserException:
> SQL parse failed. Encountered "MATCH_RECOGNIZE" at line 2, column 70.
> Was expecting one of:
>     <EOF>
>     "CROSS" ...
>     "EXCEPT" ...
>     "FETCH" ...
>     "FULL" ...
>     "GROUP" ...
>     "HAVING" ...
>     "INNER" ...
>     "INTERSECT" ...
>     "JOIN" ...
>     "LEFT" ...
>     "LIMIT" ...
>     "NATURAL" ...
>     "OFFSET" ...
>     "ORDER" ...
>     "OUTER" ...
>     "QUALIFY" ...
>     "RIGHT" ...
>     "MINUS" ...
>     "TABLESAMPLE" ...
>     "UNION" ...
>     "WHERE" ...
>     "WINDOW" ...
>     "(" ...
>     "," ...
>
>         at
> org.apache.flink.table.planner.parse.CalciteParser.parse(CalciteParser.java:61)
>         at
> org.apache.flink.table.planner.calcite.FlinkPlannerImpl$ToRelContextImpl.expandView(FlinkPlannerImpl.scala:367)
>         at
> org.apache.calcite.plan.ViewExpanders$1.expandView(ViewExpanders.java:52)
>         at
> org.apache.flink.table.planner.catalog.SqlCatalogViewTable.convertToRel(SqlCatalogViewTable.java:58)
>         at
> org.apache.flink.table.planner.plan.schema.ExpandingPreparingTable.expand(ExpandingPreparingTable.java:70)
>         at
> org.apache.flink.table.planner.plan.schema.ExpandingPreparingTable.toRel(ExpandingPreparingTable.java:57)
>         at
> org.apache.calcite.sql2rel.SqlToRelConverter.toRel(SqlToRelConverter.java:4142)
>         at
> org.apache.calcite.sql2rel.SqlToRelConverter.convertIdentifier(SqlToRelConverter.java:2997)
>         at
> org.apache.calcite.sql2rel.SqlToRelConverter.convertFrom(SqlToRelConverter.java:2529)
>         at
> org.apache.calcite.sql2rel.SqlToRelConverter.convertFrom(SqlToRelConverter.java:2435)
>         at
> org.apache.calcite.sql2rel.SqlToRelConverter.convertFrom(SqlToRelConverter.java:2380)
>         at
> org.apache.calcite.sql2rel.SqlToRelConverter.convertSelectImpl(SqlToRelConverter.java:758)
>         at
> org.apache.calcite.sql2rel.SqlToRelConverter.convertSelect(SqlToRelConverter.java:746)
>         at
> org.apache.calcite.sql2rel.SqlToRelConverter.convertQueryRecursive(SqlToRelConverter.java:3967)
>         at
> org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:650)
>         at org.apache.flink.table.planner.calcite.FlinkPlannerImpl.org
> $apache$flink$table$planner$calcite$FlinkPlannerImpl$$rel(FlinkPlannerImpl.scala:235)
>         at
> org.apache.flink.table.planner.calcite.FlinkPlannerImpl.rel(FlinkPlannerImpl.scala:210)
>         at
> org.apache.flink.table.planner.operations.SqlNodeConvertContext.toRelRoot(SqlNodeConvertContext.java:82)
>         at
> org.apache.flink.table.planner.operations.converters.SqlQueryConverter.convertSqlNode(SqlQueryConverter.java:48)
>         at
> org.apache.flink.table.planner.operations.converters.SqlNodeConverters.convertSqlNode(SqlNodeConverters.java:133)
>         at
> org.apache.flink.table.planner.operations.SqlNodeToOperationConversion.convertValidatedSqlNode(SqlNodeToOperationConversion.java:231)
>         at
> org.apache.flink.table.planner.operations.SqlNodeToOperationConversion.convert(SqlNodeToOperationConversion.java:221)
>         at
> org.apache.flink.table.planner.delegation.ParserImpl.parse(ParserImpl.java:106)
>         at
> org.apache.flink.table.api.internal.TableEnvironmentImpl.executeSql(TableEnvironmentImpl.java:937)
>         at
> com.example.UnionTablesExample.executeUnionQuery(UnionTablesExample.java:54)
>         at com.example.UnionTablesExample.main(UnionTablesExample.java:23)
> Caused by: org.apache.calcite.sql.parser.SqlParseException: Encountered
> "MATCH_RECOGNIZE" at line 2, column 70.
> Was expecting one of:
>     <EOF>
>     "CROSS" ...
>     "EXCEPT" ...
>     "FETCH" ...
>     "FULL" ...
>     "GROUP" ...
>     "HAVING" ...
>     "INNER" ...
>     "INTERSECT" ...
>     "JOIN" ...
>     "LEFT" ...
>     "LIMIT" ...
>     "NATURAL" ...
>     "OFFSET" ...
>     "ORDER" ...
>     "OUTER" ...
>     "QUALIFY" ...
>     "RIGHT" ...
>     "MINUS" ...
>     "TABLESAMPLE" ...
>     "UNION" ...
>     "WHERE" ...
>     "WINDOW" ...
>     "(" ...
>     "," ...
>
>         at
> org.apache.flink.sql.parser.impl.FlinkSqlParserImpl.convertException(FlinkSqlParserImpl.java:558)
>         at
> org.apache.flink.sql.parser.impl.FlinkSqlParserImpl.normalizeException(FlinkSqlParserImpl.java:304)
>         at
> org.apache.calcite.sql.parser.SqlParser.handleException(SqlParser.java:159)
>         at
> org.apache.calcite.sql.parser.SqlParser.parseQuery(SqlParser.java:174)
>         at
> org.apache.calcite.sql.parser.SqlParser.parseStmt(SqlParser.java:199)
>         at
> org.apache.flink.table.planner.parse.CalciteParser.parse(CalciteParser.java:56)
>         ... 25 more
> Caused by: org.apache.flink.sql.parser.impl.ParseException: Encountered
> "MATCH_RECOGNIZE" at line 2, column 70.
> Was expecting one of:
>     <EOF>
>     "CROSS" ...
>     "EXCEPT" ...
>     "FETCH" ...
>     "FULL" ...
>     "GROUP" ...
>     "HAVING" ...
>     "INNER" ...
>     "INTERSECT" ...
>     "JOIN" ...
>     "LEFT" ...
>     "LIMIT" ...
>     "NATURAL" ...
>     "OFFSET" ...
>     "ORDER" ...
>     "OUTER" ...
>     "QUALIFY" ...
>     "RIGHT" ...
>     "MINUS" ...
>     "TABLESAMPLE" ...
>     "UNION" ...
>     "WHERE" ...
>     "WINDOW" ...
>     "(" ...
>     "," ...
>
>         at
> org.apache.flink.sql.parser.impl.FlinkSqlParserImpl.generateParseException(FlinkSqlParserImpl.java:54079)
>         at
> org.apache.flink.sql.parser.impl.FlinkSqlParserImpl.jj_consume_token(FlinkSqlParserImpl.java:53884)
>         at
> org.apache.flink.sql.parser.impl.FlinkSqlParserImpl.SqlStmtEof(FlinkSqlParserImpl.java:4483)
>         at
> org.apache.flink.sql.parser.impl.FlinkSqlParserImpl.parseSqlStmtEof(FlinkSqlParserImpl.java:352)
>         at
> org.apache.calcite.sql.parser.SqlParser.parseQuery(SqlParser.java:172)
>         ... 27 more
>
> I've read through the calcite 1.35 release notes and I can't find anything
> obvious regarding a change to MATCH_RECOGNIZE.
>
> Also - if I don't use a temporary view, and instead just execute the
> MATCH_RECOGNIZE select statement, it works correctly. So it seems related
> to the use of a view. But I'd like to use the output in a downstream view
> before sending the result to a sink.
>
> --
>
>
>
> Nic Townsend
>
> IBM Event Processing
>
> Architect / Senior Engineer
>
> Slack: @nictownsend
>
> Bluesky: @nict0wnsend.bsky.social
>
>
>
>
> Unless otherwise stated above:
>
> IBM United Kingdom Limited
> Registered in England and Wales with number 741598
> Registered office: Building C, IBM Hursley Office, Hursley Park Road,
> Winchester, Hampshire SO21 2JN
>

Reply via email to