[
https://issues.apache.org/jira/browse/FLINK-40267?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
ASF GitHub Bot updated FLINK-40267:
-----------------------------------
Labels: pull-request-available (was: )
> CREATE MATERIALIZED TABLE skips persisted-metadata-column validation applied
> by CREATE OR ALTER
> -----------------------------------------------------------------------------------------------
>
> Key: FLINK-40267
> URL: https://issues.apache.org/jira/browse/FLINK-40267
> Project: Flink
> Issue Type: Bug
> Components: Table SQL / Planner
> Affects Versions: 2.2.0, 2.3.0, 2.4.0
> Reporter: Arvid Heise
> Assignee: Arvid Heise
> Priority: Major
> Labels: pull-request-available
> Fix For: 2.4.0
>
>
> SqlCreateOrAlterMaterializedTableConverter#getMergedSchema selects one of two
> validators for the same invariant — every persisted column in the schema part
> must be produced by the query part:
> - CREATE OR ALTER →
> MaterializedTableUtils#validatePersistedColumnsUsedByQuery: checks physical
> columns and non-virtual metadata columns, unwraps SqlTableColumnPosition.
> - plain CREATE → converter-private validatePhysicalColumnsUsedByQuery:
> continues on anything that is not a SqlRegularColumn.
> A CREATE MATERIALIZED TABLE declaring a persisted metadata column absent from
> the AS SELECT is therefore accepted. The materialized table is created, and
> the refresh pipeline fails at compile time in DynamicSinkUtils with "Column
> types of query result and sink do not match / Different number of columns",
> because persisted metadata columns are part of the sink's consumed row type.
>
> {noformat}
> CREATE TABLE src (order_id STRING NOT NULL, price DOUBLE);
> CREATE MATERIALIZED TABLE mt (
> `order_id` STRING NOT NULL,
> `price` DOUBLE,
> `kafka_ts` TIMESTAMP_LTZ(3) METADATA FROM 'timestamp'
> ) AS SELECT order_id, price FROM src;
> {noformat}
>
> The identical statement written as CREATE OR ALTER on a non-existing table is
> rejected synchronously with a precise message, which contradicts the FLIP-546
> equivalence of the two forms.
> The split originates in FLINK-38674 (physical-only check, added inline for
> schema definition on CREATE) and FLINK-38766 (persisted check, added for
> ALTER MATERIALIZED TABLE ADD). FLINK-39700 extracted the former and routed
> only CREATE OR ALTER to the latter.
> Fix: call validatePersistedColumnsUsedByQuery on both branches and drop
> validatePhysicalColumnsUsedByQuery (strict superset). Parameterize the
> statement kind in PERSISTED_COLUMN_NOT_USED_IN_QUERY, whose prefix is
> hardcoded to "Failed to execute ALTER MATERIALIZED TABLE statement." and
> already misfires on the CREATE OR ALTER path. Update the message assertions
> in SqlMaterializedTableNodeToOperationConverterTest and add CREATE-side
> coverage.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)