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); + } + } }