cockroachdb / cockroachdb/cockroach
sql: errors thrown inside PL/pgSQL exception handlers sometimes missing CONTEXT
- Dominant language
- Go
- Stars
- 32.5k
- Forks
- 4.1k
- PR merge metrics
- PR metrics pending
Description
When an error is thrown from inside a PL/pgSQL exception handler, it is sometimes missing CONTEXT depending on the type of statement. (This is similar to https://github.com/cockroachdb/cockroach/issues/172501 in that it's a problem inside `sql.(*routineGenerator).handleException`.) Here's a repro:
```sql
-- when a RAISE throws an error from inside an exception handler, there is a CONTEXT
CREATE FUNCTION f_raise_in_handler() RETURNS INT AS $$
BEGIN
RAISE division_by_zero;
EXCEPTION WHEN division_by_zero THEN
RAISE EXCEPTION 'error from handler';
END
$$ LANGUAGE PLpgSQL;
SELECT f_raise_in_handler();
-- ERROR: error from handler
-- SQLSTATE: P0001
-- CONTEXT: PL/pgSQL function f_raise_in_handler line 5 at RAISE
-- but when a RETURN throws an error, no CONTEXT
CREATE FUNCTION f_inner() RETURNS INT AS $$
BEGIN
RAISE division_by_zero;
EXCEPTION WHEN division_by_zero THEN
RETURN 1/0;
END
$$ LANGUAGE PLpgSQL;
SELECT f_inner();
-- ERROR: division by zero
-- SQLSTATE: 22012
-- bonus: this incorrectly reports the error coming from f_outer (probably due to #172495)
CREATE FUNCTION f_outer() RETURNS INT AS $$
DECLARE
x INT;
BEGIN
SELECT f_inner() INTO x;
RETURN x;
END
$$ LANGUAGE PLpgSQL;
SELECT f_outer();
-- ERROR: division by zero
-- SQLSTATE: 22012
-- CONTEXT: PL/pgSQL function f_outer line 4 at SQL statement
```
Jira issue: CRDB-65782
Contributor guide
Assessment
This issue has not been assessed yet.