Group project in school. Implementation of a DB server in Rust.
| client | ||
| minisql | ||
| parser | ||
| proto | ||
| server | ||
| .gitignore | ||
| .gitlab-ci.yml | ||
| Cargo.lock | ||
| Cargo.toml | ||
| DESIGN.md | ||
| DIVISION_OF_LABOUR.txt | ||
| README.md | ||
MiniSQL
Project Structure
client- REPL client for connecting to the serverserver- MiniSQL serverminisql- SQL AST interpreterparser- SQL parserproto- Implementation of subset of PostgreSQL protocol
Requirements
- Rust + Cargo with version >= 1.74.0 (using
implin return statements) - Optional:
psqlcli for testing the server
Usage
Running the server
cargo run -p server -- [OPTIONS] --file <FILE>
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:
cargo run -p server -- --file demo.json
This database contains two tables:
- Table
userswith columnsid,name,surname,email - Table
carswith columnsid,vid,brand,model,year
Running the client
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
UUIDasPRIMARY KEY
CREATE TABLE <TableName> (<ColumnName> <DataType>, ...);
CREATE INDEX
- Indexing is not supported for the
NUMBERdata type
CREATE INDEX <IndexName> ON <TableName> (<ColumnName>);
SELECT
WHEREclause is optional and only equality is supported- All columns can be selected with
*
SELECT <ColumnName>, ... FROM <TableName> [WHERE <ColumnName> = <Value>];
INSERT
INSERT INTO <TableName> (<ColumnName>, ...) VALUES (<Value>, ...);
DELETE
WHEREclause is optional and only equality is supported
DELETE FROM <TableName> [WHERE <ColumnName> = <Value>];
Data Types
UUID- special integer prefixed withu, e.g.u12345STRING- string enclosed in double quotes, e.g."Hello World"INT- integer, e.g.12345NUMBER- 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:
psql -h <HOST> -p <PORT>