إنشاء جدول
db_path— مسار ملف SQLite الذي يحتوي على قاعدة البيانات.table— اسم جدول في قاعدة بيانات SQLite، أو استعلام يُمرَّر إلى SQLite كما هو (انظر تمرير استعلام بدلًا من اسم جدول).
تمرير استعلام بدلاً من اسم جدول
يمكن أن تكون الوسيطةtable، بدلاً من اسم الجدول، استعلام 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 أو تجميع أو غير ذلك من عناصر استعلام ClickHouse المحيط لا يُدفَع إلى داخل الاستعلام المُمرَّر — بل يُطبَّق في ClickHouse بعد جلب نتيجة الاستعلام كاملةً. ولتقييد البيانات المقروءة من SQLite، ضع filter داخل الاستعلام المُمرَّر. ومع external_table_strict_query = 1، يُرفَض أي filter خارجي على أعمدة الجدول عبر إطلاق استثناء بدلًا من تطبيقه محليًا، لأنه لا يمكن دفعه إلى داخل الاستعلام المُمرَّر. ويشمل هذا الفحص predicate الخاص بـ WHERE في المستوى الأعلى وكل عامل من عوامل AND في المستوى الأعلى. أما PREWHERE على أعمدة هذا الجدول فلا يخضع لهذا الإعداد: فمحرّك الجدول هذا لا يدعم PREWHERE، ويُرفَض مثل هذا الاستعلام بالخطأ ILLEGAL_PREWHERE بصرف النظر عن الإعداد. ولا يُجرى الفحص إلا حيث يمكن دفع filter أصلًا: عندما يكون هذا الجدول هو الجدول الوحيد في الاستعلام، أو على أي من جانبي INNER JOIN، أو على الجانب المحفوظ من outer join (الجانب الأيسر في LEFT JOIN، والجانب الأيمن في RIGHT JOIN). وعلى الجانب غير المحفوظ من LEFT/RIGHT JOIN وعلى أي من جانبي FULL JOIN لا يُدفَع شيء ولا يُفحَص شيء، لذا يُطبَّق filter على أعمدة هذا الجدول محليًا بعد الـ join حتى في الوضع الصارم. وحيث يُجرى الفحص، فإن predicate يشير إلى جداول أخرى مضمومة في الاستعلام المحيط لا يُدفَع ويُستثنى من الفحص، سواء أشار إلى الجانب المضموم فقط أو خلطه مع هذا الجدول داخل تعبير واحد ليس AND (مثل OR)؛ ويحتفظ مثل هذا الـ predicate بنقطة تقييمه المعتادة في ClickHouse (WHERE بعد الـ join، وPREWHERE قبله) ولا يُرفَض.دعم أنواع البيانات
عند تحديد أنواع أعمدة ClickHouse صراحةً في تعريف الجدول، يمكن تحليل أنواع ClickHouse التالية من أعمدة TEXT في SQLite:- Date, Date32
- DateTime, DateTime64
- UUID
- Enum8, Enum16
- Decimal32, Decimal64, Decimal128, Decimal256
- FixedString
- جميع أنواع الأعداد الصحيحة (UInt8, UInt16, UInt32, UInt64, UInt128, UInt256, Int8, Int16, Int32, Int64, Int128, Int256)
- Float32, Float64
NULL من SQLite إلى عمود ClickHouse مُعرَّف صراحةً بنوع غير Nullable إلى إطلاق الاستثناء CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN. لقراءة قيم NULL، عرِّف العمود بالنوع Nullable. أما المخطط المستنتج فيتبع البيانات الوصفية في SQLite، إذ يكون العمود Nullable ما لم يُعرَّف بأنه NOT NULL.