# see also file `sequences`

statement ok
GRANT admin TO testuser

user testuser

statement ok
CREATE SEQUENCE foo

query I
SELECT nextval('foo')
----
1

query I
SELECT nextval('foo')
----
2

statement ok
ALTER SEQUENCE foo INCREMENT BY 5

query I
SELECT nextval('foo')
----
7

statement ok
ALTER SEQUENCE foo CACHE 100

query I
SELECT nextval('foo');
----
12

user root

query I
SELECT nextval('foo');
----
512

user testuser

query I
SELECT nextval('foo');
----
17

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE foo]
----
CREATE SEQUENCE public.foo MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 5 START 1 CACHE 100

statement ok
ALTER SEQUENCE foo CACHE 1

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE foo]
----
CREATE SEQUENCE public.foo MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 5 START 1

user root

# Alter between sequences, check it is ok.
statement ok
CREATE SEQUENCE seq_as AS int2

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_as]
----
CREATE SEQUENCE public.seq_as AS INT2 MINVALUE 1 MAXVALUE 32767 INCREMENT 1 START 1

statement ok
ALTER SEQUENCE seq_as AS int4

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_as]
----
CREATE SEQUENCE public.seq_as AS INT4 MINVALUE 1 MAXVALUE 2147483647 INCREMENT 1 START 1

statement ok
ALTER SEQUENCE seq_as AS int8

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_as]
----
CREATE SEQUENCE public.seq_as AS INT8 MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1

statement ok
ALTER SEQUENCE seq_as AS int4

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_as]
----
CREATE SEQUENCE public.seq_as AS INT4 MINVALUE 1 MAXVALUE 2147483647 INCREMENT 1 START 1

statement ok
ALTER SEQUENCE seq_as AS int2

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_as]
----
CREATE SEQUENCE public.seq_as AS INT2 MINVALUE 1 MAXVALUE 32767 INCREMENT 1 START 1

# Test ALTER SEQUENCE AS when downgrading sizes behaves appropriately if MINVALUE/MAXVALUE/START is set.

statement ok
CREATE SEQUENCE seq_int4_max_high AS int4 MAXVALUE 99999

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_int4_max_high]
----
CREATE SEQUENCE public.seq_int4_max_high AS INT4 MINVALUE 1 MAXVALUE 99999 INCREMENT 1 START 1

statement error MAXVALUE \(99999\) must be less than \(32767\) for type INT2
ALTER SEQUENCE seq_int4_max_high AS int2

statement ok
ALTER SEQUENCE seq_int4_max_high AS int8

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_int4_max_high]
----
CREATE SEQUENCE public.seq_int4_max_high AS INT8 MINVALUE 1 MAXVALUE 99999 INCREMENT 1 START 1

statement ok
CREATE SEQUENCE seq_int4_min_high AS int4 MINVALUE 99999

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_int4_min_high]
----
CREATE SEQUENCE public.seq_int4_min_high AS INT4 MINVALUE 99999 MAXVALUE 2147483647 INCREMENT 1 START 99999

statement error MINVALUE \(99999\) must be less than \(32767\) for type INT2
ALTER SEQUENCE seq_int4_min_high AS int2

statement ok
ALTER SEQUENCE seq_int4_min_high AS int8

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_int4_min_high]
----
CREATE SEQUENCE public.seq_int4_min_high AS INT8 MINVALUE 99999 MAXVALUE 9223372036854775807 INCREMENT 1 START 99999

statement ok
CREATE SEQUENCE seq_int4_start_high AS int4 START 99999

statement error START value \(99999\) cannot be greater than MAXVALUE \(32767\)
ALTER SEQUENCE seq_int4_start_high AS int2

statement ok
ALTER SEQUENCE seq_int4_start_high AS int8

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_int4_start_high]
----
CREATE SEQUENCE public.seq_int4_start_high AS INT8 MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 99999

statement ok
CREATE SEQUENCE seq_int4_min_low AS int4 MINVALUE -99999

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_int4_min_low]
----
CREATE SEQUENCE public.seq_int4_min_low AS INT4 MINVALUE -99999 MAXVALUE 2147483647 INCREMENT 1 START -99999

statement error MINVALUE \(-99999\) must be greater than \(-32768\) for type INT2
ALTER SEQUENCE seq_int4_min_low AS int2

statement ok
ALTER SEQUENCE seq_int4_min_low AS int8

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_int4_min_low]
----
CREATE SEQUENCE public.seq_int4_min_low AS INT8 MINVALUE -99999 MAXVALUE 9223372036854775807 INCREMENT 1 START -99999

statement ok
CREATE SEQUENCE seq_int4_max_high_desc AS int4 MAXVALUE 99999 INCREMENT -1

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_int4_max_high_desc]
----
CREATE SEQUENCE public.seq_int4_max_high_desc AS INT4 MINVALUE -2147483648 MAXVALUE 99999 INCREMENT -1 START 99999

statement error MAXVALUE \(99999\) must be less than \(32767\) for type INT2
ALTER SEQUENCE seq_int4_max_high_desc AS int2

statement ok
ALTER SEQUENCE seq_int4_max_high_desc AS int8

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_int4_max_high_desc]
----
CREATE SEQUENCE public.seq_int4_max_high_desc AS INT8 MINVALUE -9223372036854775808 MAXVALUE 99999 INCREMENT -1 START 99999

statement ok
CREATE SEQUENCE seq_int4_min_high_desc AS int4 MINVALUE -99999 INCREMENT -1

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_int4_min_high_desc]
----
CREATE SEQUENCE public.seq_int4_min_high_desc AS INT4 MINVALUE -99999 MAXVALUE -1 INCREMENT -1 START -1

statement error MINVALUE \(-99999\) must be greater than \(-32768\) for type INT2
ALTER SEQUENCE seq_int4_min_high_desc AS int2

statement ok
ALTER SEQUENCE seq_int4_min_high_desc AS int8

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE seq_int4_min_high_desc]
----
CREATE SEQUENCE public.seq_int4_min_high_desc AS INT8 MINVALUE -99999 MAXVALUE -1 INCREMENT -1 START -1

statement ok
CREATE SEQUENCE reverse_direction_seqas AS integer;
ALTER SEQUENCE reverse_direction_seqas AS smallint INCREMENT -1

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE reverse_direction_seqas]
----
CREATE SEQUENCE public.reverse_direction_seqas AS INT2 MINVALUE 1 MAXVALUE 32767 INCREMENT -1 START 1

statement ok
ALTER SEQUENCE reverse_direction_seqas AS int INCREMENT 1

query T
SELECT create_statement FROM [SHOW CREATE SEQUENCE reverse_direction_seqas]
----
CREATE SEQUENCE public.reverse_direction_seqas AS INT8 MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1

statement ok
CREATE SEQUENCE restart_seq START WITH 5

query I
select nextval('restart_seq')
----
5

statement ok
ALTER SEQUENCE restart_seq RESTART 1

query I
select nextval('restart_seq')
----
1

statement ok
ALTER SEQUENCE restart_seq RESTART

query I
select nextval('restart_seq')
----
5

# If we alter the sequence using both START WITH and RESTART, the nextval should
# be the RESTART value. Restarting again without specifying a value should change it to the START value.

statement ok
ALTER SEQUENCE restart_seq START WITH 3 RESTART 11

query I
select nextval('restart_seq')
----
11

statement ok
ALTER SEQUENCE restart_seq RESTART

query I
select nextval('restart_seq')
----
3

statement ok
CREATE SEQUENCE restart_min_err_seqas MINVALUE 1

statement error RESTART value \(0\) cannot be less than MINVALUE \(1\)
ALTER SEQUENCE restart_min_err_seqas RESTART 0

statement ok
CREATE SEQUENCE restart_max_err_seqas MAXVALUE 100

statement error RESTART value \(1000\) cannot be greater than MAXVALUE \(100\)
ALTER SEQUENCE restart_max_err_seqas RESTART 1000


statement ok
CREATE SEQUENCE set_no_maxvalue MAXVALUE 3

query III
select nextval('set_no_maxvalue'),nextval('set_no_maxvalue'),nextval('set_no_maxvalue')
----
1  2  3

statement error pgcode 2200H pq: nextval\(\): reached maximum value of sequence "set_no_maxvalue" \(3\)
select nextval('set_no_maxvalue')

statement ok
ALTER SEQUENCE set_no_maxvalue NO MAXVALUE

query I
select nextval('set_no_maxvalue')
----
4

statement ok
CREATE SEQUENCE set_no_minvalue INCREMENT -1 MINVALUE -3;

query III
select nextval('set_no_minvalue'),nextval('set_no_minvalue'),nextval('set_no_minvalue')
----
-1  -2  -3

statement error pgcode 2200H pq: nextval\(\): reached minimum value of sequence "set_no_minvalue" \(-3\)
select nextval('set_no_minvalue')

statement ok
ALTER SEQUENCE set_no_minvalue NO MINVALUE

query I
select nextval('set_no_minvalue')
----
-4


statement ok
CREATE SEQUENCE seq_inverse_no_change;

statement ok
ALTER SEQUENCE seq_inverse_no_change INCREMENT BY -1;

query TT colnames
SHOW CREATE SEQUENCE seq_inverse_no_change;
----
table_name             create_statement
seq_inverse_no_change  CREATE SEQUENCE public.seq_inverse_no_change MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT -1 START 1

statement ok
ALTER SEQUENCE seq_inverse_no_change INCREMENT BY 1;

query TT colnames
SHOW CREATE SEQUENCE seq_inverse_no_change;
----
table_name             create_statement
seq_inverse_no_change  CREATE SEQUENCE public.seq_inverse_no_change MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1


statement ok
CREATE SEQUENCE seq_change_type_bounds MINVALUE -9223372036854775808 MAXVALUE 9223372036854775807 START 0

statement ok
ALTER SEQUENCE seq_change_type_bounds AS smallint;

query TT colnames
SHOW CREATE SEQUENCE seq_change_type_bounds;
----
table_name              create_statement
seq_change_type_bounds  CREATE SEQUENCE public.seq_change_type_bounds AS INT2 MINVALUE -32768 MAXVALUE 32767 INCREMENT 1 START 0

statement ok
ALTER SEQUENCE seq_change_type_bounds AS integer;

query TT colnames
SHOW CREATE SEQUENCE seq_change_type_bounds;
----
table_name              create_statement
seq_change_type_bounds  CREATE SEQUENCE public.seq_change_type_bounds AS INT8 MINVALUE -9223372036854775808 MAXVALUE 9223372036854775807 INCREMENT 1 START 0


statement ok
CREATE SEQUENCE seq_alter_no_min_max_asc INCREMENT 1 START 5 MINVALUE -10 MAXVALUE 10;

statement ok
ALTER SEQUENCE seq_alter_no_min_max_asc NO MINVALUE NO MAXVALUE;

query TT colnames
SHOW CREATE SEQUENCE seq_alter_no_min_max_asc;
----
table_name                create_statement
seq_alter_no_min_max_asc  CREATE SEQUENCE public.seq_alter_no_min_max_asc MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 5


statement ok
CREATE SEQUENCE seq_alter_no_min_max_des INCREMENT -1 START -5 MINVALUE -10 MAXVALUE 10 ;

statement ok
ALTER SEQUENCE seq_alter_no_min_max_des NO MINVALUE NO MAXVALUE ;

query TT colnames
SHOW CREATE SEQUENCE seq_alter_no_min_max_des
----
table_name                create_statement
seq_alter_no_min_max_des  CREATE SEQUENCE public.seq_alter_no_min_max_des MINVALUE -9223372036854775808 MAXVALUE -1 INCREMENT -1 START -5
