Thread
-
Drop database command will raise "wrong tuple length" if pg_database tuple contains toast attribute.
Ayush Tiwari <ayushtiwari.slg01@gmail.com> — 2024-08-13T05:37:39Z
Hi hackers, We encountered an issue lately, that if the database grants too many roles `datacl` is toasted, following which, the drop database command will fail with error "wrong tuple length". To reproduce the issue, please follow below steps: CREATE DATABASE test; -- create helper function CREATE OR REPLACE FUNCTION data_tuple() returns text as $body$ declare mycounter int; begin for mycounter in select i from generate_series(1,2000) i loop execute 'CREATE ROLE aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbb ' || mycounter; execute 'GRANT ALL ON DATABASE test to aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbb ' || mycounter; end loop; return 'ok'; end; $body$ language plpgsql volatile strict; -- create roles and grant on the database. SELECT data_tuple(); -- drop database command, this will result in "wrong tuple length" error. DROP DATABASE test; The root cause of this behaviour is that the HeapTuple in dropdb function fetches a copy of pg_database tuple from system cache. But the system cache flattens any toast attributes, which cause the length check to fail in heap_inplace_update. A patch for this issue is attached to the mail, the solution is to change the logic to fetch the tuple by directly scanning pg_database rather than using the catcache. Regards, Ayush