Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

105 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

🤖 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

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

Основное

  • 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

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

  • 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: поддержка внешних ключей

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

Модульная структура (~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 клиент

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

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

# Собрать и запустить
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 -d

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

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

cd postgrustsql
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');

Role-Based Access Control (v2.3.0)

-- Создание ролей
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)

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

Числовые:

  • 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 - дата и время без timezone
  • TIMESTAMPTZ - дата и время с timezone

Специальные:

  • BOOLEAN / BOOL - true/false
  • UUID - универсальный уникальный идентификатор
  • JSON - текстовый JSON
  • JSONB - бинарный 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.

Backup & Restore (v2.2.0)

Экспорт базы данных

# Полный дамп (схема + данные) в 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

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

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

# Стандартный 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 или 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.3.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)
  • 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 cleanup

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

cargo fmt

Линтинг

cargo clippy

Лицензия

MIT

About

AI-generated Postgres-like database for fun

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages