exec-ddl
CREATE TABLE parent (p INT PRIMARY KEY)
----

exec-ddl
CREATE TABLE child (c INT PRIMARY KEY, p INT REFERENCES parent(p))
----

exec-ddl
SHOW CREATE parent
----
TABLE parent
 ├── p int not null
 ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
 ├── tableoid oid [hidden] [system]
 ├── PRIMARY INDEX parent_pkey
 │    └── p int not null
 └── REFERENCED BY CONSTRAINT child_p_fkey FOREIGN KEY child (p) REFERENCES parent (p)

exec-ddl
SHOW CREATE child
----
TABLE child
 ├── c int not null
 ├── p int
 ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
 ├── tableoid oid [hidden] [system]
 ├── PRIMARY INDEX child_pkey
 │    └── c int not null
 └── CONSTRAINT child_p_fkey FOREIGN KEY child (p) REFERENCES parent (p)

exec-ddl
CREATE TABLE parent2 (p INT UNIQUE)
----

exec-ddl
CREATE TABLE child2 (c INT PRIMARY KEY, p INT REFERENCES parent2(p))
----

exec-ddl
SHOW CREATE parent2
----
TABLE parent2
 ├── p int
 ├── rowid int not null default (unique_rowid()) [hidden]
 ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
 ├── tableoid oid [hidden] [system]
 ├── PRIMARY INDEX parent2_pkey
 │    └── rowid int not null default (unique_rowid()) [hidden]
 ├── UNIQUE INDEX parent2_p_key
 │    ├── p int
 │    └── rowid int not null default (unique_rowid()) [hidden] (storing)
 └── REFERENCED BY CONSTRAINT child2_p_fkey FOREIGN KEY child2 (p) REFERENCES parent2 (p)

exec-ddl
SHOW CREATE child2
----
TABLE child2
 ├── c int not null
 ├── p int
 ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
 ├── tableoid oid [hidden] [system]
 ├── PRIMARY INDEX child2_pkey
 │    └── c int not null
 └── CONSTRAINT child2_p_fkey FOREIGN KEY child2 (p) REFERENCES parent2 (p)

exec-ddl
CREATE TABLE parent_multicol (p INT, q INT, r INT, PRIMARY KEY (p,q,r))
----

exec-ddl
CREATE TABLE child_multicol (
  p INT,
  q INT,
  r INT,
  PRIMARY KEY (p,q,r),
  CONSTRAINT fk FOREIGN KEY (p,q,r) REFERENCES parent_multicol(p,q,r)
)
----

exec-ddl
CREATE TABLE child_multicol_full (
  p INT,
  q INT,
  r INT,
  PRIMARY KEY (p,q,r),
  CONSTRAINT fk FOREIGN KEY (p,q,r) REFERENCES parent_multicol(p,q,r) MATCH FULL
)
----

exec-ddl
SHOW CREATE parent_multicol
----
TABLE parent_multicol
 ├── p int not null
 ├── q int not null
 ├── r int not null
 ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
 ├── tableoid oid [hidden] [system]
 ├── PRIMARY INDEX parent_multicol_pkey
 │    ├── p int not null
 │    ├── q int not null
 │    └── r int not null
 ├── REFERENCED BY CONSTRAINT fk FOREIGN KEY child_multicol (p, q, r) REFERENCES parent_multicol (p, q, r)
 └── REFERENCED BY CONSTRAINT fk FOREIGN KEY child_multicol_full (p, q, r) REFERENCES parent_multicol (p, q, r) MATCH FULL

exec-ddl
SHOW CREATE child_multicol
----
TABLE child_multicol
 ├── p int not null
 ├── q int not null
 ├── r int not null
 ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
 ├── tableoid oid [hidden] [system]
 ├── PRIMARY INDEX child_multicol_pkey
 │    ├── p int not null
 │    ├── q int not null
 │    └── r int not null
 └── CONSTRAINT fk FOREIGN KEY child_multicol (p, q, r) REFERENCES parent_multicol (p, q, r)

exec-ddl
SHOW CREATE child_multicol_full
----
TABLE child_multicol_full
 ├── p int not null
 ├── q int not null
 ├── r int not null
 ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
 ├── tableoid oid [hidden] [system]
 ├── PRIMARY INDEX child_multicol_full_pkey
 │    ├── p int not null
 │    ├── q int not null
 │    └── r int not null
 └── CONSTRAINT fk FOREIGN KEY child_multicol_full (p, q, r) REFERENCES parent_multicol (p, q, r) MATCH FULL

exec-ddl
DROP TABLE child
----

exec-ddl
SHOW CREATE parent
----
TABLE parent
 ├── p int not null
 ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
 ├── tableoid oid [hidden] [system]
 └── PRIMARY INDEX parent_pkey
      └── p int not null

exec-ddl
DROP TABLE child_multicol
----

exec-ddl
SHOW CREATE parent_multicol
----
TABLE parent_multicol
 ├── p int not null
 ├── q int not null
 ├── r int not null
 ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
 ├── tableoid oid [hidden] [system]
 ├── PRIMARY INDEX parent_multicol_pkey
 │    ├── p int not null
 │    ├── q int not null
 │    └── r int not null
 └── REFERENCED BY CONSTRAINT fk FOREIGN KEY child_multicol_full (p, q, r) REFERENCES parent_multicol (p, q, r) MATCH FULL

exec-ddl
DROP TABLE child_multicol_full
----

exec-ddl
SHOW CREATE parent_multicol
----
TABLE parent_multicol
 ├── p int not null
 ├── q int not null
 ├── r int not null
 ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
 ├── tableoid oid [hidden] [system]
 └── PRIMARY INDEX parent_multicol_pkey
      ├── p int not null
      ├── q int not null
      └── r int not null

# Verify we can drop a self-referencing table.
exec-ddl
CREATE TABLE self (a INT PRIMARY KEY, b INT REFERENCES self(a) ON DELETE CASCADE)
----

exec-ddl
DROP TABLE self
----

# Verify that we can use "ALTER TABLE ... ADD FOREIGN KEY" syntax to reference
# a primary key without specifying the referenced column(s).

exec-ddl
CREATE TABLE child_implied_ref(ref INT, INDEX (ref))
----

exec-ddl
ALTER TABLE child_implied_ref ADD FOREIGN KEY (ref) REFERENCES parent
----

exec-ddl
DROP TABLE child_implied_ref
----
