2015-04-14 03:05:32 -06:00
2015-04-13 04:34:19 -06:00
2015-04-14 03:05:32 -06:00
2015-03-10 08:07:47 -06:00
2015-04-13 07:47:00 -06:00
2015-03-30 13:02:14 -06:00

LlamaDB

Warning: This project is in the design/implementation phase, and is not stable. Do NOT use this for launching rockets or for anything that's important to you!

LlamaDB is a versatile, speedy and low-footprint SQL database, written entirely in the Rust programming language.

Another SQL database? Why?

The project is driven by two goals:

  1. The author wants to understand SQL better: both the language and the implementation details.
  2. Show what Rust can do for SQL, much like what Servo is doing for web browsers.

Example CLI usage

llamadb> CREATE TABLE person (
    ...>   name VARCHAR,
    ...>   age U32
    ...> );
Created.
llamadb> INSERT INTO person VALUES ('Bob', 24), ('Fred', 45);
2 rows inserted.
llamadb> SELECT * FROM person;
--------------
| name | age |
--------------
| Bob  | 24  |
| Fred | 45  |
--------------

2 rows selected.
llamadb> SELECT name || ' is ' || age || ' years old.' AS message FROM person;
-------------------------
| message               |
-------------------------
| Bob is 24 years old.  |
| Fred is 45 years old. |
-------------------------
llamadb> EXPLAIN SELECT * FROM person WHERE age >= 18;
query plan
column names: (`name`, `age`)
(scan `person` :source_id 0
  (if
    (>=
      (column-field :source_id 0 :column_offset 1)
      18)
    (yield
      (column-field :source_id 0 :column_offset 0)
      (column-field :source_id 0 :column_offset 1))))
llamadb>

Features and TODO

  • Command-line interface.
  • Stable C API.
  • CREATE TABLE, SELECT.
  • EXPLAIN - show the query plan for a SELECT statement.
  • INSERT.
  • UPDATE, DELETE.
  • Table indices, CREATE INDEX.
  • Nested and correlated subqueries.
  • GROUP BY, HAVING, ORDER BY.
  • LIMIT.
  • INSERT using a SELECT query.
  • Implicit cross joining, eg. ...FROM table1, table2....
  • Inner and outer joins (use WHERE for inner joins for now).
  • Column constraints.
  • Auto-incrementing column.
  • Persistent disk database (B+Tree and pager need more work!).
  • Transactions, locking, ACID.

Data types

  • STRING / VARCHAR
  • A variable-length UTF-8 string.
  • Ux, where x is >= 8 and <= 64, and is a multiple 8.
  • An unsigned integer.
  • Sx, where x is >= 8 and <= 64, and is a multiple 8.
  • An signed integer.
  • F64 / DOUBLE
  • A double-precision (64-bit) floating point number.
  • byte[]
  • A variable-length byte array.
  • byte[N]
  • A fixed-length byte array.

Principles

  1. Keep it simple, stupid!
  • No triggers, no users, no embedded SQL languages (e.g. PL/SQL).
  1. No temporary files
  • Temporary files can create unknown security violations if the user is unaware of them. For instance, SQLite will create temporary files on the OS's /tmp directory and in the same path as the SQLite database file.
  • The user may expect all database files to be on an encrypted drive. Sensitive data shouldn't leak to unexpected places.

Security principles

  1. The database should NEVER receive plain-text passwords.
  • This is why LlamaDB does not include any hashing functions; the inclusion of hashing functions would encourage the sending of plain-text passwords over a database connection.
  • If the DBAs and developers aren't careful, the passwords could be logged by the DBMS through query logging.
  • Hashing algorithms such as bcrypt (should) require a CRNG for the salt, and embedding CRNGs is not in the scope of LlamaDB.
  • Nowadays, it's easy to perform application-side hashing. There's a vast supply of good crypto libraries for every important programming language.

NULL

Unlike standard SQL, NULL is opt-in on table creation. For users of other SQL databases, just think of all CREATE TABLE columns as having an implicit NOT NULL.

Null still exists as a placeholder value and for outer joins; it's just not the default for CREATE TABLE columns. If NULL is desired for a column, add the NULL constraint.

Special thanks

A HUGE THANKS goes out to SQLite and the SQLite documentation. Their wonderful docs helped shed some light on the SQL syntax and other crucial details such as their B-Tree implementation.

Description
No description provided
Readme MIT 450 KiB
Languages
Rust 100%