From 8e9d69d6ac76001458f0c190a35990b23abf81de Mon Sep 17 00:00:00 2001 From: "Marc G. Fournier" Date: Tue, 25 Aug 1998 21:25:46 +0000 Subject: From: Massimo Dal Zotto > 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. --- src/backend/commands/sequence.c | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'src/backend/commands/sequence.c') diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index f28ec52b009..20f9bef503a 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -18,6 +19,7 @@ #include #include #include +#include #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) { -- cgit v1.2.3