MergeTree دون بنائها أو تخزينها فعليًا. وهي لا توجد إلا داخل الجلسة الحالية، ويتم إدراجها عبر EXPLAIN WHATIF.
لا يقدّر EXPLAIN WHATIF حتى الآن مدى فائدة الإسقاط الافتراضي، بل يُبلغ عن كل منها بالحالة status: not_applicable. ويبقى تعريفها مفيدًا اليوم للتحقق من صحة التعريف مقابل الجدول دون تجسيده، وكذلك للأدوات التي تقرأ من system.hypothetical_projections.
CREATE HYPOTHETICAL PROJECTION
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 بالصيغة النحوية القديمة، والأقراص غير القابلة للتغيير.
مثال
DROP HYPOTHETICAL PROJECTION
DROP ALL HYPOTHETICAL PROJECTIONS
DROP ALL HYPOTHETICAL INDEXES فيفعل العكس.
النطاق ودورة الحياة
- لا توجد الإسقاطات الافتراضية إلا في الجلسة الحالية — فهي غير مرئية للجلسات الأخرى ويتم التخلص منها عند انتهاء الجلسة.
- تعريف إحداها أو حذفها لا يُنشئ أي إسقاط ولا يؤثر مطلقًا على الاستعلامات العادية على الجدول.
- يمكنك الاطلاع على الإسقاطات الافتراضية للجلسة الحالية عبر
system.hypothetical_projections.
الصلاحيات المطلوبة
يتطلبCREATE HYPOTHETICAL PROJECTION صلاحية ALTER ADD PROJECTION على الجدول — وهي الصلاحية نفسها التي يحتاجها الأمر الفعلي ALTER TABLE ... ADD PROJECTION — لأنه يتحقق من صحة التعريف بمقارنته بأعمدة الجدول. وهو لا يقرأ أي بيانات من الجدول، لذا لا تُشترط صلاحية SELECT على أعمدة الإسقاط في الوقت الحالي؛ أما عندما يبدأ EXPLAIN WHATIF بتقدير الإسقاطات فسيقرأ تلك الأعمدة، وعندئذٍ ستصبح صلاحية SELECT على مستوى العمود مطلوبة، كما هو الحال بالفعل مع CREATE HYPOTHETICAL INDEX.
ويتطلب DROP HYPOTHETICAL PROJECTION الصلاحية نفسها، حتى لا يكشف ذكر اسم جدول في عملية حذف عمّا إذا كان موجودًا أو مؤهلًا. أما DROP ALL HYPOTHETICAL PROJECTIONS فلا يذكر أي جدول ولا يتطلب أي صلاحية.