From 6fec21609b814210cee4f22813e524893b85b6b0 Mon Sep 17 00:00:00 2001
From: Philip Warner <pjw@rhyme.com.au>
Date: Wed, 11 Oct 2000 15:31:34 +0000
Subject: [PATCH] Added new SQL function setval(seq,val,bool) to restore
 is_called as well as value (will be used in a future pg_dump).

---
 src/backend/commands/sequence.c | 34 +++++++++++++++++++++++++++------
 src/include/catalog/pg_proc.h   |  4 +++-
 src/include/commands/sequence.h |  1 +
 3 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index d623c0630e0..56763a35a17 100644
--- a/src/backend/commands/sequence.c
+++ b/src/backend/commands/sequence.c
@@ -61,6 +61,7 @@ static SeqTable init_sequence(char *caller, char *name);
 static Form_pg_sequence read_info(char *caller, SeqTable elm, Buffer *buf);
 static void init_params(CreateSeqStmt *seq, Form_pg_sequence new);
 static int	get_param(DefElem *def);
+static void do_setval(char *seqname, int32 next, char iscalled);
 
 /*
  * DefineSequence
@@ -317,12 +318,9 @@ currval(PG_FUNCTION_ARGS)
 	PG_RETURN_INT32(result);
 }
 
-Datum
-setval(PG_FUNCTION_ARGS)
+static void 
+do_setval(char *seqname, int32 next, bool iscalled)
 {
-	text	   *seqin = PG_GETARG_TEXT_P(0);
-	int32		next = PG_GETARG_INT32(1);
-	char	   *seqname = get_seq_name(seqin);
 	SeqTable	elm;
 	Buffer		buf;
 	Form_pg_sequence seq;
@@ -356,7 +354,7 @@ setval(PG_FUNCTION_ARGS)
 
 	/* save info in sequence relation */
 	seq->last_value = next;		/* last fetched number */
-	seq->is_called = 't';
+	seq->is_called = iscalled ? 't' : 'f';
 
 	LockBuffer(buf, BUFFER_LOCK_UNLOCK);
 
@@ -365,6 +363,30 @@ setval(PG_FUNCTION_ARGS)
 
 	pfree(seqname);
 
+}
+
+Datum
+setval(PG_FUNCTION_ARGS)
+{
+	text	   *seqin = PG_GETARG_TEXT_P(0);
+	int32		next = PG_GETARG_INT32(1);
+	char	   *seqname = get_seq_name(seqin);
+
+	do_setval(seqname, next, true);
+
+	PG_RETURN_INT32(next);
+}
+
+Datum
+setval_and_iscalled(PG_FUNCTION_ARGS)
+{
+	text	   *seqin = PG_GETARG_TEXT_P(0);
+	int32		next = PG_GETARG_INT32(1);
+	bool		iscalled = PG_GETARG_BOOL(2);
+	char	   *seqname = get_seq_name(seqin);
+
+	do_setval(seqname, next, iscalled);
+
 	PG_RETURN_INT32(next);
 }
 
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 920aaa442d0..66ffa87e473 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_proc.h,v 1.168 2000/09/25 12:58:47 momjian Exp $
+ * $Id: pg_proc.h,v 1.169 2000/10/11 15:31:13 pjw Exp $
  *
  * NOTES
  *	  The script catalog/genbki.sh reads this file and generates .bki
@@ -1978,6 +1978,8 @@ DATA(insert OID = 1575 (  currval			PGUID 12 f t f t 1 f 23 "25" 100 0 0 100	cur
 DESCR("sequence current value");
 DATA(insert OID = 1576 (  setval			PGUID 12 f t f t 2 f 23 "25 23" 100 0 0 100  setval - ));
 DESCR("set sequence value");
+DATA(insert OID = 1765 (  setval            PGUID 12 f t f t 3 f 23 "25 23 16" 100 0 0 100  setval_and_iscalled - ));
+DESCR("set sequence value and iscalled status");
 
 DATA(insert OID = 1579 (  varbit_in			PGUID 12 f t t t 1 f 1562 "0" 100 0 0 100  varbit_in - ));
 DESCR("(internal)");
diff --git a/src/include/commands/sequence.h b/src/include/commands/sequence.h
index 4d1f846fa9a..0429d229532 100644
--- a/src/include/commands/sequence.h
+++ b/src/include/commands/sequence.h
@@ -30,6 +30,7 @@
 extern Datum nextval(PG_FUNCTION_ARGS);
 extern Datum currval(PG_FUNCTION_ARGS);
 extern Datum setval(PG_FUNCTION_ARGS);
+extern Datum setval_and_iscalled(PG_FUNCTION_ARGS);
 
 extern void DefineSequence(CreateSeqStmt *stmt);
 extern void CloseSequences(void);
-- 
GitLab