
# Validarea schemei

Când schemele evoluează între instantanee (se adaugă, elimină sau redenumesc coloane), merql detectează și raportează aceste diferențe. Nepotrivirile dintre scheme nu blochează îmbinarea, dar sunt semnalate pentru ca apelantul să decidă cum să procedeze.

## Detectare

`SchemaValidator::validate()` compară seturile de coloane ale fiecărui tabel din instantaneele base, ours și theirs. Raportează:

- Coloane adăugate în ours (prezente în ours, dar absente din base)
- Coloane eliminate din ours (prezente în base, dar absente din ours)
- Coloane adăugate în theirs
- Coloane eliminate din 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"
    }
}
```

## Ce se detectează

| Modificare | Detectată | Note |
|---|---|---|
| Coloană adăugată | Da | Raportată pentru fiecare parte (ours/theirs) |
| Coloană eliminată | Da | Raportată pentru fiecare parte |
| Tip de coloană schimbat | Nu | Tipurile sunt stocate, dar nu sunt comparate |
| Coloană redenumită | Nu | Apare ca adăugare + eliminare |
| Cheie primară schimbată | Nu | Identitatea este fixată la momentul capturării instantaneului |

## Comportamentul în timpul îmbinării

Când o coloană există într-un instantaneu, dar nu în altul, îmbinarea tratează valoarea coloanei absente ca `null`. Asta înseamnă:

- O coloană adăugată în theirs cu o valoare non-null apare ca `null -> value` (acceptată ca modificare din theirs)
- O coloană eliminată în theirs apare ca având `null` pentru toate rândurile din theirs

Îmbinarea continuă și produce un rezultat. Nepotrivirile dintre scheme sunt informative. Apelantul trebuie să verifice dacă schema bazei de date țintă corespunde datelor îmbinate înainte de aplicare.

## Accesarea nepotrivirilor

Nepotrivirile dintre scheme sunt disponibile atât în `ThreeWayMerge` (prin `schemaMismatches()`), cât și în `MergeResult` (prin `schemaMismatches()` și `hasSchemaMismatches()`). Acestea sunt păstrate prin `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
}
```
