Better localization of errors in plpgsql variable initialization

Started by Tom Laneover 4 years ago2 messageshackers
Jump to latest
#1Tom Lane
tgl@sss.pgh.pa.us

While preparing commit a2a731d6c, I chanced to notice what seemed
like an off-by-one error in the line number reported for an error
occurring while we initialize a plpgsql variable. For instance

regression=# do $$ declare x int := 1/0;
regression$# begin end $$;
ERROR: division by zero
CONTEXT: SQL expression "1/0"
PL/pgSQL function inline_code_block line 2 during statement block local variable initialization

After tracking it down, it's not that. It's that we're pointing
at the BEGIN keyword, because that's what determines the lineno
associated with the PLpgSQL_stmt_block struct.

This seems like it could be quite confusing in a block with many
variables, so here's a proposed patch that improves the reported
line number to match the specific variable.

The only downside that I can see here is the one additional store
per variable to set err_var; but it's pretty hard to believe that
that'd be measurable in context.

Any objections?

regards, tom lane

Attachments:

blame-init-errors-on-specific-variable-1.patchtext/x-diff; charset=us-ascii; name=blame-init-errors-on-specific-variable-1.patchDownload+49-31
#2Pavel Stehule
pavel.stehule@gmail.com
In reply to: Tom Lane (#1)
Re: Better localization of errors in plpgsql variable initialization

pá 29. 10. 2021 v 20:00 odesílatel Tom Lane <tgl@sss.pgh.pa.us> napsal:

While preparing commit a2a731d6c, I chanced to notice what seemed
like an off-by-one error in the line number reported for an error
occurring while we initialize a plpgsql variable. For instance

regression=# do $$ declare x int := 1/0;
regression$# begin end $$;
ERROR: division by zero
CONTEXT: SQL expression "1/0"
PL/pgSQL function inline_code_block line 2 during statement block local
variable initialization

After tracking it down, it's not that. It's that we're pointing
at the BEGIN keyword, because that's what determines the lineno
associated with the PLpgSQL_stmt_block struct.

This seems like it could be quite confusing in a block with many
variables, so here's a proposed patch that improves the reported
line number to match the specific variable.

The only downside that I can see here is the one additional store
per variable to set err_var; but it's pretty hard to believe that
that'd be measurable in context.

+1

Regards

Pavel

Any objections?

Show quoted text

regards, tom lane