> ## 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_*

> إعدادات جلسة ClickHouse ضمن المجموعة المُولَّدة analyzer_compatibility_*.

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](/ar/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. هذا إعداد توافق لأنه يغيّر نتيجة الاستعلام. عند تعطيله، لا يعمل `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": "إعداد توافق جديد. عند تمكينه، يحاكي المحلّل سلوك إعادة الكتابة القديم من `HAVING` إلى `WHERE` للأجزاء غير التجميعية المرتبطة بـ AND بدلًا من إصدار `NOT_AN_AGGREGATE`."}]}]} />

عند تمكينه، يحاكي المحلّل السلوك القديم المتمثل في نقل الأجزاء غير التجميعية المرتبطة بـ AND من `HAVING` إلى `WHERE` بدلًا من إصدار `NOT_AN_AGGREGATE`. ويكون الرفض المتوافق مع المعيار هو السلوك الافتراضي؛ وهذا الإعداد وسيلة مساعدة في الترحيل للاستعلامات التي كان المحلّل القديم يقبلها بصمت (`enable_analyzer = 0`). وتبقى الأجزاء المرتبطة التي تحتوي على دوال aggregate أو `grouping` أو دوال غير حتمية في `HAVING`. وإذا احتوى أي جزء مرتبط على دالة window 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": "أُصلح خلل في محلّل كان يؤدي إلى تطبيق FINAL على الجدول الموجود أقصى اليسار في JOIN، بصورة غير صحيحة، على الجداول الأخرى المنضمة أيضًا. تعني previous_value=true أن `compatibility` مع الإصدارات السابقة لـ 26.6 يستعيد السلوك القديم."}]}, {"id": "row-3","items": [{"label": "26.4"},{"label": "1"},{"label": "إعداد توافق جديد يتحكم في ما إذا كان FINAL على الجدول الموجود أقصى اليسار في JOIN يُطبَّق على الجداول الأخرى المنضمة. قُدِّم بقيمة افتراضية true (السلوك القديم) للنقل الخلفي إلى الإصدارات السابقة لـ 26.6."}]}]} />

يستعيد سلوك الإصدارات السابقة لـ 26.6، حيث كان المُعدِّل `FINAL` المحدد على الجدول الموجود أقصى اليسار في JOIN يُطبَّق خطأً أيضًا على جميع الجداول الأخرى المنضمة (للمحركات التي تدعم `FINAL`، مثل `ReplacingMergeTree`). افتراضيًا، لا يُطبَّق `FINAL` إلا على الجدول المكتوب عليه. فعِّل هذا الإعداد للتوافق مع الاستعلامات التي تعتمد على السلوك القديم؛ أما الإصلاح الموصى به فهو كتابة `FINAL` صراحةً على كل جدول يحتاج إليه.

القيم الممكنة:

* 0 - يُطبَّق `FINAL` على الجدول المحدد عليه فقط.
* 1 - يُطبَّق `FINAL` الموجود على الجدول أقصى اليسار في JOIN على جميع الجداول المنضمة.

<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 انطلاقًا من الإسقاط"}]}]} />

يفرض حلّ المعرّف في JOIN USING انطلاقًا من الإسقاط (على سبيل المثال، في `SELECT a + 1 AS b FROM t1 JOIN t2 USING (b)` سيُجرى join باستخدام `t1.a + 1 = t2.b` بدلًا من `t1.b = t2.b`). وتُؤخذ أيضًا الأسماء المستعارة المعرّفة في التعبيرات الفرعية ضمن قائمة SELECT في الاعتبار (على سبيل المثال، في `SELECT uniqExact(a + 1 AS b) FROM t1 JOIN t2 USING (b)` يُجرى join باستخدام `t1.a + 1 = t2.b`). عندما يُعرَّف الاسم المستعار المطابق في تعبير فرعي ضمن قائمة SELECT بدلًا من تعريفه كاسم مستعار على المستوى الأعلى، تُعطَّل النسخ المتماثلة المتوازية لهذا الاستعلام. بالنسبة إلى الاستعلامات المُرسلة إلى الخوادم البعيدة (جداول `Distributed`، ودالة الجدول `remote`)، لا يُرفض هذا الاستعلام مع استثناء إلا إذا تعذر حلّ المعرّف على الخادم البعيد تمامًا؛ وإذا كان الاسم المستعار يحجب عمودًا حقيقيًا في الجدول الأيسر، فإن الخادم البعيد يجري 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 فيها على عمليتي JOIN أو أكثر."}]}]} />

عند تفعيله، وإذا كانت عبارة `FROM` في الاستعلام تحتوي على عمليتي `JOIN` أو أكثر (تُحتسب الجداول المفصولة بفواصل، بينما لا يُحتسب `ARRAY JOIN`)، يسمّي المحلّل أعمدة النتائج بالطريقة التي كانت تستخدمها إعادة كتابة عمليات الربط المتعددة في المحلّل القديم:

* تُسمّى الأعمدة الناتجة عن توسيع `*` أو `<table>.*` أو `COLUMNS('<regexp>')` بالشكل `<alias-or-table>.<column>` (يكون المؤهِّل هو الاسم المستعار لتعبير الجدول إن وُجد، وإلا فاسم الجدول من دون اسم قاعدة البيانات، وإلا فاسم تعبير الجدول الشائع؛ أما أعمدة الاستعلام الفرعي المربوط الذي لا يحمل اسماً مستعاراً فتظل غير مؤهَّلة). ويحتفظ نوعان من الأعمدة باسميهما غير المؤهَّلين لأنهما ينتميان إلى عملية الربط لا إلى تعبير جدول واحد: عمود ناتج عن `ARRAY JOIN`، ومفتاح مدمج بواسطة `JOIN ... USING`. لذلك، لا تُحلّ المراجع الخارجية مثل `SELECT ll.arr` أو `SELECT ll.k` في هاتين الحالتين؛
* صيغة قائمة المعرّفات `COLUMNS(col1, col2)` ليست توسيعاً لمطابقة: إذ يحتفظ كل عمود بالاسم تماماً كما كُتب معرّفه، لذا ينتج `COLUMNS(x)` الاسم `x` وينتج `COLUMNS(a.x)` الاسم `a.x`؛
* يحتفظ مرجع عمود بلا اسم مستعار في قائمة `SELECT` بالاسم تماماً كما كُتب (مثلاً، ينتج `SELECT a.x` عموداً باسم `a.x` حتى عندما يكون `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` إما إلى العمود `id` في جدول ذي الاسم المستعار `b` أو إلى عمود فرعي من نوع Tuple هو `b.id` لعمود آخر، فامنح الأفضلية لتفسير بادئة الاسم المستعار (أي العمود `id` في `b`). افتراضيًا، يفضّل المُحلِّل العمود الفرعي. فعِّل هذا الخيار لمطابقة آلية التحليل في المُحلِّل القديم.
