- Installation
- Guides
- Overview
- Data Import & Export
- CSV Import
- CSV Export
- Parquet Import
- Parquet Export
- Query Parquet
- HTTP Parquet Import
- S3 Parquet Import
- S3 Parquet Export
- JSON Import
- JSON Export
- SQLite Import
- Postgres Import
- Meta Queries
- Python
- Install
- Execute SQL
- Jupyter Notebooks
- SQL on Pandas
- Import From Pandas
- Export To Pandas
- SQL on Arrow
- Import From Arrow
- Export To Arrow
- Relational API on Pandas
- Multiple Python Threads
- DuckDB with Ibis
- DuckDB with Fugue
- DuckDB with Polars
- DuckDB with Vaex
- DuckDB with DataFusion
- DuckDB with fsspec filesystems
- SQL Editors
- Data Viewers
- Documentation
- Connect
- Data Import
- Overview
- Insert Statements
- CSV Files
- Parquet Files
- JSON Files
- Multiple Files
- Partitioning
- Appender
- Client APIs
- Overview
- Python
- R
- Java
- Julia
- C
- Overview
- Startup
- Configure
- Query
- Data Chunks
- Values
- Types
- Prepared Statements
- Appender
- Table Functions
- Replacement Scans
- API Reference
- C++
- Node.js
- Wasm
- ODBC
- CLI
- SQL
- Introduction
- Statements
- Overview
- Select
- Insert
- Delete
- Update
- Create Schema
- Create Table
- Create View
- Create Sequence
- Create Macro
- Drop
- Alter Table
- Copy
- Export
- Attach
- Query Syntax
- SELECT
- FROM & JOIN
- WHERE
- GROUP BY
- GROUPING SETS
- HAVING
- ORDER BY
- LIMIT
- SAMPLE
- UNNEST
- WITH
- WINDOW
- QUALIFY
- VALUES
- FILTER
- Set Operations
- Data Types
- Overview
- NULL Values
- Boolean
- Enum
- Numeric
- Text
- Date
- Timestamp
- Interval
- Blob
- Bitstring
- List
- Struct
- Map
- Union
- Expressions
- Functions
- Overview
- Enum Functions
- Numeric Functions
- Text Functions
- Pattern Matching
- Date Functions
- Timestamp Functions
- Timestamp With Time Zone Functions
- Time Functions
- Interval Functions
- Date Formats
- Date Parts
- Blob Functions
- Bitstring Functions
- Nested Functions
- Utility Functions
- Indexes
- Aggregates
- Window Functions
- Samples
- Information Schema
- Metadata Functions
- Configuration
- Pragmas
- Extensions
- Development
- Testing
- Storage Versions & Format
- Profiling
- Sitemap
- Why DuckDB
- FAQ
- Code of Conduct
- Live Demo
Storage
The DuckDB internal storage format is currently in flux, and is expected to change with each release until we reach v1.0.0.
DuckDB files start with a uint64_t
which contains a checksum for the main header, followed by four magic bytes (DUCK
), followed by the storage version number in a uint64_t
.
A simple example of reading the storage version using python is below.
import struct
pattern = struct.Struct('<8x4sQ')
with open('test/sql/storage_version/storage_version.db', 'rb') as fh:
print(pattern.unpack(fh.read(pattern.size)))
For changes in each given release, check out the changelog on GitHub. To see the commits that changed each storage version, see the commit log
Storage version | DuckDB versions |
---|---|
44 | #6499 onwards |
43 | v0.7.0, v0.7.1 |
42 | #5544 onwards |
41 | #5768 onwards |
40 | #5491 onwards |
39 | v0.6.0, v0.6.1 |
38 | v0.5.0, v0.5.1 |
37 | #3985 onwards |
36 | #4022 onwards |
35 | |
34 | |
33 | v0.3.3, v0.3.4, v0.4.0 |
32 | #3084 |
31 | v0.3.2 |
30 | |
29 | |
28 | |
27 | v0.3.1 |
26 | |
25 | v0.3.0 |
24 | |
23 | |
22 | |
21 | v0.2.9 |
20 | |
19 | |
18 | v0.2.8 |
17 | v0.2.7 |
16 | |
15 | v0.2.6 |
14 | |
13 | v0.2.5 |
12 | |
11 | v0.2.4 |
10 | |
9 | |
8 | |
7 | |
6 | v0.2.3 |
5 | |
4 | v0.2.2 |
3 | |
2 | |
1 | v0.2.1 and prior |
Search Shortcut cmd + k | ctrl + k