Skip to content

Commit d90ced8

Browse files
committed
Add DISCARD SEQUENCES command.
DISCARD ALL will now discard cached sequence information, as well. Fabrízio de Royes Mello, reviewed by Zoltán Böszörményi, with some further tweaks by me.
1 parent c64e68f commit d90ced8

File tree

10 files changed

+53
-4
lines changed

10 files changed

+53
-4
lines changed

doc/src/sgml/ref/discard.sgml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ PostgreSQL documentation
2121

2222
<refsynopsisdiv>
2323
<synopsis>
24-
DISCARD { ALL | PLANS | TEMPORARY | TEMP }
24+
DISCARD { ALL | PLANS | SEQUENCES | TEMPORARY | TEMP }
2525
</synopsis>
2626
</refsynopsisdiv>
2727

@@ -66,6 +66,15 @@ DISCARD { ALL | PLANS | TEMPORARY | TEMP }
6666
</listitem>
6767
</varlistentry>
6868

69+
<varlistentry>
70+
<term><literal>SEQUENCES</literal></term>
71+
<listitem>
72+
<para>
73+
Discards all cached sequence values.
74+
</para>
75+
</listitem>
76+
</varlistentry>
77+
6978
<varlistentry>
7079
<term><literal>ALL</literal></term>
7180
<listitem>
@@ -83,6 +92,7 @@ UNLISTEN *;
8392
SELECT pg_advisory_unlock_all();
8493
DISCARD PLANS;
8594
DISCARD TEMP;
95+
DISCARD SEQUENCES;
8696
</programlisting></para>
8797
</listitem>
8898
</varlistentry>

src/backend/commands/discard.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@
1818
#include "commands/async.h"
1919
#include "commands/discard.h"
2020
#include "commands/prepare.h"
21+
#include "commands/sequence.h"
2122
#include "utils/guc.h"
2223
#include "utils/portal.h"
2324

2425
static void DiscardAll(bool isTopLevel);
2526

2627
/*
27-
* DISCARD { ALL | TEMP | PLANS }
28+
* DISCARD { ALL | SEQUENCES | TEMP | PLANS }
2829
*/
2930
void
3031
DiscardCommand(DiscardStmt *stmt, bool isTopLevel)
@@ -39,6 +40,10 @@ DiscardCommand(DiscardStmt *stmt, bool isTopLevel)
3940
ResetPlanCache();
4041
break;
4142

43+
case DISCARD_SEQUENCES:
44+
ResetSequenceCaches();
45+
break;
46+
4247
case DISCARD_TEMP:
4348
ResetTempTableNamespace();
4449
break;
@@ -69,4 +74,5 @@ DiscardAll(bool isTopLevel)
6974
LockReleaseAll(USER_LOCKMETHOD, true);
7075
ResetPlanCache();
7176
ResetTempTableNamespace();
77+
ResetSequenceCaches();
7278
}

src/backend/commands/sequence.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1602,3 +1602,19 @@ seq_redo(XLogRecPtr lsn, XLogRecord *record)
16021602

16031603
pfree(localpage);
16041604
}
1605+
1606+
/*
1607+
* Flush cached sequence information.
1608+
*/
1609+
void
1610+
ResetSequenceCaches(void)
1611+
{
1612+
SeqTableData *next;
1613+
1614+
while (seqtab != NULL)
1615+
{
1616+
next = seqtab->next;
1617+
free(seqtab);
1618+
seqtab = seqtab->next;
1619+
}
1620+
}

src/backend/parser/gram.y

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1674,7 +1674,7 @@ CheckPointStmt:
16741674

16751675
/*****************************************************************************
16761676
*
1677-
* DISCARD { ALL | TEMP | PLANS }
1677+
* DISCARD { ALL | TEMP | PLANS | SEQUENCES }
16781678
*
16791679
*****************************************************************************/
16801680

@@ -1703,6 +1703,13 @@ DiscardStmt:
17031703
n->target = DISCARD_PLANS;
17041704
$$ = (Node *) n;
17051705
}
1706+
| DISCARD SEQUENCES
1707+
{
1708+
DiscardStmt *n = makeNode(DiscardStmt);
1709+
n->target = DISCARD_SEQUENCES;
1710+
$$ = (Node *) n;
1711+
}
1712+
17061713
;
17071714

17081715

src/backend/tcop/utility.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2190,6 +2190,9 @@ CreateCommandTag(Node *parsetree)
21902190
case DISCARD_TEMP:
21912191
tag = "DISCARD TEMP";
21922192
break;
2193+
case DISCARD_SEQUENCES:
2194+
tag = "DISCARD SEQUENCES";
2195+
break;
21932196
default:
21942197
tag = "???";
21952198
}

src/bin/psql/tab-complete.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2378,7 +2378,7 @@ psql_completion(char *text, int start, int end)
23782378
else if (pg_strcasecmp(prev_wd, "DISCARD") == 0)
23792379
{
23802380
static const char *const list_DISCARD[] =
2381-
{"ALL", "PLANS", "TEMP", NULL};
2381+
{"ALL", "PLANS", "SEQUENCES", "TEMP", NULL};
23822382

23832383
COMPLETE_WITH_LIST(list_DISCARD);
23842384
}

src/include/commands/sequence.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ extern Datum pg_sequence_parameters(PG_FUNCTION_ARGS);
7474
extern Oid DefineSequence(CreateSeqStmt *stmt);
7575
extern Oid AlterSequence(AlterSeqStmt *stmt);
7676
extern void ResetSequence(Oid seq_relid);
77+
extern void ResetSequenceCaches(void);
7778

7879
extern void seq_redo(XLogRecPtr lsn, XLogRecord *rptr);
7980
extern void seq_desc(StringInfo buf, uint8 xl_info, char *rec);

src/include/nodes/parsenodes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2543,6 +2543,7 @@ typedef enum DiscardMode
25432543
{
25442544
DISCARD_ALL,
25452545
DISCARD_PLANS,
2546+
DISCARD_SEQUENCES,
25462547
DISCARD_TEMP
25472548
} DiscardMode;
25482549

src/test/regress/expected/sequence.out

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,9 @@ SELECT nextval('sequence_test'::text);
163163
99
164164
(1 row)
165165

166+
DISCARD SEQUENCES;
167+
SELECT currval('sequence_test'::regclass);
168+
ERROR: currval of sequence "sequence_test" is not yet defined in this session
166169
DROP SEQUENCE sequence_test;
167170
-- renaming sequences
168171
CREATE SEQUENCE foo_seq;

src/test/regress/sql/sequence.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ SELECT setval('sequence_test'::regclass, 32);
7272
SELECT nextval('sequence_test'::text);
7373
SELECT setval('sequence_test'::regclass, 99, false);
7474
SELECT nextval('sequence_test'::text);
75+
DISCARD SEQUENCES;
76+
SELECT currval('sequence_test'::regclass);
7577

7678
DROP SEQUENCE sequence_test;
7779

0 commit comments

Comments
 (0)