[cert-mgmt] workaround: reuse existing active/pending dataset for partial dataset from thread device (#2002)

diff --git a/src/core/meshcop/dataset_manager.cpp b/src/core/meshcop/dataset_manager.cpp
index c885c08..34459ff 100644
--- a/src/core/meshcop/dataset_manager.cpp
+++ b/src/core/meshcop/dataset_manager.cpp
@@ -511,15 +511,34 @@
                  state = StateTlv::kReject);
 
     // update dataset
+    // Thread specification allows partial dataset changes for MGMT_ACTIVE_SET.req/MGMT_PENDING_SET.req
+    // from Commissioner.
+    // Updates based on existing active/pending dataset if it is from Commissioner.
     if (isUpdateFromCommissioner)
     {
-        mNetwork.Set(netif.GetActiveDataset().GetNetwork());
+        // take active dataset as the update base for MGMT_PENDING_SET.req if no existing pending dataset.
+        if (type == Tlv::kPendingTimestamp && mNetwork.GetSize() == 0)
+        {
+            mNetwork.Set(netif.GetActiveDataset().GetNetwork());
+        }
     }
+
+#if 0
+    // Interim workaround for certification:
+    // Thread specification requires entire dataset for MGMT_ACTIVE_SET.req/MGMT_PENDING_SET.req from thread device.
+    // Not all stack vendors would send entire dataset in MGMT_ACTIVE_SET.req triggered by command as known when
+    // testing 9.2.5.
+    // So here would accept even if it is not entire, update the Tlvs in the message on existing mNetwork in
+    // order to avoid interop issue for now.
+    // TODO: remove '#if 0' condition after all stack vendors reach consensus-MGMT_ACTIVE_SET.req/MGMT_PENDING_SET.req
+    // from thread device triggered by command would include entire dataset as expected.
     else
     {
         mNetwork.Clear();
     }
 
+#endif
+
     if (type == Tlv::kPendingTimestamp || !doesAffectConnectivity)
     {
         offset = aMessage.GetOffset();