تغييرات غير متوافقة مع الإصدارات السابقة
التغييرات في الاستعلامات والدوال والصيغة
- بالنسبة إلى طرق العرض التي يكون متنها استعلام
SELECTبسيطًا على جدولDistributedواحد، يُرحَّل الآن الاستعلام الخارجي بأكمله إلى المقاطع (عبر الإعداد الجديدoptimize_trivial_view_pushdown_to_distributed، المُفعَّل افتراضيًا). يُغيّر ذلك السلوك الملحوظ لطرق العرض هذه: إذ تُمرَّر الآنFINALوSAMPLEالمكتوبتان على مرجع العرض إلى الجدول المحلي في المقطع بدلًا من تجاهلهما، ولم يعد يُبلَّغ عنextremesفي العناقيد ذات المقطع الواحد. اضبطoptimize_trivial_view_pushdown_to_distributed = 0لاستعادة السلوك السابق. #101791 (simonmichal). - تستخدم أجزاء التصحيح الخاصة بعمليات
UPDATEالخفيفة الآن صيغة تخزين جديدة v2 على القرص، مرتبة حسب (sorting_key..., _block_number, _block_offset) وتُطبَّق باستخدام خوارزمية دمج جديدة. أصبحت ذروة استهلاك الذاكرة محدودة بأطول تسلسل من القيم المتساوية في مفتاح الترتيب بدلًا من حجم التصحيح كاملًا، ولم تعد التحديثات التي تتجاوز حدود الدمج تلجأ إلى التطبيق عبر Join في الذاكرة. تظل أجزاء التصحيح ذات الصيغة القديمة قابلة للقراءة. أثناء الترقية التدريجية من إصدار أقدم من 26.8، أبقِ علىpatch_parts_version = 'v1'أو استخدم الإعدادcompatibilityإلى أن تكتمل ترقية جميع النسخ المتماثلة. #103182 (CurtizJ). - يرفض
AggregatingMergeTreeالآن، عند إنشاء الجدول، المخططات التي تحتوي على عمود ليس جزءًا من مفتاح الترتيب ولا مقياسًا لحالة تجميع (AggregateFunction/SimpleAggregateFunction). إذ تُطوى مثل هذه الأعمدة بصمت إلى قيمة عشوائية أثناء عمليات الدمج في الخلفية، مما يؤدي إلى نتائج خاطئة للاستعلامات التي تنفّذGROUP BYعليها أو تُصفّي بها. اضبطallow_dimensions_outside_sorting_key = 1لاستعادة السلوك السابق. #108087 (alexey-milovidov). - يستخدم ClickHouse الآن دائمًا تجزئة موحّدة لإزالة تكرار الإدراج في كلٍّ من عمليات الإدراج المتزامنة وغير المتزامنة، وأُزيلت سلوكيات إزالة التكرار القديمة الخاصة بكل عملية إدراج. يُبقى على إعداد الخادم
insert_deduplication_versionبوصفه ضمانة للترحيل: إذ يرفض الخادم البدء إذا ضُبط على قيمة قديمة (old_separate_hashesأوcompatible_double_hashes). للترقية من إصدار كان يستخدم قيمة قديمة، شغّل أولًا إصدارًا يدعمcompatible_double_hashes(الذي يكتب كلتا التجزئتين القديمة والموحّدة). بالنسبة إلى الجداول المتماثلة، شغّله مدةً لا تقل عنreplicated_deduplication_window_seconds(ساعة واحدة افتراضيًا؛ إذ تحتفظ النوافذ الافتراضية بالتجزئات الموحّدة لجميع عمليات الإدراج خلال تلك النافذة، وهو ما يُعدّ كافيًا لحلقة إعادة محاولة الإدراج). أما الجداول غير المتماثلة التي يكون فيهاnon_replicated_deduplication_window> 0، فإن تلك النافذة تعتمد على العدد لا على الوقت، لذا شغّلcompatible_double_hashesلعدد من عمليات الإدراج لا يقل عن تلك القيمة. ثم أزِل الإعداد (أو اضبطه علىnew_unified_hash) قبل الترقية إلى هذا الإصدار. #108361 (CheSema). - أصبحت قيمة الإعداد
use_legacy_to_timeالآن0افتراضيًا، لذا تحوّل الدالةtoTimeالقيم إلى نوع البياناتTimeبدلًا من تحويل التاريخ والوقت إلى تاريخ ثابت. لا يزال السلوك القديم متاحًا عبر الدالةtoTimeWithFixedDateأو بضبطuse_legacy_to_time = 1. #108729 (alexey-milovidov). - أصبحت نماذج Naive Bayes (التي تستخدمها
naiveBayesClassifier) تُهيَّأ الآن كقاموس بتخطيطNAIVE_BAYES، يُبنى عند التحميل من جدول يحتوي على أعداد n-gram المجمّعة مسبقًا لكل فئة، بدلًا من التهيئة السابقة على جانب الخادم (ملف إعداد XML يشير إلى ملفات نماذج.binمُسلسَلة)، وهي تهيئة لم تعد مدعومة، لذا يجب إعادة إنشاء النماذج الحالية كقواميس. أُضيفت ثلاث دوال جديدة إلى جانبnaiveBayesClassifier: تُعيدnaiveBayesClassifierWithProbالفئة المتوقعة مع احتماليتها، وتُعيدnaiveBayesClassifierWithAllProbsجميع الفئات مع احتمالية كل منها، وتُقسّمnaiveBayesNgramsالنص إلى n-grams بالطريقة نفسها التي يتبعها القاموس، وذلك لبناء بيانات التدريب من نص خام مُصنَّف. علاوة على ذلك، طُبّقت عدة تحسينات على الأداء: فعلى نموذج لغوي ثلاثي قائم على نقاط الترميز بحجم 9.7 MiB، أصبح يستهلك ذاكرة أقل بنحو 49 ضعفًا (من 1.84 GiB إلى 38 MiB)، ويُحمَّل أسرع بنحو 11 ضعفًا، ويُصنِّف أسرع بنحو 11 ضعفًا. #108773 (nihalzp). - تغيّرت القيمة الافتراضية للإعداد
max_insert_threadsمن1(دون توازٍ) إلىauto، التي تُحدَّد بعدد أنوية المعالج المتاحة للخادم (وتُخفَّض عند ضغط الذاكرة وفقًا لـmax_insert_threads_min_free_memory_per_thread). وبذلك يُنفَّذINSERT SELECTبالتوازي افتراضيًا، ويمكن أيضًا موازاة جانب الكتابة في عمليةINSERTعادية مؤهلة عندما يكون مسار الكتابة في الوجهة قادرًا على التوزيع بأمان. وقد يغيّر ذلك عدد الأجزاء المُنشأة وترتيب الصفوف المُدرَجة. لاستعادة السلوك السابق، اضبطmax_insert_threadsعلى1، أو اضبطcompatibilityعلى إصدار أقدم من26.8. #109000 (alexey-milovidov). #109006 (alexey-milovidov). - أصبحت قراءة
Tupleغير مغلّف في CSV تأخذ حقلًا واحدًا لكل عنصر في كل موضع، بحيث يُعدّ\Nفي حقل عنصر من المستوى الأعلى قيمةً لذلك العنصر ويُطبَّق عليهinput_format_null_as_default. في السابق، كان\Nالوارد في البداية يُفسَّر على أن العمود بأكمله فارغ، فيُستبدل الصف بالقيمة الافتراضية للعمود، ثم يفشل تحليل خلايا العناصر المتبقية. هذا التغيير غير متوافق مع الإصدارات السابقة بالنسبة إلى الصف الذي يوفّر حقلًا واحدًا لـTupleغير مغلّف بأكمله: إذ أصبح الآن ينقصه باقي العناصر فيُرفض، أما في حالةTupleذي العنصر الواحد، حيث يتساوى عدد الحقول في الحالتين، فإنه يُنتج بصمت القيمة الافتراضية للعنصر بدلًا منDEFAULTالخاص بالعمود. اضبطinput_format_csv_deserialize_separate_columns_into_tuple = 0لقراءة هذا الحقل كعمود كامل كما في السابق. #109744 (groeneai). - أُضيفت العبارة
VALID FOR <interval>إلىCREATE USERوALTER USERكاختصار لـVALID UNTIL. يُحسب موعد انتهاء الصلاحية عند تنفيذ الاستعلام بإضافة الفاصل الزمني المحدد إلى الوقت الحالي، ويُخزَّن بصيغةVALID UNTIL. أصبح العمودvalid_untilفي الجدولsystem.usersمن النوعArray(DateTime64(0))بدلًا منArray(DateTime)، كي تُمثَّل المواعيد التي تتجاوز عام 2106 بدقة؛ ويجب أن تتعامل الأدوات التي تقرأ هذا العمود مع النوع الجديد. #110171 (alexey-milovidov). - أصبح
EXPLAIN SYNTAXيُعيد الاستعلام المُعاد تنسيقه كسجلStringواحد (يتضمن فواصل أسطر) بدلًا من سجل لكل سطر، بحيث يكون إخراجه صفًا واحدًا قابلًا للاسترجاع والاستخدام المباشر (على سبيل المثال، يُعيدSELECT count() FROM (EXPLAIN SYNTAX ...)القيمة1). ويُتحكَّم في ذلك عبر الخيار الجديدsingle_recordالذي قيمته الافتراضية1؛ اضبطsingle_record = 0لاستعادة الإخراج السابق بسجل لكل سطر. أما أنواعEXPLAINالأخرى (PLAN/PIPELINE/AST) فتحتفظ بإخراجها الشجري سطرًا بسطر. #110479 (alexey-milovidov). - لم تعد الدالة
hasColumnInTableتقبل الوسيطات الاختياريةhostnameوusernameوpasswordللتحقق من وجود عمود على خادم بعيد عشوائي؛ ولم تبقَ سوى الصيغةhasColumnInTable(database, table, column). كان الوضع البعيد المُزال يشكّل خطرًا أمنيًا، إذ كان يتيح لأي مستخدم فتح اتصالات صادرة إلى مضيفات عشوائية، ويُسرّب بيانات الاعتماد إلى سجلات الاستعلامات، ولم يكن مقيّدًا بأي امتياز. #110881 (alexey-milovidov). - أصبح محركا قواعد البيانات
PostgreSQLوMaterializedPostgreSQLيلتزمان بتهيئةremote_url_allow_hostsالخاصة بالخادم، على غرار محرك الجداولPostgreSQLودالة الجدولpostgresqlوالقواميس المُنشأة عبر DDL. تُطبَّق هذه السياسة عند تنفيذCREATE DATABASEوعند تنفيذ المستخدم لـATTACH DATABASE: فإذا كانتremote_url_allow_hostsمهيّأة على خادمك، فسيُرفض إنشاء قاعدة بياناتPostgreSQLأوMaterializedPostgreSQLأو إرفاقها إذا كانت تشير إلى مضيف خارج القائمة المسموح بها، مع الخطأUNACCEPTABLE_URL. أما قواعد البيانات الموجودة مسبقًا فتستمر في التحميل عند بدء تشغيل الخادم، كي لا تتسبب الترقية في تعذّر إقلاع الخادم. #111135 (alexey-milovidov). - أُزيل القارئ والكاتب المعتمدان على مكتبة Apache Arrow للصيغتين
ArrowوArrowStream، وأصبح التنفيذ الأصلي في ClickHouse، وهو الافتراضي منذ الإصدار 26.7، التنفيذ الوحيد. أصبح الإعدادانinput_format_arrow_use_native_readerوoutput_format_arrow_use_native_writerمتقادمين: فهما لا يزالان مقبولين لكن دون أي تأثير، ولذا فإن الاستعلام الذي كان يضبطهما على0لفرض استخدام تنفيذ Apache Arrow سيستخدم الآن التنفيذ الأصلي. #111996 (alexey-milovidov). - لم يعد من الممكن تحديد بيانات اعتماد TLS لمصدر MySQL (
ssl_caوssl_certوssl_key) كمسارات ملفات من خلال SQL — سواء في مجموعة مسماة (named collection) مُنشأة باستخدامCREATE NAMED COLLECTION، أو كوسيطة في استعلام، أو في استعلامCREATE DICTIONARY— لأن الخادم يفتح هذه الملفات بامتيازاته الخاصة. تظل المسارات مدعومة في ملف تهيئة الخادم. أما في الحالات الأخرى، فمرّر محتوى الشهادة أو المفتاح في المعاملات الجديدةssl_ca_pemوssl_cert_pemوssl_key_pem، التي تُخفى في السجلات وفي استعلاماتSHOWكما تُخفى كلمات المرور. #112070 (alexey-milovidov). - أصبح
disable_insertion_and_mutationيمنع الاستهلاك في الخلفية من جداولKafkaوRabbitMQوNATSمع الإبقاء على السماح بالكتابة المباشرة إلى التخزين الخارجي. ولا تُهيّئ جداولKafka2وNATSوRabbitMQالخاضعة لهذا القيد المستهلكين عند تنفيذSELECTمباشر. كما أصبح الإعدادmessage_queue_disable_insertionالمُضاف مؤخرًا يتطلب إعادة تشغيل الخادم. #113660 (cwurm). - أصبح استخدام
PARTITION BYأوORDER BYضمن نافذة على عمود من نوعAggregateFunctionيُرفض مع الخطأILLEGAL_COLUMN، كما هو الحال أصلًا معORDER BYعلى المستوى الأعلى لمثل هذا العمود. في السابق، كان مثل هذا الاستعلام مقبولًا لدى محلل واحد على الأقل، وكانPARTITION BYضمن النافذة يُقسّم البيانات بشكل مختلف بحسب قيمةmax_threads. ويشمل هذا الرفض أيضًا الحالة المتداخلة ضمنArrayأوTupleأوMapأوVariantأوSimpleAggregateFunction. ولا يتأثر بذلكSimpleAggregateFunctionعلى نوع عادي، ولاQBit، ولاGROUP BYوDISTINCTعلى حالة. #113878 (groeneai). - إصلاح عمليات التحقق من الصلاحيات لأوامر
SYSTEM ... CACHE ON CLUSTER، إذ كانت تتطلب مجموعة الامتيازاتSYSTEM DROP CACHEبدلًا من امتياز الأمر المعني، مما أدى إلى منع من يملكون امتيازًا دقيقًا واحدًا لذاكرة التخزين المؤقت، وفي الوقت نفسه سمح لمن يملك المجموعة بتشغيلSYSTEM SYNC FILESYSTEM CACHE ON CLUSTERدون امتلاكSYSTEM SYNC FILESYSTEM CACHE. #114042 (groeneai). - يقبل محرك الجدول
NATSالآن بيانات الاعتماد مضمّنةً مباشرةً في الإعداد الجديدnats_credentials(بالحمولة نفسها التي يتضمنها ملف.creds)، ولم يعد يقبلnats_credential_fileمن SQL: إذ يشير هذا المسار إلى ملف على filesystem الخادم، ويفتحه الخادم بامتيازاته الخاصة، لذا لا يمكن تحديده إلا ضمن named collection معرّفة في ملف تهيئة الخادم، أو بوصفهnats.credential_fileفي تهيئة الخادم نفسها. ويمكن للاستعلام أن يستبدل بهذا المسار المُهيّأ بيانات الاعتماد المضمّنةnats_credentials، ما لم يكن مسؤول التشغيل قد ثبّته باستخدام<nats_credential_file overridable="false">. وتظل الجداول التي أُنشئت قبل فرض هذا القيد تعمل بعد الترقية. #114644 (alexey-milovidov).
تغييرات أنواع البيانات والصيغ
- رفض صيغة أرشيف النسخ الاحتياطي
zip/zipxللنسخ الاحتياطية المخزنة على التخزين الكائني — سواء الوجهات المباشرةS3(...)/AzureBlobStorage(...)أو وجهاتDisk(...)المدعومة بـ S3 أو Azure — في كلٍّ منBACKUPوRESTORE. تتطلب صيغة Zip التنقّل داخل الملف لقراءة الدليل المركزي، وهي عملية بطيئة جدًا عبر التخزين الكائني. استخدم بدلًا من ذلك صيغة قائمة على tar مثلtar.gz. #101770 (Onyx2406). - توسيع النطاق المدعوم لـ
DateTime64من[1900-01-01, 2299-12-31]إلى[0000-01-01, 9999-12-31]. أصبحت القيم الواقعة خارج النطاق السابق تُحسب الآن بشكل صحيح (عبر cctz) بدلًا من حصرها عند حدود النطاق. أما مع الدقة 8 أو 9 فيبقى النطاق أضيق، لأن النبضات تُخزَّن بنوعInt64(فمع الدقة بالنانوثانية يظل الحد الأقصى2262-04-11). التوافق مع الإصدارات السابقة: إذا كنت تستخدم سابقًا قيم تاريخ ووقت خارج النطاق، واعتمدت على قواعد التشبّع الخاصة جدًا داخل النطاق القديم، فضع في اعتبارك أن النتائج ستتغير الآن لتصبح أدق. #107907 (alexey-milovidov). - يُفسَّر الآن رقم JSON غير المحاط بعلامات اقتباس لعمود
DateTime64/DateTimeفيJSONEachRowوالصيغ المشابهة على أنه طابع زمني لـ Unix (عدد الثواني منذ بداية الحقبة) مع دقة اختيارية لأجزاء الثانية، بما يتسق مع صيغةValuesوCASTوtoDateTime64. في السابق، كان الرقم الذي يحتوي على جزء كسري (مثل1703363853.035) يُرفض مع الخطأCANNOT_PARSE_INPUT_ASSERTION_FAILED، وكان العدد الصحيح المجرد (مثل1703363853) يُقرأ كقيمة خام مُدرَّجة لـDateTime64، مما ينتج طابعًا زمنيًا يبدأ بـ1970-.... يُعد هذا تغييرًا غير متوافق مع الإصدارات السابقة بالنسبة للأعداد الصحيحة غير المحاطة بعلامات اقتباس المُدخلة إلى أعمدةDateTime64؛ ولا تتأثر السلاسل النصية المحاطة بعلامات اقتباس ولا مخرجات JSON الخاصة بـ ClickHouse (المحاطة دائمًا بعلامات اقتباس). #108091 (alexey-milovidov). - يُجري برنامج الترميز التجريبي
ALPالآن عمليات تحجيمFloat32الحسابية باستخدامFloat64، مما يزيل الاستثناءات على البيانات العشرية ويحسّن نسب الضغط بشكل ملحوظ. #111627 (rienath). - رفض قيم إعدادات الفترات الزمنية (بالمللي ثانية/الثواني) التي تتجاوز سعة Int64 بالميكروثانية #112757 (azat).
- أصبح بإمكان المقاييس غير المتزامنة الآن أن تكون من نوع البيانات
Map، وحُوِّلت المقاييس الخاصة بكل نواة CPU وبكل جهاز إلى مقاييس مفردة من نوع مفتاح-قيمة: فقد أصبحتOSUserTimeCPU0وOSUserTimeCPU1و… مقياسًا واحدًا هوOSUserTimeCPUيحتوي على Map تربط رقم نواة CPU بالقيمة (وينطبق الأمر نفسه على مقاييسOS*TimeCPU*الأخرى، وCPUFrequencyMHz_*، وTemperature*، وEDAC*، وBlock*_*، وNetwork(Receive|Send)*_*، وDisk*_*، و*BlobsQueueEstimate، وAsyncLogging*QueueSize). يحتويsystem.asynchronous_metricsعلى عمود جديدkey_values Map(LowCardinality(String), Float64)(وتكون قيمة العمودvalueهيNaNلهذه المقاييس)، ويسجّلهاsystem.asynchronous_metric_logبصف واحد لكل مفتاح باستخدام عمودkeyجديد، وتُصدّرها نقطة نهاية Prometheus مع تسمية (مثلClickHouseAsyncMetrics_BlockReadBytes{device="sda"})، ويرسلهاMetricsTransmitterالخاص بـ Graphite بالشكل<prefix>.<Metric>.<key>. إذا كان نظام المراقبة لديك يقرأ أسماء المقاييس القديمة، فاضبطasynchronous_metrics_key_values_modeعلىlegacy_namesللإبقاء عليها، أو علىbothخلال فترة الترحيل؛ ويمكنك تطبيق إعداد الخادم هذا باستخدامSYSTEM RELOAD CONFIGدون الحاجة إلى إعادة التشغيل. #115333 (alexey-milovidov). #116791 (alexey-milovidov). - تستخدم أقراص تخزين الكائنات الآن افتراضيًا المعاملات الأصلية لتخزين البيانات الوصفية، مما يحسّن اتساق تحديثات بياناتها الوصفية. #89658 (Michicosun).
تغييرات الإعدادات والتهيئة
- أُزيلت الدوال
snowflakeToDateTimeوsnowflakeToDateTime64وdateTimeToSnowflakeوdateTime64ToSnowflakeالتي تم إهمالها منذ مدة طويلة. فقد أُهملت منذ الإصدار v24.6 لصالحsnowflakeIDToDateTimeوsnowflakeIDToDateTime64وdateTimeToSnowflakeIDوdateTime64ToSnowflakeID، وهي التي ينبغي استخدامها بدلًا منها. كما أصبح الإعدادallow_deprecated_snowflake_conversion_functions(الذي كان يُستخدم لإعادة تفعيلها) متقادمًا ولم يعد له أي أثر. #108711 (alexey-milovidov). - وُسِّع النطاق المدعوم للنوع
Date32من[1900-01-01, 2299-12-31]إلى[0000-01-01, 9999-12-31]ليطابق نطاقDateTime64. وباتت عمليات التحليل والتحويل تقبل النطاق الموسَّع بدلًا من قصّ القيم بصمت عند الحدود القديمة. ملاحظات حول التوافق مع الإصدارات السابقة: في التحويل العدديtoDate32(N)، أصبحت القيم الواقعة ضمن[120530, 2932896]تُفسَّر على أنها أرقام أيام (تواريخ من2300-01-01إلى9999-12-31) بدلًا من طوابع زمنية لـ Unix في مطلع عام 1970، تماشيًا مع القاعدة القائلة إن الرقم الذي يقع ضمن نطاق أرقام الأيام يُعَدّ رقم يوم؛ أما الأرقام الأصغر من رقم يوم0000-01-01والطوابع الزمنية التي تتجاوز9999-12-31فتُقيَّد عند الحدود الجديدة. #111534 (alexey-milovidov).
تغييرات أخرى غير متوافقة مع الإصدارات السابقة
- لم تعد الدالتان
arrayIntersectوarraySymmetricDifferenceتتعاملان مع القيمة المكررة داخل وسيطة واحدة كما لو أنها وردت في عدة وسيطات. لذا قد تُرجع الاستعلامات التي تعتمد على السلوك السابق نتائج مختلفة الآن: فالدالةarrayIntersect([1], [2], [1, 1])تُرجع[]بدلًا من[1]، وarrayIntersect([1, 2], [2], [1, 1, 2])تُرجع[2]بدلًا من[1, 2]، وarraySymmetricDifference([1], [2], [1, 1])تُرجع[2, 1]بدلًا من[2]. أما في حالةarraySymmetricDifferenceفتكفي وسيطتان لظهور الاختلاف: إذ تُرجعarraySymmetricDifference([1], [2, 2])القيمة[2, 1]بدلًا من[1]. وأصبحت القيمة لا تُحتسب لوسيطة ما إلا إذا كانت موجودة في كل الوسيطات التي تسبقها، وبذلك تحتوي النتيجة على القيم الموجودة في جميع الوسيطات تحديدًا. وضمن التغيير نفسه، أصبحتarrayIntersectتبني جدول التجزئة الخاص بها من أصغر وسيطة بدلًا من جميع الوسيطات، مما يجعلها أسرع بما يصل إلى 1.85 مرة ويقلل استهلاكها للذاكرة بمقدار الثلث عندما تتفاوت أحجام الوسيطات تفاوتًا كبيرًا. ولا تتأثرarrayUnionبهذا التغيير. #113021 (alexey-milovidov). - تم إهمال نوع إحصاءات الأعمدة
minmax. #108680 (hanfei1991). - إصلاح التحقق من صلاحية الوصول للأمر
SYSTEM PREWARM PRIMARY INDEX CACHE ... ON CLUSTER، الذي كان يتطلب عن طريق الخطأ الامتيازSYSTEM PREWARM MARK CACHEبدلًا منSYSTEM PREWARM PRIMARY INDEX CACHE. #109198 (Algunenano). - إصلاح الأمرين
SYSTEM STOP/START CLEANUPوSYSTEM STOP/START VIRTUAL PARTS UPDATE ON CLUSTERاللذين كانا يتطلبان الامتيازSYSTEM PULLING REPLICATION LOGبدلًا منSYSTEM CLEANUP/SYSTEM VIRTUAL PARTS UPDATE. #110289 (groeneai). - أصبح نمط glob
/(أي عدد من الأدلة) يطابق الدليل نفسه أيضًا. ففي السابق، لم يكن/في أنماط glob يُعامَل كحالة خاصة، لذا لم يكنdata/**/file.txtيطابقdata/file.txt(دون أي مستوى من الأدلة). #97676 (alexey-milovidov).
الميزات الجديدة
الدوال وأنواع البيانات
- أُضيفت الدالتان
parseQueryToJSONوformatQueryFromJSONلتسلسل أشجار AST وإلغاء تسلسلها بصيغة JSON، إلى جانب لهجة تجريبيةclickhouse_jsonتُفعَّل عبرenable_json_ast_dialect. #100412 (alexey-milovidov). #113480 (fm4v). - أُضيف جدول النظام
system.stemmersالذي يعرض جميع لغات المُجذِّرات المتاحة التي يمكن تحديدها للدالةstem. #100611 (Ergus). - أُضيف دعم للعاملَين اللاحقَين
AT TIME ZONEوAT LOCALمن SQL القياسية بوصفهما صياغة مختصرة لـtoTimeZone. أصبح التعبيرexpr AT TIME ZONE zoneمكافئًا لـtoTimeZone(expr, zone)، والتعبيرexpr AT LOCALمكافئًا لـtoTimeZone(expr, timeZone()). #106092 (lvzhipin03). - أصبح محرك الجدول
URLودالة الجدولurlيوجّهان الطلبات إلى الواجهة الخلفية المناسبة بحسب مخطط URL: إذ يتولى المحركFileالمخططfile://، ويتولىS3المخططاتs3:///gs:///gcs:///oss://، ويتولىAzureBlobStorageالمخططاتaz:///azure:///abfss:///abfs://، ويتولىHDFSالمخططhdfs://، بينما يواصل المحركURLمعالجةhttp(s)://كما في السابق. يُطبَّق الإعدادurl_baseقبل توجيه المخطط. لا تُوجَّه إلا مخططات S3 التي يحلّهاurl_scheme_mappersالافتراضي؛ أما مخططات المزوّدين الأخرى المتوافقة مع S3 (cos،obs، …) فلا تُوجَّه، ويلزم استخدام المحرك/الدالةs3مباشرةً معها. #106093 (alexey-milovidov). - أُضيفت الدالة
dotProductTransposed(واسمها البديلscalarProductTransposed) التي تحسب الضرب الداخلي التقريبي بين عمودQBitومتجه مرجعي، لتُكمّل الدالتين الحاليتينL2DistanceTransposedوcosineDistanceTransposed. #108100 (alexey-milovidov). - أُضيفت معلمة stride اختيارية إلى نوع البيانات
QBit(QBit(T, dimension, stride)) تخزّن مجموعات الأبعاد في تدفقات منفصلة، بحيث يستطيع البحث المتجهي قراءة الأبعاد الأولى وحدها بكفاءة (مثلًا مع تضمينات Matryoshka). وتقبل دوال المسافة المنقولة وسيطًا رابعًا اختياريًاused_dimsلقراءة عدد أقل من الأبعاد. #108103 (alexey-milovidov). - أُضيف دعم لنوع العنصر
Int8في نوع البياناتQBit، مما يتيح تخزين متجهات الأعداد الصحيحة المُكمَّمة ذات 8 بتات وإجراء البحث المتجهي بالمسافة المنقولة (L2DistanceTransposed،cosineDistanceTransposed) عليها. #108105 (alexey-milovidov). - دالة جديدة
randomHadamardTransform(vector[, seed[, output_dims]]): تحويل Hadamard عشوائي حتمي لمتجه أعداد عشرية، وهو دوران متعامد يحافظ على المعيار، ويفيد في المعالجة المسبقة للتضمينات قبل التكميم، كما يمكن استخدامه (عند اقتطاعه) إسقاطًا عشوائيًا من نوع Johnson–Lindenstrauss / Hadamard العشوائي المُعايَن جزئيًا. #108227 (alexey-milovidov). - تنفيذ الدالة التجميعية
mergedJSONPatchلتجميع تصحيحات الدمج وفق RFC 7396 على قيم JSON، مع دعم دمج الحالات واستخدامها مع AggregatingMergeTree. يمكن للمستخدمين تجميع عمود JSON باستخدام طابع زمني أو عمود ترتيب آخر مفتاحًا للفرز للحصول على أحدث حالة. #108349 (larryluogit). - أُضيفت الدالة
xxHash64Spark، التي تحسب قيمxxHash64المتوافقة مع Spark للمدخلات من النوعStringوNULLباستخدام البذرة42، وتُرجع قيمة من النوعInt64. #108436 (lalitium). - أُضيفت الدالة
digits(n, offset[, length])التي تُرجع العدد المأخوذ منnبدءًا من الموضعoffset(1-indexed)وبعدد أرقام يساويlength. وإذا لم تُحدَّد قيمةlength، تُرجع الدالة العدد من الإزاحة حتى النهاية. #109012 (1000ms). - أُضيفت الدالة الحسابية
sqrلحساب مربع العدد. #109061 (lalitium). - أُضيفت دوال المسافة المنقولة المُكمَّمة
cosineDistanceTransposedQuantizedوL2DistanceTransposedQuantizedوdotProductTransposedQuantizedالتي تعمل علىQBit(Int8)مكوَّن من رموز Lloyd-Max الناتجة عنquantizeBFloat16ToInt8، مع إلغاء تكميم الرموز المخزَّنة أثناء التنفيذ. ويُعامَل متجه المرجع ذو الفاصلة العائمة على أنه الاستعلام بالدقة الكاملة، وتجري المقارنة بدقةFloat32(إذ تُخفَّض دقة استعلامFloat64)؛ أما المرجع من النوعArray(Int8)فيُلغى تكميمه هو أيضًا، للحصول على مسافة متماثلة بين قيمتين مُكمَّمتين. #109405 (alexey-milovidov). - أُضيفت دالة جديدة
dictGetRootتُرجع السلف الأعلى (الجذر) لمفتاح ما في قاموس هرمي، وهي بديل مختصر لـdictGetHierarchy(dict_name, key)[-1]. #109459 (alexey-milovidov). - أُضيفت دالة الجدول
mergeTreeCodecBlockCounts(database, table)التي تعرض، لكل (جزء بيانات، عمود، دفق فرعي) في جدولMergeTree، عدد الكتل المضغوطة التي تستخدم كل مرمِّز. #109623 (rienath). - أُضيفت الدالة
notHas، وهي نفي الدالةhasللمصفوفات والخرائط وJSON. وعندما يكون نطاق البحث مصفوفة ثابتة، يُعيدoptimize_rewrite_has_to_in(المُفعَّل افتراضيًا) كتابةnotHas(constant_array, x)على صورةx NOT IN constant_array، فتُنفَّذ عبر البحث في مجموعة، ويمكنها تقليم البيانات باستخدام فهرس المفتاح الأساسي كما هو الحال معNOT IN. #109926 (nihalzp). - أُضيف نوع البيانات الجغرافي
MultiPoint، المخزَّن على هيئةArray(Point)، وأُدرج ضمن النوعGeometry. #109951 (davidmenggx). - أصبحت الدالتان
arrayElement(المعاملvec[n]) وarraySliceتدعمان نوع البياناتQBit: إذ تُرجعqbit[n]العنصر رقم n من المتجه بالدقة الكاملة، وتُرجعarraySlice(qbit, offset, length)إسقاطًا على مجموعة فرعية من الأبعاد. ولا تقرأ أيٌّ منهما إلا مستويات البتات الخاصة بمجموعات stride التي تحتاجها، كما أن الشرائح المحاذية لحدود مجموعات stride تعيد استخدام الدفقات المخزَّنة دون نسخها. #109953 (Utkal059). - أُضيف مُقسِّم الرموز
splitByRegexpللفهارس النصية وللدالةtokens. ويقسم هذا المُقسِّم الإدخال إلى رموز مستخدمًا تعبيرًا نمطيًا فاصلًا، مثلtokenizer = splitByRegexp('[^\p{L}\p{N}#+]+')، مما يتيح الإبقاء على الرموز التي تحتوي على محارف خاصة مثلC++أوC#، والتي قد تجزِّئها مُقسِّمات الرموز الأخرى. #110002 (Ergus). - أُضيفت الدالتان
geometryIntersectCartesianوgeometryIntersectSphericalاللتان تُحدِّدان ما إذا كان شكلان هندسيان متقاطعين. وخلافًا للدالتينpolygonsIntersectCartesian/polygonsIntersectSpherical، تقبل هاتان الدالتان أي نوع بيانات هندسي (Point، وLineString، وMultiLineString، وRing، وPolygon، وMultiPolygon)، بما في ذلك النوع العامGeometry، ويجوز أن تكون الوسيطتان من نوعين مختلفين. #110062 (alexey-milovidov). - يدعم قارئ ORC الأصلي الآن النوع
uniontypeالخاص بـ ORC، ويربطه بالنوعVariantفي ClickHouse (إذ كانت هذه الأعمدة تُرفض سابقًا مع الخطأUnsupported ORC type). #110078 (alexey-milovidov). - باتت صيغة الإخراج ORC الأصلية قادرة الآن على كتابة النوع
Variantفي ClickHouse، وذلك بربطه بالنوعuniontypeفي ORC (إذ كانت تفشل سابقًا مع الخطأILLEGAL_COLUMN). #110085 (alexey-milovidov). - إضافة صيغ التأطير، التي تُحدَّد عبر الإعداد الجديد
framing_output_format: وهي تجمع أجزاء استجابة الاستعلام المختلفة في دفق استجابة HTTP واحد — كتل البيانات، والمجاميع والقيم القصوى، وحزم التقدم، وأحداث التوصيف، وسجلات الخادم، والاستثناءات. وصيغ التأطير المُنفَّذة هي:None(الافتراضية، ويعمل فيها كل شيء كما في السابق)، وEventStream(أحداث HTTP المُرسَلة من الخادم)، وJSONEachPacketBase64، وJSONEachPacketString(كائن JSON لكل حزمة، مع بيانات مُرمَّزة بـ base64 أو بيانات نصية). #110127 (alexey-milovidov). - أُضيفت دالة الجدول
bigqueryومحرك الجدولBigQueryللقراءة من جداول Google BigQuery والكتابة إليها، بما في ذلك مجموعات البيانات العامة. ويُستنتَج هيكل الجدول من مخطط جدول BigQuery. وتدعم المصادقة رمز وصول OAuth، ومفتاح حساب خدمة بصيغة JSON، وعميل OAuth مع رمز تحديث. #110166 (alexey-milovidov). - دالة جديدة
aiRedactتكتشف معلومات تحديد الهوية الشخصية (PII) في النصوص وتحجبها باستخدام مزوّد LLM. حدِّد الفئات المراد حجبها (مثل['email', 'name']) أو مرِّر مصفوفة فارغة لاستخدام مجموعة افتراضية من فئات معلومات تحديد الهوية الشخصية. وتُستبدَل القيم المطابقة برمز ([REDACTED]افتراضيًا). #110464 (davidmenggx). - إضافة الدالة
aiFilterالتي تُقيّم شرطًا مصاغًا بلغة طبيعية على النص باستخدام LLM، وتُرجع قيمة من النوعUInt8لاستخدامها فيWHEREوPREWHEREوJOIN ... ON. #110594 (ylw510). - دعم اتصالات TLS/SSL بـ PostgreSQL لكلٍّ من محرك الجدول
PostgreSQL، ودالة الجدولpostgresql، ومحركي قواعد البياناتPostgreSQLوMaterializedPostgreSQL، وقواميسPostgreSQL: الخيارsslmodeإضافةً إلى الشهادات والمفتاح، إما كمحتويات حرفية (sslrootcert_pem، وsslcert_pem، وsslkey_pem؛ وتُخفى كما تُخفى كلمات المرور) أو كمسارات (sslrootcert، وsslcert، وsslkey؛ ولا تُقبل إلا من مجموعة مُسمّاة مُعرَّفة في ملف إعدادات الخادم). #110615 (alexey-milovidov). - بات من الممكن الآن استخدام دالة الجدول
postgresqlومحرك الجدولPostgreSQLللاتصال بخادم ClickHouse آخر عبر بروتوكول PostgreSQL (عند استخدام اسم جدول؛ أما الصيغةquery(...)فليست مدعومة بعد). كما أُضيفت دالتا التوافق مع PostgreSQL format_typeوcurrent_setting. #110760 (alexey-milovidov). - دالة جديدة
aiSimilarityتحسب التشابه الدلالي بين نصين باستخدام نموذج تضمين. تُرجع قيمة من النوعNullable(Float32)ضمن النطاق[-1, 1]، حيث تعني1أن النصين متطابقان، أو تُرجعNULLإذا كان أحد المعاملينNULLأو فارغًا أو تعذّر حساب تضمينه. #110777 (davidmenggx). - أُضيف محركا قاعدة البيانات
RemoteوRemoteSecureاللذان يتيحان الوصول الفوري إلى جداول قاعدة بيانات موجودة على خادم ClickHouse بعيد، مع تمرير استعلاماتSELECTوINSERTإليه. ويمثّلان المقابل الخاص بالاتصال بين خوادم ClickHouse لمحركي قاعدة البياناتMySQLوPostgreSQL. #110975 (alexey-milovidov). - دعم عوامل الأنبوب في استعلامات SQL:
FROM t |> WHERE x > 1 |> AGGREGATE count() AS c GROUP BY y |> ORDER BY c DESC |> LIMIT 10، على غرار صياغة الأنابيب في GoogleSQL. يمكن أن تلي أيَّ استعلامSELECTسلسلةٌ من معاملات|>، ويُغلِّف كل معامل الاستعلامَ السابق له في استعلام فرعي، بحيث تكون شجرة AST الناتجة مطابقة لشجرة الاستعلام المكافئ ذي الاستعلامات الفرعية المتداخلة. وفي الاستعلام الذي يبدأ بعبارةFROM، أصبحت عبارةSELECTاختيارية، وقيمتها الافتراضيةSELECT *. #111151 (alexey-milovidov). - أُضيفت الدالة التجميعية
giniلحساب معامل جيني للقيم الرقمية المحدودة وغير السالبة، بما في ذلك عمليات التجميع حسب المجموعات والتجميع الموزّع. #112280 (amirreza1307). #114643 (groeneai). - دعم صور PNG المتحركة في تنسيق الإخراج
PNG. يحوّل العمودtنتيجة الاستعلام إلى رسم متحرك، ويُضبط المقياس الزمني لـtعبرoutput_format_image_time_multiplier_secondsوoutput_format_image_time_divisor_seconds، بينما يتيحoutput_format_image_streaming_animationكتابة الإطارات فور إنتاج الاستعلام لها بدلًا من تخزينها مؤقتًا في الذاكرة. #112846 (alexey-milovidov). - أُضيف العمود
finish_timeإلىsystem.mutationsلتسجيل وقت اكتمال التعديل. وتُظهر التعديلات غير المكتملة والتعديلات التي يكون وقت اكتمالها غير معروف القيمةَ صفرًا. #113474 (nikitamikhaylov). - إضافة نوع مخطط جديد
bucketedلـsystem.metric_log، يخزّن جميع المقاييس في عمود واحد من النوعMap(Enum16(...), Int64)باستخدام تسلسلMapالمقسَّم إلى 128 حاوية، إضافةً إلى عمودALIASلكل مقياس لضمان التوافق. وبذلك يتكوّن الجدول من بضعة أعمدة بدلًا من الآلاف، ولا تُخزَّن القيم الصفرية، وتقتصر قراءة مقياس واحد على قراءة حاوية واحدة فقط من الحاويات الـ 128. علاوة على ذلك، أصبح بالإمكان فهرسةMapذات مفاتيحEnumباستخدام الاسم النصي لقيمة التعداد، مثلmap['name']. #115380 (alexey-milovidov). - أُضيف المُرمِّز
chineseللدالةtokensوللفهارس النصية فيMergeTree. يقسّم هذا المُرمِّز النص الصيني إلى كلمات باستخدام قاموس ونموذج ماركوف المخفي (وفق خوارزمية jieba)، ويوفّر مستويين من الدقة:coarse_grained(الافتراضي) وfine_grained. #89945 (amosbird). - إضافة الدالة التجميعية
groupFormatالتي تنسّق الصفوف في كل مجموعة باستخدام تنسيق إخراج محدد، وتُرجع النتيجة على شكل string. #93201 (wandersofb). - إضافة مُركِّب الدوال التجميعية
-Tuple، الذي يطبّق الدالة التجميعية الأساسية على كل عنصر من عناصر عمود من النوعTupleعلى حدة، ويُرجعTupleيضم النتائج مع الحفاظ على أسماء العناصر: فمثلًا تُرجعsumTuple(t)، حيثt = (a, b)، القيمة(sum(a), sum(b)). أما الدوال التجميعية ذات الوسيطات المتعددة فتأخذ Tuple واحدًا لكل وسيطة، وتُقرن العناصر بحسب مواضعها: إذ تُرجعcorrTuple((a1, a2), (b1, b2))القيمة(corr(a1, b1), corr(a2, b2)). وعلى خلاف-ForEachالمطبَّق على المصفوفات، يمكن أن تكون العناصر من أنواع مختلفة، كما يُحتفَظ بنوع النتيجة واسمها لكل عنصر. #98190 (RinChanNOWWW).
ميزات SQL والاستعلامات
- أُضيف دعم عبارات WHERE في تعريفات الإسقاطات. لا تُجسِّد الإسقاطات التي تتضمن WHERE إلا الصفوف المطابقة للشرط، ويمكن للمُحسِّن استخدامها (استنادًا إلى التكلفة) عندما تستلزم عبارة WHERE في الاستعلام عبارةَ WHERE في الإسقاط. #102347 (SBALAVIGNESH123).
- أُضيفت طريقة للوصول إلى الجداول وقواعد البيانات عبر مسارات URL في واجهة HTTP (مثل `/database/table.format.gz?filter=a>0`)، إلى جانب إعدادات جديدة (`http_allow_database_as_path`، `http_allow_table_as_file`، `http_allow_filters_as_path`، `http_allow_filters_as_unrecognized_url_parameters`، `select`، `order`، `sort`، `filter`، `page`، `compression`، `format`، `input_format`، `output_format`، `default_format`، `database`) يمكن الجمع بينها، وكذلك مع معلمة URL الحالية `query`. #105249 (alexey-milovidov).
- أُضيف محركا الجداول
RemoteوRemoteSecure، وهما النظيران الدائمان لدالتي الجداولremoteوremoteSecure. وأصبح بالإمكان الآن استخدامCREATE TABLE ... ENGINE = Remote('addresses', db, table, ...)إلى جانبCREATE TABLE ... AS remote(...). #106189 (alexey-milovidov). - أُضيف
EXPLAIN ANALYZEلفحص أداء الاستعلامات: إذ يُنفَّذ الاستعلام وتُعرض مقاييس التنفيذ الفعلية بصيغة خطة الاستعلام المألوفة. #106586 (Fgrtue). #110668 (Fgrtue). - أُضيفت الأوامر
SYSTEM STOPوSYSTEM STARTوSYSTEM PAUSEوSYSTEM CANCELوSYSTEM REFRESHالمستقلة عن المحرك، وصيغها... ALL BACKGROUNDعلى مستوى الخادم بأكمله، للتحكم في النشاط الخلفي لجداولKafkaوRabbitMQوNATSوS3Queue/AzureQueueوالعروض المُجسَّدة القابلة للتحديث عبر واجهة موحّدة. وبالنسبة إلى العروض المُجسَّدة القابلة للتحديث، تعمل هذه الأوامر كأسماء بديلة لأوامرSYSTEM ... VIEWالحالية. وفي إطار دعم عناصر التحكم هذه في NATS، باتت جداول JetStream لا تُقِرّ باستلام الرسائل إلا بعد نجاح عملية الإدراج (تسليم مرة واحدة على الأقل؛ إذ كان يُقَرّ سابقًا باستلام الرسائل تلقائيًا عند تسليمها، مما قد يؤدي إلى فقدانها إذا فشل الإدراج). ويُتيح الإعداد الجديدnats_wait_for_flush_interval(قيمته الافتراضيةfalse، حفاظًا على السلوك السابق منخفض زمن الاستجابة) إبقاءَ دورة الاستهلاك مفتوحة طوال الفاصل الزمني للتفريغ بدلًا من التفريغ فور خلوّ قائمة الانتظار. كما يجعل الإعداد الجديدnats_commit_on_selectتنفيذَSELECTمباشرةً على جدول JetStream يستهلك الرسائل التي يقرؤها (أي يُقِرّ باستلامها). #107476 (NIKTONIKTO717). - أصبح بإمكان دالات الجداول ومحركات الجداول
mysqlوpostgresqlوsqliteقبول استعلام من المستخدم (بدلًا من اسم جدول) وتمريره إلى قاعدة البيانات الخارجية كما هو، سواء كُتب كاستعلام فرعي(SELECT ...)أو بصيغةquery('SELECT ...'). وتُستنتج بنية الجدول الناتج من نتيجة الاستعلام، ويكون هذا الجدول للقراءة فقط. #107740 (alexey-milovidov). - تقديم محرك الجداول
QueryRunner. تمثّل السجلات المُدرجة في جدولQueryRunnerاستعلامات يتولى المحرك تنفيذها. ويمكن استخدام هذا المحرك لتنفيذ الاستعلامات بشكل غير متزامن، والتنفيذ الدفعي للاستعلامات المُولَّدة، وتوجيه الاستعلامات إلى العناقيد البعيدة، وقياس الأداء، والاختبار بالبيانات العشوائية (fuzzing)، والاختبار باستخدام حركة المرور الظلية. #107888 (mstetsyuk). - دعم وضع الإطار
GROUPSلدوال النوافذ (SQL:2011)، مثلany(price) OVER (PARTITION BY symbol ORDER BY ts GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING). في إطارGROUPSتُحسب الحدود بعدد مجموعات النظراء الكاملة — أي مجموعات الصفوف المتساوية في مفتاحORDER BY— وبذلك يعنيN PRECEDING/N FOLLOWINGعددNمن مجموعات النظراء قبل/بعد مجموعة النظراء التي ينتمي إليها الصف الحالي، بدلاً من الصفوف الفعلية (ROWS) أو المسافات بين قيمORDER BY(RANGE). #108653 (nihalzp). - أصبح الأمر
CREATE MATERIALIZED VIEW ... POPULATEبصيغته البسيطة ذريًا على المستوى المحلي: إذ يُشترَك العرض في عمليات الإدراج الجديدة في الجدول المصدر وتُؤخذ لقطة للبيانات الموجودة في آنٍ واحد تحت قفل حصري قصير على المصدر، فلم تعد الصفوف المُدرجة عبر الخادم نفسه بالتزامن مع التعبئة تُفقد أو تتكرر (إعداد جديدmaterialized_views_populate_atomically، مُفعّل افتراضيًا). يقتصر هذا الضمان على مسار الإدراج المحلي فقط - إذ تقع عمليات الإدراج الواردة إلى نسخة متماثلة أخرى أو عبر مسار كتابة موزّع خارج نطاقه - ويتطلب مصدرًا قادرًا على توفير لقطة مثبّتة (عائلةMergeTreeوMemory)؛ أما المصادر الأخرى، وكذلكCREATE OR REPLACE/REPLACEوالعروض المُنشأة في قواعد بياناتReplicated، فتظل تستخدم التعبئة القديمة غير الذرية. كما يمكن الآن استخدامPOPULATEمعTOلملء الجدول الهدف بالبيانات السابقة. #108715 (alexey-milovidov). - أصبحت الأوامر
ALTER USERوALTER ROLEوALTER SETTINGS PROFILEتقبلSET name = valueكاسم بديل لـMODIFY SETTING name = value. وهو يغيّر إعدادات بعينها في مكانها مع الإبقاء على بقية الإعدادات، بخلاف عبارةSETTINGSالمجردة التي تستبدل قائمة الإعدادات بأكملها. ويقلّل ذلك من احتمال مسح إعدادات المستخدم الأخرى عن طريق الخطأ. #108722 (groeneai). - دعم
ALTER TABLE ... MODIFY CONSTRAINT [IF EXISTS] name CHECK exprلتعديل تعبير قيد موجود في مكانه. #108768 (alexey-milovidov). - إضافة خوارزمية IEJoin القائمة على الفرز لعمليات الربط التي يحتوي قسم
ONفيها على مقارنتَي عدم مساواة (<،<=،>،>=) بين الجداول المربوطة، وتُفعَّل بإضافةie_joinإلى الإعدادjoin_algorithm. الأنواع المدعومة هيALL INNER/LEFT/RIGHT/FULL JOINوSEMI/ANTILEFT/RIGHT JOIN. في السابق كانت هذه الاستعلامات تُنفَّذ كـCROSS JOINمع مرشّح (INNERفقط)، وهو أبطأ بكثير على الجداول الكبيرة. #109920 (vdimir). - إضافة جدول نظام جديد،
system.user_query_log، يعرض لكل مستخدم سجلات استعلاماته الخاصة دون الحاجة إلى صلاحية الوصول إلى جدول سجل الاستعلامات. يعود التنفيذ الأصلي والفكرة إلى Yue Ni (@niyue). #110156 (alexey-milovidov). - إعداد جديد
run_query_in_background. يقبل الخادم الاستعلام، ويُعيد فورًا نتيجة فارغة، ثم ينفّذه حتى اكتماله بغض النظر عمّا يطرأ على الاتصال. وتُهمَل النتيجة. يمكن تتبّع الاستعلام عبرquery_idالخاص به فيsystem.processesوsystem.query_log. وهو مخصّص للاستعلامات الطويلة مثلINSERT ... SELECTأوCREATE TABLE … AS SELECTأوCREATE MATERIALIZED VIEW … POPULATEالتي يجب ألا تتوقف عند انقطاع الاتصال. #112816 (mstetsyuk). - إضافة دعم لـ ALTER TABLE … MODIFY PROJECTION لتعديل الإعدادات الخاصة بمستوى الإسقاط (مثل index_granularity) لإسقاط موجود دون إعادة بنائه. تُطبَّق الإعدادات الجديدة تدريجيًا عبر عمليات الدمج. #113343 (diegomestre2).
- أصبح catalog محرك جداول S3 الخاص ببحيرات البيانات يدعم
INSERTإلى جانب الاستعلام عن الجداول الموجودة. #113505 (scanhex12). - أصبح catalog الخاص بـ
Icebergيدعم Snowflake Horizon Catalog عبرcatalog_type = 'horizon'، مما يتيح القراءة من جداولIcebergالتي تديرها Snowflake والكتابة إليها. #114547 (melvynator). - إضافة الإعداد
skip_unavailable_shards_mode(المتاح أيضًا كإعداد لمحركDistributed) لتحديد الاستثناءات الصادرة من مقطع بعيد التي يجري تجاهلها بصمت عند تفعيلskip_unavailable_shards. ويتيح ذلك تحكمًا أدق في سلوك الاستعلامات في البيئات الموزعة. #79091 (byte-sourcerer).
التخزين وبحيرات البيانات والتخزين الكائني
- أُضيف دعم لصيغة الملفات Puffin (https://iceberg.apache.org/puffin-spec/). وأصبح بالإمكان الآن استخدام هذه الصيغة في دالات الجداول مثل
fileوurlوs3وغيرها. #103936 (scanhex12). - أُضيف نمط التخزين “packed” لأجزاء البيانات في جداول
MergeTree، وهو يخزّن جميع ملفات جزء البيانات في أرشيف واحد (data.packed) بدلاً من تخصيص ملف لكل دفق. ويُتحكَّم فيه عبر الإعداداتmin_bytes_for_full_part_storageوmin_rows_for_full_part_storageوmin_level_for_full_part_storage، وهو معطّل افتراضياً. ملاحظة حول التوافق: بمجرد أن يكتب الجدول أجزاء بيانات بنمط packed، تتعذّر قراءتها على إصدارات الخادم الأقدم، لذا فإن تفعيل هذه الصيغة يحول دون الرجوع بالخادم إلى إصدار أقدم. #108118 (Algunenano). - إضافة الإعداد
nats_credentialsإلى محرك الجدول NATS، مما يتيح للمستخدمين تحديد بيانات اعتماد NATS مباشرةً كسلسلة نصية (مطابقة لمحتوى ملف.creds). #110733 (addshore).
صيغ البيانات والإدخال
- أُضيف تنسيق الإخراج
HiveTextالذي يكتب البيانات بالصيغة النصيةLazySimpleSerDeالخاصة بـ Apache Hive. تُفصل الحقول بالرمز\x01، وتُفصل الصفوف بالفاصل المحدد في الإعداد الجديدformat_hive_text_rows_delimiter(القيمة الافتراضية\n)، بينما تستخدم القيم المتداخلة من الأنواعArrayوMapوTupleقائمة الفواصل الخاصة بـ Hive. يستهدف هذا الإخراج الصيغةLazySimpleSerDeالافتراضية في Hive، وهو غير متماثل مع صيغة الإدخالHiveTextفي ClickHouse فيما يخص القيم المتداخلة أو فواصل الصفوف المخصصة. #107582 (alexey-milovidov). - أُضيف تنسيق الإخراج
GeoJSONلكتابة مستندات GeoJSON من نوعFeatureCollection، بحيث يقابل كل صف عنصرًا واحدًا (feature). يتحقق الإعداد الجديدformat_geojson_validate_geometry(المُفعَّل افتراضيًا) من صحة أشكال GeoJSON عند القراءة والكتابة. كما أصبحت صيغة الإدخالGeoJSONتستنتج نوعidعلى أنهNullable(String)، مما يتيح التمييز بين المعرّفات الغائبة أو ذات القيمةnullوالسلاسل الفارغة. #108065 (nihalzp).
الإعدادات والوصول وإمكانية المراقبة
- أُضيفت صفحة مدمجة للبحث في الوثائق، متاحة عبر المسار
/docsفي واجهة HTTP، توفر بحثًا فوريًا في الجدولsystem.documentationوتعرض الوثائق المرجعية (مع تمييز بناء الجملة، والصيغ الرياضية، والروابط المتبادلة). #108345 (alexey-milovidov). - أُضيف مُقسِّم رموز للغة اليابانية خاص بالفهارس النصية وبالدوال tokens/hasAnyTokens/hasAllTokens، يعتمد على المحلّل الصرفي MeCab. يُحمَّل القاموس أثناء التشغيل من موقع يُحدَّد في تهيئة الخادم، ويُتحقَّق من سلامته بمطابقته مع قيمة تحقق SHA-256 قبل استخدامه. #111420 (Ergus).
- أُضيف إعداد جديد لذاكرة التخزين المؤقت لنظام الملفات باسم
system_cache_extensions، يحدد الملفات التي تُخزَّن في ذاكرة التخزين المؤقت للنظام عند تفعيلuse_split_cache. #111575 (kirillgarbar). - أُضيف الإعداد
always_fetch_mutated_part، الذي يتيح للنسخة المتماثلة تنزيل أجزاء البيانات المعدَّلة من النسخ المتماثلة الأخرى بدلًا من تنفيذ عمليات التعديل محليًا. #113020 (rorylshanks).
ميزات جديدة أخرى
- إضافة دعم
WITH TIESلقيمLIMITالسالبة. #100930 (nihalzp). - إضافة إعدادات الاستعادة
restore_table_dataوrestore_access_entitiesوrestore_functionsللتحكم الدقيق فيما تجري استعادته. ويمكن لهذه الإعدادات تجاوزstructure_onlyلفئات بعينها؛ فمثلًا، يؤديstructure_only=true, restore_access_entities=trueإلى استعادة تعريفات الجداول وكيانات الوصول دون بيانات الجداول. #102402 (fm4v). - أصبح بالإمكان تهيئة التحميل الكسول لكل قاموس على حدة باستخدام
dictionary_lazy_loadفي تعريف القاموس، متجاوزًا إعداد الخادم العامdictionaries_lazy_load. ويتيح ذلك تحميل بعض القواميس تحميلًا كسولًا بينما يُحمَّل غيرها فورًا. #108314 (mstetsyuk). - أصبح عامل فهرسة المصفوفات يقبل مصفوفة من الأعداد الصحيحة فهرسًا له: إذ يُرجع
arr[indexes]العناصر الموجودة في جميع المواضع المحددة، بما يكافئarrayMap(i -> arr[i], indexes). #108371 (ucasfl). - إضافة الدوال
geoToUTMوUTMToGeoوgeoToMGRSوMGRSToGeoللتحويل بين الإحداثيات الجغرافية وفق WGS84 ونظامَي الإحداثيات UTM وMGRS. #108939 (alexey-milovidov). - إضافة الأمرين
SYSTEM UNLOAD DICTIONARYوSYSTEM UNLOAD DICTIONARIESلتحرير الذاكرة التي يشغلها القاموس دون حذف تعريفه. وسيُعاد تحميل القواميس تحميلًا كسولًا عند الوصول إليها في المرة التالية. #109639 (Manerone). - إضافة مُقسِّم رموز جديد
icuللفهارس النصية وللدوالtokensوhasAnyTokensوhasAllTokens، يوفّر تقسيم الكلمات وفق معيار Unicode مع مراعاة الإعدادات المحلية (بما في ذلك التقسيم المعتمد على القواميس للغات مثل الصينية واليابانية والتايلاندية). #109940 (Ergus). - إضافة مرمِّز جديد
ZXC، وهو مرمِّز LZ غير متماثل يتميز بضغط بطيء وفك ضغط سريع جدًا، ونسبة ضغط تقع بينLZ4وZSTD. #110620 (alexey-milovidov). - إضافة الإعداد
s3_baseلتمكين حل عناوين URL النسبية في دالات الجداولs3وs3Clusterوgcsوossوفي محرك الجدولS3استنادًا إلى عنوان URL أساسي في S3. كما أُضيف محرك قاعدة البياناتURL، الذي يحل أسماء الجداول بوصفها عناوين URL استنادًا إلى عنوان أساسي اختياري، ثم يوجّهها إلى الواجهة الخلفية المناسبة. #111512 (alexey-milovidov). - تمكين توسيع أحرف البدل في
url()ومحركURLعبر استعراض صفحات الفهرسة في HTTP (قوائم الأدلة بصيغة HTML أو النص العادي) واستخراج عناوين URL المطابقة. وتُطابَق أحرف البدل مع مكوّن المسار في عنوان URL، مع حدود قصوى لحجم صفحة الفهرسة ولعدد الأدلة المقروءة. #95181 (niyue). - إضافة
AWS_MSK_IAMقيمةً مدعومة لـkafka_sasl_mechanism، مما يتيح لـ ClickHouse المصادقة مع Amazon MSK باستخدام أدوار IAM دون الحاجة إلى إدارة بيانات اعتماد SASL/SCRAM. #96100 (kalavt). - إضافة معالج لاحق إلى الفهرس النصي يحوّل الرموز بعد تقسيم النص إلى رموز. #98939 (Ergus).
الميزات التجريبية
تخطيط الاستعلامات وتنفيذها
- أُضيفت “مشغّلات” للدوال المعرّفة من قبل المستخدم القابلة للتنفيذ. يمكن استخدام المشغّل المُعرَّف في
<user_defined_executable_function_drivers_config>ضمنCREATE FUNCTION name ARGUMENTS (...) RETURNS T ENGINE = DriverName(...) AS '...code...'لتصريف مقتطف شيفرة المستخدم أو معالجته بطريقة أخرى عند إنشاء الدالة، وإنتاج دالة UDF قابلة للتنفيذ. تُخزَّن التهيئة الناتجة في<dynamic_user_defined_executable_functions_path>، ويُحفَظ الاستعلام الأصلي بصيغةATTACH FUNCTIONلكي تبقى الدالة متاحة بعد إعادة تشغيل الخادم. ويتولّى المشغّلc_function_body، وهو نموذج تجريبي لإثبات المفهوم، تصريف أجسام دوال C وتشغيلها داخل حاويات Docker معزولة في وضعexecutable_pool. #105131 (alexey-milovidov). - أصبحت طلبات Prometheus Query API الموجّهة إلى
/api/v1/queryو/api/v1/query_rangeتُسجَّل فيsystem.query_logمع مقياسَيread_rowsوread_bytes. #106611 (JTCunning). - دعم القراءة عبر خطة تنفيذ استعلام موزّعة لاستعلامات
SELECT ... FINALعلى جداول عائلة MergeTree عند تفعيلmake_distributed_plan. #108148 (davenger). - إضافة تنفيذ تجريبي للنسخ المتماثلة المتوازية القائمة على الخطة لاستعلامات MergeTree. #108504 (devcrafter).
- أُضيفت دالة الجدول التجريبية
eval، التي تُقيِّم تعبيرًا ثابتًا لتحويله إلى نص استعلام، ثم تنفّذ استعلامSELECTالوحيد الناتج. هذه الميزة معطّلة افتراضيًا ويمكن تفعيلها عبر الإعدادallow_experimental_eval_table_function. المؤلف: Yue Ni #110132 (alexey-milovidov). - النسخ المتماثلة المتوازية القائمة على الخطة (
parallel_replicas_plan_based): أصبح الحد الفاصل بين التنفيذ المحلي والبعيد يُحدَّد عبر تحسين على مستوى الخطة يُطبَّق على خطة تنفيذ استعلام عادية، كما باتت الاستعلامات على العروض التي تحتوي علىUNIONتُنفَّذ بالتوازي دون الحاجة إلىparallel_replicas_allow_view_over_mergetree. وأصبحت الاستعلامات التي تستخدمIN (subquery)تلجأ إلى خطة محلية بدلًا من أن تفشل. #111063 (devcrafter). #112443 (devcrafter). - تعزيز أمان دوال الذكاء الاصطناعي التجريبية: رفض نقاط النهاية غير الآمنة (
http) الموجّهة إلى مضيفين بعيدين افتراضيًا (إعداد جديدai_function_allow_insecure_endpoint)، وتقييد عدد استدعاءات واجهة برمجة التطبيقات الصادرة لكل استعلام افتراضيًا (أصبحت القيمة الافتراضية لـai_function_max_api_calls_per_queryهي1000)، وتنقية استجابات الأخطاء الواردة من المزوّدين قبل كتابتها في السجلات. #111286 (george-larionov). - أصبحت النسخ المتماثلة المتوازية القائمة على الخطة (
parallel_replicas_plan_based) توزّع عمليات الربط المؤهلة (INNERوLEFTوRIGHT، بما في ذلكSEMI/ANTI): إذ يُنفَّذ الربط بأكمله ضمن جزء من خطة موزّعة، فيُنسَّق أحد الطرفين عبر النسخ المتماثلة ويُبَثّ الطرف الآخر إليها. #112268 (devcrafter). - الإبلاغ عن الخطأ الذي تسبّب في إلغاء الاستعلام الموزّع (
make_distributed_plan = 1) بدلًا من الاكتفاء بـQUERY_WAS_CANCELLED. في السابق، لم يكن الخطأ الفعلي لمهمة العامل الفاشلة يظهر إلا في سجل الخادم. #112590 (davenger). - دعم التنفيذ الموزّع لخطط تنفيذ الاستعلام التي تتضمن
IN (subquery)دون إعادة كتابتها في صورةJOIN. تُبنى المجموعة مرة واحدة على العقدة المُبادِرة وتُرسَل قيمها مع مهام العمّال. أُزيل الفرض الإجباري لـrewrite_in_to_join؛ وتبقى إعادة الكتابة متاحة كإعداد صريح. #113826 (davenger). - أصبح استعلام الخطة الموزعة (
make_distributed_plan) يوقف المراحل السابقة له عند استيفاء شرطLIMIT، بدلاً من حساب النتيجة كاملةً ثم تجاهلها. #114806 (davenger). - إصلاح الخطأ
Illegal type Decimal(18, 0) of argument of function toIntervalNanosecondالذي يظهر عندما يستخدم استعلام PromQL الكلمة المفتاحيةoffsetداخل محدِّد نطاق، مثلrate(m[2m] offset 5m). #114997 (nikitamikhaylov). - دعم تجميع
GROUPING SETSفي الخطط الموزعة التي يبنيها مُحسِّن Cascades (make_distributed_plan = 1, enable_cascades_optimizer = 1). #115426 (davenger). - أصبح بإمكان جداول
TimeSeriesالاحتفاظ بجدول “العينات الحديثة”: فعندما تكون قيمة إعداد المحرك الجديدrecent_samples_ttl_secondsغير صفرية، ينشئ المحرك نسخة من جدول العينات خاضعة لـ TTL (مقسَّمة وفقrecent_samples_partition_by، وحسب اليوم افتراضياً) تُكتب إليها البيانات مع كل عملية إدراج، وتقرأ منها تلقائياً استعلامات PromQL التي يقع نطاقها الزمني ضمن نافذة TTL، مما يجعل قواعد التنبيه والتسجيل ولوحات المعلومات قصيرة النطاق أسرع بعدة مرات على الجداول الكبيرة. ويمكن تعطيل هذا السلوك عبر الإعداد الجديد على مستوى الاستعلامtime_series_prefer_recent_samples_table. #115441 (nikitamikhaylov). - أصبحت خطط تنفيذ الاستعلامات الموزعة (
make_distributed_plan) توقف المراحل السابقة الخاملة فوراً بعد استيفاء شرطLIMIT: إذ يقرأ مُستقبِل التبادل الخامل الإشارةNoMoreDataNeededفور وصولها، ويرصد مصدر التبادل الخامل إغلاق مخرجه فيمرّر إشارة التوقف إلى المراحل السابقة. أما في السابق، فكانت هذه المراحل تواصل قراءة بيانات ومعالجتها دون أن يستهلكها أحد. #115690 (davenger). - أصبح بإمكان آلية النسخ المتماثلة المتوازية التلقائية جمع إحصاءات وقت التشغيل وتفعيل النسخ المتماثلة المتوازية للاستعلامات المدعومة عند تفعيل
parallel_replicas_plan_based. #115788 (devcrafter). - إضافة مُحسِّن تجريبي قائم على التكلفة باسم Cascades لخطط تنفيذ الاستعلامات الموزعة، يُفعَّل عبر
enable_cascades_optimizer = 1معmake_distributed_plan = 1. يختار هذا المُحسِّن، بناءً على التكلفة المقدَّرة، بين استراتيجيات الربط بالخلط أو البث أو النسخ المتماثل أو الربط المحلي، والتجميع ثنائي المرحلة أو بالخلط أو المحلي، وعمليات top-N الموزعة ثنائية المرحلة، والقراءات المتوازية والمتماثلة، مع إدراج عوامل التبادل عند الحاجة. #86353 (davenger).
التخزين وبحيرات البيانات والفهارس
- إضافة ذاكرة تخزين مؤقت من نوع SLRU داخل الذاكرة لملفات البيانات الوصفية الخاصة بـ Paimon بعد فك تسلسلها (قوائم البيان وملفات البيان). عند تفعيلها عبر الإعداد
use_paimon_metadata_files_cache، لا تحتاج الاستعلامات المتكررة على جدول Paimon نفسه إلى إعادة تنزيل البيانات الوصفية من التخزين الكائني وإعادة تحليلها. #104657 (Binnn-MX). - أصبح بإمكان
ReaderExecutorالتجريبي (use_reader_executor، معطّل افتراضيًا) إبقاء اتصال المصدر البعيد مفتوحًا وإعادة استخدامه في عمليات القراءة المتتالية، مما يقلل عدد الطلبات المرسلة إلى التخزين الكائني أثناء عمليات المسح. #107735 (CheSema). - إضافة ذاكرة تخزين مؤقت لنظام الملفات بنمط القراءة عبرها (read-through) إلى مسار القراءة في
ReaderExecutorالتجريبي (use_reader_executor، معطّل افتراضيًا). #110029 (CheSema). - إضافة إعداد
MergeTreeتجريبي باسمallow_experimental_adaptive_codec_selection. عند تفعيله، تختار عمليات الدمج والتعديل لكل كتلة المرمِّز الذي ينتج أصغر حجم من المخرجات، وذلك للأعمدة التي تستخدم المرمِّز الافتراضي. #111834 (rienath). - إضافة طبقة ذاكرة تخزين مؤقت للصفحات في userspace إلى مسار القراءة في
ReaderExecutorالتجريبي (use_reader_executor، معطّل افتراضيًا). عند عدم العثور على البيانات في الذاكرة المؤقتة، يملأ المنفّذ ذاكرة التخزين المؤقت للصفحات في userspace ثم يخدم منها عمليات القراءة اللاحقة دون نسخ (zero-copy). #114890 (CheSema). - أصبح دمج ملفات البيان في
Icebergمتاحًا عبرOPTIMIZE TABLE ... MANIFESTلتقليل عدد ملفات البيانات الوصفية، ويتطلب ذلك تفعيل الإعدادallow_experimental_iceberg_compaction. #98178 (SmitaRKulkarni).
الدوال والصيغ والذكاء الاصطناعي
- تجريبي: تقديم نتيجة
SELECT count(*) FROM t WHERE col <op> default(col)من إحصاءات التناثر الخاصة بكل عمود فيserialization.jsonدون أي مسح للبيانات، وذلك عندما يقسّم المسند العمود تقسيمًا دقيقًا إلى قيم افتراضية وقيم غير افتراضية. #105890 (Algunenano). - أُضيفت عائلة مرمِّزات المتجهات التجريبية
Quantize(...)، إلى جانب إعادة كتابة اختيارية على مرحلتين للبحث التقريبي عن المتجهات عبر التدفقات المرافقة المُكمَّمة. #108565 (shankar-iyer). - إعادة إحياء مرمِّز الضغط الفاقد التجريبي
SZ3محدود الخطأ للأعمدة من النوعFloat32/Float64(ومصفوفاتها). ويتطلب ذلك تفعيلallow_experimental_codecs. #108788 (alexey-milovidov). - أُصلحت قراءة البيانات المضغوطة بالمرمِّز التجريبي
SZ3('ALGO_LORENZO_REG', ...)، والتي كانت تفشل سابقًا بالخطأCORRUPTED_DATA، كما أصبح السلوك غير المحدد متجنَّبًا عند ضغط القيم العشرية غير المنتهية (NaNواللانهايات) بالمرمِّز التجريبيSZ3. #110762 (alexey-milovidov). - PromQL: أصبح بالإمكان استدعاء دوال التاريخ والوقت (
hour()،minute()،month()،year()،day_of_week()،day_of_month()،day_of_year()،days_in_month()) دون وسيطات، إذ تُستخدم القيمة الافتراضيةvector(time())كما هو الحال في Prometheus. #111869 (valerypetrov). - PromQL: أُصلحت العمليات على المتجهات اللحظية الخالية من الوسوم، مثل
vector(1) + vector(2)وtopk(1, vector(1))وlabel_replace(vector(1), ...)والمعاملات الثنائية معon()، والتي كانت تفشل بخطأ في النوع. #111872 (valerypetrov). - PromQL: نُفِّذت الدالة
deriv، مع إصلاح خلل كانت فيه الدالة التجميعية التي تستند إليها تُعيد قيمًا أصغر بمقدار 1000 مرة عند استخدام طوابع زمنية بدقة الميلي ثانية. #112360 (valerypetrov). - تطبيق تحسين القراءة بالترتيب على استعلامات
ORDER BYعند تفعيلparallel_replicas_plan_based: يُرسَل الفرز الآن إلى النسخ المتماثلة ويُدمَج على المُبادِر، بحيث تقرأ كل نسخة متماثلة البيانات وفق ترتيب مفتاح الفرز. كما يُصلح ذلك الخطأUnknown function __topKFilterعند استخدامORDER BYعلى عمود لا ينتمي إلى المفتاح الأساسي مع تفعيل هذا الإعداد. #114315 (devcrafter). - أُصلحت قراءات البحث عن المتجهات بعد إعادة تحميل جزء بيانات (كما بعد
ATTACHأو إعادة تشغيل الخادم): لم تعد أجزاء البيانات تفقد أعمدتها الفرعية الخاصة بالمرمِّزQuantized، فأصبحت عمليات البحث تقرأ الأعمدة الفرعية المُكمَّمة بدلًا من الرجوع إلى العمود كامل الدقة. #114763 (shankar-iyer). - لم يعد محرك الجدول التجريبي
TimeSeriesيطبّق المرمِّزGorillaعلى أعمدةvalueالمُنشأة تلقائيًا في الجدول الداخلي للعينات؛ إذ أصبحت تستخدم افتراضيًاCODEC(ZSTD(1)). أما الأعمدة المُعلَنة صراحةً فتحتفظ بالمرمِّزات التي حددها المستخدم. ويبقى الإعداد الافتراضي للعمودtimestampدون تغيير (CODEC(DoubleDelta, ZSTD(1))). #112110 (nikitamikhaylov). #114790 (nikitamikhaylov). - دعم
ROLLUPوCUBEوGROUPING SETSوالدالةgroupingفي الاستعلامات المنفَّذة باستخدامmake_distributed_plan = 1. #114950 (davenger). - إضافة متغيّر Real Doubles (RD) ووسيطة اختيارية
ALP(AUTO|STD|RD)إلى المرمِّز التجريبي ALP. وأصبح ALP عند استخدامه دون وسائط يختار تلقائيًا بين المخطط STD الحالي وRD، بدلًا من استخدام STD دائمًا. #99654 (nazarii-piontko).
ميزات تجريبية أخرى
- إضافة ارتباط ثابت بين التقسيمات والمقاطع في StorageKafka2 عبر الإعدادين kafka_partition_shard_num وkafka_shard_count، مما يتيح لعدة مقاطع في ClickHouse استهلاك مجموعات فرعية منفصلة من تقسيمات Kafka بشكل حتمي. #108886 (JingYanchao).
- أصبح بإمكانك الآن المصادقة على OneLake باستخدام رمز bearer تم الحصول عليه مسبقًا عبر الإعداد
onelake_bearer_token، بدلًا منonelake_client_idوonelake_client_secret. ويُجنّبك ذلك مشاركة سرّ عميل طويل الأمد. لا يُجدَّد الرمز تلقائيًا، لذا يجب إعادة إنشاء قاعدة البيانات فور انتهاء صلاحيته. #109104 (asya-ch). - إصلاح
data_uncompressed_bytesلفهارس التخطي المحزّمة فيskp_idx.packed(عبرpacked_skip_index_max_bytes)، إذ كان الحجم غير المضغوط المُبلَّغ عنه هو نفسه الحجم المضغوط، وهو ما قد يمنع أيضًا تفعيلdistributed_index_analysis. #109272 (Algunenano). - إضافة دعم ضغط Zstandard إلى معالج HTTP التجريبي الخاص ببروتوكول Prometheus remote-write v1. #110907 (JTCunning).
- PromQL: تنفيذ الدوال
clampوclamp_minوclamp_maxوround. #111870 (valerypetrov). - PromQL: أصبحت
quantileتُعيد -Inf/+Inf/NaN عند استخدام مستوى كَمّي خارج النطاق [0, 1]، كما في Prometheus، بدلًا من إطلاق error، وأصبحتhistogram_quantileتتجاهل السلاسل المُدخلة التي تكون فيها التسميةleمفقودة أو غير قابلة للتحليل، كما في Prometheus أيضًا. #111871 (valerypetrov). - PromQL: تنفيذ الدالتين
changes()وresets(). #112352 (valerypetrov). - جمع إحصاءات الإدراج والاستعلامات بشكل صحيح عبر نقطة نهاية Prometheus remote-write. #112825 (JTCunning).
- PromQL: الحفاظ على القيم المنتهية عند استخدام عملية باقي القسمة مع مقسوم عليه لا نهائي. #113746 (fallintoplace).
- رفض محارف line feed الحرفية في سلاسل PromQL العادية المحاطة بعلامات اقتباس. #114381 (fallintoplace).
- لم تعد القيمة الكبيرة جدًا لـ
distributed_plan_workers_numتتسبب في إنهاء الخادم بشكل مفاجئ مع الخطأstd::length_errorعند تفعيل الإعدادين التجريبيينmake_distributed_planوenable_cascades_optimizer، إذ بات عدد العُقد هذا يُرفض الآن معINVALID_SETTING_VALUE. #115398 (groeneai). - تنفيذ نقطة النهاية
/api/v1/seriesمن واجهة برمجة تطبيقات HTTP لـ Prometheus لجداولTimeSeries، وتشمل: محددات السلاسلmatch[](تُعامَل القيم المتكررة كاتحاد)، ونطاقًا زمنيًا اختياريًاstart/end، ومعلمةlimitاختيارية. #115676 (nikitamikhaylov).
تحسينات الأداء
أداء عمليات الربط والتجميع
- تفعيل ذاكرة التخزين المؤقت لشروط الاستعلام للاستعلامات التي تمر عبر التصفية الديناميكية TopK (
ORDER BY ... LIMIT n). يُقسَّم إدخال QCC وفقًا لمعلمات خطة TopK، بحيث يعيد الاستعلام نفسه استخدام نتائج عامل تصفية WHERE المخزنة مؤقتًا، بينما يُنشئ تغييرLIMITأو عمود الفرز أو اتجاه الفرز إدخالًا جديدًا. #104478 (alexey-milovidov). - دفع LIMIT إلى التجميع المرتب (aggregation-in-order) لإتاحة الإنهاء المبكر عندما يتطابق مفتاح GROUP BY مع مفتاح ORDER BY ومفتاح فرز الجدول، مما يقلل عدد الصفوف المقروءة تقليلًا ملحوظًا. #104859 (thevar1able).
- تفعيل
allow_aggregate_partitions_independentlyافتراضيًا. عندما يتوافق مفتاحGROUP BYمع مفتاح التقسيم، يستطيع ClickHouse تجميع كل تقسيم على حدة وتخطي خطوة الدمج الشاملة. وتتجاوز آليات استدلالية تعمل في وقت التشغيل هذا التحسين تلقائيًا عندما يجعله توزيع التقسيمات غير مُجدٍ (عدد قليل جدًا من التقسيمات، أو عدد كبير جدًا منها، أو تفاوت كبير في أحجامها). #105128 (alexey-milovidov). - تفعيل
read_in_order_use_virtual_rowافتراضيًا. عند القراءة وفق ترتيب المفتاح الأساسي (مثلORDER BY primary_key LIMIT n) من جدول يضم أجزاء بيانات كثيرة، لا تُقرأ إلا أجزاء البيانات التي يمكن أن تسهم فعليًا في النتيجة (إضافةً إلى نافذة قراءة مسبقة لا تتجاوزmax_threadsمن أجزاء البيانات للحفاظ على توازي القراءة)، مما يخفّض ذروة استهلاك الذاكرة بشكل ملحوظ. #106215 (alexey-milovidov). - تقليل استهلاك الذاكرة وتحسين أداء عمليات
JOIN. أصبح الجانب الأيمن من ربط التجزئة يستخدم مرجع صف مضغوطًا بحجم 8 بايت قائمًا على الفهرس، فصارت إدخالات جدول التجزئة في عمليات ربطALLبصغر نظيراتها في عمليات ربطANYلجميع أنواع المفاتيح. وفي اختبارات أداء على استعلامات ربطparallel_hashكبيرة — عمليات ربطINNERوANYلجداول تضم من 100 إلى 300 مليون صف على مفاتيح من نوعUInt64وString، بمفاتيح فريدة ومكررة — أصبح الاستعلام الوسيط أسرع بنحو 12% واستهلك ذروة ذاكرة أقل بنحو 15%، دون أن يتباطأ أي استعلام. وكانت عمليات ربطINNERعلى مفاتيحUInt64الأكثر استفادة (أسرع بنحو 21% في الوسيط مع ذاكرة أقل بنسبة 38%). #107189 (harikrishnan94). - إضافة خوارزمية dpsub لتعداد ترتيب عمليات الربط، التي توفر خطط ربط مثالية بتكلفة تحسين أقل من dpsize، مع دعم عمليات الربط غير الداخلية. #107351 (fkastrati).
- تجنب تحويل عمليات التجميع أحادية المستوى ذات الاستهلاك المنخفض للذاكرة إلى تجميع ثنائي المستوى، وذلك بإرفاق متعقّب ذاكرة خاص بحالة التجميع بدلًا من الاعتماد على ذاكرة الاستعلام بأكمله. #107490 (m-selmi).
- تجنب بناء AST الكامل للاستعلام أثناء تحليل استعلامات التجميع، وذلك بحساب مفتاح ذاكرة التخزين المؤقت لإحصاءات حجم جدول تجزئة التجميع من خطة تنفيذ الاستعلام بدلًا من AST. #107643 (novikd).
- إتاحة التبديل من ربط
hashفي التشغيل الأول للاستعلام إلىparallel_hashفي عمليات التشغيل اللاحقة، استنادًا إلى إحصاءات وقت التشغيل التي جُمعت في التشغيل الأول. #108125 (m-selmi). - استخدام حجم جدول التجزئة المستمد من إحصاءات الربط في وقت التشغيل لتحسين حجم مرشحات وقت التشغيل الخاصة بـ JOIN في عمليات تنفيذ الاستعلام اللاحقة. ويمكن التحكم في ذلك عبر الإعداد الجديد
join_runtime_filter_size_from_hash_table_stats. #108313 (m-selmi). - تسريع استعلامات
DISTINCTعلى جداولMergeTreeالمقسّمة وتقليل استهلاكها للذاكرة، وذلك بإبقاء صفوف كل تقسيم ضمن دفق واحد، بحيث تعمل مرحلةDISTINCTالأولية في كل دفق على مجموعة مفاتيح منفصلة، بدلًا من ظهور المفاتيح نفسها في عدة مراحلDISTINCTأولية. ينطبق ذلك عندما يكون تعبير التقسيم دالة حتمية لأعمدةDISTINCT، ويخضع لآلية استدلالية قائمة على التكلفة تراعي عدد التقسيمات ومدى تفاوت أحجامها (ويمكن تجاوزها عبر الإعدادforce_distinct_partitions_independently، المعطّل افتراضيًا). كما يُنقل هذا الانفصال بين التقسيمات عبر خطواتExpressionوFilterوARRAY JOINوصولًا إلى المستهلكين النهائيينDISTINCTوLIMIT BYوGROUP BY، ليتمكنوا بدورهم من تخطي عملية الدمج. يُتحكَّم بهذه الميزة عبر الإعدادين الجديدينallow_distinct_partitions_independently(المفعّل افتراضيًا) وmax_number_of_partitions_for_independent_distinctلضبط الآلية الاستدلالية. #108326 (nihalzp). - أصبحت عوامل التصفية وقت التشغيل تُبنى على مفاتيح المساواة حتى عندما تحتوي عبارة
ONأيضًا على شروط عدم مساواة، مما يقلل عدد الصفوف الداخلة إلى ربط التجزئة في عمليات الربط التي تجمع بين شروط المساواة وعدم المساواة. لا يتأثرLEFT ANTI JOINبهذا التغيير. #108579 (29antonioac). - خفض عتبة الجلب المسبق البرمجي لجداول التجزئة الخاصة بالتجميع والربط من
4 * L2 cache sizeإلىL2 cache size، بحيث يُفعَّل الجلب المسبق بمجرد أن يتجاوز جدول التجزئة سعة ذاكرة L2. يعالج هذا تراجعًا في أداءGROUP BYوJOINعلى جداول التجزئة متوسطة الحجم (~1-8 MiB) في المنصات التي تُبلغ عن ذاكرة L2 كبيرة (مثل aarch64 بذاكرة L2 بحجم 2 MiB). #108655 (groeneai). - تحسين أداء دوال النافذة. أصبحت استعلامات النافذة على الجداول العريضة التي تتضمن
SELECT *تستهلك ذاكرة أقل بكثير وتعمل بسرعة أكبر. كما أصبحت تجميعات النافذة، بما فيهاquantile*وuniq*وgroupArray، أسرع معOVER ()وOVER (ORDER BY ... RANGE ...). وأصبحت الدالةcume_distأسرع أيضًا، وتحسّن أداء النوافذ التي تستخدمPARTITION BYأوORDER BYعلى الأعمدة التي تكثر فيها القيم المتكررة. #108688 (nihalzp). - أصبحت استعلامات التجميع التي لا تحتوي على دوال تجميع تستخدم أساليب قائمة على
HashSetبدلًا منHashMap(لأنواع المفاتيح المدعومة). وقد لوحظ تسريع يصل إلى 1.8 مرة. #108862 (nickitat). - تقليل العبء الناتج عن التنافس على الأقفال في خوارزمية الربط
parallel_hash. #108938 (m-selmi). - إضافة قيمة جديدة لـ
join_algorithmهيparallel_full_sorting_merge: في عمليات ربط المساواة المتوافقة مع التجزئة، تقسّم هذه القيمة ربط الدمج بالفرز الكامل إلى مقاطع وفقًا لتجزئة مفاتيح الربط، لتُنفَّذ عمليات ربط دمج مستقلة لكل مقطع على جميع الخيوط. وبذلك تحافظ على استهلاك الذاكرة المنخفض والتدفقي لربط الدمج مع تنفيذه بالتوازي (في أحد اختبارات الأداء، كانت أسرع بنحو 2.4 مرة واستهلكت ذاكرة أقل بنحو 3.3 مرة مقارنةً بـparallel_hash). تلجأ عمليات ربطASOFإلىfull_sorting_mergeواحد بديلًا؛ أما أنواع المفاتيح غير المتوافقة مع التجزئة (أعداد الفاصلة العائمة، وJSON، وObject، وDynamic) فتتخطى فقط إعادة الكتابة القائمة على توزيع التجزئة، ويظل بالإمكان تقسيمها إلى مقاطع عند المصدر وفقًا لنطاقات المفتاح الأساسي عند تفعيلquery_plan_join_shard_by_pk_ranges. النتيجة غير مرتبة. #109005 (alexey-milovidov). - أصبحت إحصاءات الأعمدة تُجسَّد افتراضيًا عند
INSERTإذا لم يتجاوز مجموع الحجم النشط الحالي للجدول وحجم الكتلة المكتوبة قيمةَ الإعداد الجديدmaterialize_statistics_on_insert_max_table_size(القيمة الافتراضية 25 GiB)؛ ويُجرى هذا التحقق لكل كتلة مكتوبة على حدة، لذا قد يظل التحميل المجمّع الأول في جدول فارغ يجسّد الإحصاءات لكل كتلة مكتوبة. يمنح ذلك مُحسِّن الربط القائم على التكلفة تقديرات دقيقة لجداول الأبعاد المحمّلة حديثًا، ويجنّب ترتيبات الربط الرديئة للغاية (على سبيل المثال، لم يعد الاستعلامان Q5 وQ8 من TPC-H يتجاوزان المهلة الزمنية عند معامل حجم 40)، في حين تواصل جداول الحقائق الكبيرة القائمة تجسيد الإحصاءات أثناء عمليات الدمج. #109454 (alexey-milovidov). - تحسين الدالة التجميعية
uniqCombinedفي حالة التجميع بدون مفتاح. #109794 (CurtizJ). - تحسين الدالتين التجميعيتين
uniqHLL12وuniqCombined. #109831 (CurtizJ). - موازاة معالجة الصفوف غير المرتبطة في خوارزمية الربط
parallel_hashفي حالتين إضافيتين: عند وجود عامل تصفية متبقٍّ، وعند استخدام مفاتيح ربط صغيرة (خريطة تجزئة أحادية المستوى). #110008 (m-selmi). - دفع عامل التصفية إلى ما قبل دالة النافذة عندما لا يشير المسند إلا إلى أعمدة
PARTITION BYالخاصة بالنافذة. فمثل هذا المسند المكتوب بعد النافذة (عبارةWHEREخارجية تحيط باستعلام فرعي يستخدم النافذة، أو أحد حدود الاقتران فيQUALIFY) بات يصل الآن إلى طبقة التخزين ويتيح تقليم المفتاح الأساسي / التقسيمات، واستخدام فهارس التخطي والإسقاطات. على سبيل المثال، لم يعد الاستعلامSELECT ... row_number() OVER (PARTITION BY key ORDER BY ts) AS rn ... QUALIFY rn = 1 AND key = 'x'يقرأ الجدول بأكمله ويطبّق عليه النافذة. #110114 (groeneai). - عند ضبط
join_use_nulls = 1، باتت عبارةWHEREالرافضة للقيم الفارغة والتي تشير إلى أعمدة من طرفي الربط الخارجي كليهما (مثلWHERE l.k = 42 AND r.k = 42) تحوّل الربط إلىINNER(أوLEFT/RIGHT) وتقلّم المفتاح الأساسي، تمامًا كما في حالةjoin_use_nulls = 0. وفي السابق، كان هذا التحويل يُتخطّى في هذه الحالة فيُقرأ الجدولان بالكامل. #110121 (groeneai). - تحسين الدوال
uniqوuniqExactوuniqHLL12في التجميع بدون مفتاح. #110150 (CurtizJ). - لم يعد
JOINالذي يكون شرطONفيه خاطئًا دائمًا (مثلON 1 = 2أوON NULLأو شرط يُختزل إلى false مثلa.t = 'A' AND a.t = 'B') يقرأ الطرف غير المساهم في النتيجة. إذ يستبدل تحسين جديد لخطة الاستعلام بأطراف الإدخال التي لا يمكنها المساهمة بأي صف مصدرًا فارغًا. ويُتحكَّم في ذلك عبر الإعدادquery_plan_short_circuit_constant_false_join(مُفعَّل افتراضيًا). #110234 (groeneai). - موازاة الدمج النهائي لجداول التجزئة أحادية المستوى الخاصة بالتجميع: إذ يُقسَّم فضاء المفاتيح إلى تقسيمات تجزئة منفصلة تدمجها خيوط التنفيذ باستقلالية (الإعداد
enable_parallel_single_level_merge، مُفعَّل افتراضيًا). يُسرّع ذلك استعلاماتGROUP BYالتي تظل فيها جداول التجزئة الخاصة بكل خيط تنفيذ دون عتبة المستويين، بينما كانت عملية الدمج تستحوذ على معظم زمن تنفيذها. #110395 (nihalzp). - أصبحت مفاتيح التجميع المكوّنة من
Stringواحد تستخدم الآن تمثيلًا أصغر لجدول التجزئة، مما يحسّن أداء أحمال عملGROUP BYالتي تعتمد بكثافة على السلاسل النصية. الإعداد الجديدenable_packed_string_keys_in_aggregationمفعّل افتراضيًا؛ ويؤدي تعطيله، أو ضبطcompatibilityعلى قيمة أقل من26.8، إلى استعادة المسار القديمStringHashTable، الذي قد يكون أسرع مع المفاتيح ذات التعددية المنخفضة جدًا التي يزيد طولها على 11 بايت. #110573 (harikrishnan94). #112089 (harikrishnan94). - تحسين أداء خوارزمية full sorting merge join بمقدار يتراوح بين 1.5 و3 أضعاف في حالات البيانات المتفرقة. #111200 (vdimir).
- تفعيل
join_runtime_filter_from_fixed_hash_tableعندما تختلف أنواع مفاتيح الربط بين جانبي الفحص والبناء (مثل مفتاح فحص من نوع Nullable مع مفتاح بناء من نوع غير Nullable). #111244 (m-selmi). - تحسين أداء عمليات الربط
RIGHTوFULLباستخدام خوارزميةparallel_hashعندما يحتوي الجانب الأيمن على مفاتيح ربط بقيمةNULLأو على صفوف استبعدها تعبيرON، وذلك بتجنّب إعادة بناء خرائط القيم الفارغة. #111258 (m-selmi). - خوارزمية تكيّفية جديدة لعمليات
GROUP BYالمتوازية (يُتحكَّم بها عبر الإعدادenable_adaptive_aggregator، المفعّل افتراضيًا): يُجري كل خيط التجميع في جدول التجزئة الخاص به إلى أن يبلغ عدد مفاتيحهadaptive_aggregator_freeze_threshold، ثم يجمّده؛ وبذلك تواصل المفاتيح المتكررة تحديث الجداول الصغيرة المقيمة في الذاكرة المؤقتة دون أي تنسيق، في حين تُوجَّه المفاتيح النادرة وفقًا لقيمة تجزئتها إلى قوائم انتظار خاصة بكل حاوية، وتُجمَّع مرة واحدة فقط ضمن عملية الدمج المتوازية على مستوى الحاويات. #111459 (nihalzp). - تسريع التجزئة على مستوى الصفوف لقيم أعمدة JSON/
Objectالمخزّنة في البيانات المشتركة (والمستخدمة مثلًا فيuniq/uniqExactعلى JSON column، وفي مفاتيحGROUP BY/DISTINCTالمُجزّأة)، وذلك بتجنّب إعادة بناءColumnDynamicلكل قيمة. تبقى قيم التجزئة دون تغيير. #111501 (valerypetrov). - تحسين أداء عمليات RIGHT وFULL hash JOIN التي تتضمن عدة فصائل
ORفي قسم ON، وكذلك عمليات RIGHT/FULL JOIN ذات الشروط المتبقية (شروط عدم المساواة). #111590 (m-selmi). - أصبحت القراءة بالترتيب عبر عملية JOIN تعمل الآن أيضًا عندما تكون عملية الربط بالتجزئة مهيّأة بعتبة تلقائية للكتابة على القرص (وهو السلوك الافتراضي منذ الإصدار 26.5). عند تطبيق هذا التحسين، تبقى عملية الربط في الذاكرة لتحافظ على ترتيب الجانب الأيسر؛ اضبط
query_plan_read_in_order_through_spilling_join = 0لاستعادة السلوك السابق، الذي لا تُستخدم فيه عمليات الربط هذه للقراءة بالترتيب وتظل قادرة على الكتابة على القرص. وفي السياق ذاته، لم يعد استعلامORDER BY ... LIMITعلىLEFT JOINمقروء بالترتيب يُبلغ عن الجدول بأكمله على أنه عدد الصفوف التي يعتزم قراءتها، ومن ثَمّ لم يعد يتجاوز حدmax_rows_to_readمعread_overflow_mode = 'throw'عند قراءة تتوقف مبكرًا. #111973 (alexey-milovidov). - إعادة تفعيل تحسين المفاتيح المتتالية لعمليات تجميع
TTL ... GROUP BYأثناء عمليات الدمج. كان المُجمِّع يُنشأ مع تمريرmin_chunk_bytes_for_parallel_parsing(عتبة بالبايت، قيمتها الافتراضية 10 MiB) في الموضع المخصّص لـmin_hit_rate_to_use_consecutive_keys_optimization(معدل إصابة ضمن[0, 1]، قيمته الافتراضية 0.5)، مما أدى إلى تعطيل التحسين نهائيًا في هذا المسار. لا تتأثر النتائج بذلك. #112314 (groeneai). - لم يعد النسخ الكسول (lazy) للأعمدة في
ARRAY JOINيضيع عند تسلسل خطة تنفيذ الاستعلام. فمعserialize_query_plan = 1، كانت العقدة التي تنفّذ جزءًا بعيدًا من الخطة تتجاهلenable_lazy_columns_replicationوتُجسِّد دائمًا كل نسخة مكرَّرة، رغم أن هذا الإعداد مُفعَّل افتراضيًا. #112330 (groeneai). - أصبح شرط المساواة في
WHEREيُدمَج في شرطJOINعندما تختلف أنواع معاملاته مع وجود نوع أعلى مشترك بينها، مثلInt32وNullable(Int32). ويتيح ذلك تحويل ربط CROSS إلى ربط INNER. #112630 (m-selmi). - إصلاح إعادة التخصيص ذات التعقيد التربيعي عند نسخ
Arrayتحتوي عناصرها على قيمJSONضمن البيانات المشتركة، كتمريرArray(JSON)ثابتة إلى دالة تجميعية. إذ كانت مثل هذه الاستعلامات تنسخ عددًا من البايتات يتزايد تربيعيًا مع عدد الصفوف. #112897 (groeneai). - استعادة استبعاد أجزاء البيانات والحُبيبات عندما تُمرَّر حدود شرط نطاق على المفتاح الأساسي أو مفتاح التقسيم في MergeTree عبر عبارة
JOIN ONمع طرف ثابت مكوَّن من صف واحد، مثلSELECT count() FROM t JOIN bounds ON t.d >= bounds.lo AND t.d <= bounds.hi. فقد كان مثل هذا الاستعلام يقرأ جميع أجزاء البيانات منذ الإصدار 25.2، ثم أصبح الإعدادquery_plan_use_logical_join_stepالذي كان يُعيد تفعيل الاستبعاد متقادمًا في الإصدار 26.5، فلم يبقَ أي سبيل لاستعادته. #112957 (groeneai). - إصلاح التعقيد التكعيبي لتخطيط الاستعلام في عمليات JOIN مع جدول
Mergeيشمل جداول كثيرة ذات بنى مختلفة. إذ كانت مثل هذه الاستعلامات قد تستغرق دقائق في تخطيط الاستعلام دون أن تستجيب لـmax_execution_timeأوKILL QUERY. #113140 (alexey-milovidov). - إصلاح تراجع في الأداء كان فيه التجميع بدون مفاتيح
GROUP BYيُسلسِل الشجرة الفرعية الكاملة لخطة الإدخال، بما في ذلك المحتوى الكامل للقيم الحرفية الناتجة عن طي الثوابت، في كل تنفيذ، وذلك لحساب مفتاح ذاكرة تخزين مؤقت لحجم جدول التجزئة لا يمكن استخدامه أبدًا. فاستعلام مثلSELECT quantileMerge(arrayJoin(arrayMap(x -> state, range(5000000))))كان يستغرق نحو 63 ms في كل تنفيذ لتحسين خطة الاستعلام، وأصبح الآن يستغرق 0.15 ms فقط. #113333 (groeneai). - تقييم عوامل التجميع
topkوbottomkوlimitkفي PromQL باستخدام خطة تدفقية تبلغ فيها حالة الاختيارO(time_steps * k)، بدلًا من جمع كل السلاسل في صف واحد بذاكرة وسيطة قدرهاO(time_steps * series^2). فالاستعلامات على المقاييس عالية الكاردينالية التي كانت تفشل سابقًا بالخطأMEMORY_LIMIT_EXCEEDEDتعمل الآن ضمن ذاكرة محدودة، كما أصبح التقييم متوازيًا بدلًا من تنفيذه في خيط واحد. #113656 (nikitamikhaylov). - استبدال خريطة التجزئة الخاصة بكل حاوية داخل الدوال التجميعية
timeSeries*ToGridبمصفوفة مسطحة مرتبة من العينات: فأصبح إدخال العينات عملية إلحاق بتعقيد O(1) للمدخلات المرتبة (وهي الحالة الغالبة بفارق كبير)، وأُلغيت عملية النسخ والفرز لكل حاوية عند الإنهاء. #113681 (nikitamikhaylov). - تقييم التعبيرات الفرعية في PromQL المشتركة بين عدة خطوات في الخطة (معامل
topk/bottomk/limitk، والطرف الأيسر منor) مرة واحدة بدلًا من مرتين: إذ أصبح SQL المولَّد من PromQL يُجسِّد الاستعلامات الفرعية المشتركة. ويُلغي ذلك المسح المكرر لجدول العينات؛ فأصبحtopkعلىrateأسرع بنحو الضعف في حالة البدء البارد، وتحسّن أداء استعلامات قواعد kubernetes-mixin بنسبة 10–29%. #113772 (nikitamikhaylov). - أصبحت ذاكرة التخزين المؤقت لشروط الاستعلام مفعّلة الآن افتراضيًا للاستعلامات التي تستخدم تحسين
ORDER BY <column> LIMIT n(TopK). لتعطيلها، اضبطuse_query_condition_cache_for_top_k = 0. #111492 #114539 (alexey-milovidov). - تنفيذ تحويل حالات التجميع الخاصة بكل خيط تنفيذ من المستوى الواحد إلى المستويين بالتوازي قبل الدمج. يُصلح هذا تراجعًا في الأداء بمقدار 2-3 أضعاف في استعلامات
GROUP BYالقصيرة ذات حالات التجميع الثقيلة (مثلCOUNT(DISTINCT ...)، وClickBench Q10/Q11) على الأجهزة ذات العدد الكبير جدًا من الأنوية، وهو تراجع ظهر في إصدارات التطوير 26.7 عندما أصبح احتساب ذاكرة التجميع دقيقًا. #114691 (alexey-milovidov). - تسريع دوال النوافذ على جداول
MergeTreeالمقسّمة عبر قراءة كل تقسيم من خلال دفق خاص به وتقييم النوافذ لكل تقسيم على حدة، مع تخطي توزيع التجزئة الذي يعيد عادةً توزيع كل صف على خيوط التنفيذ قبل فرز النافذة. ينطبق ذلك عندما يكون تعبير تقسيم الجدول دالة حتمية لأعمدةPARTITION BYالخاصة بالنافذة، ويخضع للآلية الاستدلالية للتكلفة نفسها المستخدمة فيGROUP BY/DISTINCTلكل تقسيم (عدد كافٍ من التقسيمات نسبةً إلىmax_threads، وعدم وجود تقسيم مهيمن). يُتحكَّم في ذلك عبر الإعدادات الجديدةallow_window_partitions_independently(مفعّل افتراضيًا)، وforce_window_partitions_independently، وmax_number_of_partitions_for_independent_window. #114783 (nihalzp). - تسريع الدوال التجميعية
timeSeries*ToGrid: أصبحت حسابات الحاويات لكل عينة تتجنب قسمة Int128، كما تتخطى العينات المتتالية الواقعة في الحاوية نفسها البحث في خريطة التجزئة. #114889 (nikitamikhaylov). - معالجة عينات الدوال التجميعية
timeSeries*ToGridعلى شكل دفعات من العينات المتتالية الواقعة في حاوية واحدة من الشبكة، مما يسرّع مرحلة استيعاب العينات فيtimeSeriesRateToGridوالدوال ذات الصلة بمقدار 1.2-2 مرة على بيانات السلاسل الزمنية المرتبة. #115041 (nikitamikhaylov). - لم يعد التجميع بدون مفاتيح
GROUP BYيوزّع مخرجاته المكوّنة من صف واحد علىmax_threadsمن الدفقات، وبذلك تحصل الاستعلامات التي تستمر خطتها بعد هذا التجميع على خط معالجة أصغر بكثير (معالجات أقل يلزم إنشاؤها وجدولتها وتحليل أدائها) دون أي خسارة في التوازي. #115170 (nikitamikhaylov). - تقييم أسرع لاستعلامات PromQL اللحظية: تستخدم الدوال التجميعية
timeSeries*ToGridمسار تصنيف العينات المتجهي للشبكات أحادية النقطة، كما تملأtimeSeriesIdToGroupعمود نتيجتها مباشرةً. #115267 (nikitamikhaylov). - لم يعد
JOINالذي يتضمن قسمONفيه عدة مساواات مربوطة بـORيُجسِّد أعمدة المفاتيح في الجانب الأيمن التي لا يحددها الاستعلام. #115465 (nickitat). - تسريع بناء جدول التجزئة لعمليات الربط
ANYأوSEMIأوANTIعندما تتكرر مفاتيح الربط نفسها مرات عديدة في الجانب الأيمن: لم يعد الربط يعيد قراءة الإعدادjoin_any_take_last_rowمن الذاكرة لكل صف في الجانب الأيمن. #115820 (nickitat). - تسريع
GROUP BYبدون دوال تجميعية على مفاتيح من نوعStringوFixedStringوLowCardinality: لم يعد الاستعلام يعيد كتابة عنصر نائب غير مستخدم في جدول التجزئة لكل صف، بل للصفوف التي تضيف مفتاحًا جديدًا فقط. #115834 (nickitat). - تقليل استهلاك الذاكرة ووقت تحسين خطة الاستعلام لعمليات التجميع ذات المفاتيح على القيم الحرفية الكبيرة الناتجة عن طي الثوابت. أصبح مفتاح ذاكرة التخزين المؤقت لإحصاءات جدول التجزئة الخاص بالتجميع يُجزَّأ في أثناء تسلسله بدلًا من تجميعه في الذاكرة أولًا، وبذلك لم تعد الخطة التي تتضمن قيمة حرفية كبيرة تحتفظ بنسخة منها في أثناء التحسين. فمع قيمة حرفية حجمها 80 ميغابايت، تنخفض ذروة استهلاك الذاكرة بنحو 250 ميغابايت، ويصبح التحسين أسرع بنحو 2.5 مرة. أما المفتاح المحسوب فيبقى كما هو دون تغيير. #115847 (groeneai).
- تحسين استعلامات
GROUP BY ... ORDER BY ... LIMITوGROUP BY ... LIMITعبر الاحتفاظ بكومة محدودة الحجم في أثناء التجميع لاستبعاد المجموعات التي يستحيل ظهورها في النتيجة، مما يقلل استهلاك الذاكرة ووقت التنفيذ تقليلًا كبيرًا عند التجميع على أعمدة عالية الكاردينالية. يمكن التحكم في ذلك عبر الإعدادenable_group_by_top_k_optimization. يستند هذا التحسين إلى التنفيذ الأولي الذي قدّمه Dmitriy Terenichev #96630 (thevar1able).
تحسين الاستعلامات وتنفيذها
- أصبحت القراءة المرتبة باستخدام Parallel Replicas تعتمد الآن على المنطق نفسه المتّبع في القراءة المحلية لتقسيم الجدول إلى
max_threadsمن أجزاء البيانات، وذلك لتحقيق توازٍ أفضل. #101434 (nickitat). - إضافة الاستبعاد المكاني لملفات GeoParquet على مستوى row group ومستوى الصفحة إلى قارئ Parquet. يتخطى الاستبعاد على مستوى row group مجموعات row groups بأكملها إذا لم يتقاطع مربعها المحيط مع هندسة الاستعلام. أما الاستبعاد على مستوى الصفحة فيستخدم فهرس الأعمدة
covering.bboxلتخطي الصفحات غير ذات الصلة داخل row groups. كما يعمّم هذا التحديث دفع المسندات المكانية نحو مصدر البيانات عبرIFunctionBase::isSpatialPredicate()، ويضيفGeoFilterالذي يقيّم المسندات المكانية أثناء قراءة صفوف Parquet. #104435 (bacek). - إضافة الإعداد
use_constant_folding_in_index_analysis(معطّل افتراضيًا). عند تفعيله، يدمج تحليل المفتاح الأساسي وفهرسMinMaxوفهرس التخطي فيMergeTreeالثوابتَ الخاصة بمستوى التقسيم ضمن مسند عامل التصفية بشكل منفصل لكل جزء بيانات، مما يحسّن الاستبعاد لعوامل التصفية التي تعتمد فروعها على قيم التقسيم، مثل(a = 1 AND b >= 1) OR (a = 2 AND b > 10)معPARTITION BY a. #104582 (Michicosun). - تطبيق التحديد الدقيق لمواضع الصفوف في استعلامات البحث المتجهي التي تستخدم
vector_search_with_rescoringقبل الحساب الدقيق للمسافات في مسار تنفيذ الاستعلام. #105591 (skuznetsov). - إضافة تحسين إلى خطة تنفيذ الاستعلام يدفع الدوال المقلِّصة لحجم البيانات (
lengthوlengthUTF8وemptyوnotEmpty) إلى ما قبل خطوتيSortingوFilter، مستبدلًا الوسيطة العريضة من نوعString/FixedStringبالنتيجة ذات الحجم الثابت، فلا تُخزَّن مؤقتًا أثناء الفرز ولا تُنسخ بواسطة عامل التصفية. يُتحكَّم في هذا السلوك عبر الإعداد الجديدquery_plan_push_down_volume_reducing_functionsالمفعّل افتراضيًا. #106199 (fastio). - تسريع تحميل ذاكرة التخزين المؤقت لنظام الملفات عند بدء التشغيل عبر ترميز حجم كل ملف تخزين مؤقت في اسمه (
<offset>_<size>)، مما يغني عن استدعاءstatلكل ملف. ويظل تحميل ملفات التخزين المؤقت التي كتبتها الإصدارات الأقدم مدعومًا. #107415 (alexey-milovidov). - تحسين أداء استعلامات البحث النصي المقترنة بعامل تصفية على المفتاح الأساسي. #108114 (CurtizJ).
- تحسين أداء الدالة
pointInPolygonمع مضلع ثابت. أصبح مفتاح ذاكرة التخزين المؤقت للمضلعات المعالَجة مسبقًا هو الوسيطات الثابتة الخام، بحيث يُحلَّل المضلع الثابت مرة واحدة فقط (عند عدم وجوده في ذاكرة التخزين المؤقت) بدلًا من إعادة تحليله مع كل كتلة إدخال. #108184 (groeneai). - تجنّب تحديث عدّادات الانتقائية الخاصة بـ
system.predicate_statistics_logفي مسار القراءة من MergeTree عندما تكون الميزة معطّلة (predicate_statistics_sample_rate = 0، وهي القيمة الافتراضية). يزيل ذلك تحديثًا ذريًا لكل حُبيبة وعملية عدّ بتات بتعقيدO(rows)في عامل التصفية من كل عملية قراءة، مما يعالج تراجعًا في الأداء كان أوضح ما يكون على aarch64. #108190 (groeneai). - إضافة الإعداد
merge_use_batch_sorting_queueMergeTreeلاستخدام قائمة انتظار الفرز على دفعات اختياريًا في عمليات الدمج العادية لـMergeTree، مما يقلّل استهلاك المعالج والزمن الفعلي لأحمال الدمج التي يشكّل فيها الدمج المرتب تكلفة كبيرة. #108468 (rorylshanks). - تسريع تخطيط الاستعلامات في المحلّل للتعبيرات التي تشير إلى الاسم المستعار نفسه في
WITHأو تكرّر التعبير الفرعي نفسه مرات عديدة (مثل سلاسلif/multiIfالمتداخلة بعمق)، وذلك بتجنّب إعادة بناء التعبيرات الفرعية المشتركة عند إنشاء actions DAG. #108523 (novikd). - تسريع تحليل الاستعلامات التي تحتوي على سلاسل
ANDكثيرة أو كبيرة جدًا من المقارنات: أصبح تحسينoptimize_and_compare_chainمقيدًا بميزانية عمل (عبر الإعداد الجديدoptimize_and_compare_chain_max_hash_work) بدلًا من حساب تجزئة جزء كبير من شجرة الاستعلام، ولم يعد تحليل دوال لامبدا يعيد حساب تجزئات أجسام دوال لامبدا لصالح آلية الحماية من التكرار الذاتي. #108757 (alexey-milovidov). - أصبحت المعالجات اللاحقة المقتصرة على التصفية (
if(..., '', token)) تبني الحبيبة (granule) من الرموز الخام وتحذف القيم الفارغة أثناء البناء، متجنبةً بذلك التجسيد لكل تكرار وتشغيلActionsDAGاللذين يتطلبهما المسار العام. #109049 (ahmadov). - إزالة اختناق أحادي الخيط في
ShuffleSendStepضمن خطة الاستعلام الموزع: أصبح كل دفق في المرحلة السابقة يوزّع صفوفه على حاويات الوجهة بشكل مستقل بدلًا من تمرير الجزء بأكمله عبرScatterByPartitionTransformواحد. #109206 (davenger). - تقليل الحمل على وحدة المعالجة المركزية عند تقييم التعبيرات في الاستعلامات التي تحتوي على عدد كبير من الأعمدة (مثل البحث المتجهي على عمود
QBitبخطوة صغيرة، حيث يتوسع كل متجه إلى مئات الأعمدة الفرعية لمستويات البتات، وتُمرَّر جميعها إلى استدعاء واحد لـ*DistanceTransposed). #109380 (alexey-milovidov). - دفع عامل التصفية إلى ما دون
LIMIT BYعندما يشير المسند إلى أعمدة مفتاحLIMIT BYفقط ويحتفظ البند بصف واحد على الأقل لكل مجموعة غير فارغة (LIMIT n BYمعn >= 1وOFFSET 0). يتيح ذلك لهذه المسندات (المكتوبة على شكلWHEREخارجي يحيط باستعلام فرعي يتضمنLIMIT BY) الوصول إلى طبقة التخزين للاستفادة من استبعاد المفتاح الأساسي وفهارس التخطي والإسقاطات، بدلًا من قراءة الجدول بأكمله وتطبيق أعلى N لكل مجموعة أولًا، وذلك دون تغيير دلالات الاستثناءات الخاصة بـOFFSETأوLIMIT 0 BYأو صيغLIMIT BYالسالبة. #110116 (groeneai). - تجنّب تخصيص ذاكرة في الكومة عند كل فحص لمستطيل فائق في تحليل فهرس المفتاح الأساسي، مما يسرّع تصفية العلامات بنسبة تتراوح بين 5% و26% بحسب شكل الاستعلام. #110153 (raimannma).
- أصبح دفع عوامل التصفية في Parquet (استبعاد مجموعات الصفوف وفهارس الأعمدة) يدعم التحويلات بين بدائل
DateTime64وبدائلDecimalوFloat32/Float64. #110457 (al13n321). - تحسين بناء فهارس التخطي النصية والمعتمدة على bloom filter عند استخدام مُقسِّم الرموز sparseGrams #110541 (UnamedRus).
- دمج تكلفة الإدخال/الإخراج مع الانتقائية عند ترتيب شروط PREWHERE. يُصلح هذا تراجعًا في أداء تنفيذ PREWHERE ظهر في بعض الحالات بعد https://github.com/ClickHouse/ClickHouse/pull/101275. جزء من https://github.com/ClickHouse/ClickHouse/issues/110462 #110695 (Avogar).
- تقليل عمليات تجزئة الرموز المعرّفة في عامل التصفية
IN/NOT INالخاص بالمعالج اللاحق. #111690 (ahmadov). - أصبحت الدوال mapContainsKeyLike وmapContainsValueLike وmapExtractKeyLike وmapExtractValueLike ذات النمط غير الثابت تستهلك ذاكرة ووقتًا أقل عند تفعيل enable_lazy_columns_replication. فلم يعد النمط يُنسخ مسبقًا لكل إدخال في الخريطة وقت الالتقاط، بل يُؤجَّل النسخ إلى حين تنفيذ دالة لامبدا الداخلية ويُحرَّر في وقت أبكر، فتنخفض النسخ الموسّعة من النمط بنسخة واحدة في ذروة الاستهلاك. #111749 (diegomestre2).
- تم تفعيل ميزتين خاصتين بالتخزين على القرص افتراضيًا (وترقيتهما إلى المرحلة التجريبية): 1)
packed_skip_index_max_bytes = '1M': تُكتب الآن التدفقات الفرعية لفهارس التخطي التي يصل حجمها إلى 1 MiB في أرشيف واحدskp_idx.packedلكل جزء بيانات، مما يقلل عدد الكائنات وطلبات الكتابة على التخزين الكائني. التوافق: لا يتأثر إلا أجزاء البيانات المكتوبة حديثًا، وتبقى قابلة للقراءة بالكامل في الإصدارات الأقدم؛ إذ لا تستخدم الإصدارات السابقة للإصدار 26.6 الفهارس المحزومة في التقليم (وتُعامِلها على أنها غير مُجسَّدة). اضبطpacked_skip_index_max_bytes = 0للإبقاء على التخطيط المستقل لكل ملف. 2)compute_exact_num_defaults_for_sparse_columnsإلى جانبoptimize_trivial_count_with_sparsity_filter: تُحفظ عدّاداتnum_defaultsالدقيقة لكل عمود وتُستخدم للإجابة عنSELECT count() FROM t WHERE <pred>دون مسح البيانات عندما يقسّم المسند الصفوف إلى قيم افتراضية وغير افتراضية. التوافق: تتجاهل الإصدارات الأقدم العلامةexact_num_defaultsفيserialization.json، لذا تبقى أجزاء البيانات قابلة للقراءة بالكامل بعد الرجوع إلى إصدار أقدم؛ ولا تُطبَّق إعادة كتابة العدّ إلا على أجزاء البيانات التي تحمل عدّادات دقيقة، فتبقى النتائج صحيحة في الجداول التي تضم أجزاءً مختلطة. #111816 (Algunenano). - أصبح تحسين الشروط المتعدية يستخدم عامل التصفية الإضافي في تحليل الفهرس فقط عندما يتعذر عليه تطبيق عامل التصفية بالكامل. راجع الإعداد
optimize_and_compare_chain. #112076 (yariks5s). - أصبحت واجهة برمجة تطبيقات استعلامات Prometheus (
/api/v1/query،/api/v1/query_range) الخاصة بالمحرك التجريبي TimeSeries تنفّذ الاستعلامات بالتوازي بدلًا من تنفيذها على خيط واحد. #112108 (nikitamikhaylov). - أصبح
randomHadamardTransformيُقيَّم لمتجه ثابت مرة واحدة فقط بدلًا من تقييمه مرة لكل صف. ويُسرّع ذلك استعلامات البحث المتجهي التي تدوّر متجه الاستعلام باستخدامrandomHadamardTransformقبل مقارنته بعمودQBit. #112921 (alexey-milovidov). - استعادة مشاركة المجموعات بين مهام أجزاء البيانات التابعة لتعديل واحد يُجري التصفية باستخدام
IN (subquery)على عمود مفتاح أساسي. فالإعدادenable_sharing_sets_for_mutationsمفعّل افتراضيًا، لكن المجموعة المبنية لتحليل المفتاح الأساسي لم تعد تُشارَك في ذاكرة التخزين المؤقت المشتركة، فكان الجدول الذي يضم N جزءًا من البيانات يُجسِّد المجموعة نفسها N مرة. #112941 (groeneai). - في خطط الاستعلامات الموزعة (
make_distributed_plan)، أصبحORDER BY ... LIMIT kيستخدم التجسيد المؤجل على كل نسخة متماثلة: إذ لا تُقرأ الأعمدة العريضة إلا لصفوف أعلى k المحلية في تلك النسخة بدلًا من قراءتها لكل صف مرشّح. #113111 (shankar-iyer). - تسريع تخطيط الاستعلامات عند استخدام إحصاءات الأعمدة
uniq_v2. إذ أصبح العدد التقديري للقيم المميزة يُخزَّن مؤقتًا بدلًا من إعادة حسابه عند كل طلب، علمًا بأن تخطيط الاستعلام يُصدر هذه الطلبات مرات عديدة لكل استعلام. #113357 (groeneai). - أصبح دفع عوامل التصفية إلى المصدر يعمل مع الأعمدة الفرعية من نوع
Tupleفي ملفات Parquet وORC. فمسندٌ مثلWHERE tup.1 = 555555علىfile()أوs3()أوurl()يقلّم الآن مجموعات الصفوف وخطوات فهرس الصفوف بالاعتماد على إحصاءات عنصر الـ Tuple نفسه بدلًا من قراءة الملف بأكمله. #113383 (groeneai). - تحسين أداء استعلامات PromQL على المحرك TimeSeries: أصبح استعلام SQL الداخلي للمحدِّد يقرأ أعمدة المفتاح الأساسي لجدول العينات مباشرةً (دون عمليات تحويل لا أثر لها)، ويتحقق من النطاق الزمني قبل مجموعة معرّفات السلاسل، مما يجعل الاستعلامات الباردة التي تعتمد بكثافة على المحدِّدات أسرع بنسبة 30-44%. #113768 (nikitamikhaylov).
- أصبحت محددات PromQL التي تطابق جميع السلاسل لمقياس واحد تُصفّي جدول العينات التابع لجدول
TimeSeriesباستخدام نطاق متصل من المفتاح الأساسي علىidأثناء تحليل الفهرس، بدلاً من شرطid IN <set>كبير، وذلك عندما يكون تخطيط المعرّف صفاً (tuple) من مكوّنين مع مولّد المعرّفات القياسي. يُزيل هذا التحسين التكلفة الرئيسية لتحليل الفهرس أحادي الخيط في استعلامات PromQL كثيفة المحددات: انخفاض في زمن الاستجابة البارد يصل إلى −45% في أنماط استعلامات لوحات المعلومات والقواعد، و−11% في المتوسط الهندسي البارد عبر مجموعة الاختبارات الكاملة على جدول يضم 62 مليار عينة. #114131 (nikitamikhaylov). - أصبحت نقاط نهاية واجهة برمجة تطبيقات HTTP لـ Prometheus
/api/v1/queryو/api/v1/query_rangeتُقيّم استعلام PromQL الفرعي المشترك بين عدة خطوات في الخطة مرة واحدة فقط، كما هو الحال أصلاً في دالتي الجدولprometheusQueryوprometheusQueryRange. في السابق، كان الطلب المُرسَل معenable_analyzer = 0، أو من مستخدم يضبط ملفه الشخصي هذا الإعداد، يُعيد فحص الاستعلام الفرعي المشترك مرة لكل خطوة تشير إليه. #114261 (groeneai). - إصلاح تراجع في الإصدار 26.7: في جدول
MergeTreeمرتب حسبtoUnixTimestamp(أو تحويل آخر إلى عدد صحيح) لعمود من نوعDateTime64، لم يعد عامل تصفية النطاق البسيط على ذلك العمود يستخدم المفتاح الأساسي، فكان يقرأ جميع الحبيبات في أجزاء البيانات المطابقة. إضافةً إلى ذلك، أصبح عامل تصفية مثلtoInt64(ts) >= cعلى جدول مرتب حسب عمودDateTime64الخام يستخدم المفتاح الأساسي الآن. #114413 (alexey-milovidov). - تسريع تنفيذ
INعلى الأعمدة المتجمّعة (كالأعمدة المرتبة حسب المفتاح الأساسي) عبر إعادة استخدام نتيجة الصف السابق عند تساوي الصفوف المتتالية. #114853 (nikitamikhaylov). - إصلاح التعقيد الزمني التربيعي عند بناء الدوال
h3kRingوh3ToChildrenوh3PolygonToCellsوh3PolygonToCellsWithContainmentلنتيجتها عبر عدد كبير من الصفوف. فقد استغرق استعلام على 196 000 صف مدة 838 ثانية في نسخ الذاكرة أثناء تشغيل اختبار إجهاد في CI، بينما يستغرق الآن نحو 5 ثوانٍ. #115773 (groeneai). - تحسين عمليات البحث العكسي في القواميس. أصبح شرط المساواة الثابت مثل
WHERE dictGet(dict, attr, key_expr) = valueيُطوى ثابتاً مباشرةً إلى عامل تصفية على المفتاح (key_expr = constأوkey_expr IN [...]أوWHERE 0) بدلاً من إعادة كتابته إلى استعلام فرعيIN (SELECT ... FROM dictionary(...))، كما أصبح المسار الثابت للدالةdictGetKeysيُنفَّذ بالتوازي. #91164 (nihalzp). - إضافة إعداد جديد
merge_tree_generic_exclusion_search_max_stepsيحدّ من عدد الخطوات التي تقضيها خوارزمية البحث الاستبعادي العام في تحليل فهرس المفتاح الأساسي لكل جزء بيانات. تُنفَق هذه الميزانية على أكبر نطاقات المفاتيح المتبقية أولاً، لذا تكفي حتى ميزانية صغيرة لاستبعاد معظم البيانات؛ أما النطاقات التي لم تُحلَّل بالكامل فتُقرأ كاملة، فتبقى نتائج الاستعلام صحيحة وإن كان قد يُقرأ عدد أكبر من الحبيبات. يُطبَّق الحد بمرونة، إذ يمكن تجاوزه بما لا يزيد علىmerge_tree_coarse_index_granularityخطوة، مضافاً إليها خطوة واحدة لكل نطاق مقسَّم إليه جزء البيانات مسبقاً (بواسطة ذاكرة التخزين المؤقت لشروط الاستعلام مثلاً). القيمة الافتراضية 0 تعني عدداً غير محدود من الخطوات. #92779 (EmeraldShift). - أصبحت الاستعلامات التي تحتوي على
ORDER BYوLIMITعلى طرق العرضVIEWالمبنية فوق الجداول الموزعة تستخدم تحسين دمج التدفقات المرتبة. إذ يُدفعORDER BY/LIMITالخارجي إلى الاستعلام الداخلي لطريقة العرض البسيطة، بحيث يرتّب كل جزء (shard) بياناته محلياً ويدمج المنسّق التدفقات المرتبة مسبقاً، بدلاً من إجراء فرز كامل على المنسّق. #94102 (matanper).
أداء التخزين وعمليات الإدخال/الإخراج وبحيرات البيانات
- استخدام حدود فهرس minmax الخاص بالتقسيم لاستبعاد عدد أكبر من الحبيبات أثناء تحليل المفتاح الأساسي لجداول
MergeTree، عندما يكون أحد أعمدة المفتاح الأساسي عمودَ إدخال في مفتاح التقسيم أيضًا. على سبيل المثال، في جدولMergeTreeيحتوي علىORDER BY (id, event_time)وPARTITION BY toYYYYMM(event_time)، سيستخدم ClickHouse فهرس minmax الخاص بالتقسيم علىevent_timeأثناء تحليل فهرس المفتاح الأساسي لاتخاذ قرارات أدق بشأن استبعاد الحبيبات. يُتحكَّم في هذا السلوك عبر الإعداد الجديدuse_partition_minmax_for_primary_key_pruning(المُفعَّل افتراضيًا). #103480 (UnamedRus). - تسريع العوامل التي تفحص دفقًا مرتبًا بحثًا عن تتابعات من قيم المفاتيح المتساوية، وهي:
DISTINCTبالترتيب، وLIMIT BYبالترتيب، وLIMIT BYالسالب بالترتيب، وعمليات الربطfull_sorting_mergeوpartial_merge. #106502 (nihalzp). - أصبح بإمكان قارئ Parquet v3 تجاوز مجموعات صفوف كاملة باستخدام صفحة القاموس (إضافةً إلى إحصاءات min/max وعوامل تصفية bloom) في شروط المساواة و
IN، متى كانت قطعة العمود مُرمَّزة بالكامل بالقاموس. يُتحكَّم في هذا السلوك عبر الإعداد الجديدinput_format_parquet_dictionary_filter_push_down. #106952 (alexey-milovidov). - استخدام libdeflate لضغط gzip/zlib/deflate وفك ضغطها، مما يرفع سرعتها (الضغط أسرع بنحو 1.15× مع نسبة ضغط أفضل، وفك الضغط أسرع بنحو 1.4–1.5×) مع بيانات
.gz/HTTP/url/s3ومُرمِّز GZIP في Parquet. #108074 (alexey-milovidov). - تسريع الدوال
trimLeft/trimRight/trimBothعند استخدامها لإزالة المسافات البيضاء الافتراضية (وكذلك أسمائها البديلةltrim/rtrim/trim): إذ تُنسخ الصفوف المتتالية التي لا تحتاج إلى إزالة دفعةً واحدة، ولا يُجرى فحص المسافات لكل صف إلا في الصفوف التي تحتوي فعلًا على مسافة بادئة أو لاحقة. #108177 (groeneai). - تسريع قراءة جداول Iceberg عبر الجلب المسبق لملف البيان التالي أثناء تحليل ملف البيان الحالي، بحيث تتزامن عمليات الإدخال/الإخراج مع عمل المعالج. #108543 (asya-ch).
- باتت استعلامات البحث المتجهي التي تستخدم إعادة التقييم تقصر حساب المسافة الدقيقة على الصفوف المرشحة من فهرس المتجهات، بدلًا من إعادة تقييم الصفوف المجاورة في حبيبة
MergeTreeنفسها بأسلوب القوة الغاشمة. #108846 (skuznetsov). - إضافة الإعداد
merge_tree_min_bytes_per_read_streamللحد من الإفراط في دفقات القراءة ومن الحمل الزائد لخط المعالجة في عمليات فحصMergeTreeالمحلية العادية غير المرتبة ذات الأعمدة الضيقة على الخوادم ذات الأنوية الكثيرة. #109035 (jiebinn). - تسريع التسلسل وعمليات الدمج لأعمدة
JSONالتي تحتوي بياناتها المشتركة على مسارات متفرقة كثيرة. فعند تسطيح البيانات المشتركة إلى أعمدة مستقلة لكل مسار، لم تعدflattenAndBucketSharedDataPathsتفحص كل أعمدة المسارات المتراكمة في كل صف، ولم تعد تُدرج القيمة الافتراضية خليةً تلو الأخرى؛ إذ أُزيل الفحص الذي يمر على جميع المسارات في كل صف، وأصبحت الفجوات تُملأ دفعةً واحدة. #109341 (groeneai). - أصبح البروتوكول الأصلي يرسل أعمدة
Stringعلى شكل دفق منفصل من إزاحات البايتات التراكمية (وهو التخطيط نفسه الذي يستخدمهArrayلإزاحاته) تليه البيانات المتسلسلة، بدلًا من بادئة طول من نوع varint لكل قيمة على حدة، وذلك متى كان الطرفان كلاهما يعملان على مراجعة البروتوكول 54489 أو أحدث. وبذلك يستطيع العميل قراءة أعمدةStringمع تخصيص مسبق دقيق للمخزن المؤقت وعملية نسخ مجمّعة واحدة، أي أسرع بنحو 4 مرات من التخطيط القائم على ترميز كل قيمة منفردة. ولا يتأثر العملاء والخوادم القديمة بذلك، إذ يُتفاوَض على التخطيط عبر مراجعة البروتوكول. ويتوفر التخطيط نفسه في الصيغتينNativeوBuffersمن خلال الإعدادين الجديدينoutput_format_native_write_string_with_size_stream/input_format_native_read_string_with_size_stream(وهما معطّلان افتراضيًا حفاظًا على قابلية نقل الصيغ). #110320 (vahid-sohrabloo). - لم تعد الاستعلامات التي تتضمن
FINALوتقرأ وفق ترتيب المفتاح الأساسي (ORDER BYعلى بادئة من مفتاح الفرز) مع قيمةLIMITصغيرة تستخدمsplit_intersecting_parts_ranges_into_layers_final. #110431 (KochetovNicolai). - إضافة التجسيد الكسول (التجسيد المتأخر) لقراءة ملفات Parquet من التخزين الكائني، بما في ذلك جداول Iceberg: ففي استعلامات
ORDER BY ... LIMIT n، لا تُقرأ الأعمدة غير اللازمة للفرز والتصفية إلا للصفوف الـnالمتبقية بعد تطبيقLIMIT. فعلى ملف Parquet بحجم 200 ميغابايت على S3، يقرأ الاستعلامSELECT k, s ... ORDER BY k DESC LIMIT 10مقدار 3.3 ميغابايت بدلًا من 171 ميغابايت (أي IO أقل بـ51 مرة، وسرعة أعلى بـ8 مرات). ويُتحكَّم في ذلك عبر الإعداد الجديدquery_plan_optimize_lazy_materialization_for_object_storage(مفعّل افتراضيًا، ويتطلب أيضًا تفعيلquery_plan_optimize_lazy_materialization). #110970 (alexey-milovidov). - أصبحت الاستعلامات على جداول Iceberg التي تحتوي على عدد كبير من ملفات الحذف تبدأ أسرع، إذ يقرأ ClickHouse ملفات manifest الخاصة بالحذف ويفك ترميزها بالتوازي بدلًا من معالجتها واحدًا تلو الآخر، فتتداخل عمليات القراءة من التخزين. ويتحكم الإعداد الجديد
iceberg_delete_manifest_decode_concurrency(القيمة الافتراضية4) في عدد الملفات التي يُفك ترميزها في آنٍ واحد. #112679 (asya-ch). - إضافة خيار اختياري لتسلسل الأنواع UInt128/UInt256/Int128/Int256 في Parquet بصيغة DECIMAL لتمكين تقليم مجموعات الصفوف والصفحات. #113347 (bobrik).
- إصلاح تضاعف طلبات القراءة على الأقراص البعيدة عندما تقرأ إحدى خطوات سلسلة القارئات عبر نطاقات علامات مجزأة، مثل النطاقات المُصفّاة بواسطة الفهارس الأساسية أو فهارس التخطي. #113584 (CurtizJ).
- تخطي فحص الترتيب غير الضروري عند كتابة أجزاء
MergeTreeالتي تكون جميع مفاتيح الفرز فيها ثابتة. #113899 (perfloop-agent). - أصبح التجسيد الكسول لاستعلامات
ORDER BY ... LIMIT nينطبق أيضًا على ملفات Parquet المحلية المقروءة باستخدام دالة الجدولfileومحرك الجدولFile: إذ لا تُقرأ الأعمدة غير اللازمة للفرز والتصفية إلا للصفوف الـnالمتبقية بعد تطبيقLIMIT. وتفشل القراءة الثانية للملف المتبقي فشلًا آمنًا مع الخطأ الجديدFILE_CHANGED_DURING_READإذا عُدِّل الملف بين مرحلتي القراءة. ويُتحكَّم في ذلك عبر الإعداد الجديدquery_plan_optimize_lazy_materialization_for_file(مفعّل افتراضيًا). كما يُصلح هذا التغيير فشل التجسيد الكسول للتخزين الكائني مع الخطأNot found column or subcolumn ... in blockعند تأجيل عمود فرعي مطلوب (مثل عمود فرعي من عمودJSON). #114262 (alexey-milovidov). - تسريع بناء المجموعة لـ
IN (subquery)على جداولMergeTreeالمقسّمة، وذلك بإبقاء صفوف كل تقسيم ضمن دفق واحد وإزالة التكرار من كل دفق على حدة، بحيث لا يتلقى تحويل ملء المجموعة الوحيد — الذي كان يحسب سابقاً تجزئة كل صف بشكل تسلسلي — سوى الصفوف الفريدة. ينطبق ذلك عندما يكون تعبير التقسيم دالة حتمية لأعمدة الإخراج في الاستعلام الفرعي. لا يُطبَّق هذا التحسين عندما يحتوي أكبر تقسيم على أكثر من ضعف متوسط عدد الصفوف في التقسيمات، ويمكن تجاوز هذا الفحص باستخدام الإعداد الجديدforce_creating_set_partitions_independently(المعطَّل افتراضياً). يُتحكَّم في هذا السلوك عبر الإعداد الجديدallow_creating_set_partitions_independently(المفعَّل افتراضياً). #114645 (nihalzp). - تعيين جداول سجلات النظام
MergeTreeغير المتماثلة والمدوَّرة التي لا تحتوي على TTL بوصفهاtable_readonlyلتجنّب العمليات الخلفية غير الضرورية. أصبح إعدادtable_readonlyMergeTreeيمنع أيضاً جميع الأعمال الخلفية على جدولMergeTreeالعادي، بما في ذلك عمليات الدمج العادية، ودمج TTL (DELETE/MOVE/إعادة الضغط)، ودمج إعادة الضغط، وعمليات التعديل الخلفية، ونقل أجزاء البيانات في الخلفية. كما يرفض أوامر التقسيم المعدِّلة (ATTACH/MOVE/DROP/DROP DETACHED/FETCH/REPLACE PARTITIONوMOVE PARTITION ... TO TABLEإلى الجدول)، إلى جانب عمليات الإدراج والتعديل وOPTIMIZEالتي كان يرفضها من قبل. وبالتالي، لم يعد جدولtable_readonlyالذي يحتوي على TTL يستعيد المساحة التي تشغلها بياناته منتهية الصلاحية ما دام الإعداد مفعَّلاً. #95079 (matt-metivier).
كفاءة الذاكرة والموارد
- تقليل استهلاك الذاكرة للأمر
UNLOCK SNAPSHOTبالامتناع عن تحميل البيانات الوصفية الخاصة بكل جزء بيانات التي لا يحتاجها مسار فكّ القفل، وذلك لتجنّب نفاد الذاكرة في اللقطات التي تضم عددًا كبيرًا جدًا من أجزاء البيانات. #111849 (jkartseva). - تقليل عمليات تخصيص الذاكرة عند قراءة البيانات الوصفية للنسخ الاحتياطية: أصبح كل إدخال ملف يُنقل الآن إلى بنى Map المخزّنة في الذاكرة بدلًا من نسخه. #111718 (jkartseva).
أداء الدوال والأنواع والصيغ
- أصبح تنسيق قيم
Decimalكنص أسرع بكثير — بما يصل إلى 190 مرة لنوعDecimal256ذي المقياس الكبير، ونحو 1.6 مرة لنوعDecimal64. وعلى المعالجات التي تدعم AVX-512 IFMA، أصبح تحويل الأعداد الصحيحة ذات 64 بت إلى نص أسرع بنحو 1.4 مرة. كما أُصلح التقريب فيtoDecimalString، إذ كان يُسقط المحمول الناتج عن الجزء الكسري: فقد كانتtoDecimalString(toDecimal64('9.995', 3), 2)تُرجع9.00، وأصبحت الآن تُرجع10.00. #112457 (thevar1able). - تحسين أداء خوارزمية الربط
partial_mergeعلى المفاتيح من نوعFixedStringعبر مقارنة سلاسل متتالية من القيم دفعة واحدة بدلًا من استدعاء دالة مقارنة لكل قيمة على حدة. #105737 (4ertus2). - أصبح
HashJoinيدعم أصليًا مفاتيح LowCardinality النصية غير القابلة لقيم null والمكوّنة من عمود واحد. #107264 (nickitat). - تحسين أداء
replaceAllوreplaceRegexpAllعندما يكون كلٌّ من النمط والبديل حرفًا واحدًا (مثلreplaceRegexpAll(s, ' ', '_')). لم تعد عمليات الاستبدال هذه تغيّر تخطيطString، لذا يُنسخ العمود الآن مرة واحدة وتُعاد كتابة البايتات المطابقة في مكانها، بدلًا من تشغيل حلقة بحث لكل تطابق. #108178 (groeneai). - تسريع تحليل التمثيل القياسي للتاريخ والوقت
YYYY-MM-DD hh:mm:ssفي وضع أفضل جهد (date_time_input_format = 'best_effort'،cast_string_to_date_time_mode = 'best_effort')، وهو الوضع الافتراضي. ويعالج هذا تراجعًا في أداء التحليل ظهر عند تغيير تلك القيم الافتراضية منbasicإلىbest_effort. #108187 (groeneai). - تحليل القيم الحرفية للمصفوفات والصفوف (tuple) المتداخلة بعمق في زمن خطي بدلًا من زمن تربيعي. #108892 (alexey-milovidov).
- تسريع الدالة
toStartOfInterval(وأسماؤها البديلةtime_bucketوdate_bin) بما يصل إلى 5 أضعاف للفواصل الزمنيةSECONDوMINUTEوHOUR. #109729 (raimannma). - أصبحت الدالتان
arraySortوarrayReverseSortأسرع بعدة مرات على المصفوفات الرقمية (بما في ذلكDecimalوDateTime64) عند استدعائهما دون تعبير lambda. #109832 (raimannma). - تسريع
addDaysوaddWeeksوsubtractDaysوsubtractWeeksعلى قيمDateTimeوDateTime64في المناطق الزمنية ذات الإزاحة الثابتة (مثل UTC) عبر مسار حسابي سريع. #109836 (raimannma). - تطبيق المعالجة المتجهية على فك ضغط ترميز
Delta. أصبح فك الترميز الآن أسرع بمقدار 1.5 إلى 5 مرات لأنواع البيانات ذات 8/16/32 بت، مما يجعل مسح الأعمدة المضغوطة بـDeltaأسرع بنسبة تصل إلى 20%. #110189 (raimannma). - تسريع دوال البحث في السلاسل النصية (
likeوpositionوmatchوcountSubstringsوhasTokenوغيرها) على أعمدةEnumعندما يكون النص المبحوث عنه ثابتًا، وذلك بالبحث في أسماء قيم enum المميزة فقط ثم إعادة ربط النتائج بكل صف، بدلًا من البحث في كل صف. #110325 (alexey-milovidov). - تحسين أداء دوال البحث عن السلاسل الفرعية (
positionوcountSubstringsوmultiSearch*وreplaceAll/replaceOne، وبدائلها التي تعمل دون حساسية لحالة الأحرف وبدائل UTF-8) بما يصل إلى 1.5 ضعف عند استخدام نص بحث (needle) غير ثابت، وذلك باستخدام أدوات البحث في السلاسل المدعومة بتعليمات SIMD في مسار المعالجة لكل صف بدلاً من آلية احتياطية بسيطة. #110580 (Algunenano). - تحسين أداء ضمّ (squashing) ودمج الأعمدة من النوعين
DynamicوObjectالتي تحتوي على عدد كبير من البدائل الديناميكية أو مسارات JSON. #110583 (cv4g). - تسريع
estimateCompressionRatioمع برنامج الترميزNONE#111107 (rienath). - تسريع الفرز وسائر العمليات القائمة على المقارنة في أعمدة
JSONالتي تُخزَّن مساراتها في البيانات المشتركة. في السابق، كانت كل مقارنة بين قيمتين تُجسِّد عمودDynamicمؤقتاً وتُجري إلغاء تسلسل ثنائي كاملاً لكلا الطرفين، مما جعلORDER BYعلى هذه الأعمدة بطيئاً بشكل مفرط. #111894 (groeneai). - أصبحت قسمة الأعداد الصحيحة ذات 256 بت (
Int256وUInt256وDecimal256) تحسب خارج القسمة طرفاً (limb) واحداً من 64 بت في كل مرة، باستخدام حلقة من عمليات قسمة 128 / 64 عندما يتسع المقسوم عليه في 64 بت، والخوارزمية D لـ Knuth فيما عدا ذلك، بدلاً من القسمة الطويلة بتاً واحداً في كل مرة عبر الإزاحة والطرح. يشمل هذا التحسينintDivوmoduloوالعمليات الحسابية علىDecimal256وتحويل هذه الأنواع إلى نص. #112477 (thevar1able). - لم تعد قراءة عمود
Nestedمن نوع مُرمَّز ثنائياً (Native، وRowBinaryمعinput_format_binary_decode_types_in_binary_format) تُعيد تحويل النوع إلى اسم نوع ثم تحلّله من جديد. كما يُبلَّغ الآن عن اسم نوعTupleمتداخل غير صحيح الصياغة بوصفه خطأً في الصيغة، بدلاً من استغراق وقت يتزايد أُسّياً مع عمق التداخل ثم الفشل بالخطأTOO_SLOW_PARSING. #112560 (alexey-milovidov). - تسريع استعلامات PromQL على جداول TimeSeries: أصبحت
timeSeriesIdToGroupتعيد استخدام مجموعة الصف السابق عندما تحمل الصفوف المتتالية معرّف السلسلة نفسه، فتتجاوز بذلك تسلسل المعرّف والبحث في جدول التجزئة لكل صف. #113580 (nikitamikhaylov).
تحسينات أخرى في الأداء
- تنفيذ قارئ وكاتب أصليين لصيغتي
ArrowوArrowStreamلا يعتمدان على مكتبة Apache Arrow، ما يجنّب عمليات النسخ والتحويل الإضافية للبيانات. وقد أصبحا الآن الخيار الافتراضي (الإعدادانinput_format_arrow_use_native_readerوoutput_format_arrow_use_native_writer)، وهما أسرع في القراءة والكتابة على حد سواء. #106522 (alexey-milovidov). - تحسين المسندات من نوع
nullIf(key, sentinel) = constبحيث تُبنى منها نطاقات المفاتيح، ما يتيح التقليم باستخدام المفتاح الأساسي والأقسام وفهرس التخطي. #107308 (adityaksolves). - تحسين أداء `INTERSECT ALL` و`EXCEPT ALL` (الوضع الافتراضي لـ `INTERSECT` و`EXCEPT`) بعدة أضعاف، وذلك باستخدام قيمة الصف مفتاحًا للمجموعة المتعددة بدلًا من حساب تجزئة كل صف باستخدام SipHash. #107649 (Algunenano).
- تسريع الدوال
matchوextractوextractAllوreplaceRegexpOneوreplaceRegexpAllمع التعابير النمطية البسيطة عبر تصريفها إلى شيفرة آلية أصلية باستخدام LLVM. ويُتحكَّم في ذلك بالإعداد الجديدcompile_regular_expressions(المُفعَّل افتراضيًا)؛ أما الأنماط الخارجة عن المجموعة الفرعية المدعومة فتُعالَج تلقائيًا وبشفافية عبر محرك RE2. #108004 (alexey-milovidov). - تسريع فك ضغط ZSTD على AArch64 (ARM) للأعمدة ذات إزاحات التطابق الصغيرة، مثل أعمدة الأعداد الصحيحة ثابتة العرض، وذلك بتحويل عمليات النسخ المتداخلة قصيرة الإزاحة إلى عمليات متجهية باستخدام NEON. فعلى سبيل المثال، أصبح فك ضغط عمود من نوع
UInt64أسرع بنحو 2.3 مرة كحد أقصى على AWS Graviton 4. #108049 (alexey-milovidov). - تحسين سرعة فك ضغط LZ4 للأعمدة ثابتة الحجم ومنخفضة الكاردينالية. #108175 (nickitat).
- تحسين أداء
levenshteinDistance(وeditDistance) للسلاسل النصية متوسطة الطول على ARM بتجنّب تخصيص الذاكرة في الكومة لكل صف في مسار شيفرة Myers المُقسَّم إلى كتل. #108185 (groeneai). - تسريع تحليل الأعداد ذات الفاصلة العائمة من النص عند استخدام
precise_float_parsing = 1، بحيث أصبح يضاهي المحلل الافتراضي سرعةً أو يتفوق عليه في جميع المدخلات تقريبًا. كما جرى تحديث مكتبةfast_floatالمضمَّنة إلى الإصدار v8.2.10. #108205 (Algunenano). - أصبحت دوال الترميز وفك الترميز بصيغة Base64 تستخدم
simdutf، ما يحسّن أداءها. #108333 (thevar1able). - تحسين
DISTINCTللمفاتيح ذات الكاردينالية العالية والمكلفة حسابيًا. #108366 (nihalzp). - تحسين أداء الدوال الرياضية بتفعيل تحسينات المُصرِّف التي لا تحافظ على
errno. #108628 (nickitat). - تسريع
estimateCompressionRatioللأعمدة المرمَّزة بـT64عبر حساب الحجم المضغوط تحليليًا بدلًا من إجراء الضغط فعليًا. #109054 (rienath). - أصبح بإمكان عمليات JOIN الآن استخدام فهرس المفتاح الأساسي أو فهرس التخطي في الجدول الأيسر لتقليم الحبيبات #109085 (shankar-iyer).
- تحسين أداء دوال H3 الجغرافية (
h3ToGeoBoundaryوh3ToGeoوh3CellAreaM2/h3CellAreaRads2وgeoToH3) عبر حساب الجيب وجيب التمام معًا كزوج واحد، والتخلص من الاستدعاءات المثلثية المكررة في تحويلات الإحداثيات. تبقى النتائج كما هي دون أي تغيير (متطابقة بتًا ببت). #109399 (alexey-milovidov). - تحسين أداء عمليات المقارنة (
<و>و<=و>=) لأنواع الأعداد الصحيحة الواسعة (Int128وUInt128وInt256وUInt256والأنواع المبنية عليها مثلDecimal128) بما يصل إلى 7 أضعاف، وكذلك أداء تحويل الأعداد الصحيحة ذات الإشارة إلىInt256(بما يصل إلى 7 أضعاف على البيانات مختلطة الإشارة)، وذلك بجعل شيفرة المقارنة وتمديد الإشارة خالية من التفرعات. #109474 (raimannma). - أصبحت الدوال التي تأخذ وسيطة واحدة غير ثابتة من نوع
Nullableتشارك خريطة القيم الفارغة (null map) الخاصة بالوسيطة مع النتيجة، بدلًا من تخصيص خريطة جديدة ودمجها. #110151 (raimannma). - تحسين أداء الدالتين
arrayMinوarrayMaxعلى المصفوفات الرقمية بنحو 1.3 إلى 1.5 ضعف، باستخدام اختزال متجهي بدلًا من حلقة مقارنة تمر على كل عنصر. #110163 (raimannma). - تحسين أداء
DISTINCTعندما يكون دفق الإدخال مرتبًا وفق بادئة من الأعمدة المستخدمة فيDISTINCT، مثلSELECT DISTINCT a, b FROM table ORDER BY a. إذ تصبح هذه الاستعلامات أسرع بما يصل إلى 2.4 ضعف. #110170 (nihalzp). - إضافة مسارات معالجة دفعية متجهية للدوال
groupBitOr/groupBitAnd/groupBitXorولعائلة دوال التباين (varPopوvarSampوstddevPopوstddevSampوskewPopوskewSampوkurtPopوkurtSampوcovarPopوcovarSampوcorr): أسرع بما يصل إلى 4 أضعاف مع المُركِّب-Ifعند استخدام شروط يصعب التنبؤ بها، وأسرع بما يصل إلى 3 أضعاف لعائلة دوال التباين من دونه. #110461 (raimannma). - تحسين تحليل الفهرس النصي. #110530 (CurtizJ).
- تسريع تحليل قيم
UUIDمن النص (مثلJSONExtractإلىLowCardinality(UUID)وtoUUIDوCAST AS UUID) عبر التحقق من الأرقام الست عشرية وتحويلها في تمريرة واحدة بدلًا من تمريرتين. #110625 (groeneai). - تسريع فك ضغط ZSTD على x86_64 للأعمدة ذات إزاحات التطابق الصغيرة، مثل أعمدة الأعداد الصحيحة ثابتة العرض، عبر تحويل عمليات النسخ المتداخلة قصيرة الإزاحة إلى عمليات متجهية باستخدام التعليمة
pshufbمن SSSE3 (وهو النظير على x86_64 لتحسين AArch64 NEON الوارد في #108049). #110909 (thevar1able). - تسريع
groupUniqArrayللأنواع الرقمية بما يصل إلى 3 أضعاف، باستخدام تجزئة CRC32 (كما فيuniqExact) وتضمين (inlining) عملية الإدراج لكل صف. #110917 (raimannma). - تحسين كفاءة إحصاءات minmax والإحصاءات الأساسية للأعمدة ذات الفاصلة العائمة. #111221 (cv4g).
- أصبحت نتائج استعلامات
COUNT()تُعاد مباشرةً من البيانات الوصفية الخاصة بعدد العناصر (cardinality) في الفهرس النصي. #111494 (ahmadov). - تسريع الدالتين
minوmaxعلى الأنواع ذات 128 بت و256 بت (Int128،UInt128،Int256،UInt256،Decimal128،Decimal256)، إذ أصبحتا أسرع بما يصل إلى 1.8 مرة للأعداد الصحيحة الكبيرة وبما يصل إلى 3.4 مرة للأعداد العشرية الكبيرة. #111965 (raimannma). - إصلاح تراجع في الأداء عند إدخال البيانات إلى
system.query_log. فقد كان بناء عمودَي Map المسمَّيينSettingsوasynchronous_read_countersأبطأ بنحو 6 مرات من ذي قبل، مما قد يؤدي إلى تجاوزSYSTEM FLUSH LOGS query_logمهلته البالغة 180 ثانية على الخوادم التي تسجّل عددًا كبيرًا من الاستعلامات التي عُدِّل فيها كثير من الإعدادات. #112210 (groeneai). - إضافة تخزين مؤقت اختياري للرموز غير الموجودة في الفهارس النصية. #112742 (rorylshanks).
- يستخدم التسجيل غير المتزامن الآن طابورًا محدود السعة خاليًا من الأقفال: فخيوط التنفيذ التي تكتب رسائل السجل لا تُحجب أبدًا بانتظار كائن استبعاد متبادل (mutex)، ولا توقظ خيوط تنفيذ التسجيل. #112803 (alexey-milovidov).
- استخدام فهرس المفتاح الأساسي مع الدالة
pointInPolygonعندما تكون وسيطة النقطة عمود مفتاح كاملًا من النوعPoint(أو أيTupleآخر مكوَّن من عنصرين رقميين)، مثلpointInPolygon(coord, [...])لجدول مرتَّب حسبcoord. في السابق، كانت الصيغةpointInPolygon((x, y), [...])ذات عمودَي المفتاح العدديين هي الوحيدة التي تخضع للتحليل. #112956 (alexey-milovidov). - أصبحت القيمة الافتراضية للإعداد
text_index_posting_list_apply_modeهيlazy، بحيث تفك استعلامات الفهرس النصي ترميز قوائم الترحيلات عند الحاجة على مستوى الكتل المضغوطة باستخدام مؤشر، بدلًا من تجسيدها مسبقًا في خرائط بتات (bitmaps)، وذلك للفهارس النصية التي يُضبط فيهاposting_list_codec. #113521 (CurtizJ). - تسريع التحويلات المتجهية لوسوم TimeSeries عبر استبدال إعادة التعيين القائمة على التجزئة بالفهرسة المباشرة عندما تقع معرّفات مجموعات الوسوم ضمن نطاق متضامّ. #114244 (fallintoplace).
- تحسين أداء عمليات دمج الفهارس النصية. #114525 (CurtizJ).
- استخدام أقنعة حضور مضغوطة لعوامل المجموعات في PromQL. #115224 (fallintoplace).
- لم يعد إرفاق جداول النظام ينسخ البيانات الوصفية لكل جدول، بما فيها الوصف الكامل لأعمدته، مرتين لمجرد تعيين تعليق الجدول. #115490 (thevar1able).
- تسريع التحقق من السلاسل المكررة في متجهات الشروط في PromQL التي تكون جميع قيمها أصفارًا. #115822 (fallintoplace).
- تسريع
toUTCTimestamp/to_utc_timestampوfromUTCTimestamp/from_utc_timestampمع وسيطاتDateTime64، واستعادة معدل النقل الذي فقدته بعد تصحيحات الفيضان السابقة. تبقى النتائج دون تغيير. #115838 (groeneai). - خُفِّضت تكلفة الإعداد الثابتة لتوليد البيانات العشوائية (
rand،rand64،randomString،randomFixedString،generateUUIDv4،generateUUIDv7) على معمارية x86-64. ويظهر هذا التحسّن بوضوح عندما تكون الكتل صغيرة، مع بقاء القيم المولَّدة دون تغيير. #116158 (Algunenano). - يمكنك الآن تفعيل الطيّ المبكر القائم على التقييم المختصر للدالتين المدمجتين
andوorأثناء مرحلة التحليل عبر الإعدادenable_function_early_short_circuit. ويتيح ذلك تخطّي تنفيذ الاستعلامات الفرعية ذات القيمة المفردة من نوعcount()التي تُرجع صفًا واحدًا ولا تؤثر في النتيجة، مع الحفاظ على استنتاج الأنواع المعتاد والتحقق الدلالي. #83505 (fhw12345). - استخدام استدعاء IO واحد للمخزن المؤقت مع المتجهات القابلة للتسلسل بشكل مباشر #89842 (Ergus).
- تفعيل
optimize_or_like_chainافتراضيًا. #94517 (alexey-milovidov). - تحسين أداء جلب سجل مستخدم واحد من system.users عندما يضم الخادم عددًا كبيرًا من المستخدمين. #96699 (alistairjevans).
التحسينات
تحسينات الاستعلامات ولغة SQL
- أصبحت Materialized CTEs المُشار إليها من عدة فروع في استعلام
UNIONتُجسَّد الآن مرة واحدة وتُشارَك بين جميع الفروع. في السابق، كان كل فرع يحصل على نسخته الخاصة من تعبير الجدول الشائع، والتي كانت تُضمَّن مباشرةً وتُقيَّم كلٌّ على حدة. #102107 (novikd). - تخطي JOIN runtime filter عندما يُقدَّر أن جانب الفحص صغير. يتحكم الإعداد الجديد
join_runtime_filter_min_probe_rows(القيمة الافتراضية1000) في هذا الحد. #104860 (vdimir). - جعل
EXPLAIN [PLAN] actions=1, compact=1, pretty=1السلوك الافتراضي. #105036 (Fgrtue). - تقليل زمن الاستجابة للإلغاء في الصيغ الموجبة من LIMIT BY (LimitByTransform وLimitBySortedStreamTransform): أصبح KILL QUERY وCtrl+C يقاطعان المعالجة في حدود كتلة واحدة بدلاً من انتظار اكتمال الخطوة بأكملها. #106070 (rvasin).
- أصبحت استعلامات الربط (JOIN) مدعومة مع النسخ المتماثلة المتوازية التلقائية. #106073 (nickitat).
- إضافة مقياس غير متزامن جديد UntrackedMemory (يظهر في
system.asynchronous_metrics) يُبلغ عن الذاكرة التي خصصتها خيوط التنفيذ بالفعل ولم تُحتسب بعد في عدّاد تتبع الذاكرة العام؛ إذ يُراكم كل خيط تنفيذ التخصيصات الصغيرة محليًا ثم يُبلغ عنها دفعةً واحدة. يساعد ذلك في تفسير الفروقات بينMemoryTrackingوالاستخدام الفعلي للذاكرة من قِبل العملية. كما أصبحت رسائل الخطأMEMORY_LIMIT_EXCEEDEDتتضمن مقدار الذاكرة غير المتتبَّعة، مما يُسهّل فهم سبب بلوغ استعلام ما أو الخادم حدَّ الذاكرة. #106386 (mstetsyuk). - عندما يفشل
INSERTبسبب رفض جدول الهدفTOالخاص بعرض مُجسَّد لعملية الكتابة أثناء بناء خط معالجة الإدراج (على سبيل المثال، إذا كان الهدف من نوعView، أو كان لا يدعم المعاملات)، فإن رسالة الخطأ تذكر الآن اسم العرض المُجسَّد وجدول الهدف الخاص به بدلاً من الاكتفاء بخطأ التخزين المجرد. #107234 (groeneai). - أصبح تنفيذ
ALTER TABLE ... MODIFY COLUMN <col> Tuple(...)علىTupleمُسمّى يقتصر على تعديل البيانات الوصفية فقط عند الاكتفاء بإضافة حقول فرعية، ليُضاهي بذلك سرعةADD COLUMNعلى المستوى الأعلى. تتطلب هذه الميزة تفعيلSET allow_metadata_only_named_tuple_alter = 1. #107305 (amosbird). - إضافة الإعداد
materialized_postgresql_use_extended_date_and_time_typesالذي يُحدَّد وقت الإنشاء لمحرك قاعدة البياناتMaterializedPostgreSQL. افتراضيًا (عند تفعيله)، تُستنتج أعمدة PostgreSQL من النوعdate/timestampعلى أنهاDate32/DateTime64؛ أما ضبطه على0عند تنفيذCREATE DATABASEفيؤدي إلى استنتاج النوعين الأضيقDate/DateTime. لا ينطبق هذا الإعداد على محرك الجدولMaterializedPostgreSQL. #107428 (alexey-milovidov). - أصبح
EXPLAIN PLANيُعلّم عدد الصفوف المُقدَّر لنتيجة الربط على أنه تقريبي (~~...) عندما يكون التقدير مستمدًا من تلميح أو من قيمة احتياطية عشوائية بدلاً من إحصاءات الجدول، مما يساعد في تحديد الخطط التي تفتقر إلى إحصاءات موثوقة لإعادة ترتيب عمليات الربط. #107666 (vdimir). - أصبح
INSERTفي جدولMergeTreeيستجيب لإلغاء الاستعلام ويلتزم بـmax_execution_timeأثناء كتابة أجزاء كثيرة، بدلاً من احتمال استمراره في العمل لفترة طويلة بعد إنهائه. #107929 (al13n321). - أصبحت الدالة
arrayFoldتراعي إلغاء الاستعلام والإعدادmax_execution_time. في السابق، كانت عملية الطي على مصفوفة طويلة جدًا (مثلarrayFold(acc, x -> arrayPushFront(acc, x), range(number), emptyArrayUInt64())) تُنفَّذ بالكامل داخل استدعاء دالة واحد دون إمكانية مقاطعتها، فكانKILL QUERYوالحدود الزمنية يُتجاهَلان حتى تنتهي عملية الطي. #108192 (groeneai). - إضافة
ProfileEventsلكل مرحلة من مراحل ما قبل تنفيذ الاستعلام:QueryParseMicrosecondsوQueryAnalysisMicrosecondsوQueryPlanBuildMicrosecondsوQueryPipelineBuildMicroseconds. تكشف هذه الأحداث أين يُستهلك الوقت قبل تنفيذ الاستعلام (التحليل النحوي، والتحليل الدلالي، وبناء خطة الاستعلام، وبناء مسار تنفيذ الاستعلام)، وهي متاحة فيsystem.query_logوsystem.events. #108282 (jrdi). - أصبحت عمليات
ALTER TABLEالتي من شأنها إنتاج بيانات وصفية للجدول تتجاوزmax_query_sizeتُرفض مسبقًا، مما يحول دون تعذّر تحميل الجداول من قِبل مكونات مثل توزيع DDL واستعادة النسخ المتماثلة. #108283 (lockie). - إضافة
ConstantJoinلعمليات الربط الديكارتي وعمليات الربط ذات الشروط الثابتة التي يخطط لها المحلّل، فلم تعد هذه الاستعلامات تفشل بسبب إعدادjoin_algorithmغير متوافق عند استخدام المحلّل. #108289 (antaljanosbenjamin). - إضافة عمود
sourceإلىsystem.documentationيتضمن مسار الملف المصدري الذي تُعرَّف فيه وثائق كل كيان. كما بات الجدول يوثّق خوارزميات الضغط، وأحداث ملف التعريف، والمقاييس الحالية، والمقاييس غير المتزامنة، وجداول النظام نفسها (مع أعمدتها)، وأصبحت وثائق الإعدادات تتضمن نوع كل إعداد وقيمته الافتراضية. #108346 (alexey-milovidov). - عند تحديد عبارة WHERE مع مرشحات
tableوdatabase، سيعرضsystem.iceberg_historyقواعد البيانات المطابقة فقط. ويوفّر ذلك بعض الوقت إذا كان الخادم يضم العديد من قواعد البيانات البعيدة غير ذات الصلة. #108492 (Diskein). - أصبح بالإمكان استخدام معاملات الاستعلام (عمليات الاستبدال
{name:Type}) قيمًا للإعدادات، سواء في عبارةSETTINGSضمن استعلام (مثلSELECTأوINSERT) أو في استعلاماتSETالمستقلة، ومثال ذلكSELECT ... SETTINGS max_threads = {threads:UInt64}وSET max_threads = {threads:UInt64}. #108760 (alexey-milovidov). - إتاحة حساب الفائدة المجمّعة لفهارس التخطي في EXPLAIN WHATIF. ويعرض ذلك نسبة البيانات، وهي تقاطع أداء جميع الفهارس الافتراضية المناسبة الموجودة. #108934 (yariks5s).
- أصبح الاستعلام الذي يحتوي على تعبير جدول شائع واحد يُنسَّق بالأسطر الجديدة والمسافات البادئة نفسها المستخدمة في الاستعلام الذي يحتوي على عدة تعبيرات جدول شائعة. في السابق، كان
WITH a AS (...)يُبقي تعبير الجدول الشائع على سطرWITHنفسه، بينما كان وجود تعبيرين أو أكثر يضعWITHعلى سطر مستقل مع إزاحة كل تعبير. #109092 (groeneai). - دعم ذاكرة التخزين المؤقت لشروط الاستعلام (Query Condition Cache) لملفات Parquet المحلية المقروءة عبر محرك الجداول
File(كانت مدعومة سابقًا للتخزين الكائني وبحيرات البيانات فقط). #109247 (alexey-milovidov). - أصبحت مفاتيح ذاكرة التخزين المؤقت لشروط الاستعلام (Query Condition Cache) لملفات Parquet البعيدة (في التخزين الكائني) تعتمد على ETag إلى جانب المسار، فلم يعد استبدال كائن في مكانه يؤدي إلى تقديم نتائج قديمة من ذاكرة التخزين المؤقت. #109310 (alexey-milovidov).
- لم يعد المرجع غير المؤهَّل إلى مفتاح
INNER JOINالمُساوى في شرطON(مثلSELECT id FROM a INNER JOIN b ON a.id = b.id) يُعدّ معرّفًا ملتبسًا، إذ يُضمن أن يحمل الطرفان القيمة نفسها. #109366 (alexey-milovidov). - أصبحت دوال المسافة المنقولة على
QBit(L2DistanceTransposedوcosineDistanceTransposedوdotProductTransposed، ونظيراتها المُكمَّاةL2DistanceTransposedQuantizedوcosineDistanceTransposedQuantizedوdotProductTransposedQuantized) تقبل متجهًا مرجعيًا أطول من عدد الأبعاد التي يجري البحث فيها، مع تجاهل العناصر الزائدة في نهايته. يتيح ذلك إعادة استخدام متجه استعلام كامل الحجم لبحث بأبعاد مخفَّضة (Matryoshka) دون الحاجة إلى اقتطاعه أولًا. #109388 (alexey-milovidov). - أُضيف فحص سلامة يتحقق من أن الاستعلام الموزَّع يحمل دائمًا إصدار عميل معروفًا، فيُطلق خطأً منطقيًا بدلًا من تمرير إصدار صفري بصمت إلى الأجزاء البعيدة. وأصبحت الاستعلامات التي يبدؤها الخادم (عمليات التفريغ في الخلفية، ومستهلكو الدفق، وإعادة تحميل القواميس، وعمليات تفريغ الإدراج غير المتزامن) تُبلغ عن إصدار الخادم نفسه بوصفه إصدار الجهة المُبادِرة. #109408 (alexey-milovidov).
- يُصلح هذا التحديث استخدام أسماء الأعمدة المؤهَّلة في عبارة where ضمن عملية التعديل (mutation) على محركات جداول عائلة MergeTree. #109491 (Michicosun).
- دعم دوال النافذة غير المقسَّمة (
OVER (ORDER BY ...)) في خطط الاستعلامات الموزَّعة (make_distributed_plan). في السابق، كان أي استعلام يحتوي على دالة نافذة يفشل لتعذّر تسلسلWindowStepللتنفيذ عن بُعد؛ ولا تزال النوافذ التي تحتوي علىPARTITION BYمرفوضة حاليًا. #109802 (VighneshPath). - أصبح بالإمكان تعديل بعض إعدادات المصادقة لكتالوج one-lake باستخدام
ALTER DATABASE ... MODIFY SETTING = 'xxx'. #110019 (alesapin). - أصبح الاستعلام الفرعي على الجانب الأيمن من
IN، الذي يكون عموده الوحيد مصفوفة أعمق ببُعد واحد من الوسيط الأيسر، يُفسَّر على أنه مجموعة عناصر المصفوفة (كما في القيمة الحرفية للمصفوفة أو الدالة التي تُعيد مصفوفة)، بدلًا من الفشل بخطأ مُربك لعدم تطابق الأنواع. فعلى سبيل المثال، أصبحx IN (SELECT groupArray(x) FROM ...)يعمل الآن. #110169 (alexey-milovidov). - أصبحت الاستعلامات المُسرَّعة بالتصفية الديناميكية TopK (
ORDER BY ... LIMIT k) تستفيد بصورة أكمل من ذاكرة التخزين المؤقت لشروط الاستعلام: إذ تُملأ ذاكرة التخزين المؤقت حتى عند تطبيق التجسيد الكسول، ويمكن لهذه الاستعلامات إعادة استخدام الإدخالات التي سبق أن كتبها استعلام عادي بالمُسنَدWHEREنفسه. #110507 (shankar-iyer). - أصبح
SHOW CREATE TABLE(وSHOW CREATE VIEW/SHOW CREATE DICTIONARY) يقترح جدولًا ذا اسم مشابه في رسالة الخطأ عندما يكون الجدول المطلوب غير موجود، على غرار ما تفعله استعلاماتSELECT. #110633 (alexey-milovidov). - إضافة المُعدِّل STREAM BOUNDED، الذي يقرأ اللقطة الأولى فقط من استعلام الدفق ثم ينتهي بدلًا من الاشتراك في التحديثات. #110653 (SmitaRKulkarni).
- إصلاح ذاكرة التخزين المؤقت لنتائج الاستعلامات في استعلامات PromQL. كانت لهجة
promqlتتجاوز التحقق من الدوال غير الحتمية، وقد تُعيد نتائج قديمة مرتبطة بـnow()؛ كما أن واجهة برمجة تطبيقات HTTP لـ Prometheus (/api/v1/query،/api/v1/query_range) لم تكن تخزّن أي إدخالات في ذاكرة التخزين المؤقت على الإطلاق. #110887 (nikitamikhaylov). - أصبح
EXPLAIN ANALYZEيعرض أعداد الصفوف لكل طرف من طرفَي الربط، ومعدلات التطابق، ومعامل التفرّع، والحالة الخاصة بكل خوارزمية مثل ذاكرة جدول التجزئة والتفريغ إلى القرص. استخدمmatches = 1لجمع مقاييس التطابق التي تتطلب عمليات تتبّع إضافية. #110892 (Fgrtue). - إصلاح خطأ استخدام بعد التحرير في الكومة (heap-use-after-free) في منفّذ خط المعالجة، كان قد يؤدي إلى تعطّل الخادم عندما يُزيل استعلامٌ معالِجاتٍ أثناء التشغيل (مثل
FINALمع القراءات الكسولة أو الفرز الخارجي)، وقد اكتشفه مُولِّد AST. #111017 (groeneai). - إصلاح خطأ استخدام بعد التحرير (خطأ تجزئة الذاكرة) عندما يُزيل استعلامٌ يستخدم لقطة تخزين مشتركة (الإعداد
enable_shared_storage_snapshot_in_query) أجزاءَ بيانات من اللقطة — كأن يقرأ استعلام فرعي متدفق من جدولMergeTreeنفسه الذي يقرأ منه جزء آخر من الاستعلام بالتزامن. #111192 (alexey-milovidov). - دعم خطط الاستعلامات الموزّعة (
make_distributed_plan) للاستعلامات التي يثبت في مرحلة التخطيط أن مصدرها لا يُنتج أي صفوف، مثل القراءة من جدولMergeTreeفارغ. كانت هذه الاستعلامات تفشل سابقًا بالخطأSUPPORT_IS_DISABLED. #111941 (groeneai). - إصلاح عدم تعبئة ذاكرة التخزين المؤقت لشروط الاستعلام بالحبيبات التي يستبعدها أيٌّ من حدود الاقتران باستثناء الأخير في عبارة
WHEREالتي تحتوي على عدة شروطAND. #112083 (shankar-iyer). - خفض ذروة استهلاك الذاكرة عند كتابة أعمدة JSON باستخدام تسلسل البيانات المشتركة المقسّم إلى حاويات (map_with_buckets وadvanced)، وذلك بتقسيم البيانات المشتركة إلى حاويات واحدةً تلو الأخرى أثناء الكتابة بدلًا من تجسيد جميع الحاويات دفعةً واحدة. تعود هذه الميزة بالفائدة أساسًا على أعمدة Array(JSON): ففي JSON العددي تُقسَّم البيانات المشتركة على مستوى كل حبيبة (بحدٍّ أقصى يحدده index_granularity_bytes)، لذا يكون التوفير ضئيلًا، في حين قد تحتوي حبيبة واحدة من Array(JSON) على صفوف متداخلة كثيرة، وبالتالي على قدر كبير من البيانات المشتركة، وهنا يُخفّض التقسيم حاويةً تلو الأخرى ذروة استهلاك الذاكرة بشكل ملحوظ #112172 (Avogar).
- لم تَعُد جدولة حجز الذاكرة (تجريبية) تُخرج تخصيصًا من الذاكرة عندما يكون هناك تحرير معلّق للذاكرة سيوفّر المساحة اللازمة لزيادة حجزٍ تتجاوز الحد: إذ بات قرار الإخراج ينتظر تطبيق عمليات التخفيض الجارية، مما يحول دون إنهاء الاستعلامات بلا داعٍ في ظل ضغط الذاكرة. #112299 (serxa).
- أصبح
SYSTEM DROP FILESYSTEM CACHEيحذف مفاتيح بيانات التعريف لذاكرة التخزين المؤقت بالتوازي، مما يُسرّع مسح ذاكرة التخزين المؤقت لنظام الملفات عندما يكون حجمها كبيرًا. يتحكم الإعداد الجديدdrop_cache_threadsالخاص بذاكرة التخزين المؤقت للملفات في عدد عمّال الحذف، وقيمته الافتراضية 16؛ أما القيمة 1 فتُنفّذ الحذف داخل خيط تنفيذ الاستعلام. #112532 (kssenii). - أصبح من الممكن الآن كتابة مُعدِّلات تعريف العمود -
COMMENTوCODECوSTATISTICSوTTLوCOLLATEوPRIMARY KEYوSETTINGSالخاصة بكل عمود - بأي ترتيب فيCREATE TABLE، على ألا يُستخدم أيٌّ منها أكثر من مرة واحدة. في السابق، كان يُقبل ترتيب واحد ثابت فقط، فعلى سبيل المثال كانت الصيغةx UInt64 CODEC(ZSTD) COMMENT 'text'تُعدّ خطأً نحويًا. وفيALTER TABLE ... ADD COLUMN/MODIFY COLUMN، يمكن أيضًا كتابة المُعدِّلات المدعومة -COMMENTوCODECوSTATISTICSوTTLوSETTINGSالخاصة بكل عمود - بأي ترتيب؛ كما باتتSETTINGSالخاصة بكل عمود فيADD COLUMNوSTATISTICSالمُصرَّح بها فيADD COLUMN/MODIFY COLUMNتُطبَّق الآن بدلًا من إسقاطها بصمت، وأصبح استخدامCOLLATEوPRIMARY KEYفي أوامرALTERهذه يؤدي إلى رفع استثناء بدلًا من تجاهلهما بصمت. #112788 (alexey-milovidov). - أصبح الاستعلام على جدول
Merge(أو دالة الجدولmerge) الذي يطابق عددًا كبيرًا من الجداول يستجيب الآن لـKILL QUERYوmax_execution_timeأثناء بناء خطط تنفيذ الاستعلام لكل جدول على حدة، بدلًا من عدم الاستجابة إلا بعد الانتهاء من تخطيط جميع الجداول الفرعية. #113415 (alexey-milovidov). - عندما يتجاوز استعلام
SELECTمن جدولMergeقيمةmax_execution_timeمعtimeout_overflow_mode = 'break'، فإنه يتوقف الآن عن بناء خطط تنفيذ الاستعلام للجداول المطابقة المتبقية، بدلًا من إجراء تحليل كامل للاستعلام لكل جدول مطابق قبل التوقف. ويظل الاستعلام ينتهي دون error، كما هو موثَّق لهذا الوضع. #113642 (groeneai). - عندما يختلف النوع المُصرَّح به لعمود عن بياناته الفعلية أثناء القراءة من
MergeTree(بسبب اختلاط مصادر الأنواع، كما يحدث مثلًا بعد تنفيذALTER TABLE ... MODIFY COLUMNلم يكتمل التحويل الخاص به بعد)، بات الخادم يُبلغ الآن عن استثناء واضح يذكر اسم العمود والبنيتين كلتيهما، بدلًا من إجراء تحويل نوع دون تحقُّق: ففي السابق كانت إصدارات التصحيح وإصدارات أدوات الفحص تتوقف فجأة برسالة مقتضبةBad cast from type A to Bلا تذكر أي عمود، بينما كانت إصدارات الإنتاج تعالج ذاكرة غير متطابقة بصمت. #114087 (alexey-milovidov). - تفعيل
ie_joinافتراضيًا: أصبحت القيمة الافتراضية لـjoin_algorithmالآنdirect,parallel_hash,hash,ie_join. باتJOINالذي لا يحتوي قسمONفيه إلا على شروط عدم مساواة (مقارنتان من<أو<=أو>أو>=بين تعبيرات من الجداول المربوطة) يُنفَّذ الآن باستخدام خوارزمية IEJoin القائمة على الفرز بدلًا منCROSS JOINمع مُرشِّح، كما أصبحت عمليات الربطLEFT/RIGHT/FULL/SEMI/ANTIالتي تتضمن مثل هذه الشروط مدعومة. ونظرًا لأنie_joinيأتي في آخر القائمة، فإنه لا يُستخدم إلا عندما لا تنطبق الخوارزميات الأخرى. #114327 (vdimir). - نشر سياق التتبّع في OpenTelemetry إلى الألياف المستخدمة لإنشاء الاتصال غير المتزامن وتنفيذ الاستعلامات البعيدة (الطلبات الاحتياطية، و
async_socket_for_remote، وasync_query_sending_for_remote). باتت عناصر span الخاصة بالاستعلامات البعيدة ضمن الاستعلام الموزَّع تُربط الآن بشكل صحيح كعناصر فرعية تابعة لـ spanConnection::sendQueryالخاص بالجهة المُبادِرة، بدلًا من إلحاقها مباشرةً بسياق التتبّع الذي يوفّره العميل، كما يُنتج كل تنفيذ لمهمة غير متزامنة span خاصًا به. #114813 (diegomestre2). - أصبح
DROP DATABASEيحذف الجداول الآن بترتيب طوبولوجي عكسي يراعي تبعيات التحميل والتبعيات المرجعية معًا (بعد أن كان يقتصر على تبعيات التحميل)، بحيث لا يمكن لانهيار يحدث في منتصف تنفيذDROP DATABASEأن يُخلِّف جدولًا حُذفت تبعياته مسبقًا. #114952 (alexey-milovidov). - دعم عوامل مطابقة التعبيرات النمطية بأسلوب PostgreSQL:
~(اسم بديل للدالةmatch)، و~*(مطابقة دون حساسية لحالة الأحرف)، و!~و!~*(النفي). أصبحت أوامر\dو\dtو\dvفيpsqlتعمل الآن عند الاتصال بـ ClickHouse عبر بروتوكول التوافق مع PostgreSQL، ولم يعد فشل أي استعلام يؤدي إلى إنهاء الاتصال. #115066 (alexey-milovidov). - أصبح
EXPLAIN WHATIFيوضّح سبب تخطي التقدير التجريبي، وذلك في سطر جديدempirical_reasonيظهر عندما تكون قيمةempirical_statusهيunsupported. #115140 (yariks5s). - عندما تعجز جميع خوارزميات الربط المفعّلة عبر الإعداد
join_algorithmعن تنفيذJOIN، أصبحت رسالة الخطأ تذكر الخوارزميات التي جُرّبت، ودرجة الصرامة ونوع عملية JOIN التي فشلت، بدلاً من الاكتفاء بالإشارة إلى أن أياً منها لم ينجح. #115226 (elkinal). - أصبح بإمكان استعلامات البحث المتجهي استخدام فهرس التشابه المتجهي عندما يكون المتجه المرجعي قيمة حرفية لمصفوفة أعداد صحيحة، مثل
ORDER BY L2Distance(vec, [1, 2]). وفي السابق، كانت هذه الاستعلامات تلجأ بصمت إلى الفحص الشامل بالقوة الغاشمة. #115255 (rschu1ze). - لم يعد
BACKUPيترك ملف قفل في وجهته عندما تفشل المحاولة التي أنشأته قبل كتابة أي شيء — سواء فشلت أثناء حجز الوجهة أو أثناء فتح أرشيف. فلم يكن بإمكان أي نسخة احتياطية لاحقة مطابقة هذا القفل، وبالتالي كانت كل إعادة محاولة إلى الوجهة نفسها تفشل إلى أن يُحذف الملف يدوياً. كما أصبحت النسخ الاحتياطية إلى وجهاتS3وAzureتُنشئ القفل بشكل حصري، ويُبلَّغ عن القفل العائد لنسخة احتياطية أخرى على أنه نسخ احتياطي متزامن بدلاً من أي خطأ يُعيده نظام التخزين. #115387 (jkartseva). - أصبح التتبع الذي يبدأ عبر أخذ العينات (
opentelemetry_start_trace_probability) يُكتب مجدداً في معلومات العميل الخاصة بالاستعلام، بحيث تنضم الاستعلامات الثانوية البعيدة والموزعة، وإدخالات DDL، إلى التتبع نفسه بدلاً من بدء تتبعات منفصلة. #115619 (diegomestre2). - إصلاح
CREATE TABLEلجداول Iceberg المدعومة بـ Amazon S3 Tables، التي تتولى إدارة مواقع الجداول بنفسها. #115652 (scanhex12). - أصبح التجميع التكيّفي لـ
GROUP BY(enable_adaptive_aggregator) يقيس ما إذا كان تأجيل المفاتيح النادرة مجدياً، ويعود إلى الخوارزمية العادية عندما تكون مفاتيحها أو وسائط التجميع الخاصة بها أعرض من أن يكون نسخها مجدياً، بحيث تعمل عمليات التجميع على أعمدة السلاسل النصية الثقيلة (مثلmin(URL)لكل مستخدم) بسرعة الخوارزمية العادية واستهلاكها للذاكرة. ويضيف الإعدادadaptive_aggregator_freeze_threshold_bytesلتحديد حجم أقصى بالبايت للجدول المجمَّد في كل خيط تنفيذ (ويُجمَّد الجدول عند بلوغ هذا الحد أو عتبة عدد المفاتيح، أيهما يتحقق أولاً). #115755 (nihalzp). - يضيف الإعداد
query_plan_aggregation_bucket_top_k(مفعّل افتراضياً) لتشغيل أو إيقاف تحسين الخطة الذي يُجسِّد فقط أفضلnمجموعة في كل حاوية ثنائية المستوى عندما يغذّي تجميعٌ نهائي عبارةORDER BYعلى مخرجاته معLIMIT n. كما أصبح هذا التحسين يظهر الآن في إخراجEXPLAIN. #116124 (nihalzp). - تحسين دعم استعلام
DESCRIBEللعروض ذات المعلمات. ودعم العروض ذات المعلمات في التعبيرات العددية ضمن المحلّل الجديد. #68978 (novikd). - أصبحت الاستعلامات مثل
SELECT * FROM t WHERE idتستفيد الآن من فهرس التخطي على العمودid. #89603 (adityachopra29). - أُضيف الإعداد
query_plan_merge_expression_into_joinللسماح بدمج خطوات Expression في خطوات JOIN أثناء تحسين إعادة ترتيب عمليات الربط. يتيح ذلك إعادة ترتيب عمليات الربط عبر الاستعلامات الفرعية التي تحتوي على عمليات ربط (على سبيل المثال، عندما تكون عملية JOIN داخل استعلام فرعي يتضمن أعمدة محسوبة)، مما يُحسّن معالجة أشجار الربط المعقدة. #98533 (vdimir). - أُضيف العمود
is_wildcardإلى الجدولsystem.grants، ويُبيّن ما إذا كانت الأذونات تعتمد على مطابقة البادئة باستخدام حرف البدل (مثلGRANT SELECT ON db*.*). في السابق، كان يتعذّر التمييز فيsystem.grantsبين الأذونات الممنوحة بحرف البدل والأذونات الممنوحة بمطابقة تامة على الاسم نفسه. #98577 (il9ue).
الدوال وأنواع البيانات
- أُضيف إعداد جديد
allow_lossy_numeric_supertype(معطَّل افتراضيًا). عند تفعيله، تُحَل الدوالifوmultiIfوcoalesceوifNullوarrayوmapالمطبَّقة على وسيطات رقمية ليس لها نوع مشترك دون فقدان في الدقة (على سبيل المثالDecimalوFloat64، أوInt64وFloat64) إلى النوع الرقمي الأعلىFloat64بدلًا منVariant، بحيث يمكن استخدام النتيجة مع الدوال التجميعية مثلsumوavgوminوmax. كما أصبح اسم الإعداد يُذكر في رسائل الخطأ ذات الصلة الصادرة عن الدوال التجميعية. #107236 (groeneai). - أصبح محدِّد المصفوفة
SOME/ALL(expr OP SOME(array)/expr OP ALL(array)) يدعم الآن أيضًا مسندات المقارنة بالكلمات المفتاحيةIS DISTINCT FROMوIS NOT DISTINCT FROM، ومسندات البحث في السلاسل النصيةLIKEوILIKEوNOT LIKEوNOT ILIKEوREGEXP، إذ تُعاد كتابتها إلىarrayExists/arrayAll. #107454 (alexey-milovidov). - إضافة الإعداد
input_format_json_max_object_sizeلتقييد حجم كائن JSON أثناء التحليل. #107669 (Avogar). - إصلاح تسرّب في الذاكرة كان يحدث عند فشل فتح قاعدة بيانات SQLite (على سبيل المثال، عند تمرير مسار يتعذّر فتحه إلى دالة الجدول
sqliteأو محرك قاعدة البياناتSQLite). #107807 (alexey-milovidov). - دعم الدالة
lengthلنوع البياناتQBit، إذ تُعيد بُعد المتجه بوصفه قيمة ثابتة. #108071 (alexey-milovidov). - دعم
CASTمنQBitإلىArrayمع إعادة بناء المتجه الأصلي، وهو عكس التحويل المتوفر حاليًا منArrayإلىQBit. #108072 (alexey-milovidov). - أصبح محرك قاعدة البيانات
MySQLومحرك الجدول ودالة الجدول المقابلان له تربط الآن أنواع أعمدة MySQL المكانية (LINESTRINGوPOLYGONوMULTILINESTRINGوMULTIPOLYGONوالنوع العامGEOMETRY) بالأنواع الهندسية المقابلة في ClickHouse بدلًا منString. ويُتحكَّم في ذلك عبر العلَم الجديدgeometryفي الإعدادmysql_datatypes_support_level، وهو مفعَّل افتراضيًا. ولا يزالPOINTيُحوَّل دائمًا إلىPoint. ويُربط العمود العامGEOMETRYبالنوع الشاملGeometry؛ أما قراءة قيمة ليس لنوعها الفرعي مقابل في ClickHouse (MULTIPOINTوGEOMETRYCOLLECTION) فترفع استثناءً وقت القراءة. #108944 (alexey-milovidov). - اعتماد خوارزمية التحليل الدقيقة للأعداد العشرية (التي تختار أقرب قيمة قابلة للتمثيل) افتراضيًا، وتطبيق الإعداد
precise_float_parsingعلى صيغ الإدخال (CSV وTSV وJSON وVALUES وغيرها) والقيم الحرفية الرقمية، لا علىtoFloat*/CASTفحسب. اضبطprecise_float_parsing = 0لاستعادة السلوك السابق الأقل دقة، والأسرع في بعض الحالات. #109086 (Algunenano). - دعم
reinterpretلـArrayمن عناصر ثابتة الحجم بوصفهاString، وهو عكس عمليةreinterpretالمتوفرة حاليًا لـString/FixedStringبوصفهاArray. #109383 (alexey-milovidov). - السماح بتنفيذ
CASTبين أنواعQBitالتي تختلف في نوع العنصر و/أو قيمة stride، ما دام البُعد ثابتًا (مثلCAST(x AS QBit(Float64, N))منQBit(Float32, N)). التغييرات المقتصرة على stride لا تُفقد أي بيانات؛ أما تغييرات نوع العنصر فتخضع لدلالات تحويلArrayالمقابلة (فمثلًا قد يؤدي التحويل منFloat32إلىBFloat16إلى فقدان الدقة، كما ترفضaccurateCast/accurateCastOrNullالصفوف التي يتعذّر تمثيلها تمثيلًا دقيقًا). #109387 (alexey-milovidov). - أصبحت الدالتان
quantizeBFloat16ToInt8وdequantizeInt8ToBFloat16تقبلان أيضًا وسائط من النوعينArrayوQBit، فتُطبِّقان ترميز Lloyd-Max على المتجه بأكمله (وتُرجعانArray/QBitمن نوع العنصر المقابل)، وذلك إلى جانب صيغ التحميل الزائد العددية الحالية. #109398 (alexey-milovidov). - أصبح محدد التنسيق
%fبأسلوب MySQL فيparseDateTime/parseDateTime64(وفي صيغتيهماOrZero/OrNull) يقبل من 1 إلى 6 أرقام كسرية، تُفسَّر على أنها أجزاء من المليون من الثانية بمحاذاة إلى اليسار على غرارSTR_TO_DATEفي MySQL، بدلًا من اشتراط 6 أرقام بالضبط. كما أُصلح اختلال محاذاة جداولPrettyCompactفي أمثلة توثيق الدوال المدمجة. #109421 (alexey-milovidov). - أُعيدت تسمية الإحصائية الفرعية
NullCountضمن إحصائياتbasicإلىDefaultCount: فبدلًا من عدّ صفوفNULLفي عمودNullable، أصبحتbuildتعدّ الصفوف المساوية للقيمة الافتراضية الأصلية لنوع العمود عبرIColumn::getNumberOfDefaultRows. #109977 (hanfei1991). - تقليص حجم الملف الثنائي بنحو 10.5 ميغابايت عبر تنفيذ عمليات المقارنة والعمليات الحسابية على أزواج الأنواع المختلطة نادرة الاستخدام (
Decimalمقابل عدد صحيح بعرض مختلف، والأزواج التي تتضمنInt128/UInt128/Int256/UInt256) من خلال التحويل إلى نوع مشترك، بدلًا من تخصيص نواة مُصرَّفة لكل تركيبة من الأنواع. أما الأزواج من النوع نفسه والأزواج شائعة الاستخدام والعملياتplus/minus/multiplyالمقيدة بعرض نطاق الذاكرة فتحتفظ بأنويتها المخصصة؛ ولم يطرأ أي تغيير على النتائج وأنواعها والحالات الاستثنائية. #110131 (alexey-milovidov). - لم تعد القراءة من محرك الجدول
SQLiteأو دالة الجدولsqliteتستهلك نواة معالج كاملة في انتظار نشط عندما تكون قاعدة بيانات SQLite مقفلة من قِبل اتصال آخر، إذ باتت عملية القراءة تظل خاملة في أثناء انتظار تحرير القفل مع بقائها قابلة للإلغاء. #110248 (groeneai). - تقريب قيم الزمن المنقضي والمعدل والنسبة في رسائل السجل ورسائل الاستثناءات إلى ثلاثة أرقام، فلم تعد أرقام مثل
1.345844286 sec.تُطبع بالدقة الكاملة. #110277 (alexey-milovidov). - إصلاح عمليات القراءة في
MergeTreeلأعمدةStringذات دفق الحجم المنفصل بعد تخطي الصفوف الأولى، والتي كان من الممكن أن تُرجع بيانات خاطئة أو تقرأ خارج الحدود من ذاكرة التخزين المؤقت للتدفقات الفرعية. كما أُصلح احتمال إرجاع بيانات خاطئة عندما تصل عمليات قراءة متزامنة أو متكررة إلى كائن فرعي فيJSONمخزَّن بتسلسل البيانات المشتركة من نوع map. #110471 (alexey-milovidov). - دعم عبارة
SETTINGSفي محرك الجدولPostgreSQLودالة الجدولpostgresql(مثلSETTINGS postgresql_connection_pool_size = 50)، بما يحقق التكافؤ في الميزات مع المحركMySQL. #110614 (alexey-milovidov). - أصبحت الدالتان
bitmaskToArrayوbitmaskToListتدعمان الوسيطات من النوعين(U)Int128و(U)Int256. كما أصبح زمن تنفيذ الدالةbitPositionsToArrayمع وسيطات الأعداد الصحيحة الكبيرة متناسبًا مع عدد البتات المضبوطة، لا مع موضع أعلى بت مضبوط. #110743 (raimannma). - إصلاح معالجة ترميز GCD للقيم المُؤشَّرة ذات العرض الثابت التي تتضمن أعدادًا سالبة. في السابق، كان المقسوم عليه يُحسب مباشرةً من القيم المُؤشَّرة، مما قد يؤدي إلى عدم اكتشاف المقسوم عليه المشترك وانخفاض كفاءة الضغط بشكل ملحوظ في أعمدة الأعداد الصحيحة والعشرية المُؤشَّرة. أما الآن فيُحسب المقسوم عليه من القيم المطلقة للأنواع المُؤشَّرة، مع الإبقاء على السلوك الحالي للأنواع غير المُؤشَّرة ولعملية فك الضغط. #113798 (kshcherbatov).
- أصبحت دوال النافذة المستخدمة مع
PARTITION BYتعمل عند تفعيلmake_distributed_plan. وعندما تسمح بنية الخطة بذلك، تُنفَّذ النافذة بالتوازي عبر حاويات تتلقى كلٌّ منها تقسيمات كاملة. #114111 (VighneshPath). - تُستخدم الآن دالة تجزئة بطول 64 بت في طرق التجميع الخارجية للقيم ذات العرض الثابت القابلة لأن تكون NULL (لتجنّب التصادمات الكارثية عند التجميع على قيم ذات عدد كبير جدًا من القيم المميزة). #114210 (nickitat).
- أصبح التعبير
x IN (subquery)على عمود من النوعLowCardinalityيُرجعLowCardinality(UInt8)، وهو النوع نفسه الذي يُرجعهx IN (literal list). في السابق، كانت الصيغتان تُرجعان نوعين مختلفين، وكانت الخطط الموزعة التي تتضمن تعبيرINكهذا تتطلب معالجة خاصة عند التحقق من الأنواع في الخطة. #114229 (davenger). - دعم تحليل الأعداد الصحيحة التي تتجاوز نطاق 64 بت في نوع البيانات
JSONوفيJSONExtractوisValidJSON. إذ تُقرأ هذه القيم في أنواع أعداد صحيحة واسعة مثلInt128/UInt256بدلًا من رفض المستند بأكمله. #114379 (Avogar). - إضافة
keywordكاسم بديل لمُقسِّم الرموزarrayفي الفهرس النصي، لتحسين التوافق مع OpenSearch وElasticsearch وSolR وLucene. #115507 (rschu1ze). - أصبحت الدوال
toDateOrNullوtoDateTimeOrNullوtoDateTime64OrNullتقبل وسيطات من جميع أنواع الأعداد الصحيحة الأصلية (وتُفسِّرها بالطريقة نفسها التي تعتمدهاtoDateوtoDateTimeوtoDateTime64، مع وسيطة اختيارية للمنطقة الزمنية)، وتُرجعNULLللقيم الواقعة خارج نطاق نوع النتيجة. على سبيل المثال، يُرجعtoDateTimeOrNull(1583851242, 'Asia/Shanghai')القيمة2020-03-10 22:40:42، ويُرجعtoDateTimeOrNull(4294967296)القيمةNULL. #79791 (jitendra1411).
التخزين وبحيرات البيانات والتخزين الكائني
- أُضيفت مقاييس Prometheus اختيارية لنشاط الإخلاء في ذاكرة التخزين المؤقت لنظام الملفات (
filesystem_cache_evictions_totalوfilesystem_cache_evicted_bytes_totalوfilesystem_cache_evicted_segment_hitsوfilesystem_cache_evicted_segment_size_bytes، إضافةً إلى نسخها الخاصة بكل مستخدم والموسومة بـuser_id)، وتُعرض لكل ذاكرة تخزين مؤقت على حدة عبرsystem.dimensional_metricsوsystem.histogram_metricsونقطة نهاية Prometheus. ويُتحكَّم فيها عبر إعدادَي تهيئة قرص ذاكرة التخزين المؤقتexpose_prometheus_eviction_metricsوexpose_prometheus_eviction_metrics_per_user(وكلاهما معطَّل افتراضيًا)، ويمكن تفعيلهما أو تعطيلهما أثناء التشغيل عبرSYSTEM RELOAD CONFIG. #105020 (sacheendra). - أصبح المحرك
Aliasيدعم القراءة عبر النسخ المتماثلة المتوازية عندما يكون الجدول الهدف من محركات عائلةMergeTree. #107830 (nauu). - قُيِّد عدد أجزاء البيانات المُجهَّزة في آنٍ واحد أثناء النسخ بأسلوب القراءة ثم الكتابة في Azure Blob Storage (المستخدَم في النسخ الاحتياطية عند تعذُّر النسخ الأصلي) بالقيمة max_inflight_parts_for_one_file، مما يمنع الاستهلاك المفرط للذاكرة عند نسخ عدد كبير من الملفات الضخمة بالتوازي. #108232 (SmitaRKulkarni).
- أُضيف دعم العمود الافتراضي
_etagلتخزين HDFS #108255 (zhangyifan27). - أُضيف العمودان
settingsوengine_settingsإلىsystem.backupsوsystem.backup_log. يعرضsettingsالإعدادات الخاصة بالنسخ الاحتياطي/الاستعادة المطلوبة لعملية ما (مثلallow_s3_native_copyوdeduplicate_filesوstructure_only)، بينما يعرضengine_settingsالإعدادات التي يستخدمها فعليًا القارئ/الكاتب في محرك النسخ الاحتياطي (مثل إعدادات طلبات S3 كـallow_native_copy، والتي قد تختلف عمّا طُلب بعد دمج تهيئة نقطة النهاية). وبذلك يمكن معرفة الإعدادات التي نُفِّذت بها عمليةBACKUP/RESTOREفعليًا. #108334 (jkartseva). - أُضيف
system.s3_queue_metadataوsystem.azure_queue_metadataلفحص حالة Keeper لجداولS3QueueوAzureQueueالمسجَّلة، بما في ذلك أعداد الملفات المعالَجة والجاري معالجتها والفاشلة. #108522 (kssenii). - خُفِّض استهلاك الذاكرة في ذاكرة التخزين المؤقت لترويسات الفهرس النصي بمقدار 2 إلى 2.5 مرة، فباتت تتسع لعدد أكبر من ترويسات أجزاء البيانات (الإعداد
text_index_header_cache_size)، مما يقلل عمليات القراءة من القرص في استعلامات البحث النصي. #109332 (CurtizJ). - أُضيفت أعمدة للتوافق مع MySQL إلى طرق عرض
INFORMATION_SCHEMA: SCHEMATA.DEFAULT_COLLATION_NAMEوDEFAULT_ENCRYPTION؛ وTABLES.ENGINEوأعمدة MySQL ذات الصلة؛ وCOLUMNS.COLUMN_KEYوPRIVILEGESوGENERATION_EXPRESSIONوSRS_ID. يتيح ذلك للعملاء المتوافقين مع MySQL تنفيذ استعلامات استكشاف الكتالوج دون مواجهة الخطأUNKNOWN_IDENTIFIER. #109351 (alexey-milovidov). - خُفِّض استهلاك الذاكرة لجداول
MergeTreeالتي تضم عددًا كبيرًا من أجزاء البيانات، وذلك بمشاركة البيانات الوصفية المشتقة من المخطط لكل جزء (قائمة الأعمدة، وأوصاف الأعمدة، والتسلسلات، والتدفقات الفرعية للأعمدة) بين أجزاء الجدول بدلًا من نسخها في كل جزء. ويبلغ الأثر ذروته في الجداول العريضة التي تضم عددًا كبيرًا من الأجزاء الصغيرة. #109816 (Algunenano). - أُضيف إعداد جديد
use_projection_index_in_read_pools(معطّل افتراضيًا). عند تفعيله، تُستبعد نطاقات العلامات التي يرشّحها فهرس الإسقاط بالكامل داخل مجمّعات القراءة فيMergeTreeقبل إنشاء مهام القراءة الخاصة بها، بدلًا من تخطّيها حبيبةً تلو الأخرى أثناء القراءة. وبذلك يُتجنّب إنشاء مهام قراءة وتهيئة قارئات لبيانات لن تُقرأ أصلًا، وتظل أحجام مهام القراءة مقيسةً بالعلامات المتبقية. #110291 (KochetovNicolai). - خُفّض مستوى تفصيل تشخيصات البحث الثنائي في المفتاح الأساسي لكل جزء بيانات في
MergeTree، وذلك بنقلها من مستوى التسجيل trace إلى مستوى التسجيل test. #110324 (alexey-milovidov). - أُصلحت عمليات إعادة الاتصال غير المبرّرة لاتصالات HTTP المستمرة (keep-alive) ضمن مجمّع الاتصالات عبر TLS (HTTPS وS3). كان فحص الاتصالات المنتهية الصلاحية يستخدم
pollعلى المقبس، فيُبلغ خطأً عن اتصال آمن نشط بأنه مغلق إذا كان يحمل سجل TLS غير مقروء تالٍ للمصافحة (تذكرة جلسة أوKeyUpdate)؛ أما الآن فيُستخدمMSG_PEEKغير حاجب على المقابس العادية وSSL_peek/SSL_has_pendingعلى مقابس TLS، مما يتيح أيضًا الكشف الصحيح عن إنهاء TLS المنظّم وعن سجل TLS لم يصل إلا جزئيًا. #110402 (alexey-milovidov). - أصبح بإمكان كتالوجات OneLake استخدام رموز التحديث (refresh tokens) في OAuth لتجديد رموز الوصول. #110413 (alesapin).
- أُضيف الحدث ProfileEvent المسمّى
DuplicationDataHashComputations، الذي يحصي عمليات حساب تجزئة البيانات على مستوى الأعمدة التي تُنفَّذ أثناء إزالة تكرار الكتل المُدرجة عبر INSERT في جداول*MergeTree. #111173 (valerypetrov). - أصبح ملف SST الخاص بفهرس UNIQUE KEY يُكتب مباشرةً في جزء البيانات عبر طبقة تجريد التخزين، بدلًا من وضعه أولًا في ملف مؤقت محلي. #111189 (JingYanchao).
- أُضيف دعم الكتابة المتزامنة إلى جداول Iceberg على قرص محلي: إذ أصبح
LocalObjectStorageيدعم الكتابة الشرطية، فباتت عملية المقارنة والتبديل (compare-and-swap) التي تنشر لقطة جديدة عبرversion-hint.textتعمل عليه، ولم يعد بإمكان الكتّاب المتزامنين أن يُضيّع أحدهم تحديثات الآخر. #112556 (alexey-milovidov). - أصبحت ذاكرة التخزين المؤقت لمناطق الحاويات (buckets) في عميل
S3تعمل أيضًا مع كتالوجات بحيرات البيانات؛ إذ كان كل طلب إليها في السابق يعيد تحديد المنطقة من جديد. #113330 (scanhex12). - أصبحت إخفاقات الشبكة من جهة العميل في Azure (إعادة تعيين الاتصال أو رفضه، وأخطاء DNS وTLS) تُعاد محاولتها بوصفها أخطاء نقل بدلًا من ظهورها على هيئة خطأ
500مُصطنع، على غرار سلوك عميل S3. #115269 (arsenmuk).
الصيغ والإدخال
- أصبح من الممكن استخدام ضغط snappy في واجهة HTTP (
Accept-Encoding: snappy)، وأُضيف الإعدادsnappy_modeلاختيار صيغة كتل Hadoop snappy أو صيغة التأطير snappy framing في عمليات الإدخال/الإخراج العامة بضغط snappy عبرfile/url. #100752 (alexey-milovidov). - أُضيف الإعداد
input_format_csv_missing_nullable_as_empty_string(معطّل افتراضيًا). عند تفعيله، تُقرأ القيمة المفقودة من النوعNullable(String)في مدخلات CSV على أنهاStringفارغة بدلًا منNULL، بصرف النظر عن قيمةinput_format_csv_empty_as_default. #107577 (alexey-milovidov). - عند معالجة رسائل protobuf باستخدام
input_format_protobuf_oneof_presence، لم يعد التطابق التام للوسوم مطلوبًا، وذلك لإتاحة تغييرات المخطط. #109174 (ilejn). - أُزيل قارئ ORC القديم المعتمد على Apache Arrow، وأصبحت صيغة إدخال ORC تستخدم دائمًا أداة فك الترميز الأصلية في ClickHouse (وهي الافتراضية سابقًا). كما أصبح الإعداد
input_format_orc_use_fast_decoderمتقادمًا (لا يزال مقبولًا، لكن دون أي تأثير). #110074 (alexey-milovidov). - أصبح محرك Hive يقرأ البيانات الوصفية لملفات ORC (فهارس القيم الدنيا/القصوى، وأعداد الصفوف) باستخدام قارئ ORC الأصلي في ClickHouse بدلًا من adapter ORC الخاص بـ Apache Arrow. #110086 (alexey-milovidov).
الأمان والوصول وإمكانية المراقبة
- أُضيف عمود جديد
skipping_indices_typesإلى الجدولsystem.tables، يحتوي على الأنواع المختلفة لفهارس تخطي البيانات المعرَّفة لكل جدول. #106388 (CurtizJ). - أصبحت القيمة التلقائية للإعداد
max_threadsوالإعدادات المماثلة تُعرض الآن فيsystem.settingsبالشكلauto(8)بدلاً من'auto(8)'؛ فقد كانت علامتا الاقتباس المفردتان المحيطتان بالقيمة أثراً قديماً عالقاً بها منذ زمن طويل. ويظل التوافق بين الإصدارات محفوظاً، إذ لا يزال الشكل القديم المحاط بعلامات الاقتباس مقبولاً عند تحليل الإعدادات الواردة من خوادم أقدم. #108657 (alexey-milovidov). - أصبحت القيمة الافتراضية الفارغة للإعداد تُصيَّر على أنها سلسلة فارغة في
system.documentationبدلاً من علامتي backtick فارغتين. #108708 (alexey-milovidov). - أصبح توثيق الإعداد في
system.documentation، المعروض في صفحة/docsالمدمجة وعبر الأمرhelp، يتضمن سجل التغييرات التي طرأت على قيمته الافتراضية: الإصدار الذي أُضيف فيه الإعداد، وكل تغيير لاحق في قيمته الافتراضية، مع القيمة السابقة والقيمة الجديدة وسبب التغيير. #112177 (alexey-milovidov). - يمكن الآن استرجاع توثيق جميع عبارات SQL (مثل الاسم والصيغة والوصف والأمثلة) من جدول النظام
system.statements. #115341 (rschu1ze).
الإعدادات والتهيئة
- أُضيف إعداد خادم جديد
memory_worker_rss_speculative_reserve_ratio(القيمة الافتراضية1.0، أو0في إصدارات sanitizer) يجعل متعقّب الذاكرة العام يحجز استباقياًratio * min(resident - previous_resident, resident - tracked)فوق قيمة RSS المرصودة في كل دورة من دوراتMemoryWorker. يدفع ذلك تقديرات المتعقّب نحو الأعلى حين يسبق نموُّ RSS ما يسجّله المتعقّب بين العينات، فتتلقى عمليات التخصيص الخطأMEMORY_LIMIT_EXCEEDEDفي وقت أبكر، ويقلّ احتمال أن يتدخل OOM-killer الخاص بالنواة أولاً. اضبط النسبة على0لتعطيل الحجز الاستباقي. القيمة الافتراضية في إصدارات sanitizer هي0لأن الفجوةresident - trackedتعود في معظمها إلى ذاكرة الظل الخاصة بـ sanitizer في تلك الإصدارات. #104976 (alexey-milovidov). - لم يعد الوضع الكسول (lazy) لتطبيق قوائم الترحيل (posting-list) في الفهرس النصي تجريبياً، ويمكن اختياره عبر
text_index_posting_list_apply_mode = 'lazy'دون الحاجة إلىallow_experimental_text_index_lazy_apply. كما أُعيدت تسمية إعداد عتبة الكثافة منtext_index_density_thresholdإلىtext_index_lazy_intersection_density_threshold. #108814 (CurtizJ). - أصبح الإعداد
merge_selector_enable_heuristic_to_lower_max_parts_to_merge_at_onceمفعّلاً افتراضياً: إذ يخفّض محدِّد الدمج تلقائياً الحد الأقصى لعدد أجزاء البيانات التي تُدمج دفعة واحدة بحسب مدى امتلاء التقسيم. #110726 (Michicosun). - أصبحت أوامر التنظيف الخاصة بـ PostgreSQL، وهي
RESETوUNLISTENوDISCARD، مقبولة بوصفها عمليات بلا أثر (no-ops) في PostgreSQL wire protocol بدلاً من رفضها بخطأ صياغة. يحسّن ذلك التوافق مع برامج التشغيل مثل Skunk التي ترسلRESET ALLوUNLISTEN *أثناء إعداد الاتصال وتنظيفه. #110780 (alexey-milovidov). - أصبحت دوال النص الخاصة بالذكاء الاصطناعي (
aiGenerateوaiClassifyوaiExtractوaiTranslate) ترفض استجابات المزوّد المقتطعة أو غير المكتملة لأي سبب آخر (مثلاً عندما يبلغ النموذج حدmax_tokens) بدلاً من إرجاع مخرجات جزئية دون تنبيه. ويخضع هذا السلوك للإعدادai_function_throw_on_error. #111830 (george-larionov). - تحسين الدوال منخفضة الدقة
L2DistanceTransposedQuantizedوcosineDistanceTransposedQuantizedوdotProductTransposedQuantizedعبر إعادة بناء رموزp < 8QBit(Int8)باستخدام مراكز بادئات قائمة على المتوسط الشرطي الغاوسي. تبقى نتائج الدقة الكاملة (p = 8) مطابقة على مستوى البت؛ أما المسافات التقريبية منخفضة الدقة فقد تتغير، وتتوقف مكاسب الاستدعاء (recall) وزمن الاستجابة على طبيعة عبء العمل. #111867 (skuznetsov). - أصبح الإعداد
write_snapshot_versionقابلاً لإعادة التحميل أثناء التشغيل. #112150 (alesapin). - إضافة إمكانية مراقبة مكدسات الألياف (fibers) المستخدمة في الاتصال غير المتزامن مع النسخ المتماثلة البعيدة: أحداث التنميط (profile events)
FiberStackAllocsوFiberStackAllocBytesوFiberStackAllocNanosecondsوFiberStackFreeNanoseconds، والمقاييسFiberStacksوFiberStackBytes. #114541 (alexey-milovidov). - أصبح بروتوكول Prometheus remote-write يدعم عمليات الإدراج غير المتزامنة: إذ تُجمَّع البيانات الواردة من عدة طلبات remote-write متزامنة في دفعات قبل تكوين أجزاء البيانات، وفقاً للإعداد
async_insert(المفعّل افتراضياً؛ أضفasync_insert=0إلى عنوان URL الخاص بالمعالج للإبقاء على السلوك المتزامن). ولا يُؤكَّد استلام الطلب إلا بعد تفريغ البيانات إلى جميع الجداول الداخلية للجدول المستهدف من نوعTimeSeries. #115688 (nikitamikhaylov).
تحسينات أخرى
- أُضيف إعدادان، هما
shrink_over_allocated_columns_min_waste_ratioوshrink_over_allocated_columns_min_waste_bytes، يجعلان عمليات INSERT تقلّص الأعمدة المُفرطة التخصيص (التي تتجاوز ذاكرتها المحجوزة الذاكرةَ المستخدمة فعليًا بسبب نمو الأعمدة متغيرة الطول بقوى العدد اثنين) لتلائم حجمها الفعلي قبل التجسيد وكتابة أجزاء البيانات، مما يقلّل ذروة استخدام الذاكرة. الإعدادان معطّلان افتراضيًا. #112161 (Avogar). - تُتخطّى الآن خطوة قراءة البيانات كليًا في عمليات الدمج من نوع
TTLDropلتجنّب الاستهلاك المفرط للذاكرة، لا سيما في تخصيصات مخازن القراءة/الجلب المسبق. #105859 (Avogar). - أُضيف دعم
BFloat16فيdotProduct، وتحسّن أداء الضرب النقطي بمعالجة مسار SIMD على دفعات. #106569 (nickitat). - أصبح بالإمكان تغيير
max_named_collection_num_to_throwوmax_table_num_to_throwوmax_replicated_table_num_to_throwوmax_view_num_to_throwوmax_dictionary_num_to_throwوmax_database_num_to_throwدون إعادة تشغيل الخادم. #106821 (UberDever). - رُقّيت الكتابة إلى جداول
DeltaLake، التي يتحكم بها الإعدادallow_experimental_delta_lake_writes، إلى مرحلة Beta. #107034 (kssenii). - أُضيف نوع إحصاءات الأعمدة
uniq_v2، وهو بديل خفيف لـuniqيعتمد على المخطط التقريبيuniqCombined64. #107863 (hanfei1991). - أُضيفت أحداث ProfileEvents التالية:
DistributedPlanRemoteTasksوDistributedPlanLocalExecutionوDistributedPlanHostsUsedلمراقبة تنفيذ make_distributed_plan. #107985 (shankar-iyer). - أصبحت الطلبات المُرسلة إلى كتالوجات بحيرات البيانات من نوع REST، مثل OneLake، تتضمن ترويسة
User-Agentخاصة بـ ClickHouse. #108117 (scanhex12). - أصبحت
MVTEncodeGeomتُحاذي الأشكال الهندسية إلى شبكة البكسلات الصحيحة قبل الاقتطاع، وتقتطع المضلعات باستخدامwagyu، بحيث يكون الناتج المقتطع صالحًا (مع إصلاح الحلقات المتقاطعة ذاتيًا) ومحاذيًا للحواف، بما يطابقST_AsMVTGeomفي PostGIS. #108248 (saarthak2002). - فُعّلت ذواكر التخزين المؤقت الثلاث الخاصة بالفهرس النصي على المستوى العام، بعد أن كانت مفعّلة داخل الاستعلامات فقط. كما أصبح حجم ذاكرة التخزين المؤقت لقوائم الترحيلات صفرًا (ما يعني تعطيلها فعليًا مجددًا)، لأن قوائم الترحيلات كبيرة الحجم وتخزينها مؤقتًا مكلف للغاية. #108274 (rschu1ze).
- يُشغَّل الآن Prometheus endpoint (في التهيئات المخصصة للمقاييس فقط) وجمع المقاييس غير المتزامنة قبل تحميل الجداول، لتكون المقاييس قابلة للمراقبة خلال مرحلة تحميل البيانات الوصفية التي قد تطول. #108402 (cwurm).
- أُضيف دعم BFloat16 في الدوال الرياضية الثنائية #108442 (zhangyifan27).
- أصبحت دوال المسافة المتجهية المنقولة
L2DistanceTransposedوcosineDistanceTransposedوdotProductTransposedتطبّق تحسين القراءة الجزئية لمستويات البتات على أعمدةNullable(QBit)، فتقرأ مستويات البتات المطلوبة فقط بدلًا من العمود بأكمله. #109358 (alexey-milovidov). - دعم
arraySumوarrayAvgوarrayProductللمصفوفات من النوعBFloat16. #109420 (alexey-milovidov). - أصبحت الدوال
L1NormalizeوL2NormalizeوLinfNormalizeوLpNormalize(وأسماؤها البديلة) تعمل مع المصفوفات، لا مع الصفوف (tuples) فقط، اتساقًا معL2Normودوال المسافة. #110052 (alexey-milovidov). - لم تعد الاتصالات المأخوذة من مجمّع الاتصالات تُفحص بإرسال Ping قبل كل استخدام. يُلغي ذلك رحلة الذهاب والإياب
Ping-Pongالتي كانت تُضاف إلى كل اتصال يُعاد استخدامه، مما يقلل زمن الانتقال للاستعلامات الموزعة ولأداةclickhouse-benchmark. ويُكتشف الاتصال المتقادم في المجمّع عبر استطلاع بمهلة صفرية (فحص غير حاجب لا يضيف رحلة ذهاب وإياب)، ثم يُستعاد بإعادة الاتصال. #110068 (alexey-milovidov). - إرسال أجزاء القوائم الكبيرة الخاصة بتحليل الفهرس الموزع على هيئة قيم مفردة (scalars) (لتجنّب حالات الفشل المحتملة بسبب max_ast_elements/max_query_size والتخلص من عبء تحليل AST) #110419 (azat).
- أصبح النقر على شعار السحابة في Playground يفتح موقع Clickhouse في علامة تبويب جديدة، حتى لا تفقد تقدّم عملك أثناء تنفيذ الاستعلامات. #110422 (williamhatcher).
- تغيير القيمة الافتراضية لـ
auto_statistics_typesمنbasic, uniqإلىbasic, uniq_v2#110878 (hanfei1991). - عند إخفاق تأكيد إعادة الدخول في
RWLockImpl::getLock()(RWLock is already locked in exclusive mode/Cannot acquire exclusive lock while RWLock is already locked)، أصبحت رسالة الخطأ تذكر قيمquery_idالأخرى التي تمتلك القفل حاليًا، وعدد الأقفال التي يحتفظ بهاquery_idالطالب مسبقًا، وذلك لتسهيل تشخيص أخطاء ترتيب الأقفال هذه. #110971 (groeneai). - أصبحت
randomHadamardTransformتحسب تحويلًا دقيقًا يحافظ على الطول لأي متجه لا يتجاوز أكبر عامل فردي لطوله 64 (مثل3584 = 512 * 7، وهو طول شائع في نماذج التضمين)، مما يوسّع العائلات السابقة2^Nو2^k * {12, 20}و2^k * 9. وأصبح التحويل الكامل لطول لا يمكن تمثيله بدقة يُطلق استثناءً بدلًا من الحشو الصامت بالأصفار إلى متجه أطول؛ مرّرoutput_dimsلحساب إسقاط مقتطع بأي طول. #111006 (alexey-milovidov). - إرجاع رمز HTTP
403 Forbidden(بدلًا من500 Internal Server Error) لاستثناءاتACCESS_DENIEDعبر واجهة HTTP. #111043 (Schum-io). - أصبحت
UTMToGeoتقبل حرف نطاق خط العرض في MGRS الذي تُرجعهgeoToUTMوسيطةً رابعة (إضافةً إلى علامة نصف الكرة العددية الصحيحة)، بحيث يمكن تمرير نتيجةgeoToUTMإلىUTMToGeoمباشرةً واستعادة القيم الأصلية كما هي. #111521 (alexey-milovidov). - أصبح
MaterializedPostgreSQLيحافظ على قيمTOASTغير المتغيرة في PostgreSQL أثناء التحديثات بدلًا من استبدالها بالقيم الافتراضية. #111552 (OrpheusAgent). - أُضيف الإعدادان
text_index_max_processed_tokens_before_flushوtext_index_max_memory_usage_before_flushللتحكم في توقيت تفريغ بانيات الفهرس النصي للمقاطع المؤقتة. #111573 (rorylshanks). - إضافة المُعدِّل STREAM UNORDERED لتخطي الفرز حسب ترتيب الإيداع في كل لقطة #111794 (SmitaRKulkarni).
- أصبح
make_distributed_plan=1يعطّل الميزات غير المدعومة بعد.. #112463 (alesapin). - عدم كتابة تسلسلات الهروب ANSI في INTO OUTFILE عندما يكون stdout طرفية tty #113252 (azat).
- أُعيدت تسمية
allow_experimental_delta_kernel_rsإلىallow_delta_kernel_rs، مع الإبقاء على الاسم القديم كاسم مستعار. #113476 (kssenii). - إضافة الإعدادات
enable_alp_codecوenable_sz3_codecوenable_zxc_codecوenable_quantized_codecلتمكين كل مرمِّز ضغط تجريبي على حدة. #113824 (rienath). - الإبلاغ عن تجاوز سعة المكدس بدلاً من التوقف بصمت: أصبحت معالجات الإشارات القاتلة تعمل على مكدس الإشارات البديل، بحيث تُنتج الإشارات
SIGSEGVوSIGABRTوSIGILLوSIGBUSوSIGSYSوSIGFPEوSIGTRAPتتبعاً للمكدس حتى لو استنفد خيط التنفيذ المتسبب في الخطأ مكدسه. #113927 (groeneai). - دعم المعلمة lookback_delta في واجهة برمجة تطبيقات HTTP لـ Prometheus للاستعلامات اللحظية واستعلامات النطاق. #113971 (fallintoplace).
- أصبحت جداول QueryRunner تُشغّل خيوط التنفيذ العاملة عند الحاجة وتحرّرها حين تصبح خاملة، بدلاً من حجزها طوال عمر الجدول. #114522 (mstetsyuk).
- مع هذا التغيير، وعند استخدام فهارس WHATIF، أصبح خط الأساس المعتمد على الإسقاط يُبلغ عن
not_applicableلكل مرشح بدلاً من إفشال العبارة. #114846 (yariks5s). - تحسين سلاسل AND التي تتضمن عدة شروط مقارنة على التعبير نفسه: اكتشاف التناقضات (مثل
a < 3 AND a > 5→false)، وحذف الشروط الزائدة (مثلa = 3 AND a < 5→a = 3). #99736 (wudidapaopao).
إصلاحات الأخطاء
إصلاحات MergeTree وreplication والتخزين
- تم إصلاح حالة تسابق بين
ALTER TABLE ... RENAME COLUMNوعمليةOPTIMIZE TABLE ... FINALمتزامنة معها (أو أي عملية دمج في الخلفية) فيMergeTree، كانت قد تؤدي بصمت إلى استبدال بيانات العمود المُعاد تسميته بالقيم الافتراضية. أُغلقت الآن نافذة التسابق بين نشر البيانات الوصفية الجديدة في الذاكرة وتسجيل تعديل إعادة التسمية فيcurrent_mutations_by_version، وذلك بالاحتفاظ بـcurrently_processing_in_background_mutexطوال العمليتين. #104822 (groeneai). - تم إصلاح نتائج الاستعلام غير الصحيحة عند استخدام GROUP BY مع ORDER BY و
arrayJoinفي الإسقاط. #101775 (Onyx2406). - أصبحت إعدادات حجم التحميل غير الصالحة في Azure (مثل
azure_min_upload_part_size = 0أوazure_max_blocks_in_multipart_upload = 0) تُرفض الآن في وقت مبكر مع رسالة خطأ واضحة، بدلًا من أن تتسبب في استثناء داخلي (second_size > 0) في مرحلة متأخرة من مسار الكتابة. ينطبق ذلك على إعدادات الاستعلام وتهيئة قرص Azure على حدٍّ سواء. #103394 (statxc). - يُرفع الآن الاستثناء
BAD_ARGUMENTSبدلًا منLOGICAL_ERRORعند تشغيلALTER TABLE ... MOVE/REPLACE/ATTACH PARTITIONبين جدوليMergeTreeلهما إعدادات حُبيبية غير متوافقة (أحدهما تكيفي والآخر غير تكيفي). #103881 (groeneai). - إصلاح الخطأ
LOGICAL_ERROR“Expected one block from input stream” الذي كانت ترفعه الأوامرKILL QUERY/KILL MUTATION/KILL PART_MOVE_TO_SHARD/KILL TRANSACTIONعندما تحتوي عبارةWHEREفيها على استعلام فرعي يُنفَّذ لكل صف، أو عندما تكون قيمةmax_block_sizeصغيرة بحيث يُنتج استعلامSELECTالداخلي على جدولsystem.*المعني أكثر من كتلة واحدة. #104927 (groeneai). - إصلاح تسرّب في Refreshable Materialized Views (
MATERIALIZED VIEW ... REFRESH ...) كان يتعذّر فيه حذف الجدول الداخلي المؤقت الذي تستبدله مهمة التحديث عبرEXCHANGE TABLESإذا تجاوز حجمه قيمةmax_table_size_to_dropفي الخادم. فكانت كل عملية تحديث لاحقة تُنشئ جدولًا داخليًا مؤقتًا جديدًا دون أن تنجح في تنظيف الجداول السابقة، مما يُضخّم دليل بيانات العرض حتى تنفد مساحة القرص. أصبحت عملية الحذف الداخلية لمهمة التحديث تتجاوز الآنmax_table_size_to_dropوmax_partition_size_to_drop، مع بقاء ضوابط الأمان هذه سارية على أوامرDROP TABLEالتي يُصدرها المستخدم لحذف العرض نفسه. #105106 (groeneai). - إصلاح الخطأ غير المتوقع
DATA_TYPE_CANNOT_BE_USED_IN_KEYفي استعلاماتALTERالتي لا تُغيّر مفتاح الفرز (الإعدادات، والتعليقات، وبرامج الترميز، وإضافة عمود من خارج المفتاح، وغيرها) في جداولMergeTreeالتي يتضمن مفتاح الفرز فيهاSimpleAggregateFunction(أو نوعًا آخر لا يُسمح به إلا معallow_suspicious_primary_key = 1). #105111 (groeneai). - أصبح
OPTIMIZE ... DRY RUNيُعيد الآنTIMEOUT_EXCEEDEDعند مقاطعته بسبب انتهاء مهلة الاستعلام (max_execution_timeمعtimeout_overflow_mode = 'break')، بدلًا من خطأ منطقي يتعلق بـrows_sources(كان يؤدي إلى إيقاف الخادم في إصدارات التصحيح وإصدارات أدوات التعقيم). #107114 (groeneai). - تم إصلاح الخطأ
NOT_FOUND_COLUMN_IN_BLOCKعند قراءة ملفات مقسّمة بأسلوب hive باستخدامuse_hive_partitioning=1مع عبارةWHERE/PREWHEREتُرشّح عمودًا حقيقيًا (غير افتراضي) في حين يُحدَّد أيضًا عمود تقسيم hive. #107505 (groeneai). - إصلاح نتائج الاستعلام الخاطئة الناتجة عن استبعاد غير صحيح بالاعتماد على المفتاح الأساسي والتقسيم عند تطبيق
toStartOfDayأوtoStartOfISOYearأوtoDaysSinceYearZeroأوtoRelativeSecondNumأوtoRelativeMinuteNumأوtoRelativeHourNumأوtoRelativeWeekNumأوtoRelativeDayNumأوtoMonthNumSinceEpochأوtoYearNumSinceEpochعلى column مفتاح من النوعDate32يحتوي على تواريخ خارج النطاق الذي تستطيع الدالة تمثيله (ولا سيما التواريخ السابقة لـ1970-01-01). تُعرّف هذه الدوال نفسها للفهرس الأساسي على أنها رتيبة، لكن قيمها كانت سابقًا تلتف (wrap around) عند تمرير مثل هذه الوسائط، فكان الفهرس قد يستبعد حبيبات تحتوي فعليًا على صفوف مطابقة. أما الآن فتتشبع قيمها عند حدود نوع النتيجة وتظل رتيبة على كامل نطاقDate32، فيصبح الاستبعاد صحيحًا. #108018 (nihalzp). - إصلاح مشكلة كان فيها الأمر
CREATE TABLE dst AS src SETTINGS ...(والصيغ المشابهة التي تتضمنORDER BY/PARTITION BYدونENGINEصريح) يُسقط بصمت محرك الجدول المصدر وعبارات التخزين الخاصة به (مثلTTLالجدول والمفاتيح) وإعداداته. أصبح المحرك وعبارات التخزين التي لم يُعَد تعريفها تُورَّث الآن من الجدول المصدر، وتُدمج الإعدادات المحددة فوق إعدادات الجدول المصدر. #108085 (alexey-milovidov). - إصلاح فشل عمليات
INSERTفي جداولMergeTreeمع الخطأfilesystem error: in rename: Permission deniedعلى أنظمة الملفات المستندة إلى Windows (WSL وCIFS/SMB وعمليات bind mount في Docker Desktop)، والناجم عن إبقاء كاتب جزء البيانات واصفات الملفات مفتوحة أثناء إعادة تسمية دليل جزء البيانات. #108089 (alexey-milovidov). - إصلاح تعطّل جدول MergeTree مُرفق بفهرس تخطٍّ قديم من نوع
hypothesis(وهو نوع فهرس أُزيل ولم يُبقَ عليه إلا للتوافق معATTACH). في السابق، كانت عملياتDELETEالخفيفة أوOPTIMIZEأوINSERTالعادية أوSELECTالمصحوبة بعامل تصفية على مثل هذا الجدول تفشل مع الخطأILLEGAL_INDEX(“Index of type ‘hypothesis’ is no longer supported”)، وكان تعديلDELETEيُعاد إلى ما لا نهاية. أصبح هذا الفهرس المهمل يُعامَل الآن على أنه خامل: يُنقل كما هو دون تغيير أثناء الدمج/التعديل، ويُتجاهل عند الإدراج وتخطيط الاستعلام، ولا يزال بالإمكان حذفه باستخدامALTER TABLE ... DROP INDEX. #108217 (groeneai). - إصلاح الخطأ
NOT_FOUND_COLUMN_IN_BLOCK(مثلColumn _part not found) عند تحديد columns افتراضية من جدولMergeTreeباستخدام النسخ المتماثلة المتوازية، بما في ذلك عبرSELECT *معasterisk_include_virtual_columns = 1. #108451 (groeneai). - إصلاح رفض
ATTACH PARTITION ... FROMللجداول التي تكون مفاتيحها الأساسية متكافئة لكنها مُعرَّفة بطرق مختلفة (أحدهاPRIMARY KEYصريح والآخر ضمني مستمد منORDER BY). #108590 (jordiori). - أصبح الإعداد
join_any_take_last_rowيُطبَّق الآن في جميع مسارات الربط المدعومة القائمة على التجزئة، بما في ذلك عمليات الربط التي تستخدم التفريغ التلقائي إلى القرص. #108936 (antaljanosbenjamin). - إصلاح الخطأ
NOT_FOUND_COLUMN_IN_BLOCKعند تفعيلquery_plan_optimize_lazy_finalمع عامل تصفيةWHEREنُقل جزء منه إلىPREWHERE(عبرoptimize_move_to_prewhere_if_final). لم يعد تحسين FINAL المؤجل يطلب من التخزين columns الشروط المحسوبة في مرحلة prewhere. #109073 (groeneai). - تم إصلاح مشكلة كان فيها تنفيذ
ALTER TABLE ... ADD PROJECTIONعلى column من نوعALIASعلى مستوى الجدول يجعل الجدول غير قابل للاستخدام (إذ يفشلINSERTاللاحق مع الخطأUNKNOWN_IDENTIFIER، “Missing columns”) عندما تكون الجلسة مضبوطة علىoptimize_respect_aliases = 0. #109091 (groeneai). - إصلاح فشل تأكيد مؤشر فارغ (
px != 0فيTreeRewriter::analyzeSelect، ما يؤدي إلى إيقاف الخادم في إصدارات التصحيح (debug) والإصدارات المبنية بأدوات التعقيم (sanitizer)) عند تنفيذORDER BY ALL(أوGROUP BY ALL) على جدول بمحركMergeمرتبط بجدول آخر عبر عملية ربط باستخدام المحلّل القديم (allow_experimental_analyzer = 0). #109139 (groeneai). - تم إصلاح نتيجة خاطئة للاستعلامات الفرعية المرتبطة من نوع
EXISTSوالاستعلامات الفرعية المفردة عندما يقتصر ظهور الارتباط على إسقاط الاستعلام الفرعي مع وجود عبارةWHEREغير مرتبطة (إذ قد يُقيَّم الاستعلام الفرعي إلى false /NULLلكل صف). يعالج https://github.com/ClickHouse/ClickHouse/issues/105760. #109186 (novikd). - تم إصلاح خلل كان فيه دمج جدول
MergeTreeيحتوي على إسقاطات، عند تفعيل الإعدادenable_block_number_columnأوenable_block_offset_column، يُنتج أجزاء بيانات إسقاط تحتوي على column زائد_block_number/_block_offset. ونتيجة لذلك، لم يعد جزء بيانات الإسقاط المدموج مطابقًا لتعريف الإسقاط ولا لأجزاء بيانات الإسقاط الناتجة عن الإدراج، فكانCHECK TABLEوOPTIMIZE ... DRY RUNيُبلغان عنه بوصفه تالفًا (CORRUPTED_DATA). #109284 (groeneai). - إصلاح الخطأ
UNKNOWN_IDENTIFIERعند تنفيذALTER TABLE ... RENAME/ADD/MODIFY COLUMNعلى جدول MergeTree يحتوي على فهرس min-max ضمني على الأعمدة الافتراضية الدائمة_block_numberأو_block_offset(المُفعَّل عبرadd_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_column). #109428 (groeneai). - إصلاح حذف فهارس التخطي من جزء البيانات (أو فشل
CHECK TABLEمع الخطأUNEXPECTED_FILE_IN_DATA_PART) بعد تعديل يعيد كتابة جزء البيانات بالكامل، مثلALTER TABLE ... DROP COLUMNلعمود من نوعMATERIALIZED، على جزء بيانات من نوعWide. #109616 (groeneai). - تم إصلاح بقاء فهارس التخطي (
textوbloom_filterوغيرها) والإسقاطات غير محدَّثة بعد تجسيد التحديثات الخفيفة باستخدامALTER TABLE ... APPLY PATCHES. في السابق، كانت ملفات الفهارس والإسقاطات المعتمدة على عمود محدَّث عبر تصحيح تبقى دون تغيير، ما قد يجعل الاستعلامات التي تستخدمها تُرجع نتائج خاطئة (مثل إغفالhasTokenلصف محدَّث، أو إرجاع إسقاط لقيم تجميع قديمة بعد إزالة جزء بيانات التصحيح المستهلَك). #109709 (groeneai). - إصلاح فشل التعديل الذي يشير إلى العمود الافتراضي
_sample_factorأثناء التنفيذ مع الخطأUnexpected const virtual column: _sample_factor، ما كان يترك التعديل عالقًا. أصبح التعديل الآن يقرأ قيمته على أنها1، وهي القيمة نفسها التي يُرجعها استعلام لا يستخدمSAMPLE. #109813 (groeneai). - تم إصلاح خطأين يظهران عند تنفيذ استعلام يحتوي على
GROUP BY GROUPING SETS(أو استعلام فرعي مفرد أو استعلام فرعي لتعديل يحتوي عليه) معforce_aggregation_in_order = 1: الخطأTrying to get name of not a column: ExpressionListباستخدام المحلّل القديم (enable_analyzer = 0)، والخطأMemory bound merging of aggregated results is not supported for grouping sets.لاستعلام موزَّع معenable_memory_bound_merging_of_aggregation_results = 1باستخدام المحلّل. #109862 (groeneai). - إصلاح ثلاث مشكلات في
use_constant_folding_in_index_analysis: خطأ منطقيInvalid partition key sizeقد يؤدي إلى إجهاض استعلامSELECTيستخدم إسقاطًا عاديًا عندما يضبط الجدولpart_minmax_index_columns = 'with_block_number_offset'؛ ونتائج خاطئة (حذف صامت لصفوف) عند التصفية على مفتاح تقسيم يعتمد على باقي القسمة مثلPARTITION BY id % 200؛ وتعطّل (تسابق بيانات) عند الاستعلام عن فهرسtextيستخدم مُجزّئsparseGramsبمسندLIKEعبر عدد كبير من التقسيمات معmax_threads > 1. #109896 (groeneai). - إصلاح النتائج الخاطئة عند بناء فهرس تخطٍّ من نوع
minmaxعلى عمود من النوعLowCardinality(Nullable(...)): إذ كانت المسنداتWHERE/PREWHERE/HAVING ... IS NULLالمدفوعة إلى طبقة التخزين تستبعد كل الحبيبات وتُرجع 0 صفوف رغم احتواء العمود على قيم NULL. #110061 (groeneai). - إصلاح بطء استعلامات
ORDER BY ... LIMITعلى جداولDistributedعندما يختارprefer_localhost_replicaنسخة متماثلة محلية. #110136 (EmeraldShift). - إصلاح استثناء (
UNION mode UNION_DEFAULT must be normalized) كان يحدث عندما يستخدم تعديلDELETEأوALTER UPDATEعملية مجموعات (UNION/UNION ALL/UNION DISTINCT/EXCEPT/INTERSECT) داخل استعلام فرعي في شرطWHEREالخاص به أو في عملية إسناد ضمنUPDATE. #110196 (alexey-milovidov). - إصلاح بطء إيقاف تشغيل الخادم وعدم استجابة
KILL MUTATIONعندما يكون تعديل يحتوي علىx IN (subquery)في طور بناء مجموعة الاستعلام الفرعي أثناء تحليل المفتاح الأساسي؛ إذ أصبح بناء المجموعة يُلغى فورًا. #110198 (alexey-milovidov). - إصلاح حالة تسابق بين
KILL TRANSACTIONوALTER TABLE ... UPDATE/DELETEالمنفَّذ داخل معاملة: كان حدوث التراجع بين تسجيل التعديل في المعاملة وتسجيله في الجدول يترك إدخال تعديل يتيمًا، مما يُطلق خطأً منطقيًا (Cannot find transaction ... that has started mutation ...) في المهام الخلفية ويمنع جميع التعديلات اللاحقة على أجزاء البيانات المتأثرة حتى إعادة تشغيل الخادم. #110226 (tiandiwonder). - إصلاح مشكلة في
system.tablesلقاعدة بيانات من نوعDataLakeCatalog(Iceberg/Glue) كانت تؤدي إلى إجهاض الاستعلام بأكمله، أو حذف جداول بصمت، عند تعذّر تحليل البيانات الوصفية لجدول واحد. أصبح هذا الجدول يظل مدرجًا باسمه مع قيم default/NULL للأعمدة التي تتطلب كائن التخزين المفتوح (engineوtotal_rowsوغيرها)، بغض النظر عنdatabase_datalake_require_metadata_access. ولا يزال الوصول المباشر إلى الجدول المعطوب يُبلغ عن الخطأ. #110242 (groeneai). - أصبح تقدير العدد الأصلي (cardinality) لترتيب الربط يجمع إحصائيات الأعمدة من أجزاء البيانات المتبقية بعد الاستبعاد وفق التقسيمات/المفتاح الأساسي، بدلًا من جميع أجزاء البيانات النشطة. ففي السابق، كانت خطة الاستعلام المقتصر على تقسيم صغير تُبنى استنادًا إلى إحصائيات الجدول بأكمله (رُصد تقدير زائد لعدد الصفوف بمقدار 2500 ضعف أدى إلى قلب جانب البناء في ربط التجزئة)، ومن المفارقة أن تعطيل الإحصائيات كان يُنتج خطة أفضل. كما أُصلحت مشكلة تعطيل FINAL الكسول بصمت لعلاقات MergeTree ضمن JOIN، إذ كانت نتيجة تحليل الفهرس المخزّنة مؤقتًا في محسّن ترتيب الربط تُفسَّر خطأً على أنها إسقاط مُطبَّق. #110283 (skuznetsov-clickhouse).
- أصبح
ALTER TABLE ... MOVE/REPLACE PARTITIONبين جدولين من نوع MergeTree ذوي حبيبية غير متوافقة (أحدهما تكيّفي والآخر غير تكيّفي) يُطلقBAD_ARGUMENTSبدلًا منLOGICAL_ERROR. فهذه حالة قد يتسبب فيها المستخدم، لذا لا ينبغي أن تظهر كخطأ داخلي (يؤدي إلى إجهاض الخادم في إصدارات التصحيح/المُعقِّمات). #110535 (groeneai). - إصلاح مشكلة عدم قيام
TTL ... DELETE WHERE <cond>مطلقًا بحذف الصفوف التي أصبحت تطابق<cond>نتيجة تنفيذALTER TABLE ... UPDATEعلى عمود مُشار إليه فيWHERE. أصبحت عملية التعديل (mutation) تعيد الآن حساب TTL الخاص بالصف، بحيث تُحذف الصفوف منتهية الصلاحية التي أصبحت مطابِقة بدلًا من الاحتفاظ بها بصمت. #110648 (groeneai). - إصلاح خطأ
LOGICAL_ERROR“Invalid partition key size: 0” الذي قد يُجهض عمليةINSERTفي جدولMergeTreeمُقسَّم مع تفعيلnon_replicated_deduplication_window، وذلك عندما تخضع دفعة الإدراج غير المتزامن لإزالة التكرار جزئيًا فقط (أي أن بعض قيمinsert_deduplication_tokenكانت مكررة وبعضها جديدة). #110651 (groeneai). - إصلاح مشكلة تسبُّب طيّ الثوابت (constant folding) في المحلّل الجديد في تغيير نوع قيمة
Geometryثابتة بصمت. إذ إنGeometryهوVariantمُسمّى يمكن أن تتشارك بدائله تخطيط التخزين نفسه (LineString/RingوMultiLineString/Polygonوالقيم الفارغة)، ولذلك كان الثابتان المطويّان اللذان لا يختلفان إلا في البديل يندمجان في ثابت واحد؛ فعلى سبيل المثال، كان الثابتMULTIPOLYGON EMPTYيُنتجLINESTRING(). #110709 (groeneai). - إصلاح نتيجة خاطئة (دمج بترتيب غير صحيح) في استعلامات القراءة المرتّبة (read-in-order) عندما يوسّع
distinct-in-orderأوaggregation-in-orderنطاق القراءة لتشمل بادئة من مفتاح الفرز أطول من تلك التي أعدّ لهاORDER BYالصف الافتراضي للقراءة المرتّبة. فقد كانت أعمدة الفرز الإضافية في الصف الافتراضي تُملأ بالقيم الافتراضية، مما قد يُخلّ بترتيبMergingSortedTransform(ويؤدي إلى الإجهاض معLOGICAL_ERRORفي إصدارات التصحيح/المُعقِّمات). #110725 (groeneai). - تمرير الأدوار النشطة للاستعلام (SET ROLE / role=) إلى العُقد البعيدة عند القراءة عبر النسخ المتماثلة المتوازية وجداول Distributed على عنقود يستخدم سرّ الاتصال بين الخوادم (interserver secret)؛ إذ كانت العُقد سابقًا تعود إلى الأدوار الافتراضية للمستخدم، مما يؤدي إلى تقييم سياسات الصفوف على نحو غير متّسق مع المُبادِر. #110867 (evillique).
- إصلاح حالة تسابق نادرة كان فيها أمر
ALTERالمقتصر على التعليق أو الإعدادات على جدولReplicatedMergeTreeقد يُسقط بصمت عمودًا أُضيف عبر أمرALTER ... ADD COLUMNمتزامن، مما يُبقي إحدى النسخ المتماثلة على بنية جدول قديمة. #111029 (tiandiwonder). - إصلاح الخطأ
NUMBER_OF_COLUMNS_DOESNT_MATCHفي استعلامGROUP BYيتضمن دالة تجميع على جدولMergeيغلّف جدولDistributed، عندما يكون مفتاح التجميع دالةً في عمود ما وتقرأ دالة التجميع العمود نفسه (مثلSELECT toString(g), min(g) FROM merge_over_distributed GROUP BY toString(g)). #111334 (groeneai). - إصلاح نتيجة خاطئة لعملية
FULL JOINعلى جدول بمحركJoin(StorageJoin) معUSINGعندما يكون المفتاح الأيسرNullableبينما مفتاح التخزين ليس كذلك: إذ كان الصف الأيسر غير المطابق ذو المفتاحNULLيُرجع0بدلًا منNULL. #111371 (groeneai). - أصبح الأمر
ALTER TABLE ... DETACH PARTITION/PARTيُجري fsync للنسخة التي ينشئها ضمنdetached/(الشجرة الفرعية لجزء البيانات إضافةً إلى سلسلة الأدلة وصولًا إلى جذر القرص) عند تفعيل الإعدادfsync_part_directoryللجدول، وذلك في كلٍّ من نمطَي تخزين أجزاء البيانات Full (دليل) وPacked. في السابق، لم يكن يُجرى fsync للنسخة إطلاقًا، في حين كان يُجرى لجزء البيانات الفارغ المُغطّي الذي يزيل الصفوف من المجموعة النشطة، ولذلك كان انقطاع التيار الكهربائي مباشرةً بعد الإقرار قد يُتلف البيانات المنفصلة على btrfs (إذ تتراجع مُدخلات دليل النسخة غير المُزامَنة، فيبقىdetached/فارغًا دون أي شيء يمكن تنفيذATTACHعليه). يخضع هذا السلوك للإعداد الحاليfsync_part_directory، ويبقى السلوك الافتراضي دون تغيير. #111426 (groeneai). - أصبح العمود من النوع
Nullable(Nothing)(أو أي نوع آخر غير مسموح به في الجداول) يُرفَض عند تنفيذCREATE TABLEحين يُستنتَج المخطط من التخزين (مثل جدولremote()/Remote/Distributedبلا أعمدة مبني على عرض يُنفّذSELECT NULL)، بدلًا من حفظ بيانات وصفية يتعذّر تحميلها عند إعادة تشغيل الخادم التالية، وتمنع تحميل جداول أخرى لا صلة لها بها. #111487 (groeneai). - إصلاح الخطأ
LOGICAL_ERROR(Got read request from replica N for unknown stream ...) الذي قد يؤدي إلى توقف الخادم بشكل مفاجئ عند القراءة باستخدام النسخ المتماثلة المتوازية إذا أُجيب عن الاستعلام بالكامل عبر تحسين الإسقاط (العدّ الدقيق، أو عدّ minmax، أو إسقاط تجميعي/عادي مُخزَّن لا يحدد أي نطاقات) على العقدة المُبادِرة. #111689 (groeneai). - إصلاح مشكلة في عملية
INSERTالمُقسَّمة في DeltaLake (allow_experimental_delta_lake_writes=1) كانت تُفسد قيم التقسيم التي تحتوي على محارف المسار وترفض القيمةNULL. فقد كانت قيمة مثلa/bتُعتمَد بصمت على أنهاa، وكان المحرف%يُنتج ملف بيانات تتعذّر قراءته لاحقًا، كما كانت قيمة التقسيمNULLتفشل مع الخطأNOT_IMPLEMENTED. أصبحت قيم التقسيم الآن تُرمَّز بالترميز المئوي في مقطع مسار واحد، وتُخزَّن القيمة الحقيقية فيpartitionValuesبدلًا من استخراجها من المسار، كما تُكتب قيمة التقسيمNULL(أو السلسلة الفارغة) بصيغة__HIVE_DEFAULT_PARTITION__مع مُدخلpartitionValuesفارغ (null). #111793 (groeneai). - إصلاح الخطأين المنطقيين
Expected UInt64 column for __grouping_set, got BLOBوColumnBLOB should be converted to a regular column before usageفي الاستعلام الموزع المُنفَّذ على جزء (shard) مع تفعيلenable_parallel_blocks_marshalling(المُفعَّل افتراضيًا)، كما في حالةGROUP BY GROUPING SETSعلى عنقود يحتوي على نسخة متماثلة محلية، أو عند قراءة جدولMergeيمتد عبر جدول محلي وجدول موزع. لم تعد الخطوةBlocksMarshallingStepتُضاف إلى الخطط التي تُستهلَك كتلها داخل العملية نفسها. #111997 (groeneai). - إصلاح الخطأ
LOGICAL_ERROR(Type mismatch when building statistics for column) أثناء تعديلMergeTreeلجدول غُيِّر نوع أحد أعمدته عبرALTER MODIFY COLUMNيقتصر على البيانات الوصفية (مثل التحويل منEnum8إلىInt8أو منDateTimeإلىUInt32) بينما يحمل العمود إحصاءات. أصبح التعديل الآن يعيد حساب إحصاءات الأعمدة التي يعيد كتابتها فعليًا فقط، وينقل البقية دون تغيير، كما أصبحت إحصاءات العمود الذي يُعاد كتابته عبرMATERIALIZE COLUMN، أو عبرUPDATEلعمود يعتمد عليه عمودMATERIALIZED، أو عبرCLEAR COLUMNيُعاد حسابها بدلًا من الإبقاء على محتوى قديم. #112009 (groeneai). - إصلاح اختفاء الصفوف بصمت عندما يُرشِّح استعلام على
intDiv(constant, key)أوdivide(constant, key). كان تحليل المفتاح الأساسي والتقسيم يُبلغ عن اتجاه خاطئ للرتابة عند قسمة ثابت على عمود مفتاح، فتُستبعد الحبيبات المطابقة ويُعيد الاستعلام صفوفًا أقل دون أي خطأ. كما يُصلح هذا التغييرintDivعندما يكون المقسوم ثابتًا عديم الإشارة وبته الأعلى مُعيَّن، ويوقف ادعاء الرتابة عندما يجعل معامل من نوعDecimalالقسمةَ تُحسب بالعرض الأصلي للنوع العشري، ويمنع تحليل المفتاح من إطلاق الخطأCannot compare DB::IPv4 with longلاستعلام صحيح يقسم ثابتًا من نوعIPv4/IPv6على عمود مفتاح. #112156 (groeneai). - إصلاح تصنيف العرض ذي المعلمات على أنه عرض عادي عندما يستخدم متن
SELECTفيهINTERSECT/EXCEPT، أو سلسلةUNIONتمزج بينUNION DISTINCTوUNION ALL. كان مثل هذا العرض يُنشأ بنجاح، لكن تتعذّر قراءة بياناته الوصفية لاحقًا: إذ كان تحميله يُطلق الخطأInvalid storage definition in metadata file، مما يجعل العرض غير قابل للتحميل نهائيًا ويؤدي إلى إيقاف خادم التصحيح أو خادم المُعقِّم عند بدء التشغيل. كما لم يكنsystem.tables.parameterized_view_parametersيُبلغ عن أي معلمات لتلك العروض. #112211 (groeneai). - إصلاح تجاهل
max_execution_timeوKILL QUERYأثناء تقييم استعلام للدالةgeohashesInBox. كان مثل هذا الاستعلام يُوسِّع جميع صفوف الكتلة قبل أن تتسنى مقاطعته، فلا يسري الإلغاء إلا بعد دقائق؛ أما الآن فتتحقق الدالة من الحد الزمني للاستعلام أثناء مرورها على الصفوف. لا يشمل هذا الإصلاح التقييمات داخل تعبير جدول مُخزَّن، مثل مفتاح الفرز أو فهرس التخطي أوPARTITION BY، إذ تجري متابعتها بشكل منفصل. #112273 (groeneai). - إصلاح خطأ منطقي عند استخدام PREWHERE على جدول Merge مبني فوق جدول Merge آخر أو فوق عرض مُجسَّد يختلف فيه نوع العمود. كما يُصلح تجاهل سياسة الصفوف بصمت على الجداول التي تقرأ من خوادم بعيدة (جدول موزع، أو جدول يُغلِّف جدولًا موزعًا)، وهو ما قد يكشف صفوفًا كان يُفترض أن تُخفيها السياسة؛ وتُرفض هذه الاستعلامات الآن بالخطأ ILLEGAL_PREWHERE. عرِّف هذه السياسات بدلًا من ذلك على الجداول المحلية الأساسية في كل خادم بعيد؛ مع ملاحظة أن هذه السياسة لا تُطبَّق حتى الآن على عمليات القراءة المُرسلة مع
serialize_query_plan = 1، وهي علّة منفصلة موجودة مسبقًا. #112326 (PedroTadim). - إصلاح قراءة فهرس ثانوي (فهرس تخطٍّ) قديم بعد تغيير النوع عبر
ALTER TABLE ... MODIFY COLUMNدون أن يُنفَّذ التعديل المرتبط به، كأن يكونKILL MUTATIONقد أزاله: إذ كانت الحبيبات على القرص مكتوبة بالنوع القديم لكنها تُفك بالنوع الجديد، مما يؤدي إلى إطلاقLOGICAL_ERROR، أو طلب تخصيصات بحجم عدة إكسابايتات، أو إعادة نتيجة خاطئة بصمت. كما يُصلح نتيجة خاطئة من فهرس قائم على تعبير يتغير معناه مع بقاء جميع البايتات المخزنة كما هي، فلا يُنشأ أي تعديل على الإطلاق: مثلMODIFY COLUMNيغيّر المنطقة الزمنية لـDateTimeفقط، أو اسم نوع مخصص فقط كتحويلUInt8إلىBool. يُتخطّى هذا الفهرس الآن في جزء البيانات المتأثر. #112484 (groeneai). - إصلاح
LOGICAL_ERROR(Cannot add transform Resize to Pipes because it has no outputs) عند تشغيل استعلام تجميع على عنقود معserialize_query_plan = 1والنسخ المتماثلة المتوازية القائمة على الخطة، والناتج عن تغيير خطوة الدمج حجمَ خط المعالجة إلى صفر من التدفقات. #112506 (groeneai). - إصلاح
LOGICAL_ERROR(“Part … contains column … that is absent in table …”) عندما تُعدِّل نسخة متماثلة منReplicatedMergeTreeجزء بيانات جلبته من نسخة متماثلة أخرى قبل تطبيقALTER ... ADD COLUMNالمعلّق لديها. يُؤجَّل هذا التعديل الآن إلى أن يُطبَّق تغيير البيانات الوصفية. #112510 (groeneai). - إصلاح عدّادات القراءة (
read_rowsوread_bytesوProfileEvents['SelectedRows']وProfileEvents['SelectedBytes']) وحصصREAD_ROWSوREAD_BYTESالتي كانت تُحتسب بأكثر من قيمتها الفعلية في الاستعلامات التي تكتب فيهاORDER BYبياناتها إلى القرص. فقد كانت الصفوف المُعاد قراءتها من الملفات المؤقتة للفرز الخارجي تُحتسب مرة أخرى على أنها قراءات من المصدر، فيُبالغ الاستعلام الذي يكتب إلى القرص في الإبلاغ عن حجم ما قرأه، وقد يُرفض بالخطأQUOTA_EXCEEDEDرغم أنه لم يتجاوز حصته. #112645 (groeneai). - إصلاح
ProfileEvents['JoinResultRowCount']الذي كان يُبلغ عن حجم نتيجة أقل من الحقيقي لعمليةJOINتكتب إلى القرص. فقد كانت الصفوف الصادرة من الحاويات المؤجلة تُحتسب فيJoinDelayedJoinedTransformRowCountفقط ولا تدخل في الإجمالي. علمًا بأن نتائج الاستعلامات كانت صحيحة دائمًا، وأن الخطأ اقتصر على حدث ملف التعريف. #112673 (groeneai). - إصلاح مشكلة كان فيها
max_execution_timeوKILL QUERYعديمَي التأثير دون أي تنبيه في الاستعلام الموزّع الذي يُنشئ اتصالات بالنسخ المتماثلة. إذ يتوقف هذا الاستعلام الآن عند محاولة الاتصال التالية بدلًا من المرور على جميع النسخ المتماثلة وإعادة المحاولات المتبقية. #112689 (groeneai). - إصلاح تطبيق
ALTERعلى جداولMergeTreeبينما لا تزال عملية تعديلRENAME COLUMNغير مكتملة قيد التنفيذ. إذ كان ذلك قد يُحدّث البيانات الوصفية للتخزين بشكل غير متوافق ويعطّل عمليات التعديل اللاحقة تمامًا. #112783 (Michicosun). - إصلاح النتائج الخاطئة لـ
ORDER BYعند القراءة من جدولMergeمبني على جداولDistributed: إذ كان من الممكن أن تُرجَع الصفوف بترتيب غير صحيح، وأن تغيب صفوف يُفترض أن تكون ضمن النتيجة عند استخدامLIMIT. #112931 (alexey-milovidov). - إصلاح النتائج الخاطئة عند تفعيل الجلب المسبق لقراءة filesystem وقراءة عمود
Nestedإلى جانب عمود فرعي حُذف ثم أُعيدت إضافته، في الجداول التي يكون فيهاshare_nested_offsetsمفعّلًا (وهو الإعداد الافتراضي). إذ كان من الممكن أن يُرجع هذا الاستعلام قيمًا افتراضية لعمود موجود فعليًا لم تمسّه عملياتALTERإطلاقًا. ولا تتطلب هذه المشكلة أي إعدادات غير افتراضية على التخزين الكائني، حيث تكون القيمة الافتراضية لـremote_filesystem_read_prefetchهي1؛ أما على الأقراص المحلية فتتطلبlocal_filesystem_read_prefetch = 1. ولا يزال هناك خلل منفصل لا علاقة له بالجلب المسبق يُفسد هذه القراءات عندما يمتد النطاق عبر عدة كتل، وهو غير مشمول بهذا الإصلاح. #112997 (groeneai). - إصلاح خطأ منطقي
Pipeline stuckفي الاستعلامات التي توزّع البيانات حسب التقسيم، مثل دالة نافذة معPARTITION BYأو عملية ربط معjoin_algorithm = 'parallel_full_sorting_merge'، عندما تنتهي المعالجة اللاحقة لإحدى الشظايا في حين لم تُوزَّع كتلة ما إلا جزئيًا. #113190 (groeneai). - إصلاح تعليق عبارات
ALTERوOPTIMIZEوTRUNCATEوعبارات معالجة التقسيمات معalter_sync = 2علىReplicatedMergeTreeعندما يبدأ إيقاف الجدول في أثناء انتظار العبارة لنسخة متماثلة أخرى، كأن يحدث ذلك بسبب تنفيذDROP DATABASE ... SYNCفي الوقت نفسه. إذ تفشل هذه العبارة الآن بالخطأUNFINISHED، كما تلتزم بـmax_execution_timeوKILL QUERY. #113228 (groeneai). - إصلاح الخطأ
Cannot insert element into Set(NOT_IMPLEMENTED) عند تفعيلread_in_order_use_virtual_rowوجمع استعلام قراءة بالترتيب علىMergeTreeبينWITH FILL ... INTERPOLATEومرشّحINأوhas. #113264 (groeneai). - إصلاح خطأ منطقي (استثناء)
Chunk info was not set for chunk in MergingAggregatedTransformعند تفعيل الإعدادinject_random_order_for_select_without_order_byوقيام استعلام تجميع بالقراءة من جدولMergeيحتوي على جدول فرعي من نوعDistributed: لم يعد غلافORDER BY rand()العشوائي يُحقن في الاستعلامات التي لا يمتد تخطيطها إلا إلى مرحلة وسيطة. #113266 (alexey-milovidov). - إصلاح مشكلة عدم حذف الصفوف إطلاقًا عندما يحتوي جدول
MergeTreeعلى قاعدتين أو أكثر من نوعTTL ... DELETE WHEREلها تعبير الوقت نفسه ولا تختلف إلا في شرطWHERE. فبعد عملية دمج لحذف TTL، كانت قيمةrows_where_ttl_infoلجزء البيانات تُعاد إلى الصفر، فلا تُجدوَل له أي عملية دمج TTL لاحقة، وتبقى الصفوف المنتهية الصلاحية محفوظة إلى أجل غير مسمى دون أي خطأ أو رسالة في السجل. #113384 (groeneai). - إصلاح تجاهل
max_execution_timeوKILL QUERYأثناء تقييم الاستعلام للدوالgeohashesInBoxأوarrayFoldأوsleepأوbase58Decodeأوh3PolygonToCellsأوh3PolygonToCellsWithContainmentداخل تعبير مخزَّن في البيانات الوصفية للجدول، مثل مفتاح الفرز أو فهرس التخطي أو مفتاحPARTITION BY. #113456 (groeneai). - إصلاح الخطأ
LOGICAL_ERROR(Reading from materialized CTE '...' before its materialization completed - DelayedPortsProcessor gate is missing in the query plan) الذي يظهر عندما يقرأ جدولMergeيحتوي على أكثر من جدول فرعي تعبيرَ جدول شائعًا مُجسَّدًا يشير إليه الاستعلام الخارجي. #113558 (alexey-milovidov). - إصلاح الخطأ
Logical error: 'Required output position N is out of range for pass-through inputs'فيEXPLAIN ANALYZEعلى جدولMergeيحتوي على عدة جداول فرعية، معPREWHEREيقتصر على عمود مجرد وWHEREمنفصل. #113725 (groeneai). - إصلاح خطأ منطقي (
Unexpected return type) عند دفع مرشّح مطبَّق على عرض إلى طبقة التخزين، إذا كان نوع أحد أعمدة العرض يختلف عن نوعه في التخزين الأساسي (مثلinformation_schema.tablesحيث يكونengineمن النوعNullable(String)، المبني فوقsystem.tablesحيث يكون من النوعString). #113984 (alexey-milovidov). - إصلاح الخطأ
Not-ready Set is passed as the second argument for function 'in'عند إلغاء عملية تعديل يحتوي شرطها علىIN (subquery)، مثلًا عبرKILL MUTATIONأوDETACH DATABASE، بينما لا تزال مجموعة الاستعلام الفرعي قيد البناء.. #114463 (groeneai). - بات تنفيذ
ALTER TABLE ... DROP COLUMNعلى عمود مستخدَم في مفتاح الفرز أو المفتاح الأساسي أو مفتاح التقسيم يفشل الآن مع الخطأALTER_OF_COLUMN_IS_FORBIDDENوشرحٍ للسبب، تمامًا كما يحدث معALTER TABLE ... CLEAR COLUMN. أما في السابق فكان يفشل مع خطأ مربكUNKNOWN_IDENTIFIER: Missing columnsناتج عن إعادة حساب تعبيرات المفاتيح. وينطبق الأمر نفسه على حذف مجموعةNestedكاملة أو مسحها عبر بادئتها المشتركة عندما يكون أحد أعمدة المجموعة مستخدَمًا في مفتاح؛ إذ كان ذلك في السابق قد يُتلف بيانات المجموعة دون أي تنبيه أو يُخلّف عملية تعديل لا تنتهي أبدًا. كذلك بات حذف عمود مستخدَم في تعبيرTTLفقط يُبلغ عن تعبير TTL الذي سيتعطل بسببه #114468 (m7kss1). - إصلاح مشكلة كان فيها العمود الذي أُعيدت تسميته ثم حُذف ثم أُضيف مجددًا ضمن
ALTERواحد يُرجع قيمَ العمود المحذوف بدلًا من قيمته الافتراضية، طالما أن عملية التعديل لم تكتمل بعد. #114601 (tiandiwonder). - إصلاح قراءة column فرعي (
.size0و.nullوعنصر من tuple وString.size) عبر جدولMergeعندما يُعرِّف الجدول الأساسي الـ column الأب على أنهALIAS. كانت هذه القراءة تُرجع القيمة الافتراضية للنوع، وعند تحديد الـ column الأب في الاستعلام نفسه كان من الممكن أن تُرجع قيمة column لا علاقة له بها. #114673 (groeneai). - تم إصلاح غياب صفوف من نتيجة استعلام
SELECTالمُرشَّح باستخدامpointInPolygonعلى المفتاح الأساسي لجدول MergeTree عندما تكون وسيطة المضلع قيمة حرفية ثابتة غير صالحة معvalidate_polygons = 0. كان تحليل المفتاح الأساسي يستنتج تقليم الحبيبات من مضلع لم يتحقق من صحته قط، فيستبعد حبيبات تحتوي على صفوف مطابقة. #114710 (groeneai). - تم إصلاح تنسيق
ALTER TABLE ... MATERIALIZE INDEXوMATERIALIZE STATISTICSوMATERIALIZE PROJECTION، الذي كان يُسقط عبارةIF EXISTS، فلا يطابق الاستعلامُ المُنسَّق الاستعلامَ الذي جرى تحليله. كما باتت تُرفض أربع حمولات JSON لشجرة AST الخاصة بـALTER ... STATISTICSلا يمكن لمحلل SQL إنتاجها، وكانت تُنسَّق إلى أمر مختلف. #115099 (groeneai). - تم إصلاح قراءة خارج الحدود لقيم التجزئة المخزنة مؤقتًا للقاموس عند التجميع أو الربط على مفتاح
LowCardinality(String)يكبر قاموسه أثناء تجميعه، وهي حالة يمكن الوصول إليها عبرTTL ... GROUP BY. كان ذلك قد يؤدي إلى تجزئة خاطئة، وإلى الإبلاغ عن heap-buffer-overflow في إصدارات sanitizer. #115604 (groeneai). - أصبح
CREATE TABLEوALTER TABLEيرفضان استخدام ترميز ضغط مع فقدان البيانات مثلSZ3على column مُستخدَم في مفتاح التقسيم. #115626 (groeneai). - لم تعد القراءة عبر جدول
Mergeيطابق جدولAliasيستهدف عرضًا ذا معلمات تُطلق الخطأLOGICAL_ERROR: Table has no columns.(الذي يُنهي الخادم في إصدارات التصحيح وإصدارات sanitizer). أصبح هذا الجدول الآن يُبلغ عنSTORAGE_REQUIRES_PARAMETER، وهو الخطأ نفسه الذي يُبلغ عنه العرض ذو المعلمات. وأي جدول مطابق آخر لا يستطيع توفير columns يُبلغ الآن عنUNSUPPORTED_METHODبدلًا من خطأ داخلي. #115896 (groeneai). - تم إصلاح المعاينة الفورية لتعديل معلّق يشير تعبيره إلى
_sample_factor. معapply_mutations_on_fly = 1وعبارةSAMPLE، كان التعبير يُقيَّم باستخدام معامل العينة الخاص باستعلام القراءة بدلًا من القيمة التي يحفظها التجسيد في الخلفية، فلا تتطابق الصفوف المعروضة في المعاينة مع النتيجة المُجسَّدة النهائية، وقد يتسبب تعديلٌ معلّق مثلALTER TABLE t DELETE WHERE _sample_factor > 1في ألا تُرجع قراءةُSAMPLEأي صفوف على الإطلاق. يبقى column_sample_factorالخاص بالاستعلام نفسه دون تغيير. #115906 (groeneai). - أصبحت ملفات الإحصاءات ذات إصدار الصيغة
V3تُقرأ الآن بدلًا من رفضها بالخطأILLEGAL_STATISTICS. لم تُنتَج هذه الملفات إلا بواسطة إصدارات منmasterخلال فترة زمنية قصيرة، لكن أجزاء البيانات التي تحتويها كانت غير قابلة للقراءة تمامًا، ولا يستطيعALTER TABLE ... MATERIALIZE STATISTICSإعادة توليدها على قرص للقراءة فقط. #116030 (alexey-milovidov). - تم إصلاح الخطأ
Invalid number of columns in chunk pushed to OutputPort(LOGICAL_ERROR) عندما يقرأ استعلامSELECT ... FROM t STREAM ... ORDER BY ... LIMIT nجدولًا يحتوي علىPROJECTION. لم يعد التجسيد الكسول يُطبَّق على قراءةSTREAM. #116187 (groeneai). - عدم نسخ
ALTER TABLE ATTACH PARTITION FROMفي قواعد البيانات المتماثلة. #94835 (MikhailBurdukov). - تم إصلاح توقف مفاجئ للخادم (في إصدارات sanitizer) وفقدان صامت للبيانات أثناء بدء تشغيل الجدول عندما يتقاطع جزء بيانات MergeTree ناتج عن معاملة تم التراجع عنها مع جزء بيانات مُثبَّت. أصبح
PartLoadingTree::addيحدد الآن بشكل صحيح أيّ الجزأين المتقاطعين هو الذي تم التراجع عنه، فيستبعده ويعيد ربط أجزائه الفرعية اليتيمة بالجزء المُثبَّت بالترتيب الصحيح. #100992 (tuanpach). - تم إصلاح إرجاع
indexOfAssumeSortedنتائج غير صحيحة للأعمدة من النوعArray(LowCardinality(String))في جداول MergeTree. #101771 (Onyx2406). - إصلاح استثناءات
LOGICAL_ERRORعند قراءة جداول بحيرات البياناتIcebergأوDeltaLakeعبر مسارات قد تصل إلى خط معالجة القراءة دونdatalake_table_stateمثبّت، مثل التحديثات المتزامنة للبيانات الوصفية لـIcebergأو قراءاتmergeعلى جداولDeltaLake. #102033 (groeneai). - تم إصلاح الخطأ
Logical error: Parsed partition value: ... doesn't match partition value for an existing part with the same partition ID: ...الذي كان يُطلَق عند تنفيذOPTIMIZE TABLE ... PARTITION ...(وغيره من الاستعلامات التي تحلّ قيمة التقسيم عبرconvertFieldToTypeImpl) على الجداول التي يكون مفتاح التقسيم فيها من النوعTime. #106202 (groeneai). - إصلاح وسم جزء بيانات خطأً بأنه يحتوي على إسقاط تالف عندما لا يتبقى أي جزء إسقاط بعد الحذف خفيف الوزن، سواء عند إعادة بناء الإسقاط دون أي صفوف ناتجة أو عند حذفه (
lightweight_mutation_projection_mode = 'rebuild'/'drop'). وكانت حالة التلف هذه تُعطّل سابقًا تحسين الإسقاط للاستعلامات على ذلك الجزء. #106273 (tiandiwonder). - تم إصلاح تأخر تحذيرات الحمل الزائد للذاكرة/وحدة المعالجة المركزية/التعديلات في
system.warningsبمقدار دورة واحدة من دورات المقاييس غير المتزامنة (وغيابها في الدورة الأولى). #108035 (alexey-milovidov). - تم إصلاح استثناء
LOGICAL_ERROR(ScatterExchangeStep should have one source shard, got 8) وتكرار الصفوف عند الاستعلام عن جدولMergeمبني على جداولDistributedأو طرق عرض مع تفعيل الإعداد التجريبيmake_distributed_plan = 1. #108401 (groeneai). - تم إصلاح توقف مفاجئ للخادم (
Sort order of blocks violated) أثناء الدمج، وقراءات غير صحيحة، عند استخدام عنصرLowCardinalityغير قابل لقيم NULL ضمن عمودNullable(Tuple(...))كعمود فرعي (كأن يُستخدم مفتاحَ فرز مثلًا). #108679 (groeneai). - إصلاح انهيار في
Base64Decodeضمن Azure SDK المُضمَّن، يمكن الوصول إليه عبرazureBlobStorage()(ودالات جداول Azure ومحركات التخزين ذات الصلة) عندما لا يكون مفتاح الحساب بصيغة Base64 صالحة. كان أي بايت>= 0x80يتسبب في قراءة خارج حدود جدول فك الترميز، وكان أي بايت غير صالح يتسبب في إزاحة يسارية غير معرّفة لقيمة سالبة (ما يؤدي إلى توقف مفاجئ مع أدوات sanitizer). أصبحت المفاتيح غير الصالحة تُرفض الآن بشكل سليم. #108716 (groeneai). - تم إصلاح
LOGICAL_ERROR(“New empty part is about to materialize but the directory already exist”) الذي قد يُوقف الخادم بشكل مفاجئ في إصدارات debug وsanitizer عند تنفيذDROP/DETACH/MOVE/REPLACE PARTITIONعلى جدول MergeTree بعد مقاطعة عملية مماثلة سابقة (بسبب التراجع عن معاملة أو حدوث انهيار مثلًا) خلّفت وراءها دليلًا قديمًاtmp_empty_<part>. يُستعاد الآن الدليل القديم بدلًا من فشل العملية. #108879 (groeneai). - إصلاح إرجاع إسقاط للقيمة الافتراضية لنوع العمود (مثل
0) بدلًا من قيمةDEFAULTالمحددة له في DDL (مثل-1) بعد انتهاء صلاحيةTTLالخاص بالعمود في جزء بيانات عريض. #109013 (tiandiwonder). - إصلاح فشل استعلامات
ALTERعلى جداولMergeTreeالمُنشأة بإعدادdiskمخصص (SETTINGS disk = disk(...)). #109199 (Michicosun). - إصلاح ظهور صفوف قديمة ومحذوفة عند قراءة جداول قاعدة بيانات
MaterializedPostgreSQLعبر جدولMerge. #109339 (vdimir). - إصلاح قراءة جداول Paimon المقسّمة حسب عمود من نوع
BIGINTلا تتسع قيمته ضمنInt32. كانت قيم التقسيم هذه تُقتطع (فمثلًا كانت9223372036854775807تصبح-1)، مما يُنتج مسار تقسيم خاطئًا ويؤدي إلى فشل مصحوب بخطأ في نظام الملفات. #109510 (groeneai). - إصلاح خطأ منطقي (“Cannot determine row level filter; 0 columns deleted, 0 columns added”) عند القراءة من جدول
Mergeيحتوي جدوله الفرعي على سياسة صفوف (row policy) يكون عامل التصفية فيها مجرد عمود موجود (مثلCREATE ROW POLICY ... USING flag). #109843 (groeneai). - كان IcebergLocal يُبلغ عن Azure على أنه نوع التخزين. #109872 (PedroTadim).
- أصبح
CHECK TABLEيُبلغ عن التلف الفعلي في جزء الإسقاط الذي فشل تحميل بياناته الوصفية، بدلًا من الخطأ المضللColumns doesn't match ... Expected: 0 columns. #110262 (Algunenano). - إصلاح فشل بدء تشغيل الخادم لجداول
MergeTreeالموجودة على أقراص التخزين الكائني عندما يحتوي ملفtxn_version.txt.tmpمتبقٍّ على بيانات وصفية تالفة على مستوى القرص. #110519 (alexey-milovidov). - إصلاح تعذّر إرفاق جدول MergeTree يحتوي على إسقاط
_part_offsetأو إسقاط ترتيب التثبيت تعذّرًا دائمًا بعد تعطيلallow_part_offset_column_in_projectionsأوallow_commit_order_projectionثم فصل الجدول أو إعادة تشغيل الخادم. يُطبَّق هذان الإعدادان بوصفهما شرطين وقت CREATE فقط، لذا لم يعد يُعاد التحقق منهما عند ATTACH. #110570 (groeneai). - إصلاح خطأ
LOGICAL_ERRORنادر (“Unexpected number of parts to remove from parts_queue”) قد يؤدي إلى إنهاء الخادم بشكل مفاجئ علىReplicatedMergeTreeعندما تُلغي عمليتا تقسيم في الوقت نفسه (مثل استعلامَيMOVE PARTITION/REPLACE PARTITION، أو استعلام يتسابق مع عمليةDROP_RANGEفي الخلفية) فحصَ أجزاء البيانات الجاري في الخلفية على نطاقات متداخلة. #110738 (groeneai). - إصلاح خطأ منطقي
Hash is not set for serializationقد يحدث عندما يكون عمود ذو ترميزQuantized(...)متداخلًا داخل تسلسل قابل للتجميع، كجدولMergeمبني على مصادر يحمل فيها العمود ذو الاسم نفسه أنواعًا مختلفة (تُدمج فيVariant). #110776 (groeneai). - إصلاح خطأ
std::length_error(LOGICAL_ERROR) عند قراءة جدول MergeTree بقيمة شاذة لـmax_streams_for_merge_tree_reading(قريبة من الحد الأقصى لـUInt64) معallow_asynchronous_read_from_io_pool_for_merge_tree = 1. أصبحت قيمة هذا الإعداد الآن مقيّدة بالحد الأعلى نفسه المطبّق علىmax_threads. #110936 (groeneai). - إصلاح الخطأ المنطقي
Cannot calculate columns sizes when columns or checksums are not initializedالذي يحدث أثناء دمج جدولMergeTreeأحادي العمود، يحتوي عموده الوحيد علىTTLعلى مستوى العمود تنتهي صلاحيته بالكامل (معmin_bytes_for_wide_part = 1). #111169 (groeneai). - تنفيذ fsync لملفات الفهرس النصي الخاصة بجزء البيانات المدموج أو المُجسَّد عند تعيين
min_rows_to_fsync_after_merge/min_compressed_bytes_to_fsync_after_merge/fsync_part_directory. في السابق، كانت هذه الملفات هي الوحيدة في جزء البيانات التي تبقى دون مزامنة، لذا قد يؤدي انقطاع التيار الكهربائي مباشرةً بعد الدمج إلى ترك جزء بيانات مُثبَّت لكنه تالف، مما يتسبب في فقدان البيانات. #111335 (groeneai). - إصلاح
OPTIMIZE TABLE ... MANIFESTلجداولIcebergعندما لا تتطابق قيم Tuple الخاصة بتقسيمات ملف البيان مع مواصفات التقسيم الخاصة بها #111368 (SmitaRKulkarni). - إصلاح قراءة خارج الحدود (في إصدارات release) أو خطأ منطقي (في إصدارات debug) في تحسين التجسيد الكسول، وخطأ منطقي في
Pipe::unitePipesلجداولMerge، عندما يترك تحسين القراءة المباشرة من الفهرس النصي عمودًا افتراضيًا غير مستخدم للفهرس في ترويسة القراءة لجدولMergeTreeيحتوي على عدة فهارسtext. #111467 (groeneai). - إصلاح الخطأ
LOGICAL_ERROR(“Part level Min-Max index was constructed from unexpected columns set”) الذي قد يُجهض عملية دمج في الخلفية في إصدارات debug/sanitizer بعد خفض قيمةpart_minmax_index_columns(على سبيل المثال، منwith_block_number_offsetإلىpartition_key_only). #111511 (groeneai). - إصلاح تعطل يحدث عند تنفيذ قراءة
STREAM(enable_streaming_queries = 1) على جدول يحتوي على أكثر من تقسيم ومُعرَّفة عليه سياسة صفوف. في إصدارات debug وsanitizer كانت العملية تفشل بالخطأ المنطقيFilter column ... not found in DAG outputs، أما في إصدارات release فقد يحدث خطأ تجزئة (segfault). #111572 (groeneai). - إصلاح الخطأ
LOGICAL_ERROR(Cannot create part with type Compact and storage type Full because table does not support polymorphic parts) الذي يظهر عندما يُحمّل جدولMergeTreeجزء بياناتCompactموجودًا مسبقًا بينما تُعطّل إعداداته الحالية أجزاء البيانات متعددة الأشكال (حبيبية غير تكيفية). قد يحدث ذلك مثلًا عندما يتشارك جدول للقراءة فقط مسارًا على القرص مع جدول آخر، ثم يعيد تحميل أجزاء بياناته عبرSYSTEM RESTART DISKأو عند بدء تشغيل الخادم. في إصدارات debug وsanitizer يؤدي هذا الاستثناء إلى إجهاض الخادم. #111626 (groeneai). - عند ضبط
fsync_part_directory = 1، أصبحت عملية إعادة تسمية دليل جزء البيانات من اسمه المؤقت إلى اسمه النهائي دائمةً هي أيضًا، وذلك بتنفيذ fsync للدليل الأب (وللدليل الأب المصدر كذلك عند النقل بين أدلة أب مختلفة). في السابق، كان fsync يُنفَّذ للدليل المنقول فقط، لذا قد يؤدي انقطاع التيار الكهربائي مباشرةً بعد تثبيت جزء البيانات إلى فقدانه من القرص رغم أن ملفاته كانت قد كُتبت بالفعل، فتُفقد صفوف رغم تفعيل الإعداد. #111861 (groeneai). - إصلاح نتائج خاطئة وخطأ
LOGICAL_ERRORيحدثان عند تحديد عمودNullable(Tuple(...))مع أحد أعمدته الفرعية الحاملة لقيم null (VariantأوDynamicأوLowCardinality) من جدولMergeTree. كانت قراءة العمود الفرعي تُعلِّم الصفوف التي قيمتهاNULLفي Tuple الأب على أنهاNULLفي عمود سبقت مشاركته عبر ذاكرة التخزين المؤقت للتدفقات الفرعية، فكانت قراءة العمود بأكمله تُرجع قيمًا مُزاحة. #111949 (groeneai). - إصلاح فقدان عمليات الربط بالتجزئة (hash joins) لتحسيناتها التي تلي مرحلة البناء (التحويل إلى جدول تجزئة ثابت، ومرشح وقت التشغيل المشترك، وإعادة ضبط نطاقات الجدول الأيمن) كلما جرى تكوين حدّ تلقائي للتفريغ إلى القرص، وهو السلوك الافتراضي منذ الإصدار 26.5. #111972 (alexey-milovidov).
- إصلاح النتائج الخاطئة (صفوف مفقودة دون أي تنبيه) في
hasAllTokensوعمليات البحث الأخرى متعددة الرموز في فهرسtextعلى الإصدارات التي لا تستخدمsimdcomp(جميع المنصات المستهدفة باستثناء x86_64 Linux، مثل aarch64) عند ضبطtext_index_posting_list_apply_mode = 'lazy'. لم يكن مفكك ترميز الحزم البتية المحمول يكتب الأصفار المفككة للكتلة التي يبلغ عرضها البتي صفرًا، مما أدى إلى إسقاط الإدخال الموجود في مقطع لا يحتوي إلا على إدخال واحد. لم يتغير تنسيق التخزين على القرص، وتُقرأ البيانات الموجودة بشكل صحيح بعد الإصلاح. #112178 (groeneai). - أصبحت العمليات تفشل الآن عند تحميل إحصاءات MergeTree تالفة بدلًا من تجاهل الخطأ. #112201 (skuznetsov-clickhouse).
- إصلاح الفقدان الصامت لعمليات كتابة Iceberg المؤكَّدة على HDFS: ينشر الإيداع في Iceberg كل ملف بيانات وصفية جديد باستخدام كتابة مشروطة، لكن
HDFSObjectStorageكان يتجاهل الشرط وينفّذ استبدالًا عاديًا، فكانت جميع عمليات الكتابة المتزامنة تتلقى تأكيدًا بينما يتعذّر الوصول إلى لقطة أحد الكاتبين. أصبح HDFS يرفض الكتابة المشروطة بدلًا من ذلك، ولذا باتت عمليات كتابة Iceberg المُدارة من التخزين على HDFS تفشل، بما في ذلكCREATE TABLE ... ENGINE = IcebergHDFS(...)مع قائمة أعمدة صريحة. لا تتأثر عمليات القراءة. #112437 (groeneai). - إصلاح
DELETEعلى جداولKeeperMapالذي كان يحذف أولmax_block_sizeمن الصفوف المطابقة فقط مع الإبلاغ عن اكتمال التعديل بنجاح. كما يُصلح عدم ذرّيةDELETEعند ضبطkeeper_map_strict_mode = 1: إذ كان قد يلجأ إلى عمليات إزالة غير مرتبطة بإصدار، فيحذف صفوفًا جرى تحديثها بالتزامن، وكان يطبّق الصفوف المطابقة كتلةً تلو الأخرى، فقد يؤدي التعارض إلى تطبيق الحذف جزئيًا. #112777 (alexey-milovidov). - إصلاح خطأ عابر في Azure Blob Storage على مسار القراءة أو الدمج — مثل
403 Forbiddenالناتج عن انتشار صلاحيات RBAC، أو فشل المصادقة ببيانات الاعتماد، أو انتهاء مهلة الاتصال الذي يظهر بالرمز408— كان يُصنَّف خطأً على أنه غير قابل لإعادة المحاولة ويُبلَّغ عنه بوصفهPOTENTIALLY_BROKEN_DATA_PART(Code 740)، مما يطلق تنبيهًا حرجًا زائفًا لجزء بيانات سليم. باتت هذه الأعطال العابرة تُعامَل الآن على أنها قابلة لإعادة المحاولة، أما العطل المستمر فعلًا فيظهر كخطأ Azure عادي بدلًا من الإبلاغ عن جزء بيانات تالف لا وجود له. #112871 (arsenmuk). - إصلاح
listObjectsعلى قرص Azure Blob Storage ذي نقطة نهاية مسبوقة ببادئة، إذ كان يُعيد أسماء blob خاطئة في كل صفحة بعد الأولى، لأن ترقيم الصفحات كان يتجاوز الغلاف المحيط بالعميل الذي يزيل بادئة نقطة النهاية. أصبح ترقيم الصفحات يمر الآن عبر الغلاف مجددًا باستخدام رمز المتابعة، فتكون أسماء blob صحيحة في كل صفحة. #112872 (arsenmuk). - إصلاح فقدان فهرس minmax الخاص بكل جزء بيانات على
_block_numberو_block_offsetبعد إعادة تحميل الجدول، عندما يكون جزء البيانات ناتجًا عن تعديل لا يعيد كتابة الجزء بالكامل. #112878 (alexey-milovidov). - إصلاح استثناء (وفي إصدارات الإنتاج: خطأ يمنع الخادم من بدء التشغيل) يحدث عندما يستخدم شرط التعديل دالة الجدول
mergeدون اسم قاعدة بيانات صريح. أصبحت قاعدة بيانات الجدول المُعدَّل تُستخدم الآن، على غرار ما يحدث مع أسماء الجداول. #113185 (alexey-milovidov). - إصلاح النتائج الخاطئة وخطأ
LOGICAL_ERRORعند قراءة عمود فرعي لعضوNestedحُذف ثم أُعيدت إضافته، بالتزامن مع عضو موجود من المجموعة نفسها، في جدولMergeTreeيستخدمshare_nested_offsets = 1. كانت الأعضاء الموجودة تُعيد قيمًا من كتلة لاحقة كلما امتدت القراءة عبر أكثر من كتلة واحدة. #113225 (groeneai). - إصلاح استثناء حسابي في إصدارات التصحيح والمُعقِّمات عند القراءة من جدول
Mergeمع قيمة كبيرة جدًا لـmax_streams_to_max_threads_ratio: إذ كان عدد التدفقات يُقتطع إلى 32 بت، فتصبح مضاعفات2^32صفرًا. كما يُطلَق الآنPARAMETER_OUT_OF_BOUNDبدلًا من الوقوع في سلوك غير معرَّف عندما يتجاوز حاصل ضرب أعداد التدفقات لجدولMergeحدودsize_t، ويُتجنَّب الفيض عند تقييد تدفقاتMergeTreeبحجم البيانات، وتُرفض قراءة جدولMergeإذا كان إجمالي عدد المصادر سيتجاوز 65536. #113382 (alexey-milovidov). - إصلاح عمليات الكتابة على قرص
hdfs: كانت تفشل بالخطأParent directory doesn't existلأن مفاتيح الكائنات المُولَّدة تتضمن بادئة دليل متداخلة، غير أن HDFS، على خلاف أنظمة تخزين الكائنات، يحتوي على أدلة حقيقية ولا يُنشئ الدليل الأب المفقود عند إنشاء الملف.. #113396 (alexey-milovidov). - إصلاح الخطأ المُبلَّغ عنه عند تمرير named collection غير موجودة مع تجاوز من نوع
key = valueإلى دالات الجداولremote/remoteSecureأو محركات الجداولRemote/RemoteSecure. كان هذا الاستدعاء يُعاد تحليله بصمت على أنه استدعاء موضعي، فيُعامَل التجاوز كتعبير بيانات ويشير الخطأ المُبلَّغ عنه إلى شيء لا صلة له بالمشكلة (مثل Function with namemergedoes not exist فيremote(collection, database = merge(...))). أصبح يُبلَّغ الآن عن الـ named collection المفقودة. #113510 (groeneai). - إصلاح حلقة لا نهائية في عمليات الدمج الخلفية و
OPTIMIZEعند ضبطmerge_max_block_size_bytesعلى قيمة أقل منbyteSize()لعمود فارغ. فعمودLowCardinalityالفارغ يظل يحمل قاموسه، لذا قد يُبلَغ حد البايتات قبل دمج صف واحد؛ فيُنتج الدمج حينها كتلًا فارغة إلى ما لا نهاية، مستهلكًا 100% من إحدى نوى المعالج دون أن يُحرِّر موضعه في الـ background pool أبدًا. #113585 (groeneai). - إصلاح تعديل جزء بيانات من نوع Compact كان يُنتج نتيجة مختلفة بحسب ما إذا كانت معلومات التسلسل الخاصة بجزء البيانات لا تزال في الذاكرة أو أُعيد تحميلها من
serialization.json، عندما يستخدم الجدولserialization_info_version = 'basic'. وفيReplicatedMergeTreeأدّى ذلك إلى أن تكتب نسختان متماثلتان تحملان جزء بيانات مصدريًا متطابقًا بايتًا ببايت أجزاءَ بيانات معدَّلة مختلفة، فيفشل التعديل بالخطأCHECKSUM_DOESNT_MATCH. #113588 (groeneai). - أصبحت النسخ الاحتياطية تُبلِّغ عن خطأ الوصول الفعلي إلى ملف القفل بدلًا من الإبلاغ خطأً عن وجود نسخة احتياطية متزامنة عندما يتعذَّر على وحدة التخزين الوجهة قراءة ملف .lock. #113637 (kirillshokhin).
- إصلاح تسابق بيانات بين المهام الخلفية لجدول
MergeTree(تحديث الإحصاءات، وتحديث أجزاء البيانات، وتحميل أجزاء البيانات المتقادمة/غير المتوقعة) وعملية تدمير الجدول. #113722 (alexey-milovidov). - إصلاح قراءة
UPDATEوDELETEالخفيف من جداول خاطئة عندما تختلف قاعدة بيانات الجدول المُحدَّث عن قاعدة بيانات الـ session. أصبح تعبير التعديل يُوحَّد الآن بالنسبة إلى قاعدة بيانات الجدول المُحدَّث، سواء لدالة الجدولmergeالتي تستخدم قاعدة البيانات الحالية ضمنيًا، أو لمعرِّفات الجداول غير المؤهَّلة. في السابق كانت هذه الأسماء تُحَل بالنسبة إلى قاعدة بيانات الـ session، فكانت التعليمة تُحدِّث أو تحذف بصمت صفوفًا مُختارة من جدول آخر. #113748 (groeneai). - تم إصلاح استثناء يحدث عند قراءة جدول
MergeTreeحسب طبقات نطاقات المفتاح الأساسي عندما تُنتج إحدى الطبقات أنبوبًا فارغًا. #114177 (alexey-milovidov). - أصبحت
BACKUPوRESTOREوENGINE = Backupتتحقق الآن من صلاحية الوصول إلى موقع النسخة الاحتياطية وفقًا لصلاحياتSOURCESالممنوحة للمستخدم، على غرار ما تفعلهs3()وfile()وazureBlobStorage(). في السابق، كان بإمكان المستخدم الذي يملك صلاحيةBACKUPدونSOURCESكتابة نسخة احتياطية إلى أي موقع يستطيع الخادم الوصول إليه، وقراءتها منه. أصبحت كتابة النسخة الاحتياطية تتطلب الآن اتجاهWRITEعلى مصدر الوجهة (WRITE ON S3وWRITE ON AZUREوWRITE ON FILE)، بينما تتطلب قراءتهاREAD؛ أما وجهاتDisk(...)فتظل مقيدة بـbackups.allowed_diskفقط. #114405 (groeneai). - تم إصلاح قراءة جدول أثناء تنفيذ عملية تعديل: إذ كان عمود
MATERIALIZEDقد يُرجع قيمة قديمة، كما كان تحديده مع عمود محدَّث قد يفشل بخطأ. #114561 (tiandiwonder). - إصلاح خطأ منطقي (
Block structure mismatch) عند قراءة جدولMergeمع تفعيلmake_distributed_planعلى جداول فرعية تتضمن عمليات مجموعات داخلية. #114753 (alexey-milovidov). - كان تنفيذ
OPTIMIZE TABLEعلى جدول تخزين كائنات لا يدعم محركه عملية الدمج يُبلغ بالنجاح دون أن يفعل شيئًا. أما الآن فيُطلق خطأ، كما هو الحال مع أي محرك آخر لا يدعم هذه العبارة. يشمل ذلكDeltaLakeوPaimonوHudiومحركات تخزين الكائنات العادية (S3وGCSوCOSNوOSSوAzureBlobStorageوHDFSوURLالمدعوم بتخزين الكائنات)؛ أماIceberg، الذي يدعم الدمج فعلًا، فلم يطرأ عليه أي تغيير. #114805 (groeneai). - إصلاح
BAD_DATA_PART_NAME(“Trying to get part name in new format for old format version”) في جدولReplicatedMergeTreeالمُنشأ باستخدام الصيغة الموضعية التي تم إهمالها ضمنallow_deprecated_syntax_for_merge_tree. كان من الممكن الإبلاغ عن اكتمال عملية تعديل على نسخة متماثلة لم تطبّقها بعد، وقد يبقى الجدول في وضع القراءة فقط بعد إعادة التشغيل. #114980 (groeneai). - تم إصلاح
Found patch part ... that intersects mutation with version ...(LOGICAL_ERROR) في الجداول التي تستخدم التحديثات خفيفة الوزن. كان دمج أجزاء التصحيح قد يُنتج تصحيحًا يمتد نطاق إصدارات بياناته ليشمل إصدار بيانات جزء بيانات موجود؛ وعندئذٍ يتعذّر تطبيق هذا التصحيح أو تخطيه، فتفشل كل عملية لاحقة على القسم وتتوقف قائمة انتظار النسخ المتماثل. لم تعد عمليات الدمج هذه تُجدوَل بعد الآن. #115064 (alexey-milovidov). - تم إصلاح فشل الخادم في بدء التشغيل عندما يشير محرك قاعدة البيانات
Backupإلى نسخة احتياطية أصبحت غير متاحة (على سبيل المثال، عند حذف ملفاتها أو تعذّر الوصول إلى التخزين الأساسي). أصبحت قاعدة البيانات تُحمَّل الآن دون جداول بدلًا من أن تمنع الخادم بأكمله من بدء التشغيل. #83188 (orloffv). - إصلاح تعافي التسجيل بعد خطأ امتلاء القرص. في السابق، عندما يمتلئ قرص السجلات، كان ClickHouse يدخل في حالة فشل ويُغرق syslog برسائل الخطأ باستمرار (وقد يكتب أكثر من 100 غيغابايت في الساعة)، دون أن يتعافى أبدًا حتى بعد تحرير مساحة القرص. أصبح نظام التسجيل الآن يتعافى تلقائيًا بمجرد توفر مساحة على القرص، دون الحاجة إلى إعادة تشغيل الخادم. #93127 (jaehanbyun).
- إصلاح انهيار في زائر المخطط ضمن تخزين DeltaLake. #97112 (kssenii).
إصلاحات بحيرات البيانات والتخزين الخارجي
- إصلاح فشل عابر من نوع
Code: 499 ... InvalidPart(S3_ERROR) في عمليات التحميل متعدد الأجزاء إلى S3 (على سبيل المثالINSERT INTO ... hits_s3). قد يُبلغ MinIO لفترة وجيزة عن جزء بيانات تم تحميله للتو على أنه مفقود عندCompleteMultipartUpload؛ وباتت إعادة المحاولة تُطبَّق الآن على هذا الخطأ كما هو الحال مع الخطأNoSuchKeyالذي كان يُعالَج من قبل، وذلك في حدودs3_max_unexpected_write_error_retries. #109364 (groeneai). - رفض
ALTER TABLE ... DELETEوALTER TABLE ... UPDATEعلى جداول Iceberg التي لا تكون صيغة ملفات بياناتهاParquet، مع إرجاع خطأNOT_IMPLEMENTEDواضح بدلًا من تعطّل الخادم أو إتلاف الجدول دون أي تنبيه. #105893 (groeneai). - إصلاح الخطأ
Cannot add column ...: column with this name already existsعند تنفيذINSERT SELECTمن دالة جدول مثلfileأوs3أوinput، إذا حُدِّد العمود المصدر نفسه أكثر من مرة. #105982 (crakjie). - لم تعد القيم الحساسة المُمرَّرة كمعلمات في سلسلة استعلام HTTP (مثل ربط معلمات الاستعلام
param_*كـparam_secret_key/param_aws_secret_access_key، أو المعلمةpassword، أو معلماتsignatureبنمط S3) تُكتب كما هي فيsystem.text_logأو في OpenTelemetry spans. وأصبح سطر السجلRequest URIيحجب قيم المعلمات التي توحي أسماؤها بأنها حساسة، ويستبدلها بـ[HIDDEN]. #108475 (groeneai). - إصلاح العمود الافتراضي
_etagلمحركَي الجداولS3QueueوAzureQueue: كان مُعرَّفًا لكنه لم يكن يُملأ إطلاقًا، لذا كانSELECT _etagيُرجع دائمًا string فارغة. وأصبح الآن يُرجع قيمة ETag للكائن، كما هو الحال مع المحركS3ودالة الجدولs3(). #108625 (groeneai). - عند إلغاء استعلام يقرأ من S3 أو يكتب إليه (مثلًا عبر
KILL QUERY) أثناء تنفيذ طلب S3، يُبلَّغ عنه الآن على أنه مُلغى بدلًا من ظهور خطأ شبكة/S3 مضلِّل. وعلى وجه الخصوص، باتت عمليات النسخ الاحتياطي أو الاستعادة إلى S3 الملغاة تُبلِّغ عنBACKUP_CANCELLED/RESTORE_CANCELLEDفيsystem.backups. #108673 (jkartseva). - إصلاح العمود الافتراضي
_tagsلمحرك الجدولS3Queue: كان مُعرَّفًا لكنه لم يكن يُملأ إطلاقًا، لذا كانSELECT _tagsيُرجع دائمًا خريطة فارغة. وأصبح الآن يُرجع وسوم الكائن، كما هو الحال مع المحركS3ودالة الجدولs3(). #108676 (groeneai). - إصلاح اختلاف النتائج التي يُرجعها SHOW TABLES وSELECT … FROM system.tables لقواعد بيانات كتالوج بحيرة البيانات: أصبحت الجداول التي يتعذّر على ClickHouse قراءتها مخفية الآن في كليهما على نحو متسق. #109273 (SmitaRKulkarni).
- إصلاح توقف الخادم المفاجئ (أو، في إصدارات release، بقاء ملف بيانات غير مكتمل دون أي تنبيه) عندما يفشل
INSERTفي جدول Delta Lake (DeltaLakeLocal/deltaLake) بعد أن يكون المُستقبِل قد بدأ الكتابة فعلًا، كأن يُطلق الاستعلام المصدر استثناءً في منتصف الإدراج أو يُلغى الاستعلام. #109328 (groeneai). - إصلاح الخطأ
Not found column or subcolumn c.null in block(والخطأBad cast from ColumnConst to ColumnNullableفي إصدارات debug/sanitizer) عند تنفيذWHERE col IS NULL/IS NOT NULLعلى عمود Iceberg أُضيف نتيجة تطور المخطط بعد كتابة ملفات بيانات أقدم، معoptimize_functions_to_subcolumns=1(القيمة الافتراضية). #109515 (groeneai). - إصلاح الخطأ
Host is empty in S3 URIعند استخدام استعلام فرعي قيَمي كوسيطة URL لدالة الجدولs3(أو كوسيطة لأي دالة جدول أخرى) في استعلاماتCREATE TABLE ... AS SELECT: باتت الاستعلامات الفرعية ذات القيمة المفردة في وسيطات دوال الجدول تُقيَّم الآن أثناء مرحلة تحليل الاستعلام. #110254 (CheSema). - إصلاح خطأ منطقي (يؤدي إلى إنهاء الخادم في إصدارات التصحيح/المُعقِّمات) عند تنفيذ أمر
ALTERمتعدد الأوامر مثلUPDATE ..., DELETE ...على جدول Iceberg. تُرفض هذه التعديلات الآن مع خطأ واضح هوNOT_IMPLEMENTED. #110347 (groeneai). - إصلاح توليد جداول Iceberg لمعرّفات حقول مكررة بعد
ALTER TABLE ... ADD COLUMNعندما يحتوي المخطط الأولي على حقول متداخلة (Tuple/Array/Map). باتlast-column-idيسجّل الآن أعلى معرّف حقل مُسنَد بما في ذلك العناصر الفرعية المتداخلة، فلم يعد العمود المُضاف لاحقًا يعيد استخدام معرّف حقل متداخل، ولم تعد عمليات القراءة تفشل معICEBERG_SPECIFICATION_VIOLATION(Duplicate field id). #110884 (groeneai). - إصلاح حذف
DELETE/UPDATEعلى جدول Iceberg لصفوف غير صحيحة دون أي تنبيه (أو إطلاقNOT_FOUND_COLUMN_IN_BLOCK) عندما يحتوي الجدول على ملفات بيانات مكتوبة قبلALTER TABLE ... ADD COLUMNوبعده معًا، مع تفعيلoptimize_move_to_prewhere. #111693 (groeneai). - إصلاح تحوّل قيمة
made_current_atفيsystem.iceberg_historyإلى1970-01-01للقطة محتفَظ بها بعد تنفيذALTER TABLE ... EXECUTE expire_snapshotsعلى جدول Iceberg. كما أُصلح عدم إرجاعsystem.iceberg_historyأي صفوف لجدول لا تحتوي بياناته الوصفية علىsnapshot-log. #111781 (groeneai). - إصلاح تلف البيانات عند الإدراج في جدول Iceberg يُوصَل إليه عبر
MATERIALIZED VIEW. كان ملف البيانات يُكتب وفق أنواع أعمدة الهدف المحددة وقتCREATEبدلًا من مخطط Iceberg الفعلي الحالي، فكانت قيمةDateTimeتُخزَّن كقيمة Avrointمجردة وتُقرأ لاحقًا على أنها ميكروثوانٍ، بل كان يتعذّر قراءة الملف إطلاقًا معDateTime64(0)أوDateTime64(9). وبناءً على ذلك، باتINSERT INTO <materialized view>على هدف يكون مخطط Iceberg الخاص به أوسع من الأعمدة المُعلنة في العرض يُطلق الآنTYPE_MISMATCHبدلًا من كتابة صف تالف. #112359 (groeneai). - إصلاح الكتابة في جداول Iceberg التي يحتوي مخططها على Tuple متداخل داخل Tuple آخر. كانت البيانات الوصفية المنشورة للجدول تستبدل أسماء حقول الـ Tuple الداخلي بأسماء موضعية
1و2و…، فكانINSERTيفشل معINCORRECT_DATAعند استخدام التنسيق الافتراضيParquet، في حين يتعذّر قراءة العمود لاحقًا معAvro. #112480 (groeneai). - إصلاح حالة جمود (deadlock) تُعطّل قاعدة بيانات
FilesystemأوHDFSبشكل دائم عندما يحلّ استعلامان اسم الجدول نفسه في آنٍ واحد. إذ يظل كل استعلام لاحق على قاعدة البيانات تلك محجوبًا إلى ما لا نهاية دون إمكانية مقاطعته، مما يستلزم إعادة تشغيل الخادم لاستعادة عمله. #112495 (groeneai). - إصلاح إرجاع جداول
DeltaLakeعددًا من الصفوف أقل من المتوقع عندما يحتوي مسندWHEREعلى تعبير فرعي يعجز مترجم المسندات في delta-kernel عن معالجته، ويقع ضمنNOT. أصبح هذا التعبير الفرعي يُبلَّغ إلى delta-kernel الآن كمسند مجهول صريح بدلًا من اعتباره نهاية مُكرِّر العناصر الفرعية، وهو ما كان يؤدي سابقًا إلى اقتطاع الاقتران المحيط به دون أي تنبيه. #112652 (groeneai). - إصلاح مشكلة كان فيها
ALTER TABLE ... EXECUTE remove_orphan_filesيحذف الملفmetadata/version-hint.textالنشط في جدول Iceberg. فقد كان إدخاله في مجموعة الملفات القابلة للوصول يُبنى عبر ربط السلاسل النصية على افتراض وجود شرطة مائلة في نهاية قيمة لا تنتهي بها أبدًا، فلم يُعدّ ملف الاستدلال الفعلي قابلًا للوصول قط، وكان يُحذف بمجرد أن يتجاوز عمره عتبةolder_than. ومع ضبطiceberg_use_version_hint = 1كانت قراءة الجدول تفشل كليًا بعد ذلك. #113548 (groeneai). - إصلاح الخطأ
LOGICAL_ERRORعند تصفية عمود Iceberg حوّلهALTER TABLE ... MODIFY COLUMNإلى النوعNullable. #114521 (groeneai). - إصلاح حالة لم يكن فيها
ATTACH TABLEالذي يتضمن تعريفENGINE = URL(...)يتحقق من صلاحيةTABLE ENGINEالخاصة بالمحرك الذي يُوجِّه إليه مخطط URL. فقد كان بإمكان مستخدم لا يملك سوىTABLE ENGINE ON URLإرفاق جدول مدعوم بـFileأوS3أوAzureBlobStorageأوHDFSثم قراءته، مع أنCREATE TABLEيرفض ذلك عن حق. #115914 (groeneai). - إصلاح فشل طلبات HTTP الصادرة (مثل `aiGenerate` ودالة الجدول `url` وS3) بالخطأ `No route to host` على المضيفات التي تُعلن عن عناوين IPv4 وIPv6 معًا بينما لا تكون إلا عائلة عناوين واحدة قابلة للتوجيه. أصبح مجمّع اتصالات HTTP الآن ينتقل إلى العنوان المحلول التالي عندما يفشل الأول بخطأ في الشبكة، بدلًا من تمرير الخطأ منذ الطلب الأول. #103786 (alexey-milovidov).
- السماح بقراءة
arrayفي Avro مكوّنة من سجلات ثنائية الحقول{key, value}إلى عمودMapفي ClickHouse. وهذا هو الترميز الذي ينتجه Iceberg وSpark للنوعMAP<K, V>ذي المفتاح غير النصي (إذ لا تدعم الخرائط الأصلية في Avro سوى المفاتيح النصية). في السابق كان يمكن قراءة مثل هذا الملف بوصفهArray(Tuple(key, value))لا بوصفهMap(K, V)، إذ كانت القراءة تفشل بالخطأType Map(...) is not compatible with Avro array. #109289 (groeneai). - إصلاح قراءة جدول Iceberg يحتوي على ملف بيانات وصفية رقم إصداره مكوّن من أرقام فقط لكنه يتجاوز نطاق الأعداد الصحيحة 32 بت (مثل
v99999999999999999999.metadata.json). في السابق كان مثل هذا الاسم يُنتج خطأً مبهمًاstd::out_of_range(STD_EXCEPTION) بدلًا من خطأBAD_ARGUMENTSواضح. #109619 (groeneai). - إصلاح اسم ملفات البيانات الوصفية في Iceberg المضغوطة بـ gzip. كان ClickHouse يكتبها باسم
v{N}.gzip.metadata.json(رمزContent-Encodingفي HTTP)، بينما تتوقع مواصفة Iceberg الامتدادgzبالصيغةv{N}.gz.metadata.json. ونتيجة لذلك لم يكن Spark وغيره من القارئات المعتمدة على كتالوج Hadoop قادرة على العثور على البيانات الوصفية التي يكتبها ClickHouse. أصبح ClickHouse الآن يكتبv{N}.gz.metadata.jsonمع مواصلة قراءة الاسم القديمgzipحفاظًا على التوافق مع الإصدارات السابقة. #109812 (groeneai). - إصلاح مشكلة في جداول Iceberg ذات تنسيق الكتابة
Avro، كان يُسلسَل فيها الحقل المُعرّف بـ"required": falseمن النوعlistأوmapأوstructعلى أنه إلزامي، دون اتحاد["null", T]، مما أدى إلى تعارض مخطط ملف البيانات نفسه مع البيانات الوصفية للجدول، فكانت قارئات Iceberg الأخرى تراه حقلًا إلزاميًا. أصبح مثل هذا الحقل يُكتب الآن بوصفه اتحاد["null", T]الذي تستخدمه مواصفة Iceberg للحقول الاختيارية. #112648 (groeneai). - تم إصلاح
made_current_atفيsystem.iceberg_historyالذي كان يُبلغ عن أقدم وقت أصبحت فيه اللقطة حالية بدلاً من أحدثه، وذلك عندما يتكررsnapshot-idنفسه أكثر من مرة فيsnapshot-logالخاص بـ Iceberg (كما يحدث بعد عملية التراجع). #113598 (groeneai). - تم إصلاح تعليق قد يستمر حتى ساعة كاملة في
BACKUP/RESTORE ... TO S3وأقراص GCS ودالة الجدولs3عندما تضبط المجموعة المسماةhttp_client = 'gcp_oauth'وتقبل نقطة نهاية رموز Google OAuth2 الاتصال دون أن تستجيب أبداً. لم يعد طلب رمز Bearer يرث مهلة طلب نقل البيانات الخاصة بالجهة المستدعية؛ إذ أصبحت مدة انتظار الاستجابة محدودة بـ 10 ثوانٍ، بما يتوافق مع الحد الأقصى لطلب STSAssumeRole. #115531 (groeneai). - إصلاح خطأ منطقي في ذاكرة التخزين المؤقت لنظام الملفات (
Expected file ... not to exist) كان قد يحدث عند فشل تنزيل ذاكرة التخزين المؤقت في الخلفية باستثناء من غير النوعErrnoException(على سبيل المثال أثناء تنفيذOPTIMIZEعلى جدول Iceberg)، مما يُخلّف ملف ذاكرة تخزين مؤقت يتيماً وفارغاً. #110549 (groeneai). - تم إصلاح مشكلة كانت فيها ذاكرات التخزين المؤقت المُهيّأة بحد أقصى لعدد العناصر (سياسة
SLRU) تتوقف بصمت عن قبول عناصر جديدة بمجرد أن يصل عدد العناصر التي تم الوصول إليها مرتين على الأقل إلى ذلك الحد. تشمل ذاكرات التخزين المؤقت المتأثرة ذاكرات التخزين المؤقت لملفات البيانات الوصفية الخاصة بـ Iceberg وPaimon، وذاكرة التخزين المؤقت للبيانات الوصفية لـ Parquet، وذاكرات التخزين المؤقت للفهرس النصي، وذاكرة التخزين المؤقت لفهرس تشابه المتجهات، وذاكرة التخزين المؤقت للتعبيرات المُترجمة، وذاكرة التخزين المؤقت لحالة الملفات في ObjectStorageQueue. #115517 (groeneai). - تم إصلاح عمليات قراءة جداول Paimon التي كانت قد تفشل أثناء استبدال الاستدلال القابل للتغيير
snapshot/LATESTبالتزامن. أصبحت الاستدلالات غير الصالحة أو القديمة تلجأ الآن بأمان إلى سرد اللقطات كبديل. #112010 (JiaQiTang98). - إظهار الاستثناء الأساسي الفعلي عند تعذّر فك ضغط أرشيف zip بسبب رفض المخزن المؤقت للإدخال (مثل مخزن القراءة المؤقت لـ S3 مع
restricted_seek = true) لعملية انتقال أو قراءة تطلبها minizip. في السابق، كان الخطأ الفعلي مخفياً خلف الرسالة العامةCouldn't unpack zip archive: Code = -100/Couldn't open zip archive. #105103 (groeneai). - إصلاح الكتابة في iceberg للبيانات الوصفية التي لا تحتوي على مراجع #106896 (AVMusorin).
- إصلاح استثناء يحدث عند الإدراج في جدول Iceberg أُنشئت بياناته الوصفية بواسطة محرك خارجي ولا تتضمن المصفوفات الاختيارية
snapshotsأوmetadata-logأوsnapshot-log. أصبحت عمليات الإدراج هذه تنجح الآن بدلاً من أن تفشل. #107473 (tiandiwonder). - تم إصلاح الخطأ
ReadBuffer is canceled. Can't read from it.الذي كان قد يحدث عند إعادة محاولة التحميل إلى S3 (كتحميل نسخة احتياطية مثلاً) بعد خطأ قراءة عابر. #108573 (groeneai). - إصلاح الخطأ
std::future_error(“The associated promise has been destructed prior to the associated state becoming ready”) الذي كان قد يظهر، ويتسبب في إنهاء الخادم في إصدارات debug/sanitizer، عند فشل جدولة المهمة النهائية غير المتزامنة لإكمال التحميل متعدد الأجزاء إلى S3/Azure (على سبيل المثال عند استنفاد مجمّع الخيوط). أصبح خطأ الجدولة الفعلي يُبلَّغ عنه الآن بدلاً من ذلك. #108730 (groeneai). - إصلاح قراءة الطوابع الزمنية في ORC التي تتجاوز العام 2262 تقريبًا إلى column من النوع
DateTime64بدقة (scale) أقل من 9. كان قارئ ORC الأصلي يحوّل كل طابع زمني عبر نوع وسيط ثابت هوDateTime64(9)، مما يسبب تجاوزًا لنطاقInt64عند دقة النانوثانية، فيرفض هذه القيم بالخطأVALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE، حتى عندما تكون دقةDateTime64المطلوبة (مثلDateTime64(6)التي ينتجها Iceberg) قادرة على تمثيل القيمة. تُقرأ الطوابع الزمنية الآن مباشرةً بالدقة المطلوبة، ويُراعى الإعدادdate_time_overflow_behaviorعندما تعجز الدقة المستهدفة نفسها عن استيعاب القيمة. #109302 (groeneai). - عند قراءة جدول Paimon يحتوي مخططه على نوع متداخل غير مدعوم (مثل حقل
ROW)، يُبلَّغ الآن عن error واضح من النوعBAD_ARGUMENTSيحدد اسم النوع غير المدعوم، بدلًا من رسالةDB::Exception. (OK)المجردة برمز error يساوي 0 ودون أي رسالة. #109762 (groeneai). - إصلاح قراءة جداول Iceberg المقسّمة بحسب الـ column المصدر نفسه أكثر من مرة (مثل
PARTITIONED BY (hours(ts), ts)). كانت قراءة هذه الجداول تفشل سابقًا بالخطأCannot add column ...: column with this name already exists (ILLEGAL_COLUMN). #109895 (groeneai). - باتت ملفات البيانات التي يكتبها ClickHouse في جداول Iceberg تتضمن معرّفات حقول Iceberg لصيغتي Avro (
field-id) وORC (سمات النوعiceberg.id/iceberg.required)، كما باتت أعمدةStringفي ORC تُكتب بالنوعstringفي ORC بدلًا من النوع الثنائي. في السابق، كانت صيغة Parquet وحدها تتضمن معرّفات الحقول، لذا كانت القارئات المتوافقة مع المواصفة (مثل Spark/iceberg-java) تُرجع قيم NULL بصمت من صفوف Avro التي كتبها ClickHouse بعد إعادة تسمية column، وتعجز تمامًا عن قراءة ملفات ORC التي كتبها ClickHouse. #109994 (groeneai). - إصلاح الخطأ المنطقي
ChunkInfoRowNumbers does not existعند تنفيذOPTIMIZE TABLEعلى جدول Iceberg يحتوي على ملف بيانات بصيغة غير Parquet (مثلORC) أحدث من جميع ملفات الحذف حسب الموضع. #110107 (alexey-milovidov). - إصلاح قراءة ملفات
Parquetالكبيرة من مدخلات zip غير مضغوطة من النوعSTOREDعبرs3وfile. #110495 (Gudauu). - لم يعد الإخفاق في تشغيل مجمّع جدولة خلفي (مثل المجمّع
icebergعند استنفاد مجمّع الخيوط العام) يؤدي إلى إيقاف الخادم، إذ أصبح الخطأ استثناءً قابلًا للتعافي. كما لم تعد قراءةsystem.background_schedule_poolتُنشئ تلك المجمّعات كأثر جانبي. #111209 (groeneai). - إصلاح المصادقة عبر DLF في REST catalog الخاص بـ Paimon: كان توقيع الطلب يُحسب مرة واحدة ثم يُعاد استخدامه، فتفشل جميع طلبات الـ catalog التالية للطلب الأول بخطأ HTTP 401 ويُرجع الأمر SHOW TABLES قائمة فارغة. كما أُصلح اكتشاف خطأ HTTP 404 في عمليات التحقق من وجود الجداول. #112015 (JiaQiTang98).
- إصلاح الخطأ
LOGICAL_ERROR(partitions_count > 0) عند تقسيم مقاطع بياناتIcebergأفرغتها عمليات الحذف بالموضع، كما يحدث مثلًا أثناء ضغط جدولIcebergمقسّم يحتوي على ملفات بيانات محذوفة بالكامل. #112432 (PedroTadim). - إصلاح مشكلة في حذف الكائنات على دفعات في Azure، إذ لم تكن تُسجَّل أي أحداث Delete في
system.blob_storage_logعند فشل طلب الدفعة نفسه، فتبقى الدفعة بأكملها دون تسجيل. بات يُسجَّل الآن حدث Delete لكل كائن عند حدوث فشل على مستوى الدفعة. #112873 (arsenmuk). - تم إصلاح قراءة جداول
Paimonالمقسّمة حسب عمودTIMESTAMPبدقة أعلى من المللي ثانية، إذ كانت تفشل مع الخطأscale 6 is not supported, only support scale <= 3. #113401 (JiaQiTang98). - إصلاح انهيار يحدث عند قراءة جدول في بحيرة بيانات يُعرّف مخططه عمودًا باسم فارغ. تُرفض البيانات الوصفية المشوّهة لـ Iceberg مع الخطأ
ICEBERG_SPECIFICATION_VIOLATION، ويُرفض المخطط المقدَّم من كتالوج أو من Delta Lake أو Paimon مع الخطأAMBIGUOUS_COLUMN_NAME. يُجرى هذا الفحص دون أي شرط، لذا فإن جدول Iceberg الذي يكتفي بالاحتفاظ بمخطط تاريخي غير مستخدم يتضمن حقلًا باسم فارغ يصبح هو الآخر غير قابل للقراءة، بدلًا من أن يتسبب في إنهاء الخادم قسريًا عند قراءة ذلك المخطط. #114394 (groeneai). - لم تعد قراءة جدول Iceberg تتضمن بياناته الوصفية تطورًا في المخطط تحظره مواصفة Iceberg تؤدي إلى إنهاء الخادم قسريًا. كانت أربع مخالفات للمواصفة في
IcebergSchemaProcessorتُبلَّغ بوصفهاLOGICAL_ERROR، الذي يُعامَل معاملة التأكيد الفاشل، أو كانت تصل إلى تأكيد قاتل دون أي فحص؛ أما الآن فتُطلق الخطأICEBERG_SPECIFICATION_VIOLATION. #114518 (groeneai). - تم إصلاح مشكلة كان فيها العمود الافتراضي
_timeفي دالات الجداولurl/urlClusterيُرجعNULLدائمًا في الإصدارات المبنية على musl، وذلك بسبب تحليل غير محمول لترويسة HTTPLast-Modified. #111619 (thevar1able). - تم إصلاح مشكلة رفض الخادم الإقلاع بعد إنشاء جدول باستخدام
CREATE TABLE ... AS url('http://host/**/', ...)أثناء تفعيلallow_experimental_url_wildcard_from_index_pages. كان تحميل البيانات الوصفية لمثل هذا الجدول يعيد تقييم فحص الميزة التجريبية فيفشل مع الخطأSUPPORT_IS_DISABLED، مما يؤدي إلى إيقاف عملية الإقلاع. #115095 (groeneai). - لم يعد جدول محرك قاعدة البيانات
URLيكشف عن وجود ملف محلي لمستخدم لا يملك أذونات قراءة المصدر: فلم يعدEXISTS TABLE، الذي لا يتطلب سوى امتيازSHOW TABLES، ولا عملية تحليل اسم الجدول، يستكشفان نظام الملفات قبل التحقق من الأذونات. #113029 (alexey-milovidov). - تطبيق
query_masking_rulesعلى الرسائل المُلحقة عبرException::addMessage، كي لا تتسرب بيانات الاعتماد المرمّزة وفق URL في اللواحق(in file/uri ...)الناتجة عن أخطاءjdbc()/odbc()عند تهيئة قواعد إخفاء الاستعلامات. #106916 (gaurav0107).
إصلاحات الصيغ والإدخال
- أصبحت عمليات القراءة دون مخطط لأنواع Arrow
time32/time64(مثلSELECT * FROM file(..., 'Arrow')) تستنتج النوعTime64بدلاً منDateTime64الذي كانت تستنتجه سابقاً. وعند الترقية، سيتعطّل أي مكوّن لاحق يعتمد على النوع المُستنتَج القديم. ويضيف هذا التغيير أيضاً دعم تصديرTime/Time64إلى Arrow، مع اختيار نوع الوقت المناسب في Apache Arrow بحسب الدقة. #104316 (Maoyao233). - إصلاح احتمال ظهور نتائج خاطئة أو قراءات خارج الحدود عند التراجع عن عملية
INSERTإثر خطأ يقع في منتصف الدفعة (كما في جداولBuffer، أو عمليات الإدراج غير المتزامنة، أو المحركاتKafka/RabbitMQ/FileLog) عندما يكون النسخ الكسول للأعمدة (enable_lazy_columns_replication) مفعّلاً. #108935 (groeneai). - إصلاح عدم اتساق في المحلل النحوي، إذ كانت قائمة أعمدة
INSERTتقبل مُطابِق أعمدة مؤهَّلاً مكتوباً بالشكلt.* LIKE '<pattern>'/t.* ILIKE '<pattern>'، لكنها ترفض صيغته القياسيةt.COLUMNS('<regexp>')، مما كان يُخِلّ بتطابق تنسيق الاستعلام عند إعادة تحليله (ويؤدي إلى إيقاف الخادم في إصدارات التصحيح/المُعقِّمات). #109176 (groeneai). - إصلاح فشل
INSERTفي جدولDataLakeCatalogعلى Microsoft Fabric / OneLake بالخطأIncorrectEndpointError(HTTP 400)، وذلك بتوجيه عمليات الكتابة في ADLS Gen2 (DFS) إلى مضيف نقطة النهاية.dfsبدلاً من المضيف.blob. ملاحظة: عند استخدامremote_url_allow_hosts، يجب إضافة مضيفَي Fabric كليهما،.blob(للقراءة) و.dfs(للكتابة)، إلى قائمة السماح حتى يعملINSERT. #110290 (zlareb1). - إصلاح عمليات الكتابة عبر دالات جداول بحيرات البيانات (مثل
INSERT INTO FUNCTION icebergS3(...)) التي كانت تُنتج ملفات parquet تفقد فيها الأعمدة النصية تعليق النوعString، مما يجعل البيانات المكتوبة غير قابلة للقراءة بواسطة أدوات القراءة الخارجية مثل Spark. وأصبحت هذه العمليات تستخدم إعدادات الصيغة نفسها المستخدمة في الكتابة عبر محرك الجدول. #110465 (tiandiwonder). - إصلاح تعذّر قراءة
system.session_logبعد تسجيل الدخول عبر Arrow Flight: فالعمودinterfaceمن النوعEnum8، غير أن القيمةArrowFlightلم تكن ضمن قيم تعداده، فكان تسجيل الدخول عبر بروتوكول Arrow Flight يكتب القيمة الخام10، ويُطلق أي استعلامSELECTيقرأ صفاً كهذا الاستثناءUnexpected value 10 in enum. #110758 (alexey-milovidov). - إصلاح استنتاج المخطط لعائلة صيغ
TSVالتي كانت تستنتجStringلقيمة عشرية مكتوبة بصفر بادئ، مثل0.0أو0.5، في حين تستنتجCSVالنوعFloat64بشكل صحيح. فضلاً عن ذلك، كان الاكتشاف التلقائي لصف العناوين فيTSVيعدّ الصف الأول من هذه القيم صفَّ عناوين، فيختفي من النتيجة. ويُصلح هذا التغيير أيضاً استنتاجTSKVنوعاً رقمياً لقيمة مكتوبة بتسلسل هروب، مثلx=1\x2E5، ثم يفشل تحليلها. أما القيم التي يكون صفرها البادئ مجرد حشو لعدد صحيح، مثل007، فتظل تُستنتج على أنهاString، لأن محلل قيمTSVلا يستطيع قراءتها مجدداً. #112226 (groeneai). - إصلاح اقتراح استنتاج المخطط نوعًا رقميًا لقيم نصية يعجز محلل القيم عن قراءتها مجددًا. كان الاستنتاج يقبل أُسًّا معلّقًا (
1e+)، أو جزءًا عشريًا مفقودًا (.)، أو إشارة مكررة (++inf)، فترفضهاreadFloatTextPreciseلاحقًا بالخطأCANNOT_PARSE_NUMBERعند القراءة وفق المخطط المستنتج؛ أما في column من النوعDynamicفكان ذلك يظهر خطأً عند تنفيذ INSERT. أصبح الاستنتاج الآن يتحقق من الرقم باستخدام المحلل نفسه الذي يعتمد عليه القارئ فعليًا. كما يزيل هذا الإصلاح حالة كان فيها النوع المستنتج يتوقف علىmax_read_buffer_size، ويتيح استنتاج صيغ الأُس الصالحة ذات الأصفار البادئة مثل0e5على أنهاFloat64في TSV كما هو الحال أصلًا في CSV. ويُصلح كذلك صيغ الأُس غير السليمة. #112453 (groeneai). - إصلاح تجاهل
KILL QUERYوmax_execution_timeلدقائق أثناء تحليل صيغة إدخال قائمة على الصفوف لكتلة واحدة. أصبحت صيغ الإدخال القائمة على الصفوف تتحقق من إلغاء الاستعلام كل 8192 صفًا، فتتوقف عملية الإدراج المُنهاة (ولا سيما تفريغ الإدراج غير المتزامن في الخلفية، الذي يحلل ما يصل إلىmax_insert_block_sizeصفًا لكل كتلة) فورًا بدلًا من مواصلة العمل حتى نهاية الكتلة. #112646 (groeneai). - إصلاح اعتماد نوع column المستنتج على ترتيب الاستعلامات السابقة لمصدر مخططه مخزّن في ذاكرة التخزين المؤقت. كانت الإعدادات التي تؤثر في النوع المستنتج غائبة عن مفتاح ذاكرة التخزين المؤقت لاستنتاج المخطط، فكانت قيمتها في الاستعلام الأول هي التي تحدد النوع الذي تراه جميع الاستعلامات اللاحقة:
input_format_try_infer_exponent_floats، وmax_parser_depth، وinput_format_json_infer_array_of_dynamic_from_array_of_different_types، وكذلك بالنسبة إلىParquet:input_format_parquet_local_time_as_utc، وinput_format_parquet_allow_geoparquet_parser، وinput_format_parquet_skip_columns_with_unsupported_types_in_schema_inference، وschema_inference_make_json_columns_nullable. كما يسجّل الإصلاح دالة جلب مفتاح ذاكرة التخزين المؤقت الناقصة للصيغةForm، ويجعل دالة الجلب الخاصة بـTemplateتستخدم قاعدة الإفلات الخاصة بصيغة الصفوف التابعة لها. #113533 (groeneai). - إصلاح تنسيق وسيطة الاستعلام الفرعي في دالات الجداول
viewوviewIfPermittedعندما ينتهي الاستعلام المحيط بعبارةSETTINGS. كان مثل هذا الاستعلام يُنسَّق بالشكلview((SELECT ...))، الذي يتعذر تحليله مجددًا، فيفشل الاستعلام في فحص التنسيق-التحليل-التنسيق الداخلي ويُطلق الخطأInconsistent AST formatting. #114658 (groeneai). - إصلاح الخلط بين بيانات JSON وصيغة TSKV أثناء الاكتشاف التلقائي للصيغة. #106009 (Avogar).
- أصبح تصدير قيم
Time/Time64الواقعة خارج النطاق الصالح لوقت اليوم (السالبة أو>= 24h) إلى صيغةArrowيُرفض الآن برسالة خطأ واضحة بدلًا من كتابة بيانات Arrowtime32/time64غير صالحة. #107179 (tiandiwonder). - إصلاح قراءة ملفات
ArrowوArrowStreamوملفاتORCالمعتمدة على Arrow التي تحمل فيها column الطابع الزمني إزاحة UTC رقمية ثابتة (مثل+05:30و-08:00و00:00) أو العلامةfixedغير التابعة لـ IANA منطقةً زمنية، إذ كانت قراءتها تفشل سابقًا بالخطأCannot load time zone ...(BAD_ARGUMENTS). #108633 (groeneai). - تسلسل column من النوع
Nullable(Tuple(...))حقلَ CSV واحدًا بدلًا من تسطيحه إلى أعمدة منفصلة. في السابق كانت القيمة غير الفارغة تُكتب في عدة حقول CSV بينما تُكتبNULLقيمةً واحدة\N، فيتفاوت عدد الأعمدة من صف إلى آخر، مما يُفسد ترويساتCSVWithNames/CSVWithNamesAndTypesوعمليات الكتابة ثم إعادة القراءة. #108959 (groeneai). - تم إصلاح تخصيص مفرط للذاكرة أثناء استنتاج المخطط لصيغة
MsgPack: فالإدخال التالف أو المُولَّد عشوائيًا (fuzzed)، الذي تُعلن ترويسة المصفوفة/الخريطة/السلسلة النصية/البيانات الثنائية فيه عن عدد ضخم من العناصر، لم يعد يتسبب في تخصيص واحد بحجم عدة غيغابايتات (إذ يُرفض الآن باعتباره إدخالًا مشوَّهًا). ويُصلح هذا توقفًا مفاجئًا من نوعallocation-size-too-bigعند استخدام أدوات الفحص (sanitizers)، وحالة نفاد الذاكرة في إصدارات الإنتاج. #109019 (groeneai). - إصلاح خطأ
LOGICAL_ERRORعند كتابة column من نوعLowCardinality(Time)بصيغةArrowمع الإعدادoutput_format_arrow_low_cardinality_as_dictionary = 1. #109730 (groeneai). - تم إصلاح قراءة دفق تالف بصيغة
Nativeيقترب فيه عدد أنواعDynamicأو عدد مساراتJSON/ObjectمنSIZE_MAX: إذ يُرفض هذا الإدخال المشوَّه الآن مع error واضح من نوعINCORRECT_DATAبدلًا من استثناءstd::length_errorغير مُعالَج. #110590 (alexey-milovidov). - تم إصلاح خطأ
LOGICAL_ERROR: Cannot sum Bools(الذي يُوقف الخادم في إصدارات التصحيح/أدوات الفحص) عند دمج الحالات التجميعية لـsumMap/sumMapWithOverflow/sumMapFilteredالتي تحتوي على قيمBoolمُسلسَلة بصيغة الحالة القديمة (الإصدار 0). ويُصحح الإصلاح نفسه أيضًا حالتين كانتا تُنتجان نتائج خاطئة دون أي تنبيه مع حالاتBoolمن الإصدار 0: إذ لم تكن تكرارات مفاتيح الخريطة من نوعBoolتُزال عبر الحالات، كما كان ضغط القيم الصفرية يحذف إدخالات غير المقصودة. #110922 (groeneai). - إصلاح رفع دالة الجدول
formatلاستثناءNOT_FOUND_COLUMN_IN_BLOCKعندما لا يُنتج تحليل بيانات الإدخال أي صفوف (على سبيل المثال: JSON فارغ، أوFeatureCollectionبصيغة GeoJSON بلا معالم). وأصبحت الدالة تُعيد الآن نتيجة فارغة بالأعمدة الصحيحة. #111428 (groeneai). - يمكنك الآن قراءة ملفات GeoParquet وArrow وArrowStream التي يستخدم فيها column الهندسي المُرمَّز بصيغة WKT كلمةً مفتاحية للنوع بأحرف غير كبيرة (
point(1 2)) أو حاويةً فارغة (LINESTRING EMPTYوPOLYGON()وPOLYGON(())). فقد كان استيراد هذه الملفات يفشل سابقًا معBAD_ARGUMENTSأوCANNOT_PARSE_NUMBER، رغم أن السلاسل النصية نفسها تُحلَّل بنجاح باستخدام الدالةreadWKT. ويُصلح هذا أيضًا قراءة ملف يخزّن مُخرَجwktلشكل هندسي فارغ، والذي يُكتب على هيئةLINESTRING(). #112020 (groeneai). - تم إصلاح رفع استثناء
Unknown compression methodلاستدلالَي الضغطautoوnoneعند كتابتهما بأي حالة أحرف غير الأحرف الصغيرة بالكامل، على سبيل المثالfile('data.csv.gz', 'CSV', 'x String', 'AUTO'). فقد كانت أسماء المُرمِّزات مثلGZIPمقبولة من قبلُ دون حساسية لحالة الأحرف، والآن أصبح هذان الاستدلالان الخاصان يتصرفان بالطريقة نفسها. #113631 (groeneai). - تم إصلاح قراءة column من نوع
Tupleيكون عنصره الأولNULLفي صيغCustomSeparatedوRegexpوTemplateمع قاعدة الإفلاتCSV. ففي هذه الصيغ يشغلTupleالمجرد حقلًا واحدًا لكل عنصر، وبالتالي فإن الحقل\Nالأول يمثل ذلك العنصر وليس column بأكمله. أما في السابق فكان يُعامَل على أنه column بأكمله، مما يُزيح حقول العناصر المتبقية إلى الأعمدة التالية، فلم تكنCustomSeparatedقادرة على قراءة مُخرَجها هي نفسها. #114471 (groeneai). - إصلاح مشكلة كان فيها تنسيق الإدخال
Regexpيتجاهل بصمت الجزء المتبقي غير المحلَّل من الحقل المطابق، فيُخزِّن قيمة مقتطعة أو مختلَقة بدلًا من الإبلاغ عن error: فعند إدخالv=-1فيUInt64كانت القيمة المقروءة0، وعند إدخالv=2020-01-01junkفيDateكانت القيمة المقروءة1975-07-14وفق القاعدةJSON. أصبحت الحقول غير السليمة تُرفض الآن وفق القواعدEscapedوCSVوJSON، بما يتوافق مع سلوك الصيغ التي يذكر التوثيق أن هذه القواعد تحاكيها. أما وفق القاعدةRaw، فأصبح الحقل المطابق الذي يحتوي على محرف جدولة يُقرأ كاملًا بدلًا من اقتطاعه عند ذلك المحرف. #114520 (groeneai). - إصلاح خطأ منطقي
Inconsistent AST formatting(يؤدي إلى إنهاء الخادم قسريًا في إصدارات التصحيح وإصدارات أدوات sanitizer) في تعبيراتCREATE INDEX/CREATE HYPOTHETICAL INDEXالتي لم تكن تصمد أمام دورة تنسيق ثم تحليل ثم تنسيق، مثلCREATE HYPOTHETICAL INDEX i0 ON t0 ((a())) TYPE aوCREATE INDEX i0 ON t0 ((a, b).1) TYPE minmax. #109175 (groeneai). - إصلاح خطأ منطقي (
Logical error: 'KeyCondition uses PREWHERE output') في قارئ Parquet v3 كان يحدث عندما يشير شرط مفتاح على مستوى الصيغة إلى عمود لا يُقرأ من ملف Parquet. #109267 (groeneai). - إصلاح استثناء في HTTP handler المُعرَّف مسبقًا عند غياب الترويسة #108324 (vitlibar).
- إصلاح احتمال حدوث
Logical error: 'ReadBuffer is canceled. Can't read from it.'عندما يفشل تنسيق إدخال قائم على الصفوف (مثلTSV/CSV) في تحليل الإدخال وتكون عملية القراءة الأساسية قد أُلغيت مسبقًا (كوجود جزء HTTP غير سليم أو جسم طلب مقتطع). لم يعد إنشاء تشخيصات التحليل المفصّلة يقرأ من buffer مُلغى. #109708 (groeneai). - لم يعد تنسيق
Valuesيسجّل أخطاء التحليل فيsystem.errorsوsystem.error_logعندما ينجح التحليل المتدفق في الرجوع إلى تحليل تعبيرات SQL. #111141 (pamarcos). - إصلاح فشل
SYSTEM REFRESHأحيانًا في استهلاك الرسائل المتراكمة في الطابور على جدولRabbitMQمتوقف. يمنح REFRESH دورة دفق واحدة بالضبط خارج الترتيب، لكن هذه الدورة قد تنتهي فورًا دون أي صفوف لأن حلقة تسليم AMQP لم تكن قد بدأت إلا للتو بشكل غير متزامن، مما يُهدر الإذن الوحيد ويترك الرسائل دون استهلاك حتى أمرSYSTEM STARTالتالي. #111480 (groeneai). - إصلاح مشكلة كان فيها جدول
NATSالمضبوط عليهnats_streamيتوقف بصمت عن استهلاك أي رسائل بعد إعادة تشغيل خادم NATS. أصبح اشتراكJetStreamيُعاد إنشاؤه تلقائيًا دون الحاجة إلى تنفيذDETACH TABLEثمATTACH TABLE. #112828 (groeneai). - رفض القيم الكبيرة على نحو غير معقول لـ
kafka_num_consumersمع error واضح بدلًا من فشل عملية تخصيص ذاكرة داخل محرك الجدولKafka. في السابق، عند تفعيلkafka_disable_num_consumers_limit، كانت مثل هذه القيمة تُنتج استثناءstd::length_error. #114764 (alexey-milovidov). - خادم Arrow Flight: قبول بيانات اعتماد مصادقة
Basicالمرمّزة بـ Base64 دون حشو، كما يرسلها عملاء Flight المبنيون بلغة Go مثل برنامج تشغيل ADBC Flight SQL، وإرجاع error مصادقة مناسب بدلًا من الخطأ العامUnexpected error in RPC handlingعندما تكون ترويسةauthorizationغير سليمة. #115085 (alexey-milovidov). - خادم Arrow Flight: رفض بيانات اعتماد مصادقة Basic غير الصالحة التي تفتقر إلى الفاصل بين اسم المستخدم وكلمة المرور. #115347 (alexey-milovidov).
إصلاحات أنواع البيانات والدوال والتسلسل
- إصلاح خطأ منطقي
Stream <col>.variant_discr ... is not found(يؤدي إلى إنهاء الخادم في إصدارات التصحيح والإصدارات المزوّدة بأدوات الفحص) عندما يغيّرALTER TABLE ... MODIFY COLUMNنوع column إلى نوع يحتوي على أعمدة فرعية ديناميكية (مثلًا منVariantإلىDynamic) في جدول يحتوي على أجزاء بيانات Wide، ثم يُقرأ جزء البيانات أو يُدمج لاحقًا. #110204 (groeneai). - إصلاح قراءة عمود فرعي من column من النوع
Nullable(Tuple(...))يكون عنصره من النوعLowCardinality(T)غير القابل للقيم الفارغة، عندما يقرأ الاستعلام نفسه العمود الفرعي الأب أيضًا. ففي جزء بيانات Compact كان العمود الأب يُرجع قيمًا خاطئة، أو يفشل الاستعلام بالخطأUnexpected return type from assumeNotNull، أو يُنهى الخادم بسبب تأكيد تحصين فيstring_view، وذلك لأن العمود الفرعي المستخرج كان يُفكّ تسلسله في مخزن مؤقت من النوعLowCardinality(Nullable(T))تُشارَك تدفقاته الفرعية بعد ذلك مع عملية قراءة العمود الأب. #112232 (groeneai). - إصلاح الخطأ
LOGICAL_ERROR“Not-ready Set is passed as the second argument for functionglobalNullIn” وفقدان رسالة الخطأ الفعلية للاستعلام، وهو ما قد يحدث عندما يُنفِّذ استبعاد أجزاء البيانات المعتمد على الإحصاءات استعلامًا فرعيًا من نوعIN/GLOBAL INتنفيذًا استباقيًا أثناء تحليل الفهرس ثم يفشل ذلك الاستعلام الفرعي. #114121 (groeneai). - إصلاح الخطأ
Cannot read all data of type FixedStringعند قراءة العمود الفرعيproduct_quantization_codebookمن column يستخدم المرمِّزQuantized('product', ...). إذ يُكتب دفتر الرموز الخاص بكل جزء بيانات بعد بيانات جميع الحبيبات، فلا تحدّه العلامات، ولذلك قد تقرؤه منقوصًا أيُّ عملية قراءة ينتهي نطاق علاماتها قبل العلامة الأخيرة لجزء البيانات. #112818 (alexey-milovidov). - إيقاف كتابة جزء بيانات يتعارض تخطيط
Mapفيه مع بياناته الوصفية، وذلك لقيمةMapداخل column من النوعDynamic. فقد كانت الجداول التي لا تختلف إلا فيmap_serialization_versionتتشارك كائن تسلسل واحدًا مخزنًا مؤقتًا، فقد يحصل جزء البيانات على تخطيط Map من النوعbasicبينما تُصرّح بياناته الوصفية بـwith_buckets، فتفشل قراءته لاحقًا بالخطأLOGICAL_ERROR: Stream ...buckets_info ... is not found. أما أجزاء البيانات التي كتبها إصدار سابق بهذه الطريقة فتبقى غير قابلة للقراءة ويجب حذفها. #113514 (groeneai). - إصلاح إغفال المرمِّزات
ALPوFPCوGCDللمعامل المشتق من النوع عند حساب تجزئة المرمِّز. ففي جزء بيانات Compact يتشارك الكاتب تدفقًا مضغوطًا واحدًا لكل قيمة تجزئة مرمِّز مميزة، لذا كان عمودان بعرضَي قيم مختلفين تحت المرمِّز نفسه يتصادمان ويتشاركان كائن مرمِّز واحدًا يحمل عرضًا خاطئًا. وأدى ذلك إلى رفض عمليات إدراج صالحة بالخطأCANNOT_COMPRESSعند اختلاف العرضين، وفي غير ذلك كان أحد العمودين يُضغط بكفاءة أقل مما ينبغي. #114189 (groeneai). - إصلاح الاستبعاد غير الصحيح بالاعتماد على الفهرس عندما يُغلِّف مفتاح الفرز لجدول column من النوع
DateبالدالةtoDateTime(مثلًاORDER BY toDateTime(date_column)) ويُصفّي الاستعلام حسب العمود الأصلي بمقارنة مثلWHERE date_column >= '...'. إذ تتجاوزtoDateTime(Date)الحدود لقيمDateالواقعة خارج نطاقDateTime(بعد2106-02-07)، فيصبح المفتاح المخزَّن غير رتيب؛ ولذلك لن يستخدم ClickHouse بعد الآن الاستبعاد بالمفتاح الأساسي لهذا المزيج من المفتاح والشرط، لأن ذلك قد يؤدي إلى استبعاد حبيبات تحتوي على صفوف مطابقة. #101814 (nihalzp). - إصلاح فشل
ALTER MODIFY COLUMNعند تحويل column من النوعNullableإلى نوع مختلف معDEFAULT(مثلNullable(UInt8)→String،LowCardinality(String)، أوArray(UInt8)). #102156 (il9ue). - إصلاح الإفلات غير الصحيح للقيم الحرفية في SQL ضمن
StorageSQLiteودالة الجدولsqlite()عند تمرير مسنداتWHEREإلى SQLite: إذ كانت علامات الاقتباس المفردة ومحارف التحكم (\n،\r،\t،\) تُفلَت باستخدام الشرطة المائلة العكسية، وهو ما لا يفسّره SQLite، مما كان يتسبب في أخطاء نحوية أو في نتائج استعلام خاطئة. كما أُصلح إفلات القيم الحرفية النصية المُمرَّرة إلى PostgreSQL: فقد كانت السلاسل النصية المتداخلة ضمن قوائمINتحتفظ بأسلوب الإفلات الخاص بـ ClickHouse، وكانت محارف التحكم تُرسَل على هيئة تسلسلات بشرطة مائلة عكسية يقرؤها PostgreSQL على أنها بايتات مختلفة. #104217 (tiandiwonder). - إصلاح الاستثناء
NOT_FOUND_COLUMN_IN_BLOCKفي استعلاماتINNER JOIN ... ON arrayJoin(...) = ...عند تفعيلquery_plan_convert_join_to_inوإشارة SELECT إلى عمود مصفوفة المصدر. #104809 (tiandiwonder). - إصلاح تعبيرات IN وNOT IN التي يتضمن طرفها الأيمن معاملات غير ثابتة تشير إلى أعمدة من الصف الحالي، ومواءمة طريقة معالجة المحلّل الجديد لـ Tuple في الطرف الأيمن مع دلالات IN المعمول بها حاليًا في ClickHouse. أما في المحلّل القديم، فلا يزال عمود المصدر المجرد في الطرف الأيمن (
x IN (arr)) يُفسَّر على أنه اسم جدول ويبقى خارج النطاق. #104993 (niyue). - إصلاح عمليات
JOINمع جداولEmbeddedRocksDBوRedisوKeeperMapالتي قد لا تُرجع أي صفوف دون أي تنبيه عند استخدامDirectKeyValueJoinمع مفاتيح من النوعStringأوNullable(String). #105253 (vdimir). - إصلاح الخطأ
LOGICAL_ERROR(“Unexpected expression in JOIN ON section. Expected boolean (UInt8), got ‘Nothing’”) الذي يحدث عندما يشير مسندJOIN ... ONغير قائم على المساواة إلى عمود من النوعNothing، كالعمود الناتج عنARRAY JOIN []. #106981 (groeneai). - إصلاح الخطأ المنطقي
Inconsistent AST formattingالذي قد يؤدي إلى إنهاء الخادم بشكل مفاجئ في إصدارات التصحيح وإصدارات أدوات التعقيم (sanitizer) عند استخدام تعبير lambda ذي اسم مستعار معاملًا لعامل وصول (عنصر Tuple.Nأو عنصر مصفوفة[]) في غير الموضع الأول من قائمة تعبيرات، مثلSELECT 1, ((p0, p1) -> p0 AS a7).4[3] FROM t. #107092 (groeneai). - أصبحت دوال جدول العنقود (
urlCluster،fileCluster،s3Cluster، …) المتداخلة ضمن استعلام موزَّع آخر، مثلclusterAllReplicas(..., urlCluster(...))، تُرفض الآن مع الخطأBAD_ARGUMENTSبدلًا من فشلها بخطأ منطقي (Distributed task iterator is not initialized). #107107 (groeneai). - إصلاح فشل دالة الجدول
valuesمع الخطأARGUMENT_OUT_OF_BOUNDعند استخدام قيمة حرفية عشرية يتعذّر تمثيلها بدقة في عمود فاصلة عائمة ضيق (مثل0.1لعمود من النوعFloat32)، كما فيSELECT * FROM values('x Float32', 0.1). أصبحت هذه القيم مقبولة الآن وتُحوَّل إلى أقرب قيمة قابلة للتمثيل، اتساقًا مع سلوكCASTوINSERT ... VALUES. #108055 (alexey-milovidov). - إصلاح مشكلة إسقاط الدوال
mapFilterوmapSort(ومتغيراتها) وmapConcatللمُعدِّلLowCardinalityمن نوعي المفتاح والقيمة فيMap. فقد كانتmapFilterسابقًا، عند تطبيقها على عمود من النوعMap(LowCardinality(String), String)، تُرجعMap(String, String)، مما قد يُفسد البيانات الوصفية لجدول أُنشئ عبرCREATE TABLE ... AS SELECTويتسبب في فشلCHECK TABLE. #108057 (alexey-milovidov). - تم إصلاح مشكلة استمرار عملية
INSERTالملغاة أو التي نُفِّذ عليهاKILLفي العمل لفترة طويلة أثناء بناء فهرس تخطٍّ (على سبيل المثال فهرسset(0)غير محدود على عمود عالي الكاردينالية). أصبح بناء الفهرس يتوقف الآن فورًا عند إلغاء الاستعلام. #108351 (tiandiwonder). - تم إصلاح عدم استجابة استعلام
SELECTمن دالة الجدولprimesللإلغاء: فعند استخدام قيمة كبيرة لـstep(أوlimit)، كان الاستعلام قد يستمر في العمل لفترة طويلة بعد تنفيذKILL QUERYأو انتهاء المهلة. أصبح يتوقف الآن فورًا. #108353 (tiandiwonder). - تم إصلاح تحليل أسماء أنواع البيانات التي تحتوي على السلسلة الفرعية
INT(على سبيل المثال اسم شبيه بأسماء الدوال مثلquantileInterpolatedWeightedمستخدم في موضع نوع بيانات). كانت هذه الأسماء تُعامَل خطأً على أنها أنواع أعداد صحيحة في MySQL، فتُستهلك أول مجموعة وسيطات(...)فيها بصمت باعتبارها مُعدِّلًا لعرض الإظهار، مما قد يُخِلّ بتطابق الاستعلام عند تنسيقه ثم إعادة تحليله. #108354 (groeneai). - تم إصلاح عدم اتساق كانت فيه عبارة
ARRAY JOINغير صحيحة الصياغة، متبوعة بفاصلة وقائمة جداول بين أقواس، تُحلَّل خطأً على أنها ربط تقاطعي بدلًا من رفضها. #108365 (Algunenano). - إصلاح استثناء
LOGICAL_ERROR(“Invalid action query tree node …”) الذي يحدث عندما يزيل استعلام موزع تكرار أعمدةALIASالمكررة والمتطابقة بنيويًا، ويشير في الوقت نفسه إلى دالة جدول ذات وسيطة مجموعة مسماة بصيغةkey = value(على سبيل المثالoss(s3_conn, filename = '...')). #108435 (groeneai). - تم إصلاح خطأ منطقي (يظهر كاستثناء في إصدارات release، ويؤدي إلى إجهاض الخادم في إصدارات debug وsanitizer) قد يحدث عند استدعاء دالة بأكثر من وسيطة
LowCardinalityعلى جدول موزع، على سبيل المثالconcatAssumeInjective((SELECT toLowCardinality('p')), s)عند استخدامها كمفتاحGROUP BYمعremote(). وكانت رسائل الخطأDefault functions implementation for LowCardinality is supported only with a single LowCardinality argumentأوExpected the argument ... to have N rows, but it has M. #108871 (groeneai). - تم إصلاح تجاهل
use_client_time_zoneللقيم الحرفية النصية من نوعDateTime/DateTime64التي تُفسَّر على الخادم (عملياتINSERTغير المتزامنة، والقيم الحرفية فيSELECT). أصبح العميل الآن يمرّر منطقته الزمنية المحلية بوصفهاsession_timezoneعند تفعيلuse_client_time_zone، بحيث يتطابق التحليل على جانب الخادم مع مسارINSERTالمتزامن. #109051 (groeneai). - إصلاح إخفاق
max_execution_time(معtimeout_overflow_mode = 'throw') أحيانًا في إلغاء الاستعلام إطلاقًا: فعندما كان مراقب انتهاء المهلة الداخلي ينتظر بالفعل استعلامًا ذا موعد نهائي لاحق، قد يُغفَل تمامًا استعلامٌ سُجِّل بعده بموعد نهائي أبكر، فيستمر في العمل طويلًا بعد تجاوز حده الزمني. #109792 (tiandiwonder). - تم إصلاح الخطأ
NOT_FOUND_COLUMN_IN_BLOCKالذي يحدث عندما يستخدم استعلام على جدولDistributedالعمود_shard_num(أوshardNum()) الذي يصبحNullable(على سبيل المثال معFULL JOINوjoin_use_nulls = 1) إلى جانبORDER BY، مع تفعيل المحلّل. #109798 (groeneai). - تم إصلاح الخطأ
NOT_IMPLEMENTED(“Method getDataAt is not supported for Nullable(String)”) الذي قد يحدث عند تنفيذ عملية ربط معenable_join_runtime_filters = 1(المفعّل افتراضيًا منذ الإصدار 26.2) إذا كان مفتاح الربط في جانب البناء من النوعLowCardinality(Nullable(...))ويحتوي على قيم NULL، ولجأ عامل تصفية وقت التشغيل إلى bloom filter الخاص به كبديل. #109824 (groeneai). - تم إصلاح انهيار الخادم عند تمرير تعبير لامبدا في موضع تتوقع فيه دالة عالية الرتبة قيمةً فعلية (مثل المُراكِم في
arrayFold، كما فيarrayFold(lambda, arr, another_lambda)). أصبحت هذه الاستعلامات تُرفض الآن مع الخطأILLEGAL_TYPE_OF_ARGUMENTبدلًا من التسبب في انهيار الخادم عندما يكونenable_analyzer = 0. #109840 (groeneai). - أصبح الاسم المستعار
unnestللدالةarrayJoinمرفوضًا في عوامل تصفية row policy، مما يسد ثغرة كانت تسمح لمثل هذه السياسة بإطلاق خطأ منطقيcolumn->size() == num_rowsأثناء القراءة. #109973 (Algunenano). - تم إصلاح مشكلة عدم استخدام فهارس التخطي المعرّفة على أعمدة فرعية من النوع
Tupleعند الوصول إلى الحقل عبرtupleElement(t, 'name')أوtupleElement(t, N)أوt.Nفي حين تُقرأ قيمة Tuple كاملةً في الاستعلام نفسه (مثلSELECT *). أصبحت جميع هذه الصيغ الآن تستبعد الحبيبات بالطريقة نفسها المتبعة عند الوصول إلى العمود الفرعي المسمّىt.name. #110056 (groeneai). - تم إصلاح الخطأ
BAD_GETعند مقارنة عمود من النوعArray(String)بمصفوفة حرفية (arr = ['x']) إذا كان للعمود فهرس تخطٍّ من النوعtextأوtokenbf_v1أوngrambf_v1. أصبح الفهرس يتعامل الآن مع هذه المقارنة على أنها مسح كامل بدلًا من التسبب في فشل الاستعلام بأكمله. #110057 (groeneai). - تم إصلاح خطأ
ILLEGAL_COLUMNزائف يصدر عنALTER TABLE ... ADD COLUMN IF NOT EXISTSإذا كان العمود موجودًا بالفعل وقت التطبيق. كان ذلك يحدث عند إضافة العمود نفسه مرتين باستخدامIF NOT EXISTSفي عبارة واحدة، أو عندما تضيف عمليةALTERمتزامنة العمود بين مرحلتي التحضير والتطبيق. #110080 (groeneai). - تم إصلاح الخطأ
LOGICAL_ERROR(Bad cast from type ColumnLowCardinality to ColumnString) الذي يحدث عندما تغلّف الدالةidentity()(أو نتيجة استعلام فرعي قيَمي) قيمةً تحتوي علىLowCardinalityمتداخل ويستخدم الاستعلامWITH TOTALS/WITH ROLLUP. #110138 (groeneai). - تم إصلاح الخطأ
NOT_FOUND_COLUMN_IN_BLOCKعند استخدامGROUP BY ALLعلى تعبير Tuple معORDER BY. #110206 (alexey-milovidov). - تم إصلاح الخطأ
NOT_FOUND_COLUMN_IN_BLOCKعند تنفيذINSERTفي جدول يحتوي على قيدCHECKيشير إلى عمود فرعي (مثلx.nullلعمود من النوعNullableأوarr.size0لعمود من النوعArray). #110208 (alexey-milovidov). - تم إصلاح نتائج الاستعلام الخاطئة الناتجة عن تحسين optimize_and_compare_chain (المفعّل افتراضيًا): إذ كان الشرط المُشتق بالتعدّي من a < b AND b < c قد يستخدم دلالات مقارنة تختلف عن الشروط الأصلية عندما تجمع السلسلة بين أنواع ذات قواعد تحويل خاصة بكل زوج (مثل Enum مقابل String، أو Decimal مقابل Float64، أو FixedString بأطوال مختلفة). أصبحت الشروط التعدّية الآن تُشتق فقط ضمن مجموعات الأنواع التي تشترك في ترتيب مقارنة واحد. #110621 (yariks5s).
- تم إصلاح تسبّب الإعداد
optimize_injective_functions_in_group_byفي تغيير نتائج الاستعلام عند استخدامGROUP BY GROUPING SETSوGROUP BY ... WITH TOTALS. فهذا الإعداد موثّق على أنه لا يغيّر النتائج، إلا أن إزالة دالة حقنية مطبّقة على مفتاح تجميع كانت تُنتج قيمة خاطئة (أو تُسقط صفًا) في الصفوف التي يغيب فيها ذلك المفتاح عن المجموعة المُجمَّعة (أي مجموعة لا ينتمي إليها المفتاح ضمنGROUPING SETS) أو في صفWITH TOTALS. وقد تتطابق القيمة الخاطئة مع قيمة مفتاح حقيقية، فيتعذّر التمييز بين صف التجميع الأعلى ومجموعة فعلية ضمن مجموعة النتائج نفسها. #110721 (groeneai). - إصلاح توقّف الخادم عن الاستجابة عند ضرب حالة دالة تجميعية من نوع
median/quantile(المعتمدة على ReservoirSampler) في ثابت صحيح ضخم (مثلmedianState(x) * 18446744073709551615)، إذ كان الاستعلام لا يستجيب لطلبات الإلغاء وقد يستمر في التنفيذ إلى ما لا نهاية. #110779 (groeneai). - إصلاح انهيار (إلغاء مرجعية مؤشر فارغ أثناء تحليل الاستعلام) عند استدعاء
getSubcolumnعلى وسيطة من نوعJSONباسم عمود فرعي داخلي يمثّل تلميحًا للنوع، أي اسم يبدأ بعلامة نوع على شكل علامة اقتباس مائلة. #110940 (groeneai). - تم إصلاح إرجاع
map[key]قيمةَ مفتاح مكرر لاحق بدلًا من المفتاح الأول. فعندما يحتوي عمود من نوعMapعلى مفاتيح مكررة، كانت نتيجةmap[key]قد تتوقف على الصفوف السابقة في الكتلة نفسها وعلى الإعدادoptimize_functions_to_subcolumns، مما قد يؤدي إلى تعارض نتيجتيSELECTوWHEREعلى الصف نفسه. #111246 (groeneai). - إصلاح الخطأ المنطقي
!rhs_literal->getValue().isNull()في مُحسِّن التعبيرات المنطقية عندما تقارن سلسلةANDعمودًا بثابت قيمته NULL من نوع غيرNullable(مثلVariantقيمته NULL) مع ضبطuse_variant_default_implementation_for_comparisons = 0. #111292 (groeneai). - تم إصلاح النتائج الخاطئة عندما يحتوي الاستعلام على فهرس تخطٍّ من نوع
setوشرط على الشكل(x AND <null-value>) OR y، حيث تُنتَج قيمة NULL بواسطة دالة (مثلtoInt64OrNull('x')وnullIf(1, 1)وCAST(NULL AS Nullable(Int64))). إذ كانت هذه القيمة تُغلَّف بواسطة__bitWrapperFuncفتنشرNULLبدلًا من قناع “غير معروف”، مما قد يجعل فهرس المجموعة يستبعد حبيبات مطابقة فعليًا، فيُرجع الاستعلام صفوفًا أقل مما ينبغي. #111604 (groeneai). - إصلاح قبول
CREATE TABLE/ALTER TABLEعند تفعيل المحلّل لتعبيرDEFAULT/MATERIALIZEDفي عمود يشير إلى عمود افتراضي مثل_tableأو_database. فقد كان الإدراج في مثل هذا الجدول يفشل بالخطأNOT_FOUND_COLUMN_IN_BLOCK، كما كان عمودMATERIALIZED(الذي لا يمكن تمرير قيمته صراحةً) يجعل الإدراج في الجدول مستحيلًا بشكل دائم. وأصبحت هذه التعبيرات تُرفض الآن عند التعريف، بما يتوافق مع السلوك عند عدم استخدام المحلّل. أما أعمدةALIAS(المحسوبة وقت القراءة) وأعمدةEPHEMERAL(مدخلات الإدراج غير المخزّنة) المعتمدة على الأعمدة الافتراضية فتظل تعمل كما هي. #111776 (groeneai). - تم إصلاح الخطأ
UNKNOWN_QUERY_PARAMETERعند استدعاء عرض ذي معلمات بوسيطة قيمتها استعلام فرعي من نوعArrayأوTupleأوLowCardinality، مثلSELECT * FROM v(param = (SELECT groupArray(x) FROM t)). #111790 (groeneai). - إصلاح ثلاثة أخطاء في عمليات إعادة الكتابة التي يجريها المحلّل لتحويل سلسلة من المقارنات إلى
IN/NOT IN(x = c1 OR x = c2 OR ...، وx != c1 AND x != c2 AND ...، وhas(const_array, x)). فبالنسبة إلى تعبير من النوعVariantمعuse_variant_default_implementation_for_comparisons = 0، كانت إعادة الكتابة تغيّر نوع نتيجة التعبير منUInt8إلىNullable(UInt8)، مما كان يُطلق الخطأLOGICAL_ERRORمن فحص التحقق من شجرة الاستعلام في إصدارات التصحيح (debug) وإصدارات المُعقِّمات (sanitizer). أما بالنسبة إلى تعبير ذي بنية ديناميكية (Dynamic، وArray(Dynamic)، وJSON)، فكانت إعادة الكتابة تتسبب في فشل استعلام كان يعمل بشكل سليم مع الخطأIllegal type ... of argument of function in، لأنINيرفض مثل هذه الوسيطات. كما كانت عمليات إعادة الكتابة في كلا الاتجاهين تُرجع نتائج خاطئة عندما يتعذّر تحويل الثابت إلى نوع التعبير دون فقدان، كأن يُقارَن ثابت من النوعDateTimeيتضمن توقيتًا من اليوم بعمود من النوعDate. #111924 (groeneai). - إصلاح مشكلة إرجاع
quantileDeterministicوquantilesDeterministicوmedianDeterministicنتائج مختلفة للبيانات نفسها في كل تشغيل عندما يستخدم الاستعلام النسخ المتماثلة المتوازية، أو جدولًا موزعًا، أو التجميع الخارجي، أو عندما تُخزَّن الحالات في جدول (بما في ذلك داخل قيمة من النوعDynamic). أما الحالات المكتوبة قبل هذا الإصدار بصيغة النوع غير المقترنة برقم إصدار، فتحتفظ بسلوكها السابق، إذ لا يمكن تغيير تخطيطها. #112052 (alexey-milovidov). - إصلاح النتائج الخاطئة الناجمة عن إفساد استعلامات البحث المتجهي لذاكرة التخزين المؤقت لشروط الاستعلام. فقد كان الاستعلام
SELECT ... WHERE <condition> ORDER BY <distance function> LIMIT nعلى جدول يحتوي على فهرسvector_similarityقد يسجّل حبيبات على أنها لا تطابق<condition>، فيُرجع أي استعلام عادي لاحق من نوعSELECT ... WHERE <condition>على الجدول نفسه عددًا أقل من الصفوف دون أي تنبيه. ولم تعد عمليات القراءة الخاصة بالبحث المتجهي تكتب في ذاكرة التخزين المؤقت لشروط الاستعلام. #112086 (groeneai). - إصلاح سقوط الإعداد
serialize_string_in_memory_with_zero_byteمن خطة تنفيذ الاستعلام المُسلسَلة. فمعserialize_query_plan = 1، كان من الممكن في عنقود يعمل مع تعطيل هذا الإعداد أن يختلف التمثيل النصي داخل الذاكرة بين العقدة البادئة والعقدة التي تنفّذ الخطة بعد إلغاء تسلسلها، لأن الإعداد كان يُقرأ عند إلغاء التسلسل دون أن يُكتب قط عند التسلسل، فكان يأخذ دائمًا قيمته الافتراضية على العقدة المنفِّذة. #112131 (groeneai). - إصلاح نتيجة خاطئة لعملية
JOINيحتوي تعبيرONالخاص بها على حدّ عطف ثابت، مثلON l.id = r.id AND CAST(NULL AS Nullable(UInt8)). فقد كان تحسين خطة تنفيذ الاستعلام يحذف هذا الثابت دون أي تنبيه، فتُنفَّذ عملية الربط كأنه غير موجود: إذ كانت عمليات الربطINNERوLEFT SEMIوRIGHT SEMIتُرجع الصفوف المتطابقة مع أن الشرط الذي لا يتحقق أبدًا يجب ألا يُرجع أي صف، وكانتRIGHT ANTIلا تُرجع أي صف بدلًا من إرجاع جميع الصفوف. #112155 (vdimir). - إصلاح النتائج الخاطئة عند استدعاء عرض ذي معلمات بوسيطة لا تمثّل إسنادًا بالصيغة
parameter = value. فمعenable_analyzer = 0، وفيEXPLAIN SYNTAXمع الإعدادات الافتراضية، كانت استدعاءات مثلpv(concat(name, '!'))وpv(name, 'a')وpv(name != 'a')وpv(tuple(name = 'a'))تربط معلمة العرض بتعبير لا صلة له بها دون أي تنبيه، بدلًا من الإبلاغ عن الخطأUNKNOWN_QUERY_PARAMETERكما يفعل المحلّل. وأصبحت هذه الاستدعاءات تُرفض الآن بالطريقة نفسها في مساري التنفيذ كليهما. #112194 (groeneai). - إصلاح خلل كان يُقبَل فيه
CREATE VIEWأوCREATE FUNCTIONالذي يستدعي تعريفهsubstrأوmidأوbyteSliceبصيغة لا تستطيع قواعدsubstringإعادة تحليلها، في حين أن البيانات الوصفية التي يكتبها ClickHouse له لم تكن تعليمات SQL صالحة. فكانت قراءة ذلك التعريف لاحقًا تفشل معSYNTAX_ERROR، وعند بدء تشغيل الخادم كانت توقف تحميل البيانات الوصفية، فيتعذّر تشغيل الخادم كليًا. أصبحت هذه التعريفات الآن تُكتب وتُقرأ مجددًا دون أن تفقد معناها أو بنيتها، كما أصبحت ملفات البيانات الوصفية الموجودة بالصيغةsubstring(x, a, b, c)قابلة للقراءة مجددًا، فيبدأ الخادم المتأثر بالعمل دون أي تدخل يدوي. #112195 (groeneai). - إصلاح النتائج الخاطئة، والترتيب الخاطئ لمخرجات
ORDER BY، والاستثناءBAD_TYPE_OF_FIELDعندما يكون المفتاح الأساسي من النوعArrayأوTupleويطبّق الاستعلام عليهplusأوminusأوmultiplyأوdivideأوintDiv. فالعمليات الحسابية على القيمة المركّبة تُقيَّم عنصرًا بعنصر، بينما تكون مقارنة القيم المركّبة معجمية، ولذلك لم يعد تحليل المفتاح الأساسي يعامل مثل هذا التعبير على أنه رتيب. #112339 (groeneai). - إصلاح الخطأ
Code: 62 ... You must not specify ANY or ALL for PASTE JOIN. (SYNTAX_ERROR)الذي كان يُطلقه خادم بعيد عند تلقّيه استعلامًا يحتوي علىPASTE JOINمُرسَلًا من خادم آخر، كما هو الحال مثلًا عندما يكون الجدول الأيسر جدولDistributedأو دالة جدول*Cluster. كان المُنسِّق يطبعALL PASTE JOIN، وهي كتابة يرفضها المحلل، فلم يتمكن الخادم المستقبِل من تحليل الاستعلام المرسَل إليه. #112404 (groeneai). - إصلاح عدم ظهور قائمة الأسماء المستعارة للأعمدة، مثل
(SELECT 1) AS t(x)أوWITH t(x) AS (SELECT 1)، داخل دالة الجدولview، إذ كانت الإشارة إلىt.xتفشل معUNKNOWN_IDENTIFIERرغم أن البنية نفسها تعمل خارجview. #112690 (groeneai). - إصلاح خطأ منطقي في تنسيق الاستعلام عندما لا تحتوي عبارة
ARRAY JOINعلى أي تعبيرات. أصبحت هذه العبارة تُرفَض الآن أثناء التحليل معSYNTAX_ERROR، على غرارUSINGالفارغة، بدلًا من قبولها وتحويلها إلى نص يتعذّر تحليله مجددًا. #112699 (groeneai). - إصلاح إطلاق
connectionIdللخطأContext has expiredعندما تُنفَّذ إجراءات التعبير المُعدّة لاستعلام فرعي بعد تحرير السياق الذي بُنيت فيه. #112870 (clickgapai). - إصلاح خطأ منطقي ونتائج خاطئة عندما يحتوي شرط
JOIN ONغير قائم على التساوي، ويُقيَّم أثناء الربط، علىarrayJoin. أصبح الربط من نوعhashأوparallel_hashأوgrace_hashيرفض هذا الشرط الآن معINVALID_JOIN_ON_EXPRESSION. وإذا كان التوسيع يعتمد على جانب واحد فقط، فانقله إلىARRAY JOINداخل استعلام فرعي قبل الربط؛ أما الشرط الذي يقرأ فيه وسيطarrayJoinأعمدةً من الجانبين فيجب إعادة هيكلته. #112889 (groeneai). - إصلاح استهلاك
geohashesInBoxوقتًا غير محدود عند معالجة مربع مساحته صفر، مثلgeohashesInBox(0., 0., 180., 0., 12). كان هذا الاستعلام يُعيد قيمة geohash الوحيدة الصحيحة، لكنه كان يهدر نحو 5e8 تكرارًا فارغًا للحلقة لكل صف، ويتجاهل كلًّا منmax_execution_timeوKILL QUERY. #112976 (groeneai). - رفض تغيير
SETTINGSالمُعلَّم على أنه مكتوب دون قيمة إذا كان يحمل قيمة غيرtrue، وعدم حذف قيمة هذا النوع من التغييرات مطلقًا عند تنسيق استعلام. في السابق، كان بإمكان حمولة AST JSON مُعدّة خصيصًا أن تنفّذ إعدادBoolبالقيمةfalse، في حين يعرض كلٌّ منsystem.query_logوformatQueryFromJSONالصيغة الخالية من القيمة. #113025 (alexey-milovidov). - إصلاح الخطأ
UNKNOWN_IDENTIFIERعند الاستعلام منVIEWتختلف أنواع أعمدته المُعلنة عن الأنواع التي ينتجها استعلامه الداخلي، ومثال ذلكSELECT sum(length(arr)) FROM vحيث يُعلنvعنarr Array(UInt8)فوق عمود من النوعString. فمع القيمة الافتراضيةoptimize_functions_to_subcolumns = 1، كان المُحسِّن يعيد كتابةlength(arr)لتصبح قراءةً للعمود الفرعيarr.size0، ثم يمرّر هذا الاسم إلى الاستعلام الداخلي الذي لا يحتوي على عمود فرعي كهذا. #113057 (groeneai). - إصلاح إلغاء عمليات القراءة عبر دالة الجدول
postgresqlومحرك PostgreSQL. فقد كان الإلغاء في أثناء بدء القراءة يتسبب أحيانًا في حالة تسابق على مؤشر المعاملة، وقد يضيع الإلغاء كليًا، فيظل الاستعلام قيد التشغيل حتى ينهيه PostgreSQL. ولا يزال من الممكن تجاهل طلب الإلغاء الذي يصل إلى PostgreSQL قبل أن يبدأ تنفيذ العبارةCOPY. #113150 (groeneai). - إصلاح الخطأ
LOGICAL_ERROR(Next task callback is not set for query) عند قراءة عرض من نوعSQL SECURITY DEFINERأوSQL SECURITY NONEمبني فوق دالة جدول خاصة بالعنقود (s3Cluster،urlCluster،fileCluster) بوصفه استعلامًا ثانويًا، كما في حالة القراءة عبرremoteأوclusterAllReplicas. وأصبح هذا التداخل غير المدعوم يُرفض الآن بخطأ استعلام عادي بدلًا من إيقاف الخادم في إصدارات debug وsanitizer. #113371 (groeneai). - إصلاح الخطأ المنطقي
IDENTIFIER is not a table expressionعند استخدام دالة جدول من عائلة remote مع وسيطةview(...)في الجانب الأيسر منJOIN ... USINGيكون مفتاحه اسمًا بديلًا من قائمةSELECT، مع تفعيلanalyzer_compatibility_join_using_top_level_identifier = 1. #113400 (groeneai). - إصلاح الخطأ
Not-ready Set is passed as the second argument for function 'in'عندما يُرشِّح استعلامٌ الجدولsystem.databasesحسب العمودnameباستخدام استعلام فرعي داخلindexHint، ومثال ذلكSELECT count() FROM system.databases WHERE indexHint(name IN (SELECT 'foo')). فقد كان هذا الاستعلام يُرفض بالخطأLOGICAL_ERRORفي إصدارات release ويوقف الخادم في إصدارات debug وsanitizer. #113556 (groeneai). - إصلاح تجاهل الاستعلامات على أعمدة من النوع
Variantللإعدادmax_execution_timeوللأمرKILL QUERY. فقد كان استدعاء دالة بعدة وسيطات من النوعVariantيحلّ الدالة مرةً لكل بديل من بدائل كل وسيطة، ولم تكن أيٌّ من الحلقتين المنفّذتين لذلك تتحقق من الإلغاء، ومن ثمّ تعذّر إيقاف هذا الاستعلام قبل انتهائه. #113612 (groeneai). - إصلاح فشل
ALTER TABLE ... MODIFY COLUMNبالخطأCannot specify codec for column type ALIASعندما تحوّل عبارة واحدة عمودًا من النوعALIASإلى عمود فعلي (DEFAULTأوMATERIALIZED) وتحددCODECفي الوقت نفسه. #113853 (groeneai). - إصلاح تعطّل الخادم عند الربط باستخدام تعبير
ONثابت مع جانب أيمن يحتوي علىARRAY JOIN. إذ كانت قراءة عمود متماثل بشكل كسول في الجانب الأيمن تستخدم كائنColumnReplicatedسبق تحريره من الذاكرة. #113901 (groeneai). - إصلاح تسرّب في الذاكرة عند استخدام
optimize_aggregation_in_order = 1حين يكون مفتاح فرز الجدول بادئةً صارمةً لمفتاحGROUP BY، مع استخدام دالة تجميعية تمتلك حالتُها ذاكرةً في الكومة، مثلquantileDD. إذ كانت ذاكرة الخادم تتزايد مع كل استعلام من هذا النوع حتى إعادة التشغيل. #114010 (groeneai). - إصلاح تجاهل الدالة
isProbablePrimeعلى النوعينUInt128/UInt256للإعدادmax_execution_timeوللأمرKILL QUERY. فقد كانت كتلة من القيم العريضة تُعالَج حتى نهايتها داخل استدعاء واحد للدالة دون أي نقطة إلغاء، ما قد يُبقي الاستعلام قيد التنفيذ لدقائق بعد انقضاء مهلته. #114032 (groeneai). - إصلاح الخطأ
Code: 46. DB::Exception: Unknown function exists. (UNKNOWN_FUNCTION)الذي كان يُطلَق عندما يحتوي البندPREWHEREعلى مسندIN (subquery)مع ضبطrewrite_in_to_join = 1(أوmake_distributed_plan = 1الذي يفرض تفعيله). علمًا بأن الاستعلام نفسه كان يعمل بشكل صحيح عند كتابته باستخدامWHERE. #114067 (RohithPariki). - إصلاح الخطأ
LOGICAL_ERRORفي الدالةarrayAutocorrelationعندما تكون الوسيطة مصفوفةً غير فارغة نوع عناصرهاNothing، مثلSELECT arrayAutocorrelation([arrayMax([])]). باتت هذه الوسيطة تُرفَض الآن بالخطأILLEGAL_COLUMN، بينما تظل المصفوفة الحرفية الفارغة[]تُعيد[]. #114249 (groeneai). - بات الأمران
CREATE TABLEوALTER TABLEيرفضان الآن ترميزات الضغط الفاقدة مثلSZ3على أي عمود مستخدَم في مفتاح الفرز. #114531 (groeneai). - إصلاح حلقة لا نهائية غير قابلة للإلغاء في الدالتين
hopوwindowIDعندما يكون امتداد وسيطة الفاصل الزمني بالثواني من مضاعفات 2^32 (مثلtoIntervalDay(2147483648)): إذ كانت عملية الطرح المُلتفّة تُفلت من فحص تجاوز الوقت، ومع الوسيطات الثابتة كانت الحلقة تعمل في مرحلة التحليل، حيث يتعذّر حتى إنهاء الاستعلام. كما كان الفاصل الزمني نفسه قادرًا على إبقاء الخيط الخلفي لـWINDOW VIEWيدور إلى ما لا نهاية؛ وبات هذا النوع من window view يُرفَض الآن عند إنشائه. #114607 (alexey-milovidov). - إصلاح الخطأ المنطقي
Not-ready Set is passed as the second argument for function 'in'في الاستعلامات التي تتضمن استعلامًا فرعيًاINيقرأ من عنقود بعيد: إذ بات الاستعلام يفشل الآن بالخطأ الفعلي الصادر عن الاستعلام الفرعي، كفشل الاتصال مثلًا. #114983 (alexey-milovidov). - إصلاح عملية
INSERTفي جدول من نوعLogأوTinyLogأوStripeLogتفشل أثناء تثبيت أحجام الملفات المسجَّلة. إذ كان من الممكن أن تُبقي عملية الإدراج هذه صفوفها في الجدول رغم إبلاغها عن خطأ، أو أن تترك ملفات البيانات الخاصة بعمود مصفوفة غير متسقة فيما بينها. وباتت قراءة جدولLogأوTinyLogيحتوي على عمود مصفوفة خالٍ من العناصر بينما تشير إزاحاته إلى وجود عناصر تُطلق الآن خطأً يذكر اسم العمود، بدلًا من القراءة بعد نهاية العناصر. أما عمود العناصر المكتوب جزئيًا فكان يُرفَض أصلًا. #115027 (groeneai). - إصلاح الخطأ
TYPE_MISMATCH(“CAST AS Array can only be performed between same-dimensional array types”) في الاستعلامات التي تتضمن ثابتًا من النوعArray(Map(...))، مثلhas([map('k', 'v')], m)، عند تنفيذها على جدولDistributedأو باستخدام النسخ المتماثلة المتوازية. #115883 (alexey-milovidov). - تم إصلاح نتائج خاطئة عند الربط مع عرض أو
view()يحمل فيه الـ column المُسقَط الاسم نفسه الذي يحمله column في إحدى علاقاته الداخلية، مثلSELECT expr(x.c0) AS c0 FROM a AS x, b AS y. كان مُحسِّن ترتيب الربط يدمج مثل هذا التعبير في مخطط الربط المُسطَّح ثم يطبّقه مرتين، فيُرجع الاستعلام قيمًا مشوَّهة دون أي تنبيه. وإذا كان التعبير يغيّر نوع الـ column أيضًا، فإن السبب نفسه كان يؤدي بدلًا من ذلك إلى الخطأAMBIGUOUS_COLUMN_NAMEفي مرحلة التخطيط. #116152 (groeneai). - تم إصلاح استثناء في الاستعلامات الفرعية المترابطة عندما تصبح الأعمدة الخارجية من النوع
Nullableعند استخدامgroup_by_use_nullsمع ROLLUP/CUBE. #100365 (alexey-milovidov). - أصبحت القيمة
max_replication_lag_to_enqueue = 0مرفوضة في قواعد البيانات من نوعReplicated. كانت هذه القيمة تجعل فحص عدم المزامنة بعد الاسترداد صحيحًا دائمًا، مما يؤدي إلى إيقاف الخادم بالخطأLOGICAL_ERRORفي إصدارات التصحيح والإصدارات المزوّدة بأدوات sanitizer. وتُرفض القيمة0الآن في مرحلة التحليل بالخطأBAD_ARGUMENTSأيًّا كان مصدرها (CREATE DATABASE ... SETTINGS، وكتلة<database_replicated>في إعدادات الخادم، وإعادة تنفيذATTACH، وإعادة تنفيذ البيانات الوصفية الموجودة أثناء الترقية). أصغر قيمة صالحة هي1. #106006 (groeneai). - مُنع إنشاء فهرس تخطٍّ من نوع minmax على أعمدة JSON (Object) لتجنّب الاستثناء NO_COMMON_TYPE عند إدراج مصفوفات مختلطة الأنواع. استخدم بدلًا من ذلك الأعمدة الفرعية ذات الأنواع المحددة (مثل
INDEX idx json.field TYPE minmax). #106094 (linhaojie). - تم إصلاح إرجاع
JSON_QUERY/JSON_VALUE/JSON_EXISTSللنوع Dynamic بدلًا من String/UInt8 عند تمرير وسيطات من نوع Dynamic. #106877 (Avogar). - تم إصلاح تجاوز سعة عدد صحيح ذي إشارة عند تعيين إعداد مهلة انتظار، مثل
interactive_delay، إلى قيمة ضخمة جدًا: إذ كانت مهلة الانتظار قد تنتهي فورًا بدلًا من الانتظار، وقد يتوقف الخادم عند التشغيل مع Undefined Behavior Sanitizer. #106961 (groeneai). - تم إصلاح
LOGICAL_ERROR(“Unsupported argument types”) في الدالةgeohashesInBoxعندما كانت وسيطات الإحداثيات تجمع بين قيم ثابتة وغير ثابتة، أو عندما يكون أحد الإحداثيات من النوعBFloat16. أصبحت وسيطاتFloat32التي تجمع بين قيم ثابتة وغير ثابتة تعمل الآن، وتُرفض وسيطاتBFloat16مع رسالة error واضحة. #107063 (groeneai). - تم إصلاح احتواء ترويسة
CSVWithNamesوCSVWithNamesAndTypesعلى عدد أعمدة أقل من البيانات عند تفعيلoutput_format_csv_serialize_tuple_into_separate_columns(وهو الإعداد الافتراضي). أصبحت الترويسة (وصف الأنواع) تُسطِّح الآن أعمدةTupleإلى حقولها الطرفية بأسماء مفصولة بنقاط (مثلt.aوt.b)، بحيث يتطابق عدد أعمدة الترويسة مع البيانات. ويتحكم في هذا السلوك إعداد جديد هوoutput_format_csv_header_serialize_tuple_into_separate_columns(القيمة الافتراضية1)، ويمكن تعيينه إلى0لاستعادة الترويسة السابقة ذات الاسم الواحد. #107371 (groeneai). - تم إصلاح تسرّب في الذاكرة في
mongo-c-driverالمضمَّن، كان قد يحدث عند القراءة من MongoDB (على سبيل المثال عبر قاموس MongoDB أو دالة الجدولmongodb) إذا أعقب خطأَ قراءةٍ قابلًا لإعادة المحاولة فشلٌ في اختيار الخادم عند إعادة المحاولة. #107448 (groeneai). - إصلاح خطأ منطقي (
WhichDataType(const_type).isArray()) وتوقف مفاجئ للخادم أثناء تحليل المفتاح الأساسي عند استدعاءpointInPolygonبوسيطة مضلع ثابتة من نوع مُغلِّف مثلVariantأوDynamic(على سبيل المثالpointInPolygon((x, y), if(c, [(0, 0), ...], NULL))). #107589 (groeneai). - إصلاح أخطاء منطقية (
Bad cast) ناتجة عن إزالة غير متسقة لـLowCardinalityالمتداخل داخل أعمدةVariantوDynamic، كما فيconcatوformatوتحليل المفتاح الأساسي. #107773 (Avogar). - إصلاح تحليل معلمات أوامر الدوال المعرّفة من قبل المستخدم القابلة للتنفيذ، بحيث لم تعد العناصر النائبة ذات الأسماء الفارغة أو غير الصالحة تُقبل كمعلمات. #107983 (goutamadwant).
- إصلاح
accurateCastOrNullعند تطبيقها علىTupleيكون أحد عناصره من نوعDynamic/Variant: إذ كانت قيمةNULLالحقيقية في المصدر تُعامَل على أنها فشل في التحويل. فعندما يكون العنصر الهدف من نوعNullable، تبقى قيمةNULLفي المصدر الآن عنصرًا بقيمةNULL(بما يطابق سلوك مصدر عادي من نوعTuple(Nullable(...)))؛ أما عندما يكون العنصر الهدف من نوع غيرNullable، فإن قيمةNULLفي المصدر تجعل الـ Tuple بأكملهNULL(بما يطابق السلوك المرجعي في غير حالةDynamic) بدلًا من إنتاج القيمة الافتراضية للعنصر. ولا تزال حالات فشل التحليل أو الفيض تجعل الـ Tuple بأكملهNULL. #108023 (groeneai). - أصبحت دالة الجدول
mongodbتقبلoid_columnsعند تمريرها كوسيطة مسمّاة (مثلoid_columns='_id')، بدلًا من رفضها بالخطأBAD_ARGUMENTS. #108039 (alexey-milovidov). - السماح بالاستعلام من قاموس
range_hashedأوcomplex_key_range_hashedيستخدم نطاقًا من نوعDateTime64أوDecimalأو من نوع فاصلة عائمة، مع تمرير وسيطة مطابقة إلىdictGet/dictHas. في السابق، كانت هذه الاستعلامات تفشل بالرسالةmust be convertible to Int64، وكانت الفترات المفتوحة لنطاقاتDecimal/DateTime64تُعيد القيمة الافتراضية خطأً. #108052 (alexey-milovidov). - إصلاح توقف مفاجئ للخادم (
Logical errorفيIColumn::insertFrom) عند تحويلArray(Dynamic)أوArray(Variant)إلىQBitباستخدامaccurateCastOrNull، مثلaccurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (groeneai). - إصلاح انهيار للخادم (
Received signal 4، تعليمة غير صالحة) قد ينجم عن تدفق مشوَّه أو غير متزامن عبر بروتوكول TCP الأصلي. أصبح الخادم يتحقق الآن من أن الحقلinitial_addressفيClientInfoبصيغةhost:portرقمية قبل تحليله، بدلًا من السماح لمنفذ غير رقمي بالوصول إلى دالة libc المحظورةgetservbyname. #108410 (groeneai). - إصلاح التخصيص المفرط للذاكرة عند إلغاء تسلسل حالات دوال تجميعية مُتلاعَب بها لـ
mannWhitneyUTestوrankCorrوlargestTriangleThreeBucketsوquantileGKوsequenceMatch/sequenceCountوgroupArrayIntersect. كان بإمكان حالة مشوَّهة أن تُعلن عن عدد هائل من العناصر، فتدفع الخادم إلى محاولة تخصيص عشرات الغيغابايتات انطلاقًا من بضعة بايتات فقط من المدخلات؛ أما الآن فتُرفض هذه الحالات بالخطأTOO_LARGE_ARRAY_SIZE. #108465 (groeneai). - تم إصلاح خطأ منطقي (
Bad cast from type DB::ColumnNullable to DB::ColumnString) ونتائج قد تكون خاطئة عند استخدامgroup_by_use_nullsمع مفتاح تجميع ثابت من النوعLowCardinalityفيGROUPING SETS/ROLLUP/CUBE. #108771 (alexey-milovidov). - إصلاح الخطأ
TYPE_MISMATCHفيmapFilterوmapSortوmapReverseSortوmapPartialSortوmapConcatعندما تحتوي قيمة من النوعMapعلىMapمتداخلة تتضمنLowCardinality، مثلmapFilter((k, v) -> 1, map('a'::LowCardinality(String), map('x'::LowCardinality(String), 'y'))). #108798 (groeneai). - تم إصلاح الخطأ
LOGICAL_ERROR(“Inconsistent AST formatting”) الذي كان يتسبب في توقف الخادم بشكل مفاجئ في إصدارات debug وsanitizer عند تنسيق نوع البياناتTupleالذي يجمع بين عناصر مسماة وأخرى غير مسماة (مثلTuple(a UInt8, UInt16)). #108915 (groeneai). - أصبحت
JSONExtractتراعي الإعدادcast_string_to_date_time_modeعند تحويل قيم JSON النصية إلىDateTime/DateTime64، على نحو يتسق معCAST. #109252 (Utkal059). - تم إصلاح
INعند استخدام عمود مصفوفة مجرد كوسيطة يمنى، إذ كان يُرجع بصمت نتيجة خاطئة (false دائمًا) أو يُطلق استثناءً، وأصبحx IN arrالآن يعمل مثلhas(arr, x). #109416 (alexey-milovidov). - إصلاح الخطأ
LOGICAL_ERRORفيarrayFoldعند تطبيقها على وسيطة غير ثابتة من النوعArray(LowCardinality(T))(مثلarrayFold((acc, x) -> acc + x, materialize([1, 2, 3]::Array(LowCardinality(Int64))), toInt64(0)))، إذ كانت تفشل برسالة “Arguments of ‘plus’ have incorrect data types” (مع توقف مفاجئ للخادم في إصدارات debug وsanitizer). #109462 (groeneai). - تم إصلاح الاستثناء
ILLEGAL_COLUMNفيconvمن خلال تحويل وسيطاتFixedStringإلىStringبشكل صحيح. #109771 (hp77-creator). - إصلاح النتائج الخاطئة عند القراءة عبر دوال الجداول باستخدام
FINAL/SAMPLEمعserialize_query_plan = 1، وإصلاح مفتاح ذاكرة التخزين المؤقت لإحصاءات جدول التجزئة الخاص بالتجميع في دوال الجداول (إذ كانت جميع دوال الجداول تتشارك سابقًا إدخال تخصيص مسبق واحدًا). #109847 (azat). - إصلاح تحليل القيمتين الرقميتين
1/0كقيمBoolداخل الأنواع الحاوية (مثلArray(Bool)وTuple(Bool, ...)). في السابق، كان[1,0]يفشل بالخطأCANNOT_READ_ARRAY_FROM_TEXTفي حين كان[true,false]يعمل بشكل سليم. #109976 (groeneai). - تم إصلاح الخطأ
NOT_IMPLEMENTED(Method getDataAt is not supported for Nullable(String) in case if value is NULL) عند إنشاء فهرسtextعلىArray(LowCardinality(Nullable(String)))(بما في ذلك حقولNestedالمخزنة بهذه الطريقة) واحتواء مصفوفة مفهرسة على عنصرNULL. يتم الآن تخطي عناصر المصفوفة ذات القيمةNULLأثناء إنشاء الفهرس، بما يطابق سلوكArray(Nullable(String)). #110055 (groeneai). - تم إصلاح النتائج غير الصحيحة التي تُرجعها
subBitmapوbitmapSubsetInRangeوbitmapSubsetLimitلخرائط البتات التي لا تزال محفوظة بالتمثيل الصغير، بما في ذلك قيم العناصر من النوعينUInt64وInt64التي تتجاوز2^32، والتي كانت تُقتطع إلى 32 بت. وأصبحت المقارنات في دوال خرائط البتات على أنواع العناصر ذات الإشارة تستخدم الآن على نحو متسق القيمة عديمة الإشارة لنوع العنصر، ففي خريطة بتات من النوعInt8يُقارَن العنصر-1على أنه255بدلاً من القيمة الموسَّعة بالإشارة4294967295؛ ويُصلح هذا أيضاًbitmapMinوbitmapMaxوbitmapContainsوbitmapTransformعلى خرائط البتات التي تجاوزت التمثيل الصغير. ويجب تعديل الاستعلامات التي كانت تمرّر عتبات موسَّعة بالإشارة: فعلى خريطة بتات من النوعInt8، يصبحbitmapSubsetInRange(bm, 4294967168, 4294967296)هوbitmapSubsetInRange(bm, 128, 256). كما تم إصلاح مشكلة إرجاعgroupNumericIndexedVectorنتائج لأعمدة الفهرس من النوعينInt8وInt16تختلف عن نتائج أنواع الفهارس الأوسع، ومشكلة إرجاعnumericIndexedVectorGetValueالقيمة0للفهارس السالبة. وتم تصحيح توثيق دوال خرائط البتات، بما في ذلك دوال المجموعات الجزئية التي وُصفت خطأً بأنها تعتمد فهرسة تبدأ من 1، ووصف دعمbitmapBuild/bitmapToArrayللأنواع ذات الإشارة. #110072 (RamiDarwiche). - تم إصلاح مسارات فيض الأعداد ذات الإشارة ذات السلوك غير المعرَّف في حساب الفواصل الزمنية، وذلك في
WITH FILL STEPمن نوع الفاصل الزمني وفي دوال الفواصل الزمنية للتاريخ/الوقتadd*/subtract*عند استخدام فروقات قصوى، مما يجعل نتائج قيم الفواصل الزمنية القصوى حتمية بدلاً من الاعتماد على فيض الأعداد ذات الإشارة. كما تم إصلاح تعطّلWITH FILLمن نوع الفاصل الزمني عند استخدام خطوةYEARضخمة، إذ كان ذلك يؤدي سابقاً إلى سير التقويم في الاتجاه العكسي. #110158 (groeneai). - تم إصلاح تضخم تربيعي في زمن التنفيذ (وعدم الاستجابة لـ
max_execution_time) في التجميع وفق الترتيب عند التجميع حسب مفاتيح متعددة لا يمثّل ترتيب الفرز فيها سوى بادئة لمفتاح التجميع. #110159 (alexey-milovidov). - تم إصلاح المقارنات التي كانت تُطلق سابقاً الخطأ
ILLEGAL_TYPE_OF_ARGUMENTعندما لا يوجد للمعاملات أدنى نوع أعلى مشترك. وأصبح بالإمكان الآن مقارنة المصفوفات معجمياً، مثلArray(Int64)معArray(UInt64)وArray(Int256)معArray(UInt256)، باستخدام=و!=و<و<=و>و>=وIS DISTINCT FROMوIS NOT DISTINCT FROM. كما أصبحت المقارنات الآمنة مع NULL، مثلisDistinctFrom/isNotDistinctFrom، تقارن أيضاً أزواج القيم الرقمية أو العشرية المدعومة من غير المصفوفات حسب القيمة بدلاً من إطلاق خطأ. وتعمل مقارنات المساواة كذلك مع المصفوفات التي تحتوي على عناصر متداخلة من النوعTuple(Nullable(...)). #110245 (diegomestre2). - إصلاح فيض في الأعداد الصحيحة ذات الإشارة (UBSan) عند تحويل قيمة
DateTime64قصوى (مثلINT64_MIN) إلىTime/Time64في منطقة زمنية ذات إزاحة سالبة. #110451 (groeneai). - أصبح تحويل قيم الفاصلة العائمة الواقعة خارج النطاق (
BFloat16وFloat32وFloat64) وقيمUInt64التي تتجاوزInt64::max()إلىDateTimeوTimeيتشبّع الآن بشكل موثوق عند حدود النطاق على جميع المعماريات (إذ كانت نتيجة التحويل خارج النطاق تعتمد سابقًا على المعمارية، وقد تلتف على x86-64)، كما باتت القيم غير المنتهية (NaNوinf) تؤدي إلى رفع استثناء بدلًا من إنتاج نتيجة اعتباطية. وطُبّق الإصلاح نفسه على مسار تحويل الأعداد ذات الفاصلة العائمة إلىDateفيtoDate، وعلى تحويلاتUInt64والأعداد الصحيحة العريضة ((U)Int128و(U)Int256) إلىDateوDate32، والتي كان من الممكن أن تُرجع يومًا سابقًا لبداية الحقبة بدلًا من التشبّع. كما أصبح تحويل الأعداد إلىTimeيتشبّع ضمن نطاق النوع أيًّا كان نوع المصدر الرقمي (إذ كانت القيم القادمة من مصادر الأعداد الصحيحة غير الموقّعة الضيقة أو العريضة تُخزَّن سابقًا دون تقييد، ولا تُقيَّد إلا عند طباعتها)، ولم يعد التحويل الدقيق إلىTimeيرفض القيم السالبة التي يدعمهاTime، ولا يُشبِّع بصمت القيم التي لا يتسع لها. ولم يعد التحويل الدقيق لعدد إلىDate32(accurateCastوaccurateCastOrNull) يُشبِّع بصمت القيم الواقعة خارج النطاق أو غير المنتهية، بل يرفع استثناءً أو يُرجعNULLكما هو الحال أصلًا معDateوDateTime، بينما تُرجع صيغOrDefaultالقيمة الافتراضية لـDate32عند مثل هذه المُدخلات. وأصبح التحويل الدقيق لعدد ذي فاصلة عائمة غير صحيح إلىDateأوDate32أوDateTimeأوTimeمرفوضًا بدلًا من اقتطاعه بصمت. كذلك أُصلحت وثائق الدالةtoDateTime32، التي كانت تعرض عن طريق الخطأ أمثلةtoDateTime64وتصف نطاق قيمDateTime64. #110459 (alexey-milovidov). - إصلاح فشل استنتاج المخطط مع الخطأ
Map cannot have a key of type LowCardinality(Nullable(String))عند قراءة ملفات ORC التي تكون مفاتيح الـ Map فيها مُرمَّزة بالقاموس — بما في ذلك ملفات ORC التي كتبها Spark، والملفات التي كتبها ClickHouse نفسه مع تفعيلoutput_format_orc_dictionary_key_size_threshold. #110492 (tiandiwonder). - إصلاح خطأ منطقي (
Function node with name '...' is not resolved as ordinary function) كان من الممكن أن يحدث عند تفعيلoptimize_or_like_chainإذا ظهرت دالة تجميعية أو دالة نافذة على الجانب الأيسر منLIKE/ILIKE/matchداخل سلسلةOR. #110641 (groeneai). - إصلاح فيض عدد صحيح موقّع في
toStartOfIntervalعند استخدام عدد متطرف من الفواصل الزمنيةMONTHأوWEEKأوDAYمع قيمDate/Date32/DateTime64. #110688 (groeneai). - إصلاح إرجاع
readWKTوreadWKTPointإحداثيات غير مُهيّأة (في الوضع العددي) أو إحداثيات متبقية من الصف السابق (في الوضع المتجهي) عندPOINT EMPTY. أصبحPOINT EMPTYيُرفض الآن مع الخطأCANNOT_PARSE_TEXT، نظرًا لأنPointفي ClickHouse هوTuple(Float64, Float64)ثابت لا تمثيل فارغًا له. #110692 (groeneai). - إصلاح فقدان
flipCoordinatesللنوعGeometry: عند تمرير وسيطة من النوعGeometryتعود النتيجة الآن من النوعGeometryبدلًا من النوع الأساسيVariant(...)، ما يتيح تمريرها مباشرةً إلى دوال مثلareaCartesian. #110694 (groeneai). - إصلاح التسلسل غير القياسي بصيغة WKB للمضلع الفارغ: أصبح
wkb(POLYGON EMPTY)يُخرج الآنnumRings = 0بدلًا من حلقة زائفة واحدة بلا نقاط، بحيث يحافظ المضلع الفارغ القياسي على هويته عند كتابته بصيغة WKB ثم قراءته مجددًا. #110796 (groeneai). - أصبح تحليل القيمتين الرقميتين
1/0فيBoolبتنسيق JSON يراعي الإعدادallow_special_bool_values. في السابق، كان إدخال JSON مثل{"v":1}للنوعVariant(Bool, UInt32)يُقرأ على أنهBoolحتى معallow_special_bool_values_inside_variant = 0، لأن محللاتBoolالخاصة بـ JSON كانت تتجاهل هذا الإعداد، ولأن أولوية إلغاء التسلسل لـBoolضمنVariantأعلى من أولوية أنواع الأعداد الصحيحة. #110835 (groeneai). - تم إصلاح مشكلة كانت تجعل
throwIf(notLike(col, pattern))(وغيرها من استدعاءاتthrowIfالمطبقة على دالة) ترفع استثناءً دائمًا بصرف النظر عن الشرط عندما يكونcolمن النوعLowCardinality. كان التنفيذ الافتراضي لـLowCardinalityيشغّلthrowIfعلى القاموس بأكمله، وهو يحتوي دائمًا على القيمة الافتراضية المحجوزة حتى إن لم يُشِر إليها أي صف، ولذلك كانت أي قيمة غير صفرية في تلك الخانة غير المستخدمة تدفعthrowIfإلى رفع استثناء لبيانات لا تستوفي الشرط. #110864 (groeneai). - تم إصلاح عطل كان يحدث عند استخدام دالة تجميعية مع المُركِّب
-Tupleإلى جانبRESPECT NULLSعندما تُنتج حالة وسيطة (-State، أو التجميع الموزع، أوWITH ROLLUP/WITH CUBE). كانت الدالة المركّبة تُسمّى وفقًا لمتغير حالة خاطئ، فكان نوعAggregateFunctionالمُسلسَل الخاص بها يُعاد تحليله إلى تخطيط غير متوافق في الذاكرة عند إجراء دورة كاملة من التسلسل وإلغائه. #110930 (groeneai). - تم إصلاح الخطأ
Nested type LineString cannot be inside Nullable type (ILLEGAL_TYPE_OF_ARGUMENT)عند قراءة عمود مكاني يقبل القيم الفارغة من MySQL (LINESTRINGأوPOLYGONأوMULTILINESTRINGأوMULTIPOLYGONأوMULTIPOINTأو النوع العامGEOMETRY) عبر دالة الجدولmysqlأو محركات الجداول/قواعد البياناتMySQL. أصبحت هذه الأعمدة تُقرأ الآن احتياطيًا بالنوعNullable(String)الذي يحتفظ بالقيمة كما تُرجعها MySQL (بادئة SRID بطول 4 بايت تليها حمولة WKB). ويظلPOINTمُعيَّنًا إلىNullable(Point). #110943 (groeneai). - إصلاح تسلسل
NativeلمغلّفاتSimpleAggregateFunctionالتي تحتوي على حالات تجميعية ذات إصدارات، عند التواصل مع النظراء ذوي الإصدارات الأقدم. #110997 (groeneai). - إصلاح الخطأ
CANNOT_CONVERT_TYPEللثوابت من النوعVariant(بما في ذلكGeometry) في الاستعلامات الموزعة والاستعلامات التي تستخدم النسخ المتماثلة المتوازية. #111136 (fm4v). - إصلاح الخطأ
LOGICAL_ERROR(“Lambda resolved type … is not equal to type from actions DAG …”) عندما يكون جسم لامبدا في دالة عالية الرتبة تعبيرif/multiIfبشرط ثابت يمزج بين فرع قيمته حرفية من النوعBoolوفرع مقارنة من النوعUInt8، مثلarrayFilter(p -> multiIf(false, true, p = 'ALL'), ['ALL']). #111245 (groeneai). - تم إصلاح تجاوز سعة لعدد صحيح ذي إشارة في
toStartOfIntervalمع الفواصل الزمنية الأصغر من الثانية: فبالنسبة لقيمDateTime64التي تبعد عن الحد الأدنى لـInt64بأقل من فاصل زمني واحد، كانت النتيجة المقرّبة تلتف بصمت إلى قيمة موجبة عشوائية؛ أما الآن فترفع الدالة الاستثناءDECIMAL_OVERFLOW. #111370 (alexey-milovidov). - تم إصلاح استثناء (
CANNOT_CONVERT_TYPEأو خطأ منطقي) في الاستعلامات الموزعة التي تستخدم المُركِّب-Tupleمع المُعدِّلRESPECT NULLS/IGNORE NULLSضمن مُركِّبات متداخلة، مثلanyRespectNullsStateTuple(...) IGNORE NULLS. #111570 (alexey-milovidov). - إصلاح عملية محاولة التحليل النصي لنوع
FixedStringالتي كانت تترك بايتات مُلحقة جزئيًا في العمود عند فشل التحليل، مما قد يتسبب في خطأ منطقيSizes of nested column and null map of Nullable column are not equalأثناء تسلسل أعمدةVariant/Array/Nullable، أو في إزاحة بايتات النتيجة دون أي تنبيه. #111908 (groeneai). - إصلاح حدوث استثناء وتخطي البيانات دون أي تنبيه عند قراءة عمود فرعي ديناميكي (مسار داخل عمود
JSONأوDynamic) عبر جدولBuffer. #111948 (alexey-milovidov). - إصلاح التعقيد التربيعي في
countSubstringsCaseInsensitiveUTF8، الذي كان يجعل الدالة تستغرق دقائق عند البحث في نص بحجم بضعة ميغابايتات يحتوي على تطابقات كثيرة. أصبحت إزاحة الأحرف لكل تطابق تُحدَّث الآن بشكل تزايدي بدلًا من إعادة عدّها من بداية الصف. #112003 (groeneai). - إصلاح تجاوز سعة عدد صحيح ذي إشارة في الصيغة ثلاثية الوسائط من
toStartOfInterval: فعند تمرير وسيطةoriginقريبة من الحد الأدنى لـInt64كانت الدالة تُعيد قيمة ملتفّة بدلًا من الإبلاغ عن خطأ. #112045 (alexey-milovidov). - منع استخدام الحالات التجميعية في معلمات دوال الجدول، لأنها غير مدعومة إطلاقًا. #112087 (PedroTadim).
- إصلاح مشكلة في دالة الجدول
valuesكانت تعرض ثابتBoolغير حرفي (مثلCAST(true, 'Nullable(Bool)')) مُدرجًا في عمودString/نصي على هيئة1/0بدلًا منtrue/false. #112308 (yakov-olkhovskiy). - إصلاح خطأ منطقي (يؤدي إلى الإنهاء القسري في إصدارات التصحيح وإصدارات أدوات sanitizer) عند تطبيق
finalizeAggregationعلى عمود تأتي حالاته التجميعية من دوال مختلفة تتشارك تمثيل الحالة نفسه لكنها تُنتج أنواعًا مختلفة عند الإنهاء، مثلquantileStateوquantilesState(0.9)عند جمعهما عبرUNIONأو إنتاجهما عبرarrayReduce. أصبحت هذه الاستعلامات الآن تُطلق خطأً عاديًا بدلًا من الانهيار. #112662 (zainulabidin302). - إصلاح تحليل الأعداد الصحيحة التي لا تتسع لها سعة النوع الهدف في
Poco::NumberParser، المستخدم لقراءة أرقام JSON. إذ كان هذا العدد يُحلَّل دون أي تنبيه إلى قيمة خاطئة (على سبيل المثال، كان18446744073709551617يصبح1) بدلًا من رفضه، كما أن عددUInt64الأكبر من الحد الأقصى لـInt64كان يفقد قيمته الصحيحة عند تحويل AST إلى JSON ثم استعادته. #112904 (alexey-milovidov). - إصلاح تحويل ثابت
Boolفي الطرف الأيمن منINإلى طرف أيسر من نوعStringعلى هيئة'1'/'0'بدلًا من القيمتين القياسيتين'true'/'false'(أصبح الآن متسقًا معCASTودالة الجدولvalues). #113051 (yakov-olkhovskiy). - إصلاح عدم اتساق صياغة AST لـ
viewIfPermitted: إذ كانت الدالة التي تُكتب عادةً كعامل (مثلnot) في فرعELSEمن صيغة دالة الجدول، وكذلك صيغة التعبيرviewIfPermitted(...)، تُصاغان بشكل خاطئ معELSE. #113652 (alexey-milovidov). - إصلاح السلوك غير المحدد والنتائج الخاطئة في
avgعلىDate/DateTime/DateTime64/Time/Time64: يُحسب المتوسط الآن بدقة تامة في نطاق الأعداد الصحيحة، ما يعالج تجاوز السعة عند حدودInt64(سلوك غير محدد ونتيجة خاطئة على x86)، وفقدان الدقة فيFloat64للقيم التي تتخطى 2^53 (وهو ما يظهر على مستوى النانوثانية). #113912 (alexey-milovidov). - إصلاح تسرّب في الذاكرة في ترميز الضغط التجريبي
SZ3: عندما كان ضغط بيانات ضعيفة القابلية للضغط أو تالفة يفشل بإطلاق استثناء، كانت مخازن الذاكرة المؤقتة تبقى محجوزة دون تحرير. #113916 (alexey-milovidov). - إصلاح إرجاع
hasAnyوhasAllوhasوindexOfوmapContainsKeyوmapContainsValueوmapContainsصفوفًا أقل من المتوقع، أو فشلها مع الخطأTOO_LARGE_STRING_SIZE، عند الاستعلام عن فهرسbloom_filterباستخدام ثابت من النوعFixedString. كان الفهرس يحسب تجزئة الشكل المُبطَّن للثابت، في حين تقارن الدالة شكله غير المُبطَّن، فتُتخطّى الحبيبة المطابقة. #114089 (alexey-milovidov). - إصلاح إرجاع
minوmaxنتائج خاطئة على أعمدةDateTime64عندما تُصرَّف دالة التجميع بالتجميع الفوري وتحتوي البيانات على طوابع زمنية سابقة لعام 1970. لم يكنis_signedمُخصَّصًا للنوعينDateTime64وTime64المشتقين منDecimal64، لذا كانت الشيفرة المولَّدة تقارن عدد النبضات بوصفها أعدادًا صحيحة بلا إشارة، فيُعدّ الطابع الزمني السابق لعام 1970 الأكبر فيmaxوالأصغر خطأً فيmin. #114168 (groeneai). - إصلاح إرجاع
arrayExists(x -> x = needle, arr)نتيجة خاطئة، أو فشله مع الخطأTOO_LARGE_STRING_SIZE، عندما يكون عنصر المصفوفة وسلسلة البحث من أنواع string مختلفة (مثل سلسلة بحث من النوعStringمقابل عنصر من النوعArray(FixedString(N))). كان التحسينoptimize_rewrite_array_exists_to_has، المُفعَّل افتراضيًا، يعيد كتابة هذا الاستدعاء إلىhas، الذي لا يراعي التبطين بالأصفار عند المقارنة كما يفعل=. #114496 (groeneai). - إصلاح تقييم الفهرس النصي للمشغّل
LIKE/ILIKEالمطبَّق على حاويات Map أو JSON. #114544 (ahmadov). - إصلاح السلوك غير المحدد والنتائج الخاطئة عند القيم الحدّية في
quantileوquantilesلقيمDateTime64وقيمDecimalالعريضة. #114919 (alexey-milovidov). - إصلاح إرجاع
ifوmultiIfقيمة موجبة كبيرة بدلًا من قيمة سالبة عند الجمع بين فرع من النوعTimeوفرع من النوعTime64أوDateTimeأوDateTime64، مع تصريف التعبير بالتجميع الفوري. #115146 (groeneai). - إصلاح إرجاع
timezoneOffset(واسمها البديلtimeZoneOffset) إزاحة خاطئة بيوم واحد بالضبط للمناطق الزمنية التي تختلف إزاحتها عن UTC عن إزاحتها في 1970-01-01 بيوم كامل، مثلPacific/KiritimatiوPacific/Apiaبعد انتقالهما عبر خط التاريخ الدولي، وكذلك لمعظم المناطق قبل عام 1970. ويشمل هذا الإصلاح أيضًاparseDateTimeوparseDateTimeOrNullوparseDateTime64وparseDateTimeInJodaSyntaxوEXTRACT(TIMEZONE_HOUR / TIMEZONE_MINUTE ...)و%zفيformatDateTimeوtoUTCTimestampوfromUTCTimestamp، إذ تعتمد جميعها على تلك الإزاحة. #115332 (groeneai). - تم إصلاح الخطأ
Code: 349. Cannot convert NULL value to non-Nullable typeالذي كان يظهر عندما يتضمن مسندhasأوnotHasعنصر مصفوفة قيمته NULL ويكون المفتاح الأساسي من النوعStringأوArray(String)أوMap(String, String)، كما تم إصلاح النتائج الخاطئة عندما يكون هذا العنصر من النوعDynamicأوVariantويحتوي على القيمة NULL. باتت القيمة NULL تُحذف الآن من المجموعة أثناء تحليل المفتاح، كما هو معمول به أصلاً مع أنواع المفاتيح الأخرى. #115647 (groeneai). - تم إصلاح مشكلة عدم احتفاظ الإعداد
cast_keep_nullableبقابلية القيم لأن تكون NULL عندما يكون النوع الهدفLowCardinality. فقد كان تحويل قيمة يمكن أن تكون NULL إلىLowCardinality(T)يُطلق الخطأCANNOT_INSERT_NULL_IN_ORDINARY_COLUMNبدلاً من أن يُنتجLowCardinality(Nullable(T)). #115851 (groeneai).
إصلاحات الفهارس وذاكرة التخزين المؤقت للاستعلامات
- إصلاح قراءة الأعمدة الفرعية لعمود يحتوي على تعبير
DEFAULTوغير مُجسَّد في جزء بيانات (على سبيل المثال بعدALTER TABLE ADD COLUMNأو أثناءALTER TABLE MATERIALIZE COLUMN): إذ كان العمود الفرعي يُملأ بالقيم الافتراضية للنوع بدلًا من نتيجة تقييم تعبيرDEFAULT، كما كانت دوال المسافة المتجهية المنقولة (cosineDistanceTransposedوغيرها) تفشل على أعمدةQBitمن هذا القبيل مع الخطأSIZES_OF_ARRAYS_DONT_MATCH. #110636 (alexey-milovidov). - إصلاح الاستثناء
Not-ready Set is passed as the second argumentالذي قد يحدث عندما يفشل بناء مجموعة الاستعلام الفرعيINبصمت أثناء تحليل المفتاح الأساسي (على سبيل المثال، عند انتهاء مهلة استعلام فرعي معoverflow_mode = 'break')، مما يُبقي المجموعة غير مبنية بشكل دائم في مسار تنفيذ الاستعلام. #107924 (alexey-milovidov). - إصلاح فشل استعلام
SELECTمع الخطأNOT_FOUND_COLUMN_IN_BLOCKعلى جدول يحتوي على فهرس تخطي بيانات من نوعsetعندما تصفّيه سياسة صفوف باستخدام شرط صحيح دائمًا مقترن بفحص على عمود غير مُفهرس. #107971 (tiandiwonder). - أصبحت الدالة
getClientHTTPHeaderتُعامَل الآن بشكل صحيح على أنها غير حتمية، فلم تعد ذاكرة التخزين المؤقت لنتائج الاستعلامات تعيد استخدام نتيجتها عن طريق الخطأ. #108029 (alexey-milovidov). - إصلاح النتائج الخاطئة التي كانت تظهر عندما تعيد ذاكرة التخزين المؤقت لشروط الاستعلام (
use_query_condition_cache = 1) استخدام استبعاد علامات مشتق من فهرس التخطي لاستعلام شغّل مجموعة مختلفة من فهارس التخطي، على سبيل المثال معuse_skip_indexes = 0أوignore_data_skipping_indicesأو وضع مختلف لـuse_skip_indexes_for_disjunctions. أصبحت عناصر ذاكرة التخزين المؤقت المشتقة من فهارس التخطي تُفهرَس الآن بحسب المجموعة الفعلية من فهارس التخطي التي جرى تشغيلها، بينما تظل عناصر ذاكرة التخزين المؤقت لشروط الاستعلام على مستوى الصفوف قابلة لإعادة الاستخدام في جميع هذه الحالات. #108548 (groeneai). - إصلاح حالة تعليق كان فيها الاستعلام الذي يقرأ عبر ذاكرة التخزين المؤقت لنظام الملفات يظل ينتظر تنزيلًا قيد التنفيذ حتى بعد إلغائه باستخدام
KILL QUERY، وكان فيها حذف عرض مُجسَّد قابل للتحديث أو تنفيذSYSTEM STOP VIEWعليه يتعطل إذا كان تحديثه عالقًا في انتظار كهذا. #109116 (murphy-4o). - إصلاح نتائج الاستعلام الخاطئة الناجمة عن استبعاد فهرس المفتاح الأساسي للحبيبات بشكل غير صحيح في الجداول التي تحتوي على عمود مفتاح معكوس (
DESC) عندما لا تحتوي أجزاء البيانات على علامة نهائية (تقسيم غير تكيفي،index_granularity_bytes = 0). #109901 (nihalzp). - إصلاح الخطأ المنطقي
Expected CommonSubplanReferenceStep to reference CommonSubplanStep، والخطأSubplan cannot be used to build pipeline، والخطأ المنطقيTrying to extract chunk from ChunkBuffer before all inputs are finishedفي حالةIN (subquery)عندما يحتوي الاستعلام الفرعي على استعلام فرعي مترابط وتُبنى المجموعة أثناء تحليل الفهرس. #110491 (alexey-milovidov). - إصلاح الخطأ
NOT_FOUND_COLUMN_IN_BLOCKفي دوال المسافة المنقولة على أعمدةQBit(مثلcosineDistanceTransposed) عند استدعائها بمتجه مرجعي ثابت أو ناتج عن استعلام فرعي قياسي مع تفعيل النسخ المتماثلة المتوازية. #110729 (alexey-milovidov). - إصلاح عدم استخدام الفهرس النصي عندما يحتوي تعبيره على مقارنة بسلسلة فارغة مثل
arrayFilter(s -> s != '', ...)، إذ إن الإعدادoptimize_empty_string_comparisonsيعيد كتابة المقارنة إلىnotEmptyفي جانب الاستعلام فقط. #112115 (Ergus). - لم تعد الأعمدة تُزال عندما يُشار إليها في شروط التصفية
PREWHEREوWHEREمعًا، حتى لو أُعيدت كتابتها إلى عمود افتراضي لفهرس نصي. #114460 (ahmadov). - تم إصلاح الخطأ المنطقي
Multi-block postings must be compressedفي الاستعلامات على الجداول التي تحتوي على فهرس نصي في وضع التطبيق الكسول لقوائم الترحيل (posting-list)، عند إلغاء الاستعلام أثناء القراءة. #114636 (CurtizJ). - تم إصلاح النتائج الخاطئة عندما تحتوي عبارة
WHEREعلى تعبيرNULLداخلNOT، مثلSELECT count() FROM t WHERE NOT (id >= 20 AND NULL). إذ كان تحليل الفهرس يعدّ هذا الشرط صحيحًا حتمًا على النطاق بأكمله، فيتخطى عامل التصفية: فتُرجعcount()صفوفًا يرفضها الاستعلام، وتحذفALTER TABLE ... DELETEبهذا الشرط صفوفًا كان ينبغي الإبقاء عليها. #115152 (groeneai). - تم إصلاح الخطأ
LOGICAL_ERROR(Join is supported only for pipelines with one output port) في عملية ربط JOIN من نوعfull_sorting_mergeعند تفعيلquery_plan_join_shard_by_pk_rangesإذا قُلِّص أحد الجانبين بحيث لا يبقى فيه أي جزء بيانات، سواء بواسطة المفتاح الأساسي، أو بواسطة إحصاءات الأعمدة، أو لأن الجدول فارغ. #115352 (alexey-milovidov). - تعطيل ذاكرة التخزين المؤقت لشروط الاستعلام لعوامل التصفية على _part_starting_offset #115358 (azat).
- تم إصلاح الخطأ
LOGICAL_ERROR: Index with name auto_minmax_index_<column> already existsعندما تجمع عبارةALTER TABLEواحدة بينRENAME COLUMNوأمر آخر، مثلMODIFY SETTING، على جدول يحتوي على فهارس minmax ضمنية (add_minmax_index_for_numeric_columnsوالإعدادات المشابهة). كما لم تعد إعادة تسمية عمود عادي تتسبب في فشل أمرDROP COLUMNلاحق بالخطأUNKNOWN_IDENTIFIER، ولا في تنفيذ أمرADD COLUMNلاحق دون فهرسه الضمني. #116063 (groeneai). - أصبح نمط
LIKE/NOT LIKEالخالي من محارف البدل (%،_) يستخدم نطاقًا دقيقًا للمفتاح الأساسي، فيقرأ عدد الحبيبات (granules) نفسه الذي يقرؤه المسند المكافئ=/!=بدلًا من نطاق بادئة أوسع. #107077 (groeneai). - تم إصلاح الخطأ
LOGICAL_ERROR(Invalid binary search result in MergeTreeSetIndex) وفوات تقليم الفهرس في إصدارات الإنتاج عندما يغلّف شرطIN/NOT INعلى المفتاح الأساسي المفتاحَ داخلintDivعلى ثابت، ويكون المفتاح عددًا صحيحًا بلا إشارة تتجاوز قيمه حدود الإشارة لنوع نتيجةintDiv(مثلintDiv(uint64_column, -9223372036854775807)). #107586 (groeneai). - تم إصلاح إرجاع
numericIndexedVectorPointwiseMultiplyنتيجةً فارغة عند الضرب في متجه جميع عناصره آحاد وله تهيئة بتات BSI مختلفة. #108027 (alexey-milovidov). - تم إصلاح تجاوز سعة المخزن المؤقت في الكومة (heap-buffer-overflow) عند بناء فهرس نصي باستخدام
positions = 1على عدد كبير من الرموز القصيرة المتمايزة. #108659 (groeneai). - السماح لتعبيرات
preprocessorوpostprocessorالخاصة بالفهرس النصي بالإشارة إلى أعمدةALIAS. #110014 (Ergus). - يتم تخطي تحسين البحث المتجهي عند استخدام
LIMIT ... WITH TIES، لأن هذا التحسين يقصر بحث ANN على n مرشحًا بالضبط، مما يؤدي إلى حذف الصفوف المتعادلة مع الصف رقم n. #110453 (tamish560). - تم إصلاح مشكلة عدم استخدام الفهرس النصي مع
ILIKEعندما يكون الفهرس معرّفًا على تعبير بدلًا من عمود مباشر (على سبيل المثالassumeNotNull(col)مع معالج مسبقlower(...)). أصبحت هذه الاستعلامات تستخدم الفهرس الآن بدلًا من قراءة جميع الحبيبات. #110595 (ahmadov). - إصلاح خطأ
LOGICAL_ERROR(LazyMaterializingTransform: Number of rows in lazy chunk N does not match number of offsets M) الذي قد يحدث في استعلامات البحث المتجهي عند استخدامvector_search_with_rescoring = 1مع التجسيد المؤجل في حال تعادل عدة مسافات. #111003 (groeneai). - رفض المتجهات التي يتجاوز مربع مقدارها الحد الأقصى فيصبح لا نهائيًا عند استخدام فهرس
vector_similarityمع التكميمi8(كانت هذه المتجهات سابقًا تُحفّز سلوكًا غير محدد في usearch وتُنتج بيانات مهملة دون أي تنبيه). #111085 (groeneai). - تم إصلاح قراءة بيانات قديمة من أقراص
plain_rewritableعند تفعيل ذاكرة التخزين المؤقت للصفحات. #111105 (Michicosun). - تم إصلاح نتائج
count()الخاطئة وفقدان صفوف عند تصفية مفتاح أو فهرس تخطي minmax من نوعString(أوFixedStringأضيق) بمقارنته مع ثابتFixedStringأعرض، مثلtoFixedString('abc', 257) = string_col. إذ كان استبعاد المفتاح الأساسي وminmax يبني النطاق من الثابت المحشو بأحرف NUL، فيتخطى الحبيبات المطابقة عن طريق الخطأ. #111106 (groeneai). - تم إصلاح قراءة ملفات Parquet التي لا يبدأ فهرس الإزاحة فيها من الصف 0، إذ كان مثل هذا الملف قد يجعل قارئ Parquet الأصلي يُرجع صفوفًا خاطئة، أو يُبلغ عن
LOGICAL_ERRORبدلًا منINCORRECT_DATA. يتم الآن التحقق من صحة فهرس الإزاحة عند قراءته. #114530 (groeneai).
إصلاحات الأمان والوصول والنسخ الاحتياطي والاستعادة
- أصبح
RESTOREالآن يُجري fsync لملفات أجزاء البيانات المستعادة عندما يكون الإعدادfsync_after_insertمفعّلًا في الجدول الوجهة، وبذلك يغدو جزء البيانات المستعاد محميًا من انقطاع التيار الكهربائي بالقدر نفسه الذي يُحمى به جزء البيانات المُدرج. في السابق، كانت الملفات المستعادة تُكتب وتُغلق فحسب (دون إجراء fsync لها إطلاقًا)، ولذلك كان انقطاع التيار مباشرةً بعد أن يُعيدRESTOREالقيمةRESTOREDقد يُخلّف أجزاء بيانات تالفة وجدولًا فارغًا. #111378 (groeneai). - إصلاح ثغرة أمنية كانت تتيح لعميل TCP غير مُصادَق عليه استكشاف وجود الجداول وحالة الـ replication عبر منفذ الاتصال بين الخوادم (interserver). #99854 (tiandiwonder).
- إصلاح مشكلة كان فيها
DELETE FROM(الحذف خفيف الوزن) يشترط امتيازALTER UPDATEإلى جانبALTER DELETE. أصبح بإمكان المستخدم الممنوح امتيازALTER DELETEوحده تشغيلDELETE FROM، كما هو موثّق. #107491 (tiandiwonder). - إصلاح مشكلة كان فيها
CREATE TABLE ... AS SELECTعلى قواعد بيانات Atomic يُخلّف جدولًا فارغًا عند فشل الاستعلام، كأن لا يملك المستخدم صلاحية الوصول إلى جدول مُشار إليه في استعلام فرعي. في السابق، كانت إعادة المحاولة تُبلغ بأن الجدول موجود مسبقًا بدلًا من إظهار الخطأ الأصلي. أصبح الجدول يُنشأ الآن عبر جدول مؤقت، ولا يظهر إلا بعد ملئه بالكامل. #108048 (alexey-milovidov). - إصلاح الخطأ
LOGICAL_ERROR(No available columns) الذي كان يحدث عند تنفيذSELECT count()(أو غيره من الاستعلامات البسيطة) على جدول لا يملك فيه المستخدم صلاحيةSELECTإلا على عمودALIAS. #108056 (alexey-milovidov). - إصلاح مشكلة كانت تتيح للطلبات غير المُصادَق عليها دفع ClickHouse إلى تحليل أسماء المضيفين الواردة في ترويسات عناوين العملاء المُمرَّرة. أصبح ClickHouse الآن لا يقبل من هذه الترويسات سوى عناوين IP الرقمية. وتُتجاهل القيم غير الصالحة عند نسب الحصص إلى العناوين المُمرَّرة دون إجراء تحليل DNS. وعند تفعيل
auth_use_forwarded_address، تُرفض العناوين المُمرَّرة غير الصالحة أثناء المصادقة، وتُسجَّل حالات الرفض بمستوى debug. #111060 (otselnik). - إصلاح عدم الالتزام بـ
SQL SECURITY DEFINER(وSQL SECURITY NONE) في العروض ذات المعاملات عند تعطيل المحلّل (enable_analyzer = 0). في السابق، كان الاستعلام من عرض كهذا بواسطة مستخدم لا يملك امتيازات على الجدول الأساسي يفشل بالخطأACCESS_DENIED، مع أن العرض نفسه يعمل بشكل سليم عند تفعيل المحلّل. #111458 (groeneai). - إصلاح خلل في تكاملات
MySQLكان يُقبَل فيه تجاوز بيانات اعتماد TLS لمجموعة مُسمّاة (named collection) بقيمة فارغة لـssl_ca_pem/ssl_cert_pem/ssl_key_pemعندما تخزّن المجموعة بيانات الاعتماد بصيغة المحتوى، مما يؤدي إلى إسقاط شهادة CA أو شهادة العميل المُهيَّأة دون أي تنبيه بدلًا من رفض التجاوز. #113947 (alexey-milovidov). - إصلاح فقدان
EXPLAIN ANALYZEلإحصاءات الربط الخاصة بعرض مُعرَّف بـSQL SECURITY DEFINERأوSQL SECURITY NONEيتضمن متنه عملية JOIN. وفي إصدارات debug والإصدارات المزوّدة بأدوات sanitizer، كان الاستعلام يُجهَض بالخطأ المنطقيJoinStep analyzed without the analyze mode. #115156 (groeneai). - إصلاح مشكلة كان فيها
RESTORE ... AS <new name>يُبقي قائمةREFRESH ... DEPENDS ONالخاصة بعرض مُجسَّد قابل للتحديث مُشيرةً إلى قاعدة البيانات الأصلية. فقد كان العرض المستعاد يُحدَّث استجابةً لجدول لم يعد يقرأ منه، ويتجاهل تحديثات الجدول الأصل التابع له، ويتوقف عن التحديث كليًا بمجرد حذف قاعدة البيانات الأصلية. #115689 (groeneai). - تم إصلاح استثناء
LOGICAL_ERRORكان يحدث أثناء النسخ الاحتياطي لقاعدة بياناتReplicatedيجري حذفها وإعادة إنشائها بالتزامن؛ إذ تفشل هذه النسخ الاحتياطية الآن بشكل سليم مع الخطأCANNOT_GET_REPLICATED_DATABASE_SNAPSHOT. #100651 (alexey-milovidov). - أصبح الأمر
GRANT role TO roleعلى الدور نفسه يُرفض الآن مع الخطأBAD_ARGUMENTS، بدلًا من إنشاء إدخال يشير إلى نفسه بصمت فيsystem.role_grants. #103315 (zxuhan). - لم يعد
BACKUPلقاعدة بياناتMaterializedPostgreSQLيتعلّق إلى ما لا نهاية مع الرسالة “Table … were created or changed its definition during scanning”، وأصبح الآن ينسخ بيانات الجدول احتياطيًا بالفعل (مع تفويض ذلك إلى محركReplacingMergeTreeالأساسي)، ويمكن استعادتها بوصفها جدولReplacingMergeTreeمستقلًا. #107433 (alexey-milovidov). - السماح بتنفيذ
EXISTS <dictionary>للمستخدم الذي لا يملك على القاموس سوى امتيازSHOW DICTIONARIES(إذ كان ذلك يتطلب سابقًاSHOW TABLES). #108084 (alexey-milovidov). - تم إصلاح عملية التنظيف لأمر
BACKUP ... TO Memory(...)الذي يفشل قبل اكتماله: إذ كانت النسخة الاحتياطية الفاشلة تظل مسجّلة، مما يحول دون إعادة استخدام اسمها. #109947 (jkartseva). - تم إصلاح الخطأ المنطقي
ReadBuffer is canceled. Can't read from it.(الذي يؤدي إلى إيقاف الخادم في إصدارات debug/sanitizer)، والذي قد يحدث أثناء قراءة أرشيف zip (مثلًا أثناءRESTOREمن نسخة احتياطية بصيغة zip) بعد فشل قراءة سابقة من الأرشيف نفسه في منتصف الدفق. #110197 (groeneai). - تم إصلاح تلف في الكومة قد يتسبب في انهيار الخادم عند إيقاف تشغيله، وكان ناجمًا عن قيام الطريقة
constالمسماةAccessRights::getFiltersبتعديل شجرة حقوق الوصول المشتركة بين الاستعلامات المتزامنة. #112692 (groeneai).
التنفيذ الموزَّع والجداول والعروض والقواميس
- تم إصلاح خطأ زائف من نوع
Inconsistent AST formattingفيALTER TABLE ... MOVE PART ... TO SHARD '<path>'. إذ كان منسِّق الاستعلامات يُسقط الكلمة المفتاحيةSHARD، فيتعذّر تحليل الاستعلام بعد إعادة تنسيقه، مما يؤدي إلى إطلاقLOGICAL_ERROR(استثناء تتم معالجته في إصدارات الإنتاج، وإنهاء قسري في إصدارات التصحيح وإصدارات المُعقِّمات). #109060 (groeneai). - تم إصلاح خطأ منطقي (
!part.empty()) يحدث عند استخدام جدولDistributedمُعرَّف باسم قاعدة بيانات بعيدة فارغ في عملية JOIN معdistributed_product_mode = 'local'. #110677 (groeneai). - تم إصلاح مشكلة إرجاع
DISTINCTلصفوف خاطئة عند استخدامه معLIMIT/OFFSETمرتَّب، وذلك حين يتعذّر على استدلال حدّ الإيقاف المبكر الخاص بـ DISTINCT تقييد بداية النتيجة، أي في الحالات التالية:LIMITسالب (كان يُرجع البداية بدلاً من النهاية)، وLIMIT/OFFSETكسري (إذ لا يُحسم الكسر إلا بعد قراءة كاملة)، وOFFSETمنفرد دونLIMIT(كانت الصفوف التي تلي الإزاحة تُسقَط). على سبيل المثال، كان الاستعلامSELECT DISTINCT intDiv(x, 100) FROM t ORDER BY intDiv(x, 100) LIMIT -1على جدول متعدد أجزاء البيانات يُرجع أصغر قيمة مميزة بدلاً من أكبرها. #111326 (groeneai). - إصلاح الحالة التي لا يقبل فيها المحلل اسماً بديلاً بعد استعلام فرعي في DESCRIBE TABLE، مما يؤدي إلى خطأ في الصياغة. يُصلح https://github.com/ClickHouse/ClickHouse/issues/100031. #100205 (yariks5s).
- تم إصلاح إنهاء قسري للخادم (
Logical error: 'Block structure mismatch') قد يحدث عند تنفيذINSERTمتزامن أثناء سريان عمليةALTER RENAME COLUMNفي قاعدة بياناتAtomicمعlazy_load_tables = 1بعدDETACH DATABASE/ATTACH DATABASE. #104852 (groeneai). - إصلاح تلف أسماء الأعمدة والاستثناء
BAD_ARGUMENTSالناتجَين عن الإعدادinject_random_order_for_select_without_order_by. عند تفعيل هذا الإعداد، لم تعد عمليات SELECT متعددة الأعمدة تفشل، وباتت أسماء أعمدة المخرجات (مثلاً فيCREATE TABLE AS SELECTوCREATE VIEW AS SELECTوJSONEachRow) محفوظة بدلاً من استبدالها بأسماء بديلة داخلية من نوع__subquery_column_<UUID>. #105896 (groeneai). - إصلاح التلميح المُربك “Maybe you meant X?” بعد إعادة تشغيل الخادم (أو
DETACH/ATTACH DATABASE)، إذ كانت محاولة حذف جدول محذوف مسبقاً تقترح الاسم المحذوف للتو بديلاً عنه. أصبحت مهام التحميل غير المتزامن تُزال الآن منDatabaseOrdinary::startup_tableوload_tableعند الفصل. #106238 (groeneai). - إصلاح محرّكي الجدول وقاعدة البيانات
MaterializedPostgreSQLبحيث يمكن تكرار جدول واحد أو قاعدة بيانات واحدة من مخطط PostgreSQL غير افتراضي (materialized_postgresql_schema)، بما في ذلك الحالة التي توجد فيها جداول بالاسم نفسه في عدة مخططات ضمن قاعدة البيانات ذاتها (إذ كانت سابقاً تتشارك publication وreplication slot نفسيهما فيحدث تداخل بينها). #107425 (alexey-milovidov). - تم إصلاح الخطأ
NO_SUCH_COLUMN_IN_TABLEعندما يحدد استعلام يستخدم النسخ المتماثلة المتوازية عموداً من نوعALIASفي جدول مُرسَل بوصفه جدولاً مؤقتاً لـGLOBAL JOIN، والخطأMULTIPLE_EXPRESSIONS_FOR_ALIASعندما يُعرِّف طرفا عمليةJOINموزعة عموداً من نوعALIASبالاسم نفسه، والخطأUNKNOWN_IDENTIFIERعندما يُعرِّف جدولDistributedعموداً من نوعALIASمبنياً على عمودALIASآخر، بما في ذلك استخدامه مفتاحاً فيJOIN USING. #107700 (yakov-olkhovskiy). - تم إصلاح تجاوز سعة عدد صحيح ذي إشارة عندما يعيد عرض مُجسَّد قابل للتحديث محاولة تحديث فاشل مع ضبط
refresh_retriesعلى قيمة كبيرة جدًا (قريبة من الحد الأقصى لـInt64). كان من الممكن أن يؤدي هذا التجاوز إلى إيقاف الخادم بشكل مفاجئ في الإصدارات المبنية باستخدام أداة فحص السلوك غير المعرَّف. #108005 (groeneai). - تم إصلاح استثناء (
CANNOT_PARSE_TEXT) عند تحميل قاموس ذي مفتاح مركّب لا تكون أعمدة مفتاحه هي الأعمدة الأولى في تعريف القاموس، مع مصدرClickHouseمحلي يستخدم استعلامًا صريحًا. أصبحت أعمدة المصدر تُطابَق الآن مع بنية القاموس حسب الاسم بدلًا من الموضع. #108053 (alexey-milovidov). - تم إصلاح انهيار (إلغاء مرجعية مؤشر فارغ) عند الاستعلام عن جدول
Hiveدون عبارةWHERE، مثلSELECT * FROM hive_table. #108094 (alexey-milovidov). - تم إصلاح انهيار في الخادم (خطأ تجزئة) كان من الممكن أن يحدث عندما يشير استعلام موزَّع إلى تعبير جدول شائع
MATERIALIZEDلم يُجسَّد بعد بوصفه جدولًا خارجيًا، مع إنشاء المصدر البعيد بشكل مُرجأ (مصدر مؤجَّل). كان سبب الانهيار إلغاء مرجعيةLoggerفارغ داخلRemoteQueryExecutor::sendExternalTables(). #108547 (groeneai). - إصلاح خطأ منطقي (
Equal values are not contiguous within the range assumed to be sorted) عند تشغيلDISTINCTعلى قراءةSTREAM(SELECT DISTINCT ... FROM table STREAM). لم تعد تحسينات القراءة بالترتيب تُطبَّق على قراءاتSTREAM، لأنها تُنتج الصفوف بترتيب الإيداع لا بترتيب مفتاح الفرز. #108568 (groeneai). - إصلاح استثناء (
Cannot find sharding key column، وإيقاف مفاجئ للخادم في إصدارات التصحيح وأدوات الفحص) عندما يكون مفتاح التقسيم لجدولDistributedتعبيرًا يختزله المحلِّل إلى قيمة ثابتة، مثلif(1, toInt32(id), toInt32(id) + 1)، معoptimize_skip_unused_shards = 1. #108737 (groeneai). - تم إصلاح إيقاف مفاجئ للخادم (
LOGICAL_ERROR/ فشل تأكيد في إصدارات التصحيح وأدوات الفحص) عند إلغاءINSERT ... SELECTعبر جدولAliasدون استثناء، مثلًا معtimeout_overflow_mode = 'break'. #108783 (groeneai). - تم إصلاح إيقاف مفاجئ للخادم (
LOGICAL_ERROR/ فشل تأكيد في إصدارات التصحيح وأدوات الفحص) عند إلغاءINSERT ... SELECTإلى جدولTimeSeriesدون استثناء، مثلًا معtimeout_overflow_mode = 'break'. #108796 (tiandiwonder). - إصلاح فشل الاستعلامات الموزَّعة أحيانًا بالخطأ
UNEXPECTED_PACKET_FROM_SERVER(“expected TablesStatusResponse, got ProfileInfo”) عند إعادة استخدام اتصال من المجمَّع خلّفه استعلام سابق مُلغى في حالة عدم تزامن. #108854 (alexey-milovidov). - إصلاح
LOGICAL_ERROR(CTE '...' does not have query tree, but was not planned yet) عند الإشارة إلى تعبير جدول شائعMATERIALIZEDمن أكثر من موضع في شجرة الربط (مثل استعلامين فرعيين مربوطين، أو استعلام فرعي مربوط إضافةً إلى استعلام فرعي قيَمي فيWHERE) ضمن استعلام على جدولDistributed. أصبح الاستعلام يُنفَّذ الآن بدلًا من إطلاق الاستثناء (الذي كان يوقف الخادم بشكل مفاجئ في إصدارات التصحيح وأدوات الفحص). #108924 (groeneai). - إصلاح مشكلة في أمان الذاكرة كان فيها العمل غير المتزامن المُجدوَل أثناء معالجة العرض المُجسَّد يواصل استخدام المحاسبة على مستوى الاستعلام بعد انتهاء الاستعلام. #108988 (filimonov).
- إصلاح خطأ
LOGICAL_ERROR(“Cannot find__grouping_setcolumn in header of MergingAggregatedTransform with grouping sets”، أو “Chunk info was not set for chunk in MergingAggregatedTransform”) الذي قد يحدث، عند عدم استخدام المحلل، في استعلاماتUNION ALL/INTERSECT/EXCEPTعندما يستخدم أحد الفروعGROUP BY GROUPING SETSمع النسخ المتماثلة المتوازية بينما يستخدم فرع آخرFINAL. #109003 (groeneai). - إصلاح فشل
CREATE TABLE ... AS SELECT FROM s3Cluster(...)(ودالات الجداول العنقودية الأخرى مثلfileCluster/urlCluster) بالخطأNOT_FOUND_COLUMN_IN_BLOCKداخل قاعدة بياناتReplicated. #109266 (groeneai). - إصلاح خطأ (
NOT_FOUND_COLUMN_IN_BLOCK، أوstd::bad_function_callفي الإصدارات الأقدم) عند تشغيلCREATE TABLE ... ON CLUSTER ... AS SELECTالذي يقرأ من جدولDistributedعلى عنقود يضم جزأين (shards) أو أكثر. #109407 (alexey-milovidov). - إصلاح خطأ داخلي مُربك (
Method getResultType is not supported for TABLE query tree node) عند استخدام تعبير جدول وسيطًا أيسر لعامل التشغيلIN؛ إذ تُنتج هذه الاستعلامات الآن رسالة خطأ واضحة. #109412 (alexey-milovidov). - إصلاح الخطأ المنطقي
Bad cast from type DB::FunctionNode to DB::ConstantNode(الذي يؤدي إلى إنهاء الخادم في إصدارات debug/sanitizer) عند تشغيلSELECT ... ORDER BY ... WITH FILLعلى جدولDistributedمع قيمة منخفضة للإعدادoptimize_const_name_size. #109938 (groeneai). - إصلاح خطأ
LOGICAL_ERROR(Left and right columns have same names) في مُحسِّن ترتيب عمليات الربط، كان من الممكن أن يحدث عند إجراء ربط بالفاصلة على عرض متعدد الجداول مع تفعيلquery_plan_merge_expression_into_join. #110227 (groeneai). - إصلاح الخطأ النادر
Logical error: 'No more packets are available.'الذي كان يظهر عند تنفيذ استعلام موزَّع صالح يتضمنLIMIT، وكان يؤدي إلى إنهاء الخادم في إصدارات debug وsanitizer. #110334 (groeneai). - إصلاح خلل في المحلل اللغوي كان يُعامِل فيه COMMENT خطأً على أنه اسم مستعار ضمني عندما ينتهي استعلام SELECT مباشرةً بعد معرّف جدول مجرد (مثل
... FROM t COMMENT 'x')، مما كان يتسبب في خطأ صياغة مضلل بدلًا من تطبيق التعليق على العرض/الجدول. #110372 (adityaksolves). - إصلاح نتيجة خاطئة كانت فيها
length()(وبُعد QBit) على عمودFixedStringتُعيد0بدلًا من الحجم الثابتNعند استخدام النسخ المتماثلة المتوازية إذا تضمّن الاستعلام مرشحًا انتقائيًا. #110427 (groeneai). - إصلاح الخطأ
NOT_FOUND_COLUMN_IN_BLOCKفي الاستعلامات التي تتضمن استعلامًا فرعيًا فيFROMعند تشغيل النسخ المتماثلة المتوازية في وضعcustom_key_sampling/custom_key_range. كانت هذه الاستعلامات (مثلSELECT * FROM (SELECT id, k, v FROM t WHERE id < 20) ORDER BY k) تفشل سابقًا بالخطأNot found column __table2.id in block .... #110690 (groeneai). - إصلاح
Logical error: 'clock'(يتعطل الخادم في إصدارات debug/sanitizer، ويحدث تعليق لا نهائي في إصدارات release) عند تشغيلEXPLAIN ANALYZEعلى استعلام يتضمن قراءة دفقية (FROM ... STREAM) ليست تعبير جدول بسيطًا في المستوى الأعلى، كأن تكون متداخلة في استعلام فرعي (مثلًا داخلWHERE ... IN (...)أو تعبير جدول شائع)، أو مخفية خلف عرض عادي أو عرض ذي معاملات. أصبحEXPLAIN ANALYZEيرفض مثل هذه الاستعلامات بالخطأNOT_IMPLEMENTED، تمامًا كما كان يرفض من قبل القراءة الدفقية في المستوى الأعلى. #110935 (groeneai). - إصلاح تحليل أسماء الأعمدة المؤهلة بالكامل مثل
db.table.columnفي المحلّل للجداول التي تحمل اسم قاعدة البيانات نفسه. #110976 (alexey-milovidov). - إصلاح أخطاء
NOT_FOUND_COLUMN_IN_BLOCK/THERE_IS_NO_COLUMN(ونتائج خاطئة دون أي تنبيه في بعض الإصدارات) فيRIGHT JOINعند تعيينparallel_replicas_min_number_of_rows_per_replicaوإسقاط عمود من الجدول الأيسر. #111332 (groeneai). - إصلاح حالة تسابق في دوال UDF القابلة للتنفيذ، ومحرك الجداول
executable، والقواميس القابلة للتنفيذ، إذ كان استدعاءfcntlعلى واصف ملف مُغلق مسبقًا قد يُفسد واصفًا لا علاقة له تابعًا لاستعلام متزامن (بإزالةO_NONBLOCK)، مما قد يؤدي إلى تعليق الاستعلامات إلى أجل غير مسمى. #111779 (Algunenano). - إصلاح
LOGICAL_ERROR(“Invalid number of rows in Chunk”)، وكذلك إنهاء قسري مرتبط به بسبب تجاوز الحدود في الإصدارات المحصّنة، عند استخدامORDER BY ... WITH FILL ... INTERPOLATEعلى جدولDistributedذي مقطعين أو أكثر، أو علىclusterAllReplicas، أو على نسخ متماثلة متوازية بمفتاح مخصص، حتى عندما تكون النتائج فارغة. أصبحWITH FILLيُطبَّق فقط على العقدة التي تُنتج النتيجة النهائية، مما يعالج أيضًا تكرار صفوف التعبئة المولَّدة عبر المقاطع/النسخ المتماثلة. #111919 (yakov-olkhovskiy). - إصلاح تعليق
DROP TABLE ... SYNCإلى ما لا نهاية عند إنهاء استعلام علىsystem.replicasقبل معالجة طلبات الحالة الخاصة به. #112164 (evillique). - إصلاح استثناء
LOGICAL_ERROR(Block structure mismatch in joined block stream) في عمليات الربط متعددة الجداول التي لا يُنتج فيها أيٌّ من الربطين الفرعيين أعمدة إخراج، مثلSELECT count() FROM t1, t2, t3, t4 WHERE (t1.b = t2.b) AND (t3.a = t4.a)مع تعيينquery_plan_optimize_join_order_limitإلى0أو1. #112205 (groeneai). - إصلاح الخطأ المنطقي
Cannot add step Expression to QueryPlan because it has incompatible header with root step JoinLazyColumnsStepفي الاستعلامات التي تحتوي علىFINALومرشحPREWHEREوLIMITصغير وmake_distributed_plan = 1، عندما تُدرج الأعمدة المحددة بترتيب يختلف عن ترتيب أعمدة الجدول. كان التجسيد الكسول يستبدل عقدة في الخطة دون الحفاظ على ترويسة إخراجها، مما يجعل خطة الاستعلام غير متسقة. #112303 (groeneai). - إصلاح نتائج خاطئة وخطأ منطقي عندما تأتي وسيطة يجب أن تكون ثابتة، مثل مقياس
toDecimal32أو المنطقة الزمنية فيtoDateTime، من استعلام فرعي عددي مع استخدام المحلّل القديم. كانت هذه الوسيطة تُحلَّل كما لو كانت قيمتها صفرًا أو فارغة، فيتعارض نوع النتيجة المُعلَن مع القيمة المحسوبة، وكانCREATE VIEWوCREATE MATERIALIZED VIEWيحفظان نوع عمود خاطئًا. #112492 (groeneai). - إصلاح خطأ منطقي وسجل تبعية غير صحيح عندما يشير متن
VIEWعادي إلى جدول أو قاموس عبر معامل استعلام، كما فيCREATE VIEW v AS SELECT x FROM {db:Identifier}.t. لم يعد مثل هذا العرض يسجّل تبعية مرجعية على جدول يحمل الاسم نفسه في قاعدة البيانات الحالية، وبذلك أصبح بالإمكان مجددًا حذف الجداول غير المرتبطة به. #112704 (groeneai). - إصلاح خطأ منطقي عند استخدام محرك الجدول
Joinفي الطرف الأيمن من عملية JOIN يحتوي قسمONفيها على شرط يشير إلى أعمدة من كلا الجدولين، مثلON (t.key = j.key) AND (t.a < j.a). أصبح مثل هذا الاستعلام يُرفض الآن باستثناء واضح بدلًا من إطلاقrequired columns: ... but not found any in left tableأوstd::bad_variant_access. #112815 (groeneai). - إصلاح سلوك غير محدد وخطأ جدولة صامت عند جدولة مهمة خلفية بتأخير كبير جدًا، كما يحدث مثلًا مع عرض مُجسَّد قابل للتحديث ذي فترة
REFRESH AFTERضخمة. أصبحت قيم التأخير الآن محصورة في أكبر قيمة قابلة للتمثيل بدلًا من أن تتجاوز السعة. #113041 (groeneai). - تصحيح الخطأ المُبلَّغ عنه عندما تحتاج عملية
INSERTغير متزامنة في جدولDistributedإلى دليل قائمة انتظار يتجاوز اسمه حد نظام الملفات البالغ 255 بايت (وهي حالة قد تحدث عند استخدامuse_compact_format_in_distributed_parts_names = 0). كان الخطأ المُبلَّغ هوLOGICAL_ERRORبالنسبة إلى جزء (shard) يستخدمinternal_replication، وCode: 1001. std::exceptionدون تحديد مصدره في الحالات الأخرى؛ أما الآن فتُبلّغ كلتا الحالتين عنARGUMENT_OUT_OF_BOUNDمع ذكر الجدول والعنقود والحد. #113083 (groeneai). - أصبح بالإمكان الآن مقاطعة
UNDROP TABLEباستخدامKILL QUERYأثناء انتظاره أن تحرّر الاستعلامات قيد التنفيذ الجدولَ المحذوف. #113263 (alexey-milovidov). - إصلاح تعليق دائم في
DROP TABLEوتسرّب في الذاكرة بعد فشل استعلام يستخدم تعبير جدول شائعًا مُجسَّدًا. كان الجدول يظل عالقًا في قائمة انتظار الحذف إلى أن تتم إعادة تشغيل الخادم. #113397 (tiandiwonder). - إصلاح عطل تجزئة (segfault) وخطأ
LOGICAL_ERROR(No host found for exchange stream final_result__0_0) عندما يضبط استعلام فرعي الإعدادdistributed_plan_execute_locallyفي عبارةSETTINGSالخاصة به مع تفعيلmake_distributed_plan. كانت الخطة الموزّعة والشيفرة المنفِّذة لها تقرآن الإعداد من سياقين مختلفين، فقد تختلف قيمته بينهما، مما يجعل المُبادِر يبني خط معالجة متناقضًا ذاتيًا. #113422 (groeneai). - إصلاح مشكلة تعذّر إنهاء
CREATE TABLE ... AS SELECTعند فشل استعلامSELECTالمسؤول عن ملء البيانات، وذلك عند تفعيلdatabase_atomic_wait_for_drop_and_detach_synchronously: إذ كانت عمليةDROPالداخلية لتنظيف الجدول المؤقت تنتظر قائمة انتظار الحذف في الخلفية متجاهلةً كلًا منKILL QUERYوmax_execution_time. #113504 (groeneai). - إصلاح نتائج خاطئة، وتوقف بسبب فشل تأكيد (assertion) في الإصدارات المبنية مع تفعيل التأكيدات، عند تنفيذ
JOINمع قاموس تحتوي عبارةONفيه على شرط غير قائم على المساواة يشمل كلا الجدولين، مثلON (t.key = d.key) AND (t.a * 10 < d.a)، مع تفعيلjoin_use_nulls. كان الشرط يُقيَّم على عمود مقروء بنوع غير مطابق، مما قد يؤدي إلى تطابق الصفوف بشكل عشوائي. #113534 (alexey-milovidov). - تم إصلاح مشكلة فقدان العرض ذي المعاملات (parameterized view) لقاعدة بياناته عند إرسال استعلام يشير إليه دون تأهيل إلى مقطع، إذ كان المقطع يحلّ الاسم وفق قاعدة البيانات الافتراضية الخاصة به. وبحسب محتوى تلك القاعدة، كان الاستعلام إما يفشل مع
UNKNOWN_FUNCTIONأو يُرجع بصمت صفوفًا من عرض مختلف. تؤثر هذه المشكلة فيINوJOINوremote()عبر جدولDistributed. #113550 (groeneai). - تم إصلاح الخطأ
Unsupported JOIN keys of type keys256 in StorageJoinعند قراءة جدول بمحركJoinيكون مفتاحه مركّبًا (عدة أعمدة) أو قيمة واحدة بحجم 16/32 بايت مثلUUIDأوInt256أوFixedString(4). فقد كان من الممكن إنشاء مثل هذا الجدول والكتابة فيه وإجراء الربط معه، لكن تعذّرت قراءته باستخدامSELECTعلى الإطلاق. #113578 (groeneai). - إصلاح الخطأ المنطقي
Sending a distributed query with unknown (zero) client versionعند إرفاق جدولDistributedبلا بنية فوق مقطع بعيد أو تحميله من بيانات وصفية كتبها إصدار أقدم من الخادم. #113675 (alexey-milovidov). - تم إصلاح الخطأ
LOGICAL_ERRORعند استخدامSELECTللمُعدِّلSTREAMعلى جدول مُسمّى مع تفعيل النسخ المتماثلة المتوازية في وضع مهام القراءة. فعند استخدام تعبير جدول شائع مُجسَّد كمجموعةINفيPREWHERE، كان الخادم يُطلق الخطأReading from materialized CTE ... DelayedPortsProcessor gate is missing in the query plan(ويتوقف الخادم في إصدارات debug وsanitizer). أصبح الجدول الذي يحملSTREAMيُرفض الآن عند طلب النسخ المتماثلة المتوازية: فعندenable_parallel_replicas = 2يفشل الاستعلام معSUPPORT_IS_DISABLED، وعند1يُنفَّذ دونها، تمامًا كما هو الحال معFINAL. #113754 (groeneai). - إصلاح التعقيد التربيعي في تحليل وسيط العنوان لدالات الجداول
remoteوmysqlوما شابهها: إذ كان العنوان الطويل جدًا (مثلFixedStringبحجم ميغابايت مُبطَّن بالأصفار) يتسبب في تعليق الاستعلام أثناء التحليل دون إمكانية إلغائه. #113918 (alexey-milovidov). - تم إصلاح الخطأ الزائف
Failed to drop temporary table after refresh. Table ... is left behind and requires manual cleanup.الذي كان يُسجَّل عند إلغاء تحديث عرض مُجسَّد قابل للتحديث (مثلًا بسبب إيقاف تشغيل الخادم) مع تفعيلdatabase_atomic_wait_for_drop_and_detach_synchronously. والواقع أن الجدول المؤقت كان يُحذف فعلًا، فلم تكن هناك حاجة إلى أي تنظيف يدوي. #113957 (groeneai). - إصلاح غياب صف في
system.query_views_logلعرض مُجسَّد يفشل أثناء جمع تبعياته مع تفعيلmaterialized_views_ignore_errors. وفي إصدارات debug وsanitizer كان ذلك يؤدي أيضًا إلى إيقاف الخادم معstd::out_of_rangeبدلًا من تسجيل العرض. #114064 (groeneai). - إصلاح النتائج غير المتسقة عند دفع مُرشِّح على عمود غير مفتاحي من الجدول الأيمن إلى ما دون ANY INNER JOIN. #114313 (kirillshokhin).
- إصلاح تسرّب جدول داخلي
_tmp_replace_*عند تنفيذCREATE OR REPLACE، وفشلCREATE OR REPLACE VIEWمعNOT_IMPLEMENTED، عند ضبطignore_drop_queries_probability. فعمليات DROP التي يُصدرها داخليًا ما هي إلا خطوات ضمن عبارة واحدة للمستخدم، لذا لم يعد حقن أعطال DROP يُطبَّق عليها. #114420 (groeneai). - تم إصلاح خطأ
LOGICAL_ERRORعند قراءة جدول Delta Lake يُسمّي فيهmetaData.partitionColumnsعمودًا لا يُعرّفهmetaData.schemaString. أصبحت هذه البيانات الوصفية تُرفض الآن بالخطأBAD_ARGUMENTSفي قارئ delta-kernel وبالخطأINCORRECT_DATAفي القارئ القديم، في كل مرة يُقرأ فيها الجدول أو مخططه من لقطة، وليس فقط عندما يتضمن الاستعلام مسندًا. #114538 (groeneai). - تم إصلاح مشكلة كانت تؤدي إلى تعطيل إحصاءات جداول التجزئة — ومعها التخصيص المسبق لجداول التجزئة الخاصة بالتجميع — بصمت وبشكل دائم على مستوى الخادم بأكمله، عندما يكون استعلام يستخدم تحسين
FINALالمؤجَّل (query_plan_optimize_lazy_final) أول عملية تجميع تُنفَّذ بعد بدء تشغيل الخادم. #114597 (alexey-milovidov). - تم إصلاح تسرّب جدول الهدف المُستبدَل في العرض المُجسَّد القابل للتحديث عند تفعيل
ignore_drop_queries_probability. فعمليةDROPالتي يُصدرها التحديث لتنظيف جدول الهدف السابق هي خطوة من خطوات التحديث، وليست عمليةDROPطلبها المستخدم، لذا لم يعد حقن الأعطال يُطبَّق عليها. #114622 (groeneai). - إصلاح مشكلة في
ANY RIGHT JOINوSEMI RIGHT JOINمع عدة شروط مربوطة بـORفي قسمON، كانت تؤدي إلى إرجاع بعض صفوف الجدول الأيمن مرتين وفقدان تطابقات صفوف أخرى. وقد تأثر أيضًاANY LEFT JOINالمكتوب صراحةً، لأن المُخطِّط قد يبدّل الجدولين وينفّذه على أنهANY RIGHT JOIN. #114676 (vdimir). - إصلاح خطأ
LOGICAL_ERROR(Cannot find input column ... on its position in inputs of expression actions DAG) عندما يحتوي الاستعلام علىJOINفوق جدول يُستخدم عموده المفهرس نصيًا في مسند بحث نصي ضمن كلٍّ منPREWHEREوWHERE. #114771 (groeneai). - إصلاح ظهور الخطأ
NOT_FOUND_COLUMN_IN_BLOCKعند كل عمليةINSERTفي جدول يُعرّفSTATISTICS(...)على عمودALIASأوEPHEMERAL، مما كان يجعل هذه الجداول للقراءة فقط عمليًا. #115231 (groeneai). - إصلاح
dictGetومتغيراتها في الاستعلامات الموزعة: أصبح اسم القاموس غير المؤهَّل يُربط الآن بقاعدة البيانات الحالية لدى المُبادِر، بدلًا من تحديده وفق قاعدة البيانات الحالية لكل جزء، حيث كان إما لا يُعثر عليه أو يُشير إلى قاموس آخر يحمل الاسم نفسه. #115541 (alexey-milovidov). - تم إصلاح خلل كانت فيه استعادة قاعدة بيانات أو جدول باسم جديد تؤدي إلى حذف الأسماء البديلة للجداول من نصوص تعريف العروض المخزَّنة، فتفشل قراءة العرض المُستعاد بالخطأ
UNKNOWN_IDENTIFIER. #115645 (groeneai). - إصلاح خطأ
LOGICAL_ERROR“Reading from materialized CTE ‘X’ before its materialization completed - DelayedPortsProcessor gate is missing in the query plan” عند قراءة تعبير جدول شائعMATERIALIZEDمن داخل استعلام فرعيINعلى جدولDistributed. #115740 (groeneai). - إصلاح الخطأ BAD_ARGUMENTS “Dictionary not found” عند استدعاء dictGet بعد أمر DETACH DICTIONARY … PERMANENTLY رفضه فحص التبعيات (HAVE_DEPENDENT_OBJECTS). يظل القاموس الآن قابلًا للاستخدام بالكامل عند رفض عملية الفصل. #105259 (groeneai).
- إصلاح الخطأ
Logical error: 'removed'(الذي يتسبب في إيقاف الخادم قسرياً في إصدارات التصحيح) في قائمة انتظار حذف الجداول في الخلفية. كان هذا الخطأ قد يحدث عند إعادة استخدام معرّف UUID صريح نفسه في عدة استعلاماتCREATE OR REPLACE TABLE، مما يؤدي إلى إدراج أكثر من جدول محذوف يحمل معرّف UUID ذاته في قائمة الانتظار. #107031 (groeneai). - إصلاح توقف
MaterializedPostgreSQLعن تماثل قاعدة بيانات بأكملها (مع الخطأLOGICAL_ERROR: Columns number mismatch) عند تغيّر بنية جدول متماثل واحد أثناء توقف الخادم. أصبح الآن يُتخطّى الجدول المتأثر وحده، ويمكن استعادته باستخدامDETACH/ATTACH. #107427 (alexey-milovidov). - إصلاح خلل حاد في توزيع العمل عند استخدام النسخ المتماثلة المتوازية إذا كان العنقود يحتوي على نسخ متماثلة غير نشطة (مثل الإدخالات القديمة المتبقية بعد التوسع التلقائي). لم يعد منسق القراءة يحتسب هذه النسخ المتماثلة، فيتوزع العمل بتوازن على النسخ المتماثلة المتصلة بدلاً من تكدّسه على نسخة واحدة. #107805 (alexey-milovidov).
- إصلاح تجمّد
SYSTEM RELOAD DICTIONARIES(وRELOAD DICTIONARY) عندما تتشارك قواميس MySQL عديدة معرّفة في XML مجمّع اتصالات واحداً عبرshare_connection. أصبحت هذه المجمّعات الآن تلتزم بالإعدادينconnection_pool_sizeوconnection_wait_timeout(القيمة الافتراضية 5 ثوانٍ) من التهيئة، على غرار القواميس المعرّفة عبر named collections. #108083 (alexey-milovidov). - منع استنفاد محاولات إعادة التنفيذ لأوامر distributed DDL المتماثلة التي ينفذها القائد من حظر استعلامات DDL اللاحقة من نوع
ON CLUSTERحظراً دائماً. #108505 (ahaanlimaye). - إصلاح انهيار محتمل (استخدام الذاكرة بعد تحريرها) عند تشغيل
SYSTEM FLUSH DISTRIBUTEDبالتزامن معDROP TABLEعلى جدولDistributedنفسه. #108684 (groeneai). - إصلاح الخطأ
LOGICAL_ERROR(local_replica_plan_reading_step->getAnalyzedResult() == nullptr) في مخطِّط النسخ المتماثلة المتوازية التلقائي، والذي كان قد يحدث عند تفعيلautomatic_parallel_replicas_modeمع تعيينparallel_replicas_min_number_of_rows_per_replicaإلى قيمة أكبر من 0. #109011 (groeneai). - إصلاح الخطأ
LOGICAL_ERROR(creation_csn is not set while removal_csn is set to 1) الذي كان قد يُطلَق عند تشغيلTRUNCATEغير معاملاتي بالتزامن مع معاملة غير مثبّتة أدرجت بيانات في الجدول نفسه. لم يعدTRUNCATEفي هذه الحالة يزيل الأجزاء التي أنشأتها معاملات لم تُثبَّت بعد. #109598 (tuanpach). - لم تعد محركات قواعد البيانات الخارجية (مثل
PostgreSQL) تمرّر مقارنات النطاق (>=،>،<=،<) على أعمدةUUIDإلى المصدر الخارجي. فنظراً لاختلاف ترتيب معرّفات UUID بين ClickHouse وقواعد البيانات الخارجية، كان تمرير هذه المقارنات يؤدي إلى إسقاط صفوف من النتيجة دون أي تنبيه؛ وأصبح ClickHouse نفسه يتولى الآن تقييم هذه الشروط. #109833 (vismaytiwari). - إصلاح انهيار الخادم في محرك قاعدة البيانات
MaterializedPostgreSQL، والذي كان قد يحدث عند فصل جدول (أو تغيّر بنيته) بينما لا يزال في قائمة انتظار المزامنة. #110596 (alexey-milovidov). - إصلاح مشكلة إعادة كتابة نوع العمود
EPHEMERALبواسطة قواعدquery_masking_rulesالخاصة بالخادم. إذ كانت أي قاعدة تطابق جزءاً من النوع تتسبب في تخزينCREATE TABLEلنوع خاطئ، أو في فشله. #112048 (alexey-milovidov). - إصلاح حالة underflow في عدد صحيح بلا إشارة ضمن فحص طول اسم الجدول، كانت تسمح بإنشاء جدول يتعذّر حذفه نهائيًا. فعندما كان طول اسم قاعدة البيانات بعد التهريب يبلغ 214 بايت، كان الحد المحسوب لاسم الملف
metadata_droppedيلتف، فيُقبل الأمرCREATE TABLEبينما يفشل لاحقًا الأمرDROP TABLEأوDROP DATABASEمع الخطأFile name too long. أصبح مثل هذا الاسم يُرفض الآن مع الخطأARGUMENT_OUT_OF_BOUND، وهو الخطأ نفسه الذي كان يُعاد أصلًا للأسماء التي تقل عن ذلك الحد مباشرةً. #112527 (groeneai). - إصلاح تحقُّق
RENAME TABLEمن الحد الأقصى لطول اسم الجدول استنادًا إلى قاعدة البيانات المصدر بدلًا من قاعدة البيانات الوجهة. فقد كان نقل جدول بإعادة تسميته إلى قاعدة بيانات ذات اسم طويل قد يُنتج جدولًا يعجزDROP TABLEعن إزالته، في حين كان نقل جدول بإعادة تسميته من مثل هذه القاعدة يُرفض عن طريق الخطأ. #113019 (groeneai). - إصلاح العمود
viewsفيquery_logالذي كان يظل فارغًا دائمًا عند الإدراج في جدولAliasيُحفّز جدوله الهدف عروضًا مُجسَّدة. #113076 (eclbg). - أصبحت تعبيرات
parallel_replicas_custom_keyغير الصالحة، مثلtuple()أو(x, y)، تُرفض الآن مع الخطأILLEGAL_TYPE_OF_COLUMN_FOR_FILTERبدلًا من القراءة متجاوزةً حدود قائمة أنواع المفتاح المخصص. #113359 (nickitat). - إصلاح قبول
RENAME DATABASEلاسم هدف طويل إلى حدٍّ يجعل حذف جداول قاعدة البيانات مستحيلًا. يُنفَّذ فحص طول اسم الجدول الآن بغض النظر عن قيمةcheck_table_dependencies، كما يشمل الجداول المنفصلة التي لم تكن تخضع للفحص قط، ولذا كانت متأثرة حتى مع الإعدادات الافتراضية. #113557 (groeneai). - عند استخدام عمليات الإدراج في الخلفية ضمن جداول تعمل بالمحرك
Distributed، أصبحت فترات التأخير الناتجة عن تكرار الأخطاء أثناء إرسال البيانات إلى الأجزاء البعيدة تتناقص الآن بمجرد زوال الأخطاء. في السابق، كان التأخير يزداد فقط دون أن يُعاد ضبطه أبدًا. #87378 (Blackmorse). - رفض عمليات المصافحة في البروتوكول الأصلي التي تستخدم
USER_INTERSERVER_MARKERلعنقود غير معروف، أو لعنقود جرت تهيئته دون<secret>. في السابق، كانت مثل هذه المصافحة تتيح لعميل غير مُصادَق عليه الدخول في وضع الاتصال بين الخوادم واستخدام حزم البروتوكول السابقة للمصادقة (مثلTablesStatusRequest) المدعومة بـfake_interserver_context، فيحصل بذلك على معلومات عن الجداول المحلية دون أن يُثبت معرفته بـ secret الخاص بالـ cluster. #99675 (MillaFleurs).
إصلاحات SQL والمحلّل وعمليات الربط (JOIN)
- إصلاح استبدال معلمات الاستعلام داخل تعريفات عبارة
WINDOWالمسمّاة. في السابق، كانت المعلمات هناك تبقى دون استبدال بصمت، وقد تؤدي معلمةIdentifierغير المعيَّنة إلى إطلاق الاستثناءLogical error: '!part.empty()'أثناء تنفيذEXPLAIN SYNTAX. #110506 (alexey-milovidov). - إصلاح تعطّل نادر للخادم عند حذف العروض المُجسَّدة القابلة للتحديث أو استبدالها بشكل متزامن. كان يجري إلغاء مرجعية مؤشر فارغ في
RefreshTask::doSchedulingعندما يعيّن خيط آخر قيمةviewالخاصة بالمهمة إلىnullptrفي الوقت الذي تكون فيه شيفرة الجدولة قد حرّرت قفلها مؤقتًا. #105588 (groeneai). - إصلاح نتيجة خاطئة يُرجعها عرض معرَّف باستخدام
EXCEPTأوINTERSECTيكون معامله سلسلةUNION، وذلك بعدDETACH/ATTACHأو إعادة تشغيل الخادم. كان المنسِّق يُغفل الأقواس حول عناصرUNIONالفرعية ضمنINTERSECT/EXCEPT، فكانت شيفرة SQL المخزَّنة تُعاد معالجتها بأسبقية معكوسة. #105935 (groeneai). - إصلاح نتائج خاطئة (صفوف مكرَّرة) لاستعلام
SELECT DISTINCTالمطبَّق علىGROUP BYمعWITH CUBEأوWITH ROLLUPأوGROUPING SETSعلى المفاتيح نفسها. لم يعد التحسينquery_plan_remove_redundant_distinctيزيلDISTINCTفي هذه الحالات، لأن مُعدِّلات التجميع تُصدر صفوفًا إضافية تأخذ فيها أعمدة المفاتيح قيمها الافتراضية، وقد تتعارض هذه القيم مع قيم مجموعات حقيقية. #107072 (groeneai). - إصلاح نتيجة خاطئة في OUTER JOIN عندما يكون عامل التصفية
WHEREعبارة عطف تحتوي على حدّ ثابت (مثلp AND 1، أوWHERE p QUALIFY NULLحيث يُدمجQUALIFY NULLفيWHERE). كان من الممكن دفع الحدّ الثابت إلى الجانب غير المحفوظ من الربط وإزالته من عامل التصفية اللاحق للربط، فينتج الربط صفوفًا غير متطابقة تأخذ فيها أعمدة ذلك الجانب قيمها الافتراضية، فتجتاز هذه الصفوف عامل التصفية عن طريق الخطأ. #107084 (groeneai). - إصلاح خطأ
LOGICAL_ERROR(“Cannot find input column … on its position in inputs of expression actions DAG”) الذي كان يتسبب في إنهاء الخادم عند استخدام استعلام فرعي قيَمي مترابط على مصدر يُسقط معرّف العمود نفسه مرتين (مثلSELECT number, *) مع ضبطcorrelated_subqueries_default_join_kind = 'left'. #107112 (groeneai). - إصلاح خطأ
LOGICAL_ERROR(إنهاء الخادم في إصدارات التصحيح/المُعقِّم) عندما يستخدمJOINعامل المقارنة الآمن مع القيم الفارغة (<=>/IS NOT DISTINCT FROM) ويكون أحد المفاتيح استعلامًا فرعيًا قيَميًا، مثل... JOIN t2 ON (SELECT x FROM t1) <=> t2.k، مع المحلّل القديم (enable_analyzer = 0). أصبح مثل هذا الاستعلام يُرجع الآن خطأً عاديًاNOT_FOUND_COLUMN_IN_BLOCKبدلًا من خطأ منطقي. #108123 (groeneai). - إصلاح الاستثناءين
LOGICAL_ERROR(Join is supported only for pipelines with one output port) وNOT_IMPLEMENTED(MergeJoinAlgorithm is not implemented for strictness Semi) عند استخدامjoin_algorithm = 'full_sorting_merge'لربط من نوعSEMI/ANTI، بما في ذلك عمليات الربط الناتجة عن فك ترابط استعلام فرعي مترابط من نوعEXISTS. أصبحfull_sorting_mergeالآن يرفض تركيبات الصرامة/النوع التي لا يستطيع تنفيذها، فيلجأ المخطِّط إلى خوارزمية مُفعَّلة أخرى أو يُبلغ بتعذّر تنفيذ الربط. #108658 (groeneai). - تم إصلاح خلل كان يؤدي إلى احتواء صف
WITH TOTALSفي عمليةJOINعلى قيم افتراضية (مثل0) بدلًا من القيم الثابتة الناتجة عن استعلام فرعي ثابت في أحد طرفي الربط. ولم تكن النتيجة الخاطئة تظهر إلا مع بعض ترتيبات الربط أو عند استخدام الإعدادquery_plan_join_swap_table. #108807 (vdimir). - تم إصلاح توقف مفاجئ عند بدء التشغيل (
Cannot allocate ThreadStack،EINVAL) في إصدارات glibc العاملة على معالجات ذات حجم كبير لمكدس الإشارات (مثل Intel Sapphire Rapids / Granite Rapids مع نواة تدعم AMX)، إذ لم يكن حجم المكدس البديل للإشارات يُقرَّب إلى مضاعف لحجم الصفحة قبل استدعاءaligned_alloc. #108813 (groeneai). - إصلاح الخطأ المنطقي
Block structure mismatch in JoinStep(الذي يسبب توقف الخادم في إصدارات التصحيح/sanitizer) عند فك ترابط استعلام فرعي مترابط وتحويله إلى عملية ربط بينما تتضمن العلاقة المصدر اسم عمود مكررًا، مثلWITH t AS (SELECT number, * FROM numbers(3)) SELECT *, (SELECT t.number WHERE t.number >= 0) FROM tمعcorrelated_subqueries_default_join_kind = 'right'. #109114 (groeneai). - تم إصلاح مشكلة احتفاظ
CREATE USER ... HOST LIKE 'a', 'b'(وما يقابله فيALTER USER) بالنمط الأول فقط دون أي تنبيه. أصبحت جميع أنماطHOST LIKEالمحددة تُخزَّن الآن في قائمة المضيفين المسموح بهم للمستخدم. #109187 (groeneai). - إصلاح نتيجة غير متوقعة لـ
ANY JOINمع شرطONثابت (مثلt1 ANY INNER JOIN t2 ON 1): كان الاستعلام يُرجع حاصل الضرب الديكارتي الكامل بدلًا من نتيجة ربط ANY #109207 (vdimir). - تم إصلاح عدم فرض الحد العام
max_rows_in_join/max_bytes_in_joinعلى خوارزمية الربط parallel_hash، إذ كان الاستعلام الذي يستخدمjoin_overflow_mode = 'throw'قد ينجح دون أي تنبيه بدلًا من إطلاق الخطأSET_SIZE_LIMIT_EXCEEDED. #109488 (m-selmi). - تم إصلاح فقدان صامت للبيانات عندما يلي
INSERT ... VALUESضمن دفق متعدد الاستعلامات تعليقُ SQL في نهايته (مثلVALUES (1) -- comment) في مسار تحليل الإدراج المضمّن على جانب الخادم (send_table_structure_on_insert_with_inline_data = 0). فقد كان التعليق الختامي يُقرأ على أنه بيانات صفوف بعد علامة الإنهاء;، مما أدى إلى تخطي الاستعلامات التالية في الدفق دون أي تنبيه. #109643 (groeneai). - تم إصلاح
PREWHEREالمؤجَّل معoptimize_move_to_prewhere = 1عند تنفيذPREWHEREبعدFINAL: لم تعد شروطWHEREتُنقل إلى ما قبل سياسة الصفوف المؤجَّلة، وهو ما كان قد يغيّر نتائج الاستعلام. #109703 (yariks5s). - إصلاح الخطأ
LOGICAL_ERROR(query tree node does not have valid source node) الذي كان يحدث عندما يحلّ تعبير الجدول الشائع التكراري معرّفًا من نطاق خارجي بوصفه عمودًا مترابطًا (معallow_experimental_correlated_subqueries = 1). أصبحت هذه الاستعلامات تُرجع الآن خطأً واضحًا هوUNSUPPORTED_METHOD. #109863 (groeneai). - إصلاح تجاوز سعة عدد صحيح ذي إشارة عندما يتخطى
ORDER BY ... WITH FILLفجوة كبيرة جدًا في عمود من نوعInt64/UInt64(مثل خطوة قدرها 2 عبر فجوة تقارب 2^63). كان هذا التجاوز يُعدّ سلوكًا غير معرَّف عند استخدام أدوات sanitizer، بينما كانت القيمة تلتفّ بصمت في إصدارات النشر. #109937 (groeneai). - إصلاح الخطأ المنطقي
Invalid number of rows in Chunkالذي يحدث عندما يكون هدفINTERPOLATEاسمًا بديلًا لعمودWITH FILLمع المحلّل القديم (enable_analyzer = 0). أصبحت مثل هذه الاستعلامات تُرفض الآن مع الخطأ الواضحINVALID_WITH_FILL_EXPRESSION. #110103 (groeneai). - إصلاح خطأ منطقي (
Unexpected number of columns in result sample block) يحدث عند تحسين مرشِّح يحتوي على استعلام فرعي مترابط (مثلexists((SELECT ...))) باستخدامconvert_query_to_cnfأوoptimize_and_compare_chain. #110187 (alexey-milovidov). - أصبح الاستعلام الفرعي المترابط المتداخل
EXISTSالذي يشير إلى عمود من نطاق أبعد من استعلامه الخارجي المباشر (متخطيًا نطاقًا وسيطًا) يفشل الآن مع الخطأ الواضحNOT_IMPLEMENTEDبدلًا من الخطأ الداخليNOT_FOUND_COLUMN_IN_BLOCK. #110310 (groeneai). - إصلاح النتائج الخاطئة الناتجة عن الاستعلامات الفرعية المترابطة ذات القيمة المفردة عندما يحتوي الاستعلام الخارجي على قيم مكررة للعمود المترابط ويُفكّ ترابط الاستعلام الفرعي عبر مسار CROSS JOIN. في السابق، كانت دوال التجميع مثل
count()وsum()تُضرب في عدد التكرارات. يؤثر هذا في الميزة التجريبيةallow_experimental_correlated_subqueries. #110311 (groeneai). - إصلاح عدم التزام
ORDER BY ... WITH FILLبالإعدادmax_execution_timeوبطء إلغائه عند توليد نطاق ملء كبير (لا سيما معINTERPOLATE). #110332 (alexey-milovidov). - لم يعد تحسين
FINALالكسول (query_plan_optimize_lazy_final، المعطَّل افتراضيًا) يُطبَّق عندما يقرأ الاستعلام البيانات بترتيب مفتاح الفرز، لأن خطته البديلة لا تُنتج الصفوف بترتيب مفتاح الفرز، في حين قد تكون الخطة الأعلى معتمدة على هذا الترتيب بعد تحسين القراءة بالترتيب، مما قد يؤدي إلى نتائج مرتبة بشكل غير صحيح. كذلك لم يعد يُطبَّق عندما يُطبَّقLIMITأصغر من عدد الصفوف المطلوب قراءتها مباشرةً على خطوة القراءة، إذ إن مرحلة بناء المجموعة الإلزامية تُفقد الإنهاء المبكر جدواه. #110576 (KochetovNicolai). - أصبحت عملية تفريغ الإدراج غير المتزامن في الخلفية تتوقف فورًا عند إنهائها باستخدام
KILL QUERY؛ إذ كان تفريغ حمولة كبيرة مخزنة مؤقتًا يواصل التحليل سابقًا حتى النهاية متجاهلًا الإلغاء. #110652 (tiandiwonder). - إصلاح النتائج الخاطئة الناتجة عن
GROUP BY ... optimize_aggregation_in_orderوDISTINCT ... optimize_distinct_in_orderعند وضعهما فوق ربطpartial_merge. كان تحسين القراءة بالترتيب يُمرَّر عبرPartialMergeJoin، الذي يعيد فرز مدخله الأيسر حسب مفتاح الربط، وبالتالي لا يحافظ على الترتيب الأصلي للتدفق الأيسر، مما أدى إلى تجميع الصفوف بشكل غير صحيح. #110671 (groeneai). - إصلاح حالة كان يفشل فيها الاستعلام مع الخطأ UNKNOWN_IDENTIFIER عند استخدام أسماء بديلة لأعمدة تعبير الجدول الشائع مع استعلامات
INTERSECTأوEXCEPT، مثلWITH t (a, b) AS (SELECT 1, 2 INTERSECT SELECT 1, 2) SELECT a, b FROM t. #110885 (yariks5s). - إصلاح الخطأ
LOGICAL_ERROR: ReadBuffer is canceled. Can't read from it.الذي قد يحدث في ربطgrace_hashعند فشل قراءة الكتل المُفرَّغة إلى القرص في منتصف القراءة أثناء مشاركة عدة خيوط للقارئ نفسه. #111056 (groeneai). - إصلاح خلل كان يؤدي إلى استخدام المنطقة الزمنية الخاطئة عند تجسيد أعمدة الجانب الأيمن أثناء عمليات *_hash JOIN. #111074 (yariks5s).
- إصلاح عبارات
CREATEالتي تتضمن عبارةCOMMENTبحيث تُطلق خطأً نحويًا عند غياب السلسلة النصية للتعليق، بدلًا من قبول استعلام أُسيء تحليله دون أي تنبيه (على سبيل المثال، لم يعدCREATE VIEW v COMMENT AS SELECT 1يُنشئ عرضًا بلا تعليق). #111159 (tiandiwonder). - إصلاح الخطأ
LOGICAL_ERROR(Reading from materialized CTE '...' before its materialization completed - DelayedPortsProcessor gate is missing in the query plan) الذي كان يحدث عند قراءة تعبير جدول شائع مُجسَّد مُعاد استخدامه (enable_materialized_cte) في فرع يُتجاهَل فيه خرجWITH TOTALSأوextremes، بما في ذلك التجميع الخارجي وINSERT ... SELECTوعمليات المجموعات وEXPLAIN ANALYZE. #111194 (groeneai). - إصلاح مشكلة كانت فيها
join_algorithm = 'full_sorting_merge'تملأ الصفوف غير المرتبطة فيLEFT/RIGHT/FULL/ASOFJOINبقيمة صفرية خام بدلًا من القيمة الافتراضية لنوع العمود. ففي حالة عمود من النوعEnum(قيمته الافتراضية هي عنصره الأول وليست0)، أدى ذلك إلى نتائج خاطئة (إذ كان المرشِّح المطبَّق على القيمة المُضافة يُسقط الصفوف غير المتطابقة، فيتحول الربط الخارجي دون أي تنبيه إلى ربط داخلي)، وإلى ظهور الخطأUNKNOWN_ELEMENT_OF_ENUMعند تحديد العمود. #111197 (groeneai). - إصلاح النتائج الخاطئة من
SummingMergeTree(وCoalescingMergeTree) معFINALعندما يكونoptimize_move_to_prewhere_if_final = 1وتكون عبارةWHEREشرطًا منطقيًا ضمنيًا على أحد أعمدة مفتاح الفرز (مثلWHERE k). إذ كان عمود المفتاح يُعاد مجموعًا عبر أجزاء البيانات غير المدمجة بدلًا من الإبقاء على قيمته. #111342 (groeneai). - إصلاح خطأ منطقي (
Unexpected number of columns in result sample block) قد يحدث فيRIGHT/FULL JOINعندما يتضمن الجانب الأيسر عمودًا مكررًا بالاسم نفسه (مثل1 AS b, 1 AS b) ويظل قائمًا بعدUNION ALL. #111554 (groeneai). - إصلاح انهيار العميل عند تنسيق استعلام
EXECUTE ASاستُبدل أحد العناصر الفرعية في شجرة AST الخاصة به (كما يفعل مُولِّد AST). أصبحASTExecuteAsQueryالآن يمتلك عنصريه الفرعيينtarget_userوsubqueryبدلًا من الاحتفاظ بمؤشرات غير مالكة إلىchildren. #111725 (groeneai). - إصلاح النتائج الخاطئة عندما يُبدِّل
query_plan_join_swap_tableجانبيANY JOINمع ضبطjoin_any_take_last_row = 1: أصبح ClickHouse الآن يحافظ على الترتيب الأصلي لجانبي الربط، فيواصلANY JOINإعادة آخر صف مطابق. #112458 (vdimir). - إصلاح الاستثناء
Context has expiredعند استخدامgetClientHTTPHeaderداخل استعلام فرعي. #112533 (alexey-milovidov). - إصلاح النتائج الخاطئة لعملية
JOINتتضمن عبارةONفيها شرطًا مختلطًا، أي شرطًا متبقيًا غير قائم على التساوي يربط بين الجانبين، مثلON (t1.key = t2.key) AND (t1.a * 10 < t2.a). فخوارزميات عائلة التجزئة وحدها هي التي تُقيِّم مثل هذا الشرط، غير أنfull_sorting_mergeوpartial_mergeوالربط المباشر من نوع مفتاح-قيمة كانت تُعلن قدرتها على تنفيذ عمليات الربط هذه ثم تتجاهل الشرط المتبقي دون أي تنبيه، فتُعيد صفوفًا زائدة. أصبحت هذه الخوارزميات الآن ترفض تنفيذها، فتُستخدم خوارزمية تجزئة بدلًا منها. #112831 (groeneai). - إصلاح النتائج الخاطئة لعمليات الربط بالفاصلة أو
CROSSالتي تقارن عبارةWHEREفيها بين أعمدة جدولين عبر تعبير غير حتمي مثلrand. فقد كان هذا الاستعلام قد يُرجع صفوفًا تتعارض مع عبارةWHEREالخاصة به، لأن إعادة كتابة الربط إلى ربطINNERكانت تنقل التعبير إلى مفتاح الربط، حيث يُقيَّم مجددًا لكل صف من كل جانب. #112938 (groeneai). - إصلاح تباطؤ تربيعي عند تحليل استعلام PromQL ينتهي بسلسلة طويلة من المحارف غير المعروفة (مثل قيمة
FixedStringمبطّنة ببايتات NUL): فقد كان تحليل مُدخل غير صالح بحجم ميغابايت يُبقي خيط التنفيذ مشغولًا لعشرات الدقائق دون إمكانية إلغائه، لأنه يجري أثناء مرحلة تحليل الاستعلام. أصبح المحلّل الآن يتوقف عند أول خطأ. #112944 (alexey-milovidov). - إصلاح التفاف
intDivبصمت عند قسمة أصغر عدد ذي إشارة (مثلintDiv(-9223372036854775808, -1)) على عمود غير ثابت بمقسوم عليه ثابت يساوي -1، بدلًا من إطلاق الاستثناءILLEGAL_DIVISIONكما تفعل مسارات التنفيذ الأخرى. وقد كان هذا الالتفاف الصامت يُنتج أيضًا نتائج خاطئة لـORDER BY/DISTINCT، لأن تحسين القراءة بالترتيب يعاملintDivعلى ثابت سالب بشكل صحيح على أنها دالة رتيبة، بينما كانت القيمة الملتفّة تخالف ترتيب الفرز الناتج. #113048 (alexey-milovidov). - إصلاح الخطأ
UNKNOWN_IDENTIFIERمعenable_analyzer = 0عندما تشير عبارةWHEREإلى عمود ناتج عنuntupleداخل استعلام فرعي، مثلSELECT t.keys FROM (SELECT untuple(arrayJoin(m)) AS t FROM ...) WHERE t.values > 0. فقد كانت إعادة الكتابة الخاصة بـenable_optimize_predicate_expressionتدفع هذا المسند إلى داخل الاستعلام الفرعي بوصفهHAVING، حيث لا يكون الاسم معرَّفًا بعد. #113760 (groeneai). - إصلاح النتائج الخاطئة في
JOINمعjoin_algorithm = 'partial_merge'عندما يتضمن الجانب الأيمن صف الإجماليات: فقد كان الجانب الأيمن قد يبقى دون دمج، فتستبدل عمليات الربطLEFTالتطابقات الحقيقية بقيم افتراضية، ولا تُرجع عمليات الربطINNER/RIGHTأي صفوف على الإطلاق. وفي مسار الصفوف غير المرتبطة لـRIGHT/FULL، كانت الحالة نفسها تؤدي إلى إلغاء مرجعية مؤشر فارغ، مما يتسبب في تعطل الخادم. #113936 (groeneai). - إصلاح النتائج الخاطئة لـ
SELECT DISTINCTمعLIMITيتعين عليه قراءة مُدخلاته كاملة: فقد كانLIMIT n WITH TIESيُسقط الصفوف المتعادلة، وكانexact_rows_before_limit = 1يُبلغ عن قيمة مقتطعة لـrows_before_limit_at_least، وكانGROUP BY ... WITH TOTALSيحسب صف الإجماليات من الجزء الأول من التدفق فقط. #114025 (groeneai). - إصلاح الخطأ
LOGICAL_ERROR(“Unexpected number of kept output positions after removing unused columns fromReadFromMergeTree”) الذي يُطلقه استعلامSELECT ... FINALتستخدم فيه عبارةPREWHEREعمودًا يحتاجهFINALللدمج (verأوis_deletedأوsign) دون أن يحدد الاستعلام هذا العمود. #114746 (groeneai). - إصلاح مشكلة في دورة الحياة ضمن تفريغ عمليات INSERT غير المتزامنة، ومعالجة العروض المُجسَّدة، و
EXPLAIN ANALYZE، كانت قد تؤدي إلى الوصول إلى حالة تتبع استعلام منتهية الصلاحية. #114940 (azat). - إصلاح تجاهل
CREATE QUOTAوALTER QUOTAبصمت لجميع كتلFOR INTERVALباستثناء الأخيرة عند إغفال الفاصلة بين الفواصل الزمنية. فقد كانت هذه العبارة تنجح دون تثبيت أي من الحدود السابقة. أصبحت الفواصل الزمنية الآن تتراكم مجددًا، كما كانت قبل عام 2020. #115320 (groeneai). - تم إصلاح مشكلة إرجاع
randConstantقيمتين مختلفتين ضمن استعلام واحد عندما تحمل استدعاءاتها أسماءً بديلة مختلفة. فوفقًا للتوثيق، يُفترض أن تحتفظrandConstantبقيمة واحدة طوال الاستعلام، وكانSELECT randConstant() = randConstant()يُرجع1بالفعل، غير أن إضافة أسماء بديلة كما فيSELECT randConstant() AS a, randConstant() AS bكانت تُنتج قيمتين لا علاقة بينهما. #115384 (alexey-milovidov). - تم إصلاح مشكلة عدم انتهاء
SELECT count()أبدًا، أو إرجاعه عددًا وهميًا من الصفوف، عند التعامل مع ملفMsgPackأوProtobufListتالف. إذ كان المسار السريعoptimize_count_from_filesيعدّ الصفوف دون اشتراط تقدّم موضع القراءة، فكان ملفProtobufListبحجم بايتين يُنتج مليارات الصفوف دون أن يُرجع أي نتيجة. وأصبح هذا الإدخال يُرفض الآن بالخطأ نفسه الذي يُصدره مسار القراءة العادي. #115884 (groeneai). - إصلاح مشكلة إبلاغ
broken_data_filesفيsystem.distribution_queueوالمقياسBrokenDistributedFilesToInsertعن القيمة0دائمًا: فعند فحص قائمة انتظار الإدراج غير المتزامن أثناء بدء التشغيل، كانت الدالةDistributedAsyncInsertDirectoryQueue::initializeFilesFromDiskتحسب البايتات التالفة لكنها لم تكن تزيد عدّاد الملفات التالفة إطلاقًا. #92124 (squalfof).
إصلاحات أخطاء أخرى
- أصبحت الاستعلامات الثانوية المنفَّذة ضمن الاستعلامات الداخلية تُسجَّل الآن بوصفها استعلامات داخلية. #108506 (mstetsyuk).
- إصلاح مشكلة كان فيها عمود DEFAULT المفقود من جزء بيانات يُملأ بالقيمة الافتراضية لنوعه بدلًا من تعبير DEFAULT عند تقسيم شرط PREWHERE إلى عدة خطوات قراءة. #111795 (yariks5s).
- أصبحت الحصص المفهرسة بالمفتاح
normalized_query_hashتحتسب الآن جميع الموارد (read_rows،read_bytes،result_rows،result_bytes،execution_time،written_bytes،errors) لكل نمط استعلام، على غرار عدّادات عدد الاستعلامات، بدلًا من احتسابها ضمن حاوية واحدة مشتركة لكل مستخدم. #107681 (alexey-milovidov). - إصلاح عدم سريان
connect_timeoutومهلتَي القراءة والكتابة في MySQL: إذ كان من الممكن أن تتعلّق محاولة الاتصال بخادم MySQL لا يستجيب لأكثر من دقيقتين حتى معconnect_timeout = 1، لأن الإشارات الدورية الصادرة عن مُحلِّل أداء الاستعلامات بأخذ العيّنات كانت تعيد ضبط المهلة الداخلية لعملية poll في عميل MySQL باستمرار. #109592 (tiandiwonder). - إصلاح احتمال عدم انقضاء مهلة انتظار الكتلة في عمليات الإدراج المتدفقة (
input_format_max_block_wait_ms) مطلقًا أثناء تفعيل مُحلِّل أداء الاستعلامات: إذ كانت عملية poll على واصف الملف تبدأ من جديد بالمهلة الكاملة بعد كل إشارة من مُحلِّل الأداء، مما قد يؤخّر تفريغ الكتلة الجزئية إلى أجل غير مسمّى عند توقّف مصدر الإدخال، بدلًا من تفريغها عند بلوغ حد الانتظار. #109602 (tiandiwonder). - إصلاح الخطأ
LOGICAL_ERROR(std::length_error) الذي كان يحدث عندما يستخدم استعلام مفعَّل فيه الإعداد التجريبيmake_distributed_plan = 1قيمة كبيرة جدًا لـdistributed_plan_default_reader_bucket_countأوdistributed_plan_default_shuffle_join_bucket_count. تُرفض هذه القيم الآن مع الخطأINVALID_SETTING_VALUE. #109770 (groeneai). - إصلاح
distinct_overflow_mode = 'break': أصبح DISTINCT يُرجع الآن النتيجة الجزئية المتراكمة حتى بلوغ الحد ويتوقف عن القراءة من المصدر، كما هو موثّق. في السابق، كان المقطع الذي يتجاوزmax_rows_in_distinct/max_bytes_in_distinctيُهمَل (مما يُنتج نتائج مبتورة أو فارغة)، ويواصل الاستعلام القراءة والإدراج في مجموعة التجزئة حتى نهاية الإدخال، وهو ما قد ينتهي بالخطأMEMORY_LIMIT_EXCEEDED. #110075 (skuznetsov-clickhouse). - إصلاح تجاهل
optimize_aggregation_in_orderلإلغاء الاستعلام. يتحققAggregatingInOrderTransformالآن من الإلغاء أثناء تجميع المقطع، بحيث يتوقف الاستعلام الذي أُوقف بواسطةKILL QUERYأوmax_execution_time(في الوضع الافتراضيtimeout_overflow_mode = 'throw') فورًا بدلًا من مواصلة معالجة المقطع بأكمله حتى نهايته. #110104 (groeneai). - إصلاح انهيار الخادم (في إصدارات التصحيح وإصدارات أدوات sanitizer) عند قراءة قيمة من مصدر PostgreSQL من عائلة
mysql/postgresql/sqliteإلى نوع مُعلَن يتعذّر تحليلها إليه (مثل عمودtextمُعلَن بالنوعInt32). يُبلَّغ الآن عن عدم تطابق النوع هذا بوصفه خطأ في الاستعلام بدلًا من إيقاف الخادم. #110264 (groeneai). - إصلاح انهيار الخادم عند تحليل بعض استعلامات PRQL (
SET dialect = 'prql'). كان حدوث panic داخل المُصرِّفprqlcيؤدي إلى إنهاء العملية بدلًا من الإبلاغ عنه بوصفه خطأ في الاستعلام. #110316 (groeneai). - إصلاح الخطأ
NOT_FOUND_COLUMN_IN_BLOCKعندما تشير سياسة صفوف وadditional_table_filtersإلى العمود نفسه دون أن يكون هذا العمود محددًا في الاستعلام. #111099 (groeneai). - تم إصلاح تعليق في
randChiSquaredوrandStudentTوrandFisherFوrandBinomialعند استخدام معاملات متطرفة، إذ لم يكن من الممكن مقاطعة الاستعلام عبرmax_execution_timeأوKILL QUERY. أصبحت هذه المعاملات تُرفض الآن حتى عند تعيينmax_rand_distribution_parameterأوmax_rand_distribution_trialsإلى 0، ولم يعد بالإمكان رفعmax_rand_distribution_trialsفوق قيمته الافتراضية البالغة 10^9 بالنسبة إلىrandBinomial. #111909 (alexey-milovidov). - إصلاح
connection_pool_max_wait_msبحيث تعني قيمته الموثقة والافتراضية0مهلة غير محدودة. في السابق، كان الاستعلام الذي يجد مجمّع الاتصالات ممتلئًا يعيد المحاولة في حلقة متواصلة، مستهلكًا وحدة المعالجة المركزية ومسجّلًاNo free connections in pool. Waiting 0 ms.في كل تكرار. أما الآن فينتظر حتى يُعاد أحد الاتصالات إلى المجمّع. #112380 (groeneai). - إصلاح تجاهل
replaceOneوreplaceAllوreplaceRegexpOneوreplaceRegexpAllلكل منmax_execution_timeوKILL QUERY. أصبح الاستدعاء الواحد يتحقق الآن من الإلغاء أثناء تنفيذه، بحيث تتوقف عملية الاستبدال الطويلة على قيمة كبيرة أو عدد كبير من الصفوف بدلًا من حجز أحد خيوط الخادم حتى انتهائها. ولأن مثل هذا الاستدعاء لا يملك نتيجة جزئية يعيدها، فإنه في ظلtimeout_overflow_mode = 'break'يُطلق تجاوز المهلة على هيئة خطأ: دائمًا عند الطيّ الثابت (constant folding)، وفي مسار تنفيذ الاستعلام كلما بُلغت نقطة التحقق هذه قبل الفحص الذي يجريه المنفّذ بين الكتل، والذي لا يزال يوقف الاستعلام بصمت. #112483 (groeneai). - تم إصلاح تجاهل
countSubstringsوcountSubstringsCaseInsensitiveوcountSubstringsCaseInsensitiveUTF8لكل منKILL QUERYوmax_execution_time، إذ كان من الممكن أن يستمر استدعاء على صفوف كثيرة أو تطابقات كثيرة لدقائق بعد إلغاء الاستعلام. #113369 (groeneai). - إصلاح احتمال تعليق الاستعلام (لمدة
receive_timeoutثانية) إذا انتهى بسرعة كبيرة على العقدة المُبادِرة. #113551 (nickitat). - إصلاح تجاهل
countMatchesوcountMatchesCaseInsensitiveلكل منmax_execution_timeوKILL QUERYأثناء عدّ تطابقات قيمة كبيرة واحدة، مما كان يُبقي الاستعلام الملغى قيد التشغيل لدقائق. عند استخدام وسيطة ثابتة، يجري الاستدعاء أثناء تحليل الاستعلام، فلا يوجد مسار تنفيذ يمكنه إلغاؤه. #113886 (groeneai). - كان من الممكن إلغاء استعلام قبل انقضاء
max_execution_timeالخاص به بما يصل إلى 1 ms، ليفشل برسالة متناقضة:Timeout exceeded: elapsed 999.672 ms, maximum: 1000 ms. #114559 (alexey-milovidov). - تم إصلاح قراءة خارج الحدود في
pointInPolygonمع مضلع ثابت يكون مربعه المحيط غير محدود، كأن يبلغ أحد الإحداثيات+-DBL_MAX. أصبح مثل هذا المضلع يُرفض الآن بالخطأBAD_ARGUMENTS، ويُعامل المضلع ذو الحلقة الفارغة على أنه بلا مساحة داخلية. في السابق، كان من الممكن أن يعيد الاستعلام نتيجة خاطئة، أو أن يتسبب في توقف الخادم بشكل مفاجئ في الإصدارات المبنية مع تفعيل التحصين أو أدوات اكتشاف الأخطاء. #115035 (groeneai). - إصلاح حالة تسابق كان من الممكن أن تجعل استعلام
STREAM BOUNDEDيعيد صفوفًا أقل من تلك التي أُكّدت قبل بدئه، بل في الغالب لا يعيد أي صف. #115543 (alexey-milovidov). - إصلاح الخطأ
Unknown identifierالذي كان يُطلق أثناء تحسين خطة تنفيذ الاستعلام في ظلmake_distributed_plan = 1عندما يمر عمود الفرز في استعلام نافذة عبر خطوةExpressionلا تشير إليه. #115890 (groeneai). - تم إصلاح تجاهل الدوال
h3kRingوh3HexRingوh3Lineوh3ToChildrenللإعدادmax_execution_timeوللأمرKILL QUERYأثناء توسيع كتلة من الصفوف. #115893 (alexey-milovidov). - إصلاح الخطأ
NOT_FOUND_COLUMN_IN_BLOCKفي قارئ Parquet V3 الأصلي (الناتج عن تراجع سابق) عندما يحتويPREWHEREعلى مكوّنات شرطية تتشارك تعبيرًا وسيطًا واحدًا. #107059 (groeneai). - إصلاح توقف عن الاستجابة عند الكتابة بتنسيق Parquet مع تفعيل
output_format_parquet_parallel_encoding(وهو الإعداد الافتراضي) وتعيينmax_threadsبقيمة أكبر من 1. فإذا أخفق المُرمِّز في جدولة خيط تنفيذ إضافي، كان عدّاد خيوط التنفيذ النشطة لديه ينخفض دون الحد الأدنى، ما قد يوقف عملية الكتابة نهائيًا بدلًا من أن تكتمل أو تُبلغ عن خطأ. #112959 (groeneai). - تم إصلاح تخصيص الذاكرة غير المحدود عند قراءة ملف Parquet تُعلن بياناته الوصفية بتنسيق Thrift عن طول حاوية أو سلسلة نصية يتجاوز حجم البيانات الوصفية نفسها. وبات مثل هذا الطول يُرفض الآن بدلًا من تخصيص ذاكرة له. #113212 (groeneai).
- إصلاح استثناء
std::out_of_range(Logical error: 'std::exception. Code: 1001, type: std::out_of_range'، الذي يؤدي أيضًا إلى إيقاف الخادم في إصدارات التصحيح وإصدارات أدوات الفحص) في قارئ Parquet v3 عندما كان column مطلوب لتقييم المرشِّح فقط يُجدوَل لفك الترميز بعد حذف خانة الإخراج الخاصة به. #113956 (groeneai). - إصلاح حالات تسابق البيانات في أحداث التوصيف (profile events) وفي متعقّب الذاكرة. #112466 (mstetsyuk).
- إصلاح حالة تسابق بيانات نظرية في أحداث التوصيف (profile events) عند استخدام الإعداد
trace_profile_events_listلكتابة تتبّعات المكدّس لأحداث توصيف معيّنة إلىsystem.trace_log. #113553 (mstetsyuk). - تم إصلاح إرجاع الدوال
intDivOrNullوmoduloOrNullوpositiveModuloOrNullالقيمة0بدلًا منNULL، وإطلاق الدالتينintDivOrNullوintDivOrZeroاستثناءً بدلًا من إرجاعNULL/0، عندما تؤدي عملية القسمة إلى استثناء فاصلة عائمة (القسمة على صفر أوINT_MIN / -1)، بما في ذلك حالات الوسائط المختلطة بين الأنواع ذات الإشارة وعديمة الإشارة. #101976 (yariks5s). - تم إصلاح
IS DISTINCT FROMلقيمArrayوMapعند مقارنتها بـNULL. #103162 (ylw510). - تم إصلاح
groupConcatعند الجمع بين الصيغة البارامترية وصيغة الوسيطتين، مثلgroupConcat(',', 2)(x, '/'): إذ كانت معلمة حد الصفوف تُتجاهَل دون أي تنبيه، فتُرجَع جميع الصفوف بدلًا من العدد المطلوب؛ أما الآن فإن الفاصل المحدَّد في الوسيطة الثانية يحل محل المعلمة بشكل صحيح. #104882 (yariks5s). - إصلاح أخطاء عند استخدام CAST للتحويل من وحدات فاصل زمني أصغر إلى وحدات أكبر. #105058 (yariks5s).
- تم إصلاح خطأ منطقي (
Assertion 'row < chunk.getNumRows()' failed) في استعلاماتLIMIT ... WITH TIESالتي تعمل باستخدام مسار تنفيذ الاستعلام للقراءة بالترتيب (optimize_read_in_order = 1وread_in_order_use_virtual_row_per_block = 1). #105102 (groeneai). - إصلاح
Logical error: 'Pipeline stuck'في الاستعلامات التي تستخدمenable_sharding_aggregator = 1معUNION ALLوقيمةmax_streams_for_union_stepأصغر من عرض مسار تنفيذ الاستعلام. أصبحBufferedShardByHashTransformيُنهي منافذ الإخراج ذات قوائم الانتظار الفارغة فور استنفاد مُدخلاته، ويواصل سحب المُدخلات عندما لا يحتوي منفذ فارغ مطلوب على أي بيانات قابلة للتفريغ، حتى لو بلغت قائمة انتظار مجاورة الحد الأقصى للضغط العكسي. #106251 (groeneai). - إصلاح مشكلة كان فيها
removeDirectoryعلى أقراص تخزين الكائنات من نوعplain(مثلs3_plain) يحذف جميع الملفات داخل دليل غير فارغ كما لو كان الحذف تعاوديًا. أصبح حذف دليل غير فارغ يفشل الآن معCANNOT_RMDIR، بينما يتولى الحذف التعاودي معالجة المحتويات بشكل صريح. #106281 (RinChanNOWWW). - إصلاح مشكلة عدم رصد الدوال المعرّفة من قبل المستخدم من نوع
executable_poolالتي تمت تهيئتها باستخدام<lifetime>للتغييرات التي تطرأ على البرنامج النصي الأساسي. في السابق، كانSYSTEM RELOAD FUNCTIONSوحده يعيد قراءة البرنامج النصي المُعدَّل، بينما كانت عمليات إعادة التحميل الدورية عبر<lifetime>تواصل تنفيذ الإصدار القديم. #107087 (groeneai). - إصلاح حالة تسابق على البيانات في مُجمِّع التتبع العام على مستوى الخادم، تحدث بين خيط تنفيذ عامل يبدأ تشغيل أداة التحليل الخاصة به وعملية إيقاف تشغيل الخادم. #107307 (groeneai).
- إصلاح توقف مفاجئ نادر للخادم أثناء إيقاف التشغيل (
std::future_error، “The associated promise has been destructed prior to the associated state becoming ready”) ناتج عن إسقاط مهمة مجدولة عبرthreadPoolCallbackRunnerUnsafeمن قائمة انتظار مجمّع الخيوط قبل تنفيذها. #107383 (groeneai). - إصلاح خطأ منطقي في
FileLog(Last stored last_written_position in meta file ... is bigger than current last_written_pos) قد يحدث عند حذف ملف مُراقَب ثم إعادة إنشائه بالـ inode نفسه. #107617 (groeneai). - إصلاح عدم قيام
toTime64وCAST(... AS Time64)بحصر القيم الخارجة عن النطاق ضمن نطاقTime64في وضعَي الفيضsaturateوignore، مما قد يُنتج قيمًا تبدو متطابقة عند عرضها لكنها تُعدّ مختلفة عند المقارنة. #108028 (alexey-milovidov). - إصلاح المعالجة غير الصحيحة للتأكيدات ذات العرض الصفري (
\bو^و$) في دوال التعابير النمطية من نوع “مطابقة الكل”:extractAllوextractAllGroupsVerticalوextractAllGroupsHorizontalوcountMatchesوsplitByRegexp. على سبيل المثال، أصبحتextractAll('new york is the greatest', '\b(\w)')تُرجع بشكل صحيح الحرف الأول من كل كلمة بدلًا من كل الحروف. #108047 (alexey-milovidov). - إصلاح النتائج غير الصحيحة عند استخدام
hasTokenعلى الفهارس النصية التي تستخدم مُقسِّم رموز غيرsplitByNonAlpha. #108066 (rschu1ze). - إصلاح مشكلة إرجاع
toStartOfIntervalوdateTruncقيمةً مُقرَّبة بدلًا من بداية الفاصل الزمني الذي يحتويها عندما تكون دقة المُدخل أعلى من وحدة الفاصل الزمني؛ فعلى سبيل المثال، كانتtoStartOfInterval(toDateTime64('2023-10-09 10:11:12.000999', 6), INTERVAL 1 millisecond)تُرجع10:11:12.001بدلًا من10:11:12.000. وقد تأثر بذلك أيضًا الشكل الذي يتضمن نقطة أصل صريحة. #108186 (yariks5s). - إصلاح
replaceRegexpOneوreplaceRegexpAllبحيث يطابق.محارف السطر الجديد افتراضيًا، اتساقًا مع دوال التعابير النمطية الأخرى. #108265 (linjiayu1025-collab). - إصلاح مشكلة تقييم شروط عمليات UPDATE/DELETE خفيفة الوزن مرتين. #108323 (ofeliacode).
- إصلاح
arrayPartialSort()عند استخدام وسيطة حدّ غير ثابتة. #108327 (vitlibar). - إصلاح دوال التعابير النمطية (
matchوextractوextractAllوreplaceRegexpOneوreplaceRegexpAllوغيرها) التي كانت تُرجع نتائج خاطئة دون أي تنبيه عندما يحتوي النمط على بايت NUL (\0). يُعامَل NUL الآن كبايت حرفي عادي، اتساقًا مع RE2. #108427 (alexey-milovidov). - إصلاح
changeYear/changeMonth/changeDay/changeHour/changeMinute/changeSecondعند تطبيقها على وسيطة من النوعDateTime64(N)، إذ كانت تُنشئ عمود النتيجة بالمقياس الافتراضي المُثبَّت في الشيفرة (3) بدلًا منN. كانت القيم تُحسب بالمقياسNبينما يُعلن كائن العمود المقياس 3، مما يجعله غير متسق بنيويًا مع نوعه. #108551 (groeneai). - إصلاح الخطأ
LOGICAL_ERROR(“Trying to extract chunk from ChunkBuffer before all inputs are finished”) الذي يحدث عندما تجمع عملية مجموعات (INTERSECT/UNION ALL/EXCEPT) فروعًا تستخدم استعلامات فرعية مترابطة مع ضبطcorrelated_subqueries_default_join_kind = 'left'. #108554 (groeneai). - إصلاح أخطاء
DateTime64فيchangeYearوchangeMonthوchangeDayوchangeHourوchangeMinuteوchangeSecond: لم تعد المدخلات بدقة النانوثانية (المقياس 9) تُطلق الخطأDECIMAL_OVERFLOW، وأصبحت المدخلات ذات الأجزاء من الثانية السابقة لبداية الحقبة (epoch) تُرجع الثانية التقويمية الصحيحة. #108681 (takumihara). - تجنّب الإفراط في مخرجات سجل الخادم وظهور رسالة خطأ ضخمة عند تصريف تعبير نمطي كبير جدًا (مثل نمط
LIKEأوmatchيحتوي على مئات الآلاف من محارف البدل)؛ إذ تفشل هذه الأنماط الآن بخطأ واضح هوCANNOT_COMPILE_REGEXP. #108821 (Algunenano). - إصلاح
reinterpret(x, 'Decimal128(scale)')(وكذلك الأهدافDecimal32/Decimal64/Decimal256/DateTime64) التي كانت تُنتج عمود نتيجة مقياسه الداخلي هو مقياس المصدر بدلًا من المقياس الهدف المطلوب، عندما يكون للمصدر والهدف النوع الفيزيائي نفسه. كانت القيم صحيحة، لكن كائن العمود كان غير متسق بنيويًا مع نوعه المُعلن. #108878 (groeneai). - إصلاح سلوك غير محدد عند تحويل نوع حزمة بروتوكول خارج النطاق إلى سلسلة نصية (مثلًا في رسائل الخطأ “Unexpected packet from server” / “Received … packet”) في حالة اتصال فاقد للتزامن أو خاضع لاختبار التشويش (fuzzing). #108885 (groeneai).
- إصلاح الدوال
changeYear/changeMonth/changeDay/changeHour/changeMinute/changeSecondعند تطبيقها علىDateTime64(N)، إذ كانت تبني column النتيجة بالمقياس الافتراضي الثابت 3 بدلًا منN، وإصلاح الدالةtimeSlotsعند تطبيقها علىDateTime64، إذ كانت تتجاهل مقياس الوسيطة الاختياريةSizeفي نوع الإرجاع المُعلَن. وكانت كلتا الحالتين تُنتج column يختلف مقياسه الفعلي عن نوعه المُعلَن، مما يؤدي إلىLOGICAL_ERROR(writeSlice expects same column types) عند تمرير النتيجة إلىarrayPushBack/arrayPushFront/arrayConcat، كما كانتtimeSlotsتُرجع طوابع زمنية خاطئة عند استخدام أكبر مقياس فيSize. #108994 (groeneai). - إصلاح الزيادات غير الرتيبة في ProfileEvents #109180 (azat).
- إصلاح مشكلة كانت تُعامَل فيها نِسَب
SAMPLEذات الأس الذي يتجاوز مقداره نطاقInt32(مثلSAMPLE 1e-3000000000) على أنهاSAMPLE 1دون أي تنبيه. #109197 (Algunenano). - إصلاح خطأين في مسار
DateTime64للدالتينtoUTCTimestamp/fromUTCTimestamp(ولاسميهما البديلينto_utc_timestamp/from_utc_timestamp) وللدالةtoTime64. الأول: تجاوز سعة عدد صحيح ذي إشارة قرب حدّInt64(أصبح يُحسب الآن باستخدامInt128ويُقيَّد ضمن النطاق القابل للتمثيل). والثاني: نتيجة خاطئة للقيم الكسرية السالبة قرب حدّ إزاحة المنطقة الزمنية؛ إذ كان تقسيم الثواني يقتطع باتجاه الصفر، فكانتtimezoneOffset()تفحص الثانية التالية، وقد تختار الجانب الخاطئ من تغيير التوقيت الصيفي/الإزاحة. #109738 (groeneai). - إصلاح خطأ منطقي (
column->size() == num_rows) عند استخدام الدالةarrayJoinفي تعبير عامل التصفية الخاص بـ row policy؛ وأصبحت عوامل التصفية هذه تُرفض الآن. #109753 (Algunenano). - إصلاح مشكلة كانت تُنتج فيها
generateRandomStructure()أحيانًا سلسلة structure غير صالحة تحتوي على نوعَي بيانات متلاصقين (مثلDecimal32(7)IPv4) عندما يتجاوز تداخل الأنواع حدّ العمق الداخلي، مما يجعل النتيجة غير قابلة للتحليل. #109928 (groeneai). - إصلاح تمرير إعدادات الاستعلام في
accurateCastOrDefault، والحفاظ على قيمNULLالمصدرية المُرمَّزة بواسطةDynamicوVariant. #109946 (Avogar). #114912 (alexey-milovidov). - إصلاح
max_bytes_in_distinctوmax_bytes_in_set: تُخزَّن مفاتيح string في arena لم تكن تُحتسب ضمن فحوصات الحدود، لذا كان بإمكان DISTINCT / IN على مفاتيح string حجز ذاكرة تتجاوز حدّ البايتات بمقدار حمولة المفاتيح كاملة (دون أي قيد مرتبط بطول المفتاح). وأصبحت الحدود الآن تأخذ arena في الحسبان بما يتوافق مع توثيقها؛ لذا قد تبلغ الاستعلامات ذات مفاتيح string القريبة من حدّ البايتات هذا الحدَّ أبكر من ذي قبل (وهو السلوك الصحيح). #110120 (skuznetsov-clickhouse). - إصلاح قراءة ملفات Npy ذات الأبعاد الداخلية الصفرية الحجم، بحيث تتطابق الصفوف المُجسَّدة مع نتائج
count()المُحسَّنة وغير المُحسَّنة. #110146 (qiuyanjun888). - إصلاح خطأ منطقي (إنهاء الخادم في إصدارات التصحيح/المُعقِّم) عند تمرير وسيطة يُحَلّ نوعها إلى
Nothingإلى الدوالindexHint/ignore/isZeroOrNull، كما في تعبيرات مثلindexHint(assumeNotNull(materialize(NULL))). #110192 (groeneai). - إصلاح قراءة الملفات على أقراص
plain_rewritableبعد إعادة كتابة مسار موجود بمحتوى ذي حجم مختلف: إذ كانت البيانات الوصفية المحفوظة في الذاكرة تحتفظ بحجم الملف القديم، مما قد يؤدي إلى فشل عمليات القراءة مع الخطأUNEXPECTED_END_OF_FILE. #110304 (thevar1able). - رفض قيم
vector_search_index_fetch_multiplierالأقل من 1.0 لتجنّب الحصول على نتائج بحث ANN فارغة عندما يُقتطع عدد الجلب المحسوب إلى صفر. #110452 (tamish560). - إصلاح خطأ متقطع
Cannot parse string ... as UInt64 ... While executing ValuesBlockInputFormatكان قد يحدث عند إدراج قيم تحتوي تعابيرها على تحويل رقمي مثلinitializeAggregation('sumState', 0::UInt64). #110637 (groeneai). - إصلاح رفض
readWKTلسلاسل WKT التي تبدأ بمسافات بيضاء (مثلreadWKT(' POINT(1 2)'))، رغم أن القارئات ذات الأنواع المحددةreadWKTPoint/readWKTPolygon/… تقبلها، وكذلك القواعد النحوية لـ WKT. #110706 (groeneai). - إصلاح انهيار الخادم (قسمة عدد صحيح على صفر) عند استهلاك حصة ذات فاصل زمني طوله صفر (على سبيل المثال CREATE QUOTA q FOR INTERVAL 0 SECOND MAX queries = 1000). وأصبحت مدة الفاصل الزمني غير الموجبة تُرفض الآن عند إنشاء الحصة. #110846 (PedroTadim).
- إصلاح انهيار في إصدارات FIPS عند استخدام مفتاح SSH من نوع Ed25519 (
CREATE USER ... IDENTIFIED WITH ssh_key ... TYPE 'ssh-ed25519'، أو مفتاح مماثل فيusers.xml). خوارزمية Ed25519 غير معتمدة وفق FIPS؛ لذا تُرفض هذه المفاتيح الآن مع خطأLIBSSH_ERRORواضح. #110891 (thevar1able). - أصبحت دوال المسافة المنقولة على
QBit(cosineDistanceTransposed، وL2DistanceTransposed، وdotProductTransposed) تستخدم الآن إعادة بناء محدودة منخفضة الدقة لقيمة مقتطعة إلىprecisionمن مستويات البتات، بدلًا من إعادة بنائها إلى الحافة الدنيا للخلية الخشنة (مع ملء البتات المحذوفة بأصفار). فقد كان الملء بالأصفار يُحيّز كل قيمة مُعاد بناؤها نحو الصفر، ويفقد معناه عند الدقة المنخفضة: ففيQBit(BFloat16)عند الدقة 1 لا يبقى سوى بت الإشارة، فتُعاد كل قيمة إلى±0.0وتكون المسافة قيمة ثابتة واحدة لجميع الصفوف، فلا تحمل أي معلومات تفيد في الترتيب. وتعتمد إعادة البناء الآن على البتات المحذوفة: إذ يُعاد بناء رموزInt8الخام إلى مركز خليتها (بما يطابق إعادة البناء وفقLloyd-Maxالتي كان يستخدمها مسار...TransposedQuantizedمن قبل)؛ وتصبح قيمة الفاصلة العائمة عند الدقة 1 تكميمًا سليمًا للإشارة؛ ويُعاد بناء قيمة الفاصلة العائمة التي تحتفظ بأسّها كاملًا وتحذف بتات الجزء العشري فقط إلى نقطة المنتصف المحدودة ضمن نطاقها الثنائي (binade) الخاص بها (مع إبقاء الصفر الحقيقي أو±0.0صفرًا تمامًا، واستبعاد الخلية غير المنتهية كي تبقى±infلانهائية تمامًا؛ راجع الملاحظة أدناه حول خليةNaNالملتبسة)؛ أما ما دامت بتات الأس تُقتطع، فتُحفظ الحافة الدنيا المحدودة، بحيث تتيح قيمةprecisionالأصغر مقايضة الدقة بالسرعة دون تضخيم المقدار بعدة مراتب. أما النتائج كاملة الدقة فتبقى دون تغيير. #110911 (alexey-milovidov). - إصلاح قراءة خارج النطاق في قارئ ORC الأصلي أثناء استنتاج المخطط لملف ORC تالف تُعلن شجرة أنواعه عن أعمدة أكثر مما يحتويه تذييل الشريط (stripe footer) من ترميزات للأعمدة. يُرفض هذا الملف الآن مع
CANNOT_EXTRACT_TABLE_STRUCTUREبدلًا من إيقاف الخادم في إصدارات التصحيح/sanitizer. #110967 (groeneai). - أصبح كل مفتاح SSH يُحتسب الآن على حدة ضمن الحد
max_authentication_methods_per_user، بحيث يُطبَّق الحد بصورة متسقة أياً كانت الصياغة. وفي السابق، كانت المفاتيح المتعددة ضمن طريقةssh_keyواحدة تُحتسب مفتاحاً واحداً. #111181 (TheMC47). - أصبحت كتالوجات Iceberg REST تُبلغ الآن عن بيانات الاعتماد منتهية الصلاحية مع الخطأ الأصلي، بدلاً من الاكتفاء بالإبلاغ عن
UNKNOWN_TABLEدون توضيح. #111379 (alesapin). - إصلاح إرجاع
readWKTPoint/readWKTإحداثياتٍ غير مُهيّأة (في الوضع العددي) أو إحداثياتِ الصف السابق (في الوضع المتجهي) عند تمرير نقطة فارغة موسومة ببُعد مثلPOINT M EMPTY. وتُرفض هذه المدخلات الآن مع الخطأCANNOT_PARSE_TEXT، اتساقاً معPOINT EMPTY. #111517 (groeneai). - أصبح إنشاء إحصاءات
minmaxيُصدر الآن تحذيراً بدلاً من إطلاق استثناء. #111785 (hanfei1991). - الحفاظ على قابلية استخدام
randBinomialمع الاحتمالين المنحلّين0و1لأي عدد من المحاولات. #112021 (alexey-milovidov). - إصلاح إبلاغ
system.s3_queue_settingsعن قيم غير صحيحة لكلٍّ منbucketing_modeوpartitioning_modeوpartition_regexوpartition_component. #112300 (bharatnc). - الإبلاغ عن الموضع الصحيح للأخطاء في استعلامات PromQL. #112494 (fallintoplace).
- أصبح
SYSTEM DISABLE FAILPOINTيرفض الآن أسماء نقاط الفشل غير الموجودة، ويُطلق الخطأBAD_ARGUMENTSكما هو الحال معSYSTEM ENABLE FAILPOINT. وفي السابق، كان الاسم المكتوب خطأً يُبلغ عن النجاح مع إبقاء نقطة الفشل المقصودة مُفعّلة، دون أي إشارة إلى أنه لم يُعطَّل شيء. #112680 (groeneai). - إصلاح قراءة عمود فرعي لعنصر
Nestedبنوع خاطئ عندما يكون عموده قد حُذف ثم أُعيدت إضافته. فقد كان تحديد هذا العمود الفرعي مع عموده الأب يُرجع العنصر كاملاً في موضع العمود الفرعي، بينما تظل الكتلة تُصرّح بنوع العنصر، مما كان يُنتج قيماً عشوائية في إصدارات release وخطأً منطقياً في إصدارات debug وsanitizer. #112769 (groeneai). - رفض المُدد الزمنية في PromQL التي تتكرر وحداتها أو لا تكون مرتبة من الأطول إلى الأقصر. #112954 (fallintoplace).
- إصلاح سلوك غير مُعرَّف (تمرير مؤشر فارغ إلى
memcpy) فيreplaceRegexpOne/replaceRegexpAllعندما تُشير سلسلة الاستبدال إلى مجموعة ملتقطة لم تشارك في المطابقة، مثلreplaceRegexpAll('abc', '(a)|(b)', '\\2'). #113012 (alexey-milovidov). - إصلاح عدم توافق كان يحول دون تحميل الفهارس النصية المُنشأة في ClickHouse 26.3 باستخدام مُقسِّم الرموز
unicode_wordفي الإصدارات اللاحقة. #113061 (rschu1ze). - رفض نقاط ترميز Unicode البديلة (surrogate) غير الصالحة في تسلسلات الإفلات ضمن سلاسل PromQL. #113203 (fallintoplace).
- رفض تسلسلات الإفلات غير الصالحة الخاصة بالفواصل الأخرى في سلاسل PromQL. #113587 (fallintoplace).
- إصلاح إرجاع
theilsUقيمةً عشوائية بدلًا من 0 عند تطبيقها على إطار نافذة تكون فيه الوسيطة الأولى ثابتة ضمن الإطار. #113691 (alexey-milovidov). - إصلاح رمز الخطأ المُبلَّغ عنه لبعض الأعمدة المشوّهة المُسلسَلة بصيغة
Replicatedوالمستلمة عبر البروتوكول الأصلي: أصبحت هذه الأعمدة تُرفض الآن معINCORRECT_DATAبدلًا منLOGICAL_ERROR(الذي كان يتسبب في إنهاء الخادم في إصدارات التصحيح وإصدارات أدوات الفحص). #114186 (Avogar). - إصلاح القيم الحرفية من نوع
Time64وثوابت قوائمINغير الصحيحة، والتي كانت إشارتها معكوسة في أغلب الأحيان، الناتجة عن تجاوزDecimal64ذي المقياس الأدنى لحدودInt64عند إعادة قياسه. أصبح هذا التحويل يُبلِغ الآن عنDECIMAL_OVERFLOW، بما يتوافق مع فرعDateTime64ومعCASTالصريح. #114546 (groeneai). - دعم أسماء المقاييس والتسميات المحاطة بعلامات اقتباس في محددات PromQL. #114551 (fallintoplace).
- إصلاح بقاء جداول
ReplicatedMergeTreeفي وضع القراءة فقط إلى أجل غير مسمى بعد فشل محاولة بدء تشغيل نُفِّذت عبر خيط الإرفاق. أصبحت إعادة محاولة التشغيل تُجدوَل الآن بشكل صحيح، مما يعيد تفعيل الاسترداد التلقائي وفحوصات الجلسة المرتبطة به. #114802 (azat). - كانت الدالتان
timeSeriesRangeوtimeSeriesFromGridتُطلقان خطأDECIMAL_OVERFLOWزائفًا للطوابع الزمنية السابقة لعام 1970، لأن طابعَي البداية والنهاية كانا يُقرآن كقيم غير مؤشَّرة. كذلك كانت الخطوة تُقتطع بصمت إلى أدنى 32 بت منها في الطوابع الزمنية من النوعDateTime/UInt32. أصبحت جميع الحسابات تُجرى الآن باستخدامInt64. #114815 (vitlibar). - إصلاح استثناء محتمل في عمليات الإدراج غير المتزامنة بعد فشل استعلام بسبب
MEMORY_LIMIT_EXCEEDED، وإصلاحasync_insert_queue_flush_on_shutdownبحيث تُفرَّغ عمليات الإدراج الموجودة في قائمة الانتظار أثناء إيقاف تشغيل الخادم. #114839 (azat). - إصلاح استثناء
out_of_rangeالذي كان يُطلق كخطأ داخليCode: 1001عندما يحتوي نمطsequenceMatchأوsequenceCountأوsequenceMatchEventsعلى رقم الحدث0، مثلsequenceMatch('(?0)'). أصبح هذا النمط يُرفض الآن معBAD_ARGUMENTS. كما أن الشرط الزمني الذي يحتوي على إشارة منفردة، مثلsequenceMatch('(?1)(?t>+)(?2)')، كان يُعامَل بصمت على أنه(?t>0)، وأصبح يُرفض الآن معSYNTAX_ERROR. #115056 (groeneai). - إصلاح رسالة الخطأ في
geoToH3التي كانت تذكر موضع وسيطة خاطئًا ونوعًا خاطئًا عندما لا يكون الإحداثي من النوعFloat64. فمع الإعداد الافتراضيgeotoh3_argument_order = 'lat_lon'، كانت الرسالة تشير إلى الوسيطة الأخرى وتعرض نوعها. #115503 (groeneai). - إصلاح محارف الهروب غير الصالحة بالشرطة المائلة العكسية في فهارس text وtokenbf_v1 وngrambf_v1. #115634 (ahmadov).
- إصلاح مشكلة تعذّر بدء تشغيل الخادم عندما يكون متغير البيئة
TZفارغًا. #68921 (ardenwick).