1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-08 11:42:09 +03:00

From: Massimo Dal Zotto <dz@cs.unitn.it>

> sequence.patch
>
>       adds the missing setval command to sequences. Owner of sequences
>       can now set the last value to any value between min and max
>       without recreating the sequence. This is useful after loading
>       data from external files.
This commit is contained in:
Marc G. Fournier
1998-08-25 21:25:46 +00:00
parent 88b17d9c56
commit 8e9d69d6ac
4 changed files with 60 additions and 5 deletions

View File

@ -9,6 +9,7 @@
#include <string.h>
#include <postgres.h>
#include <miscadmin.h>
#include <storage/bufmgr.h>
#include <storage/bufpage.h>
@ -18,6 +19,7 @@
#include <commands/creatinh.h>
#include <commands/sequence.h>
#include <utils/builtins.h>
#include <utils/acl.h>
#define SEQ_MAGIC 0x1717
@ -311,6 +313,52 @@ currval(struct varlena * seqin)
}
int4
setval(struct varlena * seqin, int4 next)
{
char *seqname = textout(seqin);
SeqTable elm;
Buffer buf;
SequenceTupleForm seq;
ItemPointerData iptr;
#ifndef NO_SECURITY
if (pg_aclcheck(seqname, getpgusername(), ACL_WR) != ACLCHECK_OK)
elog(ERROR, "%s.setval: you don't have permissions to set sequence %s",
seqname, seqname);
#endif
/* open and WIntentLock sequence */
elm = init_sequence ("setval", seqname);
seq = read_info ("setval", elm, &buf); /* lock page and read tuple */
if ( seq->cache_value != 1 ) {
elog (ERROR, "%s.setval: can't set value of sequence %s, cache != 1",
seqname, seqname);
}
if ((next < seq->min_value) || (next > seq->max_value)) {
elog (ERROR, "%s.setval: value %d is of of bounds (%d,%d)",
seqname, next, seq->min_value, seq->max_value);
}
/* save info in local cache */
elm->last = next; /* last returned number */
elm->cached = next; /* last cached number */
/* save info in sequence relation */
seq->last_value = next; /* last fetched number */
seq->is_called = 't';
if ( WriteBuffer (buf) == STATUS_ERROR )
elog (ERROR, "%s.settval: WriteBuffer failed", seqname);
ItemPointerSet(&iptr, 0, FirstOffsetNumber);
RelationUnsetSingleWLockPage (elm->rel, &iptr);
return (next);
}
static SequenceTupleForm
read_info(char *caller, SeqTable elm, Buffer *buf)
{