cockroachdb / cockroachdb/cockroach

sql: errors thrown inside PL/pgSQL exception handlers sometimes missing CONTEXT

Open
#172,534 0 comments 0 reactions 1 assignee Claimed by @michae2 View on GitHub
A-sql-plpgsql A-sql-routine branch-release-26.3 C-bug docs-known-limitation O-qa T-sql-queries
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.