{"record":{"id":"edbceb1b8a0bbfd5","repo":"pola-rs/polars","slug":"the-table-s-minimum-reader-version-is-table-proto","errorCode":null,"errorMessage":"The table's minimum reader version is {table_protocol.min_reader_version} but polars delta scanner only supports version 1 or {MAX_SUPPORTED_READER_VERSION} with these reader features: {SUPPORTED_READER_FEATURES}","messagePattern":"The table's minimum reader version is (.+?) but polars delta scanner only supports version 1 or (.+?) with these reader features: (.+?)","errorType":"exception","errorClass":"DeltaProtocolError","httpStatus":null,"severity":"error","filePath":"py-polars/src/polars/io/delta/_dataset.py","lineNumber":291,"sourceCode":"                    {**(self.storage_options or {}), **credential_provider_creds}\n                    if self.storage_options is not None\n                    or self.credential_provider_builder is not None\n                    else None\n                ),\n                delta_table_options=self.delta_table_options,\n            )\n\n            table_protocol = table.protocol()\n\n            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__","sourceCodeStart":273,"sourceCodeEnd":309,"githubUrl":"https://github.com/pola-rs/polars/blob/df599052daf96e7a9cc30a3b0c6bd25d6947e3c0/py-polars/src/polars/io/delta/_dataset.py#L273-L309","documentation":"Raised as DeltaProtocolError when the table's min_reader_version exceeds what the polars delta scanner supports (or equals the explicitly unsupported version). Delta tables declare the minimum protocol a reader must implement; if the table was written with a newer protocol than polars + deltalake can honour, the read is refused rather than producing wrong results.","triggerScenarios":"pl.scan_delta()/read_delta() on a table whose protocol min_reader_version is above MAX_SUPPORTED_READER_VERSION (e.g. a table written with reader version 3+ features by Databricks or newer delta-rs).","commonSituations":"Tables written by Databricks with newer table features enabled; tables created with column mapping or other v3 features; polars/deltalake version lagging behind the writer's protocol.","solutions":["Upgrade polars (and deltalake) — supported reader versions advance with releases","Rewrite the table with a lower protocol / without the new features (e.g. delta-rs writer options or a Databricks table-property reset plus rewrite)","Read via the deltalake library (DeltaTable.to_pyarrow_dataset / to_pyarrow_table) and convert to polars if its reader supports the version","Copy the data to a fresh table written by an older writer, then scan that"],"exampleFix":"# before\npl.scan_delta(\"s3://bucket/table\")  # DeltaProtocolError: min_reader_version too high\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()\nassert proto.min_reader_version <= MAX_SUPPORTED, \"table protocol too new for polars scanner\"","typeGuard":null,"tryCatchPattern":"try:\n    df = pl.scan_delta(path).collect()\nexcept DeltaProtocolError:\n    from deltalake import DeltaTable\n    df = pl.from_arrow(DeltaTable(path).to_pyarrow_table())","preventionTips":["Pre-check table.protocol() before scanning when tables come from external writers","Keep polars/deltalake versions aligned with the newest writer in your data chain","Standardise table protocol versions across the organisation"],"tags":["delta-lake","protocol","version","compatibility"],"backgroundTag":null,"analyzedSha":"df599052daf96e7a9cc30a3b0c6bd25d6947e3c0","analyzedAt":"2026-08-16T12:10:03.978Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}