{"record":{"id":"e5883289b57a4b74","repo":"pola-rs/polars","slug":"the-table-has-set-these-reader-features-missing","errorCode":null,"errorMessage":"The table has set these reader features: {missing_features} but these are not yet supported by the polars delta scanner.","messagePattern":"The table has set these reader features: (.+?) but these are not yet supported by the polars delta scanner\\.","errorType":"exception","errorClass":"DeltaProtocolError","httpStatus":null,"severity":"error","filePath":"py-polars/src/polars/io/delta/_dataset.py","lineNumber":301,"sourceCode":"            if (\n                table_protocol.min_reader_version > MAX_SUPPORTED_READER_VERSION\n                or table_protocol.min_reader_version == NOT_SUPPORTED_READER_VERSION\n            ):\n                msg = (\n                    f\"The table's minimum reader version is {table_protocol.min_reader_version} \"\n                    f\"but polars delta scanner only supports version 1 or {MAX_SUPPORTED_READER_VERSION} with these reader features: {SUPPORTED_READER_FEATURES}\"\n                )\n                raise DeltaProtocolError(msg)\n            if (\n                table_protocol.min_reader_version >= 3\n                and table_protocol.reader_features is not None\n            ):\n                missing_features = {*table_protocol.reader_features}.difference(\n                    SUPPORTED_READER_FEATURES\n                )\n                if len(missing_features) > 0:\n                    msg = f\"The table has set these reader features: {missing_features} but these are not yet supported by the polars delta scanner.\"\n                    raise DeltaProtocolError(msg)\n\n            self.table_.set(table)\n\n        return self.table_.get()  # type: ignore[return-value]\n\n    def __getstate__(self) -> dict[str, Any]:\n        self.table_uri()\n        return self.__dict__\n\n    def __setstate__(self, state: dict[str, Any]) -> None:\n        self.__dict__ = state\n\n\ndef _extract_delta_deletion_vectors(\n    requested_paths: pl.DataFrame,\n    delta_deletion_vectors: pl.DataFrame,\n) -> pl.DataFrame:\n    \"\"\"","sourceCodeStart":283,"sourceCodeEnd":319,"githubUrl":"https://github.com/pola-rs/polars/blob/df599052daf96e7a9cc30a3b0c6bd25d6947e3c0/py-polars/src/polars/io/delta/_dataset.py#L283-L319","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Upgrade polars and deltalake to a release that supports the listed feature","Rewrite the table with the feature disabled (e.g. drop column mapping by rewriting physical names) into a fresh table","Fall back to the deltalake library for reading and convert the result to polars"],"exampleFix":"# before\npl.scan_delta(\"s3://bucket/table\")  # DeltaProtocolError: unsupported reader features\n\n# after\nfrom deltalake import DeltaTable\ndf = pl.from_arrow(DeltaTable(\"s3://bucket/table\").to_pyarrow_table())","handlingStrategy":"try-catch","validationCode":"from deltalake import DeltaTable\n\nproto = DeltaTable(path).protocol()\nif proto.min_reader_version >= 3 and proto.reader_features:\n    unsupported = set(proto.reader_features) - SUPPORTED_FEATURES\n    assert not unsupported, f\"unsupported delta features: {unsupported}\"","typeGuard":null,"tryCatchPattern":"try:\n    df = pl.scan_delta(path).collect()\nexcept DeltaProtocolError as e:\n    if \"not yet supported\" in str(e):\n        from deltalake import DeltaTable\n        df = pl.from_arrow(DeltaTable(path).to_pyarrow_table())\n    else:\n        raise","preventionTips":["Disable optional table features (e.g. column mapping) on tables destined for polars readers","Check reader_features during data-contract validation with producers","Upgrade polars when adopting new delta features upstream"],"tags":["delta-lake","protocol","reader-features","compatibility"],"backgroundTag":null,"analyzedSha":"df599052daf96e7a9cc30a3b0c6bd25d6947e3c0","analyzedAt":"2026-08-16T12:10:03.978Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}