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

# analyzer_compatibility_* セッション設定

> analyzer_compatibility_* によって生成されたグループ内の ClickHouse セッション設定。

export const VersionHistory = ({rows = []}) => {
  if (rows.length === 0) {
    return null;
  }
  const headers = ["バージョン", "デフォルト値", "コメント"];
  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
  }}>
        バージョン履歴
      </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
  }}>型</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{type}</div>
      <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>デフォルト値</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{default_value}</div>
      {changeable_without_restart && <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>
          再起動せずに変更可能
        </div>}
      {changeable_without_restart && <div style={{
    overflowWrap: "anywhere"
  }}>
          {changeable_without_restart}
        </div>}
    </div>;
};

これらの設定は [system.settings](/ja/reference/system-tables/settings) で確認でき、[ソース](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": "新しい設定"}]}]} />

Nested に複合 Identifier を追加できるようにします。これはクエリ結果が変わるため、互換性設定です。無効にすると、`SELECT a.b.c FROM table ARRAY JOIN a` は動作せず、`SELECT a FROM table` の結果にも `a.b.c` カラムは `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": "新しい互換性設定です。有効にすると、アナライザは `NOT_AN_AGGREGATE` を返す代わりに、非集約の AND 条件に対して従来の `HAVING` から `WHERE` への書き換えを再現します。"}]}]} />

有効にすると、アナライザは `NOT_AN_AGGREGATE` を返す代わりに、非集約の AND 条件を `HAVING` から `WHERE` に移動する従来の動作を再現します。デフォルトでは標準準拠の拒否動作が使われます。これは、古いアナライザ (`enable_analyzer = 0`) で暗黙的に受け入れられていたクエリのための移行支援です。集約関数、`grouping`、または非決定論的関数を含む条件は `HAVING` に残ります。いずれかの条件にウィンドウ関数または stateful function (たとえば `rowNumberInBlock`) が含まれている場合、書き換えは `HAVING` 全体で無効になり、従来の `PredicateExpressionsOptimizer` の動作と一致します。また、`GROUP BY` で `WITH CUBE`、`WITH ROLLUP`、`WITH TOTALS`、または `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": "master での新しい設定（デフォルトは false、つまり修正後の動作）。動作の変更自体は 26.6 に記録されており、古いリリースブランチへのバックポート用の導入（デフォルトは true）は 26.4 に記録されています。"}]}, {"id": "row-2","items": [{"label": "26.6"},{"label": "0"},{"label": "JOIN の左端のテーブルの FINAL が、他の結合先テーブルにも誤って適用されるアナライザのバグを修正しました。previous_value=true のため、26.6 より前のバージョンで `compatibility` を使用すると、古い動作が復元されます。"}]}, {"id": "row-3","items": [{"label": "26.4"},{"label": "1"},{"label": "JOIN の左端のテーブルの FINAL を他の結合先テーブルにも適用するかどうかを制御する新しい互換性設定です。26.6 より前のバージョンへのバックポート用に、デフォルト値 true（古い動作）で導入されました。"}]}]} />

JOIN の左端のテーブルに指定された `FINAL` 修飾子が、他のすべての結合先テーブルにも誤って適用されていた 26.6 より前のバージョンの動作を復元します (`ReplacingMergeTree` など、`FINAL` をサポートするエンジンの場合) 。デフォルトでは、`FINAL` は指定したテーブルにのみ適用されます。古い動作に依存するクエリとの互換性が必要な場合は有効にしてください。推奨される修正方法は、`FINAL` が必要なすべてのテーブルに明示的に指定することです。

設定可能な値:

* 0 - `FINAL` は指定したテーブルにのみ適用されます。
* 1 - JOIN の左端のテーブルの `FINAL` が、すべての結合先テーブルに適用されます。

<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": "JOIN USING 内のIdentifierを projection から解決するよう強制する"}]}]} />

JOIN USING 内のIdentifierを projection から解決するよう強制します (たとえば、`SELECT a + 1 AS b FROM t1 JOIN t2 USING (b)` では、`t1.b = t2.b` ではなく `t1.a + 1 = t2.b` で JOIN が実行されます) 。SELECT リスト内の部分式で定義された別名も考慮されます (たとえば、`SELECT uniqExact(a + 1 AS b) FROM t1 JOIN t2 USING (b)` では、`t1.a + 1 = t2.b` で JOIN が実行されます) 。一致する別名がトップレベルの別名ではなく SELECT リスト内の部分式で定義されている場合、そのクエリでは並列レプリカが無効になります。リモートサーバーに送信されるクエリ (`Distributed` テーブル、`remote` テーブル関数) では、リモートサーバー上でIdentifierをまったく解決できない場合にのみ、そのクエリは例外で拒否されます。別名が左テーブルの実際のカラムを隠している場合、リモートサーバーは代わりにそのカラムで JOIN を実行するため、結果がローカル実行と異なる可能性があります。

<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": "新しい互換性設定。有効にすると、`FROM` 句に2つ以上の `JOIN` を含むクエリに対し、アナライザは旧アナライザにおける修飾付き結果カラム名の動作を再現します。"}]}]} />

有効にすると、クエリの `FROM` 句に2つ以上の `JOIN` が含まれる場合 (カンマ区切りのテーブルは数えますが、`ARRAY JOIN` は数えません) 、アナライザは旧アナライザの複数 JOIN の書き換えと同様に結果カラムに名前を付けます。

* `*`、`<table>.*`、または `COLUMNS('<regexp>')` の展開によって生成されるカラムには、`<alias-or-table>.<column>` 形式の名前が付けられます (修飾子には、テーブル式に別名があればその別名が使用され、なければデータベース名を除いたテーブル名、さらにそれもなければ CTE 名が使用されます。別名のない結合サブクエリのカラムは修飾されません) 。単一のテーブル式ではなく JOIN 自体に属するため、修飾なしの名前を維持するカラムには2種類あります。`ARRAY JOIN` によって生成されるカラムと、`JOIN ... USING` によってマージされるキーです。したがって、`SELECT ll.arr` や `SELECT ll.k` のような外部参照は、これら2つの形式では解決されません。
* 識別子リスト形式の `COLUMNS(col1, col2)` はマッチャーの展開ではありません。各カラムは識別子に記述された名前をそのまま維持するため、`COLUMNS(x)` は `x` を生成し、`COLUMNS(a.x)` は `a.x` を生成します。
* `SELECT` リスト内の別名なしのカラム参照は、記述された名前をそのまま維持します (例: `SELECT a.x` は、`x` が曖昧でない場合でも `a.x` という名前のカラムを生成します) 。

これにより、修飾名でこうしたカラムを参照する外部クエリが機能するようになります。例:

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

アナライザが有効な場合にのみ適用されます (`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": "新しい互換性設定"}]}]} />

`b.id` のような複合Identifierが、エイリアス `b` を持つテーブルのカラム `id` としても、別のカラムの Tuple サブカラム `b.id` としても解釈できる場合は、エイリアスのプレフィックスとしての解釈 (`b` のカラム `id`) を優先します。デフォルトでは、アナライザはサブカラムを優先します。以前のアナライザの解決に合わせるには、これを有効にします。
