الوصف
البدء
الاستخدام
سياسة الإصدارات
- يُزاد الرقم الرئيسي للإصدار عند إجراء تغييرات على API
- يُزاد الرقم الثانوي للإصدار عند إجراء تغييرات SQL المتوافقة مع الإصدارات السابقة
- يُزاد رقم التصحيح عند إجراء تغييرات تقتصر على الملف التنفيذي
- إصدار المكتبة (المعرّف بواسطة
PG_MODULE_MAGICفي PostgreSQL 18 والإصدارات الأحدث) يتضمن الإصدار الدلالي الكامل، ويظهر في مخرجات الدالةpgch_version()أو دالة Postgrespg_get_loaded_modules(). - إصدار الامتداد (المعرّف في ملف التحكم) يتضمن فقط الرقمين الرئيسي
والثانوي، ويظهر في الجدول
pg_catalog.pg_extension، وفي مخرجات الدالةpg_available_extension_versions()، وفي\dx pg_clickhouse.
v0.1.0 إلى v0.1.1، يفيد جميع قواعد البيانات التي حمّلت v0.1، ولا
تحتاج إلى تشغيل ALTER EXTENSION للاستفادة من الترقية.
أما الإصدار الذي يزيد الرقم الثانوي أو الرئيسي، فسيكون
مصحوبًا بسكربتات ترقية SQL، ويجب على جميع قواعد البيانات الحالية التي تحتوي على
الامتداد تشغيل ALTER EXTENSION pg_clickhouse UPDATE للاستفادة من
الترقية.
مرجع DDL في SQL
CREATE EXTENSION
WITH SCHEMA لتثبيته في مخطط محدد (يوصى به):
ALTER EXTENSION
-
بعد تثبيت إصدار جديد من pg_clickhouse، استخدم العبارة
UPDATE: -
استخدم
SET SCHEMAلنقل الامتداد إلى مخطط جديد:
DROP EXTENSION
CASCADE لحذفها أيضًا:
CREATE SERVER
driver: مشغّل اتصال ClickHouse المراد استخدامه، إما “binary” أو “http”. مطلوب.compression: ضغط البروتوكول الأصلي لمشغّل “binary”، ويكون إحدى القيم “none” أو “lz4” أو “zstd”. القيمة الافتراضية هي “lz4”. ويتجاهله مشغّل “http”.dbname: قاعدة بيانات ClickHouse التي ستُستخدم عند الاتصال. القيمة الافتراضية هي “default”.host: اسم مضيف خادم ClickHouse. القيمة الافتراضية هي “localhost”;port: المنفذ المطلوب الاتصال به على خادم ClickHouse. تكون القيم الافتراضية كما يلي:- 9440 إذا كان
driverهو “binary” وكانhostمضيف ClickHouse Cloud - 9004 إذا كان
driverهو “binary” ولم يكنhostمضيف ClickHouse Cloud - 8443 إذا كان
driverهو “http” وكانhostمضيف ClickHouse Cloud - 8123 إذا كان
driverهو “http” ولم يكنhostمضيف ClickHouse Cloud
- 9440 إذا كان
min_tls_version: الحد الأدنى لإصدار بروتوكول TLS الذي يجب التفاوض عليه في الاتصالات التي تستخدم TLS. إحدى القيمTLSv1أوTLSv1.1أوTLSv1.2أوTLSv1.3. القيمة الافتراضية هي الحد الأدنى الذي تعتمده مكتبة TLS نفسها. وينطبق ذلك على كلا المشغّلين.secure: يحدّد استخدام TLS للاتصال. إحدى القيم التالية:auto(الافتراضي): استخدم TLS عندما يكونhostمضيف ClickHouse Cloud أو يكونportمنفذًا آمنًا؛ وإلا فاستخدم اتصالًا غير مشفّر.on(أوtrue/yes/1): استخدم TLS دائمًا. وتكون القيمة الافتراضية لـportهي 8443 (“http”) أو 9440 (“binary”).off(أوfalse/no/0): لا تستخدم TLS مطلقًا. وتكون القيمة الافتراضية لـportهي 8123 (“http”) أو 9000 (“binary”).
ALTER SERVER
DROP SERVER
CASCADE لكي
تُسقِط هذه التبعيات أيضًا:
CREATE USER MAPPING
taxi_srv:
user: اسم مستخدم ClickHouse. والقيمة الافتراضية هي “default”.password: كلمة مرور مستخدم ClickHouse.
ALTER USER MAPPING
DROP USER MAPPING
IMPORT FOREIGN SCHEMA
LIMIT TO لحصر الاستيراد في جداول محددة:
EXCEPT لاستثناء الجداول:
CREATE FOREIGN TABLE
database: اسم قاعدة البيانات البعيدة. تكون القيمة الافتراضية هي قاعدة البيانات المعرّفة للخادم الخارجي.table_name: اسم الجدول البعيد. تكون القيمة الافتراضية هي الاسم المحدد للجدول الخارجي.engine: [محرك الجدول] المستخدم في جدول ClickHouse. بالنسبة إلىCollapsingMergeTree()وAggregatingMergeTree()، يطبّق pg_clickhouse المعلمات تلقائيًا على تعبيرات الدوال التي تُنفَّذ على الجدول.
-
column_name: اسم العمود على جهة ClickHouse، ويُستخدم بدلًا من اسم السمة في PostgreSQL عند إعادة توليد الاستعلامات و عمليات الإدراج. وهو مفيد لربط أسماء أعمدة PostgreSQL المكتوبة بأحرف صغيرة وغير الموضوعة بين علامتَي اقتباس بأعمدة ClickHouse الحساسة لحالة الأحرف، على سبيل المثال: -
AggregateFunction: اسم الدالة التجميعية المطبَّقة على عمود من [نوع AggregateFunction]. اربط نوع البيانات بنوع ClickHouse المُمرَّر إلى الدالة، وحدد اسم الدالة التجميعية عبر خيار العمود المناسب، وسيضيف pg_clickhouse تلقائيًاMergeإلى الدالة التجميعية التي تقيّم العمود. -
SimpleAggregateFunction: اسم الدالة التجميعية المطبَّقة على عمود من [نوع SimpleAggregateFunction]. اربط نوع البيانات بنوع ClickHouse المُمرَّر إلى الدالة، وحدد اسم الدالة التجميعية عبر خيار العمود المناسب.
ALTER FOREIGN TABLE
DROP FOREIGN TABLE
CASCADE لحذفها أيضًا:
مرجع SQL لـ DML
EXPLAIN
VERBOSE يؤدي إلى
إظهار استعلام ClickHouse “Remote SQL”:
SELECT
nodes ونربط بها بدلًا من الجدول البعيد:
node_id بدلًا من العمود المحلي، ثم الربط
بجدول البحث لاحقًا:
node_id إلى النظام البعيد، مما يقلّل
عدد الصفوف التي يجب سحبها مرة أخرى إلى Postgres من 1000 (كلّها)
إلى 8 فقط، صف واحد لكل عقدة.
الجداول المُقسَّمة
enable_partitionwise_aggregate، ينفّذ PostgreSQL تجميعًا جزئيًا
أسفل Append، ثم تدمج عملية التجميع النهائي أعلاه هذه النتائج الجزئية في نتيجة واحدة.
ويدفع pg_clickhouse التجميع الجزئي للقسم الأجنبي إلى ClickHouse:
متى يُدفَع التجميع الجزئي إلى المصدر
- دوال التجميع القابلة للتفكيك التي تكون حالتها الانتقالية هي القيمة
النهائية بالفعل، تُدفَع مباشرةً إلى المصدر:
countوsumوminوmaxوbool_and/everyوbool_orوbit_andوbit_orوbit_xor. - تُدفَع
avgعلى الأعداد الصحيحة إلى المصدر بحالتها{count, sum}على شكل مصفوفة. - تُدفَع
avgوvar_popوvar_sampوstddev_popوstddev_sampعلى الأعداد ذات الفاصلة العائمة إلى المصدر بحالتها{N, sum, sum of squared deviations}على شكل مصفوفة.
FILTER (WHERE …) إلى المصدر مع دوال التجميع هذه.
الحالات التي تلجأ فيها إلى البديل
internal
تمثيل قابل للنقل، لذا يجلب القسم الخارجي صفوفها ويجمعها محليًا بدلًا من ذلك.
يشمل ذلك كل ما يتعلق بـ numeric، إضافةً إلى avg(bigint) وavg(interval).
كما تلجأ تجميعات DISTINCT وتجميعات المجموعات المرتبة والتجميعات متغيرة الوسائط إلى البديل.
PREPARE, EXECUTE, DEALLOCATE
{param:type}:
المعلمات:
INSERT
COPY
⚠️ قيود Batch API لم يوفّر pg_clickhouse بعد دعم واجهة insert الدُفعية الخاصة بـ PostgreSQL FDW. لذلك يستخدم COPY حاليًا عبارات INSERT من أجل إدراج السجلات. وسيُحسَّن ذلك في إصدار مستقبلي.
LOAD
SET
pg_clickhouse.session_settings
pg_clickhouse.session_settings لتحديد [إعدادات
ClickHouse] التي ستُطبَّق على الاستعلامات اللاحقة. مثال:
join_use_nulls لعمليات الربط الخارجي وtransform_null_in لفئة IN
(راجع دلالات IN وNULL).
date_time_output_format: يتطلبhttp driverأن تكون قيمته “iso”format_tsv_null_representation: يتطلبhttp driverالقيمة الافتراضيةoutput_format_tsv_crlf_end_of_lineيتطلبhttp driverالقيمة الافتراضية
pg_clickhouse.session_settings؛ إما باستخدام [التحميل المسبق للمكتبة المشتركة] أو
ببساطة باستخدام أحد الكائنات في الامتداد لضمان تحميله.
pg_clickhouse.pushdown_regex
pg_clickhouse.pushdown_regex في ما إذا كان pg_clickhouse
يقوم بتمرير دوال التعبيرات النمطية والعوامل إلى النظام البعيد. ويحدث ذلك افتراضيًا؛
اضبط هذه المعلمة على false لمنع تمريرها إلى النظام البعيد:
ALTER ROLE
SET في ALTER ROLE لإجراء التحميل المسبق لـ pg_clickhouse
و/أو SET معلماته لأدوار محددة:
RESET في ALTER ROLE لإعادة ضبط التحميل المسبق لـ pg_clickhouse
و/أو المعلمات:
التحميل المسبق
session_preload_libraries
أنواع البيانات
يمكن أيضاً قراءة أي عمود كنوع
text أو varchar أو أي نوع سلسلة آخر. تأخذ القيمة
نوع PostgreSQL المذكور أعلاه، ثم تُعرَض عبر دالة الإخراج الخاصة بذلك النوع.
تظل قيم UInt64 التي تتجاوز الحد الأقصى لـ bigint تُنتج خطأً، لذا اعرضها
باستخدام دالة ClickHouse toString().
ترد أدناه ملاحظات وتفاصيل إضافية.
BYTEA
SELECT الأخير:
مرجع الدوال والعوامل
الدوال
clickhouse_raw_query
host=localhost port=8123. معاملات الاتصال
المدعومة هي:
driver: برنامج تشغيل الاتصال المراد استخدامه، إما “http” أو “binary”؛ والقيمة الافتراضية هي “http”host: المضيف المراد الاتصال به؛ مطلوب.port: المنفذ المراد الاتصال به. القيمة الافتراضية هي8123لبرنامج التشغيل “http” أو9000لبرنامج التشغيل “binary”، وتتغير إلى8443أو9440على التوالي عندما يكونhostمضيف ClickHouse Clouddbname: اسم قاعدة البيانات المراد الاتصال بها.username: اسم المستخدم الذي سيتم الاتصال باسمه؛ القيمة الافتراضيةdefaultpassword: كلمة المرور المستخدمة للمصادقة؛ والقيمة الافتراضية هي عدم استخدام كلمة مرور
\N)، لكن
تختلف طريقة تمثيل كل قيمة: يعيد برنامج التشغيل “http” تنسيق TSV
الخاص بـ ClickHouse حرفيًا، بينما يمرر برنامج التشغيل “binary” كل قيمة عبر
دالة الإخراج في PostgreSQL.
بشكل افتراضي، لا يملك أي دور صلاحية EXECUTE لهذه الدالة؛ لذا احرص على GRANT
صلاحية الوصول فقط للأدوار التي تحتاج فعليًا إلى تنفيذ استعلامات ClickHouse
مخصّصة، مثل دور Admin مخصّص في ClickHouse:
وهي مفيدة للاستعلامات التي لا تُرجع أي سجلات، لكن الاستعلامات التي تُرجع قيمًا
ستُعاد على هيئة قيمة نصية واحدة:
clickhouse_server_version
major.minor.patch، للخادم
الخارجي المُسمّى، مع الاتصال به عند الضرورة باستخدام خيارات الخادم وتعيين
المستخدم الخاص بالمستخدم الحالي:
SELECT version()، ويخزّنه مؤقتًا طوال مدة
الاتصال.
clickhouse_query
driver الخاص بالخادم،
وبيانات الاعتماد وقاعدة البيانات وذاكرة التخزين المؤقت للاتصال.
الوسيط الأول هو اسم خادم أُنشئ باستخدام CREATE SERVER. يجب توفير
قائمة تعريف أعمدة (AS name(col type, ...)): يحتاج PostgreSQL إلى
معرفة بنية النتيجة قبل جلب الصفوف، ويجب أن تطابق الأعمدة التي يعيدها الاستعلام. تُحوَّل القيم
من ClickHouse إلى الأنواع المعلنة بالطريقة نفسها التي يُحوَّل بها عمود في جدول أجنبي.
أما العبارات التي لا تعيد نتائج، مثل DDL،
فلا تتطلب تعريفًا؛ نفّذها باستخدام
clickhouse_perform بدلًا من ذلك.
لا يملك أي دور صلاحية EXECUTE افتراضيًا؛ استخدم GRANT لمنح دور
إمكانية استخدام الدالة.
clickhouse_perform
clickhouse_query شكل نتيجة ليُصرَّح عنه. وتحدّد
الخادم بالطريقة نفسها التي يستخدمها clickhouse_query، مع إعادة استخدام driver،
وبيانات الاعتماد، وقاعدة البيانات، وذاكرة التخزين المؤقت للاتصال.
وبوصفها إجراءً، يجب استدعاؤها باستخدام CALL، وليس SELECT، ولا تُرجع
صفوفًا. لا يملك أي دور صلاحية EXECUTE افتراضيًا؛ استخدم GRANT لمنح دورٍ ما صلاحية
استخدام الإجراء.
دوال Pushdown
HAVING وWHERE). وتتوافق هذه المجموعة الفرعية مع
مكافئاتها في ClickHouse كما يلي:
abs: absfactorial: factorialmod(int2/int4/int8/numeric): modulopow&power(float8/numeric): powround: roundsin,cos,tan,atan,atan2,sinh,cosh,tanh,asinh,degrees,radians,pi: دوال الرياضيات في ClickHouse التي تحمل الاسم نفسه. لا يتم pushdown للدوالasinوacosوatanhوacosh: إذ يُصدر PG خطأً عند إدخال قيم خارج النطاق، بينما يعيد CH القيمةNaN.date_part:date_part('day'): toDayOfMonthdate_part('doy'): toDayOfYeardate_part('dow'): toDayOfWeekdate_part('year'): toYeardate_part('month'): toMonthdate_part('hour'): toHourdate_part('minute'): toMinutedate_part('second'): toSeconddate_part('quarter'): toQuarterdate_part('isoyear'): toISOYeardate_part('week'): toISOYeardate_part('epoch'): toISOYear
date_trunc:date_trunc('week'): toMondaydate_trunc('second'): toStartOfSeconddate_trunc('minute'): toStartOfMinutedate_trunc('hour'): toStartOfHourdate_trunc('day'): toStartOfDaydate_trunc('month'): toStartOfMonthdate_trunc('quarter'): toStartOfQuarterdate_trunc('year'): toStartOfYear
extract(field FROM source): نفس التعيينات كما فيdate_partdate(timestamp)&date(timestamptz): toDate (تُفكّك إلى الاسم المستعارdateفي CH)array_position: indexOf مع nullIf لتحويل0إلىNULL، واستخدام arraySlice عند وجود وسيطة ثالثة تحدد فهرس بدء البحث؛ لاحظ أنnanلا يطابق حاليًا أي قيمةarray_cat: arrayConcatarray_append: arrayPushBackarray_prepend: arrayPushFrontarray_remove: arrayRemovecardinality: lengtharray_length(array, 1):nullIf(length(array), 0)array_length&cardinality: lengtharray_to_string: arrayStringConcatstring_to_array: splitByStringsplit_part: splitByString + فهرسة المصفوفةtrim_array: arrayResizearray_fill: arrayWithConstantarray_reverse: arrayReversearray_shuffle: arrayShufflearray_sample: arrayRandomSamplearray_sort: arraySort / arrayReverseSortbtrim: trimBothltrim: trimLeftrtrim: trimRightconcat_ws: concatWithSeparatorlower(text): lowerUTF8upper(text): upperUTF8substring(text, ...)&substr(text, ...): substringUTF8substring(bytea, ...)&substr(bytea, ...): substringlength(text): lengthUTF8length(bytea)&octet_length: lengthreverse(text): reverseUTF8reverse(bytea): reversestrpos: positionUTF8regexp_like: matchregexp_match: extractGroups إذا كان التعبير النمطي يحتوي على تعبيرات فرعية بين قوسين؛ وإلا extractAll ثم تُقتطع باستخدام arraySlice.regexp_replace: replaceRegexpOne أو replaceRegexpOne عند وجود العلامةgregexp_split_to_array: splitByRegexpmd5: MD5encode(bytea, fmt)عندما يكونfmtثابتًا نصيًا (دون تمييز بين حالة الأحرف):encode(bytea, 'hex'): hex مُغلّفة بـ lower، لأن PostgreSQL يُنتج قيم hex بأحرف صغيرة.encode(bytea, 'base64'): base64Encode مُغلّفة بـ replaceRegexpAll لمحاكاة فاصل الأسطر بتنسيق MIME (RFC 2045) في PostgreSQL كل 76 حرفًا.encode(bytea, 'base64url')(PostgreSQL 19+): base64URLEncode، التي تطابق أبجدية URL في PostgreSQL وفق RFC 4648 من دون padding.
json_extract_path_text: صياغة العمود الفرعيjson_extract_path: toJSONString + صياغة العمود الفرعيjsonb_extract_path_text: صياغة العمود الفرعيjsonb_extract_path: toJSONString + صياغة العمود الفرعيbit_count(bytea): bitCountto_timestamp(float8): toDateTime64to_char(timestamp[tz], fmt): formatDateTime عندما يكونfmtثابتًا نصيًا وكانت كل كلمة مفتاحية فيه لها مقابل مطابق في ClickHouse. راجع to_char() ضمن ملاحظات التوافق للاطلاع على الكلمات المفتاحية المدعومة. بخلاف ذلك، تُقيَّم الدالة محليًا في PostgreSQL.statement_timestamp,transaction_timestamp, &clock_timestamp: nowInBlock64 (nowInBlock64(9, $session_timezone))CURRENT_DATE: now و toDate (toDate(now($session_timezone)))now,CURRENT_TIMESTAMP, &LOCALTIMESTAMP: now64 (now64(9, $session_timezone))CURRENT_TIMESTAMP(n)&LOCALTIMESTAMP(n): now64 (now64(n, $session_timezone))CURRENT_DATABASE: تُمرَّر كقيمة من دالة PostgreSQL.CURRENT_SCHEMA: تُمرَّر كقيمة من دالة PostgreSQL.CURRENT_CATALOG: تُمرَّر كقيمة من دالة PostgreSQL.CURRENT_USER: تُمرَّر كقيمة من دالة PostgreSQL.USER: تُمرَّر كقيمة من دالة PostgreSQL.CURRENT_ROLE: تُمرَّر كقيمة من دالة PostgreSQL.SESSION_USER: تُمرَّر كقيمة من دالة PostgreSQL.
معاملات Pushdown
- شريحة Array (
arr[L:U]): arraySlice @>(تحتوي المصفوفة على): hasAll<@(المصفوفة محتواة في): hasAll&&(تداخل المصفوفات): hasAny~(مطابقة تعبير نمطي): match!~(عدم مطابقة تعبير نمطي): match~*(عدم مطابقة تعبير نمطي دون مراعاة حالة الأحرف): match!~*(عدم مطابقة تعبير نمطي دون مراعاة حالة الأحرف): match->>(استخراج عنصر من JSON/JSONB كنص): sub-column syntax->(استخراج من JSON/JSONB): toJSONString + sub-column syntax
دلالات IN وNULL
IN وفق منطق ثنائي القيم: فعندما لا يجد الفحص
تطابقاً، يعيد 0 حتى عند وجود NULL، بينما يحسب PostgreSQL
NULL. وللحفاظ على دلالات PostgreSQL، يدفع pg_clickhouse عائلة IN
إلى المصدر عند استخدامها مع قائمة أو مصفوفة ثابتة (IN، NOT IN، = ANY، = ALL،
<> ANY، <> ALL) دون استثناء: إما الصيغة الأصلية أو منخفضة التكلفة عندما يمكنه
إثبات أن لا قيمة الفحص ولا أي عنصر في المصفوفة يمكن أن يكون NULL، أو صيغة CASE
محمية في الحالات الأخرى تتحقق من قيم NULL وقت التشغيل،
وتحسب الإجابة الدقيقة ثلاثية القيم في PostgreSQL (TRUE، FALSE، NULL)
في جميع السياقات، بما في ذلك مواضع القيم مثل قائمة SELECT أو
GROUP BY.
يُدفع أيضاً عامل التصفية NOT IN (SELECT ...) المستخدم مع الأعمدة القابلة لـNULL
إلى المصدر، ويُعاد تحويله إلى نص مع حواجز تعويضية تحافظ على سلوك PostgreSQL: فالمجموعة
التي تحتوي على NULL تستبعد كل صف، ولا تنجح قيمة فحص NULL إلا
مع مجموعة فارغة. يُحذف كل حاجز عندما يثبت تعريف NOT NULL
عدم الحاجة إليه. وعلى خلاف صيغ المصفوفة أعلاه، لا ينطبق هذا الحاجز إلا في شرط تصفية
عادي (أو تحت NOT)؛ وما زلنا لا ندفع
IN (SELECT ...) إلى المصدر (في موضع قيمة)، ولا أجسام الاستعلامات الفرعية
المجمّعة أو المجمّعة تجميعياً. يؤدي تعريف الأعمدة بأنها NOT NULL إلى زيادة الدفع إلى المصدر
إلى أقصى حد، إذ يتيح إرسال الصيغة الأرخص غير المحمية بدلاً من ذلك؛ ويطبّق IMPORT FOREIGN SCHEMA هذا تلقائياً على
أعمدة ClickHouse غير Nullable. ويتتبع الإثبات الثوابت غير NULL،
وأعمدة NOT NULL، والعمليات الحسابية الأساسية (+، -، *، و- الأحادية) عليها.
تفترض هذه القواعد الإعداد الافتراضي في ClickHouse، وهو transform_null_in = 0، الذي
يضبطه pg_clickhouse لكل استعلام عبر القيمة الافتراضية للمعلمة
pg_clickhouse.session_settings
حتى لا يتمكن ملف تعريف خادم ClickHouse من تغييره بصمت. يؤدي ضبط
transform_null_in = 1 إلى الإخلال بدلالات كل تعبير IN مدفوع إلى المصدر.
الدوال المخصصة
Pushdown الامتدادات
re2
@~→ matchre2match→ matchre2extract→ extractre2extractall→ extractAllre2regexpextract→ regexpExtractre2extractgroups→ extractGroupsre2replaceregexpone→ replaceRegexpOnere2replaceregexpall→ replaceRegexpAllre2countmatches→ countMatchesre2countmatchescaseinsensitive→ countMatchesCaseInsensitivere2multimatchany→ multiMatchAnyre2multimatchanyindex→ multiMatchAnyIndexre2multimatchallindices→ multiMatchAllIndices
intarray
idx→ indexOf
fuzzystrmatch
soundex: soundexlevenshtein(بوسيطتين): editDistanceUTF8
عمليات CAST ذات pushdown
CAST(x AS bigint) عند استخدام
أنواع بيانات متوافقة. أما مع الأنواع غير المتوافقة، فستفشل عملية الـ pushdown؛
فإذا كانت x في هذا المثال من نوع ClickHouse UInt64، فسيرفض ClickHouse
تحويل القيمة.
ولتنفيذ pushdown لعمليات CAST لأنواع البيانات غير المتوافقة، يوفّر pg_clickhouse
الدوال التالية. وهي تثير استثناءً في PostgreSQL إذا لم يُنفَّذ لها pushdown.
دوال التجميع التي تدعم pushdown
- any_value
- array_agg
- avg
- bit_and
- bit_or
- bit_xor
- bool_and / every
- bool_or
- count
- corr
- covarpop
- covarsamp
- min
- max
- stddev_pop
- stddev_samp / stddev
- string_agg
- sum
- var_op
- var_samp /variance
دوال التجميع المخصصة
Pushdown دوال التجميع المرتبة حسب المجموعة
ORDER BY الخاصة بها على أنها arguments. على سبيل المثال، query PostgreSQL هذه:
DESC وNULLS FIRST في ORDER BY
غير مدعومتين، وستؤديان إلى ظهور خطأ.
percentile_cont(double): quantilepercentile_cont(double[]): quantilespercentile_disc(double): quantileExactLowpercentile_disc(double[]): quantilesExactLow
دوال التجميع المخصصة للمجموعات المرتبة
quantile(double): quantilequantileExact(double): quantileExact
دوال التجميع المخصصة للمجموعات المرتبة
دوال النافذة pushdown
OVER (PARTITION BY ... ORDER BY ...)، بما في ذلك مواصفات الإطار عند الاقتضاء.
- row_number
- rank
- dense_rank
- ntile
- cume_dist
- percent_rank
- lead
- lag
- first_value
- last_value
- nth_value
min/max(مع عبارةOVER)
row_number وrank وdense_rank وntile وcume_dist
وpercent_rank) عبارة الإطار الخاصة بها عند pushdown، لأن ClickHouse
لا يقبل مواصفات الإطار لهذه الدوال.
ملاحظات حول التوافق
التعبيرات النمطية
-
يدعم PostgreSQL [التعبيرات النمطية وفق POSIX] بينما يدعم ClickHouse
التعبيرات النمطية وفق RE2. انتبه إلى اختلافات السلوك: استخدم RE2
عندما يتولى ClickHouse تقييم التعبير النمطي (على سبيل المثال، في
عبارة
WHERE) واستخدم POSIX عندما يتولى Postgres تقييمه (على سبيل المثال، في عبارةSELECT). -
يقوم pg_clickhouse بتمرير [مُعدِّلات Postgres] إلى التعبير النمطي في ClickHouse عبر إضافتها في بدايته داخل
(?). على سبيل المثال:يصبح -
خيارات سطر الأوامر الوحيدة التي يدعمها كلاهما، والتي يمكن بالتالي استخدامها عند تقييمها من قِبل
ClickHouse، هي:
لا يدعم RE2 سوى هذه العلامات؛ لا تستخدم أيًا من [علامات Postgres] الأخرى.
-
يلخّص هذا الجدول تأثير العلامات المختلفة (وكذلك عدم استخدام أي علامة،
وهو ما يعادل
s) عند مطابقة الأسطر الجديدة ونهايات الأسطر. لاحظ أنه في Postgres، تمنعmوpفئات المحارف المنفية ([^xyz]) من مطابقة سطر جديد، بينما لا تفعل نظيراتها في ClickHouse ذلك. وبخلاف ذلك، فإن السلوكيات في ClickHouse وPostgres متماثلة: - أي خيارات أخرى تُمرَّر إلى دوال التعبيرات النمطية ستمنع تنفيذ الدالة على المصدر البعيد.
-
الاستثناء هو
regexp_replace()، إذ يدعم أيضًا الخيارg. وعندما يكونgمفعّلًا، يستخدم pg_clickhousereplaceRegexpAll()بدلًا منreplaceRegexpOne()ويزيل هذا الخيار قبل إضافة الخيارات الأخرى كبادئة. -
تدعم وسيطة الاستبدال في
regexp_replace()في Postgres الرمز\&للإشارة إلى المطابقة بالكامل، بينما يدعم ClickHouse الرمز\0للمطابقة بالكامل. احرص على استخدام\0عندما تُنفَّذ الدالة في ClickHouse. -
تعيد
regexp_matchفي Postgres القيمةNULLعند عدم وجود أي تطابقات، بينما تعيد التعبيرات التي يُدفَع تنفيذها إلى النظام البعيد مصفوفة فارغة. استخدمCOALESCE()لإرجاع مصفوفة فارغة بدلًا منNULLحتى تتمكن من مقارنة القيم المعادة بشكل متوافق. على سبيل المثال:
to_char()
to_char() الخاص بـ timestamp وtimestamp with time zone
إلى ClickHouse formatDateTime إلا عندما تكون وسيطة التنسيق
ثابتًا نصيًا غير NULL، ويكون لكل keyword في PostgreSQL
مكافئ مماثل تمامًا على مستوى البايت في ClickHouse. وإذا كان التنسيق ديناميكيًا
(أي ليس Const)، أو كان يحتوي على أي keyword أو modifier غير مدعوم، فإن
الاستدعاء يعود إلى التقييم المحلي في PostgreSQL — ولا تُجرى مطلقًا محاولة
لـ pushdown مع ترجمة جزئية، بحيث يظل الناتج متوافقًا مع PG.
أما صيغ to_char() ذات الوسيطتين المطبَّقة على numeric وinterval وأنواع
أخرى غير timestamp، فلا يُجرى لها pushdown مطلقًا؛ إذ إن ClickHouse formatDateTime لا
ينسّق إلا قيم التاريخ والوقت.
الرموز المترجمة
النصوص المقتبسة والقيم الحرفية
"..." يُمرَّر كما هو حرفيًا، مع مضاعفة أي % حرفية
إلى %% لتحييد بادئة المحدِّد في ClickHouse. كذلك، فإن \" خارج علامات
الاقتباس يُمرَّر أيضًا باعتباره " حرفيًا. وداخل "..."، لا يُستخدم
backslash إلا لإلغاء المعنى الخاص لـ "؛ أما تسلسلات backslash الأخرى
فتُعامَل كنص حرفي.
David E. Wheeler