Column-oriented storage with typed arrays, null bitmaps, and a single-file format.
Four concrete types, each backed by a native Go slice:
| Type | Go backing | File |
|---|---|---|
Int64 | []int64 | int64.go |
Float64 | []float64 | float64.go |
String | []string | string.go |
Bool | []bool | bool.go |
The fundamental unit of storage. Each chunk holds:
Bit-packed representation where each bit tracks one row's null status. Uses uint64 words internally — 64 rows per word. Operations:
bitmap.Set(i) // mark row i as null
bitmap.IsNull(i) // check if row i is null
bitmap.NullCount() // count nulls
A collection of ColumnChunks that share the same row count. The RowGroup is the unit of I/O — the execution engine reads one RowGroup at a time.
Single-file columnar format, similar to Parquet:
The footer stores metadata (column names, types, byte offsets) so the reader can seek directly to any column without scanning the whole file.
| File | Role |
|---|---|
types.go | Column type enum and interface |
chunk.go | ColumnChunk struct and methods |
rowgroup.go | RowGroup — collection of chunks |
bitmap.go | Bit-packed null bitmap |
format.go | File header, footer, metadata structs |
writer.go | Serialize row groups to disk |
reader.go | Deserialize row groups from disk |