> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-vortex-format.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Documentation sur les projections hypothétiques (what-if)

# HYPOTHETICAL PROJECTION

Les projections hypothétiques sont des projections virtuelles, dont la portée est limitée à la session, que vous pouvez attacher à une table de la famille `MergeTree` sans réellement les construire ni les stocker. Elles n'existent qu'au sein de la session en cours et sont répertoriées par [`EXPLAIN WHATIF`](/fr/reference/statements/explain#explain-whatif).

`EXPLAIN WHATIF` n'estime pas encore le bénéfice d'une projection hypothétique : il les signale toutes avec `status: not_applicable`. Les définir présente aujourd'hui un intérêt pour valider une définition sur la table sans la matérialiser, ainsi que pour les outils qui lisent [`system.hypothetical_projections`](/fr/reference/system-tables/hypothetical_projections).

## CREATE HYPOTHETICAL PROJECTION

```sql theme={null}
CREATE HYPOTHETICAL PROJECTION [IF NOT EXISTS] name
    ON [db.]table_name (SELECT <columns> [WHERE ...] [GROUP BY ...] [ORDER BY ...]) [WITH SETTINGS (...)]

CREATE HYPOTHETICAL PROJECTION [IF NOT EXISTS] name
    ON [db.]table_name INDEX <expression> TYPE <projection_index_type> [WITH SETTINGS (...)]
```

La syntaxe reprend celle de `ALTER TABLE ... ADD PROJECTION`, et la définition est validée exactement de la même manière : une projection rejetée ici n'aurait de toute façon pas pu être matérialisée. Rien n'est construit ni écrit — seule la description est stockée, dans la session en cours.

* `name` — nom de la projection ; il doit être unique au sein de `(database, table)` pour cette session et ne doit pas entrer en conflit avec une projection réelle de la table.
* Le body accepte les mêmes formes qu'une projection réelle : une projection de réordonnancement avec `ORDER BY`, une projection d'agrégation avec `GROUP BY`, une projection filtrée avec `WHERE`, ou la forme d'index de projection `INDEX <expression> TYPE <projection_index_type>`.
* `WITH SETTINGS (...)` est accepté et conservé ; les paramètres sont visibles dans `system.hypothetical_projections`.

La table cible doit être une table de la famille `MergeTree` dans une base de données `Atomic` (elle doit posséder un UUID), car le stockage de session indexe les entrées par UUID de table. Les restrictions imposées par un véritable `ADD PROJECTION` s'appliquent également ici : les tables avec `UNIQUE KEY`, les modes de merging non-`Ordinary` sous `deduplicate_merge_projection_mode = throw`, les `MergeTree` en ancienne syntaxe et les disques immuables sont rejetés.

**Exemple**

```sql theme={null}
CREATE HYPOTHETICAL PROJECTION p_by_b ON t (SELECT a, b ORDER BY b);
CREATE HYPOTHETICAL PROJECTION p_idx ON t INDEX b TYPE basic;
```

## DROP HYPOTHETICAL PROJECTION

```sql theme={null}
DROP HYPOTHETICAL PROJECTION [IF EXISTS] name ON [db.]table_name
```

Supprime une projection hypothétique de la session en cours.

## DROP ALL HYPOTHETICAL PROJECTIONS

```sql theme={null}
DROP ALL HYPOTHETICAL PROJECTIONS
```

Supprime toutes les projections hypothétiques définies dans la session en cours, quelle que soit la table. Les index hypothétiques ne sont pas affectés ; `DROP ALL HYPOTHETICAL INDEXES` fait l'inverse.

## Portée et durée de vie

* Les projections hypothétiques n'existent que dans la **session en cours** : elles sont invisibles pour les autres sessions et supprimées à la fin de celle-ci.
* Le fait d'en définir une ou d'en supprimer une ne construit aucune projection et n'affecte jamais les requêtes ordinaires sur la table.
* Consultez les projections hypothétiques de la session en cours via [`system.hypothetical_projections`](/fr/reference/system-tables/hypothetical_projections).

## Privilèges requis

`CREATE HYPOTHETICAL PROJECTION` nécessite le privilège `ALTER ADD PROJECTION` sur la table — le même privilège que celui exigé par la véritable instruction `ALTER TABLE ... ADD PROJECTION` — car la définition est validée par rapport aux colonnes de la table. Aucune donnée de la table n'est lue, si bien que le privilège `SELECT` sur les colonnes de la projection n'est pas encore nécessaire ; lorsque `EXPLAIN WHATIF` commencera à estimer les projections, il lira ces colonnes et le privilège `SELECT` au niveau des colonnes sera alors requis, comme c'est déjà le cas pour [`CREATE HYPOTHETICAL INDEX`](/fr/reference/statements/hypothetical-index#required-privileges).

`DROP HYPOTHETICAL PROJECTION` exige le même privilège, afin que le fait de nommer une table dans une suppression ne puisse pas révéler si celle-ci existe ou si elle est éligible. `DROP ALL HYPOTHETICAL PROJECTIONS` ne nomme aucune table et ne nécessite aucun privilège.

## Voir aussi

* [`CREATE HYPOTHETICAL INDEX`](/fr/reference/statements/hypothetical-index)
* [`EXPLAIN WHATIF`](/fr/reference/statements/explain#explain-whatif)
* [`system.hypothetical_projections`](/fr/reference/system-tables/hypothetical_projections)
* [Projections](/fr/reference/engines/table-engines/mergetree-family/mergetree#projections)
