Timelaketimelake
DocsBenchmarksRoadmapSpecContribute
Apache 2.0 ·
Roadmap

DoneIn progressPlanned

Tables and storage

Done:1. Iceberg tablesDone:2. CommitsDone:3. Object-store catalogIn progress:4. Time-series table contractIn progress:5. File layout and encodingsIn progress:6. Last-value indexDone:7. One-request table state and version checksDone:8. Table format versions and upgradesDone:9. SettingsPlanned:10. Supplemental timestamps

Writing

Done:11. AppendsDone:12. Late data and dedup on readDone:13. Writes from WebAssemblyPlanned:14. Hot tier and seconds-fresh readsPlanned:15. BackfillIn progress:16. Import and migrationPlanned:17. DeletesPlanned:18. GDPR erasure

Maintenance

Done:19. CompactionIn progress:20. Maintenance runs, retention and expiry

Reading

In progress:21. Timelake readerDone:22. Block cacheDone:23. Filter pushdownDone:24. Pruning with long IN listsDone:25. Newest-first scansDone:26. Scans in series orderDone:27. Materialized rollups

SQL functions

In progress:28. Function libraryDone:29. Time buckets and gap fillingDone:30. Signal aggregatesDone:31. Downsampling with m4

Integrations

Planned:32. REST catalogPlanned:33. DuckDB extensionPlanned:34. Snowflake connectionPlanned:35. Multitenancy

Services

Planned:36. Ingestion and rulesPlanned:37. Data to eventsPlanned:38. Static read modelsPlanned:39. Computed metricsPlanned:40. Agent access with permission setsPlanned:41. Device syncPlanned:42. Edge gatewayPlanned:43. Server mode

Benchmarks

In progress:44. Benchmark harness: timebenchIn progress:45. Industrial IoT benchmarkPlanned:46. Agent benchmark

Background

ArchitectureDeployment and cost modelEmbedded engine: DataFusionLandscape and positioningLicense and open corePurpose and requirementsReleases
TimelaketimelakeThe open time-series lakehouse.
v0 · Apache 2.0 · Contribute · GitHubBuilt on Apache Arrow, Apache DataFusion, Apache Parquet, and Apache Iceberg.
DocsBenchmarksRoadmapSpecContribute

Spec 17 · Writing

Deletes

PlannedUpdated 2026-10-11View on GitHub
Versions
Not released yet
Roadmap
Data lifecycle, Technical preview
Related
18. GDPR erasure, 27. Materialized rollups

Summary

Deletes never mutate data: a logical delete adds deletion vectors and an audit record and can be undone; retention drops whole partitions (built); a purge is the explicit, audited, irreversible exception.

Design

Principle: A delete never mutates or destroys existing data. It is a new, audited, immutable fact layered on top. Iceberg already works this way: data files are never modified, and deletes are recorded as new delete files / deletion vectors in a new snapshot.

OperationMechanismVisible to plain DuckDB?Reversible?
Logical delete (default)Predicate → Iceberg v3 deletion vectors (v2: position deletes). Never rewrites data files.Yes (if the engine supports the delete-file type; verify DuckDB v3 DV support)Yes: UNDELETE <delete_id> commits a snapshot that removes those delete vectors. Original rows were never touched.
Retention dropWhole-partition removal by policyYesUntil the snapshot expires
Purge (hard delete, for compliance)Explicit, privileged operation: rewrites affected files without the rows, expires snapshots that still reference them, removes orphansYesNo, by design. Requires a reason and is audited.

Time-series-shaped deletes are first-class:

DELETE FROM iot.sensor
WHERE device_id = 'pump-7' AND ts BETWEEN '2026-10-01' AND '2026-10-02'
WITH (reason = 'sensor miscalibrated', ticket = 'OPS-123');

Audit trail:

  • Every delete gets a delete_id and records actor, timestamp, predicate, reason, and affected row count.
  • These records go in the snapshot summary and in an append-only _timelake_audit Iceberg table, so audits are a SQL query.

Consistency with rollups: A delete, undelete, or purge marks its time ranges as changed, so the affected rollup buckets are recomputed (spec 27). Rollups never silently include deleted data.

Corrections vs. deletes: Bad values usually need correcting rather than deleting. An upsert writes the corrected row, and dedup keeps the latest _ingest_ts. The original stays in older snapshots, so history is preserved without a delete.

Decisions

IDDecisionStatus
D6Deletes are immutable: logical, audited, and reversible; physical purge is a separate explicit operation (spec 17)Accepted

Open questions and issues

  • #16 Deletes: bump the format version so older binaries can't resurrect deleted rows
  • #41 Deletes: Iceberg v3 deletion vectors, one per data file (Q1)

History

  • 2026-10-11: D6 accepted (SPEC.md §9.2)
  • 2026-10-12: retention drops built
  • 2026-10-19: moved from SPEC.md into its own spec.
  • 2026-10-19: was spec 13; specs regrouped one per feature, with milestones on the roadmap.