Example
A real session.
obsidian> CREATE TABLE planets (name STRING, moons INT, radius FLOAT);
Created table planets.
obsidian> INSERT INTO planets VALUES ("Mercury", 0, 2439.7);
Inserted 1 row(s).
obsidian> INSERT INTO planets VALUES ("Earth", 1, 6371.0);
Inserted 1 row(s).
obsidian> INSERT INTO planets VALUES ("Mars", 2, 3389.5);
Inserted 1 row(s).
obsidian> INSERT INTO planets VALUES ("Jupiter", 95, 69911.0);
Inserted 1 row(s).
obsidian> INSERT INTO planets VALUES ("Neptune", 16, 24622.0);
Inserted 1 row(s).
obsidian> SELECT name, moons FROM planets
obsidian> WHERE moons > 0 AND NOT name = "Jupiter" ORDER BY moons DESC;
name | moons
----+----
"Neptune" | 16
"Mars" | 2
"Earth" | 1
obsidian> INSERT INTO planets VALUES ("Pluto", "five", 1188.3);
Error: Type mismatch for column moons
How it’s built
SQL → lexer → recursive-descent parser → AST → executor → in-memory tables
statements CREATE TABLE, INSERT, SELECT
types INT, FLOAT, STRING, checked on INSERT
WHERE = <> < <= > >=, with NOT > AND > OR precedence
ORDER BY ASC, DESC
REPL .tables, .schema, .help, .exit, or run a .sql file