> ## 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.

# paramètres de session analyzer_compatibility_*

> Paramètres de session ClickHouse du groupe généré analyzer_compatibility_*.

export const VersionHistory = ({rows = []}) => {
  if (rows.length === 0) {
    return null;
  }
  const headers = ["Version", "Valeur par défaut", "Commentaire"];
  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
  }}>
        Historique des versions
      </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
  }}>Type</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{type}</div>
      <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>Par défaut</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{default_value}</div>
      {changeable_without_restart && <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>
          Modifiable sans redémarrage
        </div>}
      {changeable_without_restart && <div style={{
    overflowWrap: "anywhere"
  }}>
          {changeable_without_restart}
        </div>}
    </div>;
};

Ces paramètres sont disponibles dans [system.settings](/fr/reference/system-tables/settings) et sont générés automatiquement à partir du [source](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": "Nouveau paramètre."}]}]} />

Permet d'ajouter des identifiants composés à Nested. Il s'agit d'un paramètre de compatibilité, car il modifie le résultat de la requête. Lorsqu'il est désactivé, `SELECT a.b.c FROM table ARRAY JOIN a` ne fonctionne pas, et `SELECT a FROM table` n'inclut pas la colonne `a.b.c` dans le résultat `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": "Nouveau paramètre de compatibilité. Lorsqu'il est activé, l'analyseur reproduit la réécriture legacy de `HAVING` vers `WHERE` pour les AND-conjuncts non agrégés au lieu de lever `NOT_AN_AGGREGATE`."}]}]} />

Lorsqu'il est activé, l'analyseur reproduit le comportement legacy qui consiste à déplacer les AND-conjuncts non agrégés de `HAVING` vers `WHERE` au lieu de lever `NOT_AN_AGGREGATE`. Le rejet conforme à la norme est le comportement par défaut ; il s'agit d'une aide à la migration pour les requêtes qui étaient acceptées silencieusement par l'ancien analyseur (`enable_analyzer = 0`). Les conjuncts contenant des fonctions d'agrégation, `grouping` ou des fonctions non déterministes restent dans `HAVING`. Si un conjunct contient une window function ou une fonction avec état (par exemple `rowNumberInBlock`), la réécriture est désactivée pour l'ensemble de `HAVING`, conformément au comportement legacy de `PredicateExpressionsOptimizer`. Le paramètre est également ignoré lorsque `GROUP BY` utilise `WITH CUBE`, `WITH ROLLUP`, `WITH TOTALS` ou `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": "Nouveau paramètre sur master (false par défaut = comportement corrigé). Le changement de comportement est lui-même enregistré en 26.6, et l’ajout destiné aux rétroportages vers d’anciennes branches de publication (avec true par défaut) en 26.4."}]}, {"id": "row-2","items": [{"label": "26.6"},{"label": "0"},{"label": "Correction d’un bogue dans l’analyseur : FINAL sur la table la plus à gauche d’un JOIN était également appliqué de manière incorrecte aux autres tables jointes. previous_value=true permet à `compatibility` avec des versions antérieures à 26.6 de restaurer l’ancien comportement."}]}, {"id": "row-3","items": [{"label": "26.4"},{"label": "1"},{"label": "Nouveau paramètre de compatibilité contrôlant si FINAL sur la table la plus à gauche d’un JOIN est appliqué aux autres tables jointes. Introduit avec true par défaut (l’ancien comportement) pour les rétroportages vers des versions antérieures à 26.6."}]}]} />

Restaure le comportement des versions antérieures à 26.6, dans lesquelles le modificateur `FINAL` spécifié sur la table la plus à gauche d’un JOIN était également appliqué de manière incorrecte à toutes les autres tables jointes (pour les moteurs prenant en charge `FINAL`, par exemple `ReplacingMergeTree`). Par défaut, `FINAL` s’applique uniquement à la table sur laquelle il est indiqué. Activez ce paramètre pour assurer la compatibilité avec les requêtes reposant sur l’ancien comportement ; la correction recommandée consiste à indiquer explicitement `FINAL` sur chaque table qui en a besoin.

Valeurs possibles :

* 0 - `FINAL` s’applique uniquement à la table sur laquelle il est indiqué.
* 1 - `FINAL` sur la table la plus à gauche d’un JOIN est appliqué à toutes les tables jointes.

<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": "Forcer la résolution de l’identifiant dans JOIN USING depuis la projection"}]}]} />

Forcer la résolution de l’identifiant dans JOIN USING depuis la projection (par exemple, dans `SELECT a + 1 AS b FROM t1 JOIN t2 USING (b)`, la jointure sera effectuée sur `t1.a + 1 = t2.b`, plutôt que sur `t1.b = t2.b`). Les alias définis sur des sous-expressions dans la liste SELECT sont également pris en compte (par exemple, dans `SELECT uniqExact(a + 1 AS b) FROM t1 JOIN t2 USING (b)`, la jointure est effectuée sur `t1.a + 1 = t2.b`). Lorsque l’alias correspondant est défini sur une sous-expression dans la liste SELECT plutôt que comme alias de niveau supérieur, les répliques parallèles sont désactivées pour la requête. Pour les requêtes envoyées à des serveurs distants (tables `Distributed`, fonction de table `remote`), une telle requête n’est rejetée avec une exception que si l’identifiant ne peut absolument pas être résolu sur le serveur distant ; si l’alias masque une véritable colonne de la table de gauche, le serveur distant effectue alors la jointure sur cette colonne, de sorte que les résultats peuvent différer de l’exécution locale.

<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": "Nouveau paramètre de compatibilité. Lorsqu'il est activé, l'analyseur reproduit les noms qualifiés des colonnes de résultat de l'ancien analyseur pour les requêtes dont la clause FROM comporte au moins deux JOIN."}]}]} />

Lorsqu'il est activé et que la clause `FROM` d'une requête contient au moins deux `JOIN` (les tables séparées par des virgules sont comptées, contrairement à `ARRAY JOIN`), l'analyseur attribue aux colonnes de résultat les noms que leur donnait la réécriture des jointures multiples de l'ancien analyseur :

* les colonnes produites par le développement de `*`, `<table>.*` ou `COLUMNS('<regexp>')` reçoivent des noms de la forme `<alias-or-table>.<column>` (le qualificateur est l'alias de l'expression de table si elle en possède un, sinon le nom de la table sans la base de données, ou, à défaut, le nom de la CTE ; les colonnes d'une sous-requête jointe sans alias restent non qualifiées). Deux types de colonnes conservent leur nom simple, car elles appartiennent à la jointure plutôt qu'à une seule expression de table : une colonne produite par `ARRAY JOIN` et une clé fusionnée par `JOIN ... USING`. Les références externes telles que `SELECT ll.arr` ou `SELECT ll.k` ne sont donc pas résolues dans ces deux cas ;
* la forme sous forme de liste d'identifiants `COLUMNS(col1, col2)` ne correspond pas à un développement par correspondance : chaque colonne conserve exactement le nom sous lequel son identifiant a été écrit. Ainsi, `COLUMNS(x)` produit `x` et `COLUMNS(a.x)` produit `a.x` ;
* une référence de colonne sans alias dans la liste `SELECT` conserve exactement le nom sous lequel elle a été écrite (par ex., `SELECT a.x` produit une colonne nommée `a.x` même lorsque `x` est non ambigu).

Cela permet aux requêtes externes qui référencent ces colonnes par leur nom qualifié de fonctionner, par exemple :

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

Ne prend effet que si l’analyseur est activé (`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": "Nouveau paramètre de compatibilité"}]}]} />

Lorsqu’un identifiant composite comme `b.id` peut faire référence soit à la colonne `id` d’une table ayant pour alias `b`, soit à une sous-colonne Tuple `b.id` d’une autre colonne, privilégiez l’interprétation avec préfixe d’alias (colonne `id` de `b`). Par défaut, l’analyseur privilégie la sous-colonne. Activez ce paramètre pour retrouver la résolution de l’ancien analyseur.
