From 5b5c83f9e750fc0ae22f09d7be35b98a80233754 Mon Sep 17 00:00:00 2001
From: "Vadim B. Mikheev" <vadim4o@yahoo.com>
Date: Mon, 2 Jun 1997 11:22:52 +0000
Subject: [PATCH] Oracle like currval behaviour.

---
 src/backend/commands/sequence.c | 28 +++++++---------------------
 1 file changed, 7 insertions(+), 21 deletions(-)

diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index 7ebba3eace7..d737a8ca06d 100644
--- a/src/backend/commands/sequence.c
+++ b/src/backend/commands/sequence.c
@@ -204,6 +204,7 @@ nextval (struct varlena * seqin)
 
     /* open and WIntentLock sequence */
     elm = init_sequence ("nextval", seqname);
+    pfree (seqname);
     
     if ( elm->last != elm->cached )		/* some numbers were cached */
     {
@@ -237,7 +238,7 @@ nextval (struct varlena * seqin)
     	    	    break;		/* stop caching */
     	    	if ( seq->is_cycled != 't' )
     	    	    elog (WARN, "%s.nextval: got MAXVALUE (%d)", 
-    						seqname, maxv);
+    						elm->name, maxv);
 	    	next = minv;
 	    }
 	    else
@@ -252,7 +253,7 @@ nextval (struct varlena * seqin)
     	    	    break;		/* stop caching */
     	    	if ( seq->is_cycled != 't' )
     	    	    elog (WARN, "%s.nextval: got MINVALUE (%d)", 
-    						seqname, minv);
+    						elm->name, minv);
 	    	next = maxv;
 	    }
 	    else
@@ -287,34 +288,19 @@ currval (struct varlena * seqin)
 {
     char *seqname = textout(seqin);
     SeqTable elm;
-    Buffer buf;
-    SequenceTupleForm seq;
-    ItemPointerData iptr;
     int4 result;
 
     /* open and WIntentLock sequence */
     elm = init_sequence ("currval", seqname);
+    pfree (seqname);
     
-    if ( elm->last != elm->cached )	/* some numbers were cached */
+    if ( elm->increment == 0 )	/* nextval/read_info were not called */
     {
-    	return (elm->last);		/* return last returned by nextval */
+    	elog (WARN, "%s.currval is not yet defined in this session", elm->name);
     }
     
-    seq = read_info ("currval", elm, &buf);
-
-    if ( seq->is_called != 't' )
-    {
-    	elog (WARN, "%s.currval: yet undefined (%s.nextval never called)",
-    			seqname, seqname);
-    }
-    result = seq->last_value;
+    result = elm->last;
     
-    if ( ReleaseBuffer (buf) == STATUS_ERROR )
-    	elog (WARN, "%s.currval: ReleaseBuffer failed", seqname);
-
-    ItemPointerSet(&iptr, 0, FirstOffsetNumber);
-    RelationUnsetSingleWLockPage (elm->rel, &iptr);
-
     return (result);
     
 }
-- 
GitLab