Autorski interpreter języka SQL oraz lokalny silnik bazodanowy zaimplementowany w C++. Program pozwala na zarządzanie strukturą tabel oraz manipulację danymi i wykonywanie zapytań.
Krzysztof Leśniak
krlesniak@student.agh.edu.pl
Konrad Mateja
kmateja@student.agh.edu.pl
- Ogólne cele: Implementacja interpretera języka SQL oraz silnika bazodanowego w języku C++.
Celem projektu jest stworzenie systemu zarządzania danymi, który oferuje pełną obsługę typów (INT, DOUBLE, VARCHAR, BOOL)
oraz obsługę wartości NULL. Program umożliwia definiowanie struktur tabel (
CREATE,DROP,ALTER) oraz manipulację rekordami (INSERT,UPDATE,DELETE,SELECT). - Rodzaj translatora: Interpreter.
- Planowany wynik: Funkcjonalny silnik bazodanowy, który parsuje zapytania SQL do drzewa AST, a następnie wykonuje je na autorskiej strukturze danych (klasy Database, Table, Column, Cell). Silnik zapewnia bezpieczeństwo typów, obsługę brakujących danych (NULL) oraz prezentację wyników zapytań wraz z ich filtrowaniem i agregacją.
- Język implementacji: C++.
- Realizacja skanera/parsera: Generatory Flex i Bison.
Poniższa tabela zawiera spis tokenów zdefiniowanych w skanerze lexer.l.
| Kategoria | Tokeny | Opis |
|---|---|---|
| Słowa kluczowe (DML/DDL) | SELECT, FROM, WHERE, CREATE, TABLE, INSERT, INTO, VALUES, UPDATE, DELETE, SET, DROP, COLUMN, ALTER |
Podstawowe komendy zarządzania danymi i strukturą. |
| Logika i Filtrowanie | IN, LIKE, BETWEEN, AND, OR |
Operatory warunkowe używane w klauzuli WHERE. |
| Agregacja i Sortowanie | COUNT, SUM, MIN, MAX, ORDER, BY, ASC, DESC, DISTINCT, LIMIT, OFFSET |
Funkcje obliczeniowe i sterowanie prezentacją danych. |
| Typy Danych | INT, STRING, BOOL, DOUBLE, FLOAT, NULL |
Obsługiwane typy kolumn w komendzie CREATE TABLE. |
| Operatory i Symbole | STAR (*), EQ (=), GT (>), GE (>=), LE (<=), LT (<), LPAREN ('('), RPAREN (')'), COMMA (,), SEMICOLON (;) |
Operatory porównania i znaki interpunkcyjne SQL. |
| Wartości i Nazwy | NUMBER, ID, STR |
Liczby całkowite, identyfikatory (nazwy) oraz napisy w apostrofach. |
Integracja składni SQL z silnikiem bazy danych opiera się na wzorcu AST (Abstract Syntax Tree). Skaner Flex rozpoznaje słowa kluczowe i symbole, przekazując je do parsera Bison, który dopasowuje je do reguł gramatycznych. W momencie rozpoznania poprawnej instrukcji, parser tworzy obiekty klas C++ (np. SelectStmt, InsertStmt), wypełniając je danymi z zapytania. Dzięki temu sprawdzanie składni zapytania jest niezależne od wykonywania operacji na danych (execute())
Pełna gramatyka znajduje się w pliku:
Projekt opiera się na nowoczesnych narzędziach programistycznych i bibliotekach:
-
Flex
Wykorzystywany do generowania skanera (lexer.l), który identyfikuje tokeny SQL (słowa kluczowe, literały, operatory). -
Bison
Generator parserów wykorzystywany do przetwarzania gramatyki (parser.y) i budowania obiektów instrukcji AST.
-
Cereal
Biblioteka header-only służąca do zaawansowanej serializacji binarnej bazy danych do plikudatabase.bin. -
ImGui
Interfejs graficzny wykorzystywany do stworzenia terminala wizualnego, panelu logów, przeglądarki wszystkich tabel w bazie danych oraz wyświetlania tabel z danymi. -
GLFW i OpenGL
Odpowiadają za tworzenie okien, obsługę wejścia (klawiatura/mysz) oraz renderowanie grafiki.
- Wpisuj polecenia SQL bezpośrednio po
SQL>. - Każde polecenie musi kończyć się średnikiem (
;). - Można wpisywać kilka zapytań na raz, jedyny warunek, to że
muszą być oddzielone średnikiem (
;).
show tables– wyświetla listę wszystkich tabel w bazie (ignoruje wielkość liter).exit– bezpiecznie zamyka program.
-
Konsola
Górne okno służy do wpisywania zapytań (obsługuje wiele linii). -
Skrót klawiszowy
UżyjCTRL + ENTER(lubCMD + ENTER), aby szybko wykonać zapytanie lub kliknij przycsikExecute Querypod konsolą główną. -
Przeglądarka schematów
Prawy panel wyświetla aktualne tabele oraz ich kolumny wraz z typami danych, które można rozwijać z zwijać z powrotem. -
Historia
Środkowy panel logów wyświetla historię zapytań z kolorowaniem składni SQL. -
Tabela wyników (panel pod historią logów)
Dolna część interfejsu zawiera tabelę wyników zapytań SQL. Wyświetla ona dane zwrócone przez wykonane zapytanie w formie wierszy i kolumn.
Poniżej znajdują się przykładowe zapytania każdego typu tworzące bazę i manipulujące danymi:
-- 1. Tworzenie tabeli z kompletem typów danych
CREATE TABLE klienci (id INT, imie STRING, nazwisko STRING, miasto STRING, aktywny BOOL);
-- 2. Dodawanie rekordów do bazy
INSERT INTO klienci VALUES (1, 'Jan', 'Kowalski', 'Krakow', 1),
(2, 'Anna', 'Nowak', 'Warszawa', 1),
(3, 'Piotr', 'Zielinski', 'Krakow', 0),
(4, 'Katarzyna', 'Mazurek', 'Poznan', 1),
(5, 'Michal', 'Wisniewski', 'Gdansk', 1),
(6, 'Barbara', 'Wojcik', 'Katowice', 0);
-- 3. Aktualizacja danych
UPDATE klienci SET imie = 'Krzysztof' WHERE id = 1;
-- 4. Zapytanie SELECT z filtrowaniem, sortowaniem i limitami
SELECT imie, nazwisko, miasto FROM klienci
WHERE imie LIKE '%a' AND id BETWEEN 1 AND 4
ORDER BY id DESC LIMIT 1;
-- 5. Usuwanie kolumny z istniejącej tabeli
ALTER TABLE klienci DROP COLUMN aktywny;
-- 6. Dodawanie nowej kolumny (wypełni się domyślnie wartościami NULL)
ALTER TABLE klienci ADD premia NUMERIC;
-- 7. Przypisanie premii wybranym pracownikom przed filtrowaniem NULLi
UPDATE klienci SET premia = 250.50 WHERE id = 2;
UPDATE klienci SET premia = 500.00 WHERE id = 4;
-- 7a. Test filtrowania IS NULL / IS NOT NULL
SELECT imie, nazwisko, premia FROM klienci WHERE premia IS NOT NULL;
-- 8. Usuwanie rekordów z tabeli na podstawie listy miast
DELETE FROM klienci WHERE miasto IN ('Krakow', 'Warszawa', 'Katowice', 'Poznan');
-- 9. Wyświetlenie tego, co zostało w bazie
SELECT * FROM klienci;
-- 10. Czyszczenie bazy - usunięcie tabeli
DROP TABLE klienci;-
Serializacja
Baza danych jest automatycznie zapisywana do pliku binarnegodatabase.binpo każdej udanej operacji modyfikującej (INSERT,UPDATE, itp.). -
Bezpieczeństwo
Silnik sprawdza zgodność typów przy wstawianiu danych oraz weryfikuje istnienie kolumn przed wykonaniem operacjiALTERlubDROP.
To build this project, you need to have the following tools installed:
-
Bison
-
Flex
-
GLFW
sudo apt install bison flex libglfw3-dev # Linux (Debian)brew install bison flex glfw # MacOS
Follow these steps to build and run the application from the root directory.
-
Configure the project
Create a build directory and configure the project using CMake:cmake -S . -B build -
Build the application
Compile the source code:cmake --build build
-
Run the application
After a successful build, run the executable.CLI
./build/sqW # Linux / MacOS.\build\Debug\sqW.exe # Windows
GUI
./build/sqW --gui # Linux / MacOS.\build\Debug\sqW.exe --gui # Windows
The program is licensed under the MIT license. Details in the License file