Files
dolt/bats/foreign-keys.bats
T
2020-06-13 21:16:47 -07:00

1280 lines
40 KiB
Bash

#!/usr/bin/env bats
load $BATS_TEST_DIRNAME/helper/common.bash
setup() {
setup_common
}
teardown() {
teardown_common
}
@test "foreign-keys: CREATE TABLE Single Unnamed FOREIGN KEY" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id)
REFERENCES parent(id)
);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`)' ]] || false
}
@test "foreign-keys: CREATE TABLE Single Unnamed FOREIGN KEY With Either UPDATE/DELETE" {
dolt sql <<SQL
CREATE TABLE parent1 (
id INT PRIMARY KEY
);
CREATE TABLE child1 (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id)
REFERENCES parent1(id)
ON UPDATE CASCADE
);
CREATE TABLE parent2 (
id INT PRIMARY KEY
);
CREATE TABLE child2 (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id)
REFERENCES parent2(id)
ON DELETE CASCADE
);
SQL
run dolt index ls parent1
[ "$status" -eq "0" ]
[[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child1
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt index ls parent2
[ "$status" -eq "0" ]
[[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child2
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt schema show child1
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child1_parent1_1` FOREIGN KEY (`parent_id`) REFERENCES `parent1` (`id`) ON UPDATE CASCADE' ]] || false
run dolt schema show child2
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child2_parent2_1` FOREIGN KEY (`parent_id`) REFERENCES `parent2` (`id`) ON DELETE CASCADE' ]] || false
}
@test "foreign-keys: CREATE TABLE Single Unnamed FOREIGN KEY With Both UPDATE/DELETE" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE CASCADE ON UPDATE CASCADE' ]] || false
}
@test "foreign-keys: CREATE TABLE Single Named FOREIGN KEY" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
CONSTRAINT fk_named FOREIGN KEY (parent_id)
REFERENCES parent(id)
);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_named` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`)' ]] || false
}
@test "foreign-keys: CREATE TABLE Single Named FOREIGN KEY With Both UPDATE/DELETE" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
CONSTRAINT fk_named FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_named` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE CASCADE ON UPDATE CASCADE' ]] || false
}
@test "foreign-keys: CREATE TABLE Single Unnamed FOREIGN KEY Multi-column" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME,
FOREIGN KEY (parent_v1, parent_v2)
REFERENCES parent(v1, v2)
);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(v1, v2) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_v1, parent_v2) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_1` FOREIGN KEY (`parent_v1`,`parent_v2`) REFERENCES `parent` (`v1`,`v2`)' ]] || false
}
@test "foreign-keys: CREATE TABLE Single Named FOREIGN KEY Multi-column" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME,
CONSTRAINT fk_name FOREIGN KEY (parent_v1, parent_v2)
REFERENCES parent(v1, v2)
);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(v1, v2) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_v1, parent_v2) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name` FOREIGN KEY (`parent_v1`,`parent_v2`) REFERENCES `parent` (`v1`,`v2`)' ]] || false
}
@test "foreign-keys: CREATE TABLE Multiple Unnamed FOREIGN KEY" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME,
v3 TIMESTAMP,
v4 BIT(4)
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME,
parent_v3 TIMESTAMP,
parent_v4 BIT(4),
FOREIGN KEY (parent_v1)
REFERENCES parent(v1),
FOREIGN KEY (parent_v2)
REFERENCES parent(v2)
ON UPDATE CASCADE,
FOREIGN KEY (parent_v3)
REFERENCES parent(v3)
ON DELETE CASCADE,
FOREIGN KEY (parent_v4)
REFERENCES parent(v4)
ON DELETE CASCADE
ON UPDATE CASCADE
);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(v1) HIDDEN" ]] || false
[[ "$output" =~ "(v2) HIDDEN" ]] || false
[[ "$output" =~ "(v3) HIDDEN" ]] || false
[[ "$output" =~ "(v4) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_v1) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v2) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v3) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v4) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_1` FOREIGN KEY (`parent_v1`) REFERENCES `parent` (`v1`)' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_2` FOREIGN KEY (`parent_v2`) REFERENCES `parent` (`v2`) ON UPDATE CASCADE' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_3` FOREIGN KEY (`parent_v3`) REFERENCES `parent` (`v3`) ON DELETE CASCADE' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_4` FOREIGN KEY (`parent_v4`) REFERENCES `parent` (`v4`) ON DELETE CASCADE ON UPDATE CASCADE' ]] || false
}
@test "foreign-keys: CREATE TABLE Multiple Named FOREIGN KEY" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME,
v3 TIMESTAMP,
v4 BIT(4)
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME,
parent_v3 TIMESTAMP,
parent_v4 BIT(4),
CONSTRAINT fk_name_1 FOREIGN KEY (parent_v1)
REFERENCES parent(v1),
CONSTRAINT fk_name_2 FOREIGN KEY (parent_v2)
REFERENCES parent(v2)
ON UPDATE CASCADE,
CONSTRAINT fk_name_3 FOREIGN KEY (parent_v3)
REFERENCES parent(v3)
ON DELETE CASCADE,
CONSTRAINT fk_name_4 FOREIGN KEY (parent_v4)
REFERENCES parent(v4)
ON DELETE CASCADE
ON UPDATE CASCADE
);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(v1) HIDDEN" ]] || false
[[ "$output" =~ "(v2) HIDDEN" ]] || false
[[ "$output" =~ "(v3) HIDDEN" ]] || false
[[ "$output" =~ "(v4) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_v1) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v2) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v3) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v4) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name_1` FOREIGN KEY (`parent_v1`) REFERENCES `parent` (`v1`)' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name_2` FOREIGN KEY (`parent_v2`) REFERENCES `parent` (`v2`) ON UPDATE CASCADE' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name_3` FOREIGN KEY (`parent_v3`) REFERENCES `parent` (`v3`) ON DELETE CASCADE' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name_4` FOREIGN KEY (`parent_v4`) REFERENCES `parent` (`v4`) ON DELETE CASCADE ON UPDATE CASCADE' ]] || false
}
@test "foreign-keys: CREATE TABLE Name Collision" {
run dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
CONSTRAINT fk_name FOREIGN KEY (parent_id)
REFERENCES parent(id),
CONSTRAINT fk_name FOREIGN KEY (parent_id)
REFERENCES parent(id)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "already exists" ]] || false
}
@test "foreign-keys: CREATE TABLE Type Mismatch" {
run dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME,
FOREIGN KEY (parent_v2, parent_v1)
REFERENCES parent(v1, v2)
);
SQL
[ "$status" -eq "1" ]
#TODO: match on error detailing our specific decision to force type parity
}
@test "foreign-keys: CREATE TABLE Key Count Mismatch" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME
);
SQL
run dolt sql <<SQL
CREATE TABLE child1 (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME,
FOREIGN KEY (parent_v1)
REFERENCES parent(v1, v2)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "number of columns" ]] || false
run dolt sql <<SQL
CREATE TABLE child2 (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME,
FOREIGN KEY (parent_v1, parent_v2)
REFERENCES parent(v1)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "number of columns" ]] || false
}
@test "foreign-keys: CREATE TABLE UPDATE/DELETE Options" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME,
v3 TIMESTAMP,
v4 BIT(4),
v5 BIGINT UNSIGNED
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME,
parent_v3 TIMESTAMP,
parent_v4 BIT(4),
parent_v5 BIGINT UNSIGNED,
FOREIGN KEY (parent_v1)
REFERENCES parent(v1),
FOREIGN KEY (parent_v2)
REFERENCES parent(v2)
ON DELETE RESTRICT
ON UPDATE RESTRICT,
FOREIGN KEY (parent_v3)
REFERENCES parent(v3)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (parent_v4)
REFERENCES parent(v4)
ON DELETE SET NULL
ON UPDATE SET NULL,
FOREIGN KEY (parent_v5)
REFERENCES parent(v5)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(v1) HIDDEN" ]] || false
[[ "$output" =~ "(v2) HIDDEN" ]] || false
[[ "$output" =~ "(v3) HIDDEN" ]] || false
[[ "$output" =~ "(v4) HIDDEN" ]] || false
[[ "$output" =~ "(v5) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_v1) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v2) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v3) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v4) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v5) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_1` FOREIGN KEY (`parent_v1`) REFERENCES `parent` (`v1`)' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_2` FOREIGN KEY (`parent_v2`) REFERENCES `parent` (`v2`) ON DELETE RESTRICT ON UPDATE RESTRICT' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_3` FOREIGN KEY (`parent_v3`) REFERENCES `parent` (`v3`) ON DELETE CASCADE ON UPDATE CASCADE' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_4` FOREIGN KEY (`parent_v4`) REFERENCES `parent` (`v4`) ON DELETE SET NULL ON UPDATE SET NULL' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_5` FOREIGN KEY (`parent_v5`) REFERENCES `parent` (`v5`) ON DELETE NO ACTION ON UPDATE NO ACTION' ]] || false
run dolt sql <<SQL
CREATE TABLE child2 (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
FOREIGN KEY (parent_v1)
REFERENCES parent(v1)
ON DELETE SET DEFAULT
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "\"SET DEFAULT\" is not supported" ]] || false
run dolt sql <<SQL
CREATE TABLE child3 (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
FOREIGN KEY (parent_v1)
REFERENCES parent(v1)
ON UPDATE SET DEFAULT
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "\"SET DEFAULT\" is not supported" ]] || false
run dolt sql <<SQL
CREATE TABLE child4 (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
FOREIGN KEY (parent_v1)
REFERENCES parent(v1)
ON DELETE SET DEFAULT
ON UPDATE SET DEFAULT
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "\"SET DEFAULT\" is not supported" ]] || false
}
@test "foreign-keys: CREATE TABLE Disallow TEXT/BLOB" {
dolt sql <<SQL
CREATE TABLE parent1 (
id INT PRIMARY KEY,
v1 TINYTEXT,
v2 TEXT,
v3 MEDIUMTEXT,
v4 LONGTEXT
);
SQL
run dolt sql <<SQL
CREATE TABLE child11 (
id INT PRIMARY KEY,
parent_v1 TINYTEXT,
FOREIGN KEY (parent_v1)
REFERENCES parent1(v1)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
run dolt sql <<SQL
CREATE TABLE child12 (
id INT PRIMARY KEY,
parent_v2 TEXT,
FOREIGN KEY (parent_v2)
REFERENCES parent1(v2)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
run dolt sql <<SQL
CREATE TABLE child13 (
id INT PRIMARY KEY,
parent_v3 MEDIUMTEXT,
FOREIGN KEY (parent_v3)
REFERENCES parent1(v3)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
run dolt sql <<SQL
CREATE TABLE child14 (
id INT PRIMARY KEY,
parent_v4 LONGTEXT,
FOREIGN KEY (parent_v4)
REFERENCES parent1(v4)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
skip "TEXT passed, BLOB not yet supported"
dolt sql <<SQL
CREATE TABLE parent2 (
id INT PRIMARY KEY,
v1 TINYBLOB,
v2 BLOB,
v3 MEDIUMBLOB,
v4 LONGBLOB
);
SQL
run dolt sql <<SQL
CREATE TABLE child21 (
id INT PRIMARY KEY,
parent_v1 TINYBLOB,
FOREIGN KEY (parent_v1)
REFERENCES parent2(v1)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
run dolt sql <<SQL
CREATE TABLE child22 (
id INT PRIMARY KEY,
parent_v2 BLOB,
FOREIGN KEY (parent_v2)
REFERENCES parent2(v2)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
run dolt sql <<SQL
CREATE TABLE child23 (
id INT PRIMARY KEY,
parent_v3 MEDIUMBLOB,
FOREIGN KEY (parent_v3)
REFERENCES parent2(v3)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
run dolt sql <<SQL
CREATE TABLE child24 (
id INT PRIMARY KEY,
parent_v4 LONGBLOB,
FOREIGN KEY (parent_v4)
REFERENCES parent2(v4)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
}
@test "foreign-keys: CREATE TABLE Non-existent Table" {
run dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id)
REFERENCES father(id)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "`father` does not exist" ]] || false
}
@test "foreign-keys: CREATE TABLE Non-existent Columns" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
SQL
run dolt sql <<SQL
CREATE TABLE child1 (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (random)
REFERENCES parent(id)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "does not have column" ]] || false
run dolt sql <<SQL
CREATE TABLE child2 (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id)
REFERENCES parent(random)
);
SQL
[ "$status" -eq "1" ]
[[ "$output" =~ "does not have column" ]] || false
}
@test "foreign-keys: ALTER TABLE Single Unnamed FOREIGN KEY" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT
);
ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES parent(id);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`)' ]] || false
}
@test "foreign-keys: ALTER TABLE Single Unnamed FOREIGN KEY With Either UPDATE/DELETE" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT
);
ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE;
ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES parent(id) ON UPDATE CASCADE;
SQL
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE CASCADE' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_2` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON UPDATE CASCADE' ]] || false
}
@test "foreign-keys: ALTER TABLE Single Unnamed FOREIGN KEY With Both UPDATE/DELETE" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT
);
ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ON UPDATE CASCADE;
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE CASCADE ON UPDATE CASCADE' ]] || false
}
@test "foreign-keys: ALTER TABLE Single Named FOREIGN KEY" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT
);
ALTER TABLE child ADD CONSTRAINT fk_named FOREIGN KEY (parent_id) REFERENCES parent(id);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_named` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`)' ]] || false
}
@test "foreign-keys: ALTER TABLE Single Named FOREIGN KEY With Both UPDATE/DELETE" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT
);
ALTER TABLE child ADD CONSTRAINT fk_named FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ON UPDATE CASCADE;
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_named` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE CASCADE ON UPDATE CASCADE' ]] || false
}
@test "foreign-keys: ALTER TABLE Single Unnamed FOREIGN KEY Multi-column" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME
);
ALTER TABLE child ADD FOREIGN KEY (parent_v1, parent_v2) REFERENCES parent(v1, v2);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(v1, v2) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_v1, parent_v2) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_1` FOREIGN KEY (`parent_v1`,`parent_v2`) REFERENCES `parent` (`v1`,`v2`)' ]] || false
}
@test "foreign-keys: ALTER TABLE Single Named FOREIGN KEY Multi-column" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME
);
ALTER TABLE child ADD CONSTRAINT fk_name FOREIGN KEY (parent_v1, parent_v2) REFERENCES parent(v1, v2);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(v1, v2) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_v1, parent_v2) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name` FOREIGN KEY (`parent_v1`,`parent_v2`) REFERENCES `parent` (`v1`,`v2`)' ]] || false
}
@test "foreign-keys: ALTER TABLE Multiple Unnamed FOREIGN KEY" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME,
v3 TIMESTAMP,
v4 BIT(4)
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME,
parent_v3 TIMESTAMP,
parent_v4 BIT(4)
);
ALTER TABLE child ADD FOREIGN KEY (parent_v1) REFERENCES parent(v1);
ALTER TABLE child ADD FOREIGN KEY (parent_v2) REFERENCES parent(v2) ON UPDATE CASCADE;
ALTER TABLE child ADD FOREIGN KEY (parent_v3) REFERENCES parent(v3) ON DELETE CASCADE;
ALTER TABLE child ADD FOREIGN KEY (parent_v4) REFERENCES parent(v4) ON DELETE CASCADE ON UPDATE CASCADE;
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(v1) HIDDEN" ]] || false
[[ "$output" =~ "(v2) HIDDEN" ]] || false
[[ "$output" =~ "(v3) HIDDEN" ]] || false
[[ "$output" =~ "(v4) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_v1) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v2) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v3) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v4) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_1` FOREIGN KEY (`parent_v1`) REFERENCES `parent` (`v1`)' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_2` FOREIGN KEY (`parent_v2`) REFERENCES `parent` (`v2`) ON UPDATE CASCADE' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_3` FOREIGN KEY (`parent_v3`) REFERENCES `parent` (`v3`) ON DELETE CASCADE' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_4` FOREIGN KEY (`parent_v4`) REFERENCES `parent` (`v4`) ON DELETE CASCADE ON UPDATE CASCADE' ]] || false
}
@test "foreign-keys: ALTER TABLE Multiple Named FOREIGN KEY" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME,
v3 TIMESTAMP,
v4 BIT(4)
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME,
parent_v3 TIMESTAMP,
parent_v4 BIT(4)
);
ALTER TABLE child ADD CONSTRAINT fk_name_1 FOREIGN KEY (parent_v1) REFERENCES parent(v1);
ALTER TABLE child ADD CONSTRAINT fk_name_2 FOREIGN KEY (parent_v2) REFERENCES parent(v2) ON UPDATE CASCADE;
ALTER TABLE child ADD CONSTRAINT fk_name_3 FOREIGN KEY (parent_v3) REFERENCES parent(v3) ON DELETE CASCADE;
ALTER TABLE child ADD CONSTRAINT fk_name_4 FOREIGN KEY (parent_v4) REFERENCES parent(v4) ON DELETE CASCADE ON UPDATE CASCADE;
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(v1) HIDDEN" ]] || false
[[ "$output" =~ "(v2) HIDDEN" ]] || false
[[ "$output" =~ "(v3) HIDDEN" ]] || false
[[ "$output" =~ "(v4) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_v1) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v2) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v3) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v4) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name_1` FOREIGN KEY (`parent_v1`) REFERENCES `parent` (`v1`)' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name_2` FOREIGN KEY (`parent_v2`) REFERENCES `parent` (`v2`) ON UPDATE CASCADE' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name_3` FOREIGN KEY (`parent_v3`) REFERENCES `parent` (`v3`) ON DELETE CASCADE' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name_4` FOREIGN KEY (`parent_v4`) REFERENCES `parent` (`v4`) ON DELETE CASCADE ON UPDATE CASCADE' ]] || false
}
@test "foreign-keys: ALTER TABLE Name Collision" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT
);
ALTER TABLE child ADD CONSTRAINT fk_name FOREIGN KEY (parent_id) REFERENCES parent(id);
SQL
run dolt sql -q "ALTER TABLE child ADD CONSTRAINT fk_name FOREIGN KEY (parent_id) REFERENCES parent(id)"
[ "$status" -eq "1" ]
[[ "$output" =~ "already exists" ]] || false
}
@test "foreign-keys: ALTER TABLE Type Mismatch" {
run dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME
);
ALTER TABLE child ADD FOREIGN KEY (parent_v2, parent_v1) REFERENCES parent(v1, v2);
SQL
[ "$status" -eq "1" ]
#TODO: match on error detailing our specific decision to force type parity
}
@test "foreign-keys: ALTER TABLE Key Count Mismatch" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME
);
SQL
run dolt sql -q "ALTER TABLE child ADD FOREIGN KEY (parent_v1) REFERENCES parent(v1, v2)"
[ "$status" -eq "1" ]
[[ "$output" =~ "number of columns" ]] || false
run dolt sql -q "ALTER TABLE child ADD FOREIGN KEY (parent_v1, parent_v2) REFERENCES parent(v1)"
[ "$status" -eq "1" ]
[[ "$output" =~ "number of columns" ]] || false
}
@test "foreign-keys: ALTER TABLE UPDATE/DELETE Options" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY,
v1 VARCHAR(20),
v2 DATETIME,
v3 TIMESTAMP,
v4 BIT(4),
v5 BIGINT UNSIGNED
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_v1 VARCHAR(20),
parent_v2 DATETIME,
parent_v3 TIMESTAMP,
parent_v4 BIT(4),
parent_v5 BIGINT UNSIGNED
);
ALTER TABLE child ADD FOREIGN KEY (parent_v1) REFERENCES parent(v1);
ALTER TABLE child ADD FOREIGN KEY (parent_v2) REFERENCES parent(v2) ON DELETE RESTRICT ON UPDATE RESTRICT;
ALTER TABLE child ADD FOREIGN KEY (parent_v3) REFERENCES parent(v3) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE child ADD FOREIGN KEY (parent_v4) REFERENCES parent(v4) ON DELETE SET NULL ON UPDATE SET NULL;
ALTER TABLE child ADD FOREIGN KEY (parent_v5) REFERENCES parent(v5) ON DELETE NO ACTION ON UPDATE NO ACTION;
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(v1) HIDDEN" ]] || false
[[ "$output" =~ "(v2) HIDDEN" ]] || false
[[ "$output" =~ "(v3) HIDDEN" ]] || false
[[ "$output" =~ "(v4) HIDDEN" ]] || false
[[ "$output" =~ "(v5) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_v1) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v2) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v3) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v4) HIDDEN" ]] || false
[[ "$output" =~ "(parent_v5) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_1` FOREIGN KEY (`parent_v1`) REFERENCES `parent` (`v1`)' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_2` FOREIGN KEY (`parent_v2`) REFERENCES `parent` (`v2`) ON DELETE RESTRICT ON UPDATE RESTRICT' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_3` FOREIGN KEY (`parent_v3`) REFERENCES `parent` (`v3`) ON DELETE CASCADE ON UPDATE CASCADE' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_4` FOREIGN KEY (`parent_v4`) REFERENCES `parent` (`v4`) ON DELETE SET NULL ON UPDATE SET NULL' ]] || false
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_5` FOREIGN KEY (`parent_v5`) REFERENCES `parent` (`v5`) ON DELETE NO ACTION ON UPDATE NO ACTION' ]] || false
run dolt sql -q "ALTER TABLE child ADD FOREIGN KEY (parent_v1) REFERENCES parent(v1) ON DELETE SET DEFAULT"
[ "$status" -eq "1" ]
[[ "$output" =~ "\"SET DEFAULT\" is not supported" ]] || false
run dolt sql -q "ALTER TABLE child ADD FOREIGN KEY (parent_v1) REFERENCES parent(v1) ON UPDATE SET DEFAULT"
[ "$status" -eq "1" ]
[[ "$output" =~ "\"SET DEFAULT\" is not supported" ]] || false
run dolt sql -q "ALTER TABLE child ADD FOREIGN KEY (parent_v1) REFERENCES parent(v1) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT"
[ "$status" -eq "1" ]
[[ "$output" =~ "\"SET DEFAULT\" is not supported" ]] || false
}
@test "foreign-keys: ALTER TABLE Disallow TEXT/BLOB" {
dolt sql <<SQL
CREATE TABLE parent1 (
id INT PRIMARY KEY,
v1 TINYTEXT,
v2 TEXT,
v3 MEDIUMTEXT,
v4 LONGTEXT
);
CREATE TABLE child11 (
id INT PRIMARY KEY,
parent_v1 TINYTEXT
);
CREATE TABLE child12 (
id INT PRIMARY KEY,
parent_v2 TEXT
);
CREATE TABLE child13 (
id INT PRIMARY KEY,
parent_v3 MEDIUMTEXT
);
CREATE TABLE child14 (
id INT PRIMARY KEY,
parent_v4 LONGTEXT
);
SQL
run dolt sql -q "ALTER TABLE child11 ADD FOREIGN KEY (parent_v1) REFERENCES parent1(v1)"
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
run dolt sql -q "ALTER TABLE child12 ADD FOREIGN KEY (parent_v2) REFERENCES parent1(v2)"
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
run dolt sql -q "ALTER TABLE child13 ADD FOREIGN KEY (parent_v3) REFERENCES parent1(v3)"
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
run dolt sql -q "ALTER TABLE child14 ADD FOREIGN KEY (parent_v4) REFERENCES parent1(v4)"
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
skip "TEXT passed, BLOB not yet supported"
dolt sql <<SQL
CREATE TABLE parent2 (
id INT PRIMARY KEY,
v1 TINYBLOB,
v2 BLOB,
v3 MEDIUMBLOB,
v4 LONGBLOB
);
CREATE TABLE child21 (
id INT PRIMARY KEY,
parent_v1 TINYBLOB
);
CREATE TABLE child22 (
id INT PRIMARY KEY,
parent_v2 BLOB
);
CREATE TABLE child23 (
id INT PRIMARY KEY,
parent_v3 MEDIUMBLOB
);
CREATE TABLE child24 (
id INT PRIMARY KEY,
parent_v4 LONGBLOB
);
SQL
run dolt sql -q "ALTER TABLE child21 ADD FOREIGN KEY (parent_v1) REFERENCES parent2(v1)"
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
run dolt sql -q "ALTER TABLE child22 ADD FOREIGN KEY (parent_v2) REFERENCES parent2(v2)"
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
run dolt sql -q "ALTER TABLE child23 ADD FOREIGN KEY (parent_v3) REFERENCES parent2(v3)"
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
run dolt sql -q "ALTER TABLE child24 ADD FOREIGN KEY (parent_v4) REFERENCES parent2(v4)"
[ "$status" -eq "1" ]
[[ "$output" =~ "not valid type" ]] || false
}
@test "foreign-keys: ALTER TABLE Non-existent Table" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT
);
SQL
run dolt sql -q "ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES father(id)"
[ "$status" -eq "1" ]
[[ "$output" =~ "`father` does not exist" ]] || false
}
@test "foreign-keys: ALTER TABLE Non-existent Columns" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT
);
SQL
run dolt sql -q "ALTER TABLE child ADD FOREIGN KEY (random) REFERENCES parent(id)"
[ "$status" -eq "1" ]
[[ "$output" =~ "does not have column" ]] || false
run dolt sql -q "ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES parent(random)"
[ "$status" -eq "1" ]
[[ "$output" =~ "does not have column" ]] || false
}
@test "foreign-keys: ALTER TABLE DROP FOREIGN KEY" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
CONSTRAINT fk_name FOREIGN KEY (parent_id)
REFERENCES parent(id)
);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ "$output" =~ 'CONSTRAINT `fk_name`' ]] || false
dolt sql -q "ALTER TABLE child DROP FOREIGN KEY fk_name"
run dolt index ls parent
[ "$status" -eq "0" ]
! [[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
! [[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
! [[ "$output" =~ 'CONSTRAINT `fk_name`' ]] || false
run dolt sql -q "ALTER TABLE child DROP FOREIGN KEY fk_name"
[ "$status" -eq "1" ]
}
@test "foreign-keys: RENAME TABLE" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
CONSTRAINT fk_name FOREIGN KEY (parent_id)
REFERENCES parent(id)
);
RENAME TABLE parent TO new_parent;
SQL
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name` FOREIGN KEY (`parent_id`) REFERENCES `new_parent` (`id`)' ]] || false
dolt sql -q "RENAME TABLE child TO new_child;"
run dolt schema show new_child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name` FOREIGN KEY (`parent_id`) REFERENCES `new_parent` (`id`)' ]] || false
}
@test "foreign-keys: dolt table mv" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
CONSTRAINT fk_name FOREIGN KEY (parent_id)
REFERENCES parent(id)
);
SQL
dolt table mv parent new_parent
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name` FOREIGN KEY (`parent_id`) REFERENCES `new_parent` (`id`)' ]] || false
dolt table mv child new_child;
run dolt schema show new_child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_name` FOREIGN KEY (`parent_id`) REFERENCES `new_parent` (`id`)' ]] || false
}
@test "foreign-keys: DROP TABLE" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
CONSTRAINT fk_name FOREIGN KEY (parent_id)
REFERENCES parent(id)
);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ "$output" =~ 'CONSTRAINT `fk_name`' ]] || false
run dolt sql -q "DROP TABLE parent"
[ "$status" -eq "1" ]
dolt sql -q "DROP TABLE child"
run dolt index ls parent
[ "$status" -eq "0" ]
! [[ "$output" =~ "(id) HIDDEN" ]] || false
dolt sql -q "DROP TABLE parent"
}
@test "foreign-keys: dolt table rm" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
CONSTRAINT fk_name FOREIGN KEY (parent_id)
REFERENCES parent(id)
);
SQL
run dolt index ls parent
[ "$status" -eq "0" ]
[[ "$output" =~ "(id) HIDDEN" ]] || false
run dolt index ls child
[ "$status" -eq "0" ]
[[ "$output" =~ "(parent_id) HIDDEN" ]] || false
run dolt schema show child
[ "$status" -eq "0" ]
[[ "$output" =~ 'CONSTRAINT `fk_name`' ]] || false
run dolt table rm parent
[ "$status" -eq "1" ]
dolt table rm child
run dolt index ls parent
[ "$status" -eq "0" ]
! [[ "$output" =~ "(id) HIDDEN" ]] || false
dolt table rm parent
}
@test "foreign-keys: ALTER TABLE RENAME COLUMN" {
dolt sql <<SQL
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id)
REFERENCES parent(id)
);
ALTER TABLE parent RENAME COLUMN id TO id_new;
ALTER TABLE child RENAME COLUMN parent_id TO parent_id_new;
SQL
run dolt schema show child
[ "$status" -eq "0" ]
[[ `echo "$output" | tr -d "\n" | tr -s " "` =~ 'CONSTRAINT `fk_child_parent_1` FOREIGN KEY (`parent_id_new`) REFERENCES `parent` (`id_new`)' ]] || false
}