Re: BUG #14861: Handle syntax_error

From: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
To: andrey_shvidky(at)hotmail(dot)com
Cc: "pgsql-bugs(at)postgresql(dot)org" <pgsql-bugs(at)postgresql(dot)org>
Subject: Re: BUG #14861: Handle syntax_error
Date: 2017-10-19 19:01:57
Message-ID: CAFj8pRBxY2D4CrUXrzTUFiqyvjF7CWudZPfmRBPB1zOsq=n4kw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Hi

2017-10-18 17:32 GMT+02:00 <andrey_shvidky(at)hotmail(dot)com>:

> The following bug has been logged on the website:
>
> Bug reference: 14861
> Logged by: Andrey Shvidky
> Email address: andrey_shvidky(at)hotmail(dot)com
> PostgreSQL version: 9.6.5
> Operating system: Windows 7 x64
> Description:
>
> /*
> Faced with such a unfairness.
> I have a do block or function with error handling block.
> In case when error type is 42601 (syntax_error) I can't get correct error
> context.
> The error context contains information about do block or function itself,
> but not about last executed instruction.
> In the folowing example, if I remove error handling I will happily have
> such
> a message:
>
> ERROR: subquery must return only one column
> LINE 1: SELECT (select id, val1 from aaa)
>
> But in case when error handling presents I have only sad:
>
> message_text = subquery must return only one column
> pg_exception_context = PL/pgSQL function inline_code_block line 9 at
> assignment
> pg_exception_detail =
>
> Where information about "SELECT (select id, val1 from aaa)" hided?
>
> Repro script:
> */
>
> create temp table aaa (id int, val1 text);
>
> do language plpgsql $$
> declare
> error_message text;
> error_detailed_message text;
> error_context text;
> arr_test aaa[];
> begin
> --arr_test = (select row(id, val1) from aaa); -- No
> error, correct call
> arr_test = (select id, val1 from aaa); -- Error
> 42601 syntax_error
> exception
> --when syntax_error then
> when others then
> get stacked diagnostics
> error_message = message_text
> ,error_context = pg_exception_context
> ,error_detailed_message = pg_exception_detail;
>
> raise notice 'message_text = %', error_message;
> raise notice 'pg_exception_context = %', error_context;
> raise notice 'pg_exception_detail = %', error_detailed_message;
> end
> $$;
>
> drop table if exists aaa;
>
>
Currently GET STACKED DIAGNOSTICS doesn't publish a "internalquery" field
from ErrorData structure. So you cannot to print it. Probably it should be
short patch, but maybe long discussion how to take this feature.

Maybe plpgsql_check https://github.com/okbob/plpgsql_check can be good tool
for you.

Regards

Pavel

>
> --
> Sent via pgsql-bugs mailing list (pgsql-bugs(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-bugs
>

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message psuderevsky 2017-10-19 23:14:24 BUG #14863: wrong reltuples statistics after vacuum without analyze
Previous Message mgbii bax 2017-10-19 18:33:38 Re: BUG #14862: create table with missing sequence bug