diff options
Diffstat (limited to 'src/backend/commands/discard.c')
-rw-r--r-- | src/backend/commands/discard.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/backend/commands/discard.c b/src/backend/commands/discard.c new file mode 100644 index 0000000..57d3d7d --- /dev/null +++ b/src/backend/commands/discard.c @@ -0,0 +1,78 @@ +/*------------------------------------------------------------------------- + * + * discard.c + * The implementation of the DISCARD command + * + * Copyright (c) 1996-2021, PostgreSQL Global Development Group + * + * + * IDENTIFICATION + * src/backend/commands/discard.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/xact.h" +#include "catalog/namespace.h" +#include "commands/async.h" +#include "commands/discard.h" +#include "commands/prepare.h" +#include "commands/sequence.h" +#include "utils/guc.h" +#include "utils/portal.h" + +static void DiscardAll(bool isTopLevel); + +/* + * DISCARD { ALL | SEQUENCES | TEMP | PLANS } + */ +void +DiscardCommand(DiscardStmt *stmt, bool isTopLevel) +{ + switch (stmt->target) + { + case DISCARD_ALL: + DiscardAll(isTopLevel); + break; + + case DISCARD_PLANS: + ResetPlanCache(); + break; + + case DISCARD_SEQUENCES: + ResetSequenceCaches(); + break; + + case DISCARD_TEMP: + ResetTempTableNamespace(); + break; + + default: + elog(ERROR, "unrecognized DISCARD target: %d", stmt->target); + } +} + +static void +DiscardAll(bool isTopLevel) +{ + /* + * Disallow DISCARD ALL in a transaction block. This is arguably + * inconsistent (we don't make a similar check in the command sequence + * that DISCARD ALL is equivalent to), but the idea is to catch mistakes: + * DISCARD ALL inside a transaction block would leave the transaction + * still uncommitted. + */ + PreventInTransactionBlock(isTopLevel, "DISCARD ALL"); + + /* Closing portals might run user-defined code, so do that first. */ + PortalHashTableDeleteAll(); + SetPGVariable("session_authorization", NIL, false); + ResetAllOptions(); + DropAllPreparedStatements(); + Async_UnlistenAll(); + LockReleaseAll(USER_LOCKMETHOD, true); + ResetPlanCache(); + ResetTempTableNamespace(); + ResetSequenceCaches(); +} |