From 17d933281a99fca122d1e7132dde67f5d3d40988 Mon Sep 17 00:00:00 2001 From: Robins Tharakan 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