Thanks David - I've raised https://issues.apache.org/jira/browse/FLINK-39293:

Looking at the test in https://github.com/apache/flink/pull/14018, I notice 
it's not executing select * from foo​;

That seems to be the bit that throws the parser exception this time round - 
whereas https://issues.apache.org/jira/browse/FLINK-20077 presents as a problem 
with registering the view itself.

Regardless, thank you for confirming the reproduce and pointing to the existing 
issues!

--

Nic Townsend
IBM Event Processing
Architect / Senior Engineer
Slack: @nictownsend
Bluesky: @nict0wnsend.bsky.social


From: David Anderson <[email protected]>
Date: Wednesday, 18 March 2026 at 23:36
To: [email protected] <[email protected]>, Nic Townsend 
<[email protected]>
Subject: [EXTERNAL] Re: Flink 2.2.0 and match_recognise

This Message Is From an External Sender
This message came from outside your organization.
Report 
Suspicious<https://us-phishalarm-ewt.proofpoint.com/EWT/v1/AdhS1Rd-!-XFVHHVSMyOxPNu256ysWha8BOF755UsTUL_9yAs34EzvKcC1eY3cZiLXcgSHL4EmhW6F6eoFvNd_k57EtASzFns4sFadzCbN6eWXHrm50zl8N3Q4yfFPGD6mgXRlA$>

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]<mailto:[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<http://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

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