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 типа данных: SMALLINT, INTEGER, BIGINT, SERIAL, BIGSERIAL, REAL, NUMERIC(p,s), TEXT, VARCHAR(n), CHAR(n), BOOLEAN, DATE, TIMESTAMP, TIMESTAMPTZ, UUID, JSON, JSONB, BYTEA, ENUM, и др.
- JOIN: INNER, LEFT, RIGHT
- Агрегаты: COUNT, SUM, AVG, MIN, MAX
- GROUP BY
- ORDER BY с ASC/DESC
- LIMIT и OFFSET
- DISTINCT
- UNIQUE constraints
- CASE выражения (v1.10.0)
- Set операции: UNION, UNION ALL, INTERSECT, EXCEPT (v1.10.0)
- Views: виртуальные таблицы (v1.10.0)
- WHERE операторы: =, !=, >, <, >=, <=, BETWEEN, LIKE, IN, IS NULL/IS NOT NULL
- 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');Числовые:
SMALLINT(i16),INTEGER/INT(i32),BIGINT(i64)SERIAL(auto-increment i32),BIGSERIAL(auto-increment i64)REAL/FLOAT(f32),DOUBLE PRECISION(f64)NUMERIC(precision, scale)- точные десятичные числа
Строковые:
TEXT- произвольная длинаVARCHAR(n)- ограничение длины с валидациейCHAR(n)- фиксированная длина с padding
Дата и время:
DATE- дата (YYYY-MM-DD)TIMESTAMP- дата и время без timezoneTIMESTAMPTZ- дата и время с timezone
Специальные:
BOOLEAN/BOOL- true/falseUUID- универсальный уникальный идентификаторJSON- текстовый JSONJSONB- бинарный JSON (быстрее)BYTEA- бинарные данныеENUM- пользовательский перечисляемый тип
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 WHEN...THEN...ELSE...END выражения
- ✨ Set операции (UNION, UNION ALL, INTERSECT, EXCEPT)
- ✨ Views (CREATE/DROP VIEW, виртуальные таблицы)
v1.9.0 - Составные (multi-column) индексы
- ✨ CREATE INDEX на несколько колонок: idx(col1, col2, col3)
- ✨ Поддержка BTREE и HASH для составных индексов
- ✨ Автоматическая оптимизация для AND условий
- ✅ 147 юнит-тестов
v1.8.0 - Расширенные WHERE операторы + EXPLAIN
- ✨ Новые операторы: >=, <=, BETWEEN, LIKE, IN, IS NULL
- ✨ EXPLAIN команда для анализа запросов
- 📊 Показывает тип сканирования, используемые индексы, сложность O(n)/O(log n)/O(1)
v1.7.0 - Hash индексы
- ✨ Hash индексы для O(1) поиска
- ✨ USING HASH/BTREE синтаксис
- 🔄 Автоматический query planner выбирает тип индекса
v1.6.0 - B-tree индексы с оптимизацией
- ✨ B-tree индексы (O(log n) поиск)
- ✨ CREATE INDEX / CREATE UNIQUE INDEX / DROP INDEX
- 🔄 Автоматический выбор между index scan и sequential scan
- 🔧 MVCC-aware операции с индексами
v1.5.1 - VACUUM команда
- ✨ VACUUM для очистки мёртвых версий строк (MVCC cleanup)
- 🧹 Освобождение места после UPDATE/DELETE
v1.5.0 - Page-based storage
- 🚀 Улучшение write amplification в 125x
- 📄 PostgreSQL-совместимые 8KB страницы
- 💾 LRU buffer pool для кэширования
- 🔧 Модульный executor (5 специализированных модулей)
v1.4.1 - ALTER TABLE
- ✨ ALTER TABLE ADD/DROP/RENAME COLUMN
- ✨ ALTER TABLE RENAME TO
- 📝 Интеграция с WAL для crash recovery
v1.4.0 - Query enhancements
- ✨ OFFSET для пагинации
- ✨ DISTINCT для уникальных значений
- ✨ UNIQUE constraint для колонок
v1.3.2 - Модульная архитектура
- 🔄 Рефакторинг: 9 файлов → 40+ модулей
- 📁 Структура: core/, parser/, transaction/, storage/, network/
- ✅ 66+ тестов, полная обратная совместимость
v1.3.1 - PostgreSQL syntax + 18 новых типов
- ✨ 18 новых типов данных (SMALLINT, UUID, DATE, TIMESTAMP, ENUM, etc.)
- 📊 23 типа в сумме (~45% PostgreSQL совместимость)
- 🔧 Meta-команды (\dt, \l, \du)
- ✅ Валидация типов
MIT