Supported Features
The tables below describe which Delta Lake features Sail supports. ✅ indicates support, ⚠️ identifies the supported cases in the notes, and 🚧 means not supported.
Protocol Compatibility
The Delta protocol defines separate requirements for readers and writers. Older tables specify their requirements through protocol versions and table metadata. Newer tables can name required features directly.
| Feature | Supported | Notes |
|---|---|---|
| Reader protocol versions 1–3 | ✅ | All required readerFeatures must be supported. |
| Writer protocol versions 1–7 | ✅ | All required readerFeatures and writerFeatures must be supported. |
| Unknown or unsupported required features | 🚧 | Sail rejects the operation requiring the feature. |
Core Table Operations
| Feature | Supported | Notes |
|---|---|---|
| Table creation, CTAS, and replacement | ⚠️ | Through SQL and the DataFrame writer APIs; replacement is available in the Memory catalog. See Table DDL. |
| Snapshot reads, append, and full overwrite | ✅ | Both partitioned and non-partitioned tables. |
| Conditional overwrite | ✅ | replaceWhere and SQL REPLACE WHERE. |
| Dynamic partition overwrite | 🚧 | DataFrameWriterV2.overwritePartitions() is not supported for Delta. |
| Partition pruning and file-statistics pruning | ✅ | Uses partition values and statistics recorded in the log. |
| Metadata aggregate optimization | ✅ | Eligible aggregates can use exact file statistics. Other queries scan data. |
| Schema validation and evolution | ✅ | mergeSchema, overwriteSchema with full overwrite, and MERGE WITH SCHEMA EVOLUTION. |
| Time travel | ✅ | Version or timestamp through read options or SQL. Requires retained log/checkpoint state and data files for that version. |
| Table property DDL | ⚠️ | SET/UNSET TBLPROPERTIES; see Table DDL for catalog-specific support. |
| Column type and default DDL | ⚠️ | Supported type widening and SET/DROP DEFAULT. Not all ALTER TABLE forms are implemented. |
| Optimistic commit conflict handling | ⚠️ | Creation and blind appends can retry compatible conflicts. Other writes fail on a competing commit and must be replanned. |
Table DDL
DDL support varies by catalog provider. See the Delta Lake DDL support matrix for supported operations and limitations.
DML Operations
| Operation | Copy-on-write | Deletion vectors | Notes |
|---|---|---|---|
DELETE | ✅ | ✅ | — |
UPDATE | ✅ | ✅ | — |
MERGE INTO with inserts, updates, and deletes | ✅ | ✅ | Matched, insert, and WHEN NOT MATCHED BY SOURCE clauses. Multiple source matches cannot update one target row. |
For row changes, Sail can rewrite affected files (copy-on-write) or use deletion vectors. With deletion vectors, an update marks old rows as deleted and appends replacement rows.
Table Features
Reader-Writer Features
| Protocol feature | Read | Write | Notes |
|---|---|---|---|
Column mapping (columnMapping) | ✅ | ✅ | name and id modes. Logical names are distinct from Parquet field names and IDs. |
Deletion vectors (deletionVectors) | ✅ | ✅ | Applies existing vectors on reads and writes them for supported row-level operations. |
Timestamp without timezone (timestampNtz) | ✅ | ✅ | TIMESTAMP_NTZ. |
Type widening (typeWidening, typeWidening-preview) | ✅ | ✅ | New widening requires delta.enableTypeWidening. Only supported type changes are accepted. |
Variant (variantType, variantType-preview) | ✅ | ✅ | Logical VARIANT values stored in Parquet. |
Variant shredding (variantShredding, variantShredding-preview) | ✅ | ✅ | Shredded reads and writes. Writes require shredding enablement. |
V2 checkpoints (v2Checkpoint) | ✅ | ✅ | Checkpoint policy controls the checkpoint format. |
VACUUM protocol check (vacuumProtocolCheck) | ✅ | ✅ | Accepted for ordinary reads and writes. Command support is listed under Maintenance and Streaming. |
Catalog-managed tables (catalogManaged) | ⚠️ | ⚠️ | Requires Unity Catalog commit and replay support. See Catalog Integration. |
Writer Features and Constraints
The write behavior of individual table features varies. The table below shows which constraints Sail enforces and which features it can write.
| Feature | Write support | Notes |
|---|---|---|
Append-only tables (appendOnly) | ✅ | Data-changing removals are rejected when append-only is enabled. |
NOT NULL constraints | ✅ | Enforced during writes. |
Legacy column invariant expressions (delta.invariants) | 🚧 | The invariants protocol flag is accepted. Legacy expressions are not enforced. |
CHECK constraints (checkConstraints) | ✅ | Writes must satisfy constraints. ADD CONSTRAINT validates existing rows. Both false and null results violate a constraint. |
Generated columns (generatedColumns) | ✅ | Computes omitted values and validates explicitly supplied values. |
Default columns (allowColumnDefaults) | ✅ | Omitted columns and explicit DEFAULT. ALTER COLUMN SET/DROP DEFAULT. |
Identity columns (identityColumns) | ✅ | Non-partition BIGINT columns with nonzero positive or negative steps. GENERATED ALWAYS rejects explicit values. BY DEFAULT accepts them. |
In-commit timestamps (inCommitTimestamp) | ✅ | Writes commit timestamps and uses enablement metadata for time travel. |
Change Data Feed (changeDataFeed) | 🚧 | No CDF query or change-file writer. |
Row tracking (rowTracking) | 🚧 | No row-tracking write support. |
Domain metadata (domainMetadata) | 🚧 | Replaying existing actions does not enable writes requiring this feature. |
Iceberg compatibility (icebergCompatV1, icebergCompatV2) | 🚧 | No UniForm/Iceberg-compatible writer. |
Clustered tables (clustering) | 🚧 | No clustered-table writer. |
Log and Checkpoint Formats
| Format or action | Read/replay | Write | Notes |
|---|---|---|---|
| Parquet data files | ✅ | ✅ | Partition values come from the transaction log. |
JSON commits: protocol, metaData, add, remove, commitInfo | ✅ | ✅ | Snapshot reconstruction and table commits. |
txn actions | ✅ | ⚠️ | Preserves transaction state in checkpoints. |
domainMetadata actions | ✅ | ⚠️ | Replays and preserves existing state in checkpoints. No public domain-update operation. |
Change data files (cdc) | 🚧 | 🚧 | Ordinary snapshot reads do not read change data files. |
| Classic Parquet checkpoints | ✅ | ✅ | Includes supported parsed statistics and partition fields. |
| UUID-named V2 checkpoints and Parquet sidecars | ✅ | ✅ | Reads JSON or Parquet top-level checkpoints. Writes use delta.checkpointPolicy = 'v2'. |
| Multi-part checkpoints | ✅ | 🚧 | Reads complete sets. Incomplete sets are ignored. |
| Log compaction files | ✅ | 🚧 | Uses compacted ranges during replay. No compaction-file producer. |
_last_checkpoint | ✅ | ✅ | Checkpoint discovery hint. |
| Version checksum files | ✅ | ✅ | Checksum-based snapshot information and validation. |
Catalog Integration
Delta tables can be registered through Unity Catalog, AWS Glue, or Hive Metastore. Tables using the Delta catalogManaged feature require Unity Catalog for reads and writes by name.
| Feature | Supported | Notes |
|---|---|---|
| Catalog registration of filesystem-backed tables | ✅ | Supported through Unity Catalog, AWS Glue, and Hive Metastore. |
catalogManaged reads and writes by table name | ✅ | Uses Unity Catalog to obtain ratified commits and publish writes, including commits not yet published as ordinary log files. |
catalogManaged direct path access | 🚧 | Requires the replay context supplied by the catalog. |
catalogManaged metadata ALTER TABLE | ⚠️ | Supports type widening, column defaults, and table property changes. ADD CONSTRAINT is not supported. |
Maintenance and Streaming
| Operation | Supported |
|---|---|
VACUUM | 🚧 |
OPTIMIZE | 🚧 |
RESTORE | 🚧 |
| Structured Streaming reads | 🚧 |
| Structured Streaming writes | 🚧 |
