risingwavelabs/risingwave · error

position-delete file

Error message

position-delete file {} has unsupported format {:?}; expected Puffin or Parquet

What it means

When reading Iceberg position-delete files to build delete vectors, only Puffin (deletion vector) and Parquet formats are supported. If the delete file's `DataFileFormat` is anything else (e.g. Avat/Orc-style formats), the reader bails because it cannot interpret the file's delete records.

Solutions

  1. Rewrite the source table's delete files to Puffin/Parquet (e.g. run a compaction/rewrite with a Spark/Flink job) so RisingWave can read them.
  2. Re-create or rewrite the table avoiding non-Puffin/Parquet position deletes (use copy-on-write or DVs).
  3. Check which engine/format produced the delete files and whether upgrading RisingWave adds support for that format.
  4. File/verify support for the specific `DataFileFormat` you hit, since the match already covers Puffin and Parquet.

Example fix

// before: engine wrote ORC position-deletes, unreadable here
// after: compact/rewrite deletes to Puffin or Parquet, e.g. Spark:
//   CALL catalog.system.rewrite_deletes(table => 'db.tbl', options => map('format','parquet'))
Defensive patterns

Strategy: validation

Validate before calling

fn check_delete_file_format(fmt: &str) -> Result<(), String> {
    match fmt {
        "puffin" | "parquet" => Ok(()),
        other => Err(format!("unsupported position-delete format {other}; rewrite deletes as puffin/parquet")),
    }
}

Prevention

When it happens

Trigger: Encountering a position-delete entry in the Iceberg table metadata whose format is neither `puffin` nor `parquet` — typically from tables written by another engine with different delete-file formats — while the sink collects input DVs or flushes.

Common situations: Consuming an Iceberg table produced by third-party writers (Spark/Flink with ORC deletes); tables where a writer stored position deletes in an unsupported format; stale/mismatched metadata after a writer upgrade.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11). Data as JSON: /api/errors/604e117e688995c0. Report an issue: GitHub.

Appendix: source

Thrown at src/connector/src/sink/iceberg/position_delete.rs:142

            })?;
            delete_vector.insert(pos as u64);
        }
    }

    Ok(delete_vector)
}

/// Reads the deleted positions of a single position-delete `DataFile` regardless of on-disk format,
pub async fn read_position_deletes_from_file(
    file_io: &FileIO,
    delete_file: &DataFile,
) -> Result<DeleteVector> {
    match delete_file.file_format() {
        DataFileFormat::Puffin => read_dv_positions_from_data_file(file_io, delete_file).await,
        DataFileFormat::Parquet => {
            read_parquet_position_deletes_from_file(file_io, delete_file).await
        }
        other => bail!(
            "position-delete file {} has unsupported format {:?}; expected Puffin or Parquet",
            delete_file.file_path(),
            other
        ),
    }
}

/// Writes `delete_vector` as a single Puffin deletion-vector blob referencing `data_file_path`,
/// and returns its [`DataFile`] metadata (content `PositionDeletes`, format `Puffin`) with
/// `referenced_data_file` set.
pub async fn write_dv_puffin_file(
    table: &Table,
    location_generator: &DefaultLocationGenerator,
    file_name_generator: &DefaultFileNameGenerator,
    data_file_path: String,
    delete_vector: &DeleteVector,
    partition_key: Option<&PartitionKey>,
) -> Result<DataFile> {

View on GitHub (pinned to 6469eb736d)