docs: project documentation
This commit is contained in:
parent
18d47b54ce
commit
e26fffe36c
1 changed files with 108 additions and 2 deletions
110
README.md
110
README.md
|
|
@ -1,7 +1,113 @@
|
||||||
# MiniSQL
|
# 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 <FILE>
|
||||||
```
|
```
|
||||||
git clone git@gitlab.fi.muni.cz:x433485/minisql.git
|
```
|
||||||
|
Options:
|
||||||
|
-a, --address <ADDRESS> IP address for the server to listen on [default: 127.0.0.1]
|
||||||
|
-p, --port <PORT> Port for the server to listen on [default: 5432]
|
||||||
|
-f, --file <FILE> Path to the data file
|
||||||
|
-h, --help Print help
|
||||||
|
```
|
||||||
|
|
||||||
|
This will start the server listening on `<ADDRESS>:<PORT>` and load the state from `<FILE>`.
|
||||||
|
If the `<FILE>` 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> Port number of the server [default: 5432]
|
||||||
|
--host <HOST> Host name or IP address of the server [default: 127.0.0.1]
|
||||||
|
--username <USERNAME> User name [default: "minisql user"]
|
||||||
|
-h, --help Print help
|
||||||
|
```
|
||||||
|
|
||||||
|
This will start a REPL client that connects to the server at `<HOST>:<PORT>` and authorizes with `<USERNAME>`.
|
||||||
|
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 <TableName> (<ColumnName> <DataType>, ...);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `CREATE INDEX`
|
||||||
|
- Indexing is not supported for the `NUMBER` data type
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE INDEX <IndexName> ON <TableName> (<ColumnName>);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `SELECT`
|
||||||
|
- `WHERE` clause is optional and only equality is supported
|
||||||
|
- All columns can be selected with `*`
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT <ColumnName>, ... FROM <TableName> [WHERE <ColumnName> = <Value>];
|
||||||
|
```
|
||||||
|
|
||||||
|
### `INSERT`
|
||||||
|
|
||||||
|
```sql
|
||||||
|
INSERT INTO <TableName> (<ColumnName>, ...) VALUES (<Value>, ...);
|
||||||
|
```
|
||||||
|
|
||||||
|
### `DELETE`
|
||||||
|
- `WHERE` clause is optional and only equality is supported
|
||||||
|
|
||||||
|
```sql
|
||||||
|
DELETE FROM <TableName> [WHERE <ColumnName> = <Value>];
|
||||||
|
```
|
||||||
|
|
||||||
|
## 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 <HOST> -p <PORT>
|
||||||
```
|
```
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue