From 8b49636e814badf7ec2f353416e99a79bcb79885 Mon Sep 17 00:00:00 2001 From: Hanbin Tan <48960067+hskl18@users.noreply.github.com> Date: Fri, 13 Nov 2026 10:35:15 -0800 Subject: [PATCH 1/5] docs: architecture diagram, current CLI screenshot and a shorter README --- DESIGN.md | 15 +++- README.md | 147 ++++++++---------------------------- docs/architecture-dark.svg | 1 + docs/architecture-light.svg | 1 + docs/architecture.mmd | 17 +++++ docs/media/cli-session.png | Bin 0 -> 44012 bytes docs/usage.md | 91 ++++++++++++++++++++++ image/preview.png | Bin 149699 -> 0 bytes 8 files changed, 156 insertions(+), 116 deletions(-) create mode 100644 docs/architecture-dark.svg create mode 100644 docs/architecture-light.svg create mode 100644 docs/architecture.mmd create mode 100644 docs/media/cli-session.png create mode 100644 docs/usage.md delete mode 100644 image/preview.png diff --git a/DESIGN.md b/DESIGN.md index f3cd0c6..0a9d5d5 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -14,6 +14,19 @@ The implementation favors inspectable data structures over production database f Invalid syntax, unknown tables or fields, unmatched quotes or parentheses, and corrupt files fail closed. An invalid `WHERE` expression never falls back to an unfiltered query. +## Source layout + +| Component | Responsibility | +| --- | --- | +| `includes/tokenizer` | Converts command text into lexical tokens with a state machine. | +| `includes/parser` | Validates the supported grammar and builds a parse tree. | +| `includes/shunting_yard` | Converts compound filter expressions to postfix form. | +| `includes/map` | Implements B+ tree-backed maps and multimaps. | +| `includes/binary_files` | Reads the legacy v1 fixed-width format. | +| `includes/storage` | Owns v2 pages, persistent indexes, checksums, WAL, and recovery. | +| `includes/table` | Owns table persistence, indexes, projections, and selections. | +| `includes/sql` | Coordinates parsing and table operations through the public `SQL` interface. | + ## Storage format Version 2 stores a table in one 4096-byte paged `.sql2` file. @@ -53,4 +66,4 @@ The command-line process reads and writes table files in its current working dir The CTest suite covers end-to-end SQL behavior, parser safety, persistent randomized B+ tree images, page and WAL corruption, crash recovery, v1 migration equivalence, large rows, and deterministic in-memory B+ tree properties. CI runs a release build and the CTest suite on Linux. -The AddressSanitizer and UndefinedBehaviorSanitizer build in the README is a local memory-safety check, not evidence of production database readiness. +The AddressSanitizer and UndefinedBehaviorSanitizer build in [docs/usage.md](docs/usage.md#sanitizer-build) is a local memory-safety check, not evidence of production database readiness. diff --git a/README.md b/README.md index 71bf335..e8ce46b 100644 --- a/README.md +++ b/README.md @@ -1,151 +1,68 @@ # SQL in C++ -SQL in C++ 2.0 is an educational relational database engine and command-line DSL implemented from first principles. -It parses a focused subset of SQL, persists records in checksummed pages, maintains persistent B+ tree indexes, recovers atomic single-writer statements through a WAL, and evaluates compound filters with a shunting-yard pipeline. +A small relational database engine written from scratch in C++17. +It parses a focused subset of SQL, stores each table in checksummed 4 KB pages, keeps a B+ tree index for every field, and recovers each statement atomically after a crash through a write-ahead log. I wrote the first version in 2023 while learning C++ and rebuilt the storage engine in 2026. The [`original-2023`](https://github.com/hskl18/SQL/tree/original-2023) tag keeps the first version. -![Command-line preview](image/preview.png) +![A CLI session: an insert that prints the table, a select of two fields filtered by major, and a compound filter with AND that returns one row.](docs/media/cli-session.png) -## What it supports - -- `CREATE TABLE` with an ordered field list. -- `INSERT INTO` with quoted or unquoted values. -- `SELECT *` and projected field lists. -- `WHERE` filters using `=`, `!=`, `<`, `<=`, `>`, and `>=`. -- Compound `AND` and `OR` expressions with parentheses. -- Checksummed paged persistence across separate CLI sessions. -- Persistent per-field B+ tree indexes. -- Crash recovery for atomic single-writer statements. -- Copy-first migration from the v1 fixed-width format. -- Batch execution from the sample command files in `batch/`. - -This project is intentionally smaller than a production SQL database. -It does not implement joins, multi-statement transactions, schemas, query planning, updates, or deletes. -Values are stored and ordered as strings, so numeric-looking values use lexical comparison semantics. - -## Architecture - -| Component | Responsibility | -| --- | --- | -| `includes/tokenizer` | Converts command text into lexical tokens with a state machine. | -| `includes/parser` | Validates the supported grammar and builds a parse tree. | -| `includes/shunting_yard` | Converts compound filter expressions to postfix form. | -| `includes/map` | Implements B+ tree-backed maps and multimaps. | -| `includes/binary_files` | Reads the legacy v1 fixed-width format. | -| `includes/storage` | Owns v2 pages, persistent indexes, checksums, WAL, and recovery. | -| `includes/table` | Owns table persistence, indexes, projections, and selections. | -| `includes/sql` | Coordinates parsing and table operations through the public `SQL` interface. | +*A session in the CLI from a local Release build, November 13, 2026.* -Storage invariants, query semantics, and deliberate limits are documented in [DESIGN.md](DESIGN.md). +## Quick start -## Build - -You need a C++17 compiler and CMake 3.20 or newer. +You need a C++17 compiler and CMake 3.20 or newer; the build downloads nothing. ```bash cmake -S . -B build -DCMAKE_BUILD_TYPE=Release cmake --build build --parallel -``` - -The build has no downloaded test framework or other third-party dependency. - -## Test - -```bash ctest --test-dir build --output-on-failure -``` - -The test executables verify SQL behavior, persistent incremental B+ tree splits, stable untouched pages, WAL ordering, dynamically enumerated crash boundaries, corruption rejection, idempotent recovery, migration equivalence, maximum-width rows, CLI inspection, parser safety, and both repository batch fixtures. -Tests run in an isolated build directory, so they do not leave database files in the source tree. - -To run the tests under AddressSanitizer and UndefinedBehaviorSanitizer: - -```bash -cmake -S . -B build-sanitized \ - -DCMAKE_BUILD_TYPE=Debug \ - -DBUILD_TESTING=ON \ - -DSQL_ENABLE_SANITIZERS=ON \ - -DCMAKE_COMPILE_WARNING_AS_ERROR=ON -cmake --build build-sanitized --parallel -ctest --test-dir build-sanitized --output-on-failure -``` - -## Run the CLI - -```bash ./build/run_sql ``` -Type `end` to exit and `cls` to clear the terminal. -The CLI writes each table to `
.sql2` and uses `
.sql2-wal` during a mutating statement. -It reports missing tables, invalid projections, wrong row arity, duplicate schemas, malformed filters, corrupt pages, and corrupt WAL records without terminating the session. - -Example session: +Type `end` to exit and `cls` to clear the screen. ```text SQL>> create table student fields first, last, major, age -SQL>> insert into student values Ada, Lovelace, Math, 36 SQL>> insert into student values Grace, Hopper, CS, 30 SQL>> select first, major from student where major = CS -SQL>> end -``` - -## Query grammar - -```text -create table
fields [, ...] -insert into
values [, ...] -select <* | field [, field ...]> from
- [where - [ ...]] -``` - -Quote values that contain spaces, such as `"Mary Ann"`. -Quoted values may contain spaces, numbers, and punctuation, but escaped double quotes are not supported. - -## Version and storage inspection - -```bash -./build/run_sql --version -./build/run_sql --inspect-storage student ``` -Inspection validates checksums and structural bounds without applying or clearing a pending WAL. +## Architecture -## Migrate a v1 table + + + A command goes from the CLI through the tokenizer and parser to the table, which filters through the shunting-yard step and a B+ tree index per field. Storage writes the after-image to the WAL and syncs it, then writes the dirty pages to the table file; opening a table recovers from the WAL. The v1 migration tool copies old .bin files into the new format. + -Inspect a legacy table without writing anything: +The table answers a `WHERE` filter from the per-field B+ tree indexes after the shunting-yard step turns the filter into postfix form. +Each statement that changes a table first writes its complete after-image to `
.sql2-wal` and syncs it, and only then writes the changed pages to `
.sql2`. +Opening a table replays a complete WAL record, so a crash at any write leaves either the old table or the new one. -```bash -./build/sql_migrate_v1 --dry-run student -``` +## What it supports -Migrate it to `student.sql2`: +- `CREATE TABLE`, `INSERT INTO`, and `SELECT` with `*` or a field list. +- `WHERE` with `=`, `!=`, `<`, `<=`, `>`, `>=`, and `AND` and `OR` with parentheses. +- Tables that persist across CLI sessions, with page, index, and WAL corruption rejected on open. +- Batch runs from the sample command files in `batch/`. +- Copy-first migration from the 2023 fixed-width format. -```bash -./build/sql_migrate_v1 student -``` +It has no joins, multi-statement transactions, query planning, updates, or deletes, and it allows one writer at a time. +Values are stored and compared as strings, so `9` sorts after `10`. -The migration reads the v1 `.bin` and `_fields.bin` files read-only, writes an exclusively owned temporary v2 image, reopens and compares every row, rechecks the source bytes, then atomically links the verified destination without replacement. -It never modifies or deletes the v1 source. -Use `--destination ` to choose another destination and note that existing destinations are rejected. +## Tests -## Persistence boundaries +The CTest suite covers SQL behavior, parser safety, B+ tree splits, WAL ordering, a crash at every traced write and fsync, corruption rejection, recovery that can run twice, v1 migration, and the CLI. +Tests run in the build directory and leave no database files in the source tree. +CI runs a Release build and the suite on Linux. -- Tables contain between 1 and 64 uniquely named fields. -- Identifiers contain letters, digits, and underscores and cannot start with a digit. -- Each value is at most 100 bytes, and rows may cross page boundaries. -- An insert must provide exactly one value per field. -- Values longer than 100 bytes are rejected before a write. -- Existing tables cannot be overwritten by another `CREATE TABLE` command. -- Page, index, schema, row, and WAL corruption fail closed when a table is opened. -- V1 tables can be queried read-only and must be migrated before new inserts. -- The durability scope is one process, one writer, and one atomic statement at a time. +## Documentation -The exact byte layout, recovery ordering, checksums, and compatibility boundary are documented in [docs/storage-v2.md](docs/storage-v2.md). +- [Usage](docs/usage.md): the full grammar, the CLI's files and errors, storage inspection, v1 migration, limits, and the sanitizer build. +- [Design and invariants](DESIGN.md): the command path, source layout, and storage and query rules. +- [Storage format v2](docs/storage-v2.md): the byte layout, checksums, and recovery order. ## License -This project is available under the [MIT License](LICENSE). +[MIT](LICENSE) diff --git a/docs/architecture-dark.svg b/docs/architecture-dark.svg new file mode 100644 index 0000000..e660409 --- /dev/null +++ b/docs/architecture-dark.svg @@ -0,0 +1 @@ +Storage v2: checksummed 4 KB pagesQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage buffertable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file diff --git a/docs/architecture-light.svg b/docs/architecture-light.svg new file mode 100644 index 0000000..937e676 --- /dev/null +++ b/docs/architecture-light.svg @@ -0,0 +1 @@ +Storage v2: checksummed 4 KB pagesQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage buffertable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file diff --git a/docs/architecture.mmd b/docs/architecture.mmd new file mode 100644 index 0000000..6de920a --- /dev/null +++ b/docs/architecture.mmd @@ -0,0 +1,17 @@ +flowchart TB + subgraph query["Query path"] + direction LR + CLI["run_sql CLI
or batch file"] --> Parser["Tokenizer and parser
state machine, parse tree"] + Parser --> Table["Table
insert, select, projection"] + Table -->|"WHERE"| Filter["Shunting-yard
postfix filter"] + Filter --> Index["B+ tree index
one per field"] + end + subgraph storage["Storage v2: checksummed 4 KB pages"] + direction LR + Pages["Page buffer"] -->|"1. after-image, fsync"| WAL[("table.sql2-wal")] + Pages -->|"2. dirty pages"| Data[("table.sql2")] + WAL -.->|"recover on open"| Data + Legacy[("v1 .bin files")] -->|"read-only, copy-first"| Migrate["sql_migrate_v1"] + Migrate --> Data + end + query -->|"rows and index pages"| storage diff --git a/docs/media/cli-session.png b/docs/media/cli-session.png new file mode 100644 index 0000000000000000000000000000000000000000..9e829b6bfd4853916cb3329bc8005696b16c93cb GIT binary patch literal 44012 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.sql2` and uses `.sql2-wal` during a mutating statement. +It reports missing tables, invalid projections, wrong row arity, duplicate schemas, malformed filters, corrupt pages, and corrupt WAL records without terminating the session. + +Example session: + +```text +SQL>> create table student fields first, last, major, age +SQL>> insert into student values Ada, Lovelace, Math, 36 +SQL>> insert into student values Grace, Hopper, CS, 30 +SQL>> select first, major from student where major = CS +SQL>> end +``` + +## Query grammar + +```text +create table
fields [, ...] +insert into
values [, ...] +select <* | field [, field ...]> from
+ [where + [ ...]] +``` + +Quote values that contain spaces, such as `"Mary Ann"`. +Quoted values may contain spaces, numbers, and punctuation, but escaped double quotes are not supported. + +## Version and storage inspection + +```bash +./build/run_sql --version +./build/run_sql --inspect-storage student +``` + +Inspection validates checksums and structural bounds without applying or clearing a pending WAL. + +## Migrate a v1 table + +Inspect a legacy table without writing anything: + +```bash +./build/sql_migrate_v1 --dry-run student +``` + +Migrate it to `student.sql2`: + +```bash +./build/sql_migrate_v1 student +``` + +The migration reads the v1 `.bin` and `_fields.bin` files read-only, writes an exclusively owned temporary v2 image, reopens and compares every row, rechecks the source bytes, then atomically links the verified destination without replacement. +It never modifies or deletes the v1 source. +Use `--destination ` to choose another destination and note that existing destinations are rejected. + +## Persistence boundaries + +- Tables contain between 1 and 64 uniquely named fields. +- Identifiers contain letters, digits, and underscores and cannot start with a digit. +- Each value is at most 100 bytes, and rows may cross page boundaries. +- An insert must provide exactly one value per field. +- Values longer than 100 bytes are rejected before a write. +- Existing tables cannot be overwritten by another `CREATE TABLE` command. +- Page, index, schema, row, and WAL corruption fail closed when a table is opened. +- V1 tables can be queried read-only and must be migrated before new inserts. +- The durability scope is one process, one writer, and one atomic statement at a time. + +The exact byte layout, recovery ordering, checksums, and compatibility boundary are documented in [docs/storage-v2.md](docs/storage-v2.md). + +## Sanitizer build + +To run the tests under AddressSanitizer and UndefinedBehaviorSanitizer: + +```bash +cmake -S . -B build-sanitized \ + -DCMAKE_BUILD_TYPE=Debug \ + -DBUILD_TESTING=ON \ + -DSQL_ENABLE_SANITIZERS=ON \ + -DCMAKE_COMPILE_WARNING_AS_ERROR=ON +cmake --build build-sanitized --parallel +ctest --test-dir build-sanitized --output-on-failure +``` diff --git a/image/preview.png b/image/preview.png deleted file mode 100644 index 193e6d939a7296838f8f981256694de08afae7a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149699 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 From fb726261e694900d3de4ad997a60e7293f8c11d6 Mon Sep 17 00:00:00 2001 From: Hanbin Tan <48960067+hskl18@users.noreply.github.com> Date: Fri, 13 Nov 2026 10:47:02 -0800 Subject: [PATCH 2/5] docs: list the WHERE operators and fix the storage link in the usage guide --- docs/usage.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 2d4004f..fdd11ca 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -32,6 +32,8 @@ select <* | field [, field ...]> from
[ ...]] ``` +`` is one of `=`, `!=`, `<`, `<=`, `>`, or `>=`, and parentheses group `and` and `or` terms. + Quote values that contain spaces, such as `"Mary Ann"`. Quoted values may contain spaces, numbers, and punctuation, but escaped double quotes are not supported. @@ -74,7 +76,7 @@ Use `--destination ` to choose another destination and note that existing - V1 tables can be queried read-only and must be migrated before new inserts. - The durability scope is one process, one writer, and one atomic statement at a time. -The exact byte layout, recovery ordering, checksums, and compatibility boundary are documented in [docs/storage-v2.md](docs/storage-v2.md). +The exact byte layout, recovery ordering, checksums, and compatibility boundary are documented in [storage-v2.md](storage-v2.md). ## Sanitizer build From 892e3445ef8a8c5f514760df5151ff17cdabe4ca Mon Sep 17 00:00:00 2001 From: Hanbin Tan <48960067+hskl18@users.noreply.github.com> Date: Fri, 13 Nov 2026 11:18:57 -0800 Subject: [PATCH 3/5] docs: draw the diagram's group boxes without a fill --- docs/architecture-dark.svg | 2 +- docs/architecture-light.svg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/architecture-dark.svg b/docs/architecture-dark.svg index e660409..9d8c17b 100644 --- a/docs/architecture-dark.svg +++ b/docs/architecture-dark.svg @@ -1 +1 @@ -Storage v2: checksummed 4 KB pagesQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage buffertable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file +Storage v2: checksummed 4 KB pagesQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage buffertable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file diff --git a/docs/architecture-light.svg b/docs/architecture-light.svg index 937e676..4e37f5f 100644 --- a/docs/architecture-light.svg +++ b/docs/architecture-light.svg @@ -1 +1 @@ -Storage v2: checksummed 4 KB pagesQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage buffertable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file +Storage v2: checksummed 4 KB pagesQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage buffertable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file From 0540ee101d9567e3ee3cbfebb87143047f040c34 Mon Sep 17 00:00:00 2001 From: Hanbin Tan <48960067+hskl18@users.noreply.github.com> Date: Fri, 13 Nov 2026 11:45:51 -0800 Subject: [PATCH 4/5] docs: correct the diagram and README points a review found --- README.md | 10 +++++----- docs/architecture-dark.svg | 2 +- docs/architecture-light.svg | 2 +- docs/architecture.mmd | 5 +++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index e8ce46b..f97ae55 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The [`original-2023`](https://github.com/hskl18/SQL/tree/original-2023) tag keep ## Quick start -You need a C++17 compiler and CMake 3.20 or newer; the build downloads nothing. +You need a C++17 compiler and CMake 3.20 or newer; the build has no third-party dependency and downloads nothing. ```bash cmake -S . -B build -DCMAKE_BUILD_TYPE=Release @@ -33,12 +33,12 @@ SQL>> select first, major from student where major = CS - A command goes from the CLI through the tokenizer and parser to the table, which filters through the shunting-yard step and a B+ tree index per field. Storage writes the after-image to the WAL and syncs it, then writes the dirty pages to the table file; opening a table recovers from the WAL. The v1 migration tool copies old .bin files into the new format. + A command goes from the CLI through the tokenizer and parser to the table, which filters through the shunting-yard step and a B+ tree index per field. The storage layer keeps checksummed 4 KB pages; it writes the after-image to the WAL and syncs it, then writes the dirty pages to the table file, and opening a table recovers from a complete WAL record. The v1 migration tool copies old .bin files into the new format. The table answers a `WHERE` filter from the per-field B+ tree indexes after the shunting-yard step turns the filter into postfix form. Each statement that changes a table first writes its complete after-image to `
.sql2-wal` and syncs it, and only then writes the changed pages to `
.sql2`. -Opening a table replays a complete WAL record, so a crash at any write leaves either the old table or the new one. +A crash before the WAL write leaves the old table, a crash after the WAL is synced recovers the new table on open, and a torn WAL record makes the open fail with a corruption error instead of guessing. ## What it supports @@ -48,12 +48,12 @@ Opening a table replays a complete WAL record, so a crash at any write leaves ei - Batch runs from the sample command files in `batch/`. - Copy-first migration from the 2023 fixed-width format. -It has no joins, multi-statement transactions, query planning, updates, or deletes, and it allows one writer at a time. +It has no joins, multi-statement transactions, schemas, query planning, updates, or deletes, and it has no locking, so run only one writer at a time. Values are stored and compared as strings, so `9` sorts after `10`. ## Tests -The CTest suite covers SQL behavior, parser safety, B+ tree splits, WAL ordering, a crash at every traced write and fsync, corruption rejection, recovery that can run twice, v1 migration, and the CLI. +The CTest suite covers SQL behavior, parser safety, B+ tree splits, stable untouched pages, WAL ordering, a crash at every traced write and fsync, corruption rejection, recovery that can run twice, v1 migration, maximum-width rows, the CLI, and both batch fixtures. Tests run in the build directory and leave no database files in the source tree. CI runs a Release build and the suite on Linux. diff --git a/docs/architecture-dark.svg b/docs/architecture-dark.svg index 9d8c17b..9cf0506 100644 --- a/docs/architecture-dark.svg +++ b/docs/architecture-dark.svg @@ -1 +1 @@ -Storage v2: checksummed 4 KB pagesQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage buffertable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file +StorageQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage bufferchecksummed 4KB pagestable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file diff --git a/docs/architecture-light.svg b/docs/architecture-light.svg index 4e37f5f..c80b153 100644 --- a/docs/architecture-light.svg +++ b/docs/architecture-light.svg @@ -1 +1 @@ -Storage v2: checksummed 4 KB pagesQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage buffertable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file +StorageQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage bufferchecksummed 4KB pagestable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file diff --git a/docs/architecture.mmd b/docs/architecture.mmd index 6de920a..e81bd94 100644 --- a/docs/architecture.mmd +++ b/docs/architecture.mmd @@ -6,12 +6,13 @@ flowchart TB Table -->|"WHERE"| Filter["Shunting-yard
postfix filter"] Filter --> Index["B+ tree index
one per field"] end - subgraph storage["Storage v2: checksummed 4 KB pages"] + subgraph storage["Storage"] direction LR - Pages["Page buffer"] -->|"1. after-image, fsync"| WAL[("table.sql2-wal")] + Pages["Page buffer
checksummed 4 KB pages"] -->|"1. after-image, fsync"| WAL[("table.sql2-wal")] Pages -->|"2. dirty pages"| Data[("table.sql2")] WAL -.->|"recover on open"| Data Legacy[("v1 .bin files")] -->|"read-only, copy-first"| Migrate["sql_migrate_v1"] Migrate --> Data end query -->|"rows and index pages"| storage +%% Edit this file, then render architecture-light.svg and architecture-dark.svg from it again. From c3aafb3e9c635b0cb86cd5a17fa1a941bf7ba982 Mon Sep 17 00:00:00 2001 From: Hanbin Tan <48960067+hskl18@users.noreply.github.com> Date: Fri, 13 Nov 2026 11:51:27 -0800 Subject: [PATCH 5/5] docs: tighten wording from the second review and say how the diagram is rendered --- docs/architecture-dark.svg | 2 +- docs/architecture-light.svg | 2 +- docs/architecture.mmd | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/architecture-dark.svg b/docs/architecture-dark.svg index 9cf0506..65cc479 100644 --- a/docs/architecture-dark.svg +++ b/docs/architecture-dark.svg @@ -1 +1 @@ -StorageQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage bufferchecksummed 4KB pagestable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file +StorageQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage bufferchecksummed4 KB pagestable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file diff --git a/docs/architecture-light.svg b/docs/architecture-light.svg index c80b153..2860c6b 100644 --- a/docs/architecture-light.svg +++ b/docs/architecture-light.svg @@ -1 +1 @@ -StorageQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage bufferchecksummed 4KB pagestable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file +StorageQuery pathWHERE1. after-image, fsync2. dirty pagesrecover on openread-only, copy-firstrows and index pagesrun_sql CLIor batch fileTokenizer andparserstate machine,parse treeTableinsert, select,projectionShunting-yardpostfix filterB+ tree indexone per fieldPage bufferchecksummed4 KB pagestable.sql2-waltable.sql2v1 .bin filessql_migrate_v1 \ No newline at end of file diff --git a/docs/architecture.mmd b/docs/architecture.mmd index e81bd94..e285328 100644 --- a/docs/architecture.mmd +++ b/docs/architecture.mmd @@ -8,11 +8,11 @@ flowchart TB end subgraph storage["Storage"] direction LR - Pages["Page buffer
checksummed 4 KB pages"] -->|"1. after-image, fsync"| WAL[("table.sql2-wal")] + Pages["Page buffer
checksummed
4 KB pages"] -->|"1. after-image, fsync"| WAL[("table.sql2-wal")] Pages -->|"2. dirty pages"| Data[("table.sql2")] WAL -.->|"recover on open"| Data Legacy[("v1 .bin files")] -->|"read-only, copy-first"| Migrate["sql_migrate_v1"] Migrate --> Data end query -->|"rows and index pages"| storage -%% Edit this file, then render architecture-light.svg and architecture-dark.svg from it again. +%% Edit this file; the owner renders architecture-light.svg and architecture-dark.svg from it with a shared theme.