statement ok
CREATE DATABASE db

statement ok
COMMENT ON DATABASE db IS 'A'

query TTTTTTT colnames,rowsort
SHOW DATABASES WITH COMMENT
----
database_name  owner  primary_region  secondary_region  regions  survival_goal  comment
db             root   NULL            NULL              {}       NULL           A
defaultdb      root   NULL            NULL              {}       NULL           NULL
postgres       root   NULL            NULL              {}       NULL           NULL
system         node   NULL            NULL              {}       NULL           NULL
test           root   NULL            NULL              {}       NULL           NULL

statement ok
COMMENT ON DATABASE db IS 'AAA'

query TTTTTTT colnames,rowsort
SHOW DATABASES WITH COMMENT
----
database_name  owner  primary_region  secondary_region  regions  survival_goal  comment
db             root   NULL            NULL              {}       NULL           AAA
defaultdb      root   NULL            NULL              {}       NULL           NULL
postgres       root   NULL            NULL              {}       NULL           NULL
system         node   NULL            NULL              {}       NULL           NULL
test           root   NULL            NULL              {}       NULL           NULL

statement ok
COMMENT ON DATABASE db IS NULL;

query TTTTTTT colnames,rowsort
SHOW DATABASES WITH COMMENT
----
database_name  owner  primary_region  secondary_region  regions  survival_goal  comment
db             root   NULL            NULL              {}       NULL           NULL
defaultdb      root   NULL            NULL              {}       NULL           NULL
postgres       root   NULL            NULL              {}       NULL           NULL
system         node   NULL            NULL              {}       NULL           NULL
test           root   NULL            NULL              {}       NULL           NULL

statement ok
CREATE SCHEMA sc

statement ok
COMMENT ON SCHEMA sc IS 'SC'

query T
SELECT COMMENT FROM system.comments WHERE type = 4;
----
SC

statement ok
COMMENT ON SCHEMA sc IS 'SC_AGAIN'

query T
SELECT COMMENT FROM system.comments WHERE type = 4;
----
SC_AGAIN

query TTT colnames,rowsort
SHOW SCHEMAS WITH COMMENT
----
schema_name         owner  comment
crdb_internal       node   NULL
information_schema  node   NULL
pg_catalog          node   NULL
pg_extension        node   NULL
public              root   NULL
sc                  root   SC_AGAIN

statement ok
CREATE SCHEMA db.schema1

statement ok
COMMENT ON SCHEMA db.schema1 IS 'Database_Schema'

query TTT colnames,rowsort
SHOW SCHEMAS FROM db WITH COMMENT
----
schema_name         owner  comment
crdb_internal       node   NULL
information_schema  node   NULL
pg_catalog          node   NULL
pg_extension        node   NULL
public              root   NULL
schema1             root   Database_Schema

statement ok
CREATE TABLE t(
  a INT PRIMARY KEY,
  b INT NOT NULL,
  CONSTRAINT ckb CHECK (b > 1),
  INDEX idxb (b),
  FAMILY fam_0_b_a (a, b)
);

statement ok
COMMENT ON TABLE t IS 'table t';

query T
SELECT create_statement FROM [SHOW CREATE TABLE t];
----
CREATE TABLE public.t (
  a INT8 NOT NULL,
  b INT8 NOT NULL,
  CONSTRAINT t_pkey PRIMARY KEY (a ASC),
  INDEX idxb (b ASC),
  FAMILY fam_0_b_a (a, b),
  CONSTRAINT ckb CHECK (b > 1:::INT8)
);
COMMENT ON TABLE public.t IS 'table t'

statement ok
COMMENT ON TABLE t IS 'table t AGAIN';

query T
SELECT create_statement FROM [SHOW CREATE TABLE t];
----
CREATE TABLE public.t (
  a INT8 NOT NULL,
  b INT8 NOT NULL,
  CONSTRAINT t_pkey PRIMARY KEY (a ASC),
  INDEX idxb (b ASC),
  FAMILY fam_0_b_a (a, b),
  CONSTRAINT ckb CHECK (b > 1:::INT8)
);
COMMENT ON TABLE public.t IS 'table t AGAIN'

statement ok
COMMENT ON TABLE t IS NULL;

query T
SELECT create_statement FROM [SHOW CREATE TABLE t];
----
CREATE TABLE public.t (
  a INT8 NOT NULL,
  b INT8 NOT NULL,
  CONSTRAINT t_pkey PRIMARY KEY (a ASC),
  INDEX idxb (b ASC),
  FAMILY fam_0_b_a (a, b),
  CONSTRAINT ckb CHECK (b > 1:::INT8)
)

statement ok
COMMENT ON COLUMN t.b IS 'column b';

query T
SELECT create_statement FROM [SHOW CREATE TABLE t];
----
CREATE TABLE public.t (
  a INT8 NOT NULL,
  b INT8 NOT NULL,
  CONSTRAINT t_pkey PRIMARY KEY (a ASC),
  INDEX idxb (b ASC),
  FAMILY fam_0_b_a (a, b),
  CONSTRAINT ckb CHECK (b > 1:::INT8)
);
COMMENT ON COLUMN public.t.b IS 'column b'

statement ok
COMMENT ON COLUMN t.b IS 'column b AGAIN';

statement error column name must be qualified
COMMENT ON COLUMN b IS 'unqualified column b';

query T
SELECT create_statement FROM [SHOW CREATE TABLE t];
----
CREATE TABLE public.t (
  a INT8 NOT NULL,
  b INT8 NOT NULL,
  CONSTRAINT t_pkey PRIMARY KEY (a ASC),
  INDEX idxb (b ASC),
  FAMILY fam_0_b_a (a, b),
  CONSTRAINT ckb CHECK (b > 1:::INT8)
);
COMMENT ON COLUMN public.t.b IS 'column b AGAIN'

statement ok
COMMENT ON COLUMN t.b IS NULL;

query T
SELECT create_statement FROM [SHOW CREATE TABLE t];
----
CREATE TABLE public.t (
  a INT8 NOT NULL,
  b INT8 NOT NULL,
  CONSTRAINT t_pkey PRIMARY KEY (a ASC),
  INDEX idxb (b ASC),
  FAMILY fam_0_b_a (a, b),
  CONSTRAINT ckb CHECK (b > 1:::INT8)
)

statement ok
COMMENT ON INDEX t@idxb IS 'index b';

query T
SELECT create_statement FROM [SHOW CREATE TABLE t];
----
CREATE TABLE public.t (
  a INT8 NOT NULL,
  b INT8 NOT NULL,
  CONSTRAINT t_pkey PRIMARY KEY (a ASC),
  INDEX idxb (b ASC),
  FAMILY fam_0_b_a (a, b),
  CONSTRAINT ckb CHECK (b > 1:::INT8)
);
COMMENT ON INDEX public.t@idxb IS 'index b'

statement ok
COMMENT ON INDEX t@idxb IS 'index b AGAIN';

query T
SELECT create_statement FROM [SHOW CREATE TABLE t];
----
CREATE TABLE public.t (
  a INT8 NOT NULL,
  b INT8 NOT NULL,
  CONSTRAINT t_pkey PRIMARY KEY (a ASC),
  INDEX idxb (b ASC),
  FAMILY fam_0_b_a (a, b),
  CONSTRAINT ckb CHECK (b > 1:::INT8)
);
COMMENT ON INDEX public.t@idxb IS 'index b AGAIN'

statement ok
COMMENT ON INDEX t@idxb IS NULL;

query T
SELECT create_statement FROM [SHOW CREATE TABLE t];
----
CREATE TABLE public.t (
  a INT8 NOT NULL,
  b INT8 NOT NULL,
  CONSTRAINT t_pkey PRIMARY KEY (a ASC),
  INDEX idxb (b ASC),
  FAMILY fam_0_b_a (a, b),
  CONSTRAINT ckb CHECK (b > 1:::INT8)
)

statement ok
COMMENT ON CONSTRAINT ckb ON t IS 'cst b';

query T
SELECT create_statement FROM [SHOW CREATE TABLE t];
----
CREATE TABLE public.t (
  a INT8 NOT NULL,
  b INT8 NOT NULL,
  CONSTRAINT t_pkey PRIMARY KEY (a ASC),
  INDEX idxb (b ASC),
  FAMILY fam_0_b_a (a, b),
  CONSTRAINT ckb CHECK (b > 1:::INT8)
);
COMMENT ON CONSTRAINT ckb ON public.t IS 'cst b'

statement ok
COMMENT ON CONSTRAINT ckb ON t IS 'cst b AGAIN';

query T
SELECT create_statement FROM [SHOW CREATE TABLE t];
----
CREATE TABLE public.t (
  a INT8 NOT NULL,
  b INT8 NOT NULL,
  CONSTRAINT t_pkey PRIMARY KEY (a ASC),
  INDEX idxb (b ASC),
  FAMILY fam_0_b_a (a, b),
  CONSTRAINT ckb CHECK (b > 1:::INT8)
);
COMMENT ON CONSTRAINT ckb ON public.t IS 'cst b AGAIN'

statement ok
COMMENT ON CONSTRAINT ckb ON t IS NULL;

query T
SELECT create_statement FROM [SHOW CREATE TABLE t];
----
CREATE TABLE public.t (
  a INT8 NOT NULL,
  b INT8 NOT NULL,
  CONSTRAINT t_pkey PRIMARY KEY (a ASC),
  INDEX idxb (b ASC),
  FAMILY fam_0_b_a (a, b),
  CONSTRAINT ckb CHECK (b > 1:::INT8)
)

# Make sure invalid comment type does not crash a server.
subtest regression_99316

statement ok
CREATE TABLE t_99316(a INT);

statement ok
INSERT INTO system.comments VALUES (4294967122, 't_99316'::regclass::OID, 0, 'bar');

statement error pgcode XX000 internal error: invalid comment type 4294967122
SELECT * FROM pg_catalog.pg_description WHERE objoid = 't'::regclass::OID;

statement ok
DELETE FROM system.comments WHERE type = 4294967122

statement ok
COMMENT ON SCHEMA sc IS NULL

statement ok
CREATE TYPE roach_dwellings AS ENUM ('roach_motel','roach_kitchen','roach_bathroom','roach_house');
CREATE TYPE roach_legs AS (legs INT);

onlyif config local-legacy-schema-changer
statement error COMMENT ON TYPE is only implemented in the declarative schema changer
COMMENT ON TYPE roach_dwellings IS 'First-CRDB-comment-on-types';

skipif config local-legacy-schema-changer
statement ok
COMMENT ON TYPE roach_dwellings IS 'First-CRDB-comment-on-types';

skipif config local-legacy-schema-changer
statement ok
COMMENT ON TYPE roach_legs IS 'Second-CRDB-comment-on-types';

skipif config local-legacy-schema-changer
statement ok
COMMENT ON TYPE roach_dwellings IS 'First-CRDB-comment-on-types-again';

skipif config local-legacy-schema-changer
statement ok
COMMENT ON TYPE roach_legs IS 'Second-CRDB-comment-on-types-again';

skipif config local-legacy-schema-changer
query IIIT colnames,rowsort
SELECT * FROM SYSTEM.COMMENTS;
----
type  object_id  sub_id  comment
4     109        0       Database_Schema
7     112        0       First-CRDB-comment-on-types-again
7     114        0       Second-CRDB-comment-on-types-again

skipif config local-legacy-schema-changer
query TTTT colnames,rowsort
SHOW TYPES WITH COMMENT
----
schema  name             owner  comment
public  roach_dwellings  root   First-CRDB-comment-on-types-again
public  roach_legs       root   Second-CRDB-comment-on-types-again

skipif config local-legacy-schema-changer
statement ok
COMMENT ON TYPE roach_dwellings IS NULL;

skipif config local-legacy-schema-changer
statement ok
COMMENT ON TYPE roach_legs IS NULL;

skipif config local-legacy-schema-changer
query TTTT colnames,rowsort
SHOW TYPES WITH COMMENT
----
schema  name             owner  comment
public  roach_dwellings  root   NULL
public  roach_legs       root   NULL

skipif config local-legacy-schema-changer
query IIIT colnames
SELECT * FROM SYSTEM.COMMENTS;
----
type  object_id  sub_id  comment
4     109        0       Database_Schema
