# Test dumping a database with foreign keys does so in correct order.

sql
CREATE DATABASE d1;
CREATE DATABASE d2;
USE d1;

-- B -> A
CREATE TABLE b (i int PRIMARY KEY);
CREATE TABLE a (i int REFERENCES b);
INSERT INTO b VALUES (1);
INSERT INTO a VALUES (1);

-- Test multiple tables to make sure transitive deps are sorted correctly.
-- E -> D -> C
-- G -> F -> D -> C
CREATE TABLE g (i int PRIMARY KEY);
CREATE TABLE f (i int PRIMARY KEY, g int REFERENCES g);
CREATE TABLE e (i int PRIMARY KEY);
CREATE TABLE d (i int PRIMARY KEY, e int REFERENCES e, f int REFERENCES f);
CREATE TABLE c (i int REFERENCES d);
INSERT INTO g VALUES (1);
INSERT INTO f VALUES (1, 1);
INSERT INTO e VALUES (1);
INSERT INTO d VALUES (1, 1, 1);
INSERT INTO c VALUES (1);

-- Test a table that uses a sequence to make sure the sequence is dumped first.
CREATE SEQUENCE s;
CREATE TABLE s_tbl (id INT PRIMARY KEY DEFAULT nextval('s'), v INT);
INSERT INTO s_tbl (v) VALUES (10), (11);
----
INSERT 2

dump d1
----
----
CREATE TABLE b (
	i INT NOT NULL,
	CONSTRAINT "primary" PRIMARY KEY (i ASC),
	FAMILY "primary" (i)
);

CREATE TABLE a (
	i INT NULL,
	INDEX a_auto_index_fk_i_ref_b (i ASC),
	FAMILY "primary" (i, rowid)
);

CREATE TABLE e (
	i INT NOT NULL,
	CONSTRAINT "primary" PRIMARY KEY (i ASC),
	FAMILY "primary" (i)
);

CREATE TABLE g (
	i INT NOT NULL,
	CONSTRAINT "primary" PRIMARY KEY (i ASC),
	FAMILY "primary" (i)
);

CREATE TABLE f (
	i INT NOT NULL,
	g INT NULL,
	CONSTRAINT "primary" PRIMARY KEY (i ASC),
	INDEX f_auto_index_fk_g_ref_g (g ASC),
	FAMILY "primary" (i, g)
);

CREATE TABLE d (
	i INT NOT NULL,
	e INT NULL,
	f INT NULL,
	CONSTRAINT "primary" PRIMARY KEY (i ASC),
	INDEX d_auto_index_fk_e_ref_e (e ASC),
	INDEX d_auto_index_fk_f_ref_f (f ASC),
	FAMILY "primary" (i, e, f)
);

CREATE TABLE c (
	i INT NULL,
	INDEX c_auto_index_fk_i_ref_d (i ASC),
	FAMILY "primary" (i, rowid)
);

CREATE SEQUENCE s MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1;

CREATE TABLE s_tbl (
	id INT NOT NULL DEFAULT nextval('s':::STRING),
	v INT NULL,
	CONSTRAINT "primary" PRIMARY KEY (id ASC),
	FAMILY "primary" (id, v)
);

INSERT INTO b (i) VALUES
	(1);

INSERT INTO a (i) VALUES
	(1);

INSERT INTO e (i) VALUES
	(1);

INSERT INTO g (i) VALUES
	(1);

INSERT INTO f (i, g) VALUES
	(1, 1);

INSERT INTO d (i, e, f) VALUES
	(1, 1, 1);

INSERT INTO c (i) VALUES
	(1);

SELECT setval('s', 3, false);

INSERT INTO s_tbl (id, v) VALUES
	(1, 10),
	(2, 11);

ALTER TABLE a ADD CONSTRAINT fk_i_ref_b FOREIGN KEY (i) REFERENCES b (i);
ALTER TABLE f ADD CONSTRAINT fk_g_ref_g FOREIGN KEY (g) REFERENCES g (i);
ALTER TABLE d ADD CONSTRAINT fk_e_ref_e FOREIGN KEY (e) REFERENCES e (i);
ALTER TABLE d ADD CONSTRAINT fk_f_ref_f FOREIGN KEY (f) REFERENCES f (i);
ALTER TABLE c ADD CONSTRAINT fk_i_ref_d FOREIGN KEY (i) REFERENCES d (i);

-- Validate foreign key constraints. These can fail if there was unvalidated data during the dump.
ALTER TABLE a VALIDATE CONSTRAINT fk_i_ref_b;
ALTER TABLE f VALIDATE CONSTRAINT fk_g_ref_g;
ALTER TABLE d VALIDATE CONSTRAINT fk_e_ref_e;
ALTER TABLE d VALIDATE CONSTRAINT fk_f_ref_f;
ALTER TABLE c VALIDATE CONSTRAINT fk_i_ref_d;
----
----

# Ensure dump specifying only some tables works if those tables
# reference tables not in the dump. Roundtrip is disabled because table
# f is not present in the dump.
dump d1 d e
noroundtrip
----
----
CREATE TABLE e (
	i INT NOT NULL,
	CONSTRAINT "primary" PRIMARY KEY (i ASC),
	FAMILY "primary" (i)
);

CREATE TABLE d (
	i INT NOT NULL,
	e INT NULL,
	f INT NULL,
	CONSTRAINT "primary" PRIMARY KEY (i ASC),
	INDEX d_auto_index_fk_e_ref_e (e ASC),
	INDEX d_auto_index_fk_f_ref_f (f ASC),
	FAMILY "primary" (i, e, f)
);

INSERT INTO e (i) VALUES
	(1);

INSERT INTO d (i, e, f) VALUES
	(1, 1, 1);

ALTER TABLE d ADD CONSTRAINT fk_e_ref_e FOREIGN KEY (e) REFERENCES e (i);
ALTER TABLE d ADD CONSTRAINT fk_f_ref_f FOREIGN KEY (f) REFERENCES f (i);

-- Validate foreign key constraints. These can fail if there was unvalidated data during the dump.
ALTER TABLE d VALIDATE CONSTRAINT fk_e_ref_e;
ALTER TABLE d VALIDATE CONSTRAINT fk_f_ref_f;
----
----
