I thought it would be useful to post here some answers obtained in one of the official email lists of PG ( [email protected], https://lists.postgresql.org/ ).
Tom's Answers:
my_database=# SELECT file INTO my_file_now FROM public.my_datatable WHERE
my_id='2fdf5297-8d4a-38bc-bb26-b8a4b7ba47ec';
ERROR: missing chunk number 0 for toast value 3483039 in pg_toast_3473493
We've fixed a few bugs over the years that manifest in that type of
problem --- are you up to date on minor releases? It's also possible
that reindexing that toast table would fix it.
Based on the above behavior I created the following stored procedure:
...
my_file_now BYTEA;
...
SELECT file
INTO my_file_now
FROM public.my_datatable WHERE my_id=my_id_now;
QUESTION: Why is the error observed in the query not caught by the
"EXCEPTION" block in the stored procedure?
I think that plpgsql will not bother to dereference a TOAST pointer
when storing it into a local variable (although this statement is very
possibly version-dependent, and you didn't say what PG version you are
using).
A more reliable way to trigger the problem is to do some computation
that requires the value of the field, perhaps along the lines of
PERFORM md5(file) FROM public.my_datatable WHERE my_id=my_id_now;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'CORRUPTED MY_ID - % ', my_id_now;
DELETE FROM public.my_datatable WHERE my_id=my_id_now;
I don't know that I'd give a procedure like this license to delete my
entire table :-(. If you really don't care how much data survives,
why not just TRUNCATE the table and be done with it? Otherwise,
printing the list of troublesome rows for manual review seems way more
prudent.
David's Answers:
Thanks for the suggestions! I found it a bit strange "pgsql" not to
"understand" as an exception the "ERROR: missing chunk number 0 for
toast value 3483039 in pg_toast_3473493"
I think Tom's point is that the function you wrote never actually
attempted to print out the value of the field so the error never got
triggered in the function. You need to actually attempt to manipulate
the data to get an error. If you did get the function to actually
encounter the error it should (haven't tested myself) be caught in the
exception handler; i.e., "A more reliable way to trigger the problem
is to do some computation that requires the value of the field,
perhaps along the lines of [query to try]".