88 *
99 *
1010 * IDENTIFICATION
11- * $PostgreSQL: pgsql/src/backend/utils/fmgr/fmgr.c,v 1.84 2004/09/13 01:44:46 neilc Exp $
11+ * $PostgreSQL: pgsql/src/backend/utils/fmgr/fmgr.c,v 1.85 2004/10/01 20:39:54 tgl Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
@@ -794,7 +794,7 @@ fmgr_security_definer(PG_FUNCTION_ARGS)
794794{
795795Datum result ;
796796FmgrInfo * save_flinfo ;
797- struct fmgr_security_definer_cache * fcache ;
797+ struct fmgr_security_definer_cache * volatile fcache ;
798798AclId save_userid ;
799799HeapTuple tuple ;
800800
@@ -821,14 +821,25 @@ fmgr_security_definer(PG_FUNCTION_ARGS)
821821fcache = fcinfo -> flinfo -> fn_extra ;
822822
823823save_flinfo = fcinfo -> flinfo ;
824- fcinfo -> flinfo = & fcache -> flinfo ;
825-
826824save_userid = GetUserId ();
827- SetUserId (fcache -> userid );
828- result = FunctionCallInvoke (fcinfo );
829- SetUserId (save_userid );
825+
826+ PG_TRY ();
827+ {
828+ fcinfo -> flinfo = & fcache -> flinfo ;
829+ SetUserId (fcache -> userid );
830+
831+ result = FunctionCallInvoke (fcinfo );
832+ }
833+ PG_CATCH ();
834+ {
835+ fcinfo -> flinfo = save_flinfo ;
836+ SetUserId (save_userid );
837+ PG_RE_THROW ();
838+ }
839+ PG_END_TRY ();
830840
831841fcinfo -> flinfo = save_flinfo ;
842+ SetUserId (save_userid );
832843
833844return result ;
834845}