The P0004 assert_failure exception assert_failure exception seems to be unhandleable
| От | Bryn Llewellyn |
|---|---|
| Тема | The P0004 assert_failure exception assert_failure exception seems to be unhandleable |
| Дата | |
| Msg-id | 5A915380-789D-4448-89F4-E3F945C1549A@yugabyte.com обсуждение исходный текст |
| Ответы |
Re: The P0004 assert_failure exception assert_failure exception seems to be unhandleable
|
| Список | pgsql-general |
I just stumbled on the fact that the "assert_failure" exception seems to be unhandleable. My test is at the end.
Is this intended?
I looked at the section:
«
43.9.2. Checking Assertions
»
It says this:
«
Note that ASSERT is meant for detecting program bugs, not for reporting ordinary error conditions. Use the RAISE statement, described above, for that.
Note that ASSERT is meant for detecting program bugs, not for reporting ordinary error conditions. Use the RAISE statement, described above, for that.
»
But it takes quite a stretch of the imagination to infer that this means that the "assert_failure" exception cannot be handled.
B.t.w. this (in the same "43.9. Errors and Messages" chapter) looks like a typo:
«
If no condition name nor SQLSTATE is specified in a RAISE EXCEPTION command, the default is to use ERRCODE_RAISE_EXCEPTION (P0001).
»
The spelling "errcode_raise_exception()" makes it look like a built-in function. I believe that this is meant:
«
If no condition name nor SQLSTATE is specified in a RAISE EXCEPTION command, the outcome is as if this:
ERRCODE = "RAISE_EXCEPTION"
or this:
ERRCODE = "P0001"
was used
»
----------------------------------------------------------------------
-- The test
returns text
language plpgsql
as $body$
declare
err text not null := '';
msg text not null := '';
hint text not null := '';
n int not null := 0;
begin
case which
when 'OK' then
n := 42;
when 'null_value_not_allowed' then
n := null;
when 'raise_exception' then
raise exception using
errcode = 'raise_exception',
message = 'U1234: Not allowed!',
hint = 'Do something else!';
when 'assert_failure' then
assert false, 'Assert failed';
end case;
return 'no error';
exception when others then
get stacked diagnostics
err = returned_sqlstate,
msg = message_text,
hint = pg_exception_hint;
return 'Handled: '||err||' | '||msg||' | '||hint;
end;
$body$;
\set VERBOSITY verbose
\t on
\o spool.txt
select demo_outcome('OK');
select demo_outcome('null_value_not_allowed');
select demo_outcome('raise_exception');
\o
\t off
\set VERBOSITY verbose
\t on
\o spool.txt
select demo_outcome('OK');
select demo_outcome('null_value_not_allowed');
select demo_outcome('raise_exception');
\o
\t off
It outputs this to "spool.txt".
Handled: 22004 | null value cannot be assigned to variable "n" declared NOT NULL |
Handled: P0001 | U1234: Not allowed! | Do something else!
But doing this:
select demo_outcome('assert_failure');
causes this outcome:
ERROR: P0004: Assert failed
CONTEXT: PL/pgSQL function demo_outcome(text) line 22 at ASSERT
LOCATION: exec_stmt_assert, pl_exec.c:3918
CONTEXT: PL/pgSQL function demo_outcome(text) line 22 at ASSERT
LOCATION: exec_stmt_assert, pl_exec.c:3918
В списке pgsql-general по дате отправления: