🤖 Experimental AI-Driven Project Проект создан из интереса проверить, может ли AI полностью самостоятельно написать работающую базу данных. Весь код и архитектура написаны без человеческого вмешательства.
PostgrustSQL - это реляционная база данных, написанная на Rust, с PostgreSQL-совместимым wire protocol. Поддерживает расширенные SQL операции, MVCC, транзакции, индексы и работает на порту 5432.
📖 Полная инструкция по установке и настройке: INSTALL.md
Включает: установку из исходников, пакеты для Arch/Debian, настройку конфигурации, systemd сервис, переменные окружения, и troubleshooting.
Автоматический тест (одна команда):
./run_test.shИли вручную:
# Терминал 1: Запустить сервер
cargo run --release
# Терминал 2: Запустить клиент
cargo run --example cli- SQL запросы: CREATE/DROP TABLE/VIEW, INSERT, SELECT, UPDATE, DELETE, SHOW TABLES
- Window Functions (v2.6.0): Аналитические функции с PARTITION BY и ORDER BY
- ROW_NUMBER() - последовательная нумерация
- RANK() / DENSE_RANK() - ранжирование с/без пропусков
- LAG() / LEAD() - доступ к предыдущим/следующим строкам
- Полная поддержка PARTITION BY и ORDER BY
- Subqueries (v2.6.0): Подзапросы во всех контекстах
- IN / NOT IN подзапросы в WHERE
- EXISTS / NOT EXISTS проверки существования
- Scalar subqueries в WHERE и SELECT
- Вложенные подзапросы любой глубины
- Multi-JOIN (v2.6.0): Множественные JOIN в одном запросе
- Последовательная обработка нескольких таблиц
- Смешанные типы JOIN (INNER/LEFT/RIGHT)
- Агрегатные функции с JOIN (COUNT, SUM, AVG, MIN, MAX)
- Extended Query Protocol (v2.4.0): Prepared statements с параметрами ($1, $2, $3...)
- PARSE/BIND/DESCRIBE/EXECUTE/CLOSE/SYNC протокол
- Server-side statement caching для производительности
- Защита от SQL injection через параметризацию
- COPY Protocol (v2.4.0 / v2.5.0): Массовый импорт/экспорт данных
- COPY FROM STDIN для bulk import (CSV/TSV/Binary)
- COPY TO STDOUT для экспорта данных (CSV/TSV/Binary)
- Binary Format (v2.5.0): PostgreSQL-compatible binary protocol, 3-5x быстрее CSV
- Полная поддержка всех 23 типов данных в binary формате
- 10-100x быстрее чем обычные INSERT
- Role-Based Access Control (v2.3.0): Роли, владение таблицами, права доступа
- CREATE/DROP ROLE, GRANT/REVOKE роли
- Автоматическое владение таблицами (owner = создатель)
- Табличные привилегии (GRANT/REVOKE SELECT/INSERT/UPDATE/DELETE ON TABLE)
- ALTER TABLE OWNER TO для смены владельца
- Multi-Connection Transaction Isolation (v2.1.0): DML изолирован между connections
- Backup & Restore (v2.2.0): pgr_dump/pgr_restore утилиты (SQL + binary форматы)
- MVCC (Multi-Version Concurrency Control): изоляция с версионированием строк (xmin/xmax)
- WAL (Write-Ahead Log): автоматическое логирование операций с crash recovery
- Транзакции: BEGIN, COMMIT, ROLLBACK с READ COMMITTED isolation
- Индексы: B-tree и Hash индексы (одиночные и составные)
- VACUUM: очистка мёртвых версий строк (MVCC cleanup)
- PostgreSQL Protocol (v2.0.0): Полная совместимость с psql клиентом
- Simple Query Protocol + Extended Query Protocol (v2.4.0)
- Стандартный authentication flow (AuthenticationCleartextPassword)
- System catalogs (pg_catalog., information_schema.)
- System functions (version(), current_database(), pg_table_size())
- Качество кода (v2.0.2): 0 deprecated warnings, relaxed Clippy для pet project
- 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 (множественные JOIN в одном запросе)
- Агрегаты: COUNT, SUM, AVG, MIN, MAX (работают с JOIN)
- Window Functions: ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD
- Subqueries: IN, NOT IN, EXISTS, NOT EXISTS, scalar subqueries
- 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: поддержка внешних ключей
Модульная структура (~19500 строк кода, добавлены Window Functions + Subqueries + Multi-JOIN в v2.6.0):
postgrustsql/
├── src/
│ ├── main.rs # Точка входа сервера
│ ├── core/ # Базовые типы (Database, Table, Row, Value, Column)
│ │ ├── role.rs # (v2.3.0) Роли и иерархия
│ │ ├── table_metadata.rs # (v2.3.0) Права доступа к таблицам
│ │ ├── server_instance.rs # Управление ролями и проверка прав
│ │ └── ...
│ ├── parser/ # SQL парсер (nom) - ddl.rs, dml.rs, queries.rs
│ ├── executor/ # Модульный исполнитель
│ │ ├── storage_adapter.rs # RowStorage trait (Vec<Row> | PagedTable)
│ │ ├── conditions.rs # WHERE evaluation (+ subqueries v2.6.0)
│ │ ├── dml.rs # INSERT/UPDATE/DELETE
│ │ ├── ddl.rs # CREATE/DROP/ALTER TABLE
│ │ ├── queries.rs # SELECT (+ multi-JOIN, aggregates fix v2.6.0)
│ │ ├── subquery.rs # (v2.6.0) Подзапросы IN/EXISTS/scalar
│ │ ├── window.rs # (v2.6.0) Window functions
│ │ ├── vacuum.rs # VACUUM cleanup
│ │ ├── index.rs # CREATE/DROP INDEX
│ │ ├── explain.rs # EXPLAIN analyzer
│ │ ├── system_catalogs.rs # (v2.0.0) pg_catalog.*, information_schema.*
│ │ └── dispatcher.rs # Query dispatcher
│ ├── index/ # B-tree & Hash индексы (single & composite)
│ ├── transaction/ # TransactionManager, Snapshot, GlobalTransactionManager
│ ├── storage/ # Binary save/load, WAL, Page-based storage
│ └── network/ # TCP server, PostgreSQL protocol
│ ├── server.rs # TCP сервер с Simple + Extended Query Protocol
│ ├── pg_protocol.rs # PostgreSQL wire protocol messages
│ ├── prepared_statements.rs # (v2.4.0) Statement cache + parameter substitution
│ └── mod.rs # Permission enforcement, session context
└── examples/
├── client.rs # Автоматический клиент
└── cli.rs # Интерактивный CLI клиент
# Собрать и запустить
docker-compose up -d
# Проверить статус
docker-compose ps
# Посмотреть логи
docker-compose logs -f postgrust
# Подключиться к серверу
nc localhost 5432
# или
telnet localhost 5432
# или через PostgreSQL клиент
psql -h localhost -p 5432 -U postgrust -d main
# Выполнить команду внутри контейнера
docker-compose exec postgrust /app/postgrustsql --help
# Остановить
docker-compose down
# Остановить и удалить данные
docker-compose down -v
# Пересобрать после изменений кода
docker-compose build --no-cache
docker-compose up -dcd postgrustsql
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');-- Создание ролей
CREATE ROLE admin WITH SUPERUSER;
CREATE ROLE developer;
CREATE ROLE readonly;
-- Удаление роли
DROP ROLE readonly;
-- Назначение роли пользователю
GRANT admin TO alice;
GRANT developer TO bob;
-- Отзыв роли
REVOKE developer FROM bob;
-- Управление правами на таблицы
GRANT SELECT ON TABLE users TO alice;
GRANT INSERT, UPDATE ON TABLE users TO bob;
GRANT ALL ON TABLE orders TO admin;
-- Отзыв прав
REVOKE UPDATE ON TABLE users FROM bob;
REVOKE ALL ON TABLE orders FROM admin;
-- Смена владельца таблицы
ALTER TABLE users OWNER TO alice;
-- Проверка прав (автоматически)
SELECT * FROM users; -- Требует SELECT или быть владельцем
INSERT INTO users (name) VALUES ('Charlie'); -- Требует INSERT или быть владельцем
UPDATE users SET age = 25; -- Требует UPDATE или быть владельцем
DELETE FROM users WHERE id = 1; -- Требует DELETE или быть владельцемИерархия прав:
- Superuser - полный доступ ко всем таблицам
- Owner - полный доступ к своим таблицам
- Granted privileges - конкретные права (SELECT/INSERT/UPDATE/DELETE)
Числовые:
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.
# Полный дамп (схема + данные) в SQL формат
./target/release/pgr_dump postgres > backup.sql
# Только схема (CREATE statements)
./target/release/pgr_dump --schema-only postgres > schema.sql
# Только данные (INSERT statements)
./target/release/pgr_dump --data-only postgres > data.sql
# Бинарный формат (быстрее для больших БД)
./target/release/pgr_dump --format=binary postgres > backup.bin# Восстановление из SQL дампа
./target/release/pgr_restore postgres < backup.sql
# Восстановление из бинарного формата
./target/release/pgr_restore --format=binary postgres < backup.bin
# Dry-run (только валидация, без выполнения)
./target/release/pgr_restore --dry-run postgres < backup.sql# Стандартный PostgreSQL клиент (рекомендуется)
psql -h 127.0.0.1 -p 5432 -U postgrust -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)
- RBAC (CREATE/DROP ROLE, GRANT/REVOKE роли и привилегии)
- Table ownership и контроль доступа
- Один JOIN на запрос (множественные JOIN planned)
- WHERE с JOIN не полностью поддерживается
- Составные индексы требуют точного совпадения всех колонок
- Hash индексы только для = (B-tree для диапазонов)
- Extended Query Protocol (prepared statements) пока не поддерживается
- DDL операции (CREATE/DROP/ALTER TABLE) auto-commit даже внутри транзакций
# Юнит-тесты (198 тестов: 191 passed, 7 ignored ✅ v2.3.0)
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 clippyMIT