/*------------------------------------------------------------------------- * * discard.c * The implementation of the DISCARD command * * Copyright (c) 1996-2010, PostgreSQL Global Development Group * * * IDENTIFICATION * $PostgreSQL: pgsql/src/backend/commands/discard.c,v 1.7 2010/01/02 16:57:37 momjian 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(); LockReleaseAll(USER_LOCKMETHOD, true); ResetPlanCache(); ResetTempTableNamespace(); }