]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add tests to check that FK support interacts with count-changes correctly.
authordan <dan@noemail.net>
Thu, 1 Oct 2009 04:35:05 +0000 (04:35 +0000)
committerdan <dan@noemail.net>
Thu, 1 Oct 2009 04:35:05 +0000 (04:35 +0000)
FossilOrigin-Name: 5b8366154b2a91c1be3e7e52ec270ecdfe7d2bb1

manifest
manifest.uuid
test/fkey2.test

index 3ee559c4725a164a30178dab21d13bb20d4e5807..8c6234d275e1a67dfec7d4b31829abaf240c3e1f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Remove\sunreachable\sbranches\sfrom\sfkey.c.\sAdd\sa\sfew\stests\sto\scover\sthe\sremaining\sbranches.
-D 2009-09-30T08:11:07
+C Add\stests\sto\scheck\sthat\sFK\ssupport\sinteracts\swith\scount-changes\scorrectly.
+D 2009-10-01T04:35:06
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 4ca3f1dd6efa2075bcb27f4dc43eef749877740d
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -330,7 +330,7 @@ F test/expr.test 9f521ae22f00e074959f72ce2e55d46b9ed23f68
 F test/filectrl.test 8923a6dc7630f31c8a9dd3d3d740aa0922df7bf8
 F test/filefmt.test 84e3d0fe9f12d0d2ac852465c6f8450aea0d6f43
 F test/fkey1.test 01c7de578e11747e720c2d9aeef27f239853c4da
-F test/fkey2.test 023917f6d133da94088fe4eafcdfceb81abade83
+F test/fkey2.test 7ca63ae07839e700698655010788502b0e5d3e65
 F test/fkey3.test c17565b40c97a0dd5102610183c744611171b5ec
 F test/fkey_malloc.test a5ede29bd2f6e56dea78c3d43fb86dd696c068c8
 F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb
@@ -755,7 +755,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P b733e939f785111eac987fe4a25ccfa512e4f0b4
-R b65fcb7a6b9e80aa54f47592d37aa613
+P 0a0a17d87c990a811a2755b9d9d4141b611b49db
+R 71d9a87efb7de6c5e2fcba593dc5c2be
 U dan
-Z bf04350be182c658296913fed86e36e0
+Z 7c4cee03a1a1dae14dd3d77db4d5358b
index 071d9422036b89919fac06a7049d525fa009c542..7af80d081c6cb896e66a44c822d7062f21176e36 100644 (file)
@@ -1 +1 @@
-0a0a17d87c990a811a2755b9d9d4141b611b49db
\ No newline at end of file
+5b8366154b2a91c1be3e7e52ec270ecdfe7d2bb1
\ No newline at end of file
index 1ae9cce88a512b2c56cffbd89961797864800391..07f8b370ebb777f26832b13b29d872ffee3774a6 100644 (file)
@@ -68,6 +68,9 @@ ifcapable {!foreignkey||!trigger} {
 # fkey2-16.*: Test that rows that refer to themselves may be inserted, 
 #             updated and deleted.
 #
+# fkey2-17.*: Test that the "count_changes" pragma does not interfere with
+#             FK constraint processing.
+#
 # fkey2-genfkey.*: Tests that were used with the shell tool .genfkey
 #            command. Recycled to test the built-in implementation.
 #
@@ -1220,7 +1223,128 @@ foreach {tn zSchema} {
   } {1 {foreign key constraint failed}}
 }
 
+#-------------------------------------------------------------------------
+# This next block of tests, fkey2-17.*, tests that if "PRAGMA count_changes"
+# is turned on statements that violate immediate FK constraints return
+# SQLITE_CONSTRAINT immediately, not after returning a number of rows.
+# Whereas statements that violate deferred FK constraints return the number
+# of rows before failing.
+#
+# Also test that rows modified by FK actions are not counted in either the
+# returned row count or the values returned by sqlite3_changes(). Like
+# trigger related changes, they are included in sqlite3_total_changes() though.
+#
+drop_all_tables
+do_test fkey2-17.1.1 {
+  execsql { PRAGMA count_changes = 1 }
+  execsql { 
+    CREATE TABLE one(a, b, c, UNIQUE(b, c));
+    CREATE TABLE two(d, e, f, FOREIGN KEY(e, f) REFERENCES one(b, c));
+    INSERT INTO one VALUES(1, 2, 3);
+  }
+} {1}
+do_test fkey2-17.1.2 {
+  set STMT [sqlite3_prepare_v2 db "INSERT INTO two VALUES(4, 5, 6)" -1 dummy]
+  sqlite3_step $STMT
+} {SQLITE_CONSTRAINT}
+do_test fkey2-17.1.3 {
+  sqlite3_step $STMT
+} {SQLITE_MISUSE}
+do_test fkey2-17.1.4 {
+  sqlite3_finalize $STMT
+} {SQLITE_CONSTRAINT}
+do_test fkey2-17.1.5 {
+  execsql {
+    INSERT INTO one VALUES(2, 3, 4);
+    INSERT INTO one VALUES(3, 4, 5);
+    INSERT INTO two VALUES(1, 2, 3);
+    INSERT INTO two VALUES(2, 3, 4);
+    INSERT INTO two VALUES(3, 4, 5);
+  }
+} {1 1 1 1 1}
+do_test fkey2-17.1.6 {
+  catchsql {
+    BEGIN;
+      INSERT INTO one VALUES(0, 0, 0);
+      UPDATE two SET e=e+1, f=f+1;
+  }
+} {1 {foreign key constraint failed}}
+do_test fkey2-17.1.7 {
+  execsql { SELECT * FROM one }
+} {1 2 3 2 3 4 3 4 5 0 0 0}
+do_test fkey2-17.1.8 {
+  execsql { SELECT * FROM two }
+} {1 2 3 2 3 4 3 4 5}
+do_test fkey2-17.1.9 {
+  execsql COMMIT
+} {}
+do_test fkey2-17.1.10 {
+  execsql {
+    CREATE TABLE three(
+      g, h, i, 
+      FOREIGN KEY(h, i) REFERENCES one(b, c) DEFERRABLE INITIALLY DEFERRED
+    );
+  }
+} {}
+do_test fkey2-17.1.11 {
+  set STMT [sqlite3_prepare_v2 db "INSERT INTO three VALUES(7, 8, 9)" -1 dummy]
+  sqlite3_step $STMT
+} {SQLITE_ROW}
+do_test fkey2-17.1.12 {
+  sqlite3_column_text $STMT 0
+} {1}
+do_test fkey2-17.1.13 {
+  sqlite3_step $STMT
+} {SQLITE_CONSTRAINT}
+do_test fkey2-17.1.14 {
+  sqlite3_finalize $STMT
+} {SQLITE_CONSTRAINT}
+
+drop_all_tables
+do_test fkey2-17.2.1 {
+  execsql {
+    CREATE TABLE high("a'b!" PRIMARY KEY, b);
+    CREATE TABLE low(
+      c, 
+      "d&6" REFERENCES high ON UPDATE CASCADE ON DELETE CASCADE
+    );
+  }
+} {}
+do_test fkey2-17.2.2 {
+  execsql {
+    INSERT INTO high VALUES('a', 'b');
+    INSERT INTO low VALUES('b', 'a');
+  }
+  db changes
+} {1}
+set nTotal [db total_changes]
+do_test fkey2-17.2.3 {
+  execsql { UPDATE high SET "a'b!" = 'c' }
+} {1}
+do_test fkey2-17.2.4 {
+  db changes
+} {1}
+do_test fkey2-17.2.5 {
+  expr [db total_changes] - $nTotal
+} {2}
+do_test fkey2-17.2.6 {
+  execsql { SELECT * FROM high ; SELECT * FROM low }
+} {c b b c}
+do_test fkey2-17.2.7 {
+  execsql { DELETE FROM high }
+} {1}
+do_test fkey2-17.2.8 {
+  db changes
+} {1}
+do_test fkey2-17.2.9 {
+  expr [db total_changes] - $nTotal
+} {4}
+do_test fkey2-17.2.10 {
+  execsql { SELECT * FROM high ; SELECT * FROM low }
+} {}
 
+
+execsql { PRAGMA count_changes = 0 }
 #-------------------------------------------------------------------------
 # The following block of tests, those prefixed with "fkey2-genfkey.", are 
 # the same tests that were used to test the ".genfkey" command provided