# MiniSQL ## Project Structure - `client` - REPL client for connecting to the server - `server` - MiniSQL server - `minisql` - SQL AST interpreter - `parser` - SQL parser - `proto` - Implementation of subset of PostgreSQL protocol ## Requirements - Rust + Cargo with version **>= 1.74.0** (using `impl` in return statements) - Optional: `psql` cli for testing the server # Usage ## Running the server ```bash cargo run -p server -- [OPTIONS] --file ``` ``` Options: -a, --address
IP address for the server to listen on [default: 127.0.0.1] -p, --port Port for the server to listen on [default: 5432] -f, --file Path to the data file -h, --help Print help ``` This will start the server listening on `
:` and load the state from ``. If the `` does not exist, it will be created. ### Demo Database A database with demo data is available in `demo.json`. To run the server with this database, use: ```bash cargo run -p server -- --file demo.json ``` This database contains two tables: - Table `users` with columns `id`, `name`, `surname`, `email` - Table `cars` with columns `id`, `vid`, `brand`, `model`, `year` ## Running the client ```bash cargo run -p client -- [OPTIONS] ``` ``` Options: -p, --port Port number of the server [default: 5432] --host Host name or IP address of the server [default: 127.0.0.1] --username User name [default: "minisql user"] -h, --help Print help ``` This will start a REPL client that connects to the server at `:` and authorizes with ``. SQL queries can be entered line by line. The client will print the result of each query. To exit the REPL client, enter `exit` or `quit`. # Features - SQL must be on single line, in **UPPERCASE** and end with `;`, as it should be - Supported operations: `CREATE TABLE`, `CREATE INDEX`, `SELECT`, `INSERT`, `DELETE` - Supported data types: `UUID`, `STRING`, `INT`, `NUMBER` - Supported subset of PostgreSQL protocol, without authentication and simple query flow ## Operations ### `CREATE TABLE` - Every table requires one column with type `UUID` as `PRIMARY KEY` ```sql CREATE TABLE ( , ...); ``` With the demo database, this can be used to create a new table: ```sql CREATE TABLE games (id UUID PRIMARY KEY, name STRING, year INT, price NUMBER); ``` ### `CREATE INDEX` - Indexing is not supported for the `NUMBER` data type ```sql CREATE INDEX ON (); ``` With the demo database, this can be used to create a new index: ```sql CREATE INDEX CarsYear ON cars (year); ``` ### `SELECT` - `WHERE` clause is optional and only equality is supported - All columns can be selected with `*` ```sql SELECT , ... FROM [WHERE = ]; ``` With the demo database, this can be used to select all cars with year 2001: ```sql SELECT * FROM cars WHERE year = 2001; ``` ### `INSERT` ```sql INSERT INTO (, ...) VALUES (, ...); ``` With the demo database, this can be used to insert a new user: ```sql INSERT INTO users (id, name, surname, email) VALUES (u12345, "John", "Doe", "johhny.trucker@seznam.cz"); ``` ### `DELETE` - `WHERE` clause is optional and only equality is supported ```sql DELETE FROM [WHERE = ]; ``` With the demo database, this can be used to delete all users with name Christina: ```sql DELETE FROM users WHERE name = "Christina"; ``` ## Data Types - `UUID` - special integer prefixed with `u`, e.g. `u12345` - `STRING` - string enclosed in double quotes, e.g. `"Hello World"` - `INT` - integer, e.g. `12345` - `NUMBER` - floating point number, e.g. `123.45` ## Testing with `psql` Thanks to the subset of PostgreSQL protocol implemented in `proto`, the server can be tested with `psql`, which offers REPL client similar to the `client` crate: ```bash psql -h -p ```