mergedJSONPatch
أُضيف في: v26.8.0 تُجمِّع قيم JSON عبر دمجها وفق دلالات «الكتابة الأخيرة هي الغالبة» (last-write-wins)، وبذلك تُطبّق سلوك الدمج الأساسي لمعيار RFC 7396 JSON Merge Patch على مستوى المسار. تخزّن الدالة التجميعية الحالة على شكل ثلاثيات (key, value, sorting_key)، بحيث لا يحتفظ كل مفتاح (مسار JSON) إلا بأحدث سجل فعّال وفقًا لـ sorting_key. تُسطَّح عمليات كتابة الكائنات إلى مسارات فرعية متى كان النوعJSON يخزّن تلك المسارات كأوراق مفردة ديناميكية. أما عمليات الكتابة غير الكائنية على المسارات الأصل،
فتحجب المسارات الفرعية المتعارضة معها.
يُعامَل كل مسار ذي نوع مُصرَّح به صراحةً (مُعرَّف باستخدام JSON(a Map(...)) أو JSON(a Tuple(...)) أو
JSON(a Variant(...)) أو JSON(a Dynamic) وغيرها) على أنه قيمة ذرّية: إذ تُستبدَل قيمة المسار بأكملها بالتصحيح الأحدث بدلاً من دمجها دمجاً عميقاً. ولا تخضع لدلالات الدمج العميق وفق RFC 7396
إلا المسارات المفردة غير محددة النوع (الديناميكية).
يحدّد sort_key القيمة المعتمدة لكل مسار JSON، إذ يُحتفظ بالصف الذي يحمل أكبر قيمة لـ sort_key. وإذا تساوت مفاتيح الفرز لتصحيحين متعارضين، فإن النتيجة تتوقف على ترتيب المعالجة: إذ يُرجَّح التصحيح
الذي يُعالَج لاحقًا عند التعادل. ولا ينبغي للمستخدمين الاعتماد على ORDER BY لحسم حالات التعادل بشكل حتمي.
القيود (موروثة من ColumnObject):
-
حذف القيم الفارغة: لا يؤدي التصحيح
{"key": null}إلى إزالة المفتاح، إذ يحذفColumnObjectالأعضاء ذات القيم الفارغة عند الإدراج، ولذلك لا تستطيع الدالة التمييز بين “المفتاح غير موجود” و “قيمة المفتاح null”. -
الاستبدال بكائن فارغ: لا يمكن للتصحيح
{"a": {}}أن يحل محل قيمة مفردة أو مصفوفة أقدم في المسارa، إذ يحذفColumnObjectدون أي تنبيه المسارات التي تكون قيمتها كائنًا فارغًا{}، فلا يكون للتصحيح الأحدث أي أثر وتبقى القيمة القديمة كما هي. -
غياب المسار محدد النوع من نوع غير Nullable: عندما يُعرّف عمود
JSONمسارًا محدد النوع بنوع لا يقبل قيم NULL (مثلJSON(a UInt32))، يُخزَّن الصف الذي يُغفلaبالقيمة الافتراضية للنوع (مثل0). ولا تستطيع دالة التجميع التمييز بين “غير موجود” و”مكتوب صراحةً بالقيمة الافتراضية”، لذا فإن التصحيح الأحدث الذي يُغفلaيمحو دون أي تنبيه قيمة أقدم غير صفرية. ولتجنب ذلك، عرّف المسارات محددة النوع بالنوعNullable(مثلJSON(a Nullable(UInt32)))، إذ تُعامَل القيمة null في مسار محدد النوع يقبل قيم NULL على أنها “المسار غير موجود” ويجري تخطيها على النحو الصحيح. -
جميع المسارات محددة النوع ذرية: يُخزَّن كل مسار محدد النوع (
Map(K,V)أوJSONأوDynamicأوTuple(…)أوVariant(…)أوArray(…)أو أي نوع آخر مُعرَّف) كقيمة واحدة، وتستبدل دالة التجميع القيمة بأكملها بشكل ذري بدلًا من دمج محتوياتها دمجًا عميقًا. ولا يُطبَّق الدمج العميق مسارًا تلو الآخر إلا على المسارات الديناميكية (غير محددة النوع، المفردة). -
الالتباس الناتج عن النقطة في المفتاح: يمثّل النوع
JSONكلًا من{"a":{"b":1}}و{"a.b":1}بالمسار الداخلي نفسهa.b، ومن ثم قد يُظهر صف واحد كلًا منaوa.bبوصفهما نظيرين مستقلين. فعندما يكتب تصحيح أحدثaفقط، تمحو قاعدة التعارض بين المسار الأصل والمسار الفرعيa.b؛ وعندما يكتبa.bفقط، تمحو القاعدة نفسهاa. ولتجنب ذلك، اضبطjson_type_escape_dots_in_keys = 1. فمع هذا الإعداد، تُرمَّز النقاط الحرفية في مفاتيح JSON بترميز النسبة المئوية (مثلًا يصبحa.bهوa%2Eb)، مما يميّزها عن المسارات المتداخلة ويُزيل التعارض الزائف.
json— عمود JSON المراد تجميعه.JSONsort_key— عمود قابل للمقارنة يحدد عملية الكتابة التي تُعتمد لكل مسار. يُحتفَظ بالصف الذي يحمل أكبر قيمة لـ sort_key.
JSON
أمثلة
الاستخدام الأساسي مع مفتاح الفرز
Query
Response