Re: check_recovery_target_lsn() does a PG_CATCH without a throw

From: Andres Freund <andres(at)anarazel(dot)de>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Sergei Kornilov <sk(at)zsrv(dot)org>, "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org>, Peter Eisentraut <peter_e(at)gmx(dot)net>
Subject: Re: check_recovery_target_lsn() does a PG_CATCH without a throw
Date: 2019-06-11 15:35:54
Message-ID: 20190611153554.bnelx3serdhfb4de@alap3.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

On 2019-06-11 10:49:28 -0400, Tom Lane wrote:
> It doesn't reliably work to do so, and we have a project policy against
> trying, and this code should never have been committed in this state.

I'll also note that I complained about this specific instance being
introduced all the way back in 2013 and then again 2016:

https://www.postgresql.org/message-id/20131118172748.GG20305%40awork2.anarazel.de

On 2013-11-18 18:27:48 +0100, Andres Freund wrote:
> * Why the PG_TRY/PG_CATCH in check_recovery_target_time? Besides being
> really strangely formatted (multiline :? inside a function?) it
> doesn't a) seem to be correct to ignore potential memory allocation
> errors by just switching back into the context that just errored out,
> and continue to work there b) forgo cleanup by just continuing as if
> nothing happened. That's unlikely to be acceptable.
> * You access recovery_target_name[0] unconditionally, although it's

https://www.postgresql.org/message-id/20140123133424.GD29782%40awork2.anarazel.de

On 2016-11-12 08:09:49 -0800, Andres Freund wrote:
> > +static bool
> > +check_recovery_target_time(char **newval, void **extra, GucSource source)
> > +{
> > + TimestampTz time;
> > + TimestampTz *myextra;
> > + MemoryContext oldcontext = CurrentMemoryContext;
> > +
> > + PG_TRY();
> > + {
> > + time = (strcmp(*newval, "") == 0) ?
> > + 0 :
> > + DatumGetTimestampTz(DirectFunctionCall3(timestamptz_in,
> > + CStringGetDatum(*newval),
> > + ObjectIdGetDatum(InvalidOid),
> > + Int32GetDatum(-1)));
> > + }
> > + PG_CATCH();
> > + {
> > + ErrorData *edata;
> > +
> > + /* Save error info */
> > + MemoryContextSwitchTo(oldcontext);
> > + edata = CopyErrorData();
> > + FlushErrorState();
> > +
> > + /* Pass the error message */
> > + GUC_check_errdetail("%s", edata->message);
> > + FreeErrorData(edata);
> > + return false;
> > + }
> > + PG_END_TRY();
>
> Hm, I'm not happy to do that kind of thing. What if there's ever any
> database interaction added to timestamptz_in?
>
> It's also problematic because the parsing of timestamps depends on the
> timezone GUC - which might not yet have taken effect...

I don't have particularly polite words about this.

Greetings,

Andres Freund

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Robert Haas 2019-06-11 15:47:07 aborting a non-speculative insertion
Previous Message Tom Lane 2019-06-11 14:49:28 Re: check_recovery_target_lsn() does a PG_CATCH without a throw