From 4c4298392e109ca67a25626f50f87715356b67b6 Mon Sep 17 00:00:00 2001
From: drh <drh@noemail.net>
Date: Mon, 12 Oct 2009 22:30:49 +0000
Subject: [PATCH] Add asserts as evidence that all FK constraints are either
 immediate or deferred.

FossilOrigin-Name: 634ef4fc9f4051245b38f558bb1c733031548c2f
---
 manifest        | 22 +++++++++++-----------
 manifest.uuid   |  2 +-
 src/build.c     |  2 +-
 src/fkey.c      |  6 +++++-
 src/sqliteInt.h |  1 +
 5 files changed, 19 insertions(+), 14 deletions(-)

diff --git a/manifest b/manifest
index 21c0be2c37..871b1a258a 100644
--- a/manifest
+++ b/manifest
@@ -1,8 +1,8 @@
 -----BEGIN PGP SIGNED MESSAGE-----
 Hash: SHA1
 
-C When\sprocessing\sFK\sconstraints\son\schanges\sto\sparent\stables,\smake\ssure\sthe\nnames\sof\schild\stables\sappear\scorrectly\sin\sthe\soutput\sof\sEXPLAIN\sQUERY\sPLAN.
-D 2009-10-12T20:01:50
+C Add\sasserts\sas\sevidence\sthat\sall\sFK\sconstraints\sare\seither\simmediate\sor\ndeferred.
+D 2009-10-12T22:30:49
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 4ca3f1dd6efa2075bcb27f4dc43eef749877740d
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -112,14 +112,14 @@ F src/btmutex.c 0f43a75bb5b8147b386e8e1c3e71ba734e3863b7
 F src/btree.c 9c425425784c5d569bc0309c22251698ba906451
 F src/btree.h 577448a890c2ab9b21e6ab74f073526184bceebe
 F src/btreeInt.h 1c86297e69380f6577e7ae67452597dd8d5c2705
-F src/build.c 1988dad2799d0421cd9fb6431fd3a1667115522e
+F src/build.c 3c5762687d0554ebe8844dfaddb828fcc15fe16d
 F src/callback.c 10d237171472865f58fb07d515737238c9e06688
 F src/complete.c 5ad5c6cd4548211867c204c41a126d73a9fbcea0
 F src/date.c 657ff12ca0f1195b531561afacbb38b772d16638
 F src/delete.c 308e300d599d2d11b838687e2cf7309d42f29a1a
 F src/expr.c c7f3f718bd5c392344ec8694a41c1824f30cf375
 F src/fault.c dc88c821842157460750d2d61a8a8b4197d047ff
-F src/fkey.c 2b79b3851b6f12104ab1d9f63566a117728926e2
+F src/fkey.c 34ee2b0d60cc52f05dd6a205ce843c248096b509
 F src/func.c e536218d193b8d326aab91120bc4c6f28aa2b606
 F src/global.c 271952d199a8cc59d4ce840b3bbbfd2f30c8ba32
 F src/hash.c ebcaa921ffd9d86f7ea5ae16a0a29d1c871130a7
@@ -167,7 +167,7 @@ F src/select.c 1d0a13137532321b4364f964e46f057d271691e3
 F src/shell.c 270231b3f587f1f86391b9994fdfcd5d472c3fdf
 F src/sqlite.h.in 8e1ccddb12b5e983d0a17e1f1477c72b0a72dd84
 F src/sqlite3ext.h 1db7d63ab5de4b3e6b83dd03d1a4e64fef6d2a17
-F src/sqliteInt.h 61c55f5f83c63813903f374e9b33173572f0559a
+F src/sqliteInt.h 44cded4d6b78fe5fb5339454c44e51c64b7d8ed8
 F src/sqliteLimit.h 38b2fffcd01faeaeaadea71b2b47695a81580c8b
 F src/status.c 237b193efae0cf6ac3f0817a208de6c6c6ef6d76
 F src/table.c cc86ad3d6ad54df7c63a3e807b5783c90411a08d
@@ -759,14 +759,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P 5633cb2b5b91a54e677dde76e31e319cd7d51780
-R bbf4996fcde5fed7535634c628dbe80e
+P a4ab5215fed231c8e5f8714f5cadafd1209b362a
+R 4b18d30182072a8cd3031fc782eadfe8
 U drh
-Z ca40e99b9f3c91922320c8e8c4d2d4d4
+Z ae8de04e4c5b2fdecf560180fe83fec1
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.6 (GNU/Linux)
 
-iD8DBQFK04sxoxKgR168RlERAmiVAJwP98j7ZksNarQBrEoSyQpXdMhFawCeNsx6
-Fz9yjd/luwPASc49P+Yopuk=
-=NY9x
+iD8DBQFK064doxKgR168RlERAlWQAJ92yqj4W/BOhV0IW1IUn+D4AqGiwgCeKY3c
+ofWKl3KBlauHoZ3hAzBbU2Y=
+=e87L
 -----END PGP SIGNATURE-----
diff --git a/manifest.uuid b/manifest.uuid
index b6b786996b..e04631e9d5 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-a4ab5215fed231c8e5f8714f5cadafd1209b362a
\ No newline at end of file
+634ef4fc9f4051245b38f558bb1c733031548c2f
\ No newline at end of file
diff --git a/src/build.c b/src/build.c
index 215b3c0a99..7b0ea04bfc 100644
--- a/src/build.c
+++ b/src/build.c
@@ -2267,7 +2267,7 @@ void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){
   Table *pTab;
   FKey *pFKey;
   if( (pTab = pParse->pNewTable)==0 || (pFKey = pTab->pFKey)==0 ) return;
-  assert( isDeferred==0 || isDeferred==1 );
+  assert( isDeferred==0 || isDeferred==1 ); /* EV: R-30323-21917 */
   pFKey->isDeferred = (u8)isDeferred;
 #endif
 }
diff --git a/src/fkey.c b/src/fkey.c
index 55d0a4f92d..8af7ea9243 100644
--- a/src/fkey.c
+++ b/src/fkey.c
@@ -1178,7 +1178,11 @@ void sqlite3FkDelete(Table *pTab){
     fkTriggerDelete(pTab->dbMem, pFKey->apTrigger[1]);
 #endif
 
-    /* Delete the memory allocated for the FK structure. */
+    /* EV: R-30323-21917 Each foreign key constraint in SQLite is
+    ** classified as either immediate or deferred.
+    */
+    assert( pFKey->isDeferred==0 || pFKey->isDeferred==1 );
+
     pNext = pFKey->pNextFrom;
     sqlite3DbFree(pTab->dbMem, pFKey);
   }
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index 03ff1be11d..2675f44fb1 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -1289,6 +1289,7 @@ struct FKey {
   FKey *pNextTo;    /* Next foreign key on table named zTo */
   FKey *pPrevTo;    /* Previous foreign key on table named zTo */
   int nCol;         /* Number of columns in this key */
+  /* EV: R-30323-21917 */
   u8 isDeferred;    /* True if constraint checking is deferred till COMMIT */
   u8 aAction[2];          /* ON DELETE and ON UPDATE actions, respectively */
   Trigger *apTrigger[2];  /* Triggers for aAction[] actions */