
# Walidacja schematu

Gdy schematy zmieniają się między migawkami (dodawane, usuwane lub zmieniane są nazwy kolumn), merql wykrywa te różnice i je zgłasza. Niezgodności schematów nie blokują scalania, ale są sygnalizowane, aby wywołujący mógł zdecydować, jak postąpić.

## Wykrywanie

`SchemaValidator::validate()` porównuje zestawy kolumn każdej tabeli w migawkach base, ours i theirs. Zgłasza:

- Kolumny dodane w ours (obecne w ours, ale nie w base)
- Kolumny usunięte w ours (obecne w base, ale nie w ours)
- Kolumny dodane w theirs
- Kolumny usunięte w 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"
    }
}
```

## Wykrywane zmiany

| Zmiana | Wykrywana | Uwagi |
|---|---|---|
| Dodana kolumna | Tak | Zgłaszana osobno dla każdej strony (ours/theirs) |
| Usunięta kolumna | Tak | Zgłaszana osobno dla każdej strony |
| Zmieniony typ kolumny | Nie | Typy są zapisywane, ale nie są porównywane |
| Zmieniona nazwa kolumny | Nie | Jest wykrywana jako dodanie i usunięcie |
| Zmieniony klucz główny | Nie | Tożsamość jest ustalana w chwili tworzenia migawki |

## Zachowanie podczas scalania

Gdy kolumna występuje w jednej migawce, ale nie w innej, brakującą wartość kolumny podczas scalania traktuje się jako `null`. Oznacza to, że:

- Kolumna dodana w theirs z wartością różną od null jest traktowana jako `null -> value` (zmiana theirs zostaje zaakceptowana)
- Kolumna usunięta w theirs jest traktowana tak, jakby miała wartość `null` we wszystkich wierszach theirs

Scalanie jest kontynuowane i zwraca wynik. Niezgodności schematów mają charakter informacyjny. Przed zastosowaniem zmian wywołujący powinien sprawdzić, czy schemat docelowej bazy danych odpowiada scalonym danym.

## Dostęp do informacji o niezgodnościach

Niezgodności schematów są dostępne zarówno w `ThreeWayMerge` (przez `schemaMismatches()`), jak i w `MergeResult` (przez `schemaMismatches()` i `hasSchemaMismatches()`). Są zachowywane przez `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
}
```
