Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * discard.c 4 : * The implementation of the DISCARD command 5 : * 6 : * Copyright (c) 1996-2024, PostgreSQL Global Development Group 7 : * 8 : * 9 : * IDENTIFICATION 10 : * src/backend/commands/discard.c 11 : * 12 : *------------------------------------------------------------------------- 13 : */ 14 : #include "postgres.h" 15 : 16 : #include "access/xact.h" 17 : #include "catalog/namespace.h" 18 : #include "commands/async.h" 19 : #include "commands/discard.h" 20 : #include "commands/prepare.h" 21 : #include "commands/sequence.h" 22 : #include "utils/guc.h" 23 : #include "utils/portal.h" 24 : 25 : static void DiscardAll(bool isTopLevel); 26 : 27 : /* 28 : * DISCARD { ALL | SEQUENCES | TEMP | PLANS } 29 : */ 30 : void 31 30 : DiscardCommand(DiscardStmt *stmt, bool isTopLevel) 32 : { 33 30 : switch (stmt->target) 34 : { 35 6 : case DISCARD_ALL: 36 6 : DiscardAll(isTopLevel); 37 6 : break; 38 : 39 4 : case DISCARD_PLANS: 40 4 : ResetPlanCache(); 41 4 : break; 42 : 43 12 : case DISCARD_SEQUENCES: 44 12 : ResetSequenceCaches(); 45 12 : break; 46 : 47 8 : case DISCARD_TEMP: 48 8 : ResetTempTableNamespace(); 49 8 : break; 50 : 51 0 : default: 52 0 : elog(ERROR, "unrecognized DISCARD target: %d", stmt->target); 53 : } 54 30 : } 55 : 56 : static void 57 6 : DiscardAll(bool isTopLevel) 58 : { 59 : /* 60 : * Disallow DISCARD ALL in a transaction block. This is arguably 61 : * inconsistent (we don't make a similar check in the command sequence 62 : * that DISCARD ALL is equivalent to), but the idea is to catch mistakes: 63 : * DISCARD ALL inside a transaction block would leave the transaction 64 : * still uncommitted. 65 : */ 66 6 : PreventInTransactionBlock(isTopLevel, "DISCARD ALL"); 67 : 68 : /* Closing portals might run user-defined code, so do that first. */ 69 6 : PortalHashTableDeleteAll(); 70 6 : SetPGVariable("session_authorization", NIL, false); 71 6 : ResetAllOptions(); 72 6 : DropAllPreparedStatements(); 73 6 : Async_UnlistenAll(); 74 6 : LockReleaseAll(USER_LOCKMETHOD, true); 75 6 : ResetPlanCache(); 76 6 : ResetTempTableNamespace(); 77 6 : ResetSequenceCaches(); 78 6 : }