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:
@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user