Ramin Gharib created FLINK-40255:
------------------------------------

             Summary: COMPILE PLAN fails for any plan containing a VARIANT type
                 Key: FLINK-40255
                 URL: https://issues.apache.org/jira/browse/FLINK-40255
             Project: Flink
          Issue Type: Bug
          Components: Table SQL / Planner
            Reporter: Ramin Gharib
            Assignee: Ramin Gharib


VARIANT plans and executes correctly, but serializing a plan containing it 
throws. {{{}COMPILE PLAN{}}}, {{StatementSet#compilePlan}} and 
{{TableEnvironment#compilePlanSql}} are unusable with VARIANT, as is plan 
restore.
h3. Symptoms

A VARIANT-typed {{{}RexNode{}}}, for example the return type of {{PARSE_JSON}} 
in a projection:
 
{code:java}
TableException: Unsupported RelDataType: VARIANT ExecNodeGraphJsonSerializer -> 
RexNodeJsonSerializer#serializeCall -> RelDataTypeJsonSerializer -> 
LogicalRelDataTypeConverter#toLogicalTypeNotNull{code}
A VARIANT in an {{ExecNode}} output type:
{code:java}
TableException: Unable to serialize logical type 'VARIANT'. 
ExecNodeGraphJsonSerializer -> LogicalTypeJsonSerializer{code}
h3. Root cause

Two {{RelDataType}} to {{LogicalType}} converters exist and only one knows 
VARIANT. {{{}o.a.f.table.planner.calcite.FlinkTypeFactory{}}}, used during 
planning, handles it at {{FlinkTypeFactory.java:490-491}} and {{{}:861{}}}. 
{{{}o.a.f.table.planner.typeutils.LogicalRelDataTypeConverter{}}}, used only by 
plan serde, has no VARIANT handling at all. Nothing forces the two to agree.
h3. Locations on master

under {{{}flink-table/flink-table-planner/.../table/planner/{}}}:
 * {{typeutils/LogicalRelDataTypeConverter.java:609}} — 
{{toLogicalTypeNotNull}} hits {{default:}} and throws
 * {{typeutils/LogicalRelDataTypeConverter.java:473}} — reverse direction 
throws, breaks restore
 * {{plan/nodes/exec/serde/LogicalTypeJsonSerializer.java:507-550}} — VARIANT 
missing from {{CompactSerializationChecker}}
 * {{plan/nodes/exec/serde/LogicalTypeJsonSerializer.java:253}} and 
{{LogicalTypeJsonDeserializer.java:169-170}} — no {{case VARIANT}}

h3. Fix

Handle VARIANT in {{LogicalRelDataTypeConverter}} both ways and add it to 
{{{}CompactSerializationChecker{}}}; that is sufficient, since the compact path 
already round-trips VARIANT via {{{}LogicalTypeParser:585-586{}}}. The explicit 
switch cases are cheap defensive coverage.

Add VARIANT to {{LogicalTypeJsonSerdeTest}} and 
{{{}RelDataTypeJsonSerdeTest{}}}, plus a {{restore-tests}} program, all at zero 
coverage today. {{VariantSemanticTest}} cannot catch this because 
{{SemanticTestBase}} never serializes a plan.



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

Reply via email to