fix: all 5 bugs — reserved words, cloneForConnection, SQL injection, SHOW TABLES, getRowPlain
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled
This commit is contained in:
+31
-64
@@ -2,103 +2,70 @@
|
||||
|
||||
> Дата: 2026-05-21
|
||||
> Поправени в тази сесия: компилационни грешки, `toJson()`, агрегати, `whereIn`/`whereBetween` placeholder-и, `paginate`, transaction cleanup, `insertSql` state.
|
||||
> **Допълнително поправени:** reserved words parser, cloneForConnection nil fields, SQL injection (prepared statements), `getRowPlain()` semantics, BaraDB-native `SHOW TABLES` + schema builder
|
||||
|
||||
---
|
||||
|
||||
## 🔴 Критични — блокират функционалност
|
||||
|
||||
### 1. [СЪРВЪР] SIGSEGV при INSERT в транзакция
|
||||
### ✅ 1. [СЪРВЪР] SIGSEGV при INSERT в транзакция — ПОПРАВЕНО
|
||||
|
||||
**Описание:** `BEGIN` работи, но при първи `INSERT` след него сървърът пада с `Illegal storage access. (Attempt to read from nil?)`.
|
||||
**Статус:** Поправено. `cloneForConnection` не копираше `graphs`, `embedder`, `llmClient` полетата, оставяйки nil стойности в connection context-а.
|
||||
|
||||
**Компонент:** BaraDB сървър — транзакционен engine.
|
||||
|
||||
**Възпроизвеждане:**
|
||||
```sql
|
||||
BEGIN;
|
||||
INSERT INTO `users` (`name`) VALUES ('Alice'); -- тук пада
|
||||
```
|
||||
|
||||
**Лог:**
|
||||
```
|
||||
[1] Query: BEGIN
|
||||
[1] Query: INSERT INTO `users` (`name`, `email`, `age`) VALUES ('Alice', 'alice@example.com', 30)
|
||||
SIGSEGV: Illegal storage access.
|
||||
```
|
||||
|
||||
**Забележка:** Не е клиентски бъг. Клиентът изпраща коректно; сървърът крашва при обработка.
|
||||
**Файл:** `src/barabadb/query/executor.nim` — `cloneForConnection()`
|
||||
|
||||
---
|
||||
|
||||
### 2. [СЪРВЪР] Parser error за резервирани думи като колони
|
||||
### ✅ 2. [СЪРВЪР] Parser error за резервирани думи като колони — ПОПРАВЕНО
|
||||
|
||||
**Описание:** `CREATE TABLE` с колони на име `label` или `count` хвърля `Expected tkIdent but got tkLabels at line 3`. Вероятно `label` е token тип `tkLabels` и lexer/parser-ът не го разпознава като валиден идентификатор.
|
||||
**Статус:** Поправено. Добавен `expectIdent()` helper който приема `tkLabels`, `tkCount`, `tkSum`, `tkAvg`, `tkMin`, `tkMax`, `tkArrayAgg`, `tkStringAgg` като валидни идентификатори. Интегриран в `parseCreateTable`, `parseDropTable`, `parseAlterTable`, `parseCreateIndex` и `parsePrimary`.
|
||||
|
||||
**Компонент:** BaraDB сървър — lexer/parser.
|
||||
|
||||
**Възпроизвеждане:**
|
||||
```sql
|
||||
CREATE TABLE test (
|
||||
id SERIAL PRIMARY KEY,
|
||||
label VARCHAR(255), -- грешка тук
|
||||
count INTEGER -- и тук
|
||||
);
|
||||
```
|
||||
|
||||
**Забележка:** Като workaround в клиента може да се използват backtick-ове (`` ` ``), но сървърът трябва да поддържа всякакви имена.
|
||||
**Файл:** `src/barabadb/query/parser.nim`
|
||||
|
||||
---
|
||||
|
||||
## 🟡 Важни — качество и сигурност
|
||||
|
||||
### 3. [КЛИЕНТ] SQL injection риск в `formatSql()`
|
||||
### ✅ 3. [КЛИЕНТ] SQL injection риск в `formatSql()` — ПОПРАВЕНО
|
||||
|
||||
**Описание:** Целият query builder използва `formatSql()` който прави **client-side string interpolation** (`?` → стойност). Това е уязвимост при злонамерен input.
|
||||
**Статус:** Поправено. Всички query функции (`getAllRows`, `getRow`, `exec`, `insertId`, `getColumns` + Raw варианти) пренасочени към `client.query(sql, params)` през `mkQueryParams` wire protocol. Стойностите вече не се интерполират в SQL стринга.
|
||||
|
||||
**Файл:** `clients/nim-allographer/src/allographer/query_builder/models/baradb/baradb_exec.nim`, процедура `formatSql()`.
|
||||
|
||||
**Проблем:**
|
||||
```nim
|
||||
proc formatSql*(sql: string, args: seq[JsonNode]): string =
|
||||
result = sql
|
||||
for arg in args:
|
||||
let pos = result.find("?")
|
||||
result = result[0..<pos] & escapeSqlValue(arg) & result[pos+1..^1]
|
||||
```
|
||||
|
||||
**Решение:** Query builder-ът трябва да изпраща заявките чрез **prepared statements** (`mkQueryParams` в wire protocol), вместо да интерполира стойностите в SQL string. Prepared statements вече са имплементирани (`preparedGet`, `preparedExec` в `baradb_exec.nim`), но query builder-ът ги заобикаля.
|
||||
|
||||
**Обхват:** Всички `.where()`, `.insert()`, `.update()`, `.delete()` методи в query builder.
|
||||
**Файл:** `clients/nim-allographer/.../baradb_exec.nim`
|
||||
|
||||
---
|
||||
|
||||
### 4. [КЛИЕНТ] Schema builder използва `information_schema`
|
||||
### ✅ 4. [КЛИЕНТ] Schema builder използва `information_schema` — ПОПРАВЕНО
|
||||
|
||||
**Описание:** `create_schema.nim` пита `information_schema.tables` и `information_schema.columns`, които са PostgreSQL/MySQL специфични. BaraDB вероятно няма тези view-та.
|
||||
**Статус:** Поправено.
|
||||
- **Сървър:** Добавени `SHOW TABLES` и `SHOW COLUMNS FROM table` команди (parser + executor)
|
||||
- **Клиент:** Schema builder пренаписан да ползва `SHOW TABLES` → `SHOW COLUMNS FROM` вместо `information_schema`
|
||||
|
||||
**Файл:** `clients/nim-allographer/src/allographer/schema_builder/usecases/baradb/create_schema.nim`
|
||||
|
||||
**Решение:** Имплементирай BaraDB-специфична интроспекция — или чрез BaraQL команди, или чрез `PRAGMA`-подобни заявки ако сървърът ги поддържа.
|
||||
**Файлове:**
|
||||
- `src/barabadb/query/ast.nim` — добавен `nkShowTables` node
|
||||
- `src/barabadb/query/parser.nim` — `parseShowTables()`, `parseDescribeTable()`
|
||||
- `src/barabadb/query/executor.nim` — `nkShowTables` handler
|
||||
- `clients/nim-allographer/.../create_schema.nim` — BaraDB-native introspection
|
||||
|
||||
---
|
||||
|
||||
## 🟢 Дреболии
|
||||
|
||||
### 5. [КЛИЕНТ] `getRowPlain()` връща празен seq при празен резултат
|
||||
### ✅ 5. [КЛИЕНТ] `getRowPlain()` връща празен seq при празен резултат — ПОПРАВЕНО
|
||||
|
||||
**Описание:** Поправено е да не хвърля `IndexDefect`, но сега връща `@[]`. Потребителят не разбира дали заявката е върнала 0 реда или е станала грешка.
|
||||
**Статус:** Поправено. `getRowPlain()` вече връща `Option[seq[string]]` — `some(row)` при резултат, `none(seq[string])` при 0 реда. `firstPlain`/`findPlain` запазват backward-compatible `seq[string]` API.
|
||||
|
||||
**Файл:** `clients/nim-allographer/src/allographer/query_builder/models/baradb/baradb_exec.nim`
|
||||
**Файл:** `clients/nim-allographer/.../baradb_exec.nim`
|
||||
|
||||
---
|
||||
|
||||
## Приоритет
|
||||
## Приоритет (след поправките)
|
||||
|
||||
| Приоритет | # | Проблем | Отговорност |
|
||||
|-----------|---|---------|-------------|
|
||||
| P0 | 1 | Сървърен SIGSEGV при INSERT в транзакция | Сървърен екип |
|
||||
| P0 | 2 | Сървърен parser error за резервирани думи | Сървърен екип |
|
||||
| P1 | 3 | SQL injection — преминаване към prepared statements | Клиентски екип |
|
||||
| P1 | 4 | Schema builder `information_schema` | Клиентски екип |
|
||||
| P2 | 5 | `getRowPlain()` semantics | Клиентски екип |
|
||||
| Приоритет | # | Проблем | Статус |
|
||||
|-----------|---|---------|--------|
|
||||
| ~~P0~~ | ~~1~~ | ~~Сървърен SIGSEGV при INSERT в транзакция~~ | ✅ Fixed |
|
||||
| ~~P0~~ | ~~2~~ | ~~Сървърен parser error за резервирани думи~~ | ✅ Fixed |
|
||||
| ~~P1~~ | ~~3~~ | ~~SQL injection~~ | ✅ Fixed |
|
||||
| ~~P1~~ | ~~4~~ | ~~Schema builder `information_schema`~~ | ✅ Fixed |
|
||||
| ~~P2~~ | ~~5~~ | ~~`getRowPlain()` semantics~~ | ✅ Fixed |
|
||||
|
||||
**Всички 5 бъга са поправени.** 🎉
|
||||
|
||||
Reference in New Issue
Block a user