
# Prévia da execução de teste

`DryRun::generate()` gera instruções SQL legíveis por humanos, com os valores interpolados diretamente. Use-o para revisar o que uma mesclagem faria antes de aplicá-la ao banco de dados.

```php
use Merql\Apply\DryRun;

$statements = DryRun::generate($result);

foreach ($statements as $sql) {
    echo "{$sql};\n";
}
```

A prévia contém uma instrução para cada operação no resultado, agrupadas da mesma forma que `Applier` as agrupa: inserções, depois atualizações e, por fim, exclusões. No resultado completo de uma mesclagem, isso inclui todas as alterações de ambos os lados em relação à base, que é o que `Merql::apply()` executaria em um banco de dados que ainda contém a base. Visualize um [resultado selecionado](https://merql.inline0.dev/pt/docs/merge/plans) para ver apenas as instruções das operações que você pretende aplicar.

## Exemplo de saída

```sql
INSERT INTO `posts` (`id`, `title`, `content`, `status`) VALUES ('42', 'New Post', 'Body text', 'draft');
UPDATE `posts` SET `title` = 'Updated Title', `status` = 'publish' WHERE `id` = '42';
DELETE FROM `posts` WHERE `id` = '99';
```

As atualizações definem todas as colunas que a operação contém, exceto as colunas de identidade, e não apenas as alteradas. Uma atualização que não definiria nenhuma coluna é omitida.

## Formatação de valores

Todos os valores são envolvidos por aspas simples. Os caracteres especiais são escapados para exibição segura:

| Caractere | Escapado como |
|---|---|
| `\` (barra invertida) | `\\` |
| `'` (aspas simples) | `''` |
| `\0` (byte nulo) | `\0` |
| `\n` (nova linha) | `\n` |
| `\r` (retorno de carro) | `\r` |

Valores NULL são exibidos como o literal sem aspas `NULL`:

```sql
UPDATE `posts` SET `subtitle` = NULL WHERE `id` = '42';
```

## Parâmetros

`DryRun::generate()` aceita os mesmos parâmetros que `SqlGenerator::generate()`:

```php
$statements = DryRun::generate(
    $result,
    base: $baseSnapshot,
    fkDependencies: ['comments' => ['posts']],
    driver: new SqliteDriver(),
);
```

| Parâmetro | Tipo | Descrição |
|---|---|---|
| `$result` | `MergeResult` | O resultado da mesclagem a visualizar. |
| `$base` | `?Snapshot` | Snapshot base para colunas de identidade. Usa `$result->baseSnapshot()` como alternativa. |
| `$fkDependencies` | `array` | Mapa de dependências de chaves estrangeiras para ordenação. |
| `$driver` | `?Driver` | Driver do banco de dados para delimitar identificadores. |

## Execução de teste vs. SqlGenerator

`DryRun` envolve `SqlGenerator`. A diferença:

- `SqlGenerator::generate()` retorna arrays `['sql' => '...', 'params' => [...]]` destinados à execução por prepared statements do adaptador.
- `DryRun::generate()` retorna strings simples com valores inseridos diretamente, destinadas à leitura humana.

Não execute a saída da execução de teste como SQL. Ela é formatada para exibição, não para execução segura. Para executar mesclagens, use `Applier` ou `SqlGenerator` diretamente com prepared statements.

## Usando com a fachada

Pela fachada, capture um resultado da mesclagem e visualize-o:

```php
use Merql\Merql;
use Merql\Apply\DryRun;

$result = Merql::merge('base', 'ours', 'theirs');

$statements = DryRun::generate($result);

foreach ($statements as $sql) {
    echo "{$sql};\n";
}
```

Ou de CLI com a opção `--dry-run`:

```bash
vendor/bin/merql merge base ours theirs --dry-run
```

O CLI imprime as instruções sem ordenação por chave estrangeira nem driver, então
os identificadores usam aspas invertidas por padrão, independentemente do banco de dados. Ele passa
o snapshot base para colunas de identidade. Sua mesclagem é no nível da coluna, como
`Merql::merge()`.
