Thread: Document that PG_TRY block cannot have a return statement

Document that PG_TRY block cannot have a return statement

From
Serpent
Date:
Hi,

I created a tiny patch that documents that the code block following PG_TRY() cannot have any return statement.

Please CC me, as I'm not subscribed to this list.

Attachment

Re: Document that PG_TRY block cannot have a return statement

From
Tom Lane
Date:
Serpent <serpent7776@gmail.com> writes:
> I created a tiny patch that documents that the code block following
> PG_TRY() cannot have any return statement.

AFAIK, this is wrong.  The actual requirement is already stated
in the comment:

 * ... The error recovery code
 * can either do PG_RE_THROW to propagate the error outwards, or do a
 * (sub)transaction abort.

            regards, tom lane



Re: Document that PG_TRY block cannot have a return statement

From
Tom Lane
Date:
Serpent <serpent7776@gmail.com> writes:
> I'm talking about this part:

> PG_TRY();
> {
>   ... code that might throw ereport(ERROR) ...
> }

Ah.  Your phrasing needs work for clarity then.  Also, "return"
is hardly the only way to break it; break, continue, or goto
leading out of the PG_TRY are other possibilities.  Maybe more
like "The XXX code must exit normally (by control reaching
the end) if it does not throw ereport(ERROR)."  Not quite sure
what to use for XXX.

            regards, tom lane



Re: Document that PG_TRY block cannot have a return statement

From
Serpent
Date:
Hi,

What about this wording:

The code that might throw ereport(ERROR) cannot contain any non local control flow other than ereport(ERROR) e.g.: return, goto, break, continue.
In other words once PG_TRY() is executed, either PG_CATCH() or PG_FINALLY() must be executed as well.

I used 'code that might throw ereport(ERROR)' for XXX since this is what's used earlier in the comment.

On Tue, 12 Sept 2023 at 17:22, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Serpent <serpent7776@gmail.com> writes:
> I'm talking about this part:

> PG_TRY();
> {
>   ... code that might throw ereport(ERROR) ...
> }

Ah.  Your phrasing needs work for clarity then.  Also, "return"
is hardly the only way to break it; break, continue, or goto
leading out of the PG_TRY are other possibilities.  Maybe more
like "The XXX code must exit normally (by control reaching
the end) if it does not throw ereport(ERROR)."  Not quite sure
what to use for XXX.

                        regards, tom lane
Attachment

Re: Document that PG_TRY block cannot have a return statement

From
Xiaoran Wang
Date:
LGTM!

Serpent <serpent7776@gmail.com> 于2024年8月15日周四 15:01写道:
Hi,

What about this wording:

The code that might throw ereport(ERROR) cannot contain any non local control flow other than ereport(ERROR) e.g.: return, goto, break, continue.
In other words once PG_TRY() is executed, either PG_CATCH() or PG_FINALLY() must be executed as well.

I used 'code that might throw ereport(ERROR)' for XXX since this is what's used earlier in the comment.

On Tue, 12 Sept 2023 at 17:22, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Serpent <serpent7776@gmail.com> writes:
> I'm talking about this part:

> PG_TRY();
> {
>   ... code that might throw ereport(ERROR) ...
> }

Ah.  Your phrasing needs work for clarity then.  Also, "return"
is hardly the only way to break it; break, continue, or goto
leading out of the PG_TRY are other possibilities.  Maybe more
like "The XXX code must exit normally (by control reaching
the end) if it does not throw ereport(ERROR)."  Not quite sure
what to use for XXX.

                        regards, tom lane


--
Best regards !
Xiaoran Wang