Skip to content

This is my solution in Go for the "Build Your Own SQLite" Challenge.

Notifications You must be signed in to change notification settings

feliposz/build-your-own-sqlite-go

Repository files navigation

Build Your Own SQLite

This is my solution in Go for the "Build Your Own SQLite" Challenge.

In this challenge, I have built a barebones SQLite implementation that supports basic SQL queries by reading the raw SQLite's file format, filtering using indexes and traversing the stored B-trees structure and more.

Stages

Final implementation passes all stages of sqlite-tester v47:

  • Print page size
  • Print number of tables
  • Print table names
  • Count rows in a table
  • Read data from a single column
  • Read data from multiple columns
  • Filter data with a WHERE clause
  • Retrieve data using a full-table scan
  • Retrieve data using an index

Sample Databases

To make it easy to test queries locally, we've added a sample database in the root of this repository: sample.db.

This contains two tables: apples & oranges. You can use this to test your implementation for the first 6 stages.

You can explore this database by running queries against it like this:

$ sqlite3 sample.db "select id, name from apples"
1|Granny Smith
2|Fuji
3|Honeycrisp
4|Golden Delicious

There are two other databases that you can use:

  1. superheroes.db:
    • This is a small version of the test database used in the table-scan stage.
    • It contains one table: superheroes.
    • It is ~1MB in size.
  2. companies.db:
    • This is a small version of the test database used in the index-scan stage.
    • It contains one table: companies, and one index: idx_companies_country
    • It is ~7MB in size.

These aren't included in the repository because they're large in size. You can download them by running this script:

./download_sample_databases.sh

If the script doesn't work for some reason, you can download the databases directly from codecrafters-io/sample-sqlite-databases.