تُقيِّم دالة الجدول eval وسيطها إلى سلسلة استعلام، ثم تنفّذ هذه السلسلة باعتبارها استعلام SELECT واحدًا.
هذه دالة الجدول تجريبية ومُعطّلة افتراضيًا. فعِّلها باستخدام الإعداد allow_experimental_eval_table_function:
SET allow_experimental_eval_table_function = 1;كما يتطلب أيضًا المُحلِّل (enable_analyzer، وهو مُمكَّن افتراضيًا).
الصياغة
eval(expression)
eval(SELECT ...)الوسائط
expression— تعبير ثابت يُرجع سلسلة استعلام. يُسمح باستخدام مَعلمات الاستعلام والاستعلامات الفرعية ذات القيمة المفردة.SELECT ...— استعلامSELECTيُرجع سلسلة استعلام. هذا الشكل اختصار نحوي لاستعلام فرعي قيَمي:eval(SELECT ...)مكافئ لـeval((SELECT ...))، لذا يجب أن يُرجع الاستعلام صفًا واحدًا وعمودًا واحدًا فقط.
يجب أن تكون قيمة التعبير من أحد هذه الأنواع:
StringNullable(String)LowCardinality(String)LowCardinality(Nullable(String))
إذا كانت القيمة NULL، فإن eval يطرح استثناءً.
القيمة المُعادة
تُرجِع نتيجة استعلام SELECT المُولَّد في صورة جدول.
يُحدَّد مخطط الإخراج عند تحليل دالة الجدول eval، لذا يمكن للاستعلامات الخارجية الرجوع إلى أسماء الأعمدة الفعلية وأنواعها في الاستعلام المُولَّد.
أمثلة
قيِّم تعبيرًا ثابتًا:
SELECT * FROM eval('SEL' || 'ECT 1 AS x');النتيجة:
┌─x─┐
│ 1 │
└───┘استخدم معلَمة استعلام:
SET param_q = 'SELECT 2 AS y';
SELECT * FROM eval({q:String});النتيجة:
┌─y─┐
│ 2 │
└───┘قيِّم استعلام SELECT مُدخلًا يُعيد نص الاستعلام:
SELECT * FROM eval(SELECT 'SELECT 3 AS z');النتيجة:
┌─z─┐
│ 3 │
└───┘استخدم المخطط الذي تم إنشاؤه في الاستعلام الخارجي:
SELECT x + 1 FROM eval('SELECT 4 AS x');النتيجة:
┌─plus(x, 1)─┐
│ 5 │
└────────────┘القيود
- يعمل
evalفقط مع محلّل الاستعلامات (enable_analyzer = 1). - يجب أن يكون الاستعلام المُنشأ استعلام
SELECTواحدًا من دون خيارات إخراج مثلINTO OUTFILEأوFORMAT. ولا ينفّذevalعدة عبارات. - يجب أن يكون الاستعلام المُنشأ مستقلًا بذاته: إذ يُحل ضمن نطاقه الخاص، ولا يمكنه الرجوع إلى الأسماء المستعارة في
WITHأو إلى أعمدة الاستعلام الخارجي. - لا يمكن للاستعلام المُنشأ استخدام دالة الجدول
evalمرة أخرى. - لا يمكن استخدام
evalكوسيطة لدالة جدول أخرى، مثلremote('host', eval(...)). لتنفيذ الاستعلام المُنشأ على خادم بعيد، ضعه داخلview:remote('host', view(SELECT * FROM eval(...))). - تُقيَّم الوسيطة مرة واحدة أثناء تحليل الاستعلام، وليس مرة لكل صف أو block.
- يسجّل سجل الاستعلامات الخاص بالاستعلام الخارجي الاستعلام الأصلي الذي يحتوي على
eval؛ ولا يُسجَّل استعلامSELECTالمُنشأ كاستعلام مستخدم منفصل.
- دالة الجدول
view - إعداد
allow_experimental_eval_table_function