User defined exceptions

Lists: pgsql-sql
From: Alex Ignatov <a(dot)ignatov(at)postgrespro(dot)ru>
To: pgsql-sql(at)postgresql(dot)org
Subject: User defined exceptions
Date: 2015-07-15 14:10:18
Message-ID: 55A669CA.3070302@postgrespro.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

Hello all!
Trying to emulate "named" user defined exception with:
CREATE OR REPLACE FUNCTION exception_aaa () RETURNS text AS $body$
BEGIN
return 31234;
END;
$body$
LANGUAGE PLPGSQL
SECURITY DEFINER
;

do $$
begin
raise exception using errcode=exception_aaa();
exception
when sqlstate exception_aaa()
then
raise notice 'got exception %',sqlstate;
end;
$$

Got:

ERROR: syntax error at or near "exception_aaa"
LINE 20: sqlstate exception_aaa()

I looks like "when sqlstate exception_aaa()" doesn't work.

How can I catch exception in this case?

--
Alex Ignatov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus


From: "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>
To: Alex Ignatov <a(dot)ignatov(at)postgrespro(dot)ru>
Cc: "pgsql-sql(at)postgresql(dot)org" <pgsql-sql(at)postgresql(dot)org>
Subject: Re: User defined exceptions
Date: 2015-07-15 14:22:14
Message-ID: CAKFQuwYsLNR60ANkPS3CurKH97HZJ+AR97Y3Rz_LFeS4OwjRGA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

On Wed, Jul 15, 2015 at 10:10 AM, Alex Ignatov <a(dot)ignatov(at)postgrespro(dot)ru>
wrote:

> Hello all!
> Trying to emulate "named" user defined exception with:
> CREATE OR REPLACE FUNCTION exception_aaa () RETURNS text AS $body$
> BEGIN
> return 31234;
> END;
> $body$
> LANGUAGE PLPGSQL
> SECURITY DEFINER
> ;
>
> do $$
> begin
> raise exception using errcode=exception_aaa();
> exception
> when sqlstate exception_aaa()
> then
> raise notice 'got exception %',sqlstate;
> end;
> $$
>
> Got:
>
> ERROR: syntax error at or near "exception_aaa"
> LINE 20: sqlstate exception_aaa()
>
> I looks like "when sqlstate exception_aaa()" doesn't work.
>
> How can I catch exception in this case?
>

​I'm doubtful that it can be done presently.

If it were possible your exception_aaa function would have to be declared
IMMUTABLE. It also seems pointless to declare it security definer.

​There is nothing in the documentation that suggests that (or, to be fair,
prohibits) the "condition" can be anything other than a pre-defined name or
a constant string. When plpgsql get a function body it doesn't go looking
for random functions to execute.

David J.


From: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
To: Alex Ignatov <a(dot)ignatov(at)postgrespro(dot)ru>
Cc: postgres list <pgsql-sql(at)postgresql(dot)org>
Subject: Re: User defined exceptions
Date: 2015-07-15 15:54:48
Message-ID: CAFj8pRCeqR2m5fCtbAn6tUaZRoNb-w+bGeL7-A9qr72_GqBY_w@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

2015-07-15 16:10 GMT+02:00 Alex Ignatov <a(dot)ignatov(at)postgrespro(dot)ru>:

> Hello all!
> Trying to emulate "named" user defined exception with:
> CREATE OR REPLACE FUNCTION exception_aaa () RETURNS text AS $body$
> BEGIN
> return 31234;
> END;
> $body$
> LANGUAGE PLPGSQL
> SECURITY DEFINER
> ;
>
> do $$
> begin
> raise exception using errcode=exception_aaa();
> exception
> when sqlstate exception_aaa()
> then
> raise notice 'got exception %',sqlstate;
> end;
> $$
>
> Got:
>
> ERROR: syntax error at or near "exception_aaa"
> LINE 20: sqlstate exception_aaa()
>
> I looks like "when sqlstate exception_aaa()" doesn't work.
>
> How can I catch exception in this case?
>

this syntax is working only for builtin exceptions. PostgreSQL has not
declared custom exceptions like SQL/PSM.

You have to use own sqlcode and catch specific code.

Regards

Pavel

> --
> Alex Ignatov
> Postgres Professional: http://www.postgrespro.com
> The Russian Postgres Company
>
>
>
>
> ------------------------------
> [image: Avast logo] <https://www.avast.com/antivirus>
>
> This email has been checked for viruses by Avast antivirus software.
> www.avast.com <https://www.avast.com/antivirus>
>
>


From: Alexey Bashtanov <alexey_bashtanov(at)ocslab(dot)com>
To: Alex Ignatov <a(dot)ignatov(at)postgrespro(dot)ru>, pgsql-sql(at)postgresql(dot)org
Subject: Re: User defined exceptions
Date: 2015-07-17 07:34:11
Message-ID: 55A8AFF3.7040305@ocslab.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

On 15.07.2015 17:10, Alex Ignatov wrote:
> Hello all!
> Trying to emulate "named" user defined exception with:
> CREATE OR REPLACE FUNCTION exception_aaa () RETURNS text AS $body$
> BEGIN
> return 31234;
> END;
> $body$
> LANGUAGE PLPGSQL
> SECURITY DEFINER
> ;
>
> do $$
> begin
> raise exception using errcode=exception_aaa();
> exception
> when sqlstate exception_aaa()
> then
> raise notice 'got exception %',sqlstate;
> end;
> $$
>
> Got:
>
> ERROR: syntax error at or near "exception_aaa"
> LINE 20: sqlstate exception_aaa()
>
> I looks like "when sqlstate exception_aaa()" doesn't work.
>
> How can I catch exception in this case?

Hello Alex,

The following workaround could be used:

do $$
begin
raise exception using errcode = exception_aaa();
exception
when others then
if sqlstate = exception_aaa() then
raise notice 'got exception %',sqlstate;
else
raise; --reraise
end if;
end;
$$

Not sure if its performance is the same as in simple exception catch,
maybe it would degrade.

Best Regards,
Alexey Bashtanov


From: Alexey Bashtanov <bashtanov(at)imap(dot)cc>
To: Alex Ignatov <a(dot)ignatov(at)postgrespro(dot)ru>, pgsql-sql(at)postgresql(dot)org
Subject: Re: User defined exceptions
Date: 2015-07-17 07:36:55
Message-ID: 55A8B097.8000303@imap.cc
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

On 15.07.2015 17:10, Alex Ignatov wrote:
> Hello all!
> Trying to emulate "named" user defined exception with:
> CREATE OR REPLACE FUNCTION exception_aaa () RETURNS text AS $body$
> BEGIN
> return 31234;
> END;
> $body$
> LANGUAGE PLPGSQL
> SECURITY DEFINER
> ;
>
> do $$
> begin
> raise exception using errcode=exception_aaa();
> exception
> when sqlstate exception_aaa()
> then
> raise notice 'got exception %',sqlstate;
> end;
> $$
>
> Got:
>
> ERROR: syntax error at or near "exception_aaa"
> LINE 20: sqlstate exception_aaa()
>
> I looks like "when sqlstate exception_aaa()" doesn't work.
>
> How can I catch exception in this case?

Hello Alex,

The following workaround could be used:

do $$
begin
raise exception using errcode = exception_aaa();
exception
when others then
if sqlstate = exception_aaa() then
raise notice 'got exception %',sqlstate;
else
raise; --reraise
end if;
end;
$$

Not sure if its performance is the same as in simple exception catch,
maybe it would degrade.

Best Regards,
Alexey Bashtanov


From: Alex Ignatov <a(dot)ignatov(at)postgrespro(dot)ru>
To: "pgsql-sql(at)postgresql(dot)org" <pgsql-sql(at)postgresql(dot)org>
Subject: Re: User defined exceptions
Date: 2015-07-17 15:31:39
Message-ID: 55A91FDB.1010706@postgrespro.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

On 17.07.2015 10:34, Alexey Bashtanov wrote:
> On 15.07.2015 17:10, Alex Ignatov wrote:
>> Hello all!
>> Trying to emulate "named" user defined exception with:
>> CREATE OR REPLACE FUNCTION exception_aaa () RETURNS text AS $body$
>> BEGIN
>> return 31234;
>> END;
>> $body$
>> LANGUAGE PLPGSQL
>> SECURITY DEFINER
>> ;
>>
>> do $$
>> begin
>> raise exception using errcode=exception_aaa();
>> exception
>> when sqlstate exception_aaa()
>> then
>> raise notice 'got exception %',sqlstate;
>> end;
>> $$
>>
>> Got:
>>
>> ERROR: syntax error at or near "exception_aaa"
>> LINE 20: sqlstate exception_aaa()
>>
>> I looks like "when sqlstate exception_aaa()" doesn't work.
>>
>> How can I catch exception in this case?
>
> Hello Alex,
>
> The following workaround could be used:
>
> do $$
> begin
> raise exception using errcode = exception_aaa();
> exception
> when others then
> if sqlstate = exception_aaa() then
> raise notice 'got exception %',sqlstate;
> else
> raise; --reraise
> end if;
> end;
> $$
>
> Not sure if its performance is the same as in simple exception catch,
> maybe it would degrade.
>
> Best Regards,
> Alexey Bashtanov
Yep already used this trick =)
Anyway thank you!

--
Alex Ignatov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus