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