البنية
الوسيطات
db_path— مسار ملف يحتوي على قاعدة بيانات SQLite. String.table_name— اسم جدول في قاعدة بيانات SQLite، أو استعلام يُمرَّر إلى SQLite كما هو (انظر تمرير استعلام بدلًا من اسم جدول). String.
القيمة المعادة
- كائن من نوع جدول يحتوي على الأعمدة نفسها الموجودة في جدول
SQLiteالأصلي.
تمرير استعلام بدلاً من اسم جدول
يمكن أن تكون الوسيطة الثانية، بدلاً من اسم الجدول، استعلامSELECT يُمرَّر إلى SQLite كما هو. وتُستنتج بنية الجدول الناتج من نتيجة الاستعلام. لا يُبلغ SQLite عن نوع مُصرَّح به إلا لعمود النتيجة الذي يكون عموداً مباشراً من جدول؛ أما التعبير أو القيمة الحرفية أو التجميع فلا يُبلغ عنها بشيء. ويُستخدم النوع المُصرَّح به الذي يقابله String (راجع مطابقة الأنواع) كما هو. ويُحدَّد نوع العمود الذي ليس له نوع مُصرَّح به وفقاً لفئة التخزين الخاصة بقيمته في الصف الأول من نتيجة الاستعلام: فالقيمة INTEGER تعطي النوع Int64، والقيمة REAL تعطي النوع Float64، وأي قيمة أخرى (TEXT أو BLOB أو NULL)، وكذلك النتيجة الفارغة، تعطي النوع String. ويُتحقَّق أيضاً من توافق النوع الرقمي المُصرَّح به مع ذلك الصف الأول، لأن SQLite يُبلغ أيضاً عن نوع مُصرَّح به لاستعلام SELECT المركّب، يأخذه من أحد فروعه في حين تأتي الصفوف من جميع الفروع. ويُحتفظ بهذا النوع عندما تتوافق معه فئة التخزين الخاصة بالقيمة (INTEGER لنوع عدد صحيح، وINTEGER أو REAL لنوع ذي فاصلة عائمة)، وكذلك عندما تكون القيمة NULL أو تكون النتيجة فارغة، إذ لا يحمل أيٌّ منهما معلومات عن النوع يمكن أن تتعارض معه؛ وإلا فيُحدَّد نوع العمود وفقاً لفئة التخزين، شأنه شأن العمود غير المُصرَّح به. وبذلك لا يُوسَّع النوع المُستنتج إلا توسيعاً، ولا يُضيَّق أبداً. ويؤدي استنتاج نوع مثل هذا العمود إلى بدء تنفيذ الاستعلام في SQLite. ولا يُمثّل الصف الأول بقية الصفوف بالضرورة: إذ يحق لـ SQLite أن يُرجع فئة تخزين مختلفة في كل صف (على سبيل المثال، CASE WHEN id = 1 THEN 1 ELSE 1.5 END)، ولذلك تكون القراءة المستندة إلى استعلام مُغلقة عند الإخفاق (fail-closed) لكل عمود يُقرأ عبر نوع رقمي، لا للأعمدة التي ليس لها نوع مُصرَّح به فحسب. فالقيمة التي لا تطابق فئةُ تخزينها ذلك النوع، أو التي يتعذّر تمثيلها فيه تمثيلاً دقيقاً (خلية INTEGER قيمتها 300 في عمود UInt8، أو خلية REAL قيمتها 16777217 في عمود Float32)، تؤدي إلى فشل عملية القراءة بدلاً من تحويلها بصمت. ولقراءة عمود يحتوي على قيم من فئات تخزين مختلطة، صرِّح بنوعه على أنه String أو حوِّله إلى نص في استعلام SQLite. ويكون كل عمود مُستنتج من النوع Nullable. ويمكن كتابة الاستعلام إما على هيئة استعلام فرعي، أو تغليفه داخل الدالة query:
SELECT ... FROM (<query>) قبل إرساله إلى SQLite، لذا يجب ألا ينتهي بفاصلة منقوطة.
يكون هذا النوع من الجداول للقراءة فقط، إذ لا يُسمح بتنفيذ INSERT فيه. ويدعم محرك الجدول SQLite الصيغة نفسها.
تُحلَّل صيغة الاستعلام الفرعي
(SELECT ...) من قِبل ClickHouse ثم يُعاد تسلسلها قبل إرسالها إلى SQLite. لذلك يجب أن تكون صالحة في ClickHouse SQL. ولتمرير صيغة خاصة بـ SQLite لا يستطيع ClickHouse تحليلها، استخدم بنية query('...')، إذ يُرسل نصها إلى SQLite حرفيًا.أي WHERE أو LIMIT أو aggregation أو غير ذلك في استعلام ClickHouse المحيط لا يُدفَع إلى داخل الاستعلام المُمرَّر — بل يُطبَّق في ClickHouse بعد جلب نتيجة الاستعلام كاملة. ولتقييد البيانات المقروءة من SQLite، ضع شرط التصفية داخل الاستعلام المُمرَّر. عند استخدام external_table_strict_query = 1، يُرفَض شرط تصفية خارجي على أعمدة دالة الجدول مع exception بدلًا من تطبيقه محليًا، لأنه لا يمكن دفعه إلى الاستعلام المُمرَّر. يغطي الفحص predicate ذي المستوى الأعلى في WHERE وكل conjunct في AND ذي المستوى الأعلى. لا تُعد PREWHERE على أعمدة هذا الجدول حالةً لهذا الإعداد: إذ لا يدعم محرك الجدول هذا PREWHERE، ويُرفَض مثل هذا الاستعلام باستخدام ILLEGAL_PREWHERE بغض النظر عن الإعداد. لا يُجرى الفحص إلا حيث يمكن دفع شرط التصفية أصلًا: عندما يكون هذا الجدول هو الجدول الوحيد في الاستعلام، أو على أي من جانبي INNER JOIN، أو على الجانب الحافظ في outer join (الجانب الأيسر من LEFT JOIN، والجانب الأيمن من RIGHT JOIN). على الجانب غير الحافظ من LEFT/RIGHT JOIN وعلى أي من جانبي FULL JOIN لا يُدفَع شيء ولا يُفحَص شيء، لذا يُطبَّق شرط التصفية على أعمدة هذا الجدول محليًا بعد join حتى في الوضع الصارم. حيث يُجرى الفحص، لا يُدفَع predicate الذي يشير إلى جداول أخرى موصولة في الاستعلام المحيط ويُستبعد من الفحص، سواء أشار إلى الجانب الموصول فقط أو مزجه مع هذا الجدول ضمن تعبير واحد غير AND (مثل OR)؛ ويحافظ مثل هذا predicate على نقطة تقييمه المعتادة في ClickHouse (WHERE بعد join، وPREWHERE قبله) ولا يُرفَض.مثال
Query
Response
ذات صلة
- محرك جدول SQLite
- محرك قاعدة البيانات SQLite — قسم دعم أنواع البيانات