-C Remove\san\sunused\svariable\sfrom\sfkey.c.
-D 2009-09-29T11:28:52
+C Check\sthat\sa\sunique\sindex\suses\sthe\sdefault\scollation\ssequences\sfor\seach\scolumn\sbefore\susing\sit\sas\spart\sof\sa\sforeign\skey\sconstraint\soperation.
+D 2009-09-29T15:41:58
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in 4ca3f1dd6efa2075bcb27f4dc43eef749877740d
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
F src/delete.c 2a3d6fc0861b2f8dbd9feb7847b390267b281c60
F src/expr.c c7f3f718bd5c392344ec8694a41c1824f30cf375
F src/fault.c dc88c821842157460750d2d61a8a8b4197d047ff
-F src/fkey.c 93b4f9a94828046164db48c09844f1e6ec393917
+F src/fkey.c aed9dc4cb046a014f6ea1b6a88cfb440eb9e505d
F src/func.c e536218d193b8d326aab91120bc4c6f28aa2b606
F src/global.c 271952d199a8cc59d4ce840b3bbbfd2f30c8ba32
F src/hash.c ebcaa921ffd9d86f7ea5ae16a0a29d1c871130a7
F test/filectrl.test 8923a6dc7630f31c8a9dd3d3d740aa0922df7bf8
F test/filefmt.test 84e3d0fe9f12d0d2ac852465c6f8450aea0d6f43
F test/fkey1.test 01c7de578e11747e720c2d9aeef27f239853c4da
-F test/fkey2.test 73f7f72f9890f53b3e6a6c9c121d110761d8801c
+F test/fkey2.test dbed32250f12630eba0c7f5753b00163b1894f98
F test/fkey3.test c17565b40c97a0dd5102610183c744611171b5ec
F test/fkey_malloc.test da912d000bb6ceb1cd11b655de1989762fa71ceb
F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P e4eb227b14e4bfcb9f7f284692a391b7355f0204
-R 9bd832543a2e03237ad6098a8f125dae
+P 582bd7682831362cd0e2f91ac0dba5ab2b7e2983
+R 3ab2e65e80babb1c9a5df9ed1abb2dff
U dan
-Z 526a624040eb93cff35148e0dfdd82cd
+Z 01b8ddbb56d6c81de7ecc57f15cb5ec5
}else{
/* If zKey is non-NULL, then this foreign key was declared to
** map to an explicit list of columns in table pParent. Check if this
- ** index matches those columns. */
+ ** index matches those columns. Also, check that the index uses
+ ** the default collation sequences for each column. */
int i, j;
for(i=0; i<nCol; i++){
- char *zIdxCol = pParent->aCol[pIdx->aiColumn[i]].zName;
+ int iCol = pIdx->aiColumn[i]; /* Index of column in parent tbl */
+ char *zDfltColl; /* Def. collation for column */
+ char *zIdxCol; /* Name of indexed column */
+
+ /* If the index uses a collation sequence that is different from
+ ** the default collation sequence for the column, this index is
+ ** unusable. Bail out early in this case. */
+ zDfltColl = pParent->aCol[iCol].zColl;
+ if( !zDfltColl ){
+ zDfltColl = "BINARY";
+ }
+ if( sqlite3StrICmp(pIdx->azColl[i], zDfltColl) ) break;
+
+ zIdxCol = pParent->aCol[iCol].zName;
for(j=0; j<nCol; j++){
if( sqlite3StrICmp(pFKey->aCol[j].zCol, zIdxCol)==0 ){
if( aiCol ) aiCol[i] = pFKey->aCol[j].iFrom;
execsql { PRAGMA count_changes = 0 }
drop_all_tables
+do_test fkey2-1.4.0 {
+ execsql [string map {/D/ {}} $FkeySimpleSchema]
+ execsql { PRAGMA count_changes = 1 }
+} {}
+foreach {tn zSql res} $FkeySimpleTests {
+ if {$res == "0 {}"} { set res {0 1} }
+ execsql BEGIN
+ do_test fkey2-1.4.$tn { catchsql $zSql } $res
+ execsql COMMIT
+}
+execsql { PRAGMA count_changes = 0 }
+drop_all_tables
+
# Special test: When the parent key is an IPK, make sure the affinity of
# the IPK is not applied to the child key value before it is inserted
# into the child table.
-do_test fkey2-1.4.1 {
+do_test fkey2-1.5.1 {
execsql {
CREATE TABLE i(i INTEGER PRIMARY KEY);
CREATE TABLE j(j REFERENCES i);
SELECT j, typeof(j) FROM j;
}
} {35.0 text}
-do_test fkey2-1.4.2 {
+do_test fkey2-1.5.2 {
catchsql { DELETE FROM i }
} {1 {foreign key constraint failed}}
# Same test using a regular primary key with integer affinity.
drop_all_tables
-do_test fkey2-1.5.1 {
+do_test fkey2-1.6.1 {
execsql {
CREATE TABLE i(i INT UNIQUE);
CREATE TABLE j(j REFERENCES i(i));
SELECT i, typeof(i) FROM i;
}
} {35.0 text 35 integer}
-do_test fkey2-1.5.2 {
+do_test fkey2-1.6.2 {
catchsql { DELETE FROM i }
} {1 {foreign key constraint failed}}
# Use a collation sequence on the parent key.
drop_all_tables
-do_test fkey2-1.6.1 {
+do_test fkey2-1.7.1 {
execsql {
CREATE TABLE i(i TEXT COLLATE nocase PRIMARY KEY);
CREATE TABLE j(j TEXT COLLATE binary REFERENCES i(i));
# Use the parent key collation even if it is default and the child key
# has an explicit value.
drop_all_tables
-do_test fkey2-1.6.2 {
+do_test fkey2-1.7.2 {
execsql {
CREATE TABLE i(i TEXT PRIMARY KEY); -- Colseq is "BINARY"
CREATE TABLE j(j TEXT COLLATE nocase REFERENCES i(i));
}
catchsql { INSERT INTO j VALUES('sqlite') }
} {1 {foreign key constraint failed}}
-do_test fkey2-1.6.3 {
+do_test fkey2-1.7.3 {
execsql {
INSERT INTO i VALUES('sqlite');
INSERT INTO j VALUES('sqlite');
execsql COMMIT;
execsql { SELECT * FROM ab; SELECT * FROM cd; SELECT * FROM ef }
} {1 b 1 d 1 e}
+
do_test fkey2-3.2.1 {
execsql BEGIN;
catchsql { DELETE FROM ab }
catchsql { DELETE FROM t1 }
} {1 {foreign key constraint failed}}
+do_test fkey2-9.2.1 {
+ execsql {
+ CREATE TABLE pp(a, b, c, PRIMARY KEY(b, c));
+ CREATE TABLE cc(d DEFAULT 3, e DEFAULT 1, f DEFAULT 2,
+ FOREIGN KEY(f, d) REFERENCES pp
+ ON UPDATE SET DEFAULT
+ ON DELETE SET NULL
+ );
+ INSERT INTO pp VALUES(1, 2, 3);
+ INSERT INTO pp VALUES(4, 5, 6);
+ INSERT INTO pp VALUES(7, 8, 9);
+ }
+} {}
+do_test fkey2-9.2.2 {
+ execsql {
+ INSERT INTO cc VALUES(6, 'A', 5);
+ INSERT INTO cc VALUES(6, 'B', 5);
+ INSERT INTO cc VALUES(9, 'A', 8);
+ INSERT INTO cc VALUES(9, 'B', 8);
+ UPDATE pp SET b = 1 WHERE a = 7;
+ SELECT * FROM cc;
+ }
+} {6 A 5 6 B 5 3 A 2 3 B 2}
+do_test fkey2-9.2.3 {
+ execsql {
+ DELETE FROM pp WHERE a = 4;
+ SELECT * FROM cc;
+ }
+} {{} A {} {} B {} 3 A 2 3 B 2}
+
#-------------------------------------------------------------------------
# The following tests, fkey2-10.*, test "foreign key mismatch" and
# other errors.
} {
CREATE TABLE p(a, b, PRIMARY KEY(a, b));
CREATE TABLE c(x REFERENCES p);
+} {
+ CREATE TABLE p(a COLLATE binary, b);
+ CREATE UNIQUE INDEX i ON p(a COLLATE nocase);
+ CREATE TABLE c(x REFERENCES p(a));
}] {
drop_all_tables
INSERT INTO t1 VALUES(3, 'three');
}
} {}
-
do_test fkey2-12.1.2 {
execsql "BEGIN"
execsql "INSERT INTO t2 VALUES('two')"