On Wed, Mar 20, 2013 at 7:43 AM, Tom Lane <t...@sss.pgh.pa.us> wrote:
> Daniel Farina <dan...@heroku.com> writes:
>> Okay, one more of those fridge-logic bugs.  Sorry for the noise. v5.
>
>> A missing PG_RETHROW to get the properly finally-esque semantics:
>
>> --- a/contrib/dblink/dblink.c
>> +++ b/contrib/dblink/dblink.c
>> @@ -642,7 +642,10 @@ dblink_fetch(PG_FUNCTION_ARGS)
>>   }
>>   PG_CATCH();
>>   {
>> + /* Pop any set GUCs, if necessary */
>>   restoreLocalGucs(&rgs);
>> +
>> + PG_RE_THROW();
>>   }
>>   PG_END_TRY();
>
> Um ... you shouldn't need a PG_TRY for that at all.  guc.c will take
> care of popping the values on transaction abort --- that's really rather
> the whole point of having that mechanism.

Hmm, well, merely raising the error doesn't reset the GUCs, so I was
rather thinking that this was a good idea to compose more neatly in
the case of nested exception processing, e.g.:

    PG_TRY();
    {
        PG_TRY();
        {
            elog(NOTICE, "pre: %s",
                 GetConfigOption("DateStyle", false, true));
            materializeResult(fcinfo, res);
        }
        PG_CATCH();
        {
            elog(NOTICE, "inner catch: %s",
                 GetConfigOption("DateStyle", false, true));
            PG_RE_THROW();
        }
        PG_END_TRY();
    }
    PG_CATCH();
    {
        elog(NOTICE, "outer catch: %s",
             GetConfigOption("DateStyle", false, true));
        restoreLocalGucs(&rgs);
        elog(NOTICE, "restored: %s",
             GetConfigOption("DateStyle", false, true));
        PG_RE_THROW();
    }
    PG_END_TRY();

I don't think this paranoia is made in other call sites for AtEOXact,
so included is a version that takes the same stance. This one shows up
 best with the whitespace-insensitive option for git:

--- a/contrib/dblink/dblink.c
+++ b/contrib/dblink/dblink.c
@@ -634,21 +634,8 @@ dblink_fetch(PG_FUNCTION_ARGS)
         * affect parsing and then un-set them afterwards.
         */
        initRemoteGucs(&rgs, conn);
-
-       PG_TRY();
-       {
        applyRemoteGucs(&rgs);
        materializeResult(fcinfo, res);
-       }
-       PG_CATCH();
-       {
-               /* Pop any set GUCs, if necessary */
-               restoreLocalGucs(&rgs);
-
-               PG_RE_THROW();
-       }
-       PG_END_TRY();
-
        restoreLocalGucs(&rgs);

        return (Datum) 0;
@@ -823,9 +810,6 @@ dblink_record_internal(FunctionCallInfo fcinfo,
bool is_async)
                if (freeconn)
                        PQfinish(conn);

-               /* Pop any set GUCs, if necessary */
-               restoreLocalGucs(&rgs);
-
                PG_RE_THROW();
        }
        PG_END_TRY();

--
fdr

Attachment: dblink-guc-sensitive-types-v6.patch
Description: Binary data

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to