diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index 63598aba8a8..c7320adbfd2 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -5128,10 +5128,21 @@ exec_assign_value(PLpgSQL_execstate *estate,
 					}
 					else
 					{
-						/* else transfer value if R/W, else just datumCopy */
-						newvalue = datumTransfer(newvalue,
-												 false,
-												 var->datatype->typlen);
+						if (var->datatype->typlen == -1 &&
+							VARATT_IS_EXTERNAL_EXPANDED(DatumGetPointer(newvalue)))
+						{
+							MemoryContext oldcontext = MemoryContextSwitchTo(estate->datum_context);
+							newvalue = datumCopy(newvalue, false, -1);
+							MemoryContextSwitchTo(oldcontext);
+						}
+						else
+						{
+							/* else transfer value if R/W, else just datumCopy */
+							newvalue = datumTransfer(newvalue,
+													 false,
+													 var->datatype->typlen);
+						}
+
 					}
 				}
 
