Does Postgresql create a new tuple for an no-change update statement?
Yes, this will modify all rows, even if the value doesn't change.
If you want to avoid that, either use a WHERE condition:
UPDATE app.products
SET &quot;description&quot; = TRIM(BOTH FROM &quot;description&quot;)
WHERE &quot;description&quot; IS DISTINCT FROM TRIM(BOTH FROM &quot;description&quot;);

or use the suppress_redundant_updates_trigger() trigger function to define a BEFORE UPDATE trigger on the table.
Avoiding the unnecessary updates will improve the performance and reduce table bloat.