You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[FIX] util/records: deduplicate before batch update
When updating record references we need to dedup uniq indexes. In the
case of inderect references the case when two old references become the
same new reference was missing.
Example to trigger the issue
```
test_15=> select * from mail_followers where res_model='res.partner.bank'
+----+------------------+--------+------------+
| id | res_model | res_id | partner_id |
|----+------------------+--------+------------|
| 5 | res.partner.bank | 2 | 3 |
| 7 | res.partner.bank | 3 | 3 |
+----+------------------+--------+------------+
test_15=> select id,sanitized_acc_number,partner_id,company_id from res_partner_bank
+----+----------------------+------------+------------+
| id | sanitized_acc_number | partner_id | company_id |
|----+----------------------+------------+------------|
| 1 | 1 | 3 | 1 |
| 2 | 1 | 3 | 2 |
| 3 | 1 | 3 | 3 |
+----+----------------------+------------+------------+
```
In such case the record replacer will replace references to the partner
bank as in the mapping `{2:1, 3:1}`. But this causes an error
```
2025-03-07 17:12:12,145 502959 ERROR test_15_16 odoo.sql_db: bad query:
UPDATE "mail_followers" t
SET "res_model" = 'res.partner.bank'
, "res_id" = _upgrade_rrr.new
FROM _upgrade_rrr
WHERE "res_model"='res.partner.bank'
AND _upgrade_rrr.old = res_id
AND
NOT EXISTS(SELECT 1 FROM mail_followers WHERE "res_model" = 'res.partner.bank' AND "res_id" = _upgrade_rrr.new AND "partner_id"=t."partner_id")
;
DELETE FROM mail_followers USING _upgrade_rrr WHERE "res_model"='res.partner.bank' AND res_id = _upgrade_rrr.old;
ERROR: duplicate key value violates unique constraint "mail_followers_mail_followers_res_partner_res_model_id_uniq"
DETAIL: Key (res_model, res_id, partner_id)=(res.partner.bank, 1, 3) already exists.
```
0 commit comments