
# Ověření schématu

Když se schémata mezi snímky vyvíjejí (přidávají, odebírají nebo přejmenovávají se sloupce), merql tyto rozdíly zjistí a oznámí. Neshody ve schématu neblokují sloučení, ale systém je zobrazí, aby volající mohl rozhodnout, jak pokračovat.

## Zjišťování

`SchemaValidator::validate()` porovnává sady sloupců jednotlivých tabulek napříč snímky base, ours a theirs. Oznamuje:

- Sloupce přidané v ours (jsou v ours, ale ne v base)
- Sloupce odebrané v ours (jsou v base, ale ne v ours)
- Sloupce přidané v theirs
- Sloupce odebrané v theirs

```php
use Merql\Merge\ThreeWayMerge;

$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);

if ($result->hasSchemaMismatches()) {
    foreach ($result->schemaMismatches() as $mismatch) {
        echo $mismatch->getMessage() . "\n";
        // "Schema mismatch on table 'posts': columns added in theirs: subtitle"
    }
}
```

## Co se zjišťuje

| Změna | Zjištěna | Poznámky |
|---|---|---|
| Přidaný sloupec | Ano | Hlásí se pro každou stranu (ours/theirs) |
| Odebraný sloupec | Ano | Hlásí se pro každou stranu |
| Změněný typ sloupce | Ne | Typy se ukládají, ale neporovnávají |
| Přejmenovaný sloupec | Ne | Zobrazí se jako přidání a odebrání |
| Změněný primární klíč | Ne | Identita se při pořizování snímku nemění |

## Chování při sloučení

Pokud sloupec existuje v jednom snímku, ale v jiném chybí, sloučení považuje chybějící hodnotu sloupce za `null`. To znamená:

- Přidaný sloupec v theirs s hodnotou jinou než null se zobrazí jako `null -> value` (změna theirs je přijata)
- Odebraný sloupec v theirs se zobrazí, jako by měl hodnotu `null` ve všech řádcích theirs

Sloučení pokračuje a vytvoří výsledek. Neshody ve schématu jsou pouze informativní. Volající by měl před použitím ověřit, že schéma cílové databáze odpovídá sloučeným datům.

## Přístup k neshodám

Neshody ve schématu jsou dostupné v `ThreeWayMerge` (přes `schemaMismatches()`) i v `MergeResult` (přes `schemaMismatches()` a `hasSchemaMismatches()`). Zachovají se také prostřednictvím `ConflictResolver::resolve()`.

```php
// On the merge result directly
$result->hasSchemaMismatches(); // bool
$result->schemaMismatches();    // list<SchemaException>

// Each mismatch is a SchemaException with a descriptive message
foreach ($result->schemaMismatches() as $e) {
    // $e->getMessage() includes table name and column details
}
```
