
# Validasi Skema

Saat skema berubah antar snapshot (kolom ditambahkan, dihapus, atau diganti namanya), merql mendeteksi dan melaporkan perbedaan tersebut. Ketidakcocokan skema tidak menghalangi merge, tetapi ditampilkan agar pemanggil dapat menentukan langkah selanjutnya.

## Deteksi

`SchemaValidator::validate()` membandingkan kumpulan kolom setiap tabel di seluruh snapshot base, sisi kita, dan sisi mereka. Laporan mencakup:

- Kolom yang ditambahkan di sisi kita (ada di sisi kita tetapi tidak di base)
- Kolom yang dihapus di sisi kita (ada di base tetapi tidak di sisi kita)
- Kolom yang ditambahkan di sisi mereka
- Kolom yang dihapus di sisi mereka

```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"
    }
}
```

## Hal yang dideteksi

| Perubahan | Terdeteksi | Catatan |
|---|---|---|
| Kolom ditambahkan | Ya | Dilaporkan per sisi (kita/mereka) |
| Kolom dihapus | Ya | Dilaporkan per sisi |
| Tipe kolom berubah | Tidak | Tipe disimpan tetapi tidak dibandingkan |
| Nama kolom berubah | Tidak | Ditampilkan sebagai penambahan + penghapusan |
| Kunci utama berubah | Tidak | Identitas ditetapkan pada waktu snapshot |

## Perilaku selama merge

Jika sebuah kolom ada dalam satu snapshot tetapi tidak ada di snapshot lain, merge memperlakukan nilai kolom yang hilang sebagai `null`. Artinya:

- Kolom yang ditambahkan di sisi mereka dengan nilai non-null akan muncul sebagai `null -> value` (diterima sebagai perubahan dari sisi mereka)
- Kolom yang dihapus di sisi mereka dianggap memiliki `null` untuk semua baris di sisi mereka

Merge tetap berjalan dan menghasilkan keluaran. Ketidakcocokan skema hanya bersifat informatif. Pemanggil sebaiknya memastikan skema basis data target sesuai dengan data hasil merge sebelum menerapkannya.

## Mengakses ketidakcocokan

Ketidakcocokan skema tersedia pada `ThreeWayMerge` (melalui `schemaMismatches()`) dan pada `MergeResult` (melalui `schemaMismatches()` dan `hasSchemaMismatches()`). Ketidakcocokan tersebut dipertahankan melalui `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
}
```
