Полнофункциональная система управления базами данных с end-to-end пайплайном выполнения SQL-запросов.
./START.shСкрипт автоматически:
- Соберет проект
- Запустит сервер на порту 5433
- Покажет инструкции для подключения
Или вручную:
./gradlew build
java -cp build/classes/java/main com.example.Main 5433 /tmp/db_dataВ новом терминале:
java -cp build/classes/java/main com.example.Main clientПосле подключения вы увидите:
Connected to server (PROTOCOL:1.0)
Server ready. Type SQL queries (exit to quit):
Введите SQL запросы по одному:
CREATE TABLE users (id INTEGER, name VARCHAR, age INTEGER)
INSERT INTO users VALUES (1, 'Alice', 25)
INSERT INTO users VALUES (2, 'Bob', 30)
SELECT * FROM users
SELECT * FROM users WHERE age > 25
CREATE INDEX users_id_idx ON users(id)
SELECT * FROM users WHERE id = 1Готовые запросы: Откройте файл SQL_QUERIES.txt и копируйте запросы по одному.
CREATE TABLE products (id INTEGER, name VARCHAR, price INTEGER)INSERT INTO products VALUES (1, 'Laptop', 1000)
INSERT INTO products VALUES (2, 'Phone', 500)SELECT * FROM products
SELECT * FROM products WHERE price > 600
SELECT name, price FROM products WHERE id = 1CREATE INDEX products_price_idx ON products(price)- Storage Layer: Страницы, файлы таблиц, персистентность
- Buffer Manager: Пул буферов с LRU вытеснением
- Индексы: B+Tree с поиском и range-сканами
- SQL обработка: Lexer → Parser → Semantic → Planner → Optimizer
- Executors: SeqScan, IndexScan, Filter, Project (Volcano модель)
- Клиент-Сервер: TCP сервер с формализованным протоколом
CLI / TCP Client
↓
Server (socket accept / session)
↓
Lexer → List<Token>
↓
Parser → AST
↓
Semantic Analyzer → QueryTree
↓
Planner → Logical Plan
↓
Optimizer → Physical Plan
↓
ExecutorFactory
↓
Volcano Executors (open / next / close)
↓
Table / Index / Storage
CREATE TABLE- создание таблицыDROP TABLE- удаление таблицы (удаляет таблицу, все данные и индексы)CREATE INDEX- создание индексаINSERT INTO ... VALUES- вставка данныхSELECT ... FROM ... WHERE- выборка с фильтрацией
В логах сервера видны все этапы обработки:
- Токены запроса
- AST дерево
- QueryTree
- LogicalPlan
- PhysicalPlan (с IndexScan для запросов с индексом!)
src/main/java/com/example/
├── storage/ # Хранилище
├── buffer/ # Буферный менеджер
├── index/ # Индексы (B+Tree)
├── sql/
│ ├── lexer/ # Лексер
│ ├── parser/ # Парсер
│ ├── semantic/ # Семантический анализатор
│ ├── planner/ # Планировщик
│ └── optimizer/ # Оптимизатор
├── executor/ # Executors
├── server/ # TCP сервер
├── client/ # CLI клиент
└── Main.java # Точка входа
- Выполняйте SQL запросы по одному
- Можно использовать SQL комментарии (
--) - Запросы можно разделять точкой с запятой (
;) - Сервер использует порт 5433 (чтобы не конфликтовать с PostgreSQL на 5432)
Запуск всех тестов:
./gradlew testНажмите Ctrl+C в терминале сервера или:
pkill -f "com.example.Main"