subtest serial_rowid

statement ok
CREATE TABLE serial (
  a SERIAL PRIMARY KEY,
  b INT DEFAULT 7,
  c SERIAL,
  UNIQUE INDEX (c),
  FAMILY "primary" (a, b, c)
)

query TT
SHOW CREATE TABLE serial
----
serial  CREATE TABLE public.serial (
          a INT8 NOT NULL DEFAULT unique_rowid(),
          b INT8 NULL DEFAULT 7:::INT8,
          c INT8 NOT NULL DEFAULT unique_rowid(),
          CONSTRAINT serial_pkey PRIMARY KEY (a ASC),
          UNIQUE INDEX serial_c_key (c ASC)
        )

statement ok
INSERT INTO serial (a, b) VALUES (1, 2), (DEFAULT, DEFAULT), (DEFAULT, 3)

statement ok
INSERT INTO serial (b) VALUES (2)

query III
SELECT count(DISTINCT a), count(DISTINCT b), count(DISTINCT c) FROM serial
----
4 3 4

statement error multiple default values specified for column "a" of table "s1"
CREATE TABLE s1 (a SERIAL DEFAULT 7)

statement error conflicting NULL/NOT NULL declarations for column "a" of table "s1"
CREATE TABLE s1 (a SERIAL NULL)

statement ok
CREATE TABLE smallbig (
  a SMALLSERIAL, b BIGSERIAL, c INT,
  FAMILY "primary" (a, b, c, rowid)
)

statement ok
INSERT INTO smallbig (c) VALUES (7), (7)

query TT
SHOW CREATE TABLE smallbig
----
smallbig  CREATE TABLE public.smallbig (
            a INT8 NOT NULL DEFAULT unique_rowid(),
            b INT8 NOT NULL DEFAULT unique_rowid(),
            c INT8 NULL,
            rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),
            CONSTRAINT smallbig_pkey PRIMARY KEY (rowid ASC)
          )

query III
SELECT count(DISTINCT a), count(DISTINCT b), count(DISTINCT c) FROM smallbig
----
2 2 1

statement ok
CREATE TABLE serials (
  a SERIAL2, b SERIAL4, c SERIAL8, d INT,
  FAMILY "primary" (a, b, c, d, rowid)
)

query TT
SHOW CREATE TABLE serials
----
serials  CREATE TABLE public.serials (
           a INT8 NOT NULL DEFAULT unique_rowid(),
           b INT8 NOT NULL DEFAULT unique_rowid(),
           c INT8 NOT NULL DEFAULT unique_rowid(),
           d INT8 NULL,
           rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),
           CONSTRAINT serials_pkey PRIMARY KEY (rowid ASC)
         )

statement ok
INSERT INTO serials (d) VALUES (9), (9)

query III
SELECT count(DISTINCT a), count(DISTINCT b), count(DISTINCT c) FROM serials
----
2 2 2

statement ok
DROP TABLE serials, smallbig, serial


subtest serial_virtual_sequence

statement ok
SET serial_normalization = virtual_sequence

# Force the sequence for column "c" to bump to 2.
statement ok
CREATE SEQUENCE serial_c_seq; CREATE SEQUENCE serial_c_seq1

statement ok
CREATE TABLE serial (
  a SERIAL PRIMARY KEY,
  b INT DEFAULT 7,
  c SERIAL,
  UNIQUE INDEX (c),
  FAMILY "primary" (a, b, c)
)

query TT
SHOW CREATE TABLE serial
----
serial  CREATE TABLE public.serial (
          a INT8 NOT NULL DEFAULT nextval('public.serial_a_seq'::REGCLASS),
          b INT8 NULL DEFAULT 7:::INT8,
          c INT8 NOT NULL DEFAULT nextval('public.serial_c_seq2'::REGCLASS),
          CONSTRAINT serial_pkey PRIMARY KEY (a ASC),
          UNIQUE INDEX serial_c_key (c ASC)
        )

query TT
SHOW CREATE SEQUENCE serial_a_seq
----
serial_a_seq  CREATE SEQUENCE public.serial_a_seq MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1 VIRTUAL

statement ok
INSERT INTO serial (a, b) VALUES (1, 2), (DEFAULT, DEFAULT), (DEFAULT, 3)

statement ok
INSERT INTO serial (b) VALUES (2)

query III
SELECT count(DISTINCT a), count(DISTINCT b), count(DISTINCT c) FROM serial
----
4 3 4

statement error multiple default values specified for column "a" of table "s1"
CREATE TABLE s1 (a SERIAL DEFAULT 7)

statement error conflicting NULL/NOT NULL declarations for column "a" of table "s1"
CREATE TABLE s1 (a SERIAL NULL)

statement ok
CREATE TABLE smallbig (
  a SMALLSERIAL, b BIGSERIAL, c INT,
  FAMILY "primary" (a, b, c, rowid)
)

statement ok
INSERT INTO smallbig (c) VALUES (7), (7)

query TT
SHOW CREATE TABLE smallbig
----
smallbig  CREATE TABLE public.smallbig (
            a INT8 NOT NULL DEFAULT nextval('public.smallbig_a_seq'::REGCLASS),
            b INT8 NOT NULL DEFAULT nextval('public.smallbig_b_seq'::REGCLASS),
            c INT8 NULL,
            rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),
            CONSTRAINT smallbig_pkey PRIMARY KEY (rowid ASC)
          )

query III
SELECT count(DISTINCT a), count(DISTINCT b), count(DISTINCT c) FROM smallbig
----
2 2 1

statement ok
CREATE TABLE serials (
  a SERIAL2, b SERIAL4, c SERIAL8, d INT,
  FAMILY "primary" (a, b, c, d, rowid)
)

query TT
SHOW CREATE TABLE serials
----
serials  CREATE TABLE public.serials (
           a INT8 NOT NULL DEFAULT nextval('public.serials_a_seq'::REGCLASS),
           b INT8 NOT NULL DEFAULT nextval('public.serials_b_seq'::REGCLASS),
           c INT8 NOT NULL DEFAULT nextval('public.serials_c_seq'::REGCLASS),
           d INT8 NULL,
           rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),
           CONSTRAINT serials_pkey PRIMARY KEY (rowid ASC)
         )

statement ok
INSERT INTO serials (d) VALUES (9), (9)

query III
SELECT count(DISTINCT a), count(DISTINCT b), count(DISTINCT c) FROM serials
----
2 2 2

statement ok
DROP TABLE serials, smallbig, serial


subtest serial_sql_sequence

statement ok
SET serial_normalization = sql_sequence

statement ok
CREATE TABLE serial (
  a SERIAL PRIMARY KEY,
  b INT DEFAULT 7,
  c SERIAL,
  UNIQUE INDEX (c),
  FAMILY "primary" (a, b, c)
)

query TT
SHOW CREATE TABLE serial
----
serial  CREATE TABLE public.serial (
          a INT8 NOT NULL DEFAULT nextval('public.serial_a_seq'::REGCLASS),
          b INT8 NULL DEFAULT 7:::INT8,
          c INT8 NOT NULL DEFAULT nextval('public.serial_c_seq2'::REGCLASS),
          CONSTRAINT serial_pkey PRIMARY KEY (a ASC),
          UNIQUE INDEX serial_c_key (c ASC)
        )

query TT
SHOW CREATE SEQUENCE serial_a_seq
----
serial_a_seq  CREATE SEQUENCE public.serial_a_seq MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1

query TT
SELECT pg_get_serial_sequence('serial', 'a'), pg_get_serial_sequence('serial', 'b')
----
public.serial_a_seq  NULL

statement error relation "non_existent_tbl" does not exist
SELECT pg_get_serial_sequence('non_existent_tbl', 'a')

statement error column "non_existent_col" does not exist
SELECT pg_get_serial_sequence('serial', 'non_existent_col')

statement ok
create table serial_2 ("capITALS" SERIAL)

query T
SELECT pg_get_serial_sequence('serial_2', 'capITALS')
----
public."serial_2_capITALS_seq"

statement ok
create schema "schema-hyphen"

statement ok
create table "schema-hyphen"."Serial_3" ("capITALS" SERIAL)

query T
SELECT pg_get_serial_sequence('"schema-hyphen"."Serial_3"', 'capITALS')
----
"schema-hyphen"."Serial_3_capITALS_seq"

statement ok
INSERT INTO serial (a, b) VALUES (0, 2), (DEFAULT, DEFAULT), (DEFAULT, 3)

statement ok
INSERT INTO serial (b) VALUES (2)

query III
SELECT count(DISTINCT a), count(DISTINCT b), count(DISTINCT c) FROM serial
----
4  3  4

statement ok
CREATE TABLE "serial_MixedCase" (
  a SERIAL PRIMARY KEY,
  b INT DEFAULT 7,
  c SERIAL,
  UNIQUE INDEX (c),
  FAMILY "primary" (a, b, c)
)

query TT
SHOW CREATE TABLE "serial_MixedCase"
----
"serial_MixedCase"  CREATE TABLE public."serial_MixedCase" (
                      a INT8 NOT NULL DEFAULT nextval('public."serial_MixedCase_a_seq"'::REGCLASS),
                      b INT8 NULL DEFAULT 7:::INT8,
                      c INT8 NOT NULL DEFAULT nextval('public."serial_MixedCase_c_seq"'::REGCLASS),
                      CONSTRAINT "serial_MixedCase_pkey" PRIMARY KEY (a ASC),
                      UNIQUE INDEX "serial_MixedCase_c_key" (c ASC)
                    )

statement error multiple default values specified for column "a" of table "s1"
CREATE TABLE s1 (a SERIAL DEFAULT 7)

statement error conflicting NULL/NOT NULL declarations for column "a" of table "s1"
CREATE TABLE s1 (a SERIAL NULL)

statement ok
CREATE TABLE smallbig (
  a SMALLSERIAL, b BIGSERIAL, c INT,
  FAMILY "primary" (a, b, c, rowid)
)

statement ok
INSERT INTO smallbig (c) VALUES (7), (7)

query TT
SHOW CREATE TABLE smallbig
----
smallbig  CREATE TABLE public.smallbig (
            a INT2 NOT NULL DEFAULT nextval('public.smallbig_a_seq'::REGCLASS),
            b INT8 NOT NULL DEFAULT nextval('public.smallbig_b_seq'::REGCLASS),
            c INT8 NULL,
            rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),
            CONSTRAINT smallbig_pkey PRIMARY KEY (rowid ASC)
          )

query III
SELECT count(DISTINCT a), count(DISTINCT b), count(DISTINCT c) FROM smallbig
----
2 2 1

statement ok
CREATE TABLE serials (
  a SERIAL2, b SERIAL4, c SERIAL8, d INT,
  FAMILY "primary" (a, b, c, d, rowid)
)

query TT
SHOW CREATE TABLE serials
----
serials  CREATE TABLE public.serials (
           a INT2 NOT NULL DEFAULT nextval('public.serials_a_seq'::REGCLASS),
           b INT4 NOT NULL DEFAULT nextval('public.serials_b_seq'::REGCLASS),
           c INT8 NOT NULL DEFAULT nextval('public.serials_c_seq'::REGCLASS),
           d INT8 NULL,
           rowid INT8 NOT VISIBLE NOT NULL DEFAULT unique_rowid(),
           CONSTRAINT serials_pkey PRIMARY KEY (rowid ASC)
         )

statement ok
INSERT INTO serials (d) VALUES (9), (9)

query III
SELECT count(DISTINCT a), count(DISTINCT b), count(DISTINCT c) FROM serials
----
2 2 2

statement ok
DROP TABLE serials, smallbig, serial

# Verify that the sequence gets incremented to the default cache
# size of 256 and that serial values increase by 1 each time.
subtest serial_cached_sequence

statement ok
SET serial_normalization = sql_sequence_cached

statement ok
CREATE TABLE serial (
  cached SERIAL
);

statement ok
INSERT INTO serial (cached) VALUES (DEFAULT);

query I
SELECT cached from serial;
----
1

query T
SELECT pg_get_serial_sequence('serial', 'cached')
----
public.serial_cached_seq

query I
SELECT last_value from public.serial_cached_seq;
----
256

statement ok
INSERT INTO serial (cached) VALUES (DEFAULT);

query I
SELECT cached from serial ORDER BY cached;
----
1
2

query I
SELECT last_value from public.serial_cached_seq;
----
256

statement ok
DROP TABLE serial;

# Verify that the cache size for serial sequences can be changed
# from 256, the default, to 512.
subtest serial_cached_sequence_cluster_settings

statement ok
SET CLUSTER SETTING sql.defaults.serial_sequences_cache_size = 512;

statement ok
CREATE TABLE serial (
  cached512 SERIAL
);

statement ok
INSERT INTO serial (cached512) VALUES (DEFAULT);

query I
SELECT last_value from public.serial_cached512_seq;
----
512

statement ok
DROP TABLE serial;
