commit 9c82ca9313c0c8a9c56c4a399aef6e00cc01067b
Author: Andre Mikulec <Andre_Mikulec@Hotmail.com>
Date:   Tue Oct 6 23:08:46 2026 -0400

    PostgreSQL 18 Release Build 9

    * prepare for PL/R release of 8.4.8.9
    * Not expected to affect end-user programming
    * For PL/R optimization, integrate heap_copy_tuple_as_datum()
    * * (rec by Andres Freund from code of Tom Lane)

--- a/plr.h
+++ b/plr.h
@@ -357,44 +357,20 @@ extern void R_RunExitFinalizers(void);
 #define SET_INSERT_ARGS_567 \
 	do { \
 		SET_ARG(DirectFunctionCall1(textin, CStringGetDatum("INSERT")),false,5); \
-		tup = trigdata->tg_trigtuple; \
-		dtrigtup = (HeapTupleHeader) palloc(tup->t_len); \
-		memcpy((char *) dtrigtup, (char *) tup->t_data, tup->t_len); \
-		HeapTupleHeaderSetDatumLength(dtrigtup, tup->t_len); \
-		HeapTupleHeaderSetTypeId(dtrigtup, tupdesc->tdtypeid); \
-		HeapTupleHeaderSetTypMod(dtrigtup, tupdesc->tdtypmod); \
-		SET_ARG(PointerGetDatum(dtrigtup),false,6); \
+		SET_ARG(heap_copy_tuple_as_datum(trigdata->tg_trigtuple, tupdesc),false,6); \
 		SET_ARG((Datum)0,true,7); \
 	} while (0)
 #define SET_DELETE_ARGS_567 \
 	do { \
 		SET_ARG(DirectFunctionCall1(textin, CStringGetDatum("DELETE")),false,5); \
 		SET_ARG((Datum) 0,true,6); \
-		tup = trigdata->tg_trigtuple; \
-		dtrigtup = (HeapTupleHeader) palloc(tup->t_len); \
-		memcpy((char *) dtrigtup, (char *) tup->t_data, tup->t_len); \
-		HeapTupleHeaderSetDatumLength(dtrigtup, tup->t_len); \
-		HeapTupleHeaderSetTypeId(dtrigtup, tupdesc->tdtypeid); \
-		HeapTupleHeaderSetTypMod(dtrigtup, tupdesc->tdtypmod); \
-		SET_ARG(PointerGetDatum(dtrigtup),false,7); \
+		SET_ARG(heap_copy_tuple_as_datum(trigdata->tg_trigtuple, tupdesc),false,7); \
 	} while (0)
 #define SET_UPDATE_ARGS_567 \
 	do { \
 		SET_ARG(DirectFunctionCall1(textin, CStringGetDatum("UPDATE")),false,5); \
-		tup = trigdata->tg_newtuple; \
-		dnewtup = (HeapTupleHeader) palloc(tup->t_len); \
-		memcpy((char *) dnewtup, (char *) tup->t_data, tup->t_len); \
-		HeapTupleHeaderSetDatumLength(dnewtup, tup->t_len); \
-		HeapTupleHeaderSetTypeId(dnewtup, tupdesc->tdtypeid); \
-		HeapTupleHeaderSetTypMod(dnewtup, tupdesc->tdtypmod); \
-		SET_ARG(PointerGetDatum(dnewtup),false,6); \
-		tup = trigdata->tg_trigtuple; \
-		dtrigtup = (HeapTupleHeader) palloc(tup->t_len); \
-		memcpy((char *) dtrigtup, (char *) tup->t_data, tup->t_len); \
-		HeapTupleHeaderSetDatumLength(dtrigtup, tup->t_len); \
-		HeapTupleHeaderSetTypeId(dtrigtup, tupdesc->tdtypeid); \
-		HeapTupleHeaderSetTypMod(dtrigtup, tupdesc->tdtypmod); \
-		SET_ARG(PointerGetDatum(dtrigtup),false,7); \
+		SET_ARG(heap_copy_tuple_as_datum(trigdata->tg_newtuple,  tupdesc),false,6); \
+		SET_ARG(heap_copy_tuple_as_datum(trigdata->tg_trigtuple, tupdesc),false,7); \
 	} while (0)
 #define CONVERT_TUPLE_TO_DATAFRAME(tt) \
 	do { \
