Martijn Visser created FLINK-40694:
--------------------------------------

             Summary: INSERT INTO with a column list fails over a process table 
function with a set-semantic table argument
                 Key: FLINK-40694
                 URL: https://issues.apache.org/jira/browse/FLINK-40694
             Project: Flink
          Issue Type: Bug
          Components: Table SQL / Planner
    Affects Versions: 2.3.0, 2.4.0
            Reporter: Martijn Visser


An INSERT INTO that has an explicit target column list, or static partitions, 
fails during
SQL-to-Rel conversion when its source query reads from a process table function 
with a
set-semantic table argument.

INSERT INTO snk (id, payload)
SELECT id, payload FROM f(r => TABLE src PARTITION BY id, i => 1);

java.lang.IllegalStateException: must call validate first
        at 
org.apache.calcite.sql.validate.IdentifierNamespace.resolve(IdentifierNamespace.java:255)
        at 
org.apache.calcite.sql2rel.SqlToRelConverter.convertIdentifier(SqlToRelConverter.java:3112)
        at 
org.apache.calcite.sql2rel.SqlToRelConverter.substituteSubQueryOfSetSemanticsInputTable(SqlToRelConverter.java:1545)
        at 
org.apache.calcite.sql2rel.SqlToRelConverter.convertCollectionTable(SqlToRelConverter.java:3170)

{{PreValidateReWriter}} only runs when the statement has a target column list 
or static
partitions, and it validates the source query once so that it can rewrite it.
{{FlinkPlannerImpl.validateRichSqlInsert}} then validates the same node a 
second time with the
same validator, which leaves the namespace of the set-semantic table argument 
unvalidated.
Dropping the column list avoids the rewrite and the statement works.

On 2.0 up to 2.3 the same guard in Calcite is an assert, so with assertions 
disabled the failure
is a NullPointerException without a message instead.

Same cause as FLINK-40039, which moved CTAS and RTAS off that rewrite.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to