diff options
Diffstat (limited to 'src/backend/commands/discard.c')
-rw-r--r-- | src/backend/commands/discard.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/backend/commands/discard.c b/src/backend/commands/discard.c new file mode 100644 index 00000000000..d2ae6defd04 --- /dev/null +++ b/src/backend/commands/discard.c @@ -0,0 +1,71 @@ +/*------------------------------------------------------------------------- + * + * discard.c + * The implementation of the DISCARD command + * + * Copyright (c) 1996-2007, PostgreSQL Global Development Group + * + * + * IDENTIFICATION + * $PostgreSQL: pgsql/src/backend/commands/discard.c,v 1.1 2007/04/26 16:13:10 neilc Exp $ + * + *------------------------------------------------------------------------- + */ +#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/variable.h" +#include "utils/plancache.h" +#include "utils/portal.h" + +static void DiscardAll(bool isTopLevel); + +/* + * DISCARD { ALL | TEMP | PLANS } + */ +void +DiscardCommand(DiscardStmt *stmt, bool isTopLevel) +{ + switch (stmt->target) + { + case DISCARD_ALL: + DiscardAll(isTopLevel); + break; + + case DISCARD_PLANS: + ResetPlanCache(); + 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. + */ + PreventTransactionChain(isTopLevel, "DISCARD ALL"); + + SetPGVariable("session_authorization", NIL, false); + ResetAllOptions(); + DropAllPreparedStatements(); + PortalHashTableDeleteAll(); + Async_UnlistenAll(); + ResetPlanCache(); + ResetTempTableNamespace(); +} |