PostgrustSQL - это реляционная база данных, написанная на Rust, с PostgreSQL-совместимым wire protocol. Поддерживает расширенные SQL операции, MVCC, транзакции, индексы и работает на порту 5432.
Автоматический тест (одна команда):
./run_test.shИли вручную:
# Терминал 1: Запустить сервер
cargo run --release
# Терминал 2: Запустить клиент
cargo run --example cli- 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)
- 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: поддержка внешних ключей
Модульная структура (~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 клиент
# Собрать и запустить
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 -dcd rustdb
cargo build --releasecargo run --releaseСервер запустится на 127.0.0.1:5432 и будет сохранять данные в папку ./data/
cargo run --example clicargo run --example clientCREATE 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;-- Посмотреть все таблицы
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';-- Версия сервера
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)
=- равно!=- не равно>- больше<- меньше
PostgrustSQL поддерживает транзакции с snapshot isolation:
-- Начать транзакцию
BEGIN;
-- Выполнить операции
INSERT INTO accounts (id, balance) VALUES (1, 1000);
UPDATE accounts SET balance = 1500 WHERE id = 1;
-- Зафиксировать изменения
COMMIT;
-- Или откатить
ROLLBACK;Важно: Изменения в транзакции видны сразу, но сохраняются на диск только после COMMIT.
# Стандартный 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
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 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 cleanupcargo fmtcargo clippyv2.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