cockroachdb / cockroachdb/cockroach
sql: PL/pgSQL tail-call optimization leads to missing error CONTEXT reporting
- Dominant language
- Go
- Stars
- 32.5k
- Forks
- 4.1k
- PR merge metrics
- PR metrics pending
Description
When tail-call optimization is used for PL/pgSQL routines, it can cause error CONTEXT reporting to be lost. Here's an example:
```sql
-- with an exception handler (which never fires) TCO is not used, and we get CONTEXT from the error
CREATE FUNCTION f_handler(n INT) RETURNS INT AS $$
DECLARE
x INT := 0;
BEGIN
LOOP
IF x < 1 THEN
x := x + 1 / n;
ELSE
EXIT;
END IF;
END LOOP;
RETURN x;
EXCEPTION WHEN unique_violation THEN
RETURN -1;
END
$$ LANGUAGE PLpgSQL;
SELECT f_handler(0);
-- ERROR: division by zero
-- SQLSTATE: 22012
-- CONTEXT: PL/pgSQL function f_handler(bigint) line 4 at LOOP
-- without the exception handler, TCO is used, and CONTEXT is missing
CREATE FUNCTION f_branch(n INT) RETURNS INT AS $$
DECLARE
x INT := 0;
BEGIN
LOOP
IF x < 1 THEN
x := x + 1 / n;
ELSE
EXIT;
END IF;
END LOOP;
RETURN x;
END
$$ LANGUAGE PLpgSQL;
SELECT f_branch(0);
-- ERROR: division by zero
-- SQLSTATE: 22012
```
Jira issue: CRDB-65738
Contributor guide
Assessment
This issue has not been assessed yet.