pola-rs/polars · error · DeltaProtocolError

The table has set these reader features: {missing_features}

Error message

The table has set these reader features: {missing_features} but these are not yet supported by the polars delta scanner.

What it means

Raised as DeltaProtocolError when the table declares min_reader_version >= 3 with reader_features that polars' delta scanner does not support (features outside SUPPORTED_READER_FEATURES). Even if the protocol version is acceptable, individual table features (e.g. column mapping, DV-related features) must each be recognised.

Source

Thrown at py-polars/src/polars/io/delta/_dataset.py:301

            if (
                table_protocol.min_reader_version > MAX_SUPPORTED_READER_VERSION
                or table_protocol.min_reader_version == NOT_SUPPORTED_READER_VERSION
            ):
                msg = (
                    f"The table's minimum reader version is {table_protocol.min_reader_version} "
                    f"but polars delta scanner only supports version 1 or {MAX_SUPPORTED_READER_VERSION} with these reader features: {SUPPORTED_READER_FEATURES}"
                )
                raise DeltaProtocolError(msg)
            if (
                table_protocol.min_reader_version >= 3
                and table_protocol.reader_features is not None
            ):
                missing_features = {*table_protocol.reader_features}.difference(
                    SUPPORTED_READER_FEATURES
                )
                if len(missing_features) > 0:
                    msg = f"The table has set these reader features: {missing_features} but these are not yet supported by the polars delta scanner."
                    raise DeltaProtocolError(msg)

            self.table_.set(table)

        return self.table_.get()  # type: ignore[return-value]

    def __getstate__(self) -> dict[str, Any]:
        self.table_uri()
        return self.__dict__

    def __setstate__(self, state: dict[str, Any]) -> None:
        self.__dict__ = state


def _extract_delta_deletion_vectors(
    requested_paths: pl.DataFrame,
    delta_deletion_vectors: pl.DataFrame,
) -> pl.DataFrame:
    """

View on GitHub (pinned to df599052da)

Solutions

  1. Upgrade polars and deltalake to a release that supports the listed feature
  2. Rewrite the table with the feature disabled (e.g. drop column mapping by rewriting physical names) into a fresh table
  3. Fall back to the deltalake library for reading and convert the result to polars

Example fix

# before
pl.scan_delta("s3://bucket/table")  # DeltaProtocolError: unsupported reader features

# after
from deltalake import DeltaTable
df = pl.from_arrow(DeltaTable("s3://bucket/table").to_pyarrow_table())
Defensive patterns

Strategy: try-catch

Validate before calling

from deltalake import DeltaTable

proto = DeltaTable(path).protocol()
if proto.min_reader_version >= 3 and proto.reader_features:
    unsupported = set(proto.reader_features) - SUPPORTED_FEATURES
    assert not unsupported, f"unsupported delta features: {unsupported}"

Try / catch

try:
    df = pl.scan_delta(path).collect()
except DeltaProtocolError as e:
    if "not yet supported" in str(e):
        from deltalake import DeltaTable
        df = pl.from_arrow(DeltaTable(path).to_pyarrow_table())
    else:
        raise

Prevention

When it happens

Trigger: pl.scan_delta()/read_delta() on a v3+ table whose reader_features set contains unsupported entries such as columnMapping; the missing set is computed as the difference between the table's features and the supported ones and included in the message.

Common situations: Databricks-managed tables with column mapping or domain metadata enabled; tables created by newer delta-rs writers using recent features; testing against fixtures produced on newer stacks.

Related errors


AI-assisted analysis of pola-rs/polars@df599052da (2026-08-16). Data as JSON: /api/errors/e5883289b57a4b74. Report an issue: GitHub.