{"record":{"id":"bcf522e4451eeecf","repo":"pola-rs/polars","slug":"reading-delta-deletion-vectors-requires-deltalake","errorCode":null,"errorMessage":"reading delta deletion vectors requires deltalake >= {'.'.join(str(v) for v in dv_min_version)}, found {installed}.","messagePattern":"reading delta deletion vectors requires deltalake >= (.+?), found (.+?)\\.","errorType":"exception","errorClass":"ImportError","httpStatus":null,"severity":"error","filePath":"py-polars/src/polars/io/delta/_dataset.py","lineNumber":195,"sourceCode":"\n        reader_features = table.protocol().reader_features\n        has_deletion_vectors = (\n            reader_features is not None and \"deletionVectors\" in reader_features\n        )\n\n        deletion_files: DeletionFiles | None = None\n        if has_deletion_vectors:\n            import deltalake\n\n            dv_min_version = (1, 4, 2)\n            installed = parse_version(deltalake.__version__)\n            if installed < dv_min_version:\n                msg = (\n                    f\"reading delta deletion vectors requires \"\n                    f\"deltalake >= {'.'.join(str(v) for v in dv_min_version)}, \"\n                    f\"found {installed}.\"\n                )\n                raise ImportError(msg)\n\n            def _deletion_vector_callback(\n                requested_paths: pl.DataFrame,\n            ) -> pl.DataFrame:\n                delta_deletion_vectors = _fetch_deletion_vectors(table)\n                if delta_deletion_vectors is None:\n                    return pl.DataFrame(\n                        {\"selection_vector\": [None] * len(requested_paths)},\n                        schema={\"selection_vector\": pl.List(pl.Boolean)},\n                    )\n                return _extract_delta_deletion_vectors(\n                    requested_paths, delta_deletion_vectors\n                )\n\n            deletion_files = (\n                \"delta-deletion-vector\",\n                _deletion_vector_callback,\n            )","sourceCodeStart":177,"sourceCodeEnd":213,"githubUrl":"https://github.com/pola-rs/polars/blob/df599052daf96e7a9cc30a3b0c6bd25d6947e3c0/py-polars/src/polars/io/delta/_dataset.py#L177-L213","documentation":"Raised by the delta scan path when the table has deletion vectors and the installed deltalake package is older than 1.4.2. Interpreting deletion vectors (row-level deletes layered on Parquet files) requires deltalake >= 1.4.2, so polars refuses the read instead of returning rows that should have been deleted.","triggerScenarios":"pl.scan_delta()/read_delta() on a table containing deletion vectors with deltalake < 1.4.2 installed (the has_deletion_vectors path is taken).","commonSituations":"Reading tables written by newer writers (Databricks, Spark with DVs, newer delta-rs) from an environment with an older deltalake wheel; long-lived environments after upstream writers enable deletion vectors.","solutions":["Upgrade: pip install -U 'deltalake>=1.4.2'","Pin deltalake>=1.4.2 in the project requirements so DV-enabled tables always read correctly","If upgrading is blocked, rewrite the table without deletion vectors (VACUUM/OPTIMIZE or re-write from the writer side) before reading"],"exampleFix":"# before: deltalake 1.3, table has deletion vectors\npl.scan_delta(\"s3://bucket/table\").collect()\n\n# after\npip install -U 'deltalake>=1.4.2'","handlingStrategy":"validation","validationCode":"from importlib.metadata import version\nfrom packaging.version import parse\n\nassert parse(version(\"deltalake\")) >= (1, 4, 2), \"deltalake>=1.4.2 required for deletion vectors\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Pin deltalake>=1.4.2 in any project reading externally-written delta tables","Check table metadata for deletion vectors when onboarding new data sources","Add dependency version checks to CI for delta-based pipelines"],"tags":["delta-lake","deltalake","version","deletion-vectors"],"backgroundTag":null,"analyzedSha":"df599052daf96e7a9cc30a3b0c6bd25d6947e3c0","analyzedAt":"2026-08-16T12:10:03.978Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}