Symptoms
- A report or external query that read the table yesterday fails today with messages such as:
Delta protocol version (3,7) is too new for this version of DeltaUnsupported reader features: deletionVectorsTable features configured ... are not supported/ column mapping errors
- Databricks itself reads the table fine.
- Nobody changed the table deliberately, but a runtime upgrade, a
MERGE, or a new workspace default happened.
Why it happens
Delta tables declare the minimum reader and writer protocol versions and, in newer versions, a list of table features. A reader that doesn't support a feature must refuse the table, or it would return wrong results.
Features that commonly raise the protocol:
| Feature | Effect on readers |
|---|---|
| Deletion vectors | Rows marked deleted in side files; readers must apply them |
| Column mapping (name/id) | Physical column names differ from logical; enables rename/drop column |
| Liquid clustering, v2 checkpoints, type widening, timestamp without time zone, variant | Each requires reader/writer support |
Recent Databricks runtimes enable some of these by default for new tables (for example deletion vectors), and a workspace setting can auto-enable them. One ALTER TABLE or OPTIMIZE on a new runtime may upgrade an existing table.
Step 1: see the protocol and features
DESCRIBE DETAIL main.sales.orders;
-- minReaderVersion, minWriterVersion, tableFeatures
SHOW TBLPROPERTIES main.sales.orders;
-- delta.enableDeletionVectors, delta.columnMapping.mode, delta.feature.* entries
DESCRIBE HISTORY main.sales.orders;
-- find the commit that upgraded the protocol (operation, operationParameters, user, timestamp)
Step 2: decide: downgrade the table or change the reader?
| Situation | Better choice |
|---|---|
| Reader can be upgraded (newer Spark/Delta, updated connector) | Upgrade the reader |
| Reader is a service you don't control and doesn't support the feature yet | Remove the feature from the table, or publish a separate compatible copy |
| Many external consumers | Expose via Delta Sharing or UniForm (Iceberg metadata) instead of raw files |
| Feature is essential (e.g. column mapping for renames) | Keep it; give external readers a view/copy without it |
Check the current feature support of each reader in its documentation; support changes often.
Step 3: remove a feature safely
Databricks supports dropping some table features. Example for deletion vectors:
-- 1. Stop new deletion vectors being written
ALTER TABLE main.sales.orders SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
-- 2. Rewrite files to apply existing deletion vectors and drop the feature
ALTER TABLE main.sales.orders DROP FEATURE deletionVectors;
Dropping a reader feature is a two-step process: the first DROP FEATURE removes its use from the current version, but older versions in the history still use it. After the retention period, you complete it by truncating history:
ALTER TABLE main.sales.orders DROP FEATURE deletionVectors TRUNCATE HISTORY;
Requirements and wait times depend on the runtime; read the "Drop a Delta table feature" page before running this in production.
Warning
TRUNCATE HISTORYremoves time travel to versions before the drop. Make sure no process relies on older versions (audits,RESTOREplans, CDF consumers).
Column mapping is harder to remove: it requires rewriting the table. Often a better option is a compatible copy:
CREATE OR REPLACE TABLE main.export.orders_compat
TBLPROPERTIES ('delta.enableDeletionVectors' = false)
AS SELECT * FROM main.sales.orders;
Step 4: stop it happening again
Disable automatic enablement where external readers matter:
- Workspace setting: check the admin setting that auto-enables deletion vectors for new tables, and turn it off for workspaces that produce tables for external engines.
- Session or cluster default for jobs that create tables:
spark.databricks.delta.properties.defaults.enableDeletionVectors false
- Table properties at creation in your DDL templates:
CREATE TABLE main.export.customers (...)
TBLPROPERTIES ('delta.enableDeletionVectors' = false);
Step 5: better ways to share with other engines
| Option | What it does |
|---|---|
| Delta Sharing | Consumers read through a protocol server that can serve compatible data; no direct file access |
| UniForm (Iceberg) | Databricks writes Iceberg metadata alongside Delta so Iceberg readers can query the table (has its own feature requirements) |
| Compatible export tables | A small set of tables with conservative features, refreshed by a job |
| Fabric / OneLake shortcuts | Check Fabric's current Delta feature support before pointing shortcuts at feature-rich tables |
Troubleshooting table
| Error mentions | Likely feature | Action |
|---|---|---|
(3,7) and deletionVectors | Deletion vectors | Upgrade reader or drop feature |
columnMapping / physical name errors | Column mapping | Compatible copy for that reader |
v2Checkpoint | V2 checkpoints | Upgrade reader; check if feature can be dropped |
timestampNtz | Timestamp without time zone | Cast in an export table |
Prevent it next time
- Keep a list of external readers per table, with the Delta features each supports.
- Pin table properties in DDL for tables consumed outside Databricks.
- Test runtime upgrades against external readers, not just Databricks jobs.
- Prefer Delta Sharing or UniForm over direct file access for external consumers.