
# Convalida dello schema

Quando gli schemi evolvono tra snapshot (con colonne aggiunte, rimosse o rinominate), merql rileva e segnala queste differenze. Le discrepanze di schema non bloccano la fusione, ma vengono mostrate così che il chiamante possa decidere come procedere.

## Rilevamento

`SchemaValidator::validate()` confronta gli insiemi di colonne di ogni tabella negli snapshot base, ours e theirs. Segnala:

- Colonne aggiunte in ours (presenti in ours ma non in base)
- Colonne rimosse in ours (presenti in base ma non in ours)
- Colonne aggiunte in theirs
- Colonne rimosse in 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"
    }
}
```

## Elementi rilevati

| Modifica | Rilevata | Note |
|---|---|---|
| Colonna aggiunta | Sì | Segnalata per lato (ours/theirs) |
| Colonna rimossa | Sì | Segnalata per lato |
| Tipo di colonna modificato | No | I tipi vengono salvati ma non confrontati |
| Colonna rinominata | No | Appare come aggiunta e rimozione |
| Chiave primaria modificata | No | L'identità è fissata al momento dello snapshot |

## Comportamento durante la fusione

Quando una colonna è presente in uno snapshot ma non in un altro, la fusione considera il valore della colonna mancante come `null`. Questo significa che:

- Una colonna aggiunta in theirs con un valore non nullo appare come `null -> value` (accettata come modifica di theirs)
- Una colonna rimossa in theirs appare come se avesse `null` per tutte le righe in theirs

La fusione prosegue e produce un risultato. Le discrepanze di schema sono informative. Il chiamante dovrebbe verificare che lo schema del database di destinazione corrisponda ai dati risultanti dalla fusione prima di applicarli.

## Accesso alle discrepanze

Le discrepanze di schema sono disponibili sia su `ThreeWayMerge` (tramite `schemaMismatches()`) sia su `MergeResult` (tramite `schemaMismatches()` e `hasSchemaMismatches()`). Vengono mantenute attraverso `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
}
```
