Format Versioning¶
Feature Flags¶
As the table format evolves, new feature flags are added to the format.
There are two separate fields for checking for feature flags,
depending on whether you are trying to read or write the table.
Readers should check the reader_feature_flags to see if there are any flag it is not aware of.
Writers should check writer_feature_flags. If either sees a flag they don't know,
they should return an "unsupported" error on any read or write operation.
Current Feature Flags¶
| Bit Mask | Flag Name | Reader Required | Writer Required | Description |
|---|---|---|---|---|
2^0 |
FLAG_DELETION_FILES |
Yes | Yes | Fragments may contain deletion files, which record the tombstones of soft-deleted rows. |
2^1 |
FLAG_STABLE_ROW_IDS |
Yes | Yes | Row IDs are stable for both moves and updates. Fragments contain an index mapping row IDs to row addresses. |
2^2 |
FLAG_USE_V2_FORMAT_DEPRECATED |
No | No | Files are written with the new v2 format. This flag is deprecated and no longer used. |
2^3 |
FLAG_TABLE_CONFIG |
No | Yes | Table config is present in the manifest. |
2^4 |
FLAG_BASE_PATHS |
Yes | Yes | Dataset uses multiple base paths (for shallow clones or multi-base datasets). |
2^5 |
FLAG_DISABLE_TRANSACTION_FILE |
No | Yes | Transactions are recorded in the manifest rather than in a separate transaction file. |
2^6 |
FLAG_UNSTABLE_DATA_OVERLAY_FILES |
Yes | Yes | Fragments may carry data overlay files. Unstable: release builds reject it unless explicitly opted in. |
2^7 |
FLAG_COVERED_INDEX_METADATA |
Yes | Yes | Some index declares covering columns (IndexMetadata.covering_fields). Without FLAG_INDEPENDENT_COVERING_FIELDS, the carried columns form the trailing suffix of fields. An implementation without this flag may select or maintain an index using the wrong fields. |
2^8 |
FLAG_MIXED_DATA_FILE_VERSIONS |
Yes | Yes | The snapshot may reference recognized V2 data files with different exact versions. Both bits must be set and remain set on later versions. |
2^9 |
FLAG_FRAG_REUSE_WITH_STABLE_ROW_IDS |
Yes | Yes | The table uses stable row IDs and carries a Fragment Reuse Index. |
2^10 |
FLAG_FRAGMENT_REUSE_INDEX |
Yes | Yes | The fragment reuse index records tagged transitions (IndexMetadata.index_version >= 1). Readers must translate row addresses through them; writers must preserve them. An implementation without this flag would decode the details as the legacy format and silently drop the transitions when it next rewrites the fragment reuse index. See FRI index versions. |
2^11 |
FLAG_SPILLED_ROW_LINEAGE |
Yes | Yes | Some fragment stores its row ids or row version sequences as hidden columns of a data file rather than inline. A reader without this flag would see the fragment as having no row ids. Readers and writers that do not support this flag must refuse the dataset. Spilling remains opt-in through table configuration. |
2^12 |
FLAG_FRAGMENT_TREE |
Yes | Yes | Fragment records live in a fragment tree. Manifest.fragments is empty. |
2^13 |
FLAG_INDEPENDENT_COVERING_FIELDS |
Yes | Yes | Requires FLAG_COVERED_INDEX_METADATA and is retained together with it. IndexMetadata.fields contains only key fields, while covering_fields independently declares carried fields and may overlap fields. Implementations that only support the legacy suffix contract must reject the dataset. |
2^14 |
FLAG_MANAGED_BLOBS |
Yes | Yes | Blob descriptors independently address owned objects. Readers resolve the descriptor's base and path; cleanup preserves objects referenced by protected snapshots, independently of the original data file. Both bits remain set on later versions, including restores. See Blob v2 capability and compatibility. |
2^15 |
FLAG_NON_REUSABLE_FIELD_IDS |
No | Yes | The manifest sets max_allocated_field_id, and a writer must assign new field IDs above it. Before activation, all clients that can write to the dataset must enforce writer feature flags. See Field IDs. |
2^16 |
FLAG_ZONE_WRITE_SEEDS |
Yes | Yes | Referenced data files contain version 1 zone write seeds. Both bits remain set in derived snapshots, including clone and restore. Reserved and unsupported until implemented. |
2^17 |
FLAG_OBJECT_METADATA |
No | Yes | The snapshot contains clustering definitions, references, or a nonzero allocation high-water mark, nonempty fragment metadata, or nonempty index segment metadata. Reserved, unsupported until writers implement the maintenance rules. Readers may ignore this metadata. |
2^18 |
FLAG_ROW_ADDR_INDICES |
No | Yes | A stable-row-ID table contains an index that stores physical row addresses. Older writers could treat its entries as stable row IDs and silently extend coverage without indexing rewritten fragments. |
2^19 |
FLAG_INLINE_DELETIONS |
Yes | Yes | Some fragment stores its deletion vector in the manifest (DeletionFile.inline) rather than in a file under _deletions/. A reader without this flag would look for a file that does not exist. |
Bits 16 and 17 are reserved but remain unsupported. Bits at positions 20 and above are unknown. Unknown or unsupported flags cause implementations to reject the corresponding read or write operation with an "unsupported" error. The paired mixed-version, Managed Blob, and zone write-seed reader and writer bits must each either both be set or both be clear; a half-set manifest is invalid.
Committing schema metadata lance.blob.managed = "true" activates the Managed Blob capability, even without new blob files. Ordinary Blob v2 writes without this opt-in do not activate it. Once activated, removing the opt-in, removing Blob fields, or restoring an older snapshot does not clear it. Before activation, all maintenance clients must support Managed Blobs: the flag cannot revoke old handles or prevent older clients from running cleanup through an unflagged historical snapshot. See client compatibility.