diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c
index 206576d4bd38176a7d1293113c6e8559d53b3ae0..caea7bc805ee10fa92e0f3624afdfb430a7fd3ea 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -1586,6 +1586,7 @@ str_tolower(const char *buff, size_t nbytes, Oid collid)
 										&buff_conv, buff_uchar, len_uchar);
 			icu_from_uchar(&result, buff_conv, len_conv);
 			pfree(buff_uchar);
+			pfree(buff_conv);
 		}
 		else
 #endif
@@ -1709,6 +1710,7 @@ str_toupper(const char *buff, size_t nbytes, Oid collid)
 										&buff_conv, buff_uchar, len_uchar);
 			icu_from_uchar(&result, buff_conv, len_conv);
 			pfree(buff_uchar);
+			pfree(buff_conv);
 		}
 		else
 #endif
@@ -1833,6 +1835,7 @@ str_initcap(const char *buff, size_t nbytes, Oid collid)
 										&buff_conv, buff_uchar, len_uchar);
 			icu_from_uchar(&result, buff_conv, len_conv);
 			pfree(buff_uchar);
+			pfree(buff_conv);
 		}
 		else
 #endif