Skip to main content

تغييرات غير متوافقة مع الإصدارات السابقة

التغييرات في الاستعلامات والدوال والصيغة

  • بالنسبة إلى طرق العرض التي يكون متنها استعلام 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 الخاصة بالاستعلامات البعيدة ضمن الاستعلام الموزَّع تُربط الآن بشكل صحيح كعناصر فرعية تابعة لـ span Connection::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 name merge does 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 تُخزَّن كقيمة Avro int مجردة وتُقرأ لاحقًا على أنها ميكروثوانٍ، بل كان يتعذّر قراءة الملف إطلاقًا مع 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 ثوانٍ، بما يتوافق مع الحد الأقصى لطلب STS AssumeRole. #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، وذلك بسبب تحليل غير محمول لترويسة HTTP Last-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 يُرفض الآن برسالة خطأ واضحة بدلًا من كتابة بيانات Arrow time32/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 function globalNullIn” وفقدان رسالة الخطأ الفعلية للاستعلام، وهو ما قد يحدث عندما يُنفِّذ استبعاد أجزاء البيانات المعتمد على الإحصاءات استعلامًا فرعيًا من نوع 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_set column 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 from ReadFromMergeTree”) الذي يُطلقه استعلام 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).
آخر تعديل في ١٤ أكتوبر ٢٠٢٦