Branch data Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * discard.c
4 : : * The implementation of the DISCARD command
5 : : *
6 : : * Copyright (c) 1996-2026, 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 : 5 : DiscardCommand(DiscardStmt *stmt, bool isTopLevel)
32 : : {
33 [ + - + + : 5 : switch (stmt->target)
- ]
34 : : {
35 : : case DISCARD_ALL:
36 : 1 : DiscardAll(isTopLevel);
37 : 1 : break;
38 : :
39 : : case DISCARD_PLANS:
40 : 0 : ResetPlanCache();
41 : 0 : break;
42 : :
43 : : case DISCARD_SEQUENCES:
44 : 2 : ResetSequenceCaches();
45 : 2 : break;
46 : :
47 : : case DISCARD_TEMP:
48 : 2 : ResetTempTableNamespace();
49 : 2 : break;
50 : :
51 : : default:
52 [ # # # # ]: 0 : elog(ERROR, "unrecognized DISCARD target: %d", stmt->target);
53 : 0 : }
54 : 5 : }
55 : :
56 : : static void
57 : 1 : 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 : 1 : PreventInTransactionBlock(isTopLevel, "DISCARD ALL");
67 : :
68 : : /* Closing portals might run user-defined code, so do that first. */
69 : 1 : PortalHashTableDeleteAll();
70 : 1 : SetPGVariable("session_authorization", NIL, false);
71 : 1 : ResetAllOptions();
72 : 1 : DropAllPreparedStatements();
73 : 1 : Async_UnlistenAll();
74 : 1 : LockReleaseAll(USER_LOCKMETHOD, true);
75 : 1 : ResetPlanCache();
76 : 1 : ResetTempTableNamespace();
77 : 1 : ResetSequenceCaches();
78 : 1 : }
|