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

> توثيق الإسقاطات الافتراضية (what-if projections)

# HYPOTHETICAL PROJECTION

الإسقاطات الافتراضية (Hypothetical projections) هي إسقاطات وهمية يقتصر نطاقها على الجلسة، ويمكنك إرفاقها بجدول من عائلة `MergeTree` دون بنائها أو تخزينها فعليًا. وهي لا توجد إلا داخل الجلسة الحالية، ويتم إدراجها عبر [`EXPLAIN WHATIF`](/ar/reference/statements/explain#explain-whatif).

لا يقدّر `EXPLAIN WHATIF` حتى الآن مدى فائدة الإسقاط الافتراضي، بل يُبلغ عن كل منها بالحالة `status: not_applicable`. ويبقى تعريفها مفيدًا اليوم للتحقق من صحة التعريف مقابل الجدول دون تجسيده، وكذلك للأدوات التي تقرأ من [`system.hypothetical_projections`](/ar/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 (...)]
```

تحاكي الصيغة النحوية `ALTER TABLE ... ADD PROJECTION`، ويجري التحقق من التعريف بالطريقة نفسها تمامًا، لذا فإن أي projection يُرفض هنا ما كان ليُجسَّد أصلًا. ولا يُبنى شيء ولا يُكتب — إذ يُخزَّن الوصف فقط، ضمن الجلسة الحالية.

* `name` — اسم الـ projection؛ يجب أن يكون فريدًا ضمن `(database, table)` في هذه الجلسة، وألا يتعارض مع projection حقيقي على الجدول.
* يقبل المتن الأشكال نفسها التي يقبلها الـ projection الحقيقي: projection لإعادة الترتيب باستخدام `ORDER BY`، أو projection تجميعي باستخدام `GROUP BY`، أو projection مُرشَّح باستخدام `WHERE`، أو صيغة فهرس الـ projection ‏`INDEX <expression> TYPE <projection_index_type>`.
* تُقبل `WITH SETTINGS (...)` ويُحتفظ بها، وتظهر الإعدادات في `system.hypothetical_projections`.

يجب أن يكون الجدول الهدف من عائلة `MergeTree` وضمن قاعدة بيانات `Atomic` (أي أن يكون له معرّف UUID)، لأن مخزن الجلسة يفهرس المُدخلات بحسب معرّف UUID الخاص بالجدول. وتنطبق هنا أيضًا القيود التي يفرضها `ADD PROJECTION` الحقيقي: تُرفض الجداول التي تحتوي على `UNIQUE KEY`، وأوضاع الدمج غير `Ordinary` عندما تكون `deduplicate_merge_projection_mode = throw`، و`MergeTree` بالصيغة النحوية القديمة، والأقراص غير القابلة للتغيير.

**مثال**

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

يزيل إسقاطًا افتراضيًا (hypothetical projection) من الجلسة الحالية.

## DROP ALL HYPOTHETICAL PROJECTIONS

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

يمسح كل إسقاط افتراضي مُعرَّف في الجلسة الحالية، بغض النظر عن الجدول. ولا يمسّ الفهارس الافتراضية؛ أما `DROP ALL HYPOTHETICAL INDEXES` فيفعل العكس.

## النطاق ودورة الحياة

* لا توجد الإسقاطات الافتراضية إلا في **الجلسة الحالية** — فهي غير مرئية للجلسات الأخرى ويتم التخلص منها عند انتهاء الجلسة.
* تعريف إحداها أو حذفها لا يُنشئ أي إسقاط ولا يؤثر مطلقًا على الاستعلامات العادية على الجدول.
* يمكنك الاطلاع على الإسقاطات الافتراضية للجلسة الحالية عبر [`system.hypothetical_projections`](/ar/reference/system-tables/hypothetical_projections).

## الصلاحيات المطلوبة

يتطلب `CREATE HYPOTHETICAL PROJECTION` صلاحية `ALTER ADD PROJECTION` على الجدول — وهي الصلاحية نفسها التي يحتاجها الأمر الفعلي `ALTER TABLE ... ADD PROJECTION` — لأنه يتحقق من صحة التعريف بمقارنته بأعمدة الجدول. وهو لا يقرأ أي بيانات من الجدول، لذا لا تُشترط صلاحية `SELECT` على أعمدة الإسقاط في الوقت الحالي؛ أما عندما يبدأ `EXPLAIN WHATIF` بتقدير الإسقاطات فسيقرأ تلك الأعمدة، وعندئذٍ ستصبح صلاحية `SELECT` على مستوى العمود مطلوبة، كما هو الحال بالفعل مع [`CREATE HYPOTHETICAL INDEX`](/ar/reference/statements/hypothetical-index#required-privileges).

ويتطلب `DROP HYPOTHETICAL PROJECTION` الصلاحية نفسها، حتى لا يكشف ذكر اسم جدول في عملية حذف عمّا إذا كان موجودًا أو مؤهلًا. أما `DROP ALL HYPOTHETICAL PROJECTIONS` فلا يذكر أي جدول ولا يتطلب أي صلاحية.

## انظر أيضاً

* [`CREATE HYPOTHETICAL INDEX`](/ar/reference/statements/hypothetical-index)
* [`EXPLAIN WHATIF`](/ar/reference/statements/explain#explain-whatif)
* [`system.hypothetical_projections`](/ar/reference/system-tables/hypothetical_projections)
* [الإسقاطات](/ar/reference/engines/table-engines/mergetree-family/mergetree#projections)
