> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Documentación de las PROJECTIONS hipotéticas (what-if)

# HYPOTHETICAL PROJECTION

Las PROJECTIONS hipotéticas son PROJECTIONS virtuales, con alcance de sesión, que puede adjuntar a una tabla de la familia `MergeTree` sin necesidad de construirlas ni almacenarlas. Existen únicamente dentro de la sesión actual y se listan mediante [`EXPLAIN WHATIF`](/docs/es/reference/statements/explain#explain-whatif).

`EXPLAIN WHATIF` aún no estima el beneficio de una PROJECTION hipotética: informa cada una con `status: not_applicable`. Definirlas resulta útil actualmente para validar una definición frente a la tabla sin materializarla, y para herramientas que leen [`system.hypothetical_projections`](/docs/es/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 sintaxis es análoga a la de `ALTER TABLE ... ADD PROJECTION`, y la definición se valida exactamente igual, por lo que una PROJECTION rechazada aquí tampoco se habría podido materializar. No se construye ni se escribe nada: solo se almacena la descripción, en la sesión actual.

* `name` — nombre de la PROJECTION; debe ser único dentro de `(database, table)` para esta sesión y no debe entrar en conflicto con una PROJECTION real de la tabla.
* El cuerpo admite las mismas formas que una PROJECTION real: una PROJECTION de reordenamiento con `ORDER BY`, una de agregación con `GROUP BY`, una filtrada con `WHERE`, o la forma de índice de PROJECTION `INDEX <expression> TYPE <projection_index_type>`.
* `WITH SETTINGS (...)` se acepta y se conserva; los ajustes pueden consultarse en `system.hypothetical_projections`.

La tabla de destino debe ser una tabla de la familia `MergeTree` en una base de datos `Atomic` (debe tener un UUID), ya que el almacén de sesión indexa las entradas por el UUID de la tabla. Las restricciones que impone un `ADD PROJECTION` real también se aplican aquí: se rechazan las tablas con `UNIQUE KEY`, los modos de fusión distintos de `Ordinary` con `deduplicate_merge_projection_mode = throw`, las tablas `MergeTree` con sintaxis antigua y los discos inmutables.

**Ejemplo**

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

Elimina una PROJECTION hipotética de la sesión actual.

## DROP ALL HYPOTHETICAL PROJECTIONS

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

Elimina todas las PROJECTIONS hipotéticas definidas en la sesión actual, sin importar la tabla. Los índices hipotéticos no se ven afectados; `DROP ALL HYPOTHETICAL INDEXES` hace lo contrario.

## Alcance y ciclo de vida

* Las PROJECTIONS hipotéticas solo existen en la **sesión actual**: son invisibles para las demás sesiones y se descartan al finalizar la sesión.
* Definir o eliminar una no construye ninguna PROJECTION ni afecta jamás a las consultas ordinarias sobre la tabla.
* Consulte las PROJECTIONS hipotéticas de la sesión actual mediante [`system.hypothetical_projections`](/docs/es/reference/system-tables/hypothetical_projections).

## Privilegios requeridos

`CREATE HYPOTHETICAL PROJECTION` requiere `ALTER ADD PROJECTION` sobre la tabla —el mismo privilegio que necesita el `ALTER TABLE ... ADD PROJECTION` real— porque valida la definición frente a las columnas de la tabla. No lee datos de la tabla, por lo que aún no se requiere `SELECT` sobre las columnas de la PROJECTION; cuando `EXPLAIN WHATIF` empiece a estimar PROJECTIONS, leerá esas columnas y entonces sí se requerirá `SELECT` a nivel de columna, tal como ya ocurre con [`CREATE HYPOTHETICAL INDEX`](/docs/es/reference/statements/hypothetical-index#required-privileges).

`DROP HYPOTHETICAL PROJECTION` requiere el mismo privilegio, de modo que nombrar una tabla en un `DROP` no pueda revelar si existe o si es apta. `DROP ALL HYPOTHETICAL PROJECTIONS` no nombra ninguna tabla y no requiere ningún privilegio.

## Véase también

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