Skip to main content

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

تغييرات الاستعلامات وبناء الجملة

  • أصبحت دالتا النافذة RANK وDENSE_RANK ترفضان الوسائط وتُطلقان الخطأ NUMBER_OF_ARGUMENTS_DOESNT_MATCH، تماشيًا مع معيار SQL. في السابق، كانت استعلامات مثل RANK(x) OVER (ORDER BY id) تُقبل دون تنبيه مع تجاهل الوسيط، وهو ما شكّل مصدرًا متكررًا لالتباس المستخدمين. ولاستعادة السلوك المتساهل السابق، اضبط allow_rank_dense_rank_arguments = 1. #104324 (groeneai).

تغييرات أنواع البيانات

  • ترفض icebergHash وicebergBucket الآن وسيطات من الأنواع Int128 وUInt128 وInt256 وUInt256 وDecimal256 وتُصدر خطأً صريحًا. سابقًا، كانت تقتطع القيم الأوسع بصمت وتنتج قيم hash متصادمة. لا تحدد مواصفة Iceberg التجزئة إلا للأعداد الصحيحة ذات 32 أو 64 بت وللقيم العشرية بدقة تصل إلى 38؛ حوّل القيم إلى Int64 أو Decimal128 للحفاظ على السلوك السابق للقيم التي تقع ضمن النطاق. #105866 (Algunenano).
  • أصبحت الدوال toUUID وtoUUIDOrNull وtoUUIDOrZero وtoUUIDOrDefault وعملية CAST إلى UUID وNullable(UUID) وaccurateCastOrNull إلى UUID، وكذلك تنسيقات الإدخال التي تحلل معرّف UUID من نص (Avro، MsgPack، JSONExtract، …)، ترفض السلاسل النصية التي يكون طولها صحيحًا لكنها تحتوي على محارف غير سداسية عشرية. سابقًا، كانت هذه المدخلات تتحول بصمت إلى معرّف UUID ملفّق نتيجة تجاوز نهاية جدول البحث عن الأرقام السداسية عشرية. أما الآن فتُصدر toUUID الخطأ CANNOT_PARSE_UUID، بينما تعيد بدائل Or* القيمة NULL أو معرّف UUID الصفري أو القيمة الافتراضية المحددة. #104370 (groeneai).
  • يجري الآن التحقق من النوعين Dynamic وVariant في عبارة PARTITION BY الخاصة بالنافذة؛ ولم يكن ذلك يُفحص سابقًا عندما يكون allow_suspicious_types_in_group_by معطلًا. أما الآن فتُصدر الاستعلامات التي تقسّم نافذة على عمود من النوع Dynamic أو Variant خطأً ما لم يكن allow_suspicious_types_in_group_by = 1. #105450 (Avogar).

تغييرات التخزين والفهارس

  • رفض Dynamic/Variant المتداخلة في تجميعات min/max وفهارس minmax. سابقًا، كان التحقق يقتصر على Dynamic/Variant في المستوى الأعلى فقط. #105468 (Avogar).
  • تتغير القيمة الافتراضية لإعداد الخادم insert_deduplication_version من compatible_double_hashes إلى new_unified_hash. تعمل إزالة تكرار الإدراج الآن على كتلة الإدراج بأكملها (لكل عملية إدراج) بدلًا من كل جزء/قسم: تظل إعادة محاولة عملية الإدراج نفسها مُزالة التكرار، لكن لم تعد عمليتا إدراج مختلفتان تنتجان جزءًا متطابقًا تُزالان تكراريًا فيما بينهما، ولم تعد أيضًا عمليات الإدراج التي تُرتَّب فيها الصفوف نفسها ترتيبًا مختلفًا تُزال تكراريًا. اضبط insert_deduplication_version = compatible_double_hashes لاستعادة السلوك السابق. تخضع إزالة تكرار الإدراج غير المتزامن أيضًا لنافذة المزامنة ضمن new_unified_hash: إذ يتبع كلٌّ من تمكينها (replicated_deduplication_window) ومدة الاحتفاظ بها (replicated_deduplication_window_seconds، والقيمة الافتراضية ساعة واحدة) إعدادات المزامنة، لذا فإن *_for_async_inserts إعداد قديم ولا ينطبق إلا على old_separate_hashes / compatible_double_hashes. يجب أن تعمل المثيلات التي تُرقّى مباشرةً من إصدار كانت قيمته الافتراضية old_separate_hashes أولًا باستخدام compatible_double_hashes إلى أن تنقضي أطول نافذة لإزالة التكرار ذات صلة (بما في ذلك replicated_deduplication_window_for_async_inserts، وقيمتها الافتراضية أسبوع واحد، عند استخدام عمليات الإدراج غير المتزامن) قبل الاعتماد على new_unified_hash. ينبغي لأحمال العمل غير المتزامنة التي تنتقل من compatible_double_hashes أن ترفع أولًا replicated_deduplication_window[_seconds] إلى نافذة الإدراج غير المتزامن (وأن تعمل طوال نافذة غير متزامنة كاملة)، أو أن توقف عمليات الإدراج غير المتزامن مؤقتًا، أو أن تبقى على compatible_double_hashes، لأن new_unified_hash لم يعد يتحقق من معرّفات async_blocks ذات مدة الاحتفاظ الأطول. #107886 (CheSema).
  • إصلاح hasToken بحيث لا يعيد بصمت نتائج عبر فهرس نصي عند استخدام needle يحتوي على فاصل، بل يطلق BAD_ARGUMENTS. #108189 (Ergus).

الميزات المُزالة

  • لم يعد بإمكانك استخدام قارئ وكاتب Parquet المتقادمَين المبنيَّين على Arrow. إذ يُستخدم التنفيذ الأصيل دائمًا بدلًا منهما. أصبحت الإعدادات التي كانت تختار التنفيذات القديمة أو تضبطها متقادمة ويتم تجاهلها: input_format_parquet_use_native_reader_v3 وoutput_format_parquet_use_custom_encoder وoutput_format_parquet_version وoutput_format_parquet_compliant_nested_types وoutput_format_parquet_unsupported_types_as_binary. يكتب الكاتب الأصيل دائمًا بصيغة Parquet V2.6+ مع أنواع متداخلة متوافقة، ويُصدر الخطأ UNKNOWN_TYPE للأنواع غير المدعومة بدلًا من كتابتها كبيانات ثنائية خام. #100949 (alexey-milovidov).
  • أُزيل الإعداد المتقادم allow_experimental_query_deduplication وسلوك إزالة تكرار الاستعلامات التجريبي غير المدعوم المرتبط به. #99398 (devcrafter).
  • لم يعد ALTER TABLE ... REPLACE PARTITION ... FROM ... يحذف بيانات قسم الوجهة بصمت عندما لا يحتوي الجدول المصدر على أجزاء ضمن القسم المطلوب. سابقًا، كان هذا الطلب يزيل قسم الوجهة دون كتابة أي بيانات بديلة. ويُرفض الآن افتراضيًا بالخطأ BAD_ARGUMENTS. هذا تغيير غير متوافق مع الإصدارات السابقة: إذ إن REPLACE PARTITION من مصدر فارغ، والذي كان ينجح سابقًا (مما يؤدي إلى مسح الوجهة)، سيُصدر الآن استثناءً بعد الترقية. لاستعادة سلوك المسح الصامت السابق، اضبط الإعداد الجديد allow_replace_partition_from_empty_source = 1 (لكل استعلام أو ضمن ملف التعريف)، أو اضبط compatibility على 26.5 أو إصدار أقدم. ولحذف بيانات الوجهة صراحةً، استخدم ALTER TABLE ... DROP PARTITION .... #104939 (groeneai).
  • أُزيلت دوال KQL ‏(Kusto) التجريبية array_sort_asc وarray_sort_desc، وعمليات التنفيذ الخلفية المقابلة لها في SQL، kql_array_sort_asc وkql_array_sort_desc. كانت هذه الدوال تجريبية ومنفذة بجودة متدنية، وكانت مصدرًا لأخطاء في صحة النتائج وأخطاء في المحلل. تُرجع الاستعلامات التي تستخدم هذه الأسماء الآن UNKNOWN_FUNCTION. #108101 (groeneai).

الميزات الجديدة

الدالة

  • أُضيف دعم دالة PromQL histogram_quantile في دوال الجداول prometheusQuery وprometheusQueryRange. يتيح ذلك حساب الكَمّيات على حاويات المُدرَّج التكراري التقليدية في Prometheus، المحددة بالوسم le. #103477 (Yasumoto).
  • أُضيفت الدالة h3PolygonToCellsWithContainment، التي تدعم أوضاع الاحتواء القائمة على المركز، والاحتواء الكامل، والتداخل. #104455 (yousefQadry).
  • يمكن للمستخدم الآن تحديد وسيطة اختيارية للدقة للدوال formatReadableSize وformatReadableDecimalSize وformatReadableQuantity للتحكم في عدد الأرقام بعد الفاصلة العشرية. القيمة الافتراضية هي 2، مع الحفاظ على السلوك السابق. #104648 (antoniofilipovic).
  • أُضيف الاسمان المستعاران التجميعيان min_by وmax_by للدالتين argMin وargMax. #105712 (itsjoeoui).

ميزات SQL وميزات الاستعلام

  • تقبل formatReadableTimeDelta الآن تعبير INTERVAL من نوع غير Month أو Year كمدخل. #64315 (Beetelbrox).
  • أُضيف دعم صيغة الإخراج PNG، ما يتيح عرض نتائج الاستعلامات مباشرةً كصور PNG. #74691 (m7kss1).
  • أُضيفت ميزة حجز الذاكرة لأعباء العمل. راجع وثائق جدولة أعباء العمل. #82414 (serxa).
  • أُضيف خيارا IPV4_PREFIX_BITS وIPV6_PREFIX_BITS للحصص المحددة بـ IP_ADDRESS أو FORWARDED_IP_ADDRESS، ما يتيح مشاركة حدود الحصة على مستوى الشبكة الفرعية لـ IP بدلًا من تطبيقها على كل عنوان كامل على حدة. #89270 (adityachopra29).
  • تنفيذ ADD ENUM VALUES في استعلامات ALTER TABLE لتبسيط إضافة قيم جديدة إلى نوع Enum موجود دون الحاجة إلى تحديد جميع قيم Enum الحالية مجددًا. #93830 (ilejn).
  • إضافة صيغة الإدخال GeoJSON للقراءة. #98124 (mneedham).
  • أُضيف معالج لاحق إلى فهرس النصوص لتحويل الرموز بعد تجزئة النص. #98939 (Ergus).
  • أُضيف دعم اختياري لعُقد TTL في ClickHouse Keeper. تنتهي صلاحية عُقد TTL تلقائيًا بعد انتهاء عمرها المحدد في التهيئة، ولا يمكن أن تحتوي على عُقد فرعية. #100397 (scanhex12).
  • أُضيف تخزين مواضع الرموز لفهارس النصوص لدعم عمليات بحث hasPhrase الدقيقة. فعّل وسيطة الفهرس support_phrase_search وإعداد MergeTree ‏allow_experimental_text_index_phrase_search. #103172 (ahmadov).
  • إضافة الدالتين arrayTopK وarrayBottomK: - تُرجع arrayTopK(k, array) أكبر K عناصر بترتيب تنازلي - تُرجع arrayBottomK(k, array) أصغر K عناصر بترتيب تصاعدي. #104563 (vitlibar).
  • إضافة دعم اختيار الأعمدة وفق نمط الاسم باستخدام * LIKE '<pattern>' و* ILIKE '<pattern>'، بما في ذلك الصيغ المؤهلة مثل table.* LIKE '<pattern>' وtable.* ILIKE '<pattern>'. يطابق LIKE أسماء الأعمدة مع مراعاة حالة الأحرف، بينما يطابقها ILIKE دون مراعاة حالة الأحرف. #104569 (niyue).
  • أُضيفت استعلامات مستمرة لجداول MergeTree باستخدام سلسلة من قراءات اللقطات. #105114 (Michicosun).
  • أُضيفت الصيغة RowBinaryWithNamesAndTypesAndDefaults لتحسين دعم تطور المخطط. #105736 (mzitnik).
  • أُضيفت دوال لتقديم Mapbox Vector Tiles مباشرةً من SQL: تُسقِط MVTEncodeGeom شكلاً هندسياً إلى فضاء البكسل لبلاطة slippy-map وتقتطعه، بينما تُجمِّع MVTEncode الأشكال الهندسية المُسقطة لمجموعة في بايتات ثنائية لبلاطة أحادية الطبقة، وتُرجع MVTBoundingBox / MVTBoundingBoxMercator المربع المحيط بالبلاطة لتقييد الصفوف ضمنه. تدعم الدوال الأشكال الهندسية من نوع Point وline وPolygon. تتوفر أيضاً بالأسماء المستعارة في PostGIS: ST_AsMVTGeom وST_AsMVT. #106107 (saarthak2002).
  • أُضيفت LOCALTIME وLOCALTIMESTAMP (بناء جملة SQL القياسي / PostgreSQL). LOCALTIMESTAMP اسم مستعار لـ now() (ويُرجع DateTime)؛ وتُرجع LOCALTIME الوقت الحالي من اليوم كقيمة Time. #106139 (thomas-cabral).
  • أُضيفت استراتيجيتان جديدتان لـ load_balancing، هما hostname_longest_common_prefix وhostname_longest_common_suffix، وتُفضِّلان النسخة المتماثلة التي يشترك اسم مضيفها مع اسم مضيف البادئ في أطول بادئة مشتركة (أو لاحقة مشتركة، على الترتيب). وهما مفيدتان عندما يكون مركز البيانات مُرمَّزاً كبادئة أو لاحقة في أسماء مضيفين ذات مقاطع رقمية متفاوتة الطول، إذ قد تختار استراتيجيتا nearest_hostname وhostname_levenshtein_distance الحاليتان النسخة المتماثلة الخاطئة. #107360 (den-crane).
  • دالتان جديدتان هما quantizeBFloat16ToInt8 وdequantizeInt8ToBFloat16: codec قياسي يضغط مكوّنات embedding إلى 8 بت باستخدام مُكمِّم غاوسي Lloyd-Max ذي 256 مستوى، ويمكن استخراج رموز Int4/Int2/الثنائية منه عبر اقتطاع البتات. #108102 (alexey-milovidov).

محركات الجداول والتخزين

  • أُضيف دعم الكتابة إلى Azure Data Lake Storage Gen2. #105406 (scanhex12).

الإعدادات والتهيئة

  • أُضيف الإعداد output_format_always_write_decimal_point_in_float_and_decimal لطباعة الفاصلة العشرية دائمًا للأرقام ذات الفاصلة العائمة وأرقام Decimal في التنسيقات النصية، حتى عندما تكون القيمة عددًا صحيحًا. على سبيل المثال، إخراج 1. بدلًا من 1. يكون هذا الإعداد معطّلًا افتراضيًا. #62614 (qoega).
  • أُضيف إعداد جديد غير قابل للتغيير في MergeTree باسم allow_tuple_element_aggregation، وهو معطّل افتراضيًا. عند تفعيله، تعمل SummingMergeTree وAggregatingMergeTree وCoalescingMergeTree على تسطيح أعمدة Tuple تعاوديًا وتجميع كل عنصر نهائي فيها بصورة مستقلة أثناء عمليات الدمج، كما لو كان عمودًا من المستوى الأعلى: تجمعه SummingMergeTree، وتدمج AggregatingMergeTree حالة دالة التجميع الخاصة به، وتحتفظ CoalescingMergeTree بآخر قيمة غير NULL له. يجب تحديد هذا الإعداد عند إنشاء الجدول، وتتجاهله المحركات التي لا تدعمه دون إصدار أي تنبيه. #98039 (JingYanchao).
  • أُضيف الإعداد output_format_float_precision للتحكم في عدد المنازل العشرية في المخرجات النصية للأرقام ذات الفاصلة العائمة. #99721 (phulv94).
  • أُضيف إعدادا جدول MergeTree، وهما materialize_projections_on_insert وmaterialize_projections_on_merge. عندما تكون قيمة materialize_projections_on_insert = 0، تتخطى عمليات INSERT إنشاء أجزاء الإسقاط، مما يحسّن معدل إدراج البيانات في الجداول ذات الإسقاطات الكثيرة. وعندما تكون قيمة materialize_projections_on_merge = 1، تعيد عملية الدمج إنشاء إسقاط مفقود من جميع أجزائه المصدرية، بحيث يمكن إنشاء الإسقاطات أثناء عمليات الدمج بدلًا من إنشائها عند الإدراج. ولا تزال عمليات الدمج تدمج الأجزاء التي تتشارك المجموعة نفسها من الإسقاطات فقط. #100993 (cwurm).
  • أُضيف إعداد جديد في S3Queue باسم after_processing_move_preserve_path. عند تفعيله مع after_processing='move' وafter_processing_move_prefix، تُنقل الكائنات المعالجة مع الاحتفاظ بمسار المصدر الكامل ضمن بادئة الوجهة، بدلًا من تسطيحها لتصبح اسم الملف فقط. #105354 (asya-ch).
  • أُضيفت عناصر تهيئة لمعالج HTTP هي url_prefix وfull_url_prefix لمطابقة جميع المسارات التي تبدأ ببادئة محددة، إلى جانب العناصر الصريحة url_regexp وfull_url_regexp وheaders_regexp. ولا تزال الصيغة القديمة <url>regex:...</url> مدعومة. #107492 (vitlibar).

المصادقة

  • أُضيفت بيانات اعتماد اختيارية باسم external_id للوصول إلى S3 المستند إلى الدور. #106941 (eliangidoni).
  • أُضيفت معلومات شهادة عميل TLS (subject والرقم التسلسلي والجهة المُصدِرة وفترة الصلاحية) إلى جدول system.session_log لتحسين قابلية رصد المصادقة المعتمدة على الشهادات. #107679 (alexey-milovidov).

جداول النظام

  • أُضيف جدول system.iceberg_files الذي يعرض البيانات الوصفية لكل ملف في جداول Iceberg، بصف واحد لكل ملف بيانات أو ملف حذف ضمن اللقطة الحالية لكل جدول. #104415 (asya-ch).
  • أُضيفت فهارس تخطٍ افتراضية (ماذا لو). استخدم CREATE HYPOTHETICAL INDEX ... ON t (expr) TYPE ... لتعريف فهرس تخطٍ افتراضي ضمن نطاق الجلسة، ثم استخدم EXPLAIN WHATIF SELECT ... لتقدير نسبة التخطي وتكلفته دون تجسيده. تظهر الفهارس المعرّفة في جدول system.hypothetical_indexes الجديد. #104608 (yariks5s).
  • أُضيف جدول النظام system.constraints الذي يوفر معلومات عن جميع قيود CHECK وASSUME في جميع الجداول، بما في ذلك اسم القيد ونوعه وتعبيره. #105337 (PedroTadim).
  • أُضيف جدول نظام جديد باسم system.documentation يجمع وثائق المرجع المضمّنة للمكوّنات الموحّدة في النظام (الدوال ومحركات الجداول وأنواع البيانات والإعدادات والتنسيقات وغيرها) في جدول واحد، مع عرض الوثائق بتنسيق Markdown. #107463 (alexey-milovidov).

الميزات التجريبية

  • أُضيفت خوارزمية dphyp التجريبية لإعادة ترتيب عمليات الربط الداخلية، كخيار لإعداد query_plan_optimize_join_order_algorithm، إلى جانب إعداد query_plan_optimize_join_order_max_searched_plans الذي يقيّد البحث عن ترتيب الربط ويعود إلى الخوارزمية التالية في السلسلة عند تجاوز الحد؛ اضبطه على 0 للاحتفاظ بسلوك البحث السابق غير المقيّد. #98798 (davenger).
  • أُضيف وضع التطبيق الكسول لقوائم الترحيلات لفهرس النص. عند تمكينه عبر SET allow_experimental_text_index_lazy_apply = 1 وSET text_index_posting_list_apply_mode = 'lazy'، تُفك ترميزات قوائم الترحيلات عند الطلب على مستوى الكتل المعبأة، باستخدام نهج قائم على المؤشر بدلًا من تحويلها بالكامل إلى Roaring Bitmaps، مما يقلل استخدام الذاكرة ووقت المعالجة لاستعلامات فهرس النص الانتقائية. #100035 (fastio).
  • أصبح بالإمكان إرفاق معالجات prometheus بمنفذ http الرئيسي مع بادئة اختيارية. #104975 (JTCunning).
  • أُضيف إعداد MergeTree تجريبي packed_skip_index_max_bytes يضم التدفقات الفرعية الصغيرة لفهرس التخطي في أرشيف skp_idx.packed واحد لكل جزء، مما يقلل الضغط على inodes عند تعريف العديد من فهارس التخطي في جدول. يُتخذ القرار لكل تدفق فرعي وقت الكتابة: تُضاف إلى الأرشيف التدفقات الفرعية التي يبقى حجمها المتسلسل دون العتبة، بينما يحتفظ أي تدفق أكبر بالتخطيط المستقل skp_idx_<name>.idx2 / .mrk2. يمكن للجزء الواحد أن يجمع بين التخطيطين. فهارس النص الكامل غير مدعومة وتُخزَّن دائمًا في ملفات منفصلة. القيمة الافتراضية هي 0 (التعبئة معطلة). #105321 (Algunenano).
  • دعم تسلسل Buffers لدوال WebAssembly UDF باستخدام ABI BUFFERED_V1، وإضافة webassembly_udf_enable_fuel كإعداد دائم لدالة WASM UDF. #105574 (antonio2368).
  • تنفيذ الاستعلامات الموزعة متعدد المراحل: يقسم المخطط خطة الاستعلام إلى مراحل متصلة بتبادلات scatter / broadcast / gather / shuffle، ويوزع أجزاء الخطة على العقد العاملة. تُنقل البيانات بين المراحل عبر TCP أو عبر ملفات مؤقتة في تخزين كائنات مشترك، ويدعم هذا المسار عمليات ربط التجزئة من نوع shuffle وbroadcast، والتجميع من نوع shuffle، والفرز الموزع. هذه الميزة تجريبية ومعطلة افتراضيًا. #106020 (davenger).
  • يمكن لمحرك خطة الاستعلامات الموزعة التجريبي (make_distributed_plan) الآن استخدام منفذ مختلف لتوزيع المهام وتبادل البث لكل عامل، يُضبط لكل نسخة متماثلة في <remote_servers> باستخدام stateless_worker_port وstreaming_exchange_port. عند عدم ضبطهما، تُستخدم منافذ مستوى الخادم السابقة (stateless_worker_client.port وdistributed_query.streaming_exchange_port). يتيح ذلك تشغيل عدة عمال على مضيف واحد. #107885 (davenger).

تحسينات الأداء

أداء JOIN

  • تطبيق فهارس selector وreplication بشكل كسول عند وجود JOIN يتبعه LIMIT انتقائي أو TopN أو JOIN آخر. للتحكم في عدد أعمدة payload اللازمة لتفعيل فهارس selector الكسولة، استخدم الإعداد query_plan_min_columns_for_join_lazy_indexing (تعني القيمة 0 أن التحسين معطّل). وللتحكم في قيمة LIMIT التي يُطبَّق عليها التحسين، استخدم الإعداد query_plan_max_limit_for_join_lazy_indexing. #98883 (m-selmi).
  • السماح لـ ASOF JOIN باستخدام خوارزمية join ‏parallel_hash، مع توزيع عملية البناء بالتوازي بين قيم مفاتيح المساواة المختلفة. سابقًا، كان ASOF مستبعدًا دائمًا من parallel_hash. #105375 (gregakinman).
  • مشاركة FixedHashMap الخاصة بـ hash join بوصفها عامل تصفية وقت التشغيل لـ join على جانب probe. عندما يكون جدول hash على جانب البناء من نوع FixedHashMap، أو يمكن تحويله إليه، يُنشر بوصفه عامل تصفية وقت التشغيل ويحل محل Set/BloomFilter الذي كان BuildRuntimeFilterStep سيثبّته بخلاف ذلك. يتحكم في ذلك الإعداد الجديد enable_join_runtime_filter_shared_fixed_hash_table (القيمة الافتراضية true). #105640 (wudidapaopao).
  • أصبح مسموحًا الآن بإعادة ترتيب DP JOIN مع النسخ المتماثلة المتوازية. #105889 (nickitat).
  • تحسين خطة الاستعلام عند استخدام JOIN لعوامل تصفية وقت التشغيل (الإعداد enable_join_runtime_filters مفعّل افتراضيًا): أصبح نموذج تكلفة إعادة ترتيب join يتجاوز WindowTransform (وخطوات الخطة الأخرى التي تحافظ على الصفوف) في الشجرة الفرعية اليمنى، ويستخدم عدد الصفوف الأساسي وNDV لكل عمود بدلًا من افتراض عدم وجود إحصاءات. #107229 (UnamedRus).

تحسين الاستعلامات

  • تحسين أداء تحليل فهرس النصوص في عمليات البحث متعددة الرموز عبر تحسين التعامل مع الرموز النادرة. #98226 (CurtizJ).
  • تحسين أداء الدوال encrypt وdecrypt وhalfMD5 عبر تجنب عمليات البحث الضمنية عن موفّر OpenSSL لكل صف في OpenSSL 3.x. #99105 (thevar1able).
  • دمج كتل المصدر قبل projection.calculate() أثناء MATERIALIZE PROJECTION لتقليل عدد أجزاء الإسقاط المؤقتة والعبء الإضافي لعملية الدمج. تسريع بمقدار 3.4 مرات تقريبًا على جدول يضم 50 مليون صف. #100047 (amosbird).
  • يستفيد المستخدمون الآن من تحسّن أداء عوامل تصفية وقت التشغيل التقريبية وفهارس مرشح Bloom. #100201 (cv4g).
  • تسريع استعلامات ORDER BY ... LIMIT BY عبر تشغيل LIMIT BY ضمن كل تدفق فرز متوازٍ أثناء Sort عندما تكون أعمدة LIMIT BY بادئة لأعمدة ORDER BY. يقلل ذلك عدد الصفوف التي تمر عبر دمج الفرز النهائي وأي خطوات لاحقة في خط المعالجة. يتحكم في هذا التحسين الإعداد الجديد query_plan_push_limit_by_into_sort (مفعّل افتراضيًا). #104000 (nihalzp).
  • تقليل العبء الإضافي لكل استعلام في استعلامات SELECT البسيطة (التحليل النحوي والتحليل والتخطيط). على سبيل المثال، أصبح SELECT count() FROM hits من اتصال واحد أسرع بنحو 50%. #104513 (Algunenano).
  • تحسين أداء bitmapContains لحالات groupBitmap غير UInt64 عبر تجنب استدعاءات rb_max المتكررة أثناء التحقق من النطاق. #105960 (niyue).
  • تحسين أداء الإدراج لأعمدة LowCardinality ذات فهارس bloom_filter. #106410 (EmeraldShift).
  • تحسين أداء الدالتين L2DistanceTransposed وcosineDistanceTransposed لنوع البيانات QBit. #106701 (rienath).
  • تحسين أداء تحليل الاستعلامات على الجداول ذات الأعمدة الكثيرة: تجنب حساب تجزئات عقد الأعمدة (التي تتضمن تعبير جدول المصدر بالكامل) عند عدم الحاجة إليها. أصبح تحليل الاستعلامات الفرعية المتداخلة SELECT * على جدول يضم نحو 1200 عمود أسرع بنحو 50 مرة. #106957 (novikd).
  • تحسين أداء الدوال encrypt وdecrypt وtryDecrypt وaes_encrypt_mysql وaes_decrypt_mysql بما يصل إلى عشرة أضعاف، مع استعادة الأداء المفقود عند الترحيل من BoringSSL إلى OpenSSL 3.x ‏(24.4). #107339 (thevar1able).
  • تحسين تنفيذ arrayElement على Array(LowCardinality(String)) ودوال LIKE للخرائط ذات المفاتيح أو القيم من نوع LowCardinality(String) عبر تجنب إنشاء السلاسل فعليًا دون حاجة. #107450 (EmeraldShift).
  • تقليل استخدام CPU وتحسين أداء تقييم فهرس التخطي للاستعلامات التي تصفي أعمدة DateTime64. #107707 (shankar-iyer).
  • تحسين أداء عمليات البحث عن السلاسل الفرعية غير الحساسة لحالة الأحرف، بما في ذلك positionCaseInsensitiveUTF8 وILIKE وmultiSearchAnyCaseInsensitiveUTF8. #107882 (Algunenano).
  • إصلاح تراجع في معدل النقل بنحو 16% في برنامج الترميز FPC للأعداد ذات الفاصلة العائمة على ARM، والذي أُضيف عند بدء جداول التنبؤ الخاصة به باستخدام VectorWithMemoryTracking. #108182 (groeneai).
  • إصلاح تراجع في الأداء كان فيه تنفيذ DELETE خفيف واحد يعطّل ذاكرة التخزين المؤقت لشروط الاستعلام للجدول بأكمله. وكانت الاستعلامات الانتقائية المتكررة على جدول سبق أن تأثر بحذف خفيف تتوقف عن تقليم الحبيبات وتلجأ إلى قراءة كل علامة. #112947 (fm4v).
  • تقييد تكلفة تقدير انتقائية col IN (...) من إحصاءات الأعمدة، إذ كان ذلك قد يضيف مئات المللي ثانية إلى تخطيط استعلام واحد. لم يعد المقدِّر يشغّل الاستعلام الفرعي في col IN (subquery) لملء مجموعة لا يحتاج منها إلا إلى قيمة انتقائية واحدة، بل يتجاوز المجموعة غير المنشأة. وبالنسبة إلى مجموعة أكبر من الإعداد الجديد statistics_max_set_size_for_exact_selectivity_estimation (القيمة الافتراضية 10000)، تُستمد الانتقائية الآن من حجم المجموعة ونطاقها المحدود. #114389 (nickitat).

أداء الدوال والتجميع

  • تحسين تحليل فهرس المفتاح الأساسي للمفاتيح الأساسية الطويلة وعالية الكاردينالية. بالنسبة إلى المفتاح الأساسي الطويل، يعتمد زمن تحليل الفهرس الآن أساسًا على مدى تعقيد عامل تصفية الاستعلام (أي أعمدة المفتاح التي يستخدمها فعليًا)، لا على طول المفتاح الأساسي؛ لذا فإن توسيع مفتاح الفرز يضيف عبئًا ضئيلًا على تحليل الفهرس للاستعلامات التي تُجري التصفية على عدد قليل فقط من أعمدته. أما بالنسبة إلى مفتاح أساسي عالي الكاردينالية، حيث يحتفظ ClickHouse في الذاكرة ببادئة انتقائية فقط من أعمدة المفتاح ولا يحمّل الأعمدة اللاحقة، فإن تحليل الفهرس يعمل الآن على هذه البادئة الموجودة في الذاكرة فقط بدلًا من المفتاح بأكمله. هذا التحسين مفعّل افتراضيًا ويمكن إيقافه باستخدام الإعداد الجديد use_lightweight_primary_key_index_analysis. #91836 (nihalzp).
  • تقليل ذروة استخدام الذاكرة عند دمج نتائج التجميع الجزئية ثنائية المستوى ذات حالات التجميع الكبيرة (مثل groupArray)، عبر تحرير حالات المصدر لكل حاوية تدريجيًا أثناء الدمج بدلًا من إبقائها جميعًا في الذاكرة حتى اكتمال الدمج. #102330 (yurifedoseev).
  • تحسين جديد لـ GROUP BY للمفاتيح عالية الكاردينالية والموزعة بالتساوي، يوزّع الصفوف بين الخيوط باستخدام تجزئة مفتاح التجميع، بحيث يجمع كل خيط مجموعة فرعية منفصلة من المفاتيح دون مرحلة دمج. عيّن enable_sharding_aggregator = 1 لتفعيله. #104233 (nihalzp).
  • تسريع استعلامات LIMIT BY على جداول MergeTree المقسمة إلى أقسام، بتشغيل LIMIT BY بالتوازي داخل تدفق كل قسم، بدلًا من دمج جميع التدفقات في تدفق واحد قبل تطبيق الحد. ينطبق ذلك عندما يكون تعبير القسم دالة حتمية لأعمدة LIMIT BY، بحيث لا يمكن لأي مجموعة LIMIT BY أن تمتد عبر قسمين. يتحكم فيه الإعداد الجديد allow_limit_by_partitions_independently (مفعّل افتراضيًا). #105126 (nihalzp).
  • تسريع استعلامات SELECT ... LIMIT N BY <cols> عندما تكون <cols> بادئة لمفتاح فرز الجدول، أو تصبح كذلك بعد أن يثبّت WHERE col = const الأعمدة البادئة. عند تفعيل ذلك، يقرأ MergeTree البيانات بترتيب المفتاح الأساسي، ويطبّق LIMIT BY أولًا التصفية في وضع التدفق باستخدام ذاكرة O(1) لكل تدفق مُرتب، مما يستبعد معظم البيانات، ثم يطبّق LIMIT BY العادي على البيانات المتبقية للحصول على النتيجة النهائية. يتحكم فيه الإعداد الجديد optimize_limit_by_in_order (مفعّل افتراضيًا). #105135 (nihalzp).
  • تسريع استعلامات LIMIT BY عبر إزالة تعبيرات المفاتيح الزائدة: يُحذف المفتاح الذي يكون دالة حتمية للمفاتيح الأخرى (مثلًا، يصبح LIMIT 5 BY x, f(x) هو LIMIT 5 BY x)، وتُستبدل الدالة الحقنية المطبقة على مفتاح بوسيطها (مثلًا، يصبح LIMIT 5 BY toString(x) هو LIMIT 5 BY x). يؤدي ذلك إلى تقييم عدد أقل من التعبيرات الأقل تكلفة لكل صف. يتحكم فيه الإعدادان الجديدان optimize_limit_by_function_keys وoptimize_injective_functions_in_limit_by، وكلاهما مفعّل افتراضيًا. #106818 (nihalzp).
  • تسريع تحليل الاستعلامات التي تحتوي على عدد كبير من استدعاءات الدوال أو استدعاءات دوال متداخلة بعمق، عبر إزالة تجزئة زائدة لشجرة الاستعلام من ذاكرة التخزين المؤقت لحل الدوال. #107516 (novikd).
  • موازاة معالجة نتائج CTE تعاودي: لم تعد عملية GROUP BY أو أي عملية أخرى على نتيجة كبيرة لـ WITH RECURSIVE مقتصرة على خيط واحد. #107694 (alexey-milovidov).

أداء التخزين والإدخال/الإخراج

  • تتشارك عملاء S3 الذين يستخدمون نقطة النهاية والحاوية نفسيهما ذاكرة تخزين مؤقت واحدة، مما يجنب تكرار اكتشاف المنطقة. #96802 (zvonand).
  • تحسين أداء النسخ في تخزين الكائنات عبر نسخ الكائنات الثنائية بالتوازي. #105089 (asya-ch).
  • تجنب قراءة محتويات الملفات عند استخدام تنسيق الإدخال One مع دوال الجداول الشبيهة بالملفات، مثل file وs3. #105157 (niyue).
  • يمكن للمفتاح الأساسي وفهارس التخطي في MergeTree الآن استبعاد الحبيبات عند استخدام عوامل تصفية تلتف فيها ifNull أو coalesce حول شرط، مثل ifNull(key = 0, 0) أو coalesce(key = 0, 0). كانت هذه المسندات — التي غالبًا ما تنشئها مولدات الاستعلامات لتحويل مقارنة قد تكون بـNULL إلى قيمة منطقية محددة — غير قابلة للتحليل سابقًا من جانب الفهارس، لذا لم يكن بالإمكان تخطي الحبيبات. يوسّع هذا إعداد allow_key_condition_coalesce_rewrite الحالي (المفعّل افتراضيًا). #106272 (andyzzhao).
  • تحسين أداء فك الترميز لأعمدة Parquet من نوعي FLOAT وDOUBLE المشفرة بـBYTE_STREAM_SPLIT. #106376 (Algunenano).
  • إصلاح حالات التوقف الطويلة عند تسجيل الدخول وبدء الاستعلامات في تخزين الوصول المكرّر عند تغيير عدد كبير من كيانات الوصول (سياسات الصفوف والأدوار والحصص وملفات تعريف الإعدادات) دفعة واحدة. تعيد الآن ذاكرة التخزين المؤقت لكل كيان احتسابها مرة واحدة لكل دفعة إشعارات بدلًا من مرة لكل كيان متغير، مما يزيل العمل التربيعي الذي كان قد يحتجز قفل الوصول لدقائق. #107672 (azat).
  • إصلاح تراجع في الأداء أدى إلى توقف الجلب المسبق عند قراءة عدد كبير من الملفات الصغيرة من تخزين الكائنات عبر s3 ودوال الجداول الأخرى، والرجوع إلى القراءات المتزامنة، مما أبطأ بشكل ملحوظ القراءات أحادية الخيط أو منخفضة التزامن لعدد كبير من الملفات الصغيرة. #108872 (fm4v).
  • تفعيل الجلب المسبق الأولي للكائنات الصغيرة عندما تمر قراءات تخزين الكائنات عبر ذاكرة التخزين المؤقت لنظام الملفات (filesystem_cache_name). سابقًا، ظلت قراءات عدد كبير من الملفات الصغيرة، مثل إدخال S3Queue، متزامنة ومقيدة بزمن الاستجابة عند تفعيل ذاكرة التخزين المؤقت لنظام الملفات. #109478 (fm4v).
  • تحسين PREWHERE للأعمدة الفرعية من Map عبر مراعاة حجمها على القرص. #110623 (Avogar).
  • يُطبّق الآن التحويل الكسول على الاستعلامات التي تتضمن FINAL وعامل تصفية وLIMIT صغيرًا، حتى دون ORDER BY (لـReplacingMergeTree). #110722 (KochetovNicolai).
  • تقليل وقت CPU اللازم لإزالة التكرار عند تفريغ عمليات الإدراج غير المتزامن التي تمتد عبر العديد من الأقسام. #111150 (valerypetrov).
  • إصلاح تراجع في أداء CPU للاستعلامات التي تنفذ عددًا كبيرًا من القراءات الصغيرة المستقلة من جزء MergeTree نفسه عندما يحتوي الجدول على أعمدة LowCardinality. كان الفحص الذي يحدد ما إذا كان الجزء يحتوي على قاموس مشترك واحد يمسح كل علامة في الجزء بأكمله لكل مهمة قراءة؛ أما الآن فيعثر على كل سلسلة من العلامات المتساوية باستخدام البحث الثنائي. كانت الاستعلامات بهذا النمط على الجداول ذات index_granularity صغير أبطأ بما يصل إلى عدة مرات منذ الإصدار 26.6. #116134 (groeneai).

تحسين استخدام الذاكرة

  • خُفِّضت الذاكرة المستخدمة في البيانات الوصفية للنوع Enum بما يصل إلى 10 مرات في الجداول التي تحتوي على أعمدة Enum. تظل عمليات البحث من القيمة إلى الاسم مماثلة في الأداء أو أسرع، بينما قد تكون عمليات البحث من الاسم إلى القيمة أثناء التحليل وإلغاء التسلسل أبطأ. #95668 (qoega).
  • خُفِّض ذروة استخدام الذاكرة في BACKUP عبر عدم نسخ القائمة الداخلية لمعلومات الملفات عند كتابة إدخالات النسخ الاحتياطي، وهو أمر مهم للنسخ الاحتياطية التي تحتوي على ملايين الملفات. #111162 (jkartseva).

تحسينات

الاستعلامات وSQL

  • تحديد الأعمدة حسب موضعها (بدلاً من أسمائها) عند إزالة الأعمدة غير المستخدمة من خطة الاستعلام. يتيح ذلك إزالة الأعمدة غير المستخدمة عند وجود أسماء أعمدة مكررة. #100586 (antaljanosbenjamin).
  • إضافة SESSION_USER كاسم مستعار لـ currentUser() غير حساس لحالة الأحرف، لتحقيق التوافق مع PostgreSQL / معيار SQL. #106081 (takumihara).
  • تقليل زمن استجابة الإلغاء للاستعلامات التي تعمل عبر بروتوكول MySQL: أصبح KILL QUERY يقاطع تسلسل المخرجات داخل جزء واحد بدلاً من انتظار إرسال الجزء بالكامل إلى العميل. #106535 (rvasin).
  • إصلاح الخطأ ILLEGAL_TYPE_OF_ARGUMENT في الاستعلامات الموزعة التي تحتوي على serialize_query_plan = 1 وتتضمن لامبدا ذات وسيطة ثابتة (مثل arrayMap(t -> t.2, ...)). تُحفظ الآن الأعمدة الثابتة لعُقد INPUT في ActionsDAG عند تسلسل خطة الاستعلام. #107124 (alexey-milovidov).
  • تقليل زمن استجابة الإلغاء للاستعلامات التي تعمل عبر بروتوكول MySQL: أصبح KILL QUERY يقاطع تسلسل المخرجات داخل جزء واحد بدلاً من انتظار إرسال الجزء بالكامل إلى العميل. #107228 (rvasin).

الدوال

  • أصبح EXPLAIN SYNTAX ينسّق عوامل التشغيل باستمرار على هيئة استدعاءات دوال في مخرجات الشرح (مثل plus(1, 2) بدلًا من 1 + 2). #94681 (1abdelhalim).
  • أصبح النمط بأسلوب PostgreSQL expr OP SOME(array) / expr OP ALL(array) (عندما لا يكون الطرف الأيمن استعلامًا فرعيًا) مدعومًا، ويُعاد تحويله إلى has / NOT has مع =/<>، أو إلى دوال لامبدا arrayExists / arrayAll مع عوامل المقارنة الأخرى. لا تُقبل ANY في صيغة المصفوفة لأن any هي أيضًا دالة تجميعية؛ استخدم SOME بدلًا منها. وتظل صيغة الاستعلام الفرعي لـ ANY/SOME/ALL تُحوَّل إلى IN / NOT IN. #105129 (alexey-milovidov).
  • أُضيف دعم الدوال multiSearchAny وmultiSearchAnyUTF8 وmultiMatchAny في فهارس النص. كما تحسّن تحليل فهرس النص للدالة match: إذ بات بإمكان الأنماط ذات المجموعات البديلة تخطي المزيد من الحبيبات. #106279 (CurtizJ).
  • تفرض الدالة h3PolygonToCells الآن الحد الأقصى لحجم المصفوفة على جميع المضلعات ضمن MultiPolygon، وتتحقق من رموز الإرجاع الخاصة بمكتبة H3، وترفض وسائط MultiLineString بدلًا من إرجاع نتيجة فارغة بصمت. #106399 (Algunenano).
  • يتحقق إلغاء تسلسل حالات الدوال التجميعية contingency وcramersV وcramersVBiasCorrected وtheilsU الآن من أن الأعداد المخزنة تُشكّل جدول توافق متسقًا، ويُطلق استثناء CORRUPTED_DATA خلاف ذلك. #107185 (nihalzp).
  • تحسين تقدير الكاردينالية في محسّن خطة الاستعلام: يرث العمود الناتج من دالة حتمية ذات وسيطة واحدة (مثل toYear(date)) الآن عدد القيم المميزة لوسيطتها بوصفه حدًا أعلى، بدلًا من بقائه دون إحصاءات، مما يؤدي إلى إعادة ترتيب أدق لعمليات الربط. #107757 (davenger).

محركات الجداول والتخزين

  • إصلاح مستهلكي محرك جداول Kafka الذين ظلوا يستخدمون فترة استطلاع قصيرة بعد إسناد القسم، بحيث يعودون إلى قيمة kafka_poll_timeout_ms المضبوطة ويتجنبون عمليات الاستطلاع الفارغة المفرطة، وأجزاء البيانات المُدرجة الأصغر، وأعباء الدمج الإضافية بعد إعادة التوازن. #100431 (sugaf1204).
  • يمكن لمحركات جداول بحيرة البيانات، بما في ذلك Iceberg وDeltaLake، الآن استخدام أقراص S3 وAzure المغلفة بذاكرة تخزين مؤقت، مما يتيح للقراءات المتكررة الاستفادة من ذاكرة التخزين المؤقت لنظام الملفات. #102017 (RinChanNOWWW).
  • السماح بدمج عوامل التصفية المُضافة بعد التحديد الأولي لـ PREWHERE (دفع المسندات، أو عوامل التصفية وقت التشغيل، أو PREWHERE صريح مع WHERE يحدده المخطط) في PREWHERE القائم خلال تمريرة ثانية للمحسّن، بدلًا من بقائها كخطوة Filter منفصلة فوق قراءة MergeTree. #105445 (yariks5s).
  • أُضيف الإعداد wait_for_part_commit_in_dependent_materialized_views. عند تمكينه، يمكن لعرض مادي متسلسل ينضم مجددًا إلى مصدره رؤية الصف الذي يجري إدراجه حاليًا. #105943 (ahmadov).
  • دعم EXTRACT(TIMEZONE_HOUR FROM dt) وEXTRACT(TIMEZONE_MINUTE FROM dt) المتوافقين مع PostgreSQL لاستخراج جزئي الساعة والدقيقة من إزاحة المنطقة الزمنية، ودعم EXTRACT(<unit> FROM INTERVAL n <unit>) / date_part('<unit>', INTERVAL n <unit>) لاستخراج القيمة من فترة زمنية. #106227 (vinayakj592).
  • تنفيذ SYSTEM RESTART DISK <name>: يعيد الآن تحميل البيانات الوصفية للقرص في الذاكرة ويفحص مجددًا أجزاء بيانات جداول النسخ المتماثلة للقراءة فقط الموجودة عليه. يتيح ذلك لنسخة متماثلة للقراءة فقط من جدول على تخزين plain_rewritable مشترك رصد البيانات التي كتبها خادم آخر عند الطلب، دون انتظار refresh_parts_interval أو إعادة تشغيل الخادم. #106645 (jrdi).
  • تخطي تحميل ملفات العلامات غير الضروري للبيانات المشتركة المتقدمة في JSON. #107051 (Avogar).
  • أُضيف الإعداد materialized_postgresql_use_extended_date_and_time_types الذي يُضبط عند الإنشاء لمحرك قاعدة البيانات MaterializedPostgreSQL. افتراضيًا (مُمكّن)، تُستنتج أعمدة PostgreSQL من نوع date/timestamp كأنواع Date32/DateTime64؛ ويؤدي ضبطه على 0 عند تنفيذ CREATE DATABASE إلى استنتاج أنواع Date/DateTime الأضيق. الإعداد غير منطبق على محرك جدول MaterializedPostgreSQL. #107428 (alexey-milovidov).
  • يمكن لـ MergeTree الآن قراءة تدفق مضغوط تستخدم كتله برامج ترميز مختلفة. هذا هو المتطلب المسبق من جهة القراءة لميزة الاختيار التكيفي لبرنامج الترميز. #108592 (rienath).
  • استخدام فهرس التخطي bloom_filter لمسندات IN على عمود مفهرس مباشرةً عندما يكون transform_null_in = 1 ولا تحتوي مجموعة IN على قيمة NULL. سابقًا، كان يُتخطى الفهرس في مثل هذه الاستعلامات، مما يفرض إجراء فحص كامل. #111329 (groeneai).

S3 والتخزين الكائني

  • تسجيل الامتيازات في system.query_log.used_privileges لجميع عمليات التحقق من الوصول التي تم منحها، بما في ذلك تلك التي تمر عبر مسار isGranted غير المُطلق للاستثناءات (checkAccessWithFilter). سابقًا، لم تكن تُسجَّل سوى الامتيازات التي يُتحقق منها عبر نقاط الدخول المُطلقة للاستثناءات (checkAccess / checkGrantOption)، مما كان يجعل READ ON FILE / READ ON S3 / READ ON AZURE / READ ON URL غير ظاهرة في سجل التدقيق لاستعلامات DESCRIBE وCREATE TABLE AS والاستعلامات المشابهة التي تستخدم دوال الجداول file / s3 / azure / url. لم يتغير فرض التحكم بالوصول. #104693 (alexbakharew).
  • إتمام طلب التحميل متعدد الأجزاء النهائي إلى S3 بشكل غير متزامن عبر متعقب المهام، بحيث يمكن أن يتداخل مع رفع الجزء الأخير بدلًا من تنفيذه تسلسليًا أثناء الإنهاء. #105487 (asya-ch).
  • زيادة القيمة الافتراضية للإعداد persistent_processing_node_ttl_seconds لـ S3Queue وAzureQueue من ساعة واحدة إلى ست ساعات، لمنع المعالجة طويلة الأمد أو المعاد تشغيلها من فقدان قفل الحاوية مبكرًا جدًا. #106838 (kssenii).
  • دعم القيم REDUCED_REDUNDANCY وSTANDARD_IA وONEZONE_IA وGLACIER_IR وEXPRESS_ONEZONE، بالإضافة إلى STANDARD وINTELLIGENT_TIERING، للإعداد s3_storage_class_name. #107251 (adityaksolves).
  • يُحدَّد مسار العينة لتقسيم Hive لجداول التخزين الكائني (مثل S3) عند الاستخدام الأول للجدول بدلًا من CREATE/ATTACH، لذا لم تعد نقطة نهاية يتعذر الوصول إليها تمنع إنشاء الجدول وبدء تشغيل الخادم. #111842 (evillique).

الإعدادات والضبط

  • جعل استراتيجية تقسيم Hive الافتراضية ضمن إعداد التوافق file_like_engine_default_partition_strategy. #86746 (kssenii).
  • أُضيفت أربعة إعدادات جديدة لجداول MergeTree للتحكم في المعلمات الافتراضية للفهارس النصية: text_index_dictionary_block_size، وtext_index_dictionary_block_frontcoding_compression، وtext_index_posting_list_block_size، وtext_index_posting_list_codec. تتيح هذه الإعدادات ضبط سلوك الفهرس النصي على مستوى الجدول دون تحديد المعلمات في كل تعريف فهرس. وتظل الوسيطات الصريحة لكل فهرس ذات أولوية. #100626 (CurtizJ).
  • أُضيف الإعداد output_format_pretty_use_nbsp_for_padding لعرض المسافات الحاشية في تخطيط الجداول ضمن تنسيقات Pretty ذات النمط الجدولي على هيئة U+00A0 NO-BREAK SPACE عندما تكون قيمة output_format_pretty_grid_charset هي UTF-8. يساعد ذلك مخرجات Pretty المنسوخة على الحفاظ على محاذاة الجداول في الأدوات التي تختزل المسافات العادية. يكون الإعداد معطلاً افتراضياً، وتحتفظ المخرجات بترميز المحارف ASCII بالمسافات العادية. #103559 (ashrithb).
  • دعم التوافق مع محلل الاستعلامات القديم عبر الإعداد analyzer_compatibility_allow_non_aggregate_in_having. عند تفعيله، تُنقل الشروط غير التجميعية من HAVING إلى WHERE. #104232 (novikd).
  • لم تعد عبارة OPTIMIZE TABLE ... ON CLUSTER وعمليات DDL الأخرى تتعطل عندما يكون لدى الجدول الهدف table_readonly = 1. يُصدر الإعداد الآن رمز خطأ مخصصاً جديداً هو TABLE_IS_PERMANENTLY_READ_ONLY، ويتعامل معه DDLWorker على أنه غير قابل لإعادة المحاولة، بخلاف الخطأ المؤقت TABLE_IS_READ_ONLY الذي ينشأ أثناء انقطاع الاتصال المؤقت بـ ZooKeeper في ReplicatedMergeTree. كما أصبح إعداد table_readonly مرفوضاً صراحةً لـ ReplicatedMergeTree، سواء عند الإنشاء أو عبر ALTER MODIFY SETTING. #105109 (alexey-milovidov).
  • أصبح ترتيب الفرز التنازلي في مفاتيح فرز MergeTree (مثل ORDER BY (time DESC, key)) مدعوماً دائماً، ولم يعد يتطلب الإعداد التجريبي allow_experimental_reverse_key الذي أصبح متقادماً. #106440 (nikitamikhaylov).
  • دعم keyed_by_normalized_query_hash للحصص المعرّفة في إعدادات الخادم الثابتة (users.xml)، بما يتوافق مع صياغة DDL الحالية CREATE QUOTA ... KEYED BY normalized_query_hash. #107654 (alexey-milovidov).
  • لم يعد إعداد التوافق يطبق الإعدادات المتقادمة، لذا لا يعلّمها كمعدّلة ولا يصدر تحذيرات بشأنها. #107737 (UberDever).
  • أُضيف الإعداد analyzer_compatibility_multiple_joins_qualify_column_names (وقيمته الافتراضية false). عند تفعيله، وإذا احتوى بند FROM في استعلام على عمليتي JOIN أو أكثر، تحاكي أسماء أعمدة النتائج التي ينتجها محلل الاستعلامات إعادة كتابة عمليات الربط المتعددة في المحلل القديم: تُسمى الأعمدة الموسعة من * بـ <alias-or-table>.<column>، ويحتفظ مرجع العمود غير المستعار في قائمة SELECT باسمه تماماً كما كُتب. يتيح ذلك للاستعلامات الخارجية التي تشير إلى مثل هذه الأسماء المؤهلة، مثل SELECT ll.Date FROM (SELECT * FROM t AS ll JOIN t1 ON ... JOIN t2 ON ...)، أن تعمل كما كانت مع المحلل القديم. كما أُصلح فقدان محلل الاستعلامات لأسماء أعمدة النتائج المؤهلة للأعمدة الموسعة من * عند استخدام group_by_use_nulls مع ROLLUP أو CUBE أو GROUPING SETS، إذ كان ذلك ينتج أسماء أعمدة نتائج مكررة ويعطل الإشارات الخارجية إلى تلك الأعمدة. #110746 (novikd).
  • أُضيف الإعداد analyzer_compatibility_apply_final_to_all_joined_tables لاستعادة السلوك القديم، حيث كان مُعدِّل FINAL في الجدول الواقع أقصى يسار عبارة JOIN يُطبَّق أيضًا على الجداول الأخرى المرتبطة. يُسجَّل هذا الإعداد في سجل تغييرات الإعدادات، لذا فإن استخدام compatibility مع إصدارات أقدم من 26.6 يستعيد الدلالات القديمة تلقائيًا. #111589 (fm4v).
  • أُضيف إعداد MergeTree جديد باسم text_index_version للتحكم في إصدار التنسيق المخزَّن على القرص لفهارس النصوص: v0_initial أو v1_with_codec أو v2_with_positions. أثناء الترقية التدريجية أو قبل الرجوع إلى إصدار أقدم، اضبطه على إصدار أقدم لضمان استمرار الخوادم الأحدث في كتابة أجزاء فهرس النصوص بتنسيق يمكن للخوادم الأقدم قراءته؛ ويُعدّله إعداد التوافق تلقائيًا. #111803 (CurtizJ).

جداول النظام والمراقبة

  • تعبئة used_storages في system.query_log باسم محرك التخزين عند الاستعلام عن الجداول عبر DataLakeCatalog. #100706 (melvynator).
  • إضافة الأعمدة current_projection وcurrent_projection_progress وprojections_completed وprojections_remaining إلى system.merges لعرض تقدّم دمج الإسقاطات. #102611 (amosbird).
  • باتت محركات الجداول تتضمن وثائق مضمنة يمكن الاطلاع عليها عبر الأعمدة الجديدة description وsyntax وexamples وintroduced_in وrelated في جدول system.table_engines. #106177 (alexey-milovidov).
  • باتت محركات قواعد البيانات تتضمن وثائق مضمنة يمكن الاطلاع عليها عبر الأعمدة الجديدة description وsyntax وexamples وintroduced_in وrelated في جدول system.database_engines. #106178 (alexey-milovidov).
  • باتت أنواع البيانات تتضمن وثائق مضمنة يمكن الاطلاع عليها عبر الأعمدة الجديدة description وsyntax وexamples وintroduced_in وrelated في جدول system.data_type_families. #106180 (alexey-milovidov).
  • باتت تنسيقات الإدخال/الإخراج تتضمن وثائق مضمنة يمكن الاطلاع عليها عبر الأعمدة الجديدة description وexamples وintroduced_in وrelated في جدول system.formats. #106181 (alexey-milovidov).
  • باتت موفّقات الدوال التجميعية تتضمن وثائق مضمنة يمكن الاطلاع عليها عبر الأعمدة الجديدة description وsyntax وexamples وintroduced_in وrelated في جدول system.aggregate_function_combinators. #106185 (alexey-milovidov).
  • أُضيف جدول جديد system.data_skipping_index_types يسرد أنواع فهارس تخطي البيانات المتاحة، إلى جانب الوثائق المضمنة (description وsyntax وexamples وintroduced_in وrelated). #106186 (alexey-milovidov).
  • أُضيف جدول جديد system.disk_types يسرد أنواع الأقراص المتاحة، إلى جانب الوثائق المضمنة (description وsyntax وexamples وintroduced_in وrelated). #106187 (alexey-milovidov).
  • أُضيفت المقاييس غير المتزامنة TotalUncompressedBytesOfMergeTreeTables وTotalUncompressedBytesOfMergeTreeTablesSystem، التي تُبلّغ عن إجمالي الحجم غير المضغوط للبيانات المخزنة في جداول عائلة MergeTree. #106364 (alexey-milovidov).
  • إضافة حدث الملف التعريفي GlobalMemoryLimitExceeded ليتمكن المشغّلون من مراقبة حالات بلوغ حد الذاكرة على مستوى الخادم. #106466 (sacheendra).
  • أُضيفت المقاييس غير المتزامنة ExecutableUserDefinedFunctionMemoryResidentBytes وExecutableUserDefinedFunctionProcesses، التي تُبلّغ عن الذاكرة المقيمة (VmRSS) وعدد العمليات النشطة للدوال المعرفة من قبل المستخدم executable وexecutable_pool، بما في ذلك العمليات التابعة وعمّال التجمع الخاملون. #107300 (HanziJiang).
  • أُضيف show_remote_databases_in_system_tables، وهو مفعّل افتراضيًا، للسماح للمستخدمين بإخفاء قواعد بيانات MySQL وPostgreSQL من system.tables وsystem.columns وsystem.completions. ويظل show_data_lake_catalogs_in_system_tables مقتصرًا على التحكم في ظهور DataLakeCatalog فقط. #104416 (pamarcos). #109082 (pamarcos).

ClickHouse Keeper

  • تغييرات متنوعة على Keeper تجعل أداءه أسرع إجمالًا بنحو الضعف (تحسين التجميع على دفعات، وإرسال الرسائل إلى القائد عبر خط أنابيب، وإلحاق السجلات عبر خط أنابيب). #101757 (al13n321).
  • إضافة المزيد من أحداث ملف تعريف Keeper (من جهة الخادم ومن جهة العميل) للمراقبات. #105336 (scanhex12).
  • إضافة جدول system.keeper_snapshots جديد خاص بـ Keeper يتضمن معلومات عن لقطات ClickHouse Keeper المحلية. #105571 (mstetsyuk).
  • إضافة جدول system.keeper_changelogs جديد خاص بـ Keeper يتضمن معلومات عن ملفات سجل التغييرات المحلية لـ ClickHouse Keeper (سجل Raft). #105617 (mstetsyuk).
  • إضافة جدول system.keeper_cluster خاص بـ Keeper. يحتوي على صف واحد لكل عضو في مجموعة Raft كما يراه Keeper الحالي. #105646 (mstetsyuk).
  • تقليل ذروة استخدام الذاكرة عند تطبيق اللقطات المستلمة في ClickHouse Keeper باستخدام KeeperMemoryStorage. #105851 (antonio2368).
  • إضافة إعدادات coordination_settings في Keeper للحد من قبول إدخالات السجل غير المثبتة في NuRaft وخنق الفحص العكسي لعمليات إلحاق الإدخالات. #106108 (antonio2368).

إدارة الذاكرة

  • أُصلحت رسائل أخطاء البنية التي قد تتضمن بايتات من ذاكرة مجاورة بعد أن يتراجع المُحلِّل إلى ما بعد نهاية تعليمة. #105086 (groeneai).
  • خُفِّض استخدام الذاكرة عند فتح نسخة احتياطية (من أجل RESTORE أو كأساس لنسخة احتياطية تزايدية باستخدام BACKUP). تُحلَّل الآن البيانات الوصفية .backup كتدفق بدلاً من تحميلها في شجرة مستند XML داخل الذاكرة، مما يتجنب تخصيص شجرة DOM بحجم عدة غيغابايتات للنسخ الاحتياطية الكبيرة، ولا سيما التزايدية. #109107 (jkartseva).
  • خُفِّض ذروة استخدام الذاكرة عند إنهاء BACKUP. لم تعد كتابة البيانات الوصفية للنسخة الاحتياطية تنسخ معلومات جميع الملفات إلى متجه مؤقت (وهو ما كان يستهلك مؤقتًا عدة غيغابايتات للنسخ الاحتياطية التي تضم ملايين الملفات)؛ بل تُكرَّر المعلومات الآن في موضعها. #109861 (jkartseva).

تنسيقات البيانات

  • يمكن للمستخدمين الآن إدراج حقول Avro Fixed لمتغيرات الأعداد الصحيحة ذات 8 بت/16 بت/32 بت/64 بت. #98139 (patrickpichler).
  • يعيد تنسيق AvroConfluent الآن محاولة الاتصال بعميل HTTP لـ Confluent Schema Registry عند حدوث حالات فشل عابرة (انتهاء مهلة النقل، رفض الاتصال، أخطاء DNS، وHTTP 5xx/408/429) باستخدام تراجع أُسّي، بدلاً من إلغاء عملية INSERT عند أول خلل في الشبكة. تتحكم الإعدادات الجديدة format_avro_schema_registry_max_retries (القيمة الافتراضية 5) وformat_avro_schema_registry_retry_initial_backoff_ms (القيمة الافتراضية 100) في هذه السياسة. وتظل أخطاء التحقق من المخطط (HTTP 409 وAvro JSON غير السليم) قاتلة. #106661 (groeneai).
  • حُفظت رموز الخطأ الأصلية لـ ClickHouse للأخطاء المُعادة عبر Apache Arrow. #107267 (azat).

المجموعات المسماة والقواميس

  • أُضيف إعداد enable_compression إلى دالة الجدول mysql ومحرك الجدول MySQL ومحرك قاعدة البيانات MySQL ومصدر القاموس SOURCE(MYSQL) والمجموعات المسماة. عند تفعيله، يتفاوض ClickHouse على ضغط على مستوى بروتوكول MySQL لجميع البيانات المنقولة عبر الاتصال. #103229 (bernardlim).
  • أُضيف جدول جديد system.dictionary_layouts يسرد مخططات القواميس المتاحة إلى جانب التوثيق المضمّن (description, syntax, examples, introduced_in, related). #106182 (alexey-milovidov).
  • أُضيف جدول جديد system.dictionary_sources يسرد مصادر القواميس المتاحة إلى جانب التوثيق المضمّن (description, syntax, examples, introduced_in, related). #106184 (alexey-milovidov).
  • أصبح نوع التخزين الفعلي للمجموعات المسماة متاحًا الآن باسم named_collections_storage.type في system.server_settings وعبر getServerSetting('named_collections_storage_type'). #111806 (pamarcos).

تحسينات أخرى

  • تحسين تلميحات أسماء الجداول في رسائل الخطأ: لم تعد تقترح الاسم نفسه تمامًا، وأصبحت تتضمن اسم قاعدة البيانات في الاقتراح (مثلًا، “هل تقصد other_db.my_table؟”). #95116 (matt-metivier).
  • تحسين رسالة الخطأ الخاصة بالمعرّفات غير المحلولة في الاستعلامات التي لا تتضمن عبارة FROM، بحيث تقترح إضافتها. #101769 (Onyx2406).
  • إصلاح عدم استخدام PREWHERE مع استعلام فرعي IN على أعمدة المفتاح الأساسي لفهرس المفتاح الأساسي في استبعاد الحبيبات، مما كان يؤدي إلى مسح الجدول بالكامل بدلًا من قراءة الحبيبات ذات الصلة فقط. #102570 (nikitamikhaylov).
  • أصبحت العروض المادية القابلة للتحديث تواصل التحديث بعد استبدال جدولها الهدف باستخدام EXCHANGE TABLES وحذف الجدول القديم. سابقًا، كان من الممكن أن تفشل عمليات التحديث بسبب استثناء UNKNOWN_TABLE لأنها احتفظت بـ UUID الخاص بالجدول القديم. #102724 (seva-potapov).
  • تفعيل enable_join_transitive_predicates افتراضيًا. #103724 (davenger).
  • أصبح العرض المادي القابل للتحديث يدعم الآن REFRESH DEPENDS ON لتشغيل التحديثات عند تحديث عرض مادي قابل للتحديث آخر، بدلًا من الاعتماد على جدول زمني. (كان REFRESH EVERY ... DEPENDS ON موجودًا بالفعل، لكن لم يكن بالإمكان استخدامه بصورة موثوقة لحالة الاستخدام هذه.) راجع وثائق CREATE MATERIALIZED VIEW. #104440 (al13n321).
  • إضافة خيار EXPLAIN PIPELINE لدمج سلاسل المعالجات المتكررة. #104662 (niyue).
  • إضافة REGEXP_SUBSTR كاسم مستعار لـ regexpExtract غير حساس لحالة الأحرف، للتوافق مع Oracle/MySQL/Snowflake. #105122 (alexey-milovidov).
  • إضافة date_part('unit', expr) كصياغة مختصرة لـ EXTRACT(unit FROM expr). جميع أنواع Interval القياسية والإضافات الخاصة بـ PostgreSQL (epoch, dow, doy, isodow, isoyear, century, decade, millennium) مدعومة. #105127 (alexey-milovidov).
  • أصبح QueryConditionCache يسجل الآن الحبيبات المستبعدة كلًّا على حدة، حتى ضمن دفعات القراءة التي تجتاز PREWHERE جزئيًا، مما يقلل عدد العلامات التي تعيد الاستعلامات اللاحقة ذات الشرط نفسه قراءتها. #105335 (hanfei1991).
  • إضافة دعم BFloat16 لدوال الشروط الرقمية. #105391 (mohhddhassan).
  • دعم الإحصاءات الأساسية، وهي إحصاءات مدمجة لكل عمود تخزن القيم الرقمية الدنيا/العليا، ومتوسط طول السلاسل النصية، وأعداد NULL عند الاقتضاء. #106048 (hanfei1991).
  • دعم المعدّل الختامي NULL / NOT NULL في ALTER TABLE ... ADD/MODIFY COLUMN، بما يتوافق مع CREATE TABLE. #106150 (takumihara).
  • يجمع مُحسِّن PREWHERE الآن المترابطات التي تشير إلى مجموعة الأعمدة نفسها قبل تقدير الانتقائية، بحيث تُقيَّم شروط مثل a > 2500 AND a < 2502 معًا كنطاق موحّد (انتقائية تقارب 0.02%) بدلًا من تقييمها كمسندين مستقلين (انتقائية تقارب 50% لكل منهما). يوفّر ذلك ترتيبًا أدق لشروط PREWHERE عند توفر إحصاءات الأعمدة. #106337 (hanfei1991).
  • لا تطبع المقدمة “Stack trace (when copying this message, always include the lines below):” في رسائل الاستثناءات إذا كان تتبّع المكدس فارغًا بالفعل. #106524 (alexey-milovidov).
  • تم إصلاح CREATE TABLE ... CLONE AS (and REPLACE / ATTACH PARTITION ... FROM) على الأقراص المشفّرة، إذ كان ينسخ البيانات بدلًا من إنشاء روابط صلبة لها. #106731 (nikitamikhaylov).
  • تم إصلاح قواعد بيانات DataLakeCatalog ذات catalog_type = 'onelake' لتقرأ بيانات الجداول باستخدام نقطة نهاية OneLake Blob (.blob.fabric.microsoft.com) افتراضيًا. اضبط onelake_use_blob_endpoint = false للإبقاء على سلوك نقطة نهاية DFS السابقة (.dfs.fabric.microsoft.com). #106843 (scanhex12).
  • خُفِّض حمل CPU الناتج عن التسجيل غير المتزامن عند ارتفاع معدلات السجل، وذلك بإشعار مستهلك السجل فقط عند انتقال قائمة الانتظار من فارغة إلى غير فارغة، بدلًا من إشعاره عند كل رسالة. #107352 (nikitamikhaylov).
  • تم إصلاح قراءة طول auth_response في مصافحة MySQL، إذ كانت بايتات الطول ذات القيمة >= 128 تُفسَّر كقيمة بحجم عدة غيغابايت لأنها قُرئت باعتبارها char موقّعًا. #107384 (uwezkhan).
  • يربط MaterializedPostgreSQL الآن أعمدة PostgreSQL من النوع numeric(p, 0) التي تتجاوز دقتها 76 (مثل numeric(78, 0) المستخدم للأعداد الصحيحة ذات 256 بت) بالنوع Int256 في ClickHouse بدلًا من الفشل برسالة “Precision too big”. وتُرفض القيم التي لا تتسع في Int256 برسالة خطأ واضحة. #107431 (alexey-milovidov).
  • أصبح Nullable(Tuple(...)) الآن في مرحلة Beta. وهو معطّل افتراضيًا؛ اضبط enable_nullable_tuple_type = 1 لاستخدامه. #107754 (nihalzp).
  • لم تعد عمليات الإدراج غير المتزامنة تسجّل القائمة الكاملة من query_ids عند مستوى trace/debug، إذ كان ذلك قد يؤدي، منذ الإصدار 26.2، إلى تضخم text_log في الخدمات ذات حركة الإدراج غير المتزامن الكثيفة. وأصبحت الأسطر التفصيلية الآن عند مستوى test. #107852 (CheSema).
  • خُفِّض استخدام البيانات الوصفية لذاكرة التخزين المؤقت لنظام الملفات من خلال تحرير إدخالات priority غير الصالحة فورًا. #107903 (kssenii).
  • يُستخدم الآن فهرس التخطي bloom_filter على عمود Array مع arrayJoin(column) IN (set) وarrayJoin(column) GLOBAL IN (set) وarrayJoin(column) = const، بالطريقة نفسها التي كان يُستخدم بها بالفعل مع hasAny(column, set) وhas(column, const). في السابق، كانت صيغ arrayJoin ... هذه تلجأ إلى فحص كامل. #109536 (groeneai).
  • يستخدم IS NOT DISTINCT FROM وIS TRUE الآن فهارس المفتاح الأساسي وminmax لتجاوز الحبيبات، كما في حالة =. سابقًا، كان k IS NOT DISTINCT FROM 42 و(k = 42) IS TRUE يفحصان جميع الحبيبات. #110006 (groeneai).

إصلاحات الأخطاء

إصلاحات JOIN

  • إصلاح دالة nested (المستخدمة داخليًا بواسطة ARRAY JOIN) التي كانت تزيل LowCardinality من أنواع الأعمدة، مما كان يؤدي إلى تحوّل Array(LowCardinality(String)) إلى Array(String) في المخرجات. #98974 (Onyx2406).
  • إصلاح إعادة ترتيب عمليات الربط التي كانت تُسقط بصمت الصفوف غير المتطابقة من RIGHT/LEFT JOIN عند ربطها بفاصلة (ربط تبادلي) مع جدول آخر، مثل t1 RIGHT JOIN t2 ON t1.c = t2.c, t3. كان الاستعلام يُرجع سابقًا نتيجة الربط الداخلي بدلًا من نتيجة الربط الخارجي. #101684 (groeneai).
  • إصلاح خطأ LOGICAL_ERROR (“المنفذ غير متصل”، الرمز 49) الذي قد يحدث عند تنفيذ استعلامات تتضمن VIEW مع تجميع داخل JOIN. #102574 (Ergus).
  • إصلاح تجاهل max_rows_to_transfer وmax_bytes_to_transfer بصمت في استعلامات GLOBAL IN وGLOBAL JOIN ضمن المحلل الجديد. تُطلق الإعدادات الآن SET_SIZE_LIMIT_EXCEEDED (أو تُوقِف التنفيذ، بحسب transfer_overflow_mode) عندما يتجاوز الجدول الخارجي المُجسَّد الحد المُهيأ، بما يطابق سلوك المحلل القديم. #104119 (groeneai).
  • إصلاح نتائج خاطئة أو فشل في استعلامات JOIN التي تستخدم join_algorithm = 'direct' مع جدول MergeTree على الجانب الأيمن، عندما تعيد عملية التحسين ترتيب أعمدة البحث. #104174 (groeneai).
  • إصلاح خطأ كانت فيه الاستعلامات التي تجمع بين arrayJoin وORDER BY ... LIMIT بعد JOIN قد تُرجع صفر صفوف بصمت. لم تعد عملية تحسين خطة الاستعلام التي ترفع تقييم الدالة فوق SortingStep تُطبَّق عندما يحتوي التعبير المرفوع على arrayJoin، إذ يمكن لـarrayJoin تغيير عدد الصفوف. #104558 (groeneai).
  • إصلاح خطأ منطقي في LIMIT BY السالب في بعض الحالات عند استخدامه مع ARRAY JOIN. #105403 (nihalzp).
  • إضافة إعداد توافق جديد analyzer_compatibility_prefer_alias_over_subcolumn (معطّل افتراضيًا). عند تفعيله، يفضّل المحلل الجديد تفسير بادئة الاسم المستعار على مطابقات الأعمدة الفرعية لـTuple أو الأعمدة المنقطة للمعرّفات متعددة الأجزاء، مستعيدًا سلوك المفسّر السابق. يتجنب ذلك أخطاء AMBIGUOUS_IDENTIFIER (وما يتصل بها) عندما يربط استعلام جدولًا يطابق اسمه جدولًا داخليًا في تعبير جدول شائع/استعلام فرعي يستخدم SELECT * على ربط، إذ قد تتسرب أعمدة أُعيدت تسميتها باستخدام العلامة النجمية (مثل b.id) بمعرّفات الجدول الداخلي إلى النطاق الخارجي. #105491 (vdimir).
  • إصلاح نتائج قد تكون خاطئة لاستعلامات تجمع بين ربط خارجي وربط داخلي لاحق يشير إلى الجانب الذي يوفّر قيم NULL في الربط الخارجي. كان من الممكن أن تختار إعادة ترتيب عمليات الربط خطة تنقل شروط الربط الداخلي إلى عبارة ON الخاصة بالربط الخارجي. #105992 (vdimir).
  • تحسين التوافق مع المحلل القديم. إذا كان للجدول أعمدة مثل x.a Array, x.b Array, x String، تُفضّل المصفوفات في ARRAY JOIN x. #106069 (KochetovNicolai).
  • إصلاح استثناء في استعلامات INNER JOIN مع جدول MergeTree فارغ على الجانب الأيسر عند تفعيل enable_parallel_replicas وquery_plan_use_new_logical_join_step وquery_plan_optimize_join_order_algorithm = 'greedy'. #106338 (KochetovNicolai).
  • إصلاح خطأ منطقي (Left and right columns have same names) في مُحسِّن ترتيب الربط، قد يحدث في عمليات الربط المنفذة باستخدام النسخ المتماثلة المتوازية عندما تشترك علاقتان في مخطط الربط في أسماء الأعمدة. #106418 (alexey-milovidov).
  • إصلاح استثناء LOGICAL_ERROR (Invalid number of rows in Chunk) في JoiningTransform لعملية LEFT JOIN ذات مفاتيح فريدة في الجانب الأيمن وشرط ON مختلط وقيمة صغيرة لـ max_joined_block_size_rows. #106928 (groeneai).
  • إصلاح استثناء (LOGICAL_ERROR) في مرشح JOIN أثناء التشغيل عندما يحتوي مفتاح الربط على نوع Variant أو Dynamic متداخل داخل Tuple أو Array أو Map، ويحتوي الجانب الأيمن من الربط على قيمة مميزة واحدة. #106931 (groeneai).
  • إصلاح LOGICAL_ERROR (Expected the argument N to have X rows, but it has Y) عند تنفيذ دالة على عمود Dynamic ناتج عن JOIN على Dynamic (مثل الصفوف غير المنضمة في RIGHT/FULL JOIN، أو استعلام فرعي EXISTS مترابط أُزيل ترابطه وحُوِّل إلى ربط). #107095 (groeneai).
  • إصلاح استثناء خطأ منطقي Bad cast from type DB::IColumn const* to DB::ColumnNullable const* عندما تُمرَّر نجمة مؤهلة (t.*) عبر مفتاح JOIN ... USING إلى دالة تجميعية، ويحتوي الجانب الآخر من ربط خارجي على مفتاح Nullable (مع join_use_nulls = 0). #107129 (groeneai).
  • إصلاح خطأ منطقي (Unexpected return type from equals. Expected Nullable(UInt8). Got UInt8) عندما يدفع تحسين تمرير الفصل المنطقي (المسند الجزئي) شرطًا عبر مفتاح USING وسّعه JOIN. وإصلاح أيضًا تعطل للخادم (خطأ تجزئة) في المحلل عند حل المعرّفات في استعلامات JOIN ... USING التي تحتوي على فروع if/multiIf قابلة للطي الثابت وتشير إلى معرّفات غير معروفة. #107407 (groeneai).
  • إصلاح مرشح JOIN أثناء التشغيل الذي كان ينتج نتائج خاطئة لأعمدة JSON. #107663 (Avogar).
  • إصلاح استثناء خطأ منطقي Bad cast from type DB::ColumnNullable to DB::ColumnVector<...> عندما تختار نجمة مؤهلة (t.*) مفتاح JOIN USING ويكون هذا الربط متداخلًا ضمن ربط PASTE/CROSS/الفاصلة أو ربط ON خارجي، مع join_use_nulls = 0. #108043 (groeneai).
  • إصلاح خطأ في المحلل الجديد، حيث كان FINAL على أحد جداول JOIN (مثل FROM t1 FINAL JOIN t2) يُطبَّق بشكل غير صحيح على الجداول الأخرى المنضمة أيضًا، مما قد يجعل هذه الاستعلامات أبطأ. #108979 (vdimir).
  • مع analyzer_compatibility_join_using_top_level_identifier = 1، يمكن الآن حل معرّف في JOIN ... USING من اسم مستعار معرّف لتعبير فرعي داخل قائمة SELECT (مثلًا، SELECT uniqExact(lower(x) AS id) FROM t1 JOIN t2 USING (id))، بما يطابق سلوك المحلل القديم. سابقًا، لم تكن تُؤخذ في الاعتبار سوى الأسماء المستعارة للإسقاطات ذات المستوى الأعلى، وكانت هذه الاستعلامات تفشل باستثناء UNKNOWN_IDENTIFIER حتى مع تمكين الإعداد. ويُنتج الآن أيضًا تلميح الخطأ الذي يقترح هذا الإعداد عندما يكون الاسم المستعار المطابق متداخلًا. #110739 (novikd).
  • تم إصلاح الخطأ INCOMPATIBLE_TYPE_OF_JOIN في انضمام ANY على جدول بمحرك Join عندما يسمح عامل تصفية WHERE على عمود في الجانب الأيمن لمخطط الاستعلام بإعادة كتابة الانضمام إلى SEMI أو ANTI. يحتوي جدول بمحرك Join على صرامة مُعلنة وثابتة لا يمكن تغييرها، لذا لم يعد يُجرى هذا التحويل لهذه الجداول. #111362 (groeneai).
  • إصلاح TYPE_MISMATCH (“نوع مفتاح المفتاح المعقد … غير متطابق”) عند استخدام JOIN مع قاموس ومفتاح انضمام من نوع Nullable أو LowCardinality أو LowCardinality(Nullable)، بينما يكون مفتاح القاموس غير مغلف. تُوحِّد عملية البحث في القاموس للانضمام المباشر المفتاح الآن وفقًا لنوع المفتاح المُعلن للقاموس (كما يفعل dictGet/dictHas بالفعل)، ولا يتطابق مفتاح NULL مطلقًا. #111857 (groeneai).
  • إصلاح AMBIGUOUS_COLUMN_NAME (عدم تطابق بنية الكتلة في (يجب أن تكون الأعمدة ذات الاسم المتطابق ذات بنية متطابقة)) لاستعلام يكرر شرط JOIN ON في WHERE مع join_use_nulls = 1. يعيد هذا الاستعلام نتيجته الآن بدلًا من أن يفشل. #112007 (groeneai).
  • تم إصلاح النتائج الخاطئة أو إنهاء الخادم في عمليات JOIN المباشرة مع القاموس عندما يستخدم مفتاحها تسلسلًا متناثرًا. #112327 (groeneai).
  • تم إصلاح النتائج الخاطئة عندما يحتوي hash join على مفتاح LowCardinality واحد من نوع يتجاوز عرضه 8 بايتات (UInt128 وInt128 وUInt256 وInt256 وبدائلها Nullable). كان هذا الانضمام يعيد بصمت صفوفًا لا تتساوى قيم مفاتيحها. #113230 (groeneai).
  • إصلاح تقليم الأجزاء والحبيبات لشرط JOIN ON يتضمن أعمدة ثابتة من الجانب الآخر. #113484 (vdimir).
  • إصلاح قيمة خاطئة تُعاد لعمود افتراضي مثل _table أو _database عند اختياره من الجانب الأيمن لانضمام JOIN يُنفَّذ بواسطة DirectKeyValueJoin (تخزين مفتاح-قيمة مثل EmbeddedRocksDB أو KeeperMap أو Redis أو قاموس). كان الاستعلام يعيد محتويات عمود بيانات بدلًا من ذلك، أو يفشل مع LOGICAL_ERROR. #113698 (groeneai).

إصلاحات الاستعلامات والمُحلِّل

  • إصلاح خطأ يتسبب في طرح splitMultipartQuery للخطأ “استعلام فارغ” عند الاستعلامات التي تنتهي بتعليق بعد فاصلة منقوطة. #85491 (yariks5s).
  • إصلاح حالة لا يقبل فيها المحلل اللغوي اسمًا مستعارًا بعد استعلام فرعي في DESCRIBE TABLE، مما يؤدي إلى خطأ في البنية النحوية. #100205 (yariks5s).
  • إصلاح استهلاك INSERT لعبارة FORMAT بدلًا من تطبيقها على مخرجات EXPLAIN في EXPLAIN INSERT INTO ... SELECT ... FORMAT .... #101772 (Onyx2406).
  • إصلاح البطء الملحوظ في استعلامات SELECT عند تشغيل عمليات INSERT متزامنة. سابقًا، كان مسار INSERT يحجز فتحات CPU حتى max_threads عند بدء الاستعلام، حتى عندما لا تُستخدم معظم الفتحات، مما يحرم عمليات SELECT المتزامنة من الموارد. أصبح تخصيص فتحات CPU الآن قائمًا على الطلب: فلا يطلب المسار الفتحات إلا عند دفع عمل قابل للتوازي فعليًا. ينطبق ذلك على كل من التحكم في التزامن ومجدول CPU الاستباقي لأحمال العمل. يعمل إعداد الخادم الجديد concurrent_threads_lazy_allocation (القيمة الافتراضية true) كآلية للتراجع. #102928 (seva-potapov).
  • إصلاح خطأ كان يمكن أن يؤدي فيه ALTER TABLE ... MODIFY SETTING على جدول EmbeddedRocksDB إلى حفظ قيمة إعداد غير صالحة في ملف البيانات الوصفية للجدول، حتى عند رفض الخادم للاستعلام. عند إعادة تشغيل الخادم التالية، كان سيتعذر إرفاق الجدول بسبب CANNOT_PARSE_BOOL (أو خطأ تحليل مشابه)، وفي قواعد البيانات التي تكون فيها إخفاقات التحميل قاتلة، كان الخادم يرفض البدء. تُرفض الآن قيم الإعدادات غير الصالحة قبل كتابة أي بيانات وصفية. #103417 (groeneai).
  • إصلاح INSERT المتدفق مع input_format_max_block_wait_ms لواجهة HTTP ولـ INSERT SELECT FROM input، بحيث تُفرَّغ كتل الإدخال الجزئية قبل اكتمال الطلب. #104534 (alexey-milovidov).
  • إصلاح تعبير CASE الذي كان يعيد فرع ELSE بدلًا من فرع THEN المطابق عندما تكون كلٌّ من قيمة التعبير وقيمة WHEN تساويان NULL. #105556 (Algunenano).
  • إصلاح دعم استخدام دوال SQL المعرفة من المستخدم WASM في تعريفات MATERIALIZED VIEW. #106161 (niyue).
  • إصلاح طرح INTERPOLATE () للخطأ INVALID_WITH_FILL_EXPRESSION عندما تُمنح أعمدة ORDER BY أسماء مستعارة في قائمة SELECT باستخدام المحلل القديم. #106252 (yakov-olkhovskiy).
  • أصبحت الدوال base58Encode وbase58Decode وtryBase58Decode تراعي max_execution_time وإلغاء الاستعلامات عند معالجة مدخلات كبيرة، وترفض المدخلات التي تتجاوز 10 كيلوبايت بدلًا من الاستمرار في التشغيل مدة طويلة جدًا. يمكن ضبط الحد عبر الإعداد الجديد function_base58_max_input_size (تعطّله القيمة 0). #106428 (alexey-milovidov).
  • إصلاح خطأ يؤدي إلى نتائج غير صحيحة، حيث كانت WHERE c0 = const لا تعيد أي صفوف للجداول ذات ORDER BY f(c0) عندما تُقيَّم f(const) إلى NaN، مثل ORDER BY sqrt(c0) مع ثابت سالب. كان تحليل المفتاح الأساسي يستبعد كل حبيبة على نحو خاطئ ويُفسد ذاكرة التخزين المؤقت لشروط الاستعلامات اللاحقة. #106507 (groeneai).
  • أُصلحت النتائج الخاطئة للاستعلام SELECT c, count() FROM t WHERE c GROUP BY c على الجداول التي تتضمن الإسقاط الضمني _minmax_count_projection أو إسقاطًا تجميعيًا صريحًا أو إسقاطًا عاديًا؛ إذ كانت كل مجموعة تُدمج سابقًا في صف واحد بمفتاح ثابت وإجمالي عدد الصفوف. #106590 (groeneai).
  • أصبح FORMAT يُطبَّق أيضًا على مخرجات EXPLAIN في EXPLAIN ... INSERT ... SELECT ... FORMAT ... عندما تسبق SETTINGS‏ FORMAT أو يكون تنسيق الإخراج Values. #106686 (alexey-milovidov).
  • أُصلح خطأ RESOURCE_ACCESS_DENIED زائف ونادر (“Scheduler queue with resource request is about to be destructed”) لاستعلام مُنح بالفعل حق الوصول إلى مورد حمل عمل، وكان سببه احتفاظ كائن طلب محلي للخيط أُعيد استخدامه بحالة فشل طلب سابق. #106690 (alexey-milovidov).
  • أُصلحت match وextract وextractAll وcountMatches التي كانت تُرجع نتائج خاطئة للتعابير النمطية التي تحتوي على تسلسلات هروب سداسية عشرية أو ثمانية. #106709 (ofeliacode).
  • أُصلح تجاوز سفلي لعدد صحيح في محلّل بروتوكول PostgreSQL السلكي، حيث كانت رسالة بحقل طول أصغر من 4 تؤدي إلى التفاف size - 4 واستدعاء resize/ignore بحجم كبير جدًا. #107485 (uwezkhan).
  • عند استخدام enable_analyzer = 1 (الإعداد الافتراضي)، أصبح الاستعلام عن جدول باسمه المجرد، عندما لا يكون موجودًا إلا في قاعدة بيانات أخرى، يقترح الجدول الصحيح؛ فعلى سبيل المثال، يعرض SELECT * FROM functions الرسالة Maybe you meant system.functions?. سابقًا، كان المحلل الجديد يعرض الخطأ Unknown table expression identifier دون تلميح، بينما كان المحلل القديم يقدّم هذا الاقتراح المفيد بالفعل. #107550 (groeneai).
  • أُصلح إيقاف الخادم (std::terminate، الإشارة 6) أثناء إنهاء استعلام بخطة موزعة (make_distributed_plan = 1) عندما يفشل فحص حالة العامل في إعادة جدولة الفحص التالي (مثل CANNOT_SCHEDULE_TASK عند الإيقاف أو MEMORY_LIMIT_EXCEEDED). يفشل الاستعلام الآن بصورة سليمة ويواصل الخادم العمل. #107575 (groeneai).
  • أُصلحت النتائج غير الصحيحة من الاستعلامات الموزعة التي تختار أعمدة ALIAS تشترك في تعبير فرعي واحد؛ إذ كان من الممكن أن تختل محاذاة الأعمدة وتُرجع القيم تحت العمود الخطأ. #107675 (vdimir).
  • أُصلح الخطأ المنطقي Inconsistent AST formatting لدالة نافذة بلا وسائط ضمن تعريف CODEC أو محرك (مثل CODEC(cume_dist() OVER (...)))؛ إذ تحتفظ هذه الدالة الآن بأقواسها لكي يظل الاستعلام صالحًا بعد دورة تنسيق وتحليل. #107806 (alexey-milovidov).
  • يُعامل getClientHTTPHeader الآن بشكل صحيح بوصفه غير حتمي، لذا لم تعد نتيجته تُعاد استخدامها خطأً بواسطة ذاكرة التخزين المؤقت لنتائج الاستعلامات. #108029 (alexey-milovidov).
  • أُصلحت النتائج الخاطئة عند استخدام SELECT [...] SAMPLE [...] مع ذاكرة التخزين المؤقت لشروط الاستعلام (الإعداد use_query_condition_cache = 1، وهو أيضًا الإعداد الافتراضي). #108488 (groeneai).
  • إصلاح NOT_FOUND_COLUMN_IN_BLOCK عند استخدام اسم مستعار لمسند مركب في GROUP BY ثم الرجوع إليه، مع تمكين enable_identifier_resolve_cache (الإعداد الافتراضي). لم يكن تحسين optimize_and_compare_chain ثابت النتيجة، ما أدى إلى تراكم رابط اقتراني انتقالي مكرر في عقدة محلولة مشتركة. #108553 (groeneai).
  • إصلاح الخطأ NUMBER_OF_COLUMNS_DOESNT_MATCH عندما يقرأ استعلام فرعي من جدول Distributed عمودَي ALIAS أو أكثر تتوسع إلى التعبير نفسه (مثلًا a1 String ALIAS toString(x), a2 String ALIAS toString(x)) ويُستخدم هذا الاستعلام الفرعي في استعلام خارجي، مثل SELECT count() FROM (SELECT a1, a2 FROM dist GROUP BY a1, a2). #108725 (groeneai).
  • إصلاح الخطأ UNKNOWN_IDENTIFIER في ALTER TABLE ... DROP COLUMN عندما يحتوي عمود آخر على تعبير DEFAULT أو MATERIALIZED يعرّف اسمًا مستعارًا مضمّنًا ويشير إليه. #109374 (alexey-milovidov).
  • إصلاح تجاوز system.tables لقواعد البيانات بصمت للمستخدمين ذوي الأذونات الخاصة بكل قاعدة بيانات عندما يقرأ الاستعلام عمودَي name/database فقط. أُضيف في 26.2. #109723 (samay-sharma).
  • إصلاح الخطأ UNKNOWN_IDENTIFIER للأعمدة المؤهلة باسم تعبير الجدول الشائع (cte_name.column) في الاستعلامات المخزنة في طرق العرض عند تمكين المحلل. #111386 (novikd).
  • إصلاح NOT_FOUND_COLUMN_IN_BLOCK عندما يرشّح استعلام FINAL بحسب عمود مفتاح فرز غير موجود في قائمة SELECT ويُنقل عامل التصفية إلى PREWHERE (مثلًا SELECT s FROM t FINAL WHERE k GROUP BY s مع optimize_move_to_prewhere_if_final = 1). #111721 (groeneai).
  • إصلاح فشل بدء تشغيل الخادم وفشل ATTACH مع ظهور الرسالة WITH RECURSIVE is not supported with the old analyzer لطريقة عرض تحتوي على تعبير جدول شائع تعاودي عندما يكون enable_analyzer = 0 هو الإعداد الافتراضي للخادم. #112784 (evillique).
  • إصلاح تمرير إعدادات الاستعلام ومعالجة NULL في accurateCastOrDefault. #114912 (alexey-milovidov).
  • إصلاح إبلاغ read_rows وread_bytes وwritten_rows وwritten_bytes في system.query_thread_log عن إجمالي تراكمي طوال عمر الخيط بدلًا من القيم الخاصة بالاستعلام المسجل. تأثرت صفوف الخيوط المجمعة طويلة العمر، ولا سيما خيط HTTPHandler الذي يبدأ الاستعلام. #115596 (groeneai).

إصلاحات MergeTree والتخزين

  • يمكن الآن إسقاط الأجزاء المفصولة ذات اللاحقة tryN. #58957 (antaljanosbenjamin).
  • إصلاح استثناء MULTIPLE_EXPRESSIONS_FOR_ALIAS في الاستعلامات ذات الأسماء المستعارة المكررة للإسقاطات (مثل SELECT *, day + 365 AS day) ضمن الاستعلامات الفرعية المتداخلة عند استخدام النسخ المتماثلة المتوازية. #80310 (alexey-milovidov).
  • إصلاح اختيار برنامج ترميز ضغط غير صحيح لأجزاء MergeTree عند ضبط إعداد default_compression_codec على مستوى الجدول صراحةً. كانت الأجزاء المكتوبة عند الإدراج وأثناء عمليات الدمج وللإسقاطات تستخدم برنامج الترميز الافتراضي على مستوى الخادم بدلًا من إعداد مستوى الجدول. ويشمل الإصلاح الآن أيضًا الجزء الفارغ الناتج عن طفرة تحذف جميع البيانات. #101784 (Onyx2406).
  • إصلاح أخطاء MULTIPLE_EXPRESSIONS_FOR_ALIAS التي تطرحها النسخ المتماثلة البعيدة عند تشغيل استعلامات تشير إلى أسماء مستعارة للإسقاطات ضمن PREWHERE / WHERE / HAVING / QUALIFY (مثل SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c) أو استعلامات SELECT * على عمليات الربط الذاتي ذات أسماء الأعمدة المتداخلة، عند استخدام النسخ المتماثلة المتوازية وparallel_replicas_local_plan = 0. #103806 (groeneai).
  • إصلاح جزء تصحيح معطّل بعد ALTER TABLE ... DROP PARTITION ID 'patch-...' يتبعه DETACH/ATTACH TABLE. سابقًا، كان الجزء الفارغ المغطي يُكتب دون partition.dat وsource_parts.dat، مما يؤدي إلى ظهور إدخال broken-on-start_patch-... في system.detached_parts بعد الإرفاق التالي أو إعادة تشغيل الخادم. #104353 (groeneai).
  • إصلاح الاستبدال الصامت للبيانات بقيم افتراضية عند تشغيل ALTER TABLE ... RENAME COLUMN بالتزامن مع OPTIMIZE TABLE ... FINAL أو عملية دمج أخرى في الخلفية. #104822 (groeneai).
  • إصلاح حالتين من الخطأ LOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materialized تسببت فيهما استعلامات تستخدم enable_materialized_cte: (1) تعبير جدول شائع مادي يُعاد استخدامه ويُصفّى باستخدام IN (subquery) على تعبير جدول شائع مادي آخر، و(2) تعبير جدول شائع مادي يُشار إليه مباشرةً وضمن عامل تصفية WHERE ... IN (...) يصل إلى مفتاح أساسي لـ MergeTree عبر استعلام فرعي IN متداخل. تأثر EXPLAIN للاستعلامات نفسها أيضًا لأن الأخطاء كانت تحدث أثناء تحسين الخطة. #105041 (novikd).
  • مع skip_cache_on_disk_failure = 1، تستمر الاستعلامات الآن عند تعذر إنشاء FileCache دليل ذاكرة تخزين مؤقت على القرص. يُسجَّل الإخفاق بدلًا من أن يفشل الاستعلام. #105250 (Diskein).
  • إصلاح استثناء الخطأ المنطقي Mutation of Memory table produced incomplete output الذي يطرحه ALTER TABLE <memory_table> APPLY PATCHES وALTER TABLE <memory_table> APPLY DELETED MASK. لا تمتلك جداول Memory أجزاء تصحيح أو أقنعة حذف، لذا يُعامل الأمران الآن بشكل صحيح باعتبارهما عمليتين بلا تأثير. #105286 (groeneai).
  • إصلاح CANNOT_CONVERT_TYPE عند استخدام Merge فوق Merge فوق Distributed مع distributed_group_by_no_merge=1. #105330 (azat).
  • إصلاح إرجاع singleValueOrNullMerge لقيمة فعلية بدلًا من NULL عند دمج حالة سبق أن رصدت عدة قيم مميزة. #105734 (fallintoplace).
  • إصلاح تعطل في دالة الجدول mongodb وتخزين MongoDB ومصدر قاموس MongoDB عندما يكون اسم المجموعة فارغًا أو يحتوي على بايتات NUL. #105776 (Algunenano).
  • إصلاح رفض ALTER TABLE ... CLEAR COLUMN لأعمدة columns_to_sum المحددة صراحةً في SummingMergeTree وCoalescingMergeTree. #105785 (antonio2368).
  • إصلاح أخطاء UNKNOWN_DATABASE عند إنشاء عرض مُعلَّم بمعلمات يُمرَّر اسم قاعدة بياناته عبر معامل استعلام. #105799 (groeneai).
  • استعادة تحسين القراءة بالترتيب لجداول Merge عند استخدام المُحلِّل. #105867 (KochetovNicolai).
  • إصلاح طفرات UPDATE وDELETE في جداول Iceberg التي يُوصَل إليها عبر كتالوج، بما في ذلك التحديثات وعمليات الحذف المتكررة التي لا تطابق أي صفوف. #106111 (scanhex12).
  • إصلاح عدم تطبيق optimize_skip_unused_shards (وفشل force_optimize_skip_unused_shards على نحو خاطئ) عند الاستعلام عن جدول Distributed عبر جدول Merge أو دالة الجدول merge، مع تطبيق الشرط فوقهما. #106250 (KochetovNicolai).
  • إصلاح الخطأ المنطقي Column identifier ... is already registered عندما يحتوي شرط طفرة (DELETE/UPDATE) على استعلام فرعي IN/EXISTS يقرأ من تعبير جدول افتراضي متداخل داخل استعلام فرعي آخر. #106414 (alexey-milovidov).
  • إصلاح نتائج خاطئة متفرقة لاستعلامات ORDER BY ... DESC عند قراءة الأجزاء العريضة بترتيب عكسي مع read_in_order_use_virtual_row_per_block = 1 وقيمة صغيرة لـmax_block_size. #106429 (vdimir).
  • إصلاح الاستثناء Bad cast exception لقواميس Redis التي تستخدم STORAGE_TYPE 'simple' مع تخطيط cache/direct ومفتاح سلسلة واحد (مركب)؛ تعمل هذه القواميس الآن، وتُبلغ المفاتيح المركبة فوق تخزين simple عن خطأ واضح. #106501 (vdimir).
  • إصلاح الاستثناء Mutation of Memory table produced incomplete output الذي كانت تُطلقه أوامر ALTER TABLE <memory_table> التي لا تؤثر في البيانات على مستوى الصفوف في محرك Memory، بما في ذلك APPLY PATCHES وAPPLY DELETED MASK وMATERIALIZE STATISTICS وMATERIALIZE INDEX وMATERIALIZE PROJECTION وREWRITE PARTS. لا تمتلك جداول Memory هذه البُنى، لذا تُعامل هذه الأوامر الآن كعمليات بلا تأثير. #106621 (groeneai).
  • إصلاح فشل الخادم في البدء مع Too many marks in file ...skp_idx_idx.cmrk4, marks expected 0 (bytes size 0) عندما يحتوي جدول MergeTree على جزء فهرس تخطٍّ بعدد حبيبات صفري وملف علامات غير فارغ على القرص. #106675 (groeneai).
  • إصلاح الحالة التي لا تُطبَّق فيها النسخ المتماثلة المتوازية على عرض يتضمن UNION بسبب وجود جدول فارغ في UNION. #106900 (devcrafter).
  • إصلاح استثناء خطأ منطقي conflicted_part_name.has_value() قد يحدث أثناء إدراج متزامن في جدول ReplicatedMergeTree عندما تكون الكتلة المُدرجة قد أُزيل تكرارها بالكامل، وكانت عقدة إزالة التكرار الخاصة بالجزء المتعارض قد أُزيلت مسبقًا (مثلًا بواسطة DROP PARTITION متزامن). #107026 (groeneai).
  • إصلاح خطأ LOGICAL_ERROR نادر بعنوان “Attempt to release query context that does not exist” وتعطل الخادم المصاحب له عند قراءة جداول MergeTree عبر قرص ذاكرة تخزين مؤقت لنظام الملفات تم إنشاؤه باستخدام enable_filesystem_query_cache_limit = 1. #107028 (groeneai).
  • إصلاح تعطل الخادم عند نقل جزء فارغ إلى قرص plain_rewritable (مثلًا باستخدام ALTER TABLE ... MOVE PARTITION ... TO DISK لجزء فارغ تم الاحتفاظ به بسبب remove_empty_parts = 0). #107040 (groeneai).
  • إصلاح استثناء Logical error: Too large size passed to allocator عند تنفيذ INSERT في جدول MergeTree عندما تُضبط adaptive_write_buffer_initial_size على قيمة كبيرة للغاية. أصبح الحجم الابتدائي لمخزن الكتابة التكيفي مقيّدًا الآن بالحد الأقصى للمخزن. #107104 (groeneai).
  • إصلاح دفعات ALTER TABLE ... ON CLUSTER التي تجمع بين MODIFY SETTING/RESET SETTING وتغيير تعليق (مثلًا MODIFY COMMENT 'x', MODIFY SETTING old_parts_lifetime = 123) إذ كانت تُطبّق على النسخة المتماثلة القائدة فقط، مما يترك النسخ المتماثلة الأخرى غير متطابقة. كذلك إصلاح تصنيف MODIFY COLUMN ... COMMENT الموضعي أو الخاص بكل عمود باستخدام SETTINGS خطأً كتغيير محلي في بيانات التعليق الوصفية فقط، مما كان يستبعد إعادة ترتيب الأعمدة من البيانات الوصفية المتماثلة وقد يتسبب في INCOMPATIBLE_COLUMNS عند إعادة تشغيل النسخة المتماثلة. #107142 (groeneai).
  • إصلاح الخطأ Argument ... of GROUPING function is not a part of GROUP BY clause للاستعلامات التي تستخدم الدالة grouping مع تمكين الإعداد group_by_use_nulls. #107206 (KochetovNicolai).
  • إصلاح استعلامات UPDATE خفيفة الوزن مع تمكين النسخ المتماثلة المتوازية القديمة لجداول MergeTree غير المتماثلة. #107246 (groeneai).
  • إصلاح استثناء خطأ منطقي محتمل في SYSTEM SYNC DATABASE REPLICA … STRICT، وجعل المُعدِّل STRICT يسري فعليًا على النسخ المتماثلة لقاعدة البيانات. #107344 (PedroTadim).
  • إصلاح Logical error: 'Duplicate announcement received for replica number N' الذي قد يحدث مع النسخ المتماثلة المتوازية عندما يحتوي استعلام فرعي قيَمي على استعلامات فرعية متداخلة تقرأ الجدول نفسه. #107381 (groeneai).
  • إصلاح فقدان صامت للبيانات في MergeTree العادي (غير المتماثل) عند تنفيذ REPLACE PARTITION أو MOVE PARTITION أو DETACH PARTITION أو DETACH PART على قسم لا تزال فيه تصحيحات UPDATE خفيفة الوزن غير مطبقة. ترفض هذه العمليات الآن الأمر (كما يفعل ReplicatedMergeTree بالفعل)، مع الإشارة إلى ALTER TABLE ... APPLY PATCHES، بدلًا من التراجع بصمت عن التحديث المُعتمد. #107386 (groeneai).
  • إصلاح توقف MaterializedPostgreSQL عن تكرار التغييرات بصمت عندما يحتوي اسم قاعدة البيانات أو الجدول في PostgreSQL على أحرف كبيرة (كان مستهلك pgoutput يطلب اسم publication غير مقتبس وبأحرف صغيرة، لا يطابق اسم publication الذي يحافظ على حالة الأحرف). #107423 (alexey-milovidov).
  • إصلاح خطأ THERE_IS_NO_COLUMN عندما تكون قيمة optimize_if_transform_strings_to_enum = 1 ويكون تعبير if/transform المُحسَّن على القيم النصية الحرفية مفتاحًا في GROUP BY أو ORDER BY لجدول Distributed أو عند استخدام النسخ المتماثلة المتوازية. #107455 (groeneai).
  • إصلاح مشكلة إرجاع SELECT ... FINAL وOPTIMIZE TABLE ... FINAL لصفوف مكررة بعد اعتماد أجزاء من MergeTree عادي في ReplacingMergeTree أو SummingMergeTree أو AggregatingMergeTree عبر CREATE TABLE ... CLONE AS أو ATTACH PARTITION ... FROM أو MOVE PARTITION ... TO TABLE. يُعاد الآن ضبط مستوى دمج الجزء المعتمد إلى 0 عندما تختلف محركات المصدر والوجهة، بحيث تزيل الوجهة تكراره عند الدمج التالي. #107481 (groeneai).
  • تحسين تتبّع إلغاء الاستعلام أثناء انتظار النصاب في ReplicatedMergeTree. #107513 (nickitat).
  • احتساب الذاكرة التي تستخدمها مكتبة rapidjson (في prettyPrintJSON وJSONMergePatch ومحلل JSON الخاص بـ rapidjson) ضمن متعقب الذاكرة، بحيث تُرفض المدخلات الشاذة باستخدام MEMORY_LIMIT_EXCEEDED بدلًا من تخصيص الذاكرة بلا حدود. #107555 (Algunenano).
  • إصلاح خطأ Logical error: Stream ... variant_discr ... is not found الذي قد يحدث عند دمج أو قراءة جزء MergeTree ناتج عن عملية تغيير في جدول يحتوي على عمود Dynamic. #107562 (alexey-milovidov).
  • إصلاح LOGICAL_ERROR (updateFormatPrewhereInfo called more than once) الذي قد يحدث عند الاستعلام عن مصدر file() أو url() أو تخزين كائنات مع استخدام PREWHERE صريح وWHERE معًا، بينما يكون optimize_prewhere_after_pushdown مفعّلًا. #107568 (groeneai).
  • إصلاح استثناء في الخادم (خطأ منطقي Digest does not match) كان يمكن أن يحدث عند استخدام RENAME TABLE أو RENAME DATABASE أو CREATE OR REPLACE TABLE مع جدول TimeSeries داخل قاعدة بيانات Replicated. أصبحت إعادة تسمية جدول TimeSeries مدعومة الآن. #107583 (groeneai).
  • إصلاح DROP TABLE لجدول TimeSeries في قاعدة بيانات Replicated، والذي كان يتسبب سابقًا في تسريب الجداول الداخلية وترك مهمة الحذف في الخلفية تعيد المحاولة إلى الأبد (كان DROP TABLE ... SYNC يتوقف عن الاستجابة). #107604 (groeneai).
  • إصلاح مشكلتين لاجتياز المسارات في بروتوكول جلب الأجزاء المُنسخة متماثلًا، كانتا قد تتيحان لنسخة متماثلة ضارة كتابة ملفات خارج دليل الجزء. #107606 (antonio2368).
  • إصلاح ALTER TABLE ... REPLACE PARTITION في جدول MergeTree عادي، الذي كان يعيد إظهار الأجزاء المستبدلة بعد إعادة تشغيل الخادم، مما يجعل الجدول يعيد كلًا من الصفوف البديلة والصفوف القديمة المستبدلة. #107623 (groeneai).
  • إصلاح LOGICAL_ERROR (“Block structure mismatch … between ConvertingTransform and RemovingReplicatedColumnsTransform”) عند الإدراج في عرض مادي يعرّف جدوله الهدف TO عمود Enum أوسع مما ينتجه SELECT الخاص بالعرض. يُطبَّق الآن توسيع Enum الصالح في مسار إدراج العرض المادي، كما في INSERT ... SELECT المباشر. #107648 (groeneai).
  • إصلاح الخطأ NUMBER_OF_COLUMNS_DOESNT_MATCH عند الاستعلام عن جدول Distributed (أو عند استخدام النسخ المتماثلة المتوازية) يحتوي على عدة أعمدة ALIAS تتوسع إلى التعبير نفسه، مع الإشارة إليها معًا في ORDER BY/GROUP BY/HAVING. #107913 (yakov-olkhovskiy).
  • لم يعد الخطأ العابر أثناء تحديث أجزاء البيانات في جدول للقراءة فقط يوقف مهمة التحديث في الخلفية بشكل دائم. #108034 (alexey-milovidov).
  • أصبح index_granularity_bytes يُراعى الآن لأعمدة حالة AggregateFunction. سابقًا، كان حد البايتات للحبيبة يُتجاهل في هذه الأعمدة (مثل حالات uniqExact في جداول AggregatingMergeTree والإسقاطات التجميعية)، مما يؤدي إلى حبيبات أكبر بكثير من الحد المُهيأ وزيادة تضخيم القراءة واستهلاك الذاكرة أثناء الاستعلام. #108297 (groeneai).
  • إصلاح عدم رفض insert_quorum = 'auto' لعمليات الإدراج مسبقًا عندما يكون عدد النسخ المتماثلة الحية أقل من الأغلبية. تفشل هذه العمليات الآن فورًا بالخطأ TOO_FEW_LIVE_REPLICAS بدلًا من كتابة جزء محلي ثم انتهاء مهلتها لاحقًا بالخطأ UNKNOWN_STATUS_OF_INSERT. #108800 (gagandhakrey).
  • إصلاح تعطل الخادم عند الإدراج غير المتزامن مع إزالة التكرار، عندما يجعل optimize_on_insert الكتلة المُدرجة فارغة (مثل الصفوف التي يكون مجموعها صفرًا في SummingMergeTree). #109229 (Diskein).
  • إصلاح فقدان بيانات عمود بلا تعبير افتراضي عند تنفيذ عملية دمج بالتزامن مع ALTER TABLE ... RENAME COLUMN، أو عندما تأتي قيم العمود الوحيدة من UPDATE خفيف الوزن. كان من الممكن إسقاط العمود من الجزء المدمج، فتُقرأ جميع قيمه كـ NULL. #109356 (groeneai).
  • إصلاح إنهاء نادر للخادم عند دمج حالات التجميع uniqExact بالتوازي مع GROUPING SETS أو ROLLUP أو CUBE. #109389 (groeneai).
  • إصلاح إعادة جدولة عمليات دمج rollup إلى أجل غير مسمى. #109410 (Michicosun).
  • إصلاح عمليات mutation لـ GROUP BY في الجداول ذات الأعمدة الافتراضية المادية أو الافتراضية الدائمة. #109532 (Michicosun).
  • إصلاح الخطأ UNKNOWN_IDENTIFIER: Missing columns: '_block_offset' عند تشغيل ALTER TABLE ... MATERIALIZE INDEX على فهرس minmax الضمني الذي أنشأه add_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_column في جدول يحتوي على أجزاء مُدرجة حديثًا (بالمستوى 0). يُبنى الفهرس الآن لهذه الأجزاء بدلًا من فشل العملية. #110236 (groeneai).
  • إصلاح عدم اكتشاف نسخة متماثلة للقراءة فقط في تخزين الكائنات (قرص مُهيأ باستخدام read_only = true) للأجزاء الجديدة عبر refresh_parts_interval، ورفض table_disk = true على مثل هذا القرص مع الرسالة “table_disk غير مدعوم للأقراص غير التابعة لـ ObjectStorage”. #110460 (jkartseva).
  • إصلاح خطأ LOGICAL_ERROR (“لم تُسجّل أي مجموعة للمفتاح”) في ALTER TABLE … DROP COLUMN وALTER TABLE … DELETE/UPDATE mutations وDELETE خفيف الوزن، في الجداول التي تحتوي على عمود ALIAS يستخدم تعبيره عامل IN، بما في ذلك عبر عمود ALIAS آخر. #111039 (PedroTadim).
  • إصلاح الحالات التي لم تُطبَّق فيها سياسة الصفوف على إسقاطات MergeTree أثناء تنفيذ الاستعلام. #112329 (yariks5s).
  • إصلاح الخطأ المنطقي ReadBufferFromEncryptedFile: Wrong file position عند قراءة جزء Compact من قرص encrypted باستخدام إدخال/إخراج مباشر، والذي كان يؤدي إلى تعطل عمليات الدمج في system.replication_queue. #112943 (alexey-milovidov).
  • إصلاح قراءة قاعدة البيانات الداخلية _temporary_and_external_tables عبر دالة الجدول merge ومحرك الجداول Merge، إذ كانت تتيح لجلسة قراءة الجداول المؤقتة الخاصة بجلسات ومستخدمين آخرين، وتتسبب في استثناء عند استخدام مسار المحلل القديم. أصبح التعبير النمطي لقواعد البيانات يتجاوز هذه القاعدة الآن، ويُرفض ذكر اسمها صراحةً، تمامًا كما يُرفض الوصول المباشر إليها. #113224 (alexey-milovidov).
  • إصلاح حالة كانت فيها سياسة صفوف تحتوي على استعلام فرعي قيَمي تُقيَّم مرة واحدة فقط ثم يُعاد استخدامها باستمرار بعد قراءة الجدول عبر جدول Merge. يُخزَّن شرط السياسة المُحلَّل مؤقتًا ويُشارك بين جميع الاستعلامات، وكانت قراءته عبر Merge تعيد كتابة التعبير المخزَّن مؤقتًا في موضعه، مما تسبب أيضًا في سباق بيانات بين الاستعلامات المتزامنة التي تستخدم السياسة نفسها. #113563 (alexey-milovidov).
  • إصلاح أخطاء CANNOT_CONVERT_TYPE عند قراءة جدول Merge يحتوي على جدول Distributed يستخدم نسخًا متماثلة متوازية بمفتاح مخصص. #113742 (alexey-milovidov).
  • إصلاح الخطأ Logical error: No set is registered for key ... عند القراءة عبر جدول Merge يتضمن تابعًا يعرّف عمود ALIAS يحتوي على IN، مع اختلاف التوابع في القيمة الافتراضية لذلك العمود. #113757 (groeneai).
  • إصلاح تجاوز لسياسة الصفوف، حيث كانت دالة الجدول mergeTreeIndex تكشف قيم المفتاح الأساسي وفهرس minmax للصفوف المخفية بواسطة سياسة صفوف SELECT على الجدول المصدر؛ ويُرفض الآن استخدام mergeTreeIndex لقراءة جدول لديه سياسة صفوف. #115304 (yariks5s).

إصلاحات نوع البيانات والتسلسل

  • إصلاح استثناء في ARRAY JOIN عند استخدام أنواع رقمية من LowCardinality. #91784 (Ergus).
  • إصلاح إنشاء أعمدة NOT NULL بصمت كأعمدة Nullable عندما تكون قيمة data_type_default_nullable = 1 ويُنشأ الجدول في قاعدة بيانات Replicated أو عبر ON CLUSTER. #97572 (xiaohuanlin).
  • إصلاح عدد الصفوف الخاطئ الذي يعيده استعلام MaterializedView عند ضبط query_plan_enable_optimizations = 0، عندما يعيّن العرض عمود integer إلى عمود Bool. #100692 (Maximus5).
  • إصلاح بيانات تعريف الأجزاء غير المتسقة بعد عمليات التعديل على الأعمدة ذات التسلسلات غير الافتراضية. #102817 (korowa).
  • إصلاح انتشار NULL عند قراءة الأعمدة الفرعية المستخرجة من أعمدة Nullable(Tuple(...)). على سبيل المثال، بالنسبة إلى tup Nullable(Tuple(s Nullable(String)))، يعيد SELECT tup.s الآن NULL بشكل صحيح في الصفوف التي يكون فيها الصف المركب الخارجي NULL، بدلًا من قيم غير صالحة. يشمل ذلك جميع أنواع العناصر القادرة على تمثيل NULL: Nullable وDynamic وVariant وLowCardinality(Nullable(...)). #102942 (nihalzp).
  • إصلاح قيام recursiveRemoveLowCardinality بحذف أسماء أنواع الهندسة المخصصة (مثل LineString بدلًا من Ring، وMultiLineString بدلًا من Polygon)، مما كان يؤدي إلى تفسير نوع الهندسة بشكل خاطئ. #103041 (jh0x).
  • إصلاح قيام dictGetOrNull بالكتابة فوق أعمدة أخرى بصمت بالقيمة NULL في إسقاط SELECT عند استدعائها باستخدام عمود مفتاح Nullable تكون قيمه مفقودة من القاموس. كانت الدالة تعدّل خريطة القيم الفارغة المُعارة من الإدخال في موضعها؛ أما الآن فتُنشئ نسخة عميقة من عمود النتيجة قبل تعديله. #104327 (groeneai).
  • إصلاح استثناء في الاستعلامات الموزعة التي تحتوي على صف مركب IN فارغ ضمن مفتاح التجزئة عند تفعيل optimize_skip_unused_shards_rewrite_in. #104966 (alexey-milovidov).
  • إصلاح تقدير انتقائية PREWHERE لإحصاءات count-min في أعمدة Float32، بما في ذلك المقارنات مع قيم حرفية من Float64. #105047 (hanfei1991).
  • إصلاح ILLEGAL_TYPE_OF_ARGUMENT عند دمج حالات التجميع quantileExactWeightedInterpolated أو quantileDD أو quantilePrometheusHistogram مع نظيراتها بصيغة الجمع quantilesXxxMerge (والعكس صحيح). تشترك الصيغ المفردة والجمع لهذه العائلات الثلاث من الكميات في حالة تجميع داخلية واحدة، لكنها لم تكن مدرجة في جدول تعيين الأسماء الداخلي، لذلك كان يُرفض دمج الحالات بين الدوال، وكذلك تحسين دمج الدوال لهذه العائلات. #105189 (groeneai).
  • إصلاح النتائج غير الصحيحة للدوال toStartOfWeek وtoLastDayOfWeek وtoMonday وtoStartOfMonth وtoLastDayOfMonth وtoStartOfQuarter وtoStartOfYear عند تمرير وسيطات من النوعين Date32 وDateTime64 إذا وقعت النتيجة خارج نطاق Date: فبدلاً من الالتفاف إلى تواريخ عشوائية، أصبحت النتائج التي تسبق 1970-01-01 مقيَّدة إلى 1970-01-01، والنتائج التي تلي 2149-06-06 مقيَّدة إلى 2149-06-06. يصلح هذا أيضاً نتائج الاستعلامات الخاطئة (الأجزاء والحبيبات التي استُبعدت خطأً) عند استخدام هذه الدوال في WHERE على مفتاح Date32 أو DateTime64 يحتوي على قيم خارج النطاق. #105244 (yariks5s).
  • إصلاح خطأ منطقي في arrayRemove عندما تكون الوسيطة الأولى مصفوفة من Variant وجميع بدائلها غير متوافقة مع نوع الوسيطة الثانية، بينما يكون variant_throw_on_type_mismatch معطلاً. تتعامل الدالة الآن مع المقارنة على أنها “غير متساوية أبداً” وتعيد المصفوفة دون تغيير بدلاً من التسبب في فشل assertTypeEquality من جانب الخادم. #105248 (groeneai).
  • إصلاح تجاهل toFloat64/toUInt32/toString/إلخ. على Dynamic للإعداد cast_keep_nullable. #105467 (Avogar).
  • إصلاح تعطل الخادم بسبب segfault في uniqStateOrNull / uniqStateOrDefault / uniqOrNullState (وسلاسل combinator مشابهة لـuniq) عند استخدامها مع GROUP BY ... WITH ROLLUP أو WITH CUBE أو WITH TOTALS ووسيطة Nullable. #105470 (groeneai).
  • إصلاح إرجاع toStartOfMillisecond وtoStartOfMicrosecond نتيجة تختلف بنحو ثانية تقريباً لقيم DateTime64 السالبة (قبل الحقبة)، وإصلاح تجاوز سعة الأعداد الصحيحة الموقعة الذي يرصدُه UndefinedBehaviorSanitizer في toStartOfSecond وtoStartOfMillisecond وtoStartOfMicrosecond لمدخلات DateTime64 القريبة من INT64_MIN. #105482 (groeneai).
  • إصلاح إنهاء الخادم عند إلغاء تسلسل حالات singleValueOrNull لـJSON. #105535 (Avogar).
  • إصلاح تجاهل input_format_try_infer_datetimes أثناء الإدراج في البيانات المشتركة في JSON. #105544 (Avogar).
  • إصلاح التفاف DateTime للقيم خارج النطاق في JSONExtract وعمليات إلغاء تسلسل النصوص. #105551 (Avogar).
  • إصلاح التعطل عند إدراج tuples بأحجام مختلفة في عبارة VALUES نفسها ضمن عمود String. #105582 (Avogar).
  • إصلاح خطأ NOT&#95;IMPLEMENTED في toString من DateTime بمنطقة زمنية تحتوي على قيمة NULL. #105587 (yariks5s).
  • إضافة تحقق من أعمدة Dynamic المسطحة غير الصالحة في إدخال Native. #105666 (Avogar).
  • إصلاح LOGICAL_ERROR (Unexpected return type from if) الذي يظهر أثناء تخطيط الاستعلام لتعبيرات if التي يكون نوع نتيجتها Variant ويكون فرعها الثاني أو الثالث عبارة عن if بشرط ثابت على قيمة حرفية من UInt64 تقع ضمن نطاق Int64. #105680 (groeneai).
  • إصلاح الخطأ Bad get: has Decimal32, requested Decimal128 في sumMap وsumMapWithOverflow على عمود Nested(... Nullable(Decimal(P, S))) عند تسلسل حالة التجميع (مثل النسخ المتماثلة المتوازية، واستخدام sumMapState عبر منسّق حالة ثنائي، والتجميع الخارجي). #105816 (groeneai).
  • إصلاح الخطأين Expected ColumnLowCardinality, got String / Bad cast from type DB::ColumnString to DB::ColumnLowCardinality عند استخدام apply_mutations_on_fly = 1 على جدول يحتوي على طفرات UPDATE/DELETE معلّقة أثناء التنفيذ ومصطفّة قبل طفرة ALTER MODIFY COLUMN ... LowCardinality(...). #105847 (Algunenano).
  • إصلاح الخطأ Cannot find column في الاستعلامات الموزعة التي تستخدم عامل التصفية IN Array(...) مع المحلل الجديد. #105894 (KochetovNicolai).
  • إصلاح إنهاء الخادم عند تعديل عمود يتضمن STATISTICS إلى Nullable بينما يحذفه ALTER آخر بالتزامن. #105917 (groeneai).
  • رفض بايتات IntervalKind الخارجة عن النطاق أثناء فك ترميز النوع RowBinaryWithNamesAndTypes (input_format_binary_decode_types_in_binary_format = 1) مع عرض خطأ INCORRECT_DATA واضح، بدلًا من إنشاء DataTypeInterval بنوع غير صالح قد يؤدي لاحقًا إلى سلوك غير محدد في مسارات التجزئة. #106261 (groeneai).
  • قراءة العمود الفرعي ‘null’ كمسار JSON في Nullable(JSON) بدلًا من null-map. #106295 (Avogar).
  • إصلاح قراءة خارج الحدود في sipHash64Keyed وsipHash128Keyed وsipHash128ReferenceKeyed عند تجزئة عمود تكون جميع مصفوفاته فارغة ولا يكون المفتاح ثابتًا. #106355 (Algunenano).
  • إصلاح خطأ كان يمنع المستخدمين من استخدام الاستعلامات الفرعية ذات القيمة المفردة في الوسيط الأول لـ IN عندما يكون الوسيط الثاني صفًا غير ثابت. #106610 (yariks5s).
  • إصلاح تجاهل session_timezone عند تسلسل أعمدة LowCardinality(DateTime) إلى تنسيقات نصية (CSV وTSV وJSONEachRow وغيرها). سابقًا، بعد أول كتابة لعمود LowCardinality(DateTime) على خادم، كانت جميع الاستعلامات اللاحقة التي تكتب هذا العمود تعرض سلسلة الوقت المحلي وفق أول منطقة زمنية تمت رؤيتها، بغض النظر عن session_timezone. #106634 (groeneai).
  • إصلاح إنهاء الخادم في if وmultiIf عندما يكون الشرط قيمة ثابتة من Nullable(Nothing). #106678 (groeneai).
  • التراجع عن تغيير كان يجعل sumMap / الموفّق -Map يرفضان أنواع القيم الرقمية ذات الأسماء المخصصة (مثل SimpleAggregateFunction(sum, T) وBool) بالرسالة ILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summed، مما عطّل عمليات التجميع التي كانت تعمل سابقًا. #106729 (fm4v).
  • إصلاح استثناء Bad cast أثناء تقليم الأجزاء استنادًا إلى إحصاءات MinMax عندما يكون العمود المفتاح LowCardinality وثابت المسند هو LowCardinality(Nullable(...)). #106793 (groeneai).
  • إصلاح خطأ منطقي في parseDateTime عند وجود بايتات إدخال غير ASCII. #106856 (Avogar).
  • إصلاح استثناء THERE_IS_NO_COLUMN في الاستعلامات الموزعة التي تتضمن تحسين optimize_rewrite_aggregate_function_with_if، عندما تتطلب وسيطة الدالة التجميعية تحويلاً إلى النوع Nullable. #106908 (yakov-olkhovskiy).
  • إصلاح تجاوز في عدد صحيح موقّع (سلوك غير محدد) في arrayLevenshteinDistanceWeighted وarraySimilarity عندما تحتوي مصفوفات الأوزان على قيم صحيحة كبيرة. تُراكَم المسافة الموزونة الآن في عدد صحيح واسع للأوزان الصحيحة، لذا لم تعد الأوزان الصحيحة الكبيرة تتجاوز السعة وتظل دقيقة. #106934 (groeneai).
  • إصلاح تعطل (Source column is not Map / SIGSEGV) عند دمج كتل مرتبة تحتوي على عمود Variant بمتغير Map يختلف ترتيب تخزينه المحلي عن ترتيبه العام. #107011 (groeneai).
  • إصلاح الخطأ TYPE_MISMATCH (“Cannot convert string … to type …”) في استعلامات ORDER BY <numeric column> ... LIMIT n عندما تؤدي المادية الكسولة إلى وضع عمود آخر قبل عمود الفرز. تُقرأ عتبة أعلى K الآن من عمود الفرز الصحيح. #107060 (groeneai).
  • إصلاح عملية ALTER TABLE ... RENAME COLUMN a TO b, RENAME COLUMN c TO a مركبة تعيد استخدام اسم عمود تم تحريره (عملية “تبديل”) بين أعمدة من أنواع مختلفة. سجّل الجزء المادي نوع عمود غير صحيح، مما أدى إلى فشل SELECT لاحقاً بالرسالة Conversion between numeric types and IPv6 is not supported (أو إيقاف العملية عند تحميل الجزء في إصدارات debug). #107064 (groeneai).
  • إصلاح النتائج غير الحتمية للدالة roundDown عندما تحتوي مصفوفة الحدود على NaN. كان يمكن لقيمة الإدخال نفسها أن تُرجع حداً منتهياً أو NaN بحسب الصفوف المحيطة في الدفعة. تُتجاهل حدود NaN الآن، لذا تعتمد النتيجة فقط على الحدود المنتهية. #107065 (groeneai).
  • إصلاح قيام quantileTDigest وquantileTDigestWeighted بإطلاق DECIMAL_OVERFLOW لوسيطات Date وDateTime عندما يكون الكوانتايل المُستوفى كسرياً لكنه ضمن النطاق (مثلاً quantileTDigestWeighted(date, weight) على قيم تتسع جميعها ضمن النوع). تُقتطع النتيجة الكسرية الآن إلى نوع النتيجة، بما يتوافق مع quantilesTDigestWeighted؛ ولا تزال القيم الفعلية خارج النطاق تثير خطأً. #107066 (groeneai).
  • إصلاح الاقتطاع الصامت لقيم الأعداد الصحيحة خارج النطاق في تعريفات النوع Enum8/Enum16. أصبح Enum8('a' = 200) يطلق ARGUMENT_OUT_OF_BOUND بدلاً من إنشاء Enum8('a' = -56) بصمت. #107081 (groeneai).
  • إصلاح ترتيب الصفوف غير الصحيح (وخطأ LOGICAL_ERROR بعنوان “Rows are not sorted with permutation” في إصدارات debug) في استعلامات ORDER BY ... LIMIT متعددة الأعمدة التي تفرز حسب أعمدة Nullable عندما تتعادل عدة صفوف في الأعمدة الأولى. #107094 (groeneai).
  • إصلاح Logical error: 'Bad cast from type DB::ColumnVector<...> to DB::ColumnTuple' عند قراءة عمود Array(Tuple(...)) مملوء بقيم افتراضية، مثلًا بعد ALTER TABLE ... ADD COLUMN أو بعد طفرة ALTER TABLE ... CLEAR COLUMN غير مكتملة تُطبَّق أثناء التنفيذ. #107232 (groeneai).
  • رفض الاستخدامات غير المدعومة لأعمدة AggregateFunction في تعبيرات TTL عند تنفيذ CREATE TABLE (مثلًا TTL toDateTime(state)) بدلًا من الفشل لاحقًا أثناء تنفيذ TTL مع ILLEGAL_TYPE_OF_ARGUMENT. يشمل ذلك أيضًا الحالات الموجودة ضمن بدائل Variant وقيم Dynamic. ولا تزال المستهلكات الصالحة الواعية بالحالة، مثل finalizeAggregation، مقبولة. #107366 (Ria-K912).
  • إصلاح arrayResize مع وسيطة حجم من نوع Decimal: يُفسَّر الحجم الآن وفقًا لقيمته الفعلية (مثلًا، تُرجع arrayResize([1, 2, 3], 1.5::Decimal(2, 1)) عنصرًا واحدًا) بدلًا من التمثيل الخام غير المُقاس. #107389 (alexey-milovidov).
  • إصلاح LOGICAL_ERROR: Unexpected return type from materialize (وأخطاء عدم تطابق الأنواع المشابهة) عند استخدام apply_mutations_on_fly = 1 على جدول يحتوي على UPDATE معلّق يُطبَّق أثناء التنفيذ، ويُقرأ عموده المستهدف أيضًا كمدخل لدالة بواسطة UPDATE سابق يُطبَّق أثناء التنفيذ، قبل طفرة ALTER MODIFY COLUMN ... LowCardinality(...). #107475 (groeneai).
  • إصلاح تحويل قيم NULL بصمت إلى سلاسل فارغة عند إدراج بيانات Arrow/ORC في عمود LowCardinality(Nullable(...)). كان هذا انحدارًا ظهر في الإصدار 26.5. #107532 (Ergus).
  • إصلاح LOGICAL_ERROR (“Input nodes size mismatch in dag”) عند تنفيذ استعلام يتضمن make_distributed_plan = 1 ويربط باستخدام مفتاح مغلّف بدالة، بينما لا يوجد نوع مشترك بين جانبيه (على سبيل المثال، ON intDiv(-1, t1.key) = t2.key مع مفتاح أيمن من نوع UInt64). #107701 (groeneai).
  • إصلاح قيام إزالة تكرار الإدراج بحساب تجزئات خاطئة لأعمدة String وArray مع إعداد الخادم insert_deduplication_version = new_unified_hash: إذ قد تفشل عمليات الإدراج المتطابقة في إزالة التكرار لأن تجزئة إزالة التكرار كانت تعتمد على موضع الصف داخل الكتلة المُدرجة. #107915 (CheSema).
  • إصلاح إنهاء الخادم في has عند البحث في Map ذي مفاتيح Dynamic باستخدام وسيطة LowCardinality. #107956 (groeneai).
  • إصلاح انحدار في أداء الأعمدة الفرعية لـ Map المستخدمة مع PREWHERE. #107988 (Avogar).
  • إصلاح خطأ منطقي عند تحويل عمود Dynamic أو Variant متداخل داخل Tuple إلى نوع عنصر غير Nullable باستخدام accurateCastOrNull أو accurateCastOrDefault. #108061 (alexey-milovidov).
  • إصلاح استثناء الخطأ المنطقي Bad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t> عند قراءة استعلام LIKE من فهرس text عبر مسار القراءة المباشرة البديل لعمود مخزّن بشكل متفرق. #108068 (groeneai).
  • إصلاح LOGICAL_ERROR (“نوع الإرجاع غير المتوقع من if”) عند قراءة عمود مع apply_mutations_on_fly = 1 بعد تنفيذ ALTER UPDATE col = ... WHERE <cond> بشرط غير ثابت أو خاطئ، يتبعه ALTER MODIFY COLUMN col <new type>. #108128 (groeneai).
  • إصلاح signed integer overflow (سلوك غير معرّف) في dateDiff بوحدتي hour وminute عند استخدام قيم DateTime64 متطرفة قريبة من حدود نطاق Int64. #108229 (groeneai).
  • إصلاح استثناء في الخادم (Logical error في IColumn::insertFrom) عند تحويل Array(Dynamic) أو Array(Variant) إلى QBit باستخدام accurateCastOrNull، مثل accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (groeneai).
  • إصلاح parseDateTimeBestEffort مع المنطقة الزمنية، إذ كان يطلق CANNOT_PARSE_DATETIME لصفوف NULL في toString(Nullable(DateTime64)). #108310 (yariks5s).
  • إصلاح تعطل الخادم (تجاوز سعة المكدس) الناجم عن تعبيرات متداخلة بعمق مثل [[[ ... ]]] أو array(array( ... )) عند ضبط max_parser_depth على قيمة كبيرة. #108493 (Algunenano).
  • إصلاح إسقاط SELECT * الذي كان يعيد القيمة الافتراضية لنوع العمود (مثل 0) بدلًا من قيمة DEFAULT الخاصة به (مثل -1) عند قراءة عمود أُضيف باستخدام ALTER TABLE ... ADD COLUMN ... DEFAULT بعد إنشاء الإسقاط. كانت القراءات من الجدول الأساسي صحيحة بالفعل؛ ولم تتأثر سوى القراءات التي يعالجها الإسقاط، إلى أن أُعيد بناؤه. #108569 (tiandiwonder).
  • إصلاح تعطيل التقليم حسب القسم والمفتاح الأساسي بصمت عندما يكون عمود مفتاح LowCardinality(FixedString) (أو LowCardinality(Nullable(FixedString))) مغلفًا بدالة ضمن المفتاح، مثل PARTITION BY sipHash64(k) % N مع WHERE k = 'literal'. كانت هذه الاستعلامات تفحص جميع الأقسام بدلًا من تقليمها. #108777 (groeneai).
  • الحفاظ على الترتيب الأصلي للمفاتيح في تسلسل Map المستند إلى الحاويات لإصلاح عمليات المقارنة التي تعتمد عليه. #109178 (Avogar).
  • إصلاح استنتاج المخطط لتنسيقات Arrow وArrowStream وAvro وقارئات ORC وParquet القديمة، التي كانت تعيد Nullable(Tuple) لأعمدة struct القابلة للقيم الفارغة، رغم أن النوع Nullable(Tuple) غير مسموح به (allow_experimental_nullable_tuple_type معطل). كان DESCRIBE يعيد نوعًا يرفضه CREATE TABLE، لذلك كان إنشاء جدول أو إدراج بيانات باستخدام المخطط المستنتج يفشل بالخطأ Nullable Tuple type is not allowed. #109185 (nihalzp).
  • إصلاح خطأ كانت فيه قيم DEFAULT للأعمدة لا تُطبّق عند استخدام INSERT INTO TABLE FUNCTION (مثل remote(...) أو file(...)) مع بيانات VALUES مضمنة، عندما يحلل الخادم البيانات المضمنة بنفسه (send_table_structure_on_insert_with_inline_data = 0). كانت قيمة NULL صريحة تُدرج في عمود غير Nullable ذي DEFAULT تصبح 0 بدلًا من القيمة الافتراضية المعلنة. أصبح السلوك الآن مماثلًا لعملية INSERT عادية في جدول ولـ HTTP protocol. #109258 (groeneai).
  • إصلاح خطأ segfault في groupArrayLastMerge. أصبح إلغاء تسلسل حالة الدالة التجميعية خاضعًا للتحقق، لذا لا تؤدي الحالة التالفة إلى وصول خارج الحدود. #109485 (mstetsyuk).
  • إصلاح خطأ segfault في الدالة التجميعية largestTriangleThreeBuckets برفض حالة الدالة التجميعية التالفة أثناء إلغاء التسلسل. #109492 (mstetsyuk).
  • إصلاح قراءة عمود Parquet ذي Tuple غير قابل للقيم NULL عندما يغلّفه نوع ClickHouse المطلوب ضمن Nullable (مثل Nullable(Tuple(...)))، إذ كانت تفشل سابقًا بالخطأ TYPE_MISMATCH. #109615 (groeneai).
  • أصبح بإمكان القارئ الأصلي لـ Parquet v3 قراءة عمود struct قابل للقيم NULL فعليًا (مجموعة OPTIONAL في Parquet) باعتباره Nullable(Tuple(...)). وكان يرمي سابقًا الخطأ TYPE_MISMATCH. #109898 (groeneai).
  • إصلاح تعطل الخادم (تجاوز مكدس أصلي) عند نسخ أو إتلاف قيمة حرفية متداخلة بعمق من Array/Tuple/Map/Object، مثل استعلام يتضمن قيمة حرفية متداخلة بعمق كبير مع رفع max_parser_depth. #110393 (Algunenano).
  • إصلاح نتائج IS NULL / IS NOT NULL / count() غير الصحيحة مع optimize_functions_to_subcolumns في عمود أصبح Nullable عبر ALTER MODIFY COLUMN T يغيّر البيانات الوصفية فقط إلى Nullable(T). بالنسبة إلى الأجزاء المكتوبة قبل التحويل، كان يُملأ العمود الفرعي .null من القيمة الافتراضية لنوع التخزين (NULL) بدلًا من اشتقاقه من العمود الأب الموجود فعليًا، لذا كان يُبلّغ خطأً عن الصفوف الموجودة غير NULL على أنها NULL. #110584 (groeneai).
  • إصلاح LOGICAL_ERROR (“Bad cast from ColumnString to ColumnLowCardinality”) أثناء تحليل فهرس المفتاح الأساسي عندما يُغلّف عمود مفتاح LowCardinality ضمن سلسلة CAST متداخلة تعيد إدخال LowCardinality، مثل WHERE CAST(CAST(s, 'LowCardinality(String)'), 'String') < '5'. في إصدارات debug وsanitizer كان هذا يوقف الخادم، بينما كان يتسبب في فشل الاستعلام في إصدارات الإصدار. #111050 (groeneai).
  • إصلاح قراءة بيانات Arrow وArrowStream ذات أعمدة Array أو Map متداخلة وفارغة، والتي أنتجها Apache Arrow Java قبل الإصدار 19.0.0 (المضمّن مع Apache Spark)، إذ كانت تُرفض سابقًا بخطأ INCORRECT_DATA يفيد بأن مخزن offsets المؤقت صغير جدًا. #111101 (Algunenano).
  • إصلاح الخطأ المنطقي Block structure mismatch (في إصدارات debug وsanitizer) وخطأ Illegal types of arguments في عمليات المجموعات على أعمدة حالات تجميعية متوافقة (مثل quantileState وquantilesState(0.9)) متداخلة داخل أعمدة حاوية مثل Tuple أو Array أو Map أو Nullable أو Variant. #111191 (alexey-milovidov).
  • إضافة تحقق من بيانات الفهرس المنسوخ التالفة المستلمة عبر البروتوكول الأصلي. #112331 (Avogar).
  • إصلاح قراءة خارج الحدود أثناء إزالة تكرار الإدراج عندما يمر INSERT عبر عرض مادي يغيّر عدد الصفوف قبل الكتابة إلى جدول هدف مقسّم إلى أقسام. #112649 (CheSema).
  • تم إصلاح كتابة خارج النطاق عند قراءة عمود DECIMAL من Parquet يكون نوعه الفيزيائي أوسع من النوع الذي تقابله دقته المعلنة، مثل DECIMAL(9, 2) المخزن بالنوع الفيزيائي INT64. هذه الملفات صالحة في Parquet وتنتجها أدوات كتابة أخرى، لكن القارئ كان يحدد حجم العمود الوجهة بناءً على الدقة المعلنة، بينما كان مفكك الترميز يكتب بالعرض الفيزيائي، مما يؤدي إلى تلف الذاكرة. تؤدي قراءة مثل هذا الملف الآن أيضًا إلى ظهور DECIMAL_OVERFLOW عندما لا تتسع قيمة ضمن الدقة المعلنة، بدلًا من إرجاع بيانات تالفة، وتتم القراءة دون فقدان للبيانات عند استخدام تلميح نوع بعرض لا يقل عن عرض النوع الفيزيائي. #113046 (groeneai).
  • تم إصلاح فشل ATTACH PARTITION FROM وREPLACE PARTITION وMOVE PARTITION TO TABLE وإضافة نسخة متماثلة من ReplicatedMergeTree مع ظهور الرسالة Tables have different ... أو METADATA_MISMATCH أو INCOMPATIBLE_COLUMNS للجداول التي كُتبت تعريفاتها بأقواس زائدة، مثل PARTITION BY (a) وORDER BY (b) وINDEX ix (b * c) TYPE minmax وPROJECTION p (SELECT (b) ...) وCONSTRAINT c CHECK (a > 0) وTTL (d + INTERVAL 10 YEAR) أو DEFAULT (a + 1). #114188 (alexey-milovidov).
  • تم إصلاح خطأ يؤدي إلى تخزين كيان وصول يحمل إعدادًا بقيمة Map، مثل ملف تعريف إعدادات يحتوي على http_response_headers أو additional_table_filters، بصيغة لا يستطيع ClickHouse قراءتها مجددًا، مما يجعل الكيان غير قابل للتحميل بشكل دائم بعد إعادة التشغيل. #114620 (groeneai).
  • تم إصلاح has وindexOf وcountEqual وmapContainsKey وmapContainsValue وفهرسة Map التي كانت تُرجع “غير موجود” عند استخدام قيمة بحث ثابتة من LowCardinality تساوي القيمة الافتراضية لنوع العنصر، مثل String فارغ أو الرقم صفر. #114624 (groeneai).
  • تم إصلاح النتائج الخاطئة لتحسين GROUP BY ... LIMIT البسيط (الإعداد optimize_trivial_group_by_limit_query) في الاستعلامات التي تحتوي على DISTINCT أو QUALIFY أو دوال النوافذ أو arrayJoin في الإسقاط: إذ تستهلك هذه العمليات المجموعات أو تصفيها بعد التجميع، لذلك كان تقييد التجميع عند مفاتيح LIMIT + OFFSET قد يعيد صفوفًا أقل من اللازم أو قيمًا خاطئة. لم يعد التحسين يُطبّق على مثل هذه الاستعلامات. #114695 (alexey-milovidov).
  • تم إصلاح النتائج الخاطئة لـ SELECT count(arrayJoin(arr)) مع الإعداد الافتراضي optimize_trivial_count_query = 1. كان يُرجع عدد الصفوف المخزن بدلًا من عدد عناصر المصفوفة، وكان الاستعلام يُرجع 0 مع file() وurl(). #115227 (groeneai).
  • تم إصلاح uniq وuniqExact وuniqHLL12 وuniqTheta التي كانت تُرجع نتيجة خاطئة لوسيطة مغلفة بدالة حقنية تخفي قابلية القيم الفارغة، مثل uniqExact(tuple(x)) على عمود Nullable. كان تحسين optimize_injective_functions_inside_uniq يزيل دالة التغليف، فتُتخطى بعد ذلك الصفوف ذات القيمة NULL بدلًا من احتسابها. #115466 (vdimir).
  • أصبح مسموحًا لقارئات KeeperMap بقبول البيانات الوصفية المشتركة عندما تختلف المفاتيح الأساسية المتكافئة فقط بأقواس خارجية زائدة. #115642 (skuznetsov-clickhouse).

إصلاحات فهرس النص وفهرس التخطي

  • إصلاح توقف الخادم عند استخدام استعلام لمقارنات coalesce/ifNull متداخلة (مثل WHERE coalesce(a, b, coalesce(c, d), e) = const) على جدول MergeTree يحتوي على عدة فهارس تخطٍ من نوع minmax ومع use_skip_indexes_for_disjunctions = 1. تُطبَّق الآن إعادة كتابة فهرس التخطي لـ <op>(coalesce(...), const) بصورة تعاودية على وسائط coalesce الداخلية، بحيث تتطابق صيغة RPN لـ KeyCondition لكل فهرس مع صيغة RPN للقالب، كما يفترض رمز تتبع عمليات الفصل بالفعل. #103929 (groeneai).
  • إصلاح الخطأ NOT_FOUND_COLUMN_IN_BLOCK الذي كان يطرحه ALTER TABLE ... MATERIALIZE INDEX على الأجزاء التي أُنشئت في 25.8 وتحتوي على فهرس تخطٍ لعمود أُضيف عبر أمر مستقل ALTER TABLE ... ADD COLUMN. تقرأ عملية التعديل الآن بصورة صحيحة كل عمود مطلوب لكل فهرس تخطٍ وإسقاط موجودين مسبقًا في الجزء أثناء إعادة الحساب القسرية. #105039 (groeneai).
  • إصلاح نقص صامت في العدد في استعلامات SELECT عند استخدام use_query_condition_cache = 1 (القيمة الافتراضية). كان استعلام بالشكل PREWHERE pk_prefix = X WHERE non_pk IN (...) على عمود ذي فهرس تخطٍ بمرشح Bloom يفسد QueryConditionCache للمسند pk_prefix = X، لذا كان استعلام سليم لاحق من الشكل SELECT count() ... WHERE pk_prefix = X يعيد نتيجة غير صحيحة بعدد أقل من الفعلي. تأثرت جميع إصدارات 26.x. #105686 (groeneai).
  • إصلاح استثناء يحدث عندما يستخدم استعلام بحث متجهي فهرسًا متجهيًا وفهرس تخطٍ آخر مثل minmax مع use_skip_indexes_on_data_read = 1. #106473 (shankar-iyer).
  • إصلاح خطأ “عدد كبير جدًا من العلامات” لفهرس نصي على جزء مدمج فارغ. #106867 (azat).
  • إصلاح نتائج خاطئة عند الاستعلام عن جدول ReplacingMergeTree باستخدام FINAL ومرشح على فهرس نصي، عندما يكون query_plan_optimize_lazy_final مفعّلًا. أنشأ تحسين FINAL الكسول خطوات قراءة لم تُحاكِ القراءة المباشرة من الفهرس النصي، مما أدى إلى إسقاط المرشح جميع الصفوف المطابقة. #106894 (Ergus).
  • إصلاح LOGICAL ERROR (Bad cast from type DB::ColumnString to DB::ColumnLowCardinality) عند مقارنة قيمة ثابتة من نوع Variant تحتوي على عضو LowCardinality بعمود مفتاح يكون تعبير مفتاحه دالة حتمية غير رتيبة (مثل فهرس تخطٍ من نوع minmax على sipHash64(col)). #107111 (groeneai).
  • إصلاح النتائج الخاطئة (والفارغة غالبًا) من ORDER BY <col> LIMIT n عندما يكون تحسين use_skip_indexes_for_top_k نشطًا، وكان جزء يحتوي على فهرس تخطٍ من نوع minmax على عمود الفرز قد حُذفت منه صفوف باستخدام DELETE خفيف. لم يعد التحسين يرتب قيمة minmax القديمة في الأجزاء التي حُذفت منها صفوف باستخدام DELETE خفيف قبل الأجزاء التي تحتوي على أعلى الصفوف الحالية. #107320 (groeneai).
  • إصلاح عدم تقليم فهرس التخطي Set للحبيبات في أعمدة LowCardinality. #107868 (thevar1able).
  • يمكن الآن إعادة الإعداد use_skip_indexes_on_data_read إلى قيمته الافتراضية السابقة للإصدار 26.1 (false) عبر إعداد compatibility، مما يوفر حلًا مؤقتًا لتراجع في الأداء، حيث يمنع مسار القراءة من البيانات تقليم نطاقات العلامات بواسطة فهارس التخطي minmax/set/bloom_filter. #108330 (egor-click).
  • أُصلحت القراءة المباشرة من عدة فهارس نصية مجسّدة جزئيًا. #108607 (CurtizJ).
  • أُصلحت مشكلة عدم استخدام فهرس نصي مُعرّف على mapValues(map) أو mapKeys(map) بصمت عند الاستعلام عن جدول عبر جدول بمحرك Distributed باستخدام المحلّل. كان الفهرس يُستخدم للجدول المحلي وعبر cluster()/remote()، لكن الاستعلام عبر جدول بمحرك Distributed كان يتجاهله (ويفشل بالخطأ INDEX_NOT_USED عند استخدام force_data_skipping_indices). #109188 (groeneai).
  • أُصلح تعطل الخادم عند استخدام CREATE HYPOTHETICAL INDEX ... TYPE set (وngrambf_v1/tokenbf_v1) في حال حذف وسيطة الفهرس المطلوبة. تُرفض هذه العبارات الآن برسالة خطأ واضحة. #109294 (groeneai).
  • أُصلحت النتائج غير الصحيحة للدوال has وmapContainsKey وmapContainsValue عند استخدام إبرة فارغة مع وجود فهرس نصي. #110246 (rschu1ze).
  • أُصلح الخطأ ATTEMPT_TO_READ_AFTER_EOF عند دمج الأجزاء التي تحتوي على فهرس نصي، إذا كان أحد الأجزاء المدمجة فارغًا، مثلًا بعد طفرة حذفت جميع صفوف الجزء. #112490 (CurtizJ).
  • أُصلح تعليق تحسين خطة الاستعلام عندما تحتوي عبارة WHERE على ثابت سلسلة كبير يحوي عددًا كبيرًا من النقاط، ويحتوي الجدول على فهرس تخطٍ من نوع bloom_filter أو tokenbf_v1 أو ngrambf_v1 أو text. كانت مطابقة اسم عمود التصفية مع أعمدة الفهرس JSONAllPaths(...) تُعدّد كل تقسيم للاسم عند النقاط، مما جعل بناء شرط فهرس التخطي ذا تعقيد تربيعي بالنسبة إلى طول الثابت. #113289 (groeneai).
  • أُصلحت مشكلة إرجاع ORDER BY ... LIMIT لصفوف أقل من المطلوب، وربما دون أي صفوف، عندما كانت سياسة الصفوف عامل التصفية الوحيد في الاستعلام وكان عمود الفرز يحتوي على فهرس تخطٍ minmax. كان تحسين أعلى K يضيّق نطاق القراءة قبل تطبيق سياسة الصفوف. #114073 (alexey-milovidov).

إصلاحات مستودع البيانات

  • إصلاح استثناء خطأ منطقي عند قراءة جداول Iceberg التي تمت ترقية إصدار تنسيقها بواسطة أداة خارجية (مثل Spark). #100407 (alexey-milovidov).
  • إصلاح استثناء (LOGICAL_ERROR: 'PREWHERE passed to format that doesn't support it') عند قراءة جداول Iceberg التي تحتوي على ملفات بيانات ORC مع تفعيل تحسين PREWHERE. #101206 (groeneai).
  • إصلاح استثناءات LOGICAL_ERROR عند قراءة جداول بحيرة البيانات Iceberg أو DeltaLake عبر مسارات قد تصل إلى مسار القراءة دون تثبيت datalake_table_state، مثل تحديثات البيانات الوصفية المتزامنة لـ Iceberg أو قراءات merge لجداول DeltaLake. #102033 (groeneai).
  • إصلاح الظهور المتقطع للخطأ Logical error: 'Database <name> not found' من DataLakeConfiguration::getCatalog عند تحميل جدول بمحرك Iceberg داخل قاعدة بيانات عادية أثناء التحميل غير المتزامن للبيانات الوصفية. #103775 (groeneai).
  • إصلاح قراءات مفرطة للبيانات الوصفية من الكتالوج وS3 عندما تشير عبارة INSERT أو DDL إلى جدول غير موجود في قاعدة بيانات كتالوج DataLake مع تفعيل show_data_lake_catalogs_in_system_tables. كان مسار اقتراح تصحيح الأخطاء المطبعية يحمّل البيانات الوصفية الكاملة لـ Iceberg لكل جدول في الكتالوج بأكمله، مما قد يستنفد الذاكرة في الكتالوجات الكبيرة. #104124 (il9ue).
  • إصلاح تضخم read_bytes (والبايتات/ث المشتقة المعروضة في system.query_log وشريط التقدم وغير ذلك) عند قراءة ملفات Parquet. كان التنفيذ السابق يبلّغ عن إجمالي الحجم المضغوط لمجموعة الصفوف في كل مقطع، لذا كانت قراءة K من أصل N من الأعمدة تؤدي إلى احتساب زائد بمقدار N / K. ويُجمع الآن عبر الأعمدة المحددة فقط. كما يُصلح تتبع التقدم على مستوى الملف لجداول Iceberg، الذي لم يكن يبلّغ سابقًا عن حجم ملف البيانات مطلقًا. #105413 (groeneai).
  • إصلاح النتائج الخاطئة عند قراءة جدول Iceberg مع iceberg_use_version_hint = 1 بعد أن يقوم كاتب آخر، مثل دالة الجدول icebergLocal/icebergS3، بتحديث الجدول دون هذا الإعداد. يُبقى version-hint.text الآن متزامنًا بواسطة كل كاتب بمجرد وجود الملف، لذا يرى القراء اللاحقون الذين يستخدمون التلميح أحدث لقطة. #105682 (groeneai).
  • تحافظ عمليات الكتابة إلى Iceberg الآن على قيم NULL في أعمدة التقسيم Nullable(T). سابقًا، كانت قيمة NULL التي يكتبها ClickHouse تظهر كالقيمة الافتراضية للنوع الداخلي (0 لـ int) عند قراءتها مجددًا بواسطة Spark أو قارئات Iceberg الأخرى. #105862 (groeneai).
  • إصلاح عمليات حذف المواضع في Iceberg v2 بنمط الدمج عند القراءة، التي كانت تعيد صفوفًا خاطئة عندما يشير ملف حذف واحد إلى عدة ملفات بيانات وتنطبق عدة ملفات حذف على ملف البيانات نفسه. تُرشّح إدخالات الحذف الآن بحسب مسار الملف المشار إليه. #105888 (groeneai).
  • إصلاح تحوّل محرك الجدول IcebergLocal إلى وضع القراءة فقط بعد دورة DETACH + ATTACH أو إعادة تشغيل الخادم، مما كان يؤدي إلى فشل كل عملية INSERT لاحقة بالرسالة Local object storage Local is readonly. (READONLY). #106016 (groeneai).
  • إصلاح تعطيل ذاكرة التخزين المؤقت لنظام الملفات بصمت في Azure Blob Storage (مثل جداول Delta Lake على Azure) لأن البيانات الوصفية للكائن لم تتضمن قيمة ETag للـ blob. #106091 (thewisenerd).
  • أُضيف التحقق من صحة المسار لجداول Delta Lake لمنع البيانات الوصفية من الوصول إلى كائنات خارج موقع التخزين المُهيّأ. #106115 (scanhex12).
  • أصبح تقليم أقسام Iceberg يتعامل بصورة صحيحة مع عوامل التصفية WHERE partition_col = (SELECT ... FROM ...)، حيث يغلّف المحلّل نتيجة الاستعلام الفرعي القيَمي داخليًا في _CAST(Const, 'TargetType') عندما يتطابق نوعا المصدر والهدف. في السابق، كانت عوامل التصفية هذه تعطّل تقليم الأقسام وتؤدي إلى فحص كامل للجدول. #106204 (groeneai).
  • أُصلحت مشكلة الإبلاغ خطأً عن كتالوجات REST لـ Iceberg التي تحتوي على جداول على أنها فارغة. #106301 (LefterisXefteris).
  • أُصلح استثناء NOT_FOUND_COLUMN_IN_BLOCK عند الاستعلام عن جدول Iceberg أو S3 باستخدام شرط WHERE مركّب يتضمن IS NOT NULL لعمود غير مدرج في قائمة SELECT، عند استخدام قارئ Parquet V3 الأصلي. #106443 (tiandiwonder).
  • أُصلح الإبلاغ المتضخم عن التقدم عند القراءة من جداول Iceberg باستخدام عوامل تصفية _file أو _path. في السابق، كان تقدم total_bytes_to_read يتضمن جميع الملفات في البيان بغض النظر عن التصفية. #106491 (PedroTadim).
  • أُصلح استثناء في الخادم (خطأ منطقي std::out_of_range) عند الإدراج في جدول Iceberg لا تتطابق فيه أسماء أعمدة كتلة الكتابة مع معرّفات الحقول في أحدث مخطط للجدول (مثلًا، بعد أن يعيد كاتب متزامن تسمية عمود ضمن نافذة iceberg_metadata_staleness_ms). يفشل الإدراج الآن بخطأ استعلام واضح بدلًا من إيقاف الخادم. #107279 (groeneai).
  • أُصلح احتمال تجاوز مكدس الخادم (تعطله) عند قراءة مخطط أو قيمة متداخلة بعمق في تنسيقات MsgPack وBSON وORC وParquet وJSON وDeltaLake وIceberg وPaimon. ويُرفض الآن هذا الإدخال المتداخل بعمق مع إصدار استثناء. #107341 (Algunenano).
  • أُصلح تعطل (LOGICAL_ERROR في إصدارات التصحيح) وخطأ صامت يؤدي إلى نتائج غير صحيحة (في إصدارات الإنتاج) عند قراءة جدول Iceberg تعيد بياناته الوصفية ربط schema-id موجود بمخطط مختلف عبر إصدارات البيانات الوصفية. وتُرفض الآن هذه البيانات الوصفية باستخدام ICEBERG_SPECIFICATION_VIOLATION. #107370 (groeneai).
  • أُصلحت قراءة جداول Iceberg v3 التي تحتوي ملفات بيانات Parquet فيها على أعمدة نسب الصفوف المحجوزة (مثل _row_id)؛ لم يعد قارئ Parquet الأصلي يثير ICEBERG_SPECIFICATION_VIOLATION لمعرّفات الحقول المحجوزة التي لا تشكل جزءًا من مخطط الجدول. #107377 (gregakinman).
  • أُصلح استثناء زائف filesystem error: in last_write_time: No such file or directory عند سرد دليل تخزين كائنات على قرص محلي (مثل جدول Iceberg على قرص local) أثناء استبدال الملفات بشكل متزامن. ويُستبعد الآن الإدخال الذي أُزيل بشكل متزامن من القائمة بدلًا من إيقاف عملية السرد. #107432 (groeneai).
  • أُصلح الخطأ ‘يجب تحديد الحساب’ عند قراءة جدول Delta Lake عبر Azure. #107620 (SmitaRKulkarni).
  • إصلاح تعطل عند قراءة جداول Iceberg التي تحتوي على ملفات حذف بالمساواة. إذا كان عمود في ملف الحذف بالمساواة يقبل NULL بينما لا يقبله في مخطط الجدول (أو العكس)، كانت القيم المقروءة من ملف الحذف تُدرج في عمود من نوع مختلف عبر تحويل غير متحقق منه (التباس في نوع العمود)، مما يفسد العمود ويتسبب في تعطل الخادم. #109551 (mstetsyuk).
  • إصلاح خطأ ICEBERG_SPECIFICATION_VIOLATION غير صحيح عند قراءة جدول Iceberg يُسلسَل فيه النوع العشري (أو أي نوع أساسي آخر ذو معلمات) بمسافات بيضاء مختلفة في ملفات البيانات الوصفية، مثل decimal(20,0) في البيانات الوصفية للجدول وdecimal(20, 0) في البيان. تُقارَن الآن سلاسل الأنواع المتكافئة وفقًا للمواصفة مع تجاهل المسافات البيضاء. #109676 (groeneai).
  • إصلاح قراءة جداول Iceberg التي يشير ترتيب الفرز الافتراضي فيها إلى عمود يحتاج إلى اقتباس (مثل @timestamp). كانت هذه الجداول غير قابلة للقراءة لأن عبارة ORDER BY الخاصة بالتخزين المُنشأة كانت تُبنى من اسم العمود الخام، ولم يكن بالإمكان تحليلها بسبب SYNTAX_ERROR. #110233 (groeneai).
  • إصلاح قراءة جداول Paimon التي تحتوي على عمود ARRAY أو MAP يقبل NULL. لم يكن بالإمكان قراءة هذه الجداول إطلاقًا، لأن محوّل المخطط كان يغلّف النوع المركب في Nullable، وهو ما لا يسمح به ClickHouse، لذا كان كل من DESC وSELECT يفشل بالرسالة Nested type Array(Nullable(Int32)) cannot be inside Nullable type. يُعيَّن الآن العمود المركب الذي يقبل NULL إلى نوع مركب غير Nullable، وتُقرأ قيمة NULL كقيمة فارغة. #113450 (groeneai).
  • تسجيل مساحة اسم Iceberg في الكتالوج قبل كتابة ملفات الجدول (مطلوب لـ SeaweedFS) #114285 (azat).

إصلاحات S3/Azure/التخزين الكائني

  • إصلاح الاستثناء “Distributed task iterator is not initialized” عند استخدام دوال الجدول url أو s3 أو ما شابهها في استعلامات تكون فيها النسخ المتماثلة المتوازية مفعّلة. #100146 (alexey-milovidov).
  • إصلاح تعطل محتمل للخادم في دوال جدول الكتلة (s3Cluster، urlCluster، fileCluster، …) عندما يُنشئ المخطط عبارة SELECT بعلامة recursive_with مفعّلة، ولكن من دون تعبير WITH. #105433 (groeneai).
  • إصلاح دفع عامل التصفية لـ Parquet وORC لمسندات IN (subquery)، مما يتيح استبعاد مجموعات الصفوف والصفحات ومرشحات Bloom عند القراءة من file وurl وs3 والتخزين الكائني. #105863 (arsenmuk).
  • إصلاح استثناء LOGICAL_ERROR أثناء التنزيل المسبق إلى الذاكرة المؤقتة عندما يُستبدل كائن S3 بعيد بمحتوى أقصر بين الإدراج والقراءة. #106375 (fm4v).
  • إصلاح تجاهل دالة الجدول s3 بصمت لقيمة موضعية من partition_strategy مكتوبة بأحرف صغيرة (مثل hive). #107297 (jkartseva).
  • إصلاح انحدار كان يؤدي فيه تعيين compatibility = '26.6' (الذي يفعّل ضمنيًا استراتيجية التقسيم hive) إلى قبول {_partition_id} بصمت في مسارات جداول S3 والتخزين الكائني بدلًا من إطلاق BAD_ARGUMENTS. #107437 (LefterisXefteris).
  • إصلاح قيام دالة الجدول s3 ودوال جداول التخزين الكائني الأخرى بإطلاق LOGICAL_ERROR بدلًا من BAD_ARGUMENTS عند تكرار وسيطة مفتاح-قيمة، مثل s3('http://...', format = 'CSV', format = 'TSV'). #107670 (groeneai).
  • إصلاح استثناء في الخادم (Logical error: 'index >= result.start') عند تنسيق استعلام غير صالح يمزج بين صيغتي الوسيطة السرية الموضعية والمسمّاة لدوال الجدول s3/gcs، مثل s3('url', 'a', 'b', secret_access_key = 'c'). #107818 (groeneai).
  • إصلاح أولوية إعدادات S3 بحيث تكون لكتلة نقطة النهاية <s3> المقيّدة بـ URL أسبقية على إعدادات <s3> الافتراضية في المستوى الأعلى. #109251 (bharatnc).
  • إصلاح أخطاء 411 Length Required الصادرة من خدمات Azure: إذ يعيّن الآن نقل Azure عبر HTTP المستند إلى Poco قيمة Content-Length استنادًا إلى متن الطلب لعملاء SDK الذين لا يعيّنون الترويسة بأنفسهم (مثل Azure Key Vault). #110299 (thevar1able).

إصلاحات S3Queue

  • إصلاح تعطل الخادم (وصول خارج النطاق) في S3Queue/AzureQueue عند استخدام enable_hash_ring_filtering = 1، إذا كانت الدفعة تحتوي على ملف غير قابل للمعالجة وفشل في الوقت نفسه طلب Keeper لتعيين الدفعة قيد المعالجة. #108977 (groeneai).
  • إصلاح تسرّب بيانات الاعتماد في SHOW CREATE وsystem.query_log وسجلات الخادم ومخرجات EXPLAIN. تخفي جميع صيغ محددات S3 الآن session_token وأسرار Google ADC وقيم extra_credentials/headers في أي موضع للوسيط، ومفاتيح الأسرار المكررة أو المُنشأة بتعبير، والصيغ الموضعية غير الصالحة (تُرفض بأمان)، وبيانات الاعتماد المضمّنة في عناوين URL الخاصة بـ S3. ويشمل ذلك دوال الجدول s3/s3Cluster ذات عنوان URL الصريح والمجموعة المسماة، ومحركات الجداول المستندة إلى S3 (S3 وGCS ومحركات بحيرة البيانات وS3Queue)، ومحرك قاعدة البيانات S3، وBACKUP ... TO S3، ومحرك قاعدة البيانات Backup. بالإضافة إلى ذلك، أصبحت وسائط الأسرار في encrypt/decrypt/HMAC المُنشأة بتعبير (بما في ذلك المضمّنة من SQL UDF) مخفية في أسماء الإسقاطات وEXPLAIN QUERY TREE وEXPLAIN actions. #109768 (Algunenano).
  • إصلاح وضع Ordered في S3Queue/AzureQueue مع عُقد المعالجة المستمرة: تُحدَّث أقفال الحاويات الآن أثناء البث، بحيث لا تؤدي عملية تنظيف TTL (persistent_processing_node_ttl_seconds) إلى إزالة أقفال معالج نشط. وإذا فُقدت ملكية القفل رغم ذلك، يُكتشف الأمر ويُبلَّغ عنه (خطأ منطقي وحدث ملف التعريف ObjectStorageQueueBucketLockLostOwnership)، ويستأنف البث باستخدام مكرّر ملفات جديد. #110292 (kssenii).

إصلاحات الأمان والتحكّم بالوصول

  • إصلاح تعطل في الخادم (SIGSEGV) يمكن لأي مستخدم لديه صلاحية CREATE TABLE استغلاله عند إرسال CREATE TABLE ... TO INNER UUID '...' دون عبارة ENGINE عبر HTTP أو البروتوكول الأصلي. وكان الخطأ نفسه يؤدي أيضًا إلى تعطل العميل. يُبلغ المحلل الآن عن خطأ BAD_ARGUMENTS مناسب بدلًا من فك إشارة مرجع لمؤشر فارغ. #105579 (groeneai).
  • إصلاح تعطل في الخادم عند الاستعلام عن جداول DeltaLake مع تفعيل allow_experimental_delta_kernel_rs ووجود بيانات اعتماد أو خيار يتضمن بايتات غير صالحة (إذ حدث ذعر في Rust FFI عبر حد extern "C"). #106109 (Algunenano).
  • إصلاح عدة عمليات قراءة خارج حدود الكومة في قارئ تنسيق Arrow IPC (ArrowColumnToCHColumn). كان يمكن لملف Arrow مشوه أن يعلن عددًا من الصفوف أكبر مما تحتويه مخازنه المؤقتة، أو يعلن أطوالًا لعناصر تابعة من نوع قائمة/بنية/خريطة لا تتسق مع العنصر الأصل، أو يوفر إزاحات قوائم غير رتيبة، أو يقتطع خريطة بتات صلاحية تابعة، مما يؤدي إلى قراءات تتجاوز نهاية تخصيصات الكومة. يمكن لأي مستخدم لديه امتياز SELECT الوصول إلى ذلك عبر file() أو format() أو دوال الجداول أو مدخلات ArrowFlight. يجري الآن التحقق من جميع مخازن البيانات والإزاحات وview-struct وخرائط بتات الصلاحية قبل أي وصول إلى مؤشر خام، كما تُفحص أشكال وإزاحات القائمة/البنية/الخريطة للتأكد من اتساقها. #106395 (Algunenano).
  • إصلاح خطأ كان يسمح لعمودي used_privileges وmissing_privileges في system.query_log باحتواء سلاسل امتيازات متسربة من استعلامات سابقة غير مرتبطة لمستخدم أو قاعدة بيانات أو جلسة مختلفة. #106425 (alexey-milovidov).
  • إصلاح تجاوز سعة المخزن المؤقت للكومة (تعطل الخادم) في decodeHTMLComponent عند فك ترميز سلاسل تحتوي على كيانات HTML الموسعة &nGt; أو &nLt;، ويمكن لأي مستخدم تنفيذ ذلك باستعلام SELECT واحد. #106741 (Algunenano).
  • إصلاح نتائج استعلامات خاطئة تسبب فيها التخزين المؤقت لشروط الاستعلام عندما كانت الطفرات الفورية (apply_mutations_on_fly) أو أجزاء التصحيح ترشح الصفوف قبل PREWHERE. كان استعلام يقرأ باستخدام apply_mutations_on_fly = 1 قد يفسد التخزين المؤقت بحيث يتخطى استعلام لاحق يستخدم apply_mutations_on_fly = 0 والمسند نفسه علاماتٍ كان ينبغي قراءتها، ويُرجع عددًا قليلًا جدًا من الصفوف. يغطي الإصلاح نفسه أيضًا سياسات الأمان على مستوى الصفوف، التي تُضاف كعامل تصفية قبل PREWHERE: إذ كان استعلام يُشغَّل ضمن سياسة صفوف تقييدية قد يفسد التخزين المؤقت لاستعلام لاحق يستخدم المسند نفسه دون تلك السياسة. #107145 (groeneai).
  • إصلاح تجاوز سعة المخزن المؤقت للكومة (تعطل الخادم) في windowFunnel عند إنهاء حالة مُعدّة لدالة تجميع تتضمن نوع حدث خارج النطاق، ويمكن لأي مستخدم تنفيذ ذلك باستعلام SELECT واحد. #107412 (uwezkhan).
  • إصلاح تقييم currentUser() وuser() وSESSION_USER وauthenticatedUser() كسلسلة فارغة في مسار تفريغ الإدراج غير المتزامن (مع async_insert = 1). أثر ذلك في تعبيرات الأعمدة DEFAULT/MATERIALIZED والعروض المادية التي تشير إلى هذه الدوال، والتي كانت تخزن بصمت سلسلة فارغة بدلًا من المستخدم الذي ينفذ الإدراج. #107541 (groeneai).
  • عند تعيين عدة حصص للمستخدم أو الدور نفسه، تُفرض الآن جميعها معًا (يُرفض الاستعلام إذا تم تجاوز أي منها)، بدلًا من فرض حصة واحدة فقط واختيارها بطريقة غير حتمية. يعرض SHOW QUOTA وsystem.quota_usage الآن جميع الحصص المفروضة على المستخدم الحالي. #107664 (alexey-milovidov).
  • يتطلب SYSTEM RESET DDL WORKER الآن امتياز SYSTEM RESET DDL WORKER الجديد. سابقًا، كان بإمكان أي مستخدم تمت مصادقته، بما في ذلك مستخدمي readonly، تشغيله وإعادة تعيين حالة عامل DDL مرارًا، مما يؤدي إلى حظر DDL عبر ON CLUSTER. #108460 (groeneai).
  • أُصلح تحديد هوية المستخدم عبر ssl_certificate بحيث يطابق الرمز البديل الواحد * مكوّنًا واحدًا من الاسم فقط (RFC 6125 6.4.3). سابقًا، كان الرمز البديل في موضوع CN أو SAN من نوع DNS: (مثل *.corp.example.com) يطابق أيضًا الأسماء متعددة المكوّنات مثل evil.deep.corp.example.com، مما يتيح لحامل شهادة لنطاق فرعي أعمق المصادقة بصفته مستخدم الرمز البديل. لم تتغير مطابقة SAN من نوع URI:. #108472 (groeneai).
  • تفرض أوامر بروتوكول MySQL السلكي COM_FIELD_LIST (mysql_list_fields) وCOM_INIT_DB (USE database) الآن نفس ضوابط الوصول التي تفرضها مكافئاتها في SQL، وهي (SHOW COLUMNS/DESCRIBE وUSE). سابقًا، كان بإمكانها كشف أسماء أعمدة الجداول التي لا يملك المستخدم سوى امتيازات جزئية على أعمدتها، وتغيير قاعدة البيانات الحالية دون امتياز SHOW DATABASES. #108508 (groeneai).
  • طابق http_forbid_headers دون حساسية لحالة الأحرف. أسماء ترويسات HTTP غير حساسة لحالة الأحرف، لذا فإن حظر Authorization يحظر الآن أيضًا authorization وAUTHORIZATION وغيرها من اختلافات حالة الأحرف. تُطابق الآن أنماط header_regexp المُهيأة دون حساسية لحالة الأحرف، دون الحاجة إلى علامة (?i) صريحة. #108509 (groeneai).
  • أُصلحت ثغرة لكشف البيانات الوصفية، إذ كان DESCRIBE loop('db', 'table') وDESCRIBE loop(<inner table function>) يتجاوزان فحص SHOW COLUMNS / الوصول إلى المصدر، مما يتيح لمستخدم غير مخوّل قراءة مخطط أعمدة جدول. #108624 (groeneai).
  • أُصلح فشل عند بدء التشغيل، إذ تعذّر إرفاق قاعدة بيانات DataLakeCatalog أُنشئت بإصدار أقدم (25.12 أو أقدم) مع auth_header مشوّه بعد الترقية إلى 26.2 أو أحدث، مما منع بدء تشغيل الخادم. يُتحقق الآن من auth_header عند CREATE فقط، وعند ATTACH يُنشأ الكتالوج عند أول استخدام بدلًا من إنشائه أثناء بدء التشغيل، لذا لم تعد قاعدة بيانات كتالوج واحدة مهيأة بشكل خاطئ أو غير قابلة للوصول تمنع بدء تشغيل الخادم. #108674 (groeneai).
  • عُزّزت اتصالات RabbitMQ ضد إطارات AMQP الكبيرة على نحو ضار، وطُبقت فحوصات remote_url_allow_hosts بصورة متسقة على rabbitmq_address. #112479 (kssenii).
  • أُصلحت حالة كان فيها CREATE TABLE ... ENGINE = Distributed(...) دون قائمة أعمدة يكشف بنية جدول محلي لا يُسمح للمستخدم المنشئ برؤيتها. عند تنفيذ CREATE، ينفذ الخادم المحلي العملية بنفسه، وتُستنتج البنية الآن ضمن سياق المستخدم نفسه، لذا يلزم امتياز SHOW COLUMNS على الجدول الهدف، كما هو مطلوب بالفعل لمحرك Remote. لا يشمل ذلك CREATE المُعاد تشغيله من قائمة انتظار DDL، سواء عبر ON CLUSTER أو ضمن قاعدة بيانات Replicated. #113220 (groeneai).
  • أُصلحت حالة كان فيها CREATE TABLE ... ENGINE = Buffer(...) من دون قائمة أعمدة قد يكشف بنية جدول وجهة لا يملك المستخدم المُنشئ صلاحية رؤيتها. بالنسبة إلى CREATE الذي ينفّذه الخادم المحلي بنفسه، تُستنتج البنية الآن ضمن سياق المستخدم نفسه، لذا يلزم امتلاك صلاحية SHOW COLUMNS على الوجهة، كما هو مطلوب بالفعل لـ Merge وRemote. لا يشمل ذلك CREATE المُعاد تشغيله من قائمة انتظار DDL (ON CLUSTER أو داخل قاعدة بيانات Replicated). #113372 (groeneai).
  • حُدِّد حجم رسالة بدء التشغيل لبروتوكول PostgreSQL السلكي، والتي تُقرأ قبل المصادقة. #115708 (alexey-milovidov).

إصلاحات النسخ الاحتياطي والاستعادة

  • إصلاح توقف الخادم أثناء تنفيذ RESTORE لنسخ احتياطية تحتوي على جداول ذات تبعيات دورية. #103824 (thevar1able).
  • إصلاح تجاهل فئة تخزين S3 (s3_storage_class / s3_storage_class_name) للكائنات المكتوبة عبر التحميل متعدد الأجزاء على أقراص S3 والتخزين الكائني، مما كان يؤدي إلى إنشاء الكائنات الكبيرة بالفئة الافتراضية STANDARD. يُقبل اسم الخيار الآن بصيغتي s3_storage_class وs3_storage_class_name للأقراص والتخزين الكائني والنسخ الاحتياطية. #106214 (alexey-milovidov).
  • إصلاح تجاهل SYSTEM RELOAD CONFIG لإعدادات Azure Blob Storage الخاصة بكل نقطة نهاية (مثل use_native_copy)، مما كان يؤدي إلى تجاهل إعدادات القرص المهيأة لعمليتي BACKUP/RESTORE حتى إعادة تشغيل الخادم. #106357 (jkartseva).
  • إصلاح فشل النسخ الاحتياطية بالخطأ FILE_DOESNT_EXIST عند جمع هدف REPLACE لعرض مادي قابل للتحديث على قاعدة بيانات Replicated أو Shared، عندما لم يكن العرض المادي قد أُنشئ بعد على النسخة المتماثلة التي بدأت النسخ الاحتياطي. #106411 (jkartseva).
  • إصلاح تجاهل Azure BACKUP/RESTORE لإعدادات نقطة النهاية لأقراص azure_blob_storage ذات الصيغة القديمة. #106784 (jkartseva).
  • إصلاح BACKUP إلى AzureBlobStorage: كان نسخ ملف بيانات داخل نسخة احتياطية يكتب كائن الوجهة خارج دليل النسخ الاحتياطي. تستخدم عمليات التحقق من وجود كائنات النسخ الاحتياطي على وجهات S3 الآن طلبات HeadObject دقيقة بدلاً من سرد البادئات، مما يمنع المطابقات الخاطئة للمفاتيح ذات البادئات المتشابهة. #107153 (pamarcos).
  • لم تعد النسخ الاحتياطية التزايدية تخزن بيانات اعتماد S3 في محدد موقع <base_backup> ضمن ملف البيانات الوصفية .backup. تخزن النسخ الاحتياطية التي أُنشئت باستخدام use_same_s3_credentials_for_base_backup = 1، أو ببيانات اعتماد صريحة للنسخة الاحتياطية الأساسية تطابق محدد موقع هذه النسخة الاحتياطية، علامة غير سرية وتُستعاد دون إعدادات إضافية وقت الاستعادة؛ أما النسخ الاحتياطية التي أُنشئت ببيانات اعتماد صريحة مختلفة للنسخة الاحتياطية الأساسية أو بوسيطات مصادقة إضافية للنسخة الأساسية، فمررها إلى RESTORE باستخدام إعداد base_backup. تظل النسخ الاحتياطية التي أنشأتها الإصدارات الأقدم ببيانات اعتماد مضمنة قابلة للاستعادة. #107357 (pamarcos).
  • إصلاح RESTORE لجداول ReplicatedMergeTree بحيث تُحفظ الأجزاء ذات المحتوى المكرر من النسخة الاحتياطية بدلاً من إزالة تكرارها بصمت. #107652 (pamarcos).
  • يشير عنصر نائب {_partition_id} في مسار محرك شبيه بالملفات (S3 أو AzureBlobStorage أو URL، إلخ) دون partition_strategy صريح إلى استراتيجية wildcard مجددًا، بغض النظر عن file_like_engine_default_partition_strategy. يعيد هذا التوافق مع الإصدارات السابقة لعبارات DDL السابقة للإصدار 26.6، التي بدأت تفشل بالخطأ BAD_ARGUMENTS (“لا يمكن استخدام استراتيجية التقسيم hive مع حرف بدل ‘_partition_id’ في المسار”). #111279 (fm4v).

إصلاحات ClickHouse Keeper

  • إصلاح تنظيف اللقطات في Keeper بعد فشل عمليات الكتابة، بحيث تُنظَّف اللقطات الجزئية بأمان ويمكن إعادة محاولة الكتابة دون تقديم latest_snapshot_meta. #105779 (antonio2368).
  • إصلاح حالات فشل Keeper أثناء لحاق العقدة التابعة، إذ كان يمكن أن تمتلئ قائمة انتظار استجابات موزّع الطلبات الجديد قبل بدء خيط الاستجابة. #106049.
  • إصلاح تعلّق Keeper أحيانًا عند بدء التشغيل عند ضبط الإعداد nuraft_max_log_gap_in_stream على قيمة غير افتراضية (القيمة الافتراضية هي 0، أي تعطيل تمرير طلبات append_entries عبر خط الأنابيب). #106220 (al13n321).
  • أصبح TLS الداخلي لـ Keeper Raft يراعي الآن الإعداد openSSL.client.verificationMode. سابقًا، كان التحقق من شهادة النظير مفعّلًا دائمًا لاتصالات Raft بين عقد Keeper بغض النظر عن هذا الإعداد، لذا كان يتم تجاهل none بصمت. الآن، يعطّل none صراحةً التحقق من شهادات نظراء Raft، بينما يحافظ غياب الإعداد على السلوك السابق الآمن افتراضيًا. ستتوقف التهيئات التي تضبط none صراحةً عن التحقق من شهادات نظراء Raft بعد الترقية، بما يتوافق مع الإعداد المقصود. #106726 (antonio2368).
  • إصلاح إعادة إنشاء جلسة ZooKeeper دون داعٍ عند إعادة تحميل التهيئة. #107096 (azat).
  • إصلاح خطأ في ClickHouse Keeper كانت فيه البيانات الوصفية للّقطة المُبلّغ عنها عبر last_snapshot (وzk_latest_snapshot_size في mntr) قد تتراجع بعد تثبيت لقطة قديمة أو مكررة، مما كان قد يسمح أيضًا للقطة محلية ذات الفهرس نفسه بالكتابة فوق ملف لقطة مسجّل في مكانه بينما كان لا يزال يُبث إلى نظير أو يُرفع إلى S3. #107321 (antonio2368).
  • إصلاح تعلّق عرض مادي قابل للتحديث إذا فُقد اتصال ZooKeeper في توقيت غير مناسب. #108234 (al13n321).
  • إصلاح الطفرات التي تستخدم معلمة استعلام كقسم (ALTER TABLE ... UPDATE/DELETE ... IN PARTITION {param:Type}): كانت قيمة القسم المستبدلة تُسلسَل ضمن إدخال الطفرة بصيغة لا يمكن تحليلها مجددًا، مما كان يعطل تحميل الجدول (بالنسبة إلى الجداول المنسوخة، على كل نسخة متماثلة). أصبحت أوامر الطفرات تُتحقق أيضًا من إمكانية تحليلها مجددًا قبل كتابتها إلى ZooKeeper أو القرص، بحيث يفشل استعلام ALTER عند حدوث عدم تطابق مشابه بدلًا من تعطيل الجدول. #111518 (al13n321).
  • إصلاح تجاوز عددي أثناء تحليل البيانات لـ system.zookeeper_info. #111629 (kssenii).

إصلاحات الأعطال وتحسينات الاستقرار

  • إصلاح استثناء NOT_FOUND_COLUMN_IN_BLOCK عند استخدام LIMIT BY مع أعمدة ثابتة بالتزامن مع DISTINCT وORDER BY في المحلل الجديد. #93195 (ashrithb).
  • تحسين استقرار اتصال HiveCatalog بإضافة آلية لإعادة المحاولة تلقائيًا ومنطق لإعادة الاتصال لمعالجة أخطاء TTransportException عند التواصل مع Hive Metastore. #98471 (otselnik).
  • إصلاح طيّ الثوابت أثناء التحليل للدوال ذات التقييم المختصر (if، multiIf، and، or، إلخ)، بحيث لم تعد الفروع التي يتعذر الوصول إليها بصورة ثابتة تثير استثناءات أثناء التحليل. على سبيل المثال، يعيد WITH 0 AS n SELECT multiIf(n = 0, 0, intDiv(100, n)) الآن 0 بشكل صحيح بدلًا من الفشل بسبب خطأ القسمة على صفر. #103157 (fastio).
  • إصلاح إنهاء الخادم عند استدعاء runningAccumulate على دالة تجميعية تعيد حالتها الخاصة. #105085 (antaljanosbenjamin).
  • إصلاح getServerSetting ليعيد القيمة السارية الفعلية لإعدادات الخادم القابلة للتغيير أثناء التشغيل (مثل max_server_memory_usage وmark_cache_size وmax_concurrent_queries وأحجام تجمعات الخيوط، إلخ)، بما يطابق ما يعرضه system.server_settings. #105172 (alexey-milovidov).
  • إصلاح استثناء NOT_FOUND_COLUMN_IN_BLOCK عند الجمع بين ORDER BY ... WITH FILL INTERPOLATE وLIMIT N BY مع تمكين المحلل. #105481 (yakov-olkhovskiy).
  • إصلاح استثناء في الخادم (خطأ منطقي Trying to execute PLACEHOLDER action) عند استخدام تعبير جدول شائع MATERIALIZED يتضمن استعلامًا فرعيًا مترابطًا بوصفه الطرف الأيمن من IN. ويُرفض هذا التعبير الآن أثناء التحليل، اتساقًا مع رفض النمط نفسه عند الإشارة إلى تعبير الجدول الشائع مباشرةً في FROM. #105518 (groeneai).
  • إصلاح عدم التقاط variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=false للاستثناءات أثناء تنفيذ الدالة. #105543 (Avogar).
  • إصلاح استثناء NOT_FOUND_COLUMN_IN_BLOCK عندما يشير تعبير TTL إلى عمود فرعي. #105578 (Avogar).
  • إصلاح تعطل للخادم قد يحدث عند إلغاء استعلام يقرأ من PostgreSQL — عبر دالة الجدول postgresql، أو محرك جدول PostgreSQL، أو قاموس بمصدر PostgreSQL — (مثلًا باستخدام KILL QUERY) وفشل إلغاء استعلام PostgreSQL البعيد. #105949 (rorylshanks).
  • إصلاح تعطل محتمل بسبب سلسلة حرفية كبيرة جدًا مُرسلة ضمن الاستعلام. #105996 (nickitat).
  • إصلاح استثناء INVALID_WITH_FILL_EXPRESSION عند استخدام INTERPOLATE () (فارغ) مع بادئة فرز في ORDER BY وتمكين use_with_fill_by_sorting_prefix. تُستبعد الآن أعمدة بادئة الفرز بشكل صحيح من مجموعة الاستيفاء الضمنية، بما يطابق سلوك INTERPOLATE (col) المحدد صراحةً. #106001 (yakov-olkhovskiy).
  • تُرفض الآن حالات AggregateFunction(uniqTheta, ...) غير الصالحة الواردة من إدخال RowBinary أو معاملات الاستعلام باستخدام CORRUPTED_DATA بدلًا من إنهاء الخادم. #106260 (groeneai).
  • إصلاح تعطل وخطأ محتمل NOT_FOUND_COLUMN_IN_BLOCK عند استخدام التحسين المستند إلى القيود (optimize_using_constraints) مع الاستعلامات الفرعية المترابطة. #106349 (Algunenano).
  • إصلاح استثناء NUMBER_OF_COLUMNS_DOESNT_MATCH عند الاستعلام عن جدول Distributed يحتوي على عمودين أو أكثر من نوع ALIAS تتوسع إلى التعبير نفسه (مثلًا عند تعريف كليهما كـ toString(x))، أو عند كتابة التعبير نفسه كمرجع لعمود ALIAS ومباشرةً في قائمة SELECT، مع عبارة ORDER BY. #106404 (yakov-olkhovskiy).
  • إصلاح خطأ LOGICAL_ERROR ‏“Trying to get name of not a column: ExpressionList” الذي تثيره الاستعلامات التي تمرر علامة النجمة داخل multiIf إلى وسيطة دالة جدول، مثل numbers(multiIf(*, ...), 2). يُرفض الآن المُطابِق غير القابل للحل باستخدام UNSUPPORTED_METHOD. #106647 (groeneai).
  • رفض أنماط glob غير السليمة لـ file التي قد تؤدي إلى تكرار غير محدود عند سرد الدليل. يُفرض الآن حد أقصى لعمق التكرار قدره 1000؛ وتُثير الاستعلامات التي تتجاوزه TOO_DEEP_RECURSION بدلًا من إيقاف الخادم بسبب تجاوز سعة المكدس. #106676 (groeneai).
  • إصلاح الاستثناء 'Trying to read from input() twice.' الذي يظهر عند تغليف دالة الجدول input في تعبير جدول شائع غير MATERIALIZED يُشار إليه من أكثر من موضع في الاستعلام. يُرفض الاستعلام الآن بخطأ واضح INVALID_USAGE_OF_INPUT في وقت التخطيط. يُعد input تدفقًا أحادي الاستخدام من العميل، ولا يمكن أن يستهلكه سوى مصدر واحد في خطة الاستعلام. #106682 (groeneai).
  • إصلاح الأعمدة غير المتسقة (التي تؤدي لاحقًا إلى LOGICAL_ERROR) عند حدوث استثناء (مثل MEMORY_LIMIT_EXCEEDED) أثناء التحليل. #106802 (azat).
  • إصلاح تعطل الخادم (SIGSEGV) عند قراءة بيانات Protobuf مقتطعة مع input_format_allow_errors_num > 0. #106905 (atsarevskiy).
  • إصلاح تعطل الخادم (إلغاء مرجع لمؤشر فارغ) عند تشغيل TRUNCATE أو DROP على جدول EmbeddedRocksDB تم تحرير مقبض RocksDB الخاص به، مثل جدول read_only أُفرغ دليل بياناته بواسطة TRUNCATE سابق. #106940 (groeneai).
  • إصلاح استثناء (std::length_error يُبلّغ عنه بوصفه LOGICAL_ERROR) عند القراءة من دالة جدول *Cluster مثل urlCluster مع إعداد max_streams_for_files_processing_in_cluster_functions كبير جدًا. أصبح عدد التدفقات محدودًا الآن بقيمة معقولة. #106946 (groeneai).
  • إصلاح إنهاء الخادم عند إلغاء استعلام موزع مباشرةً قبل إرساله إلى جزء. #106950 (groeneai).
  • أُصلح استثناء في الخادم (خطأ منطقي this->visited_views == right->visited_views) عند تنفيذ INSERT عندما تكتب طريقتا عرض مادي على جدول المصدر نفسه في جدول الهدف نفسه، بينما تقرأ طريقة عرض تابعة ذلك الجدول، مع تمكين materialized_views_squash_parallel_inserts. #107027 (groeneai).
  • أُصلح استثناء LOGICAL_ERROR عند الإدراج في جدول DeltaLake بأعمدة لا تطابق مخطط الكتابة الخاص به (مثل عمود Nested يُسطَّح إلى أعمدة فرعية، أو دالة جدول ذات مجموعة فرعية صريحة من الأعمدة). تفشل عمليات الإدراج هذه الآن بخطأ INCOMPATIBLE_COLUMNS ظاهر للمستخدم بدلاً من ذلك. #107058 (groeneai).
  • أُصلح LOGICAL_ERROR (“Table expression … data must be initialized”) الذي كان يظهر عندما يشير محدِّد النجمة المؤهَّل (مثل x.*) إلى تعبير جدول شائع تعاودي باسمه ضمن الجزء التعاودي الخاص به. توسِّع هذه المحددات الآن أعمدة الجدول التعاودي، تماماً كما يفعل عمود مؤهَّل (x.a) أو محدِّد غير مؤهَّل (*) في هذا الموضع. #107144 (groeneai).
  • أُصلح LOGICAL_ERROR (“Unexpected exception in refresh scheduling”) كان يمكن أن يُدخل الخادم في حلقة تعطل عند إعادة التشغيل عندما تحتوي طريقة عرض مادية قابلة للتحديث على تبعية REFRESH ... DEPENDS ON <name> يطابق اسمها غير المؤهَّل جدولاً مؤقتاً أو اسم تعبير جدول شائع. #107156 (groeneai).
  • أُصلح LOGICAL_ERROR (Variant N (T) has size X, but expected Y) عند تطبيق دالة مثل toString أو concat على عمود Variant أو Dynamic يحتوي على متغير واحد غير فارغ إلى جانب قيم NULL، بينما تُرجع الدالة عمود الإدخال دون تغيير. #107374 (groeneai).
  • أُصلح LOGICAL_ERROR (block.rows() == getRows()) الذي كان يظهر عند تنفيذ INSERT غير متزامن في جدول Alias مع تمكين use_strict_insert_block_limits. #107400 (groeneai).
  • أُصلح استثناء في الخادم (Logical error: Not-ready Set is passed as the second argument for function 'in') عندما احتوى تعبير مفتاح (ORDER BY أو PRIMARY KEY أو PARTITION BY أو INDEX للتخطي) على عامل التشغيل IN مع جدول في الطرف الأيمن، مثل ORDER BY (x IN some_table). تُرفض تعبيرات المفاتيح هذه الآن عند إنشاء الجدول. #107424 (groeneai).
  • أُصلح تعطل نادر للخادم أثناء معالجة DISTINCT كان يمكن أن يحدث عند فشل تخصيص الذاكرة (مثل بلوغ حد الذاكرة) أثناء تهيئة مجموعة المفاتيح المميزة. #107467 (groeneai).
  • أُصلحت عمليات DeltaLake التي كانت تفشل بعد انتهاء صلاحية بيانات اعتماد S3 المؤقتة، وذلك بتحديث بيانات الاعتماد المخزنة مؤقتاً قبل العملية التالية. كما تُحدَّث بيانات اعتماد STS لتولي الدور بعد فشل المصادقة. #107480 (ahmadov).
  • أُصلح الخطأ Not-ready Set is passed as the second argument for function 'in' (LOGICAL_ERROR) عند الاستعلام عن جدول بمفتاح PARTITION BY واستعلام فرعي IN/NOT IN مُغلَّف داخل تعبير أكبر، مثل WHERE (c0 IN (SELECT ...)) != 0. #107515 (groeneai).
  • إصلاح تعطل (إلغاء الإشارة إلى مؤشر فارغ) قد يحدث عند تنفيذ خطة استعلام موزّع محليًا (make_distributed_plan + distributed_plan_execute_locally) مع log_formatted_queries = 1. #107570 (groeneai).
  • إصلاح تعطل الخادم عند قراءة عرض مادي يكون هدفه جدول Distributed أثناء تشغيل الاستعلام مع enable_analyzer = 0. #107653 (groeneai).
  • إصلاح تعطل الخادم (SIGSEGV) عند قراءة بيانات Protobuf مع input_format_allow_errors_num > 0، عندما تسبق رسالة صالحة رسالةً تالفة قابلة للتخطي ضمن الكتلة نفسها. #107739 (atsarevskiy).
  • إصلاح تعليق دوال الجدول odbc وjdbc لعدة دقائق وتجاهلها إلغاء الاستعلام (KILL QUERY، max_execution_time) عندما يصبح الجسر غير مستجيب أثناء استنتاج بنية الجدول البعيد. #107809 (alexey-milovidov).
  • إصلاح تعطل محتمل (إلغاء الإشارة إلى مؤشر فارغ) عندما لا يكون تجاوز database/db في مجموعة مسماة مُمرَّرة إلى remote()/remoteSecure() اسم قاعدة بيانات ثابتًا، مثل remote(nc, database = (SELECT 1)). يفشل الاستعلام الآن برسالة خطأ واضحة بدلًا من التعطل. #108271 (groeneai).
  • تُرجع استعلامات البحث المتجهي التي تنفذ SELECT على العمود _distance الآن خطأً مناسبًا بدلًا من الفشل مع LOGICAL_ERROR. #108423 (rschu1ze).
  • إصلاح تعطل محتمل (تجاوز سعة المخزن المؤقت في الكومة) عند استخدام عمود حالة دالة تجميع من عائلة quantileTDigest كمفتاح GROUP BY وتسلسله بالتزامن من عدة خيوط. #110263 (groeneai).
  • إصلاح الاستبعاد غير الصحيح الناتج عن تحليل فهرس المفتاح الأساسي في الجداول ذات مفتاح فرز عكسي (تنازلي) (ORDER BY (g, r DESC)). إذ كان يمكن استبعاد حبيبة تمتد عبر تغيير في عمود مفتاح رئيسي يليه عمود مفتاح تنازلي بصورة غير صحيحة، ما يؤدي إلى إسقاط صفوف مطابقة. #111059 (nihalzp).
  • إصلاح خطأ منطقي block.rows() == getRows() (قراءة خارج الحدود وتعطل إزالة تكرار الإدراج في إصدارات الإنتاج) عندما يمر INSERT عبر عرض مادي تابع يكون هدفه Alias ويغيّر استعلامه الداخلي عدد الصفوف، مع وجود جدول يدعم إزالة التكرار يمكن الوصول إليه بعد الاسم المستعار. #111103 (alexey-milovidov).
  • إصلاح خطأ تجزئة ناتج عن وصول إلى ذاكرة خارج الحدود عند إلغاء تسلسل حالة دالة تجميع تالفة تحتوي على قيمة String. ويجري الآن التحقق من هذه الحالات ورفضها بدلًا من أن تؤدي إلى أخطاء تجزئة. #111606 (mstetsyuk).
  • إصلاح تعطل عند قراءة ملف Parquet يحتوي على بيانات وصفية غير متسقة لمرشح بلوم. وكان يمكن لهذه الملفات أيضًا أن تُرجع بصمت عددًا من الصفوف أقل مما ينبغي. #112498 (tiandiwonder).
  • يُصلح خطأ segfault وفسادًا صامتًا للبيانات عند إلحاق INSERT إلى محرك File أو دالة الجدول file بملف غير فارغ بتنسيق لا يدعم الإلحاق، مثل Avro. كانت الكتابة عبر واصف ملف أو مسار مُقسَّم تتجاوز الفحص الحالي، مما يؤدي إلى حذف بادئة التنسيق وكتابة رأس ثانٍ بعد البايتات الموجودة، فيصبح الملف غير قابل للقراءة. يُرفض الآن INSERT من هذا النوع بالخطأ CANNOT_APPEND_TO_FILE، كما هو الحال بالفعل عند استخدام مسار عادي. #112839 (groeneai).
  • يُصلح تعليق DROP TABLE وSYSTEM STOP VIEW عندما تكون طريقة العرض المادية القابلة للتحديث محظورة أثناء تخطيط استعلام تحديثها. #113188 (evillique).
  • أُصلح إنهاء نادر للخادم عندما كانت إدخالات قائمة انتظار الإدراج غير المتزامن ذات مواعيد نهائية متطابقة. #113363 (mstetsyuk).
  • أُصلح فساد في ذاكرة الكومة عند قراءة Parquet عبر صيغة إدخال تملك مخزن القراءة المؤقت الخاص بها، مثل قاموس يحتوي على SOURCE(FILE(... format 'Parquet')). كان يمكن لمهام الجلب المسبق وفك الترميز في الخلفية متابعة القراءة والكتابة عبر المخزن المؤقت بعد أن حرره خط الأنابيب، مما قد يؤدي إلى إنهاء الخادم. #114668 (groeneai).
  • أُصلح تعليق عند حذف جدول TimeSeries يكون اسمه مرتبًا معجميًا قبل أسماء جداولِه الداخلية، مثل جدول باسم -ts، أو عند حذف طريقة عرض مادية معلنة باستخدام ENGINE = TimeSeries. كان الحذف يتسبب في تعطل ذاتي بسبب قفل حماية DDL، ولم يكن بالإمكان إلغاؤه باستخدام KILL QUERY. #114953 (groeneai).

إصلاحات أخرى للأخطاء

  • تدعم الدوال like وilike وnotLike وnotILike وmatch الآن سلسلة البحث الثابتة مع نمط غير ثابت (مثل 'foo' LIKE pattern_column)، بعد أن كان ذلك يؤدي سابقًا إلى ظهور ILLEGAL_COLUMN. #100479 (Onyx2406).
  • إصلاح الخطأ NOT_FOUND_COLUMN_IN_BLOCK عند الاختيار من VIEW فوق جدول يحتوي على إسقاط عادي. #101218 (amosbird).
  • رفض قيم Float64 السالبة (مثل -100.5) في إعدادات عبء العمل، مثل max_bytes_per_second وmax_cpus وغيرها. سابقًا، كان التحقق يقتصر على الأعداد الصحيحة السالبة، مما سمح للقيم العشرية السالبة بإنشاء عقد مجدول معطلة بصمت. #101842 (groeneai).
  • تستجيب عمليات القراءة من تخزين الكائنات الآن بسرعة لإلغاء الاستعلام. #103016 (SmitaRKulkarni).
  • إصلاح تجاهل input_format_max_block_size_bytes بصمت أثناء تحليل INSERT عندما تكون قيمة max_insert_block_size_bytes هي 0 (القيمة الافتراضية). يحد الإعداد الآن بشكل صحيح من حجم الكتل التي تنتجها تنسيقات إدخال الصفوف. #103068 (Fgrtue).
  • إصلاح إنتاج ClickHouse أحيانًا لرموز GSSAPI غير صالحة بسبب إزالة غير صحيحة لبايتات null اللاحقة. #103114 (EmeraldShift).
  • يوسّع EXPLAIN SYNTAX العروض ذات المعلمات. #103263 (jrdi).
  • إصلاح تلف البيانات عند كتابة Parquet (والتنسيقات الأخرى ذات التذييل، مثل ORC وArrow) إلى HDFS عبر INSERT INTO FUNCTION hdfs(...). منذ الإصدار 26.1، لم يكن WriteBufferFromHDFS يفرغ المخزن المؤقت العامل عند finalize()، لذلك كانت تُفقد بصمت آخر بايتات كل ملف، حتى DBMS_DEFAULT_BUFFER_SIZE بايت، بما في ذلك تذييل Parquet PAR1. وكانت قراءة هذه الملفات تُرجع Not a Parquet file (wrong magic bytes at the end of file). #103268 (groeneai).
  • إصلاح النتائج الخاطئة واحتمال حدوث خطأ منطقي في الاستعلامات الفرعية المترابطة عند تعيين حد لحجم join (max_rows_in_join / max_bytes_in_join) مع join_overflow_mode = 'break'. يتجاهل join الذي يُنشأ داخليًا لتقييم استعلام فرعي مترابط الآن حدود المستخدم هذه، لذلك لم يعد بإمكانه التوقف مبكرًا وإسقاط الصفوف. #103322 (groeneai).
  • إصلاح النتائج الخاطئة أو عدم استخدام الإسقاط عندما يحتوي إسقاط تجميعي على عدة تجميعات sumIf بشروط IN (...) مختلفة. #104765 (Ergus).
  • إصلاح إرجاع deltaSumTimestamp لنتائج خاطئة لأنواع الأعداد الصحيحة الموقعة عند عبورها الصفر. #104830 (thevar1able).
  • إصلاح الخطأ Logical error: 'Metadata is not initialized' الذي يظهر عند تنفيذ DELETE FROM على جدول Iceberg أو DeltaLake أو Hudi مرفق حديثًا وملف البيانات الوصفية الخاص به تالف أو يتعذر تحميله. يُبلّغ عن استثناء عادي ظاهر للمستخدم بدلًا من ذلك، ويستمر الخادم في العمل. #104917 (groeneai).
  • أصبحت استعلامات ATTACH TABLE name <clauses>; التي تتضمن عبارات تخزين (ORDER BY أو PARTITION BY أو PRIMARY KEY أو SAMPLE BY أو TTL أو UNIQUE KEY أو SETTINGS الخاصة بالمحرك) من دون ENGINE تُصدر الآن الخطأ BAD_ARGUMENTS بدلًا من إعادة إرفاق الجدول بصمت باستخدام تعريفه المخزن وتجاهل العبارات التي يحددها المستخدم. ولا تزال SETTINGS على مستوى جلسة الاستعلام (مثل log_comment) تُطبَّق. استخدم ATTACH TABLE t; لإعادة الإرفاق باستخدام البيانات الوصفية المخزنة، أو استخدم ALTER TABLE t MODIFY SETTING ... بعد ATTACH لتغيير الإعدادات. #105068 (groeneai).
  • أُصلح تجاوز سعة المخزن المؤقت في الكومة عند قراءة ملفات Arrow أو ArrowStream التي تحتوي على إزاحات وسيطة تالفة في عمود ثنائي أو نصي، وكذلك إلغاء مرجعية مؤشر فارغ عند قراءة أعمدة Arrow الموسومة جغرافيًا. #105449 (Algunenano).
  • أُصلح توقف الخادم عند قراءة الأعمدة الفرعية Dynamic من جدول Memory مضغوط بعد ALTER. #105464 (Avogar).
  • تضمين skip_first_lines في مفتاح ذاكرة التخزين المؤقت للمخطط لتنسيقات WithNames. #105469 (Avogar).
  • إصلاح إنتاج histogram لنتائج غير صحيحة عند استخدام مدخلات صغيرة غير مرتبة. #105548 (Avogar).
  • إصلاح استخدام جدول الإدراج في دوال الجداول عند تفعيل optimize_trivial_insert_select. #105555 (Avogar).
  • إصلاح فقدان الدالة الإطارية estimateCompressionRatio للبيانات المتراكمة بين الصفوف. #105581 (Avogar).
  • أصبح استخراج قيم أقسام Hive يراعي الآن الإعداد cast_string_to_date_time_mode، ويقبل افتراضيًا الطوابع الزمنية بتنسيق ISO 8601 ذات لواحق المنطقة الزمنية (مثل +0000 و+00:00 وZ) في مفاتيح التقسيم. #105584 (alexey-milovidov).
  • إصلاح استرداد الأخطاء في تنسيق الإدخال Template بعد الصفوف غير الصحيحة. #105735 (niyue).
  • إصلاح تنسيق SYSTEM INSTRUMENT ADD بحيث تفصل مسافة واحدة بين وسيطات المعالج، ورفض قوائم وسيطات instrumentation غير الصالحة لـ SLEEP التي تحتوي على أكثر من قيمتين أو على نطاق يكون حده الأدنى أكبر من حده الأقصى. #105984 (pamarcos).
  • إصلاح فشل عمليات أقسام ALTER TABLE بصمت عند استخدام مفاتيح تقسيم من نوع Bool. #106004 (Avogar).
  • إصلاح JSONExtractRaw وJSONHas لمسارات JSON محددة النوع ذات قيم افتراضية. #106005 (Avogar).
  • أُصلحت بادئة / غير الصحيحة لمسارات الأساس الفارغة في تهيئات بحيرة البيانات. #106013 (thewisenerd).
  • إصلاح إرجاع system.dictionaries لصفر من الصفوف عند وجود إلغاء جزئي لصلاحية SHOW DICTIONARIES. #106105 (Avogar).
  • إصلاح النتائج غير الصحيحة للاستعلامات على الجداول التي يحتوي ORDER BY فيها على دالة رتيبة تناقصية مثل (c0 / -42) أو intDiv(c0, -42). كان من الممكن أن تؤدي الشروط على العمود الأساسي (مثل c0 < 0) إلى استبعاد حبيبات تحتوي على صفوف مطابقة بالخطأ، ما يؤدي إلى فقدان نتائج. #106136 (nihalzp).
  • أُضيف التحقق من حالات التجميع DDSketch غير الصالحة أثناء الإدراج. #106236 (yariks5s).
  • إصلاح اتساق ذاكرة التخزين المؤقت لنظام الملفات بعد عمليات التخفيض الفاشلة لـ SLRU، لمنع بقاء الإدخالات عالقة في حالة إخلاء. كما أُصلح تغيير حجم ذاكرة التخزين المؤقت المنقسمة System/Data وتنظيف المساحة الحرة، بحيث تُحدَّث الحدود ذرّيًا ويمكن استعادة المساحة من كلا مقطعي ذاكرة التخزين المؤقت. #106286 (kssenii).
  • إصلاح تحويل غير صحيح لقيم Float16 دون العادية إلى Float32 (مثلًا عند قراءتها من ملفات Numpy .npy) بسبب إزاحة المانتيسا بمقدار واحد. #106343 (jh0x).
  • إصلاح regexpExtract(haystack, pattern) بحيث تُرجع الأنماط التي لا تحتوي على مجموعة التقاط التطابق كاملًا بدلًا من إصدار INDEX_OF_POSITIONAL_ARGUMENT_IS_OUT_OF_RANGE. #106374 (groeneai).
  • إصلاح خطأ منطقي عند إنشاء قاموس مضلعات من بيانات مصدر تحتوي على إحداثيات نقاط NaN أو لا نهائية. تُرفض هذه الإحداثيات الآن برسالة خطأ واضحة. #106423 (alexey-milovidov).
  • يمكن لقواميس HTTP الآن تحديد رؤوس الطلبات عبر المجموعات المسماة. #106459 (ZelvaMan).
  • يجري الآن التحقق من قيم التعداد Avro غير الصالحة ورفضها باستثناء، بدلًا من أن تتسبب في قراءة ذاكرة خارج الحدود وإنهاء الخادم. #106476 (mstetsyuk).
  • إصلاح عدم مراعاة LIMIT WITH TIES وLIMIT WITH TIES الكسري لقواعد المقارنة من ORDER BY ... COLLATE عند تحديد التعادلات. كانت الصفوف المتساوية وفقًا لقواعد المقارنة (مثل '1' و'01' ضمن ترتيب رقمي) تُقارن بايتًا ببايت، لذا حُذفت بعض الصفوف المتعادلة من النتيجة بالخطأ. #106539 (nihalzp).
  • إصلاح تحسينات DISTINCT بالترتيب وLIMIT BY بالترتيب (بما في ذلك LIMIT BY السالب) التي كانت تُرجع نتائج خاطئة عندما يكون الإدخال مرتبًا وفق قواعد مقارنة (ORDER BY ... COLLATE). تُرتب الصفوف المتساوية وفقًا لقواعد المقارنة (مثل 'a' و'A' ضمن ترتيب غير حساس لحالة الأحرف) بحسب مفتاح المقارنة، ولا تكون متجاورة بحسب القيمة؛ لذلك يُتخطى الآن التحسين بالترتيب عند استخدام مُقارِن. #106564 (nihalzp).
  • إصلاح حالة سباق أثناء إيقاف مستهلك NATS، كان من الممكن أن تؤدي إلى إنهاء الخادم. #106692 (mstetsyuk).
  • إصلاح عدة مشكلات تتعلق بأمان الذاكرة واستنفاد الموارد في قارئات التنسيقات التي يمكن الوصول إليها عبر إدخال غير موثوق: قراءة خارج حدود الكومة في معالجة طول مستويات التعريف/التكرار لـ DataPageV2 في قارئ Parquet الأصلي، وتجاوز سعة المكدس في ملفات Parquet ذات المخططات المتداخلة بعمق، وعمليات تخصيص تتجاهل max_memory_usage عند تحليل هندسة GeoParquet بتنسيق WKB/WKT وسلاسل/بايتات Avro. #106739 (Algunenano).
  • تم إصلاح قيام keeper_server.http_control.secure_port بإرسال استجابات HTTP بنص عادي إلى عملاء HTTPS. وأصبح المنفذ الآمن يقدّم HTTPS بشكل صحيح. #106822 (linjiayu1025-collab).
  • تم إصلاح إصدار SHOW CREATE ROW POLICY للقيمتين restrictive/permissive بأحرف صغيرة بدلًا من الأحرف الكبيرة، على نحو لا يتسق مع الكلمات المفتاحية الأخرى. #106865 (valerypetrov).
  • تم إصلاح وضع علامة «تالف» على الأجزاء وفصلها عند أي إعادة تحميل للجزء (إعادة تشغيل الخادم، أو DETACH، أو ATTACH) في الجداول التي تحتوي على عمود LowCardinality(Nullable(...)) ضمن مفتاح التقسيم. منذ الإصدار 26.5، لم يكن ملف فهرس minmax الخاص بكل جزء يُكتب عندما كانت القيمتان الدنيا والعظمى لهذا العمود هما NULL، بينما كان فحص اتساق الجزء لا يزال يتطلب وجود الملف. تفتقر الأجزاء التي أنشأتها الإصدارات المتأثرة إلى ملف فهرس minmax، ولا تزال بحاجة إلى إعادة إرفاقها يدويًا. #106945 (PedroTadim).
  • تم إصلاح كون elapsed_us يساوي صفرًا دائمًا، واحتساب read_rows/read_bytes بأقل من قيمتهما الفعلية، في system.processors_profile_log وsystem.query_log لاستعلامات تفريغ الإدراج غير المتزامن (AsyncInsertFlush). #106982 (cwurm).
  • تم إصلاح خطأ منطقي Block structure mismatch in UnionStep stream (توقف الخادم في إصدارات التصحيح/المعقّم، وظهور Code: 49 في إصدارات الإنتاج) كان يحدث عندما يقرأ أحد فروع UNION/INTERSECT/EXCEPT عمودًا مُسلسلًا بـSparse، بينما يقرأ الفرع الآخر العمود نفسه كاملًا (مثلًا عند الدفع إلى عرض مادي). #107041 (groeneai).
  • تم إصلاح ترتيب الصفوف غير الصحيح في استعلامات ORDER BY على UNION ALL عند تمكين optimize_read_in_order وread_in_order_use_virtual_row. #107053 (vdimir).
  • تم إصلاح خطأ في البنية عند اتباع SHOW ROW POLICIES أو SHOW MASKING POLICIES ببند FORMAT أو SETTINGS أو INTO OUTFILE (مثلًا SHOW ROW POLICIES FORMAT TabSeparated). #107061 (groeneai).
  • تم إصلاح قيام trimLeft وtrimRight وtrimBoth (والأسماء المستعارة ltrim وrtrim وtrim) بإلقاء TOO_LARGE_STRING_SIZE عندما تكون مجموعة محارف الإزالة المخصصة أطول من 16 محرفًا. وأصبحت مجموعات الإزالة بأي طول مدعومة مجددًا. #107071 (fm4v).
  • تم إصلاح تجاوز في الأعداد الصحيحة الموقعة في quantileExactExclusive وquantilesExactExclusive وquantileExactInclusive وquantilesExactInclusive كان يمكن أن ينتج عنه نتائج خاطئة لمدخلات Int64 التي تمتد على نطاق واسع. #107154 (groeneai).
  • لم تعد عمليات إعادة تحميل الإعدادات تعيد تشغيل نصوص البدء، مما يمنع إعادة تنفيذ إجراءات البدء التي تُنفَّذ مرة واحدة. #107187 (mstetsyuk).
  • تم إصلاح ترتيب النتائج غير الصحيح لـORDER BY على UNION ALL عند تمكين optimize_read_in_order، عندما كان خط أنابيب الاتحاد يُقلَّص بسبب إعدادات max_streams_for_union_step؛ إذ يُتخطى هذا التقليص الآن عندما تعتمد الخطة على تدفقات إخراج UNION المرتبة. #107208 (vdimir).
  • تم إصلاح احتمال إلغاء مرجع مؤشر فارغ أثناء تحليل إعدادات الوكيل خلال المراحل المتأخرة من إيقاف الخادم. #107231 (PedroTadim).
  • إصلاح مشكلة في ORDER BY ... WITH FILL كانت تؤدي إلى إنشاء صفوف إضافية عندما يستخدم عمود ORDER BY الذي يسبق عمود التعبئة ترتيبًا COLLATE. تُجمَّع الصفوف الآن حسب بادئة الفرز باستخدام ذلك الترتيب، بما يتوافق مع ترتيب الفرز. #107365 (groeneai).
  • إصلاح سلوك غير معرّف عند تمرير قيمة فاصلة عائمة غير منتهية (مثل nan أو inf) بوصفها وسيطة الطابع الزمني أو المدة لدالتي الجدول prometheusQuery / prometheusQueryRange. تؤدي هذه الوسيطة الآن إلى ظهور BAD_ARGUMENTS بدلًا من إنتاج طابع زمني غير صالح. #107417 (groeneai).
  • إصلاح النتائج غير الصحيحة الناتجة عن التحسين optimize_rewrite_aggregate_function_with_if للدوال التجميعية التي تحافظ على قيم حمولة NULL (عائلة *_respect_nulls: anyRespectNulls وfirst_value_respect_nulls وanyLast_respect_nulls وlast_value_respect_nulls). لم يعد التحسين يعيد كتابة f(if(cond, x, NULL)) إلى صيغة -If لهذه الدوال. #107430 (groeneai).
  • إضافة تحقق من الحدود غير الصحيحة في إدخال ORC. #107580 (al13n321).
  • إصلاح ثغرة رفض خدمة غير موثَّقة بسبب استنفاد الذاكرة على منفذ بروتوكول MySQL. #107599 (tiandiwonder).
  • إصلاح مشكلة كانت تجعل واجهة MySQL غير قابلة للاستخدام مع MySQL Connector/J 8.2.0 والإصدارات الأحدث، بما فيها 9.x. أصبح حقل info في حزمة OK الآن مرمّزًا بالطول، بما يتوافق مع خادم MySQL، بحيث يتمكن برنامج تشغيل JDBC من الاتصال. #107693 (alexey-milovidov).
  • إصلاح الخطأ المنطقي Block structure mismatch in UnionStep stream (توقف الخادم في إصدارات debug/sanitizer، وCode: 49 في إصدارات الإصدار) الذي كان يحدث عندما تختلف الفروع الشقيقة لـUNION/INTERSECT/EXCEPT فقط في مسند WHERE، وكان مسند أحد الفروع يُطوى إلى ثابت في عمود Const. #107719 (groeneai).
  • لم تعد قراءة بيانات Arrow وArrowStream ذات أعمدة String أو Binary فارغة، والتي ينتجها Apache Arrow Java قبل الإصدار 19.0.0، بما في ذلك Apache Spark، تؤدي إلى ظهور INCORRECT_DATA. #107764 (Algunenano).
  • أصبحت كتل Native غير الصحيحة التي يشير فيها مميّز Variant إلى متغير غير موجود تُرفض بأمان. #107991 (uwezkhan).
  • إصلاح تراجع في الأداء عند قراءة أعمدة Dynamic باستخدام عدة خيوط. #107997 (Avogar).
  • أصبح إعداد data lake المتقادم storage_catalog_url يُرفض الآن بشكل صحيح بواسطة حارس الكتالوج (إذ كان يُتحقق سابقًا من storage_catalog_type وstorage_aws_access_key_id فقط)، وتسرد رسالة الخطأ جميع الإعدادات المتقادمة. #108040 (alexey-milovidov).
  • إصلاح مشكلة رفض دالة/محرك الجدول ArrowFlight لمجموعة مسماة لا تتضمن المفتاح الاختياري dataset، مع ظهور الخطأ No such key 'dataset'. #108041 (alexey-milovidov).
  • أصبحت الأسرار وبيانات الاعتماد الآن محجوبة في system.query_views_log.view_query بدلاً من كشفها في SQL للعرض المسجّل. #108214 (Fidelaggio).
  • إصلاح عدم عمل type_json_allow_duplicated_key_with_literal_and_nested_object مع المسارات المحددة النوع في JSON. #108218 (Avogar).
  • إصلاح سلوك غير معرّف (تمرير مؤشر فارغ إلى memcpy) في الدالتين detectCharset وdetectLanguageUnknown عندما تتجاوز سلسلة الإدخال 32768 بايت ولا يمكن اكتشاف أي مجموعة محارف. #108250 (groeneai).
  • إصلاح الخطأ NOT_FOUND_COLUMN_IN_BLOCK في الاستعلامات التي تستخدم الأعمدة الافتراضية _part_starting_offset/_part_offset في WHERE مع التجسيد المؤجل. #108287 (vdimir).
  • إخفاء الوسائط السرية للدوال مثل encrypt وdecrypt وHMAC في مخرجات EXPLAIN actions وEXPLAIN header وEXPLAIN PIPELINE عند تعطيل format_display_secrets_in_show_and_select (وهو الإعداد الافتراضي). #108386 (Algunenano).
  • ينجح CREATE OR REPLACE الآن لعرض مادي قابل للتحديث عندما يكون هدفه في TO مملوكاً بالفعل للعرض نفسه. وتظل الأهداف المملوكة لعرض آخر مرفوضة. #108392 (evillique).
  • قُيّد مسار نموذج catboostEvaluate بدليل user_files، على غرار file() ومصادر القواميس. في السابق، كانت الدالة تقبل مساراً عشوائياً في نظام الملفات دون التحقق من بقائه ضمن الدليل، مما أتاح التحقق من وجود ملفات خارج user_files وتحفيز قراءتها. ويجب الآن أن توجد النماذج داخل user_files. #108463 (groeneai).
  • إصلاح مشكلة كانت تجعل CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE يترك العرض الجديد غير مرتبط بجدول المصدر، مما كان يؤدي بصمت إلى إسقاط كل صف يُدرج بعد الاستبدال. #108728 (alexey-milovidov).
  • إصلاح خطأ تجزئة عند دمج حالات التجميع uniqExact مع GROUPING SETS أو ROLLUP أو CUBE وmax_threads > 1. #108928 (Algunenano).
  • إصلاح خطأ منطقي محتمل “تدفق فرعي غير متوقع … للعمود …” أثناء رفع إعداد التوافق. #109496 (Avogar).
  • تتعامل الدالة getClientHTTPHeader الآن مع أسماء الترويسات بوصفها غير حساسة لحالة الأحرف، وفقاً لـRFC 9110؛ وبالتحديد، تُرشّح ترويسة authorization الآن بغض النظر عن حالة الأحرف. #109791 (Felixoid).
  • إصلاح فقدان صامت للبيانات مع عمليات الإدراج غير المتزامنة وإزالة التكرار (async_insert=1, async_insert_deduplicate=1). عندما كانت عدة إدخالات async-insert ذات قيم مميزة لـinsert_deduplication_token تُدمج في عملية flush واحدة تكتب إلى أقسام منفصلة، كان كل رمز يُسجّل في سجل إزالة التكرار لكل قسم لمسته عملية flush، وليس فقط القسم الذي وصلت إليه صفوفه. ثم كانت عملية إدراج لاحقة تعيد استخدام أحد هذه الرموز في قسم لم تُكتب فيه أي صفوف بهذا الرمز تُزال كتكرار بصمت. تُسجّل الرموز الآن فقط للقسم الذي وصلت إليه صفوفها فعلياً. #111049 (groeneai).
  • تم إصلاح عمليات الإدراج غير المتزامنة بتنسيق Native، بحيث لم يعد إدخال واحد مخزّن مؤقتًا يصبح غير متوافق بعد ALTER ... MODIFY COLUMN يتسبب في فشل الدفعة بأكملها. #111108 (Felixoid).
  • تم إصلاح مشكلة CREATE OR REPLACE لقاموس باستخدام كائن من نوع آخر، إذ كان يفشل بالخطأ CANNOT_DETACH_DICTIONARY_AS_TABLE بعد تثبيت الاستبدال، تاركًا جدول _tmp_replace_* يتيمًا. #111142 (evillique).
  • تم إصلاح تسرّب في ذاكرة شهادة النظير أثناء مصافحات TLS مع تفعيل التحقق من الشهادات. #111425 (thevar1able).
  • تم إصلاح خطأ منطقي Block structure mismatch in IntersectOrExceptStep stream: different number of columns قد يحدث عند تشغيل تحسين تقسيم عامل التصفية (query_plan_split_filter) على عبارة WHERE يكون فيها اسم عمود عامل التصفية هو نفسه اسم عمود إدخال. كان التحسين يترك العمود الداخلي __split_filter في ترويسة مخرجات الفرع، فتختلف عن ترويسة الفرع الشقيق في عملية مجموعات مثل INTERSECT أو UNION. #111930 (groeneai).
  • تم إصلاح النتائج غير الصحيحة لعوامل التصفية أو تعبيرات ORDER BY التي تستخدم toString مع قيم Time أو Time64 أو DateTime في المناطق الزمنية التي تطبق التوقيت الصيفي. كما استُعيد تحسين القراءة بالترتيب لـ ORDER BY على بادئة من مفتاح فرز الجدول، وللتحويلات من String إلى Nullable(String). #113291 (vdimir).
  • تم إصلاح ATTACH لجدول Kafka عندما يتجاوز kafka_num_consumers الحد المستمد من عدد أنوية CPU. #113390 (evillique).
  • تم تعطيل تحليل الفهرس الموزع عند استخدام الإسقاطات لمنع نتائج الاستعلامات غير الصحيحة. #115132 (azat).
  • تم إصلاح خطأ في الدالة formatRowNoNewline قد يؤدي إلى نتائج غير صحيحة أو خطأ منطقي عند تنسيق صف إلى نتيجة فارغة. #115669 (alexey-milovidov).
  • لم تعد نتيجة قيمة حرفية لسلسلة ثنائية لا يكون طولها مضاعفًا للثمانية، أو مفكك ضغط LZ4 عند عدم احتواء كتلة مضغوطة على جسم، تُرجع ذاكرة غير مهيأة. #115704 (alexey-milovidov).
  • تم تضمين مسارات الكائنات في تجزئات إزالة التكرار لمنع إزالة تكرار قيم الكائنات المختلفة بشكل غير صحيح. #115866 (Felixoid).
آخر تعديل في ٢٦ سبتمبر ٢٠٢٦