Blame tool/genfkey.test

Packit 87b942
Packit 87b942
package require sqlite3
Packit 87b942
Packit 87b942
proc do_test {name cmd expected} {
Packit 87b942
  puts -nonewline "$name ..."
Packit 87b942
  set res [uplevel $cmd]
Packit 87b942
  if {$res eq $expected} {
Packit 87b942
    puts Ok
Packit 87b942
  } else {
Packit 87b942
    puts Error
Packit 87b942
    puts "  Got: $res"
Packit 87b942
    puts "  Expected: $expected"
Packit 87b942
    exit
Packit 87b942
  }
Packit 87b942
}
Packit 87b942
Packit 87b942
proc execsql {sql} {
Packit 87b942
  uplevel [list db eval $sql]
Packit 87b942
}
Packit 87b942
Packit 87b942
proc catchsql {sql} {
Packit 87b942
  set rc [catch {uplevel [list db eval $sql]} msg]
Packit 87b942
  list $rc $msg
Packit 87b942
}
Packit 87b942
Packit 87b942
file delete -force test.db test.db.journal
Packit 87b942
sqlite3 db test.db
Packit 87b942
Packit 87b942
# The following tests - genfkey-1.* - test RESTRICT foreign keys.
Packit 87b942
#
Packit 87b942
do_test genfkey-1.1 {
Packit 87b942
  execsql {
Packit 87b942
    CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c));
Packit 87b942
    CREATE TABLE t2(e REFERENCES t1, f);
Packit 87b942
    CREATE TABLE t3(g, h, i, FOREIGN KEY (h, i) REFERENCES t1(b, c));
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-1.2 {
Packit 87b942
  execsql [exec ./sqlite3 test.db .genfkey]
Packit 87b942
} {}
Packit 87b942
do_test genfkey-1.3 {
Packit 87b942
  catchsql { INSERT INTO t2 VALUES(1, 2) }
Packit 87b942
} {1 {constraint failed}}
Packit 87b942
do_test genfkey-1.4 {
Packit 87b942
  execsql {
Packit 87b942
    INSERT INTO t1 VALUES(1, 2, 3);
Packit 87b942
    INSERT INTO t2 VALUES(1, 2);
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-1.5 {
Packit 87b942
  execsql { INSERT INTO t2 VALUES(NULL, 3) }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-1.6 {
Packit 87b942
  catchsql { UPDATE t2 SET e = 5 WHERE e IS NULL }
Packit 87b942
} {1 {constraint failed}}
Packit 87b942
do_test genfkey-1.7 {
Packit 87b942
  execsql { UPDATE t2 SET e = 1 WHERE e IS NULL }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-1.8 {
Packit 87b942
  execsql { UPDATE t2 SET e = NULL WHERE f = 3 }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-1.9 {
Packit 87b942
  catchsql { UPDATE t1 SET a = 10 }
Packit 87b942
} {1 {constraint failed}}
Packit 87b942
do_test genfkey-1.9a {
Packit 87b942
  catchsql { UPDATE t1 SET a = NULL }
Packit 87b942
} {1 {datatype mismatch}}
Packit 87b942
do_test genfkey-1.10 {
Packit 87b942
  catchsql { DELETE FROM t1 }
Packit 87b942
} {1 {constraint failed}}
Packit 87b942
do_test genfkey-1.11 {
Packit 87b942
  execsql { UPDATE t2 SET e = NULL }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-1.12 {
Packit 87b942
  execsql { 
Packit 87b942
    UPDATE t1 SET a = 10 ;
Packit 87b942
    DELETE FROM t1;
Packit 87b942
    DELETE FROM t2;
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
Packit 87b942
do_test genfkey-1.13 {
Packit 87b942
  execsql {
Packit 87b942
    INSERT INTO t3 VALUES(1, NULL, NULL);
Packit 87b942
    INSERT INTO t3 VALUES(1, 2, NULL);
Packit 87b942
    INSERT INTO t3 VALUES(1, NULL, 3);
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-1.14 {
Packit 87b942
  catchsql { INSERT INTO t3 VALUES(3, 1, 4) }
Packit 87b942
} {1 {constraint failed}}
Packit 87b942
do_test genfkey-1.15 {
Packit 87b942
  execsql { 
Packit 87b942
    INSERT INTO t1 VALUES(1, 1, 4);
Packit 87b942
    INSERT INTO t3 VALUES(3, 1, 4);
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-1.16 {
Packit 87b942
  catchsql { DELETE FROM t1 }
Packit 87b942
} {1 {constraint failed}}
Packit 87b942
do_test genfkey-1.17 {
Packit 87b942
  catchsql { UPDATE t1 SET b = 10}
Packit 87b942
} {1 {constraint failed}}
Packit 87b942
do_test genfkey-1.18 {
Packit 87b942
  execsql { UPDATE t1 SET a = 10}
Packit 87b942
} {}
Packit 87b942
do_test genfkey-1.19 {
Packit 87b942
  catchsql { UPDATE t3 SET h = 'hello' WHERE i = 3}
Packit 87b942
} {1 {constraint failed}}
Packit 87b942
Packit 87b942
do_test genfkey-1.X {
Packit 87b942
  execsql {
Packit 87b942
    DROP TABLE t1;
Packit 87b942
    DROP TABLE t2;
Packit 87b942
    DROP TABLE t3;
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
Packit 87b942
# The following tests - genfkey-2.* - test CASCADE foreign keys.
Packit 87b942
#
Packit 87b942
do_test genfkey-2.1 {
Packit 87b942
  execsql {
Packit 87b942
    CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c));
Packit 87b942
    CREATE TABLE t2(e REFERENCES t1 ON UPDATE CASCADE ON DELETE CASCADE, f);
Packit 87b942
    CREATE TABLE t3(g, h, i, 
Packit 87b942
        FOREIGN KEY (h, i) 
Packit 87b942
        REFERENCES t1(b, c) ON UPDATE CASCADE ON DELETE CASCADE
Packit 87b942
    );
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-2.2 {
Packit 87b942
  execsql [exec ./sqlite3 test.db .genfkey]
Packit 87b942
} {}
Packit 87b942
do_test genfkey-2.3 {
Packit 87b942
  execsql {
Packit 87b942
    INSERT INTO t1 VALUES(1, 2, 3);
Packit 87b942
    INSERT INTO t1 VALUES(4, 5, 6);
Packit 87b942
    INSERT INTO t2 VALUES(1, 'one');
Packit 87b942
    INSERT INTO t2 VALUES(4, 'four');
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-2.4 {
Packit 87b942
  execsql {
Packit 87b942
    UPDATE t1 SET a = 2 WHERE a = 1;
Packit 87b942
    SELECT * FROM t2;
Packit 87b942
  }
Packit 87b942
} {2 one 4 four}
Packit 87b942
do_test genfkey-2.5 {
Packit 87b942
  execsql {
Packit 87b942
    DELETE FROM t1 WHERE a = 4;
Packit 87b942
    SELECT * FROM t2;
Packit 87b942
  }
Packit 87b942
} {2 one}
Packit 87b942
do_test genfkey-2.6 {
Packit 87b942
  execsql {
Packit 87b942
    INSERT INTO t3 VALUES('hello', 2, 3);
Packit 87b942
    UPDATE t1 SET c = 2;
Packit 87b942
    SELECT * FROM t3;
Packit 87b942
  }
Packit 87b942
} {hello 2 2}
Packit 87b942
do_test genfkey-2.7 {
Packit 87b942
  execsql {
Packit 87b942
    DELETE FROM t1;
Packit 87b942
    SELECT * FROM t3;
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-2.X {
Packit 87b942
  execsql {
Packit 87b942
    DROP TABLE t1;
Packit 87b942
    DROP TABLE t2;
Packit 87b942
    DROP TABLE t3;
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
Packit 87b942
Packit 87b942
# The following tests - genfkey-3.* - test SET NULL foreign keys.
Packit 87b942
#
Packit 87b942
do_test genfkey-3.1 {
Packit 87b942
  execsql {
Packit 87b942
    CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(c, b));
Packit 87b942
    CREATE TABLE t2(e REFERENCES t1 ON UPDATE SET NULL ON DELETE SET NULL, f);
Packit 87b942
    CREATE TABLE t3(g, h, i, 
Packit 87b942
        FOREIGN KEY (h, i) 
Packit 87b942
        REFERENCES t1(b, c) ON UPDATE SET NULL ON DELETE SET NULL
Packit 87b942
    );
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-3.2 {
Packit 87b942
  execsql [exec ./sqlite3 test.db .genfkey]
Packit 87b942
} {}
Packit 87b942
do_test genfkey-3.3 {
Packit 87b942
  execsql {
Packit 87b942
    INSERT INTO t1 VALUES(1, 2, 3);
Packit 87b942
    INSERT INTO t1 VALUES(4, 5, 6);
Packit 87b942
    INSERT INTO t2 VALUES(1, 'one');
Packit 87b942
    INSERT INTO t2 VALUES(4, 'four');
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-3.4 {
Packit 87b942
  execsql {
Packit 87b942
    UPDATE t1 SET a = 2 WHERE a = 1;
Packit 87b942
    SELECT * FROM t2;
Packit 87b942
  }
Packit 87b942
} {{} one 4 four}
Packit 87b942
do_test genfkey-3.5 {
Packit 87b942
  execsql {
Packit 87b942
    DELETE FROM t1 WHERE a = 4;
Packit 87b942
    SELECT * FROM t2;
Packit 87b942
  }
Packit 87b942
} {{} one {} four}
Packit 87b942
do_test genfkey-3.6 {
Packit 87b942
  execsql {
Packit 87b942
    INSERT INTO t3 VALUES('hello', 2, 3);
Packit 87b942
    UPDATE t1 SET c = 2;
Packit 87b942
    SELECT * FROM t3;
Packit 87b942
  }
Packit 87b942
} {hello {} {}}
Packit 87b942
do_test genfkey-2.7 {
Packit 87b942
  execsql {
Packit 87b942
    UPDATE t3 SET h = 2, i = 2;
Packit 87b942
    DELETE FROM t1;
Packit 87b942
    SELECT * FROM t3;
Packit 87b942
  }
Packit 87b942
} {hello {} {}}
Packit 87b942
do_test genfkey-3.X {
Packit 87b942
  execsql {
Packit 87b942
    DROP TABLE t1;
Packit 87b942
    DROP TABLE t2;
Packit 87b942
    DROP TABLE t3;
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
Packit 87b942
# The following tests - genfkey-4.* - test that errors in the schema
Packit 87b942
# are detected correctly.
Packit 87b942
#
Packit 87b942
do_test genfkey-4.1 {
Packit 87b942
  execsql {
Packit 87b942
    CREATE TABLE t1(a REFERENCES nosuchtable, b);
Packit 87b942
    CREATE TABLE t2(a REFERENCES t1, b);
Packit 87b942
Packit 87b942
    CREATE TABLE t3(a, b, c, PRIMARY KEY(a, b));
Packit 87b942
    CREATE TABLE t4(a, b, c, FOREIGN KEY(c, b) REFERENCES t3);
Packit 87b942
Packit 87b942
    CREATE TABLE t5(a REFERENCES t4(d), b, c);
Packit 87b942
    CREATE TABLE t6(a REFERENCES t4(a), b, c);
Packit 87b942
    CREATE TABLE t7(a REFERENCES t3(a), b, c);
Packit 87b942
    CREATE TABLE t8(a REFERENCES nosuchtable(a), b, c);
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
Packit 87b942
do_test genfkey-4.X {
Packit 87b942
  set rc [catch {exec ./sqlite3 test.db .genfkey} msg]
Packit 87b942
  list $rc $msg
Packit 87b942
} "1 {[string trim {
Packit 87b942
Error in table t5: foreign key columns do not exist
Packit 87b942
Error in table t8: foreign key columns do not exist
Packit 87b942
Error in table t4: implicit mapping to composite primary key
Packit 87b942
Error in table t1: implicit mapping to non-existant primary key
Packit 87b942
Error in table t2: implicit mapping to non-existant primary key
Packit 87b942
Error in table t6: foreign key is not unique
Packit 87b942
Error in table t7: foreign key is not unique
Packit 87b942
}]}"
Packit 87b942
Packit 87b942
# Test that ticket #3800 has been resolved.
Packit 87b942
#
Packit 87b942
do_test genfkey-5.1 {
Packit 87b942
  execsql {
Packit 87b942
    DROP TABLE t1; DROP TABLE t2; DROP TABLE t3;
Packit 87b942
    DROP TABLE t4; DROP TABLE t5; DROP TABLE t6;
Packit 87b942
    DROP TABLE t7; DROP TABLE t8;
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-5.2 {
Packit 87b942
  execsql {
Packit 87b942
    CREATE TABLE "t.3" (c1 PRIMARY KEY);
Packit 87b942
    CREATE TABLE t13 (c1, foreign key(c1) references "t.3"(c1));
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-5.3 {
Packit 87b942
  set rc [catch {exec ./sqlite3 test.db .genfkey} msg]
Packit 87b942
} {0}
Packit 87b942
do_test genfkey-5.4 {
Packit 87b942
  db eval $msg
Packit 87b942
} {}
Packit 87b942
do_test genfkey-5.5 {
Packit 87b942
  catchsql { INSERT INTO t13 VALUES(1) }
Packit 87b942
} {1 {constraint failed}}
Packit 87b942
do_test genfkey-5.5 {
Packit 87b942
  catchsql { 
Packit 87b942
    INSERT INTO "t.3" VALUES(1);
Packit 87b942
    INSERT INTO t13 VALUES(1);
Packit 87b942
  }
Packit 87b942
} {0 {}}
Packit 87b942
Packit 87b942
# Test also column names that require quoting.
Packit 87b942
do_test genfkey-6.1 {
Packit 87b942
  execsql {
Packit 87b942
    DROP TABLE "t.3";
Packit 87b942
    DROP TABLE t13;
Packit 87b942
    CREATE TABLE p(
Packit 87b942
      "a.1 first", "b.2 second", 
Packit 87b942
      UNIQUE("a.1 first", "b.2 second")
Packit 87b942
    );
Packit 87b942
    CREATE TABLE c(
Packit 87b942
      "c.1 I", "d.2 II", 
Packit 87b942
        FOREIGN KEY("c.1 I", "d.2 II") 
Packit 87b942
        REFERENCES p("a.1 first", "b.2 second")
Packit 87b942
        ON UPDATE CASCADE ON DELETE CASCADE
Packit 87b942
    );
Packit 87b942
  }
Packit 87b942
} {}
Packit 87b942
do_test genfkey-6.2 {
Packit 87b942
  set rc [catch {exec ./sqlite3 test.db .genfkey} msg]
Packit 87b942
} {0}
Packit 87b942
do_test genfkey-6.3 {
Packit 87b942
  execsql $msg
Packit 87b942
  execsql {
Packit 87b942
    INSERT INTO p VALUES('A', 'B');
Packit 87b942
    INSERT INTO p VALUES('C', 'D');
Packit 87b942
    INSERT INTO c VALUES('A', 'B');
Packit 87b942
    INSERT INTO c VALUES('C', 'D');
Packit 87b942
    UPDATE p SET "a.1 first" = 'X' WHERE rowid = 1;
Packit 87b942
    DELETE FROM p WHERE rowid = 2;
Packit 87b942
  }
Packit 87b942
  execsql { SELECT * FROM c }
Packit 87b942
} {X B}
Packit 87b942
Packit 87b942
do_test genfkey-6.4 {
Packit 87b942
  execsql {
Packit 87b942
    DROP TABLE p;
Packit 87b942
    DROP TABLE c;
Packit 87b942
    CREATE TABLE parent("a.1", PRIMARY KEY("a.1"));
Packit 87b942
    CREATE TABLE child("b.2", FOREIGN KEY("b.2") REFERENCES parent("a.1"));
Packit 87b942
  }
Packit 87b942
  set rc [catch {exec ./sqlite3 test.db .genfkey} msg]
Packit 87b942
} {0}
Packit 87b942
do_test genfkey-6.5 {
Packit 87b942
  execsql $msg
Packit 87b942
  execsql {
Packit 87b942
    INSERT INTO parent VALUES(1);
Packit 87b942
    INSERT INTO child VALUES(1);
Packit 87b942
  }
Packit 87b942
  catchsql { UPDATE parent SET "a.1"=0 }
Packit 87b942
} {1 {constraint failed}}
Packit 87b942
do_test genfkey-6.6 {
Packit 87b942
  catchsql { UPDATE child SET "b.2"=7 }
Packit 87b942
} {1 {constraint failed}}
Packit 87b942
do_test genfkey-6.7 {
Packit 87b942
  execsql {
Packit 87b942
    SELECT * FROM parent;
Packit 87b942
    SELECT * FROM child;
Packit 87b942
  }
Packit 87b942
} {1 1}
Packit 87b942