Annotation of embedaddon/sqlite3/tool/genfkey.test, revision 1.1.1.1

1.1       misho       1: 
                      2: package require sqlite3
                      3: 
                      4: proc do_test {name cmd expected} {
                      5:   puts -nonewline "$name ..."
                      6:   set res [uplevel $cmd]
                      7:   if {$res eq $expected} {
                      8:     puts Ok
                      9:   } else {
                     10:     puts Error
                     11:     puts "  Got: $res"
                     12:     puts "  Expected: $expected"
                     13:     exit
                     14:   }
                     15: }
                     16: 
                     17: proc execsql {sql} {
                     18:   uplevel [list db eval $sql]
                     19: }
                     20: 
                     21: proc catchsql {sql} {
                     22:   set rc [catch {uplevel [list db eval $sql]} msg]
                     23:   list $rc $msg
                     24: }
                     25: 
                     26: file delete -force test.db test.db.journal
                     27: sqlite3 db test.db
                     28: 
                     29: # The following tests - genfkey-1.* - test RESTRICT foreign keys.
                     30: #
                     31: do_test genfkey-1.1 {
                     32:   execsql {
                     33:     CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c));
                     34:     CREATE TABLE t2(e REFERENCES t1, f);
                     35:     CREATE TABLE t3(g, h, i, FOREIGN KEY (h, i) REFERENCES t1(b, c));
                     36:   }
                     37: } {}
                     38: do_test genfkey-1.2 {
                     39:   execsql [exec ./sqlite3 test.db .genfkey]
                     40: } {}
                     41: do_test genfkey-1.3 {
                     42:   catchsql { INSERT INTO t2 VALUES(1, 2) }
                     43: } {1 {constraint failed}}
                     44: do_test genfkey-1.4 {
                     45:   execsql {
                     46:     INSERT INTO t1 VALUES(1, 2, 3);
                     47:     INSERT INTO t2 VALUES(1, 2);
                     48:   }
                     49: } {}
                     50: do_test genfkey-1.5 {
                     51:   execsql { INSERT INTO t2 VALUES(NULL, 3) }
                     52: } {}
                     53: do_test genfkey-1.6 {
                     54:   catchsql { UPDATE t2 SET e = 5 WHERE e IS NULL }
                     55: } {1 {constraint failed}}
                     56: do_test genfkey-1.7 {
                     57:   execsql { UPDATE t2 SET e = 1 WHERE e IS NULL }
                     58: } {}
                     59: do_test genfkey-1.8 {
                     60:   execsql { UPDATE t2 SET e = NULL WHERE f = 3 }
                     61: } {}
                     62: do_test genfkey-1.9 {
                     63:   catchsql { UPDATE t1 SET a = 10 }
                     64: } {1 {constraint failed}}
                     65: do_test genfkey-1.9a {
                     66:   catchsql { UPDATE t1 SET a = NULL }
                     67: } {1 {datatype mismatch}}
                     68: do_test genfkey-1.10 {
                     69:   catchsql { DELETE FROM t1 }
                     70: } {1 {constraint failed}}
                     71: do_test genfkey-1.11 {
                     72:   execsql { UPDATE t2 SET e = NULL }
                     73: } {}
                     74: do_test genfkey-1.12 {
                     75:   execsql { 
                     76:     UPDATE t1 SET a = 10 ;
                     77:     DELETE FROM t1;
                     78:     DELETE FROM t2;
                     79:   }
                     80: } {}
                     81: 
                     82: do_test genfkey-1.13 {
                     83:   execsql {
                     84:     INSERT INTO t3 VALUES(1, NULL, NULL);
                     85:     INSERT INTO t3 VALUES(1, 2, NULL);
                     86:     INSERT INTO t3 VALUES(1, NULL, 3);
                     87:   }
                     88: } {}
                     89: do_test genfkey-1.14 {
                     90:   catchsql { INSERT INTO t3 VALUES(3, 1, 4) }
                     91: } {1 {constraint failed}}
                     92: do_test genfkey-1.15 {
                     93:   execsql { 
                     94:     INSERT INTO t1 VALUES(1, 1, 4);
                     95:     INSERT INTO t3 VALUES(3, 1, 4);
                     96:   }
                     97: } {}
                     98: do_test genfkey-1.16 {
                     99:   catchsql { DELETE FROM t1 }
                    100: } {1 {constraint failed}}
                    101: do_test genfkey-1.17 {
                    102:   catchsql { UPDATE t1 SET b = 10}
                    103: } {1 {constraint failed}}
                    104: do_test genfkey-1.18 {
                    105:   execsql { UPDATE t1 SET a = 10}
                    106: } {}
                    107: do_test genfkey-1.19 {
                    108:   catchsql { UPDATE t3 SET h = 'hello' WHERE i = 3}
                    109: } {1 {constraint failed}}
                    110: 
                    111: do_test genfkey-1.X {
                    112:   execsql {
                    113:     DROP TABLE t1;
                    114:     DROP TABLE t2;
                    115:     DROP TABLE t3;
                    116:   }
                    117: } {}
                    118: 
                    119: # The following tests - genfkey-2.* - test CASCADE foreign keys.
                    120: #
                    121: do_test genfkey-2.1 {
                    122:   execsql {
                    123:     CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c));
                    124:     CREATE TABLE t2(e REFERENCES t1 ON UPDATE CASCADE ON DELETE CASCADE, f);
                    125:     CREATE TABLE t3(g, h, i, 
                    126:         FOREIGN KEY (h, i) 
                    127:         REFERENCES t1(b, c) ON UPDATE CASCADE ON DELETE CASCADE
                    128:     );
                    129:   }
                    130: } {}
                    131: do_test genfkey-2.2 {
                    132:   execsql [exec ./sqlite3 test.db .genfkey]
                    133: } {}
                    134: do_test genfkey-2.3 {
                    135:   execsql {
                    136:     INSERT INTO t1 VALUES(1, 2, 3);
                    137:     INSERT INTO t1 VALUES(4, 5, 6);
                    138:     INSERT INTO t2 VALUES(1, 'one');
                    139:     INSERT INTO t2 VALUES(4, 'four');
                    140:   }
                    141: } {}
                    142: do_test genfkey-2.4 {
                    143:   execsql {
                    144:     UPDATE t1 SET a = 2 WHERE a = 1;
                    145:     SELECT * FROM t2;
                    146:   }
                    147: } {2 one 4 four}
                    148: do_test genfkey-2.5 {
                    149:   execsql {
                    150:     DELETE FROM t1 WHERE a = 4;
                    151:     SELECT * FROM t2;
                    152:   }
                    153: } {2 one}
                    154: do_test genfkey-2.6 {
                    155:   execsql {
                    156:     INSERT INTO t3 VALUES('hello', 2, 3);
                    157:     UPDATE t1 SET c = 2;
                    158:     SELECT * FROM t3;
                    159:   }
                    160: } {hello 2 2}
                    161: do_test genfkey-2.7 {
                    162:   execsql {
                    163:     DELETE FROM t1;
                    164:     SELECT * FROM t3;
                    165:   }
                    166: } {}
                    167: do_test genfkey-2.X {
                    168:   execsql {
                    169:     DROP TABLE t1;
                    170:     DROP TABLE t2;
                    171:     DROP TABLE t3;
                    172:   }
                    173: } {}
                    174: 
                    175: 
                    176: # The following tests - genfkey-3.* - test SET NULL foreign keys.
                    177: #
                    178: do_test genfkey-3.1 {
                    179:   execsql {
                    180:     CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(c, b));
                    181:     CREATE TABLE t2(e REFERENCES t1 ON UPDATE SET NULL ON DELETE SET NULL, f);
                    182:     CREATE TABLE t3(g, h, i, 
                    183:         FOREIGN KEY (h, i) 
                    184:         REFERENCES t1(b, c) ON UPDATE SET NULL ON DELETE SET NULL
                    185:     );
                    186:   }
                    187: } {}
                    188: do_test genfkey-3.2 {
                    189:   execsql [exec ./sqlite3 test.db .genfkey]
                    190: } {}
                    191: do_test genfkey-3.3 {
                    192:   execsql {
                    193:     INSERT INTO t1 VALUES(1, 2, 3);
                    194:     INSERT INTO t1 VALUES(4, 5, 6);
                    195:     INSERT INTO t2 VALUES(1, 'one');
                    196:     INSERT INTO t2 VALUES(4, 'four');
                    197:   }
                    198: } {}
                    199: do_test genfkey-3.4 {
                    200:   execsql {
                    201:     UPDATE t1 SET a = 2 WHERE a = 1;
                    202:     SELECT * FROM t2;
                    203:   }
                    204: } {{} one 4 four}
                    205: do_test genfkey-3.5 {
                    206:   execsql {
                    207:     DELETE FROM t1 WHERE a = 4;
                    208:     SELECT * FROM t2;
                    209:   }
                    210: } {{} one {} four}
                    211: do_test genfkey-3.6 {
                    212:   execsql {
                    213:     INSERT INTO t3 VALUES('hello', 2, 3);
                    214:     UPDATE t1 SET c = 2;
                    215:     SELECT * FROM t3;
                    216:   }
                    217: } {hello {} {}}
                    218: do_test genfkey-2.7 {
                    219:   execsql {
                    220:     UPDATE t3 SET h = 2, i = 2;
                    221:     DELETE FROM t1;
                    222:     SELECT * FROM t3;
                    223:   }
                    224: } {hello {} {}}
                    225: do_test genfkey-3.X {
                    226:   execsql {
                    227:     DROP TABLE t1;
                    228:     DROP TABLE t2;
                    229:     DROP TABLE t3;
                    230:   }
                    231: } {}
                    232: 
                    233: # The following tests - genfkey-4.* - test that errors in the schema
                    234: # are detected correctly.
                    235: #
                    236: do_test genfkey-4.1 {
                    237:   execsql {
                    238:     CREATE TABLE t1(a REFERENCES nosuchtable, b);
                    239:     CREATE TABLE t2(a REFERENCES t1, b);
                    240: 
                    241:     CREATE TABLE t3(a, b, c, PRIMARY KEY(a, b));
                    242:     CREATE TABLE t4(a, b, c, FOREIGN KEY(c, b) REFERENCES t3);
                    243: 
                    244:     CREATE TABLE t5(a REFERENCES t4(d), b, c);
                    245:     CREATE TABLE t6(a REFERENCES t4(a), b, c);
                    246:     CREATE TABLE t7(a REFERENCES t3(a), b, c);
                    247:     CREATE TABLE t8(a REFERENCES nosuchtable(a), b, c);
                    248:   }
                    249: } {}
                    250: 
                    251: do_test genfkey-4.X {
                    252:   set rc [catch {exec ./sqlite3 test.db .genfkey} msg]
                    253:   list $rc $msg
                    254: } "1 {[string trim {
                    255: Error in table t5: foreign key columns do not exist
                    256: Error in table t8: foreign key columns do not exist
                    257: Error in table t4: implicit mapping to composite primary key
                    258: Error in table t1: implicit mapping to non-existant primary key
                    259: Error in table t2: implicit mapping to non-existant primary key
                    260: Error in table t6: foreign key is not unique
                    261: Error in table t7: foreign key is not unique
                    262: }]}"
                    263: 
                    264: # Test that ticket #3800 has been resolved.
                    265: #
                    266: do_test genfkey-5.1 {
                    267:   execsql {
                    268:     DROP TABLE t1; DROP TABLE t2; DROP TABLE t3;
                    269:     DROP TABLE t4; DROP TABLE t5; DROP TABLE t6;
                    270:     DROP TABLE t7; DROP TABLE t8;
                    271:   }
                    272: } {}
                    273: do_test genfkey-5.2 {
                    274:   execsql {
                    275:     CREATE TABLE "t.3" (c1 PRIMARY KEY);
                    276:     CREATE TABLE t13 (c1, foreign key(c1) references "t.3"(c1));
                    277:   }
                    278: } {}
                    279: do_test genfkey-5.3 {
                    280:   set rc [catch {exec ./sqlite3 test.db .genfkey} msg]
                    281: } {0}
                    282: do_test genfkey-5.4 {
                    283:   db eval $msg
                    284: } {}
                    285: do_test genfkey-5.5 {
                    286:   catchsql { INSERT INTO t13 VALUES(1) }
                    287: } {1 {constraint failed}}
                    288: do_test genfkey-5.5 {
                    289:   catchsql { 
                    290:     INSERT INTO "t.3" VALUES(1);
                    291:     INSERT INTO t13 VALUES(1);
                    292:   }
                    293: } {0 {}}
                    294: 
                    295: # Test also column names that require quoting.
                    296: do_test genfkey-6.1 {
                    297:   execsql {
                    298:     DROP TABLE "t.3";
                    299:     DROP TABLE t13;
                    300:     CREATE TABLE p(
                    301:       "a.1 first", "b.2 second", 
                    302:       UNIQUE("a.1 first", "b.2 second")
                    303:     );
                    304:     CREATE TABLE c(
                    305:       "c.1 I", "d.2 II", 
                    306:         FOREIGN KEY("c.1 I", "d.2 II") 
                    307:         REFERENCES p("a.1 first", "b.2 second")
                    308:         ON UPDATE CASCADE ON DELETE CASCADE
                    309:     );
                    310:   }
                    311: } {}
                    312: do_test genfkey-6.2 {
                    313:   set rc [catch {exec ./sqlite3 test.db .genfkey} msg]
                    314: } {0}
                    315: do_test genfkey-6.3 {
                    316:   execsql $msg
                    317:   execsql {
                    318:     INSERT INTO p VALUES('A', 'B');
                    319:     INSERT INTO p VALUES('C', 'D');
                    320:     INSERT INTO c VALUES('A', 'B');
                    321:     INSERT INTO c VALUES('C', 'D');
                    322:     UPDATE p SET "a.1 first" = 'X' WHERE rowid = 1;
                    323:     DELETE FROM p WHERE rowid = 2;
                    324:   }
                    325:   execsql { SELECT * FROM c }
                    326: } {X B}
                    327: 
                    328: do_test genfkey-6.4 {
                    329:   execsql {
                    330:     DROP TABLE p;
                    331:     DROP TABLE c;
                    332:     CREATE TABLE parent("a.1", PRIMARY KEY("a.1"));
                    333:     CREATE TABLE child("b.2", FOREIGN KEY("b.2") REFERENCES parent("a.1"));
                    334:   }
                    335:   set rc [catch {exec ./sqlite3 test.db .genfkey} msg]
                    336: } {0}
                    337: do_test genfkey-6.5 {
                    338:   execsql $msg
                    339:   execsql {
                    340:     INSERT INTO parent VALUES(1);
                    341:     INSERT INTO child VALUES(1);
                    342:   }
                    343:   catchsql { UPDATE parent SET "a.1"=0 }
                    344: } {1 {constraint failed}}
                    345: do_test genfkey-6.6 {
                    346:   catchsql { UPDATE child SET "b.2"=7 }
                    347: } {1 {constraint failed}}
                    348: do_test genfkey-6.7 {
                    349:   execsql {
                    350:     SELECT * FROM parent;
                    351:     SELECT * FROM child;
                    352:   }
                    353: } {1 1}
                    354: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>