Skip to content

rager306/postgrust-sql

 
 

Repository files navigation

PostgrustSQL - PostgreSQL-совместимая база данных на Rust

PostgrustSQL - это реляционная база данных, написанная на Rust, с PostgreSQL-совместимым wire protocol. Поддерживает расширенные SQL операции, MVCC, транзакции, индексы и работает на порту 5432.

🚀 Быстрый старт

Автоматический тест (одна команда):

./run_test.sh

Или вручную:

# Терминал 1: Запустить сервер
cargo run --release

# Терминал 2: Запустить клиент
cargo run --example cli

Возможности (v2.0.1)

Основное

  • SQL запросы: CREATE/DROP TABLE/VIEW, INSERT, SELECT, UPDATE, DELETE, SHOW TABLES
  • MVCC (Multi-Version Concurrency Control): изоляция с версионированием строк (xmin/xmax)
  • WAL (Write-Ahead Log): автоматическое логирование операций с crash recovery
  • Транзакции: BEGIN, COMMIT, ROLLBACK с snapshot isolation
  • Индексы: B-tree и Hash индексы (одиночные и составные)
  • VACUUM: очистка мёртвых версий строк (MVCC cleanup)
  • PostgreSQL Protocol (v2.0.0): Полная совместимость с psql клиентом
    • Стандартный authentication flow (AuthenticationCleartextPassword)
    • System catalogs (pg_catalog., information_schema.)
    • System functions (version(), current_database(), pg_table_size())
  • Качество кода (v2.0.1): Строгая конфигурация Clippy (pedantic + nursery)

SQL Возможности

  • 23 типа данных: INTEGER, BIGINT, SERIAL, TEXT, VARCHAR, CHAR, DATE, TIMESTAMP, JSON, JSONB, UUID, NUMERIC, ENUM, и др.
  • WHERE операторы: =, !=, >, <, >=, <=, BETWEEN, LIKE, IN, IS NULL
  • JOIN: INNER, LEFT, RIGHT
  • Агрегаты: COUNT, SUM, AVG, MIN, MAX
  • GROUP BY с HAVING
  • ORDER BY с ASC/DESC
  • LIMIT и OFFSET
  • DISTINCT
  • CASE выражения (v1.10.0)
  • Set операции: UNION, UNION ALL, INTERSECT, EXCEPT (v1.10.0)
  • Views: виртуальные таблицы (v1.10.0)

Дополнительно

  • EXPLAIN: анализ плана выполнения запросов
  • Page-based storage: оптимизированное хранение (125x улучшение)
  • Составные индексы: поддержка multi-column индексов
  • Foreign Keys: поддержка внешних ключей

Архитектура (v2.0.1)

Модульная структура (~2400 строк кода, чистый код после v2.0.0 cleanup):

rustdb/
├── src/
│   ├── main.rs             # Точка входа сервера
│   ├── core/               # Базовые типы (Database, Table, Row, Value, Column)
│   ├── parser/             # SQL парсер (nom) - ddl.rs, dml.rs, queries.rs
│   ├── executor/           # Модульный исполнитель
│   │   ├── storage_adapter.rs  # RowStorage trait (Vec<Row> | PagedTable)
│   │   ├── conditions.rs       # WHERE evaluation (все операторы)
│   │   ├── dml.rs             # INSERT/UPDATE/DELETE
│   │   ├── ddl.rs             # CREATE/DROP/ALTER TABLE
│   │   ├── queries.rs         # SELECT (с query planner)
│   │   ├── vacuum.rs          # VACUUM cleanup
│   │   ├── index.rs           # CREATE/DROP INDEX
│   │   ├── explain.rs         # EXPLAIN analyzer
│   │   └── dispatcher.rs      # Query dispatcher (146 строк, v2.0.0: renamed from legacy.rs)
│   ├── index/              # B-tree & Hash индексы (single & composite)
│   ├── transaction/        # TransactionManager, Snapshot
│   ├── storage/            # Binary save/load, WAL, Page-based storage
│   └── network/            # TCP server, PostgreSQL protocol
└── examples/
    ├── client.rs           # Автоматический клиент
    └── cli.rs              # Интерактивный CLI клиент

Установка и запуск

Вариант 1: Docker (рекомендуется)

# Собрать и запустить
docker-compose up -d

# Проверить статус
docker-compose ps

# Посмотреть логи
docker-compose logs -f rustdb

# Подключиться к серверу
nc localhost 5432
# или
telnet localhost 5432
# или через PostgreSQL клиент
psql -h localhost -p 5432 -U rustdb -d main

# Выполнить команду внутри контейнера
docker-compose exec rustdb /app/postgrustql --help

# Остановить
docker-compose down

# Остановить и удалить данные
docker-compose down -v

# Пересобрать после изменений кода
docker-compose build --no-cache
docker-compose up -d

Вариант 2: Локальная сборка

Сборка проекта

cd rustdb
cargo build --release

Запуск сервера

cargo run --release

Сервер запустится на 127.0.0.1:5432 и будет сохранять данные в папку ./data/

Использование клиента

Интерактивный CLI клиент:

cargo run --example cli

Автоматический тестовый клиент:

cargo run --example client

Примеры SQL запросов

Создание таблицы

CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    age INTEGER,
    active BOOLEAN
);

Вставка данных

INSERT INTO users (id, name, age, active) VALUES (1, 'Alice', 30, TRUE);
INSERT INTO users (id, name, age, active) VALUES (2, 'Bob', 25, TRUE);

Выборка данных

-- Выбрать все записи
SELECT * FROM users;

-- Выбрать определенные колонки
SELECT name, age FROM users;

-- Выбрать с условием
SELECT * FROM users WHERE age > 25;

Обновление данных

UPDATE users SET age = 31 WHERE name = 'Alice';
UPDATE users SET active = FALSE WHERE age < 26;

Удаление данных

DELETE FROM users WHERE age < 30;

Просмотр списка таблиц

SHOW TABLES;

Удаление таблицы

DROP TABLE users;

PostgreSQL System Catalogs (v2.0.0)

-- Посмотреть все таблицы
SELECT * FROM pg_catalog.pg_class WHERE relkind = 'r';

-- Посмотреть колонки таблицы
SELECT attname, atttypid FROM pg_catalog.pg_attribute
WHERE attrelid = (SELECT oid FROM pg_catalog.pg_class WHERE relname = 'users');

-- Information Schema
SELECT table_name FROM information_schema.tables;
SELECT column_name, data_type FROM information_schema.columns
WHERE table_name = 'users';

System Functions (v2.0.0)

-- Версия сервера
SELECT version();

-- Текущая база данных
SELECT current_database();

-- Размер таблицы в байтах
SELECT pg_table_size('users');

-- Размер базы данных
SELECT pg_database_size('main');

Поддерживаемые типы данных

  • INTEGER / INT - целые числа (i64)
  • REAL / FLOAT - вещественные числа (f64)
  • TEXT / VARCHAR - строки (String)
  • BOOLEAN / BOOL - логические значения (bool)

Операторы WHERE

  • = - равно
  • != - не равно
  • > - больше
  • < - меньше

Транзакции

PostgrustSQL поддерживает транзакции с snapshot isolation:

-- Начать транзакцию
BEGIN;

-- Выполнить операции
INSERT INTO accounts (id, balance) VALUES (1, 1000);
UPDATE accounts SET balance = 1500 WHERE id = 1;

-- Зафиксировать изменения
COMMIT;

-- Или откатить
ROLLBACK;

Важно: Изменения в транзакции видны сразу, но сохраняются на диск только после COMMIT.

Подключение к серверу

Через psql (PostgreSQL клиент) - v2.0.0+

# Стандартный PostgreSQL клиент (рекомендуется)
psql -h 127.0.0.1 -p 5432 -U rustdb -d main
# Пароль: любой (authentication в v2.0.0)

# Использование meta-команд
\dt                    # Список таблиц
\d users              # Описание таблицы users
\di                   # Список индексов
\l                    # Список баз данных

Через telnet или netcat

# Через telnet
telnet 127.0.0.1 5432

# Через netcat
nc 127.0.0.1 5432

Вывод SELECT запросов будет красиво отформатирован:

┌────┬───────┬─────┐
│ id ┆ name  ┆ age │
╞════╪═══════╪═════╡
│ 1  ┆ Alice ┆ 30  │
└────┴───────┴─────┘

Технологии

  • Rust Edition 2024
  • tokio 1.41 - асинхронный runtime
  • nom 7.1 - парсер комбинаторы для SQL
  • serde 1.0 + bincode 1.3 - бинарная сериализация (WAL, snapshots)
  • serde_json 1.0 - JSON/JSONB поддержка
  • thiserror 2.0 - обработка ошибок
  • comfy-table 7.1 - красивое форматирование таблиц
  • rustyline 14.0 - CLI с историей команд
  • chrono 0.4 - Date/Time типы
  • uuid 1.6 - UUID тип
  • rust_decimal 1.33 - NUMERIC тип с точностью

PostgreSQL Совместимость (v2.0.0+)

✅ Поддерживается

  • PostgreSQL wire protocol (порт 5432)
  • Authentication (cleartext password)
  • Подключение через psql клиент
  • System catalogs (pg_catalog., information_schema.)
  • System functions (version(), current_database(), pg_*_size())
  • Meta-команды psql (\dt, \d, \di, \l)

⚠️ Ограничения

  • Транзакции работают только в пределах одного подключения (planned v2.1.0)
  • Один JOIN на запрос (множественные JOIN planned)
  • WHERE с JOIN не полностью поддерживается
  • Составные индексы требуют точного совпадения всех колонок
  • Hash индексы только для = (B-tree для диапазонов)
  • Extended Query Protocol (prepared statements) пока не поддерживается

Разработка

Запуск тестов

# Юнит-тесты (166 тестов, все проходят ✅ v2.0.1)
cargo test

# Интеграционные тесты
./tests/integration/test_features.sh           # Все основные фичи
./tests/integration/test_new_types.sh          # Все 23 типа данных
./tests/integration/test_hash_index.sh         # B-tree & Hash индексы
./tests/integration/test_composite_index.sh    # Составные индексы
./tests/integration/test_extended_operators.sh # Расширенные WHERE операторы
./tests/integration/test_explain.sh            # EXPLAIN команда
./tests/integration/test_sql_expressions.sh    # CASE & set операции
./tests/integration/test_vacuum.sh             # VACUUM cleanup

Форматирование кода

cargo fmt

Линтинг

cargo clippy

История версий

v2.0.1 (Текущая) - Качество кода и тесты

  • 🔧 Строгая конфигурация Clippy (pedantic + nursery + cargo + correctness)
  • ✨ Автоматические исправления применены (unused imports, dereferencing, etc.)
  • 🔄 Рефакторинг 16 dispatcher тестов для page-based storage
  • ✅ 166/166 тестов проходят (100% success rate)

v2.0.0 - PostgreSQL Compatibility Layer

  • 🔐 Стандартный PostgreSQL authentication protocol
  • 📊 System catalogs (pg_catalog.pg_class, pg_attribute, pg_index, pg_type, pg_namespace)
  • 📊 Information schema (information_schema.tables, columns, views)
  • ⚙️ System functions (version(), current_database(), pg_table_size(), pg_database_size())
  • 🔄 Рефакторинг: legacy.rs → dispatcher.rs
  • 🧹 Полное удаление устаревшего кода
  • ✅ Полная совместимость с psql клиентом

v1.11.0 - Критические исправления и стабильность

  • 🐛 Исправлены 4 падающих теста хранилища (WAL crash recovery)
  • 🧹 Исправлены все compiler warnings (26 шт.)
  • ✅ 154/154 юнит-тестов проходят
  • 🔧 Подготовка к v2.0.0 (стабильная база)

v1.10.0 - SQL выражения и операции над множествами

  • CASE выражения (условная логика в SELECT)
  • Set операции (UNION, UNION ALL, INTERSECT, EXCEPT)
  • Views (виртуальные таблицы)

v1.9.0 - Составные (multi-column) индексы v1.8.0 - Расширенные WHERE операторы + EXPLAIN v1.7.0 - Hash индексы с USING clause v1.6.0 - B-tree индексы с оптимизацией запросов v1.5.1 - VACUUM команда для MVCC cleanup v1.5.0 - Page-based storage (улучшение в 125x)

Лицензия

MIT

About

AI-generated Postgres-like database for fun

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Rust 84.0%
  • Shell 15.9%
  • Dockerfile 0.1%