diff --git a/README.md b/README.md index 42a9ca6..866e57c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,113 @@ # MiniSQL -## Installation +## 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 ``` -git clone git@gitlab.fi.muni.cz:x433485/minisql.git +``` +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 ( , ...); +``` + +### `CREATE INDEX` +- Indexing is not supported for the `NUMBER` data type + +```sql +CREATE INDEX ON (); +``` + +### `SELECT` +- `WHERE` clause is optional and only equality is supported +- All columns can be selected with `*` + +```sql +SELECT , ... FROM [WHERE = ]; +``` + +### `INSERT` + +```sql +INSERT INTO (, ...) VALUES (, ...); +``` + +### `DELETE` +- `WHERE` clause is optional and only equality is supported + +```sql +DELETE FROM [WHERE = ]; +``` + +## 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 ```