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

# ajustes de sesión de analyzer_compatibility_*

> Ajustes de sesión de ClickHouse en el grupo generado analyzer_compatibility_*.

export const VersionHistory = ({rows = []}) => {
  if (rows.length === 0) {
    return null;
  }
  const headers = ["Versión", "Valor predeterminado", "Comentario"];
  const border = "1px solid rgba(128, 128, 128, 0.3)";
  const cell = {
    border,
    padding: "0.25rem 0.5rem",
    textAlign: "start",
    verticalAlign: "top"
  };
  return <details className="not-prose" style={{
    border,
    borderRadius: "0.5rem",
    margin: "0.5rem 0",
    padding: "0.5rem 0.75rem",
    fontSize: "0.8125rem",
    lineHeight: "1.125rem"
  }}>
      <summary style={{
    cursor: "pointer",
    fontWeight: 600,
    opacity: 0.72
  }}>
        Historial de versiones
      </summary>
      <table style={{
    borderCollapse: "collapse",
    width: "100%",
    margin: "0.5rem 0 0"
  }}>
        <thead>
          <tr>
            {headers.map(header => <th key={header} style={{
    ...cell,
    fontWeight: 600,
    opacity: 0.72
  }}>
                {header}
              </th>)}
          </tr>
        </thead>
        <tbody>
          {rows.map((row, row_index) => <tr key={row.id ?? row_index}>
              {(row.items ?? []).map((item, item_index) => <td key={item_index} style={{
    ...cell,
    overflowWrap: "anywhere"
  }}>
                  {item?.label}
                </td>)}
            </tr>)}
        </tbody>
      </table>
    </details>;
};

export const SettingsInfoBlock = ({type, default_value, changeable_without_restart}) => {
  return <div className="not-prose" style={{
    display: "flex",
    flexWrap: "wrap",
    alignItems: "baseline",
    columnGap: "0.5rem",
    rowGap: "0.125rem",
    margin: "0.375rem 0",
    fontSize: "0.8125rem",
    lineHeight: "1.125rem"
  }}>
      <div style={{
    fontWeight: 600,
    opacity: 0.72
  }}>Tipo</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{type}</div>
      <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>Predeterminado</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{default_value}</div>
      {changeable_without_restart && <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>
          Modificable sin reiniciar
        </div>}
      {changeable_without_restart && <div style={{
    overflowWrap: "anywhere"
  }}>
          {changeable_without_restart}
        </div>}
    </div>;
};

Esta configuración está disponible en [system.settings](/es/reference/system-tables/settings) y se genera automáticamente a partir del [código fuente](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Settings.cpp).

<div id="analyzer_compatibility_allow_compound_identifiers_in_unflatten_nested">
  ## analyzer\_compatibility\_allow\_compound\_identifiers\_in\_unflatten\_nested
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.8"},{"label": "1"},{"label": "Nueva configuración."}]}]} />

Permite añadir identificadores compuestos a Nested. Esta es una configuración de compatibilidad porque cambia el resultado de la consulta. Cuando está deshabilitada, `SELECT a.b.c FROM table ARRAY JOIN a` no funciona, y `SELECT a FROM table` no incluye la columna `a.b.c` en el resultado de `Nested a`.

<div id="analyzer_compatibility_allow_non_aggregate_in_having">
  ## analyzer\_compatibility\_allow\_non\_aggregate\_in\_having
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.7"},{"label": "0"},{"label": "Nueva configuración de compatibilidad. Cuando está habilitada, el analizador imita la reescritura legacy de `HAVING` a `WHERE` para conjunciones no agregadas con AND, en lugar de generar `NOT_AN_AGGREGATE`."}]}]} />

Cuando está habilitada, el analizador imita el comportamiento legacy de mover de `HAVING` a `WHERE` las conjunciones no agregadas con AND, en lugar de generar `NOT_AN_AGGREGATE`. El rechazo conforme al estándar es el comportamiento predeterminado; esta opción sirve como ayuda para la migración de consultas que el analizador anterior (`enable_analyzer = 0`) aceptaba silenciosamente. Las conjunciones que contienen funciones de agregación, `grouping` o funciones no deterministas permanecen en `HAVING`. Si alguna conjunción contiene una función de ventana o una función con estado (por ejemplo, `rowNumberInBlock`), la reescritura se desactiva para todo el `HAVING`, en consonancia con el comportamiento legacy de `PredicateExpressionsOptimizer`. La configuración también se ignora cuando `GROUP BY` usa `WITH CUBE`, `WITH ROLLUP`, `WITH TOTALS` o `GROUPING SETS`.

<div id="analyzer_compatibility_apply_final_to_all_joined_tables">
  ## analyzer\_compatibility\_apply\_final\_to\_all\_joined\_tables
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.8"},{"label": "0"},{"label": "Nueva configuración en master (el valor predeterminado false corresponde al comportamiento corregido). El cambio de comportamiento se registra en la 26.6 y la introducción para backports a ramas de lanzamiento anteriores (con el valor predeterminado true), en la 26.4."}]}, {"id": "row-2","items": [{"label": "26.6"},{"label": "0"},{"label": "Se corrigió un bug en el analizador por el que FINAL en la tabla más a la izquierda de un JOIN también se aplicaba incorrectamente a las demás tablas unidas. previous_value=true, por lo que `compatibility` con versiones anteriores a la 26.6 restaura el comportamiento anterior."}]}, {"id": "row-3","items": [{"label": "26.4"},{"label": "1"},{"label": "Nueva configuración de compatibilidad que controla si FINAL en la tabla más a la izquierda de un JOIN se aplica a las demás tablas unidas. Se introdujo con el valor predeterminado true (el comportamiento anterior) para backports a versiones anteriores a la 26.6."}]}]} />

Restaura el comportamiento de las versiones anteriores a la 26.6, en las que el modificador `FINAL` especificado en la tabla más a la izquierda de un JOIN también se aplicaba incorrectamente a todas las demás tablas unidas (en motores compatibles con `FINAL`, como `ReplacingMergeTree`). De forma predeterminada, `FINAL` se aplica únicamente a la tabla en la que se especifica. Habilite esta opción para mantener la compatibilidad con consultas que dependan del comportamiento anterior; la corrección recomendada es escribir `FINAL` explícitamente en cada tabla que lo necesite.

Valores posibles:

* 0 - `FINAL` se aplica únicamente a la tabla en la que se especifica.
* 1 - `FINAL` en la tabla más a la izquierda de un JOIN se aplica a todas las tablas unidas.

<div id="analyzer_compatibility_join_using_top_level_identifier">
  ## analyzer\_compatibility\_join\_using\_top\_level\_identifier
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.3"},{"label": "0"},{"label": "Obliga a resolver el identificador en JOIN USING a partir de la proyección"}]}]} />

Obliga a resolver el identificador en JOIN USING a partir de la proyección (por ejemplo, en `SELECT a + 1 AS b FROM t1 JOIN t2 USING (b)`, el JOIN se realizará mediante `t1.a + 1 = t2.b`, en lugar de `t1.b = t2.b`). También se tienen en cuenta los alias definidos en subexpresiones dentro de la lista SELECT (por ejemplo, en `SELECT uniqExact(a + 1 AS b) FROM t1 JOIN t2 USING (b)`, el JOIN se realiza mediante `t1.a + 1 = t2.b`). Cuando el alias coincidente se define en una subexpresión dentro de la lista SELECT en lugar de como alias de nivel superior, las réplicas paralelas se deshabilitan para la consulta. En las consultas enviadas a servidores remotos (tablas `Distributed`, función de tabla `remote`), la consulta se rechaza con una excepción solo cuando el identificador no se puede resolver en absoluto en el servidor remoto; si el alias oculta una columna real de la tabla izquierda, el servidor remoto realiza el JOIN usando esa columna, por lo que los resultados pueden diferir de la ejecución local.

<div id="analyzer_compatibility_multiple_joins_qualify_column_names">
  ## analyzer\_compatibility\_multiple\_joins\_qualify\_column\_names
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.8"},{"label": "0"},{"label": "Nueva configuración de compatibilidad. Cuando está habilitada, el analizador reproduce los nombres cualificados de las columnas de resultado del analizador anterior para las consultas cuya cláusula FROM contiene dos o más JOIN."}]}]} />

Cuando está habilitada y la cláusula `FROM` de una consulta contiene dos o más `JOIN` (se cuentan las tablas separadas por comas; `ARRAY JOIN` no), el analizador asigna nombres a las columnas de resultado como lo hacía la reescritura para múltiples joins del analizador anterior:

* las columnas generadas al expandir `*`, `<table>.*` o `COLUMNS('<regexp>')` reciben nombres con la forma `<alias-or-table>.<column>` (el calificador es el alias de la expresión de tabla, si lo tiene; de lo contrario, el nombre de la tabla sin la base de datos; de lo contrario, el nombre de la CTE; las columnas de una subconsulta unida sin alias se dejan sin calificar). Dos tipos de columnas conservan su nombre sin calificar porque pertenecen al join y no a una única expresión de tabla: una columna generada por `ARRAY JOIN` y una clave fusionada mediante `JOIN ... USING`. Por tanto, las referencias externas como `SELECT ll.arr` o `SELECT ll.k` no se resuelven en esos dos casos;
* la forma de lista de identificadores `COLUMNS(col1, col2)` no es una expansión de patrones: cada columna conserva el nombre exactamente como se escribió su identificador, por lo que `COLUMNS(x)` produce `x` y `COLUMNS(a.x)` produce `a.x`;
* una referencia de columna sin alias en la lista `SELECT` conserva su nombre exactamente como se escribió (por ejemplo, `SELECT a.x` produce una columna llamada `a.x` incluso cuando `x` es inequívoca).

Esto permite que funcionen las consultas externas que hacen referencia a dichas columnas mediante sus nombres cualificados, por ejemplo:

```sql theme={null}
SELECT ll.Date FROM (SELECT * FROM t AS ll LEFT JOIN t1 ON ll.k = t1.k LEFT JOIN t2 ON ll.k = t2.k);
```

Solo surte efecto cuando el analizador está habilitado (`enable_analyzer = 1`).

<div id="analyzer_compatibility_prefer_alias_over_subcolumn">
  ## analyzer\_compatibility\_prefer\_alias\_over\_subcolumn
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.6"},{"label": "0"},{"label": "Nueva configuración de compatibilidad"}]}]} />

Cuando un identificador de varias partes como `b.id` podría referirse tanto a la columna `id` de una tabla con alias `b` como a una subcolumna `b.id` de tipo Tuple de alguna otra columna, se prefiere la interpretación con prefijo de alias (la columna `id` de `b`). De forma predeterminada, el analizador prefiere la subcolumna. Actívalo para que coincida con la resolución del analizador anterior.
