diff --git a/doc/src/sgml/ref/discard.sgml b/doc/src/sgml/ref/discard.sgml index 65ebbae..abd3e28 100644 --- a/doc/src/sgml/ref/discard.sgml +++ b/doc/src/sgml/ref/discard.sgml @@ -21,7 +21,7 @@ PostgreSQL documentation -DISCARD { ALL | PLANS | TEMPORARY | TEMP } +DISCARD { ALL | PLANS | SEQUENCES | TEMPORARY | TEMP } @@ -67,6 +67,15 @@ DISCARD { ALL | PLANS | TEMPORARY | TEMP } + SEQUENCES + + + Releases all internally cached sequences. + + + + + ALL @@ -83,6 +92,7 @@ UNLISTEN *; SELECT pg_advisory_unlock_all(); DISCARD PLANS; DISCARD TEMP; +DISCARD SEQUENCES; diff --git a/src/backend/commands/discard.c b/src/backend/commands/discard.c index 76f3ab6..7cd727e 100644 --- a/src/backend/commands/discard.c +++ b/src/backend/commands/discard.c @@ -18,6 +18,7 @@ #include "commands/async.h" #include "commands/discard.h" #include "commands/prepare.h" +#include "commands/sequence.h" #include "utils/guc.h" #include "utils/portal.h" @@ -39,6 +40,10 @@ DiscardCommand(DiscardStmt *stmt, bool isTopLevel) ResetPlanCache(); break; + case DISCARD_SEQUENCES: + ReleaseSequenceCaches(); + break; + case DISCARD_TEMP: ResetTempTableNamespace(); break; @@ -69,4 +74,5 @@ DiscardAll(bool isTopLevel) LockReleaseAll(USER_LOCKMETHOD, true); ResetPlanCache(); ResetTempTableNamespace(); + ReleaseSequenceCaches(); } diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index ff855d6..db2f317 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -1601,3 +1601,10 @@ seq_redo(XLogRecPtr lsn, XLogRecord *record) pfree(localpage); } + + +void +ReleaseSequenceCaches() +{ + free(seqtab); +} diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index ec69373..d056621 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -1672,7 +1672,7 @@ CheckPointStmt: /***************************************************************************** * - * DISCARD { ALL | TEMP | PLANS } + * DISCARD { ALL | TEMP | PLANS | SEQUENCES } * *****************************************************************************/ @@ -1701,6 +1701,13 @@ DiscardStmt: n->target = DISCARD_PLANS; $$ = (Node *) n; } + | DISCARD SEQUENCES + { + DiscardStmt *n = makeNode(DiscardStmt); + n->target = DISCARD_SEQUENCES; + $$ = (Node *) n; + } + ; diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 7d2c812..2dc8a8c 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -2374,7 +2374,7 @@ psql_completion(char *text, int start, int end) else if (pg_strcasecmp(prev_wd, "DISCARD") == 0) { static const char *const list_DISCARD[] = - {"ALL", "PLANS", "TEMP", NULL}; + {"ALL", "PLANS", "SEQUENCES", "TEMP", NULL}; COMPLETE_WITH_LIST(list_DISCARD); } diff --git a/src/include/commands/sequence.h b/src/include/commands/sequence.h index d867754..3698332 100644 --- a/src/include/commands/sequence.h +++ b/src/include/commands/sequence.h @@ -77,5 +77,6 @@ extern void ResetSequence(Oid seq_relid); extern void seq_redo(XLogRecPtr lsn, XLogRecord *rptr); extern void seq_desc(StringInfo buf, uint8 xl_info, char *rec); +extern void ReleaseSequenceCaches(); #endif /* SEQUENCE_H */ diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 2229ef0..2c0fda4 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -2494,6 +2494,7 @@ typedef enum DiscardMode { DISCARD_ALL, DISCARD_PLANS, + DISCARD_SEQUENCES, DISCARD_TEMP } DiscardMode;