From 17d933281a99fca122d1e7132dde67f5d3d40988 Mon Sep 17 00:00:00 2001
From: Robins Tharakan <robins@pobox.com>
Date: Sat, 16 Mar 2013 01:50:44 +0530
Subject: [PATCH] Add more regression tests for SEQUENCE

---
 src/test/regress/expected/sequence.out |  318 ++++++++++++++++++++++++++++++++
 src/test/regress/sql/sequence.sql      |  199 ++++++++++++++++++++
 2 files changed, 517 insertions(+)

diff --git a/src/test/regress/expected/sequence.out b/src/test/regress/expected/sequence.out
index 87feb08..38c8cb6 100644
--- a/src/test/regress/expected/sequence.out
+++ b/src/test/regress/expected/sequence.out
@@ -386,3 +386,321 @@ SELECT * FROM information_schema.sequences WHERE sequence_name IN
 
 DROP USER seq_user;
 DROP SEQUENCE seq;
+-- Test SEQUENCE tied to a field
+CREATE TABLE tbl_seq1 (f1 bigint, f2 bigint);
+CREATE SEQUENCE seq4 OWNED BY tbl_seq1.f1;
+ALTER TABLE tbl_seq1 DROP COLUMN f1;
+DROP TABLE tbl_seq1;
+-- Should fail since seq5 shouldn't exist
+DROP SEQUENCE seq5;
+ERROR:  sequence "seq5" does not exist
+-- Should fail, unlogged sequences are currently not supported
+CREATE TABLE tbl_seq2 (f1 bigint, f2 bigint);
+CREATE UNLOGGED SEQUENCE seq6 OWNED BY tbl_seq2.f1;
+ERROR:  unlogged sequences are not supported
+DROP TABLE tbl_seq2;
+-- non-OWNER should not be allowed to access SEQUENCE 
+CREATE SEQUENCE seq7;
+SELECT nextval('seq7');
+ nextval 
+---------
+       1
+(1 row)
+
+CREATE ROLE role_seq1;
+SET ROLE role_seq1;
+SELECT nextval('seq7');
+ERROR:  permission denied for sequence seq7
+SELECT currval('seq7');
+ERROR:  permission denied for sequence seq7
+SELECT setval('seq7', 10);
+ERROR:  permission denied for sequence seq7
+ALTER SEQUENCE seq7 OWNED BY NONE;
+ERROR:  must be owner of relation seq7
+SELECT * FROM seq7;
+ERROR:  permission denied for relation seq7
+RESET ROLE;
+DROP ROLE role_seq1;
+DROP SEQUENCE seq7;
+-- non-OWNER when allowed to create SEQUENCE on table, should by OWNED by tbl owner
+CREATE USER role_seq2;
+SET ROLE role_seq2;
+CREATE TABLE tbl_seq2 (f1 bigint);
+RESET ROLE;
+ALTER TABLE tbl_seq2 ADD COLUMN f2 bigserial;
+SET ROLE role_seq2;
+DROP TABLE tbl_seq2;
+RESET ROLE;
+DROP ROLE role_seq2;
+-- Should fail, Currval not yet defined in session
+CREATE SEQUENCE seq8;
+SELECT currval('seq8');
+ERROR:  currval of sequence "seq8" is not yet defined in this session
+DROP SEQUENCE seq8;
+-- Setval should work with valid values
+CREATE SEQUENCE seq9;
+SELECT setval('seq9', 10);
+ setval 
+--------
+     10
+(1 row)
+
+SELECT setval('seq9', 20, true);
+ setval 
+--------
+     20
+(1 row)
+
+SELECT setval('seq9', 30, false);
+ setval 
+--------
+     30
+(1 row)
+
+DROP SEQUENCE seq9;
+-- Should fail, setval beyond limits
+CREATE SEQUENCE seq10 MINVALUE 20 MAXVALUE 30;
+SELECT setval('seq10', 40);
+ERROR:  setval: value 40 is out of bounds for sequence "seq10" (20..30)
+SELECT setval('seq10', 10);
+ERROR:  setval: value 10 is out of bounds for sequence "seq10" (20..30)
+DROP SEQUENCE seq10;
+-- Should fail, trying a SEQUENCE function on a valid but non-SEQUENCE object
+CREATE TABLE tbl_seq3 (f1 bigint);
+SELECT nextval('tbl_seq3');
+ERROR:  "tbl_seq3" is not a sequence
+DROP TABLE tbl_seq3;
+-- Should fail, crosscheck min/max
+CREATE SEQUENCE seq11 MINVALUE 40 MAXVALUE 30;
+ERROR:  MINVALUE (40) must be less than MAXVALUE (30)
+CREATE SEQUENCE seq11 MINVALUE 40 MAXVALUE 20 INCREMENT BY -1;
+ERROR:  MINVALUE (40) must be less than MAXVALUE (20)
+-- Should fail, crosscheck START with min/max
+CREATE SEQUENCE seq12 START 20 MINVALUE 30 MAXVALUE 40;
+ERROR:  START value (20) cannot be less than MINVALUE (30)
+CREATE SEQUENCE seq12 START -50 MINVALUE -40 MAXVALUE -30 INCREMENT BY -1;
+ERROR:  START value (-50) cannot be less than MINVALUE (-40)
+CREATE SEQUENCE seq12 START 50 MINVALUE 30 MAXVALUE 40;
+ERROR:  START value (50) cannot be greater than MAXVALUE (40)
+CREATE SEQUENCE seq12 START -20 MINVALUE -40 MAXVALUE -30 INCREMENT BY -1;
+ERROR:  START value (-20) cannot be greater than MAXVALUE (-30)
+-- Should work, ensure valid START works with valid min/max
+CREATE SEQUENCE seq13 START 35 MINVALUE 30 MAXVALUE 40;
+DROP SEQUENCE seq13;
+CREATE SEQUENCE seq13 START -35 MINVALUE -40 MAXVALUE -30 INCREMENT BY -1;
+DROP SEQUENCE seq13;
+-- Should fail, crosscheck RESTART with min/max
+CREATE SEQUENCE seq14 RESTART 20 MINVALUE 30 MAXVALUE 40;
+ERROR:  RESTART value (20) cannot be less than MINVALUE (30)
+CREATE SEQUENCE seq14 RESTART -50 MINVALUE -40 MAXVALUE -30 INCREMENT BY -1;
+ERROR:  RESTART value (-50) cannot be less than MINVALUE (-40)
+CREATE SEQUENCE seq14 RESTART 50 MINVALUE 30 MAXVALUE 40;
+ERROR:  RESTART value (50) cannot be greater than MAXVALUE (40)
+CREATE SEQUENCE seq14 RESTART -20 MINVALUE -40 MAXVALUE -30 INCREMENT BY -1;
+ERROR:  RESTART value (-20) cannot be greater than MAXVALUE (-30)
+-- Should work, ensure valid RESTART works with valid min/max
+CREATE SEQUENCE seq15 RESTART 35 MINVALUE 30 MAXVALUE 40;
+DROP SEQUENCE seq15;
+CREATE SEQUENCE seq15 RESTART -35 MINVALUE -40 MAXVALUE -30 INCREMENT BY -1;
+DROP SEQUENCE seq15;
+-- Should fail, Invalid OWNED BY option
+CREATE TABLE tbl_seq4 (f1 bigint);
+CREATE SEQUENCE seq16 OWNED BY asdf;
+ERROR:  invalid OWNED BY option
+HINT:  Specify OWNED BY table.column or OWNED BY NONE.
+CREATE SEQUENCE seq16 OWNED BY tbl_seq4;
+ERROR:  invalid OWNED BY option
+HINT:  Specify OWNED BY table.column or OWNED BY NONE.
+CREATE SEQUENCE seq16 OWNED BY tbl_seq4.asdf;
+ERROR:  column "asdf" of relation "tbl_seq4" does not exist
+CREATE SEQUENCE seq16;
+CREATE SEQUENCE seq17 OWNED BY seq16.asdf;
+ERROR:  referenced relation "seq16" is not a table
+DROP SEQUENCE seq16;
+DROP TABLE tbl_seq4;
+-- Should fail, ensure table / sequence have same owner
+CREATE TABLE tbl_seq5 (f1 bigint);
+CREATE USER role_seq3;
+SET ROLE role_seq3;
+CREATE SEQUENCE seq18;
+ALTER SEQUENCE seq18 OWNED BY tbl_seq5.f1;
+ERROR:  sequence must have same owner as table it is linked to
+DROP SEQUENCE seq18;
+RESET ROLE;
+DROP ROLE role_seq3;
+DROP TABLE tbl_seq5;
+-- Should fail, ensure table / sequence have same schema
+CREATE TABLE tbl_seq6 (f1 bigint);
+CREATE SCHEMA schema_seq1;
+CREATE SEQUENCE schema_seq1.seq5;
+ALTER SEQUENCE schema_seq1.seq5 OWNED BY tbl_seq6.f1;
+ERROR:  sequence must be in same schema as table it is linked to
+DROP SEQUENCE schema_seq1.seq5;
+DROP SCHEMA schema_seq1;
+DROP TABLE tbl_seq6;
+-- Should fail, INCREMENT BY cannot be 0
+CREATE SEQUENCE seq19 INCREMENT BY 0;
+ERROR:  INCREMENT must not be zero
+-- Check MAXVALUE in ALTER SEQUENCE
+CREATE SEQUENCE seq20 MINVALUE 1 MAXVALUE 2;
+ALTER SEQUENCE seq20 MINVALUE 0;
+SELECT nextval('seq20');
+ nextval 
+---------
+       1
+(1 row)
+
+SELECT nextval('seq20');
+ nextval 
+---------
+       2
+(1 row)
+
+SELECT nextval('seq20');
+ERROR:  nextval: reached maximum value of sequence "seq20" (2)
+ALTER SEQUENCE seq20 MAXVALUE 3;
+SELECT nextval('seq20');
+ nextval 
+---------
+       3
+(1 row)
+
+DROP SEQUENCE seq20;
+-- Check MINVALUE in ALTER SEQUENCE
+CREATE SEQUENCE seq21 MINVALUE 1 MAXVALUE 2 INCREMENT -1;
+SELECT nextval('seq21');
+ nextval 
+---------
+       2
+(1 row)
+
+SELECT nextval('seq21');
+ nextval 
+---------
+       1
+(1 row)
+
+SELECT nextval('seq21');
+ERROR:  nextval: reached minimum value of sequence "seq21" (1)
+ALTER SEQUENCE seq21 MINVALUE 0;
+SELECT nextval('seq21');
+ nextval 
+---------
+       0
+(1 row)
+
+DROP SEQUENCE seq21;
+-- Should fail, Should not allow conflicting / Redundant options
+CREATE SEQUENCE seq22;
+ALTER SEQUENCE seq22 MAXVALUE 100 NO MAXVALUE;
+ERROR:  conflicting or redundant options
+ALTER SEQUENCE seq22 MINVALUE 100 NO MINVALUE;
+ERROR:  conflicting or redundant options
+ALTER SEQUENCE seq22 INCREMENT BY 1 INCREMENT BY -1;
+ERROR:  conflicting or redundant options
+ALTER SEQUENCE seq22 START 1 START 2;
+ERROR:  conflicting or redundant options
+ALTER SEQUENCE seq22 RESTART 1 RESTART 2;
+ERROR:  conflicting or redundant options
+ALTER SEQUENCE seq22 CACHE 1 CACHE 2;
+ERROR:  conflicting or redundant options
+ALTER SEQUENCE seq22 CYCLE NO CYCLE;
+ERROR:  conflicting or redundant options
+ALTER SEQUENCE seq22 OWNED BY NONE OWNED BY regression;
+ERROR:  conflicting or redundant options
+ALTER SEQUENCE seq22 asdf;
+ERROR:  syntax error at or near "asdf"
+LINE 1: ALTER SEQUENCE seq22 asdf;
+                             ^
+DROP SEQUENCE seq22;
+-- Check NO MINVALUE starts with 1
+CREATE SEQUENCE seq23 NO MINVALUE;
+ALTER SEQUENCE seq23 MINVALUE 1;
+SELECT nextval('seq23');
+ nextval 
+---------
+       1
+(1 row)
+
+DROP SEQUENCE seq23;
+-- Should work. Check that OWNED BY works as expected
+CREATE TABLE tbl_seq7 (f1 bigint);
+CREATE SEQUENCE seq24 OWNED BY tbl_seq7.f2;
+ERROR:  column "f2" of relation "tbl_seq7" does not exist
+CREATE SEQUENCE seq24 OWNED BY tbl_seq7.f1;
+ALTER SEQUENCE seq24 OWNED BY NONE;
+DROP TABLE tbl_seq7;
+DROP SEQUENCE seq24;
+-- Should fail, Invalid CACHE value
+CREATE SEQUENCE seq25 CACHE 0;
+ERROR:  CACHE (0) must be greater than zero
+-- Ensure correct MAXVALUE for descending sequence. Also check valid CACHE value
+CREATE SEQUENCE seq27 INCREMENT -1 MAXVALUE -2 CACHE 2;
+SELECT nextval('seq27');
+ nextval 
+---------
+      -2
+(1 row)
+
+SELECT nextval('seq27');
+ nextval 
+---------
+      -3
+(1 row)
+
+DROP SEQUENCE seq27;
+-- Should stop incr when INCREMENT 1, CACHE > 1, MAXVALUE < 0, near MAXVALUE
+CREATE SEQUENCE seq28 INCREMENT 1 CACHE 3 MINVALUE -2 MAXVALUE -1;
+SELECT nextval('seq28');
+ nextval 
+---------
+      -2
+(1 row)
+
+SELECT nextval('seq28');
+ nextval 
+---------
+      -1
+(1 row)
+
+SELECT nextval('seq28');
+ERROR:  nextval: reached maximum value of sequence "seq28" (-1)
+DROP SEQUENCE seq28;
+-- Should stop decr when INCREMENT -1, CACHE > 1, MINVALUE > 0, near MINVALUE
+CREATE SEQUENCE seq29 INCREMENT -1 CACHE 3 MINVALUE 1 MAXVALUE 2;
+SELECT nextval('seq29');
+ nextval 
+---------
+       2
+(1 row)
+
+SELECT nextval('seq29');
+ nextval 
+---------
+       1
+(1 row)
+
+SELECT nextval('seq29');
+ERROR:  nextval: reached minimum value of sequence "seq29" (1)
+DROP SEQUENCE seq29;
+-- Should cycle when CYCLE is SET
+CREATE SEQUENCE seq30 CYCLE INCREMENT -1 MINVALUE 1 MAXVALUE 2;
+SELECT nextval('seq30');
+ nextval 
+---------
+       2
+(1 row)
+
+SELECT nextval('seq30');
+ nextval 
+---------
+       1
+(1 row)
+
+SELECT nextval('seq30');
+ nextval 
+---------
+       2
+(1 row)
+
+DROP SEQUENCE seq30;
diff --git a/src/test/regress/sql/sequence.sql b/src/test/regress/sql/sequence.sql
index a32e049..c210095 100644
--- a/src/test/regress/sql/sequence.sql
+++ b/src/test/regress/sql/sequence.sql
@@ -182,3 +182,202 @@ SELECT * FROM information_schema.sequences WHERE sequence_name IN
 
 DROP USER seq_user;
 DROP SEQUENCE seq;
+
+-- Test SEQUENCE tied to a field
+CREATE TABLE tbl_seq1 (f1 bigint, f2 bigint);
+CREATE SEQUENCE seq4 OWNED BY tbl_seq1.f1;
+ALTER TABLE tbl_seq1 DROP COLUMN f1;
+DROP TABLE tbl_seq1;
+
+-- Should fail since seq5 shouldn't exist
+DROP SEQUENCE seq5;
+
+-- Should fail, unlogged sequences are currently not supported
+CREATE TABLE tbl_seq2 (f1 bigint, f2 bigint);
+CREATE UNLOGGED SEQUENCE seq6 OWNED BY tbl_seq2.f1;
+DROP TABLE tbl_seq2;
+
+-- non-OWNER should not be allowed to access SEQUENCE 
+CREATE SEQUENCE seq7;
+SELECT nextval('seq7');
+CREATE ROLE role_seq1;
+SET ROLE role_seq1;
+SELECT nextval('seq7');
+SELECT currval('seq7');
+SELECT setval('seq7', 10);
+ALTER SEQUENCE seq7 OWNED BY NONE;
+SELECT * FROM seq7;
+RESET ROLE;
+DROP ROLE role_seq1;
+DROP SEQUENCE seq7;
+
+-- non-OWNER when allowed to create SEQUENCE on table, should by OWNED by tbl owner
+CREATE USER role_seq2;
+SET ROLE role_seq2;
+CREATE TABLE tbl_seq2 (f1 bigint);
+RESET ROLE;
+ALTER TABLE tbl_seq2 ADD COLUMN f2 bigserial;
+SET ROLE role_seq2;
+DROP TABLE tbl_seq2;
+RESET ROLE;
+DROP ROLE role_seq2;
+
+-- Should fail, Currval not yet defined in session
+CREATE SEQUENCE seq8;
+SELECT currval('seq8');
+DROP SEQUENCE seq8;
+
+-- Setval should work with valid values
+CREATE SEQUENCE seq9;
+SELECT setval('seq9', 10);
+SELECT setval('seq9', 20, true);
+SELECT setval('seq9', 30, false);
+DROP SEQUENCE seq9;
+
+-- Should fail, setval beyond limits
+CREATE SEQUENCE seq10 MINVALUE 20 MAXVALUE 30;
+SELECT setval('seq10', 40);
+SELECT setval('seq10', 10);
+DROP SEQUENCE seq10;
+
+-- Should fail, trying a SEQUENCE function on a valid but non-SEQUENCE object
+CREATE TABLE tbl_seq3 (f1 bigint);
+SELECT nextval('tbl_seq3');
+DROP TABLE tbl_seq3;
+
+-- Should fail, crosscheck min/max
+CREATE SEQUENCE seq11 MINVALUE 40 MAXVALUE 30;
+CREATE SEQUENCE seq11 MINVALUE 40 MAXVALUE 20 INCREMENT BY -1;
+
+-- Should fail, crosscheck START with min/max
+CREATE SEQUENCE seq12 START 20 MINVALUE 30 MAXVALUE 40;
+CREATE SEQUENCE seq12 START -50 MINVALUE -40 MAXVALUE -30 INCREMENT BY -1;
+CREATE SEQUENCE seq12 START 50 MINVALUE 30 MAXVALUE 40;
+CREATE SEQUENCE seq12 START -20 MINVALUE -40 MAXVALUE -30 INCREMENT BY -1;
+
+-- Should work, ensure valid START works with valid min/max
+CREATE SEQUENCE seq13 START 35 MINVALUE 30 MAXVALUE 40;
+DROP SEQUENCE seq13;
+CREATE SEQUENCE seq13 START -35 MINVALUE -40 MAXVALUE -30 INCREMENT BY -1;
+DROP SEQUENCE seq13;
+
+-- Should fail, crosscheck RESTART with min/max
+CREATE SEQUENCE seq14 RESTART 20 MINVALUE 30 MAXVALUE 40;
+CREATE SEQUENCE seq14 RESTART -50 MINVALUE -40 MAXVALUE -30 INCREMENT BY -1;
+CREATE SEQUENCE seq14 RESTART 50 MINVALUE 30 MAXVALUE 40;
+CREATE SEQUENCE seq14 RESTART -20 MINVALUE -40 MAXVALUE -30 INCREMENT BY -1;
+
+-- Should work, ensure valid RESTART works with valid min/max
+CREATE SEQUENCE seq15 RESTART 35 MINVALUE 30 MAXVALUE 40;
+DROP SEQUENCE seq15;
+CREATE SEQUENCE seq15 RESTART -35 MINVALUE -40 MAXVALUE -30 INCREMENT BY -1;
+DROP SEQUENCE seq15;
+
+-- Should fail, Invalid OWNED BY option
+CREATE TABLE tbl_seq4 (f1 bigint);
+CREATE SEQUENCE seq16 OWNED BY asdf;
+CREATE SEQUENCE seq16 OWNED BY tbl_seq4;
+CREATE SEQUENCE seq16 OWNED BY tbl_seq4.asdf;
+CREATE SEQUENCE seq16;
+CREATE SEQUENCE seq17 OWNED BY seq16.asdf;
+DROP SEQUENCE seq16;
+DROP TABLE tbl_seq4;
+
+-- Should fail, ensure table / sequence have same owner
+CREATE TABLE tbl_seq5 (f1 bigint);
+CREATE USER role_seq3;
+SET ROLE role_seq3;
+CREATE SEQUENCE seq18;
+ALTER SEQUENCE seq18 OWNED BY tbl_seq5.f1;
+DROP SEQUENCE seq18;
+RESET ROLE;
+DROP ROLE role_seq3;
+DROP TABLE tbl_seq5;
+
+-- Should fail, ensure table / sequence have same schema
+CREATE TABLE tbl_seq6 (f1 bigint);
+CREATE SCHEMA schema_seq1;
+CREATE SEQUENCE schema_seq1.seq5;
+ALTER SEQUENCE schema_seq1.seq5 OWNED BY tbl_seq6.f1;
+DROP SEQUENCE schema_seq1.seq5;
+DROP SCHEMA schema_seq1;
+DROP TABLE tbl_seq6;
+
+-- Should fail, INCREMENT BY cannot be 0
+CREATE SEQUENCE seq19 INCREMENT BY 0;
+
+-- Check MAXVALUE in ALTER SEQUENCE
+CREATE SEQUENCE seq20 MINVALUE 1 MAXVALUE 2;
+ALTER SEQUENCE seq20 MINVALUE 0;
+SELECT nextval('seq20');
+SELECT nextval('seq20');
+SELECT nextval('seq20');
+ALTER SEQUENCE seq20 MAXVALUE 3;
+SELECT nextval('seq20');
+DROP SEQUENCE seq20;
+
+-- Check MINVALUE in ALTER SEQUENCE
+CREATE SEQUENCE seq21 MINVALUE 1 MAXVALUE 2 INCREMENT -1;
+SELECT nextval('seq21');
+SELECT nextval('seq21');
+SELECT nextval('seq21');
+ALTER SEQUENCE seq21 MINVALUE 0;
+SELECT nextval('seq21');
+DROP SEQUENCE seq21;
+
+-- Should fail, Should not allow conflicting / Redundant options
+CREATE SEQUENCE seq22;
+ALTER SEQUENCE seq22 MAXVALUE 100 NO MAXVALUE;
+ALTER SEQUENCE seq22 MINVALUE 100 NO MINVALUE;
+ALTER SEQUENCE seq22 INCREMENT BY 1 INCREMENT BY -1;
+ALTER SEQUENCE seq22 START 1 START 2;
+ALTER SEQUENCE seq22 RESTART 1 RESTART 2;
+ALTER SEQUENCE seq22 CACHE 1 CACHE 2;
+ALTER SEQUENCE seq22 CYCLE NO CYCLE;
+ALTER SEQUENCE seq22 OWNED BY NONE OWNED BY regression;
+ALTER SEQUENCE seq22 asdf;
+DROP SEQUENCE seq22;
+
+-- Check NO MINVALUE starts with 1
+CREATE SEQUENCE seq23 NO MINVALUE;
+ALTER SEQUENCE seq23 MINVALUE 1;
+SELECT nextval('seq23');
+DROP SEQUENCE seq23;
+
+-- Should work. Check that OWNED BY works as expected
+CREATE TABLE tbl_seq7 (f1 bigint);
+CREATE SEQUENCE seq24 OWNED BY tbl_seq7.f2;
+CREATE SEQUENCE seq24 OWNED BY tbl_seq7.f1;
+ALTER SEQUENCE seq24 OWNED BY NONE;
+DROP TABLE tbl_seq7;
+DROP SEQUENCE seq24;
+
+-- Should fail, Invalid CACHE value
+CREATE SEQUENCE seq25 CACHE 0;
+
+-- Ensure correct MAXVALUE for descending sequence. Also check valid CACHE value
+CREATE SEQUENCE seq27 INCREMENT -1 MAXVALUE -2 CACHE 2;
+SELECT nextval('seq27');
+SELECT nextval('seq27');
+DROP SEQUENCE seq27;
+
+-- Should stop incr when INCREMENT 1, CACHE > 1, MAXVALUE < 0, near MAXVALUE
+CREATE SEQUENCE seq28 INCREMENT 1 CACHE 3 MINVALUE -2 MAXVALUE -1;
+SELECT nextval('seq28');
+SELECT nextval('seq28');
+SELECT nextval('seq28');
+DROP SEQUENCE seq28;
+
+-- Should stop decr when INCREMENT -1, CACHE > 1, MINVALUE > 0, near MINVALUE
+CREATE SEQUENCE seq29 INCREMENT -1 CACHE 3 MINVALUE 1 MAXVALUE 2;
+SELECT nextval('seq29');
+SELECT nextval('seq29');
+SELECT nextval('seq29');
+DROP SEQUENCE seq29;
+
+-- Should cycle when CYCLE is SET
+CREATE SEQUENCE seq30 CYCLE INCREMENT -1 MINVALUE 1 MAXVALUE 2;
+SELECT nextval('seq30');
+SELECT nextval('seq30');
+SELECT nextval('seq30');
+DROP SEQUENCE seq30;
-- 
1.7.10.4

