Pritam Kumar created FLINK-40263:
------------------------------------

             Summary: Enum symbol validation
                 Key: FLINK-40263
                 URL: https://issues.apache.org/jira/browse/FLINK-40263
             Project: Flink
          Issue Type: Bug
          Components: Formats (JSON, Avro, Parquet, ORC, SequenceFile)
    Affects Versions: 2.4.0
            Reporter: Pritam Kumar


h2. Problem

  FLINK-39053 taught {{RowDataToAvroConverters}} to map a {{CHAR}}/{{VARCHAR}} 
column onto an Avro {{ENUM}} field:

  {code:java}
  if (schema.getType() == Schema.Type.ENUM) {
      return new GenericData.EnumSymbol(schema, object.toString());
  }
  {code}

  {{GenericData.EnumSymbol}} does not validate its argument. A string that is 
not one of the declared symbols therefore survives the conversion and only 
fails much later, inside {{GenericDatumWriter}}:

  {noformat}
  org.apache.avro.AvroTypeException: Not an enum: ...
  {noformat}

  wrapped in {{Failed to serialize row.}} That message names neither the 
column, nor the offending value, nor the symbols that would have been accepted, 
which makes it hard to act on for a value that occurs once in a stream.

  Separately, the enum {{"default"}} attribute (Avro 1.9+) is ignored. Avro's 
own schema resolution maps an unknown symbol onto the declared default; a 
schema author who sets one is explicitly asking for that, but here the job 
fails instead.

  h2. Proposal

  Validate before constructing the symbol:

  * a declared symbol converts exactly as today;
  * an unknown symbol falls back to {{Schema#getEnumDefault()}} when the enum 
declares one;
  * otherwise fail with a message naming the value, the enum and the allowed 
symbols.

  h2. Note

  FLINK-39053 is not in a release yet, so this can land before 2.4.0 ships and 
no released behaviour changes.



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

Reply via email to