1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-06 07:49:08 +03:00

PG_FINALLY

This gives an alternative way of catching exceptions, for the common
case where the cleanup code is the same in the error and non-error
cases.  So instead of

    PG_TRY();
    {
        ... code that might throw ereport(ERROR) ...
    }
    PG_CATCH();
    {
        cleanup();
	PG_RE_THROW();
    }
    PG_END_TRY();
    cleanup();

one can write

    PG_TRY();
    {
        ... code that might throw ereport(ERROR) ...
    }
    PG_FINALLY();
    {
        cleanup();
    }
    PG_END_TRY();

Discussion: https://www.postgresql.org/message-id/flat/95a822c3-728b-af0e-d7e5-71890507ae0c%402ndquadrant.com
This commit is contained in:
Peter Eisentraut
2019-11-01 11:09:52 +01:00
parent 7302514088
commit 604bd36711
32 changed files with 91 additions and 245 deletions

View File

@@ -2028,22 +2028,15 @@ asyncQueueReadAllNotifications(void)
snapshot);
} while (!reachedStop);
}
PG_CATCH();
PG_FINALLY();
{
/* Update shared state */
LWLockAcquire(AsyncQueueLock, LW_SHARED);
QUEUE_BACKEND_POS(MyBackendId) = pos;
LWLockRelease(AsyncQueueLock);
PG_RE_THROW();
}
PG_END_TRY();
/* Update shared state */
LWLockAcquire(AsyncQueueLock, LW_SHARED);
QUEUE_BACKEND_POS(MyBackendId) = pos;
LWLockRelease(AsyncQueueLock);
/* Done with snapshot */
UnregisterSnapshot(snapshot);
}

View File

@@ -1916,13 +1916,11 @@ BeginCopyTo(ParseState *pstate,
{
cstate->copy_file = AllocateFile(cstate->filename, PG_BINARY_W);
}
PG_CATCH();
PG_FINALLY();
{
umask(oumask);
PG_RE_THROW();
}
PG_END_TRY();
umask(oumask);
if (cstate->copy_file == NULL)
{
/* copy errno because ereport subfunctions might change it */

View File

@@ -934,13 +934,11 @@ EventTriggerSQLDrop(Node *parsetree)
{
EventTriggerInvoke(runlist, &trigdata);
}
PG_CATCH();
PG_FINALLY();
{
currentEventTriggerState->in_sql_drop = false;
PG_RE_THROW();
}
PG_END_TRY();
currentEventTriggerState->in_sql_drop = false;
/* Cleanup. */
list_free(runlist);
@@ -1007,17 +1005,13 @@ EventTriggerTableRewrite(Node *parsetree, Oid tableOid, int reason)
{
EventTriggerInvoke(runlist, &trigdata);
}
PG_CATCH();
PG_FINALLY();
{
currentEventTriggerState->table_rewrite_oid = InvalidOid;
currentEventTriggerState->table_rewrite_reason = 0;
PG_RE_THROW();
}
PG_END_TRY();
currentEventTriggerState->table_rewrite_oid = InvalidOid;
currentEventTriggerState->table_rewrite_reason = 0;
/* Cleanup. */
list_free(runlist);

View File

@@ -942,17 +942,13 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control,
execute_sql_string(c_sql);
}
PG_CATCH();
PG_FINALLY();
{
creating_extension = false;
CurrentExtensionObject = InvalidOid;
PG_RE_THROW();
}
PG_END_TRY();
creating_extension = false;
CurrentExtensionObject = InvalidOid;
/*
* Restore the GUC variables we set above.
*/

View File

@@ -493,16 +493,11 @@ CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel)
slotname)));
}
}
PG_CATCH();
PG_FINALLY();
{
/* Close the connection in case of failure. */
walrcv_disconnect(wrconn);
PG_RE_THROW();
}
PG_END_TRY();
/* And we are done with the remote side. */
walrcv_disconnect(wrconn);
}
else
ereport(WARNING,
@@ -1023,16 +1018,12 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel)
walrcv_clear_result(res);
}
PG_CATCH();
PG_FINALLY();
{
/* Close the connection in case of failure */
walrcv_disconnect(wrconn);
PG_RE_THROW();
}
PG_END_TRY();
walrcv_disconnect(wrconn);
pfree(cmd.data);
table_close(rel, NoLock);

View File

@@ -2431,13 +2431,11 @@ ExecCallTriggerFunc(TriggerData *trigdata,
{
result = FunctionCallInvoke(fcinfo);
}
PG_CATCH();
PG_FINALLY();
{
MyTriggerDepth--;
PG_RE_THROW();
}
PG_END_TRY();
MyTriggerDepth--;
pgstat_end_function_usage(&fcusage, true);

View File

@@ -430,17 +430,13 @@ vacuum(List *relations, VacuumParams *params,
}
}
}
PG_CATCH();
PG_FINALLY();
{
in_vacuum = false;
VacuumCostActive = false;
PG_RE_THROW();
}
PG_END_TRY();
in_vacuum = false;
VacuumCostActive = false;
/*
* Finish up processing.
*/