]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Currently, if SQLite cannot find a table or index referred to by a query, it reloads...
authordan <dan@noemail.net>
Mon, 28 Jun 2010 10:15:19 +0000 (10:15 +0000)
committerdan <dan@noemail.net>
Mon, 28 Jun 2010 10:15:19 +0000 (10:15 +0000)
FossilOrigin-Name: 4932f22848b3d15a2b6dc5fa2cd69ce19182e2a4

manifest
manifest.uuid
src/build.c
src/insert.c
src/resolve.c
src/select.c
src/trigger.c
src/update.c
test/schema3.test [new file with mode: 0644]

index 0ad97323512a7223dace4c17be19fe8aec580b1e..44277cd8413852b7acaa629058f005d18fbf3418 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,8 +1,5 @@
------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA1
-
-C Make\swalIndexTryHdr()\sa\sprivate\sfunction.\s\sFix\san\sissue\swith\sSQLITE_MUTEX_NOOP.
-D 2010-06-26T22:16:03
+C Currently,\sif\sSQLite\scannot\sfind\sa\stable\sor\sindex\sreferred\sto\sby\sa\squery,\sit\sreloads\sthe\sdatabase\sschema\sfrom\sdisk\sto\ssee\sif\sthe\stable\sor\sindex\shas\sbeen\sadded\ssince\sthe\sschema\swas\scached\sin\smemory.\sExtend\sthis\sbehaviour\sto\scolumns\s(which\smay\shave\sbeen\sadded\susing\sALTER\sTABLE)\sand\sfix\ssome\sobscure\scases\srelated\sto\stables\sand\sindexes\s(INDEXED\sBY,\sDROP\sTABLE\setc.).
+D 2010-06-28T10:15:20
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in a5cad1f8f3e021356bfcc6c77dc16f6f1952bbc3
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -119,7 +116,7 @@ F src/btmutex.c 96a12f50f7a17475155971a241d85ec5171573ff
 F src/btree.c 9806fb4030d0af907cf5cd7d4b9c8fd939eccfef
 F src/btree.h dd83041eda10c17daf023257c1fc883b5f71f85a
 F src/btreeInt.h b0c87f6725b06a0aa194a6d25d54b16ce9d6e291
-F src/build.c 9d48f4023d5e3d0a6807f1f531d8d7187d252c57
+F src/build.c 31830208adbd6f97bef2517531ed70954a306fde
 F src/callback.c 01843bdf4b0420fd28046525d150fcd9802931a9
 F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
 F src/ctime.c 51553a859994d01d8bf3500747f66a890c459774
@@ -133,7 +130,7 @@ F src/global.c 3fedfe02f1b2b1f6118455c881d132b804a1f0a7
 F src/hash.c 458488dcc159c301b8e7686280ab209f1fb915af
 F src/hash.h 2894c932d84d9f892d4b4023a75e501f83050970
 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08
-F src/insert.c 3a9567687f6b84ab9a41448e3d2ce20424f4743c
+F src/insert.c d9476f23f85a20eea3cc25a4b9f9cbae77a33bf2
 F src/journal.c b0ea6b70b532961118ab70301c00a33089f9315c
 F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f
 F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e
@@ -169,9 +166,9 @@ F src/pragma.c 423865323a4074f1e0d4ab02af0be014653e8863
 F src/prepare.c fd1398cb1da54385ba5bd68d93928f10d10a1d9c
 F src/printf.c 5f5b65a83e63f2096a541a340722a509fa0240a7
 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
-F src/resolve.c ac5f1a713cd1ae77f08b83cc69581e11bf5ae6f9
+F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706
 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
-F src/select.c c03d8a0565febcde8c6a12c5d77d065fddae889b
+F src/select.c 4903ff1bbd08b55cbce00ea43c645530de41b362
 F src/shell.c fd4ccdb37c3b68de0623eb938a649e0990710714
 F src/sqlite.h.in 301476d8556cbb1c5d4bc906370b2dafe4d98a44
 F src/sqlite3ext.h 69dfb8116af51b84a029cddb3b35062354270c89
@@ -215,8 +212,8 @@ F src/test_thread.c aa9919c885a1fe53eafc73492f0898ee6c0a0726
 F src/test_vfs.c 90d51963dfe2aa28a9408b461cb06f48921be8e8
 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
 F src/tokenize.c 25ceb0f0a746ea1d0f9553787f3f0a56853cfaeb
-F src/trigger.c 8927588cb9e6d47f933b53bfe74200fbb504100d
-F src/update.c 9859f2056c7739a1db0d9774ccb6c2f0cee6d1de
+F src/trigger.c 67e95c76d625b92d43409ace771c8e0d02a09ac2
+F src/update.c 19c899c23cd29fd102c9068e0b0ff5b087204beb
 F src/utf.c 1baeeac91707a4df97ccc6141ec0f808278af685
 F src/util.c 32aebf04c10e51ad3977a928b7416bed671b620b
 F src/vacuum.c 241a8386727c1497eba4955933356dfba6ff8c9f
@@ -569,6 +566,7 @@ F test/savepoint5.test 0735db177e0ebbaedc39812c8d065075d563c4fd
 F test/savepoint6.test 76d3948568b2cdc0c13a671cadcae75009b183d6
 F test/schema.test 8f7999be894260f151adf15c2c7540f1c6d6a481
 F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5
+F test/schema3.test 5d0e3b93bd56dd70be3ca340871cdbe74f812de3
 F test/securedel.test 328d2921c0ca49bdd3352e516b0377fc07143254
 F test/select1.test f67ca2dfc05df41c7b86eb32ca409b427a5f43b0
 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56
@@ -830,14 +828,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P e82d008eaffb5522080cad6c69c1b194b78eadbd
-R 4571797951f4ab0ab98573ca3fe9c307
-U drh
-Z bf87b4bd0a568f47cbc6bbfb396cf7d8
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.6 (GNU/Linux)
-
-iD8DBQFMJnwmoxKgR168RlERAnB3AJ9WmFDjS4Mogutm6tqMf4TXdZMPZQCfcfy3
-WxCV4jYOGkRTKW5Witg+E/w=
-=dfOb
------END PGP SIGNATURE-----
+P ec65bbd06bdd3bf16a742c5bb1fab0dce756c01a
+R b9e500f7ddaf53f7185bc0d73d249ff0
+U dan
+Z cda19ee0469f27bd539b5c60bd39f17a
index 82e2669eb7b0f0c1eabadee87469382d24ffaa70..508623b28899c1cf0eb85a66b8e277bea19fa20c 100644 (file)
@@ -1 +1 @@
-ec65bbd06bdd3bf16a742c5bb1fab0dce756c01a
\ No newline at end of file
+4932f22848b3d15a2b6dc5fa2cd69ce19182e2a4
\ No newline at end of file
index 4c00e398e223e2610c55363d2205b5119e29e35c..ce3e614843ed589288ccb211b6e1bd6b8d70e16c 100644 (file)
@@ -2614,6 +2614,7 @@ Index *sqlite3CreateIndex(
     if( j>=pTab->nCol ){
       sqlite3ErrorMsg(pParse, "table %s has no column named %s",
         pTab->zName, zColName);
+      pParse->checkSchema = 1;
       goto exit_create_index;
     }
     pIndex->aiColumn[i] = j;
index 05964f849f5034cbe3af5aaa7592eaae75eb28dc..f6ad5ab9eb44200f35d2c02f307790a6a237660c 100644 (file)
@@ -727,7 +727,7 @@ void sqlite3Insert(
         }else{
           sqlite3ErrorMsg(pParse, "table %S has no column named %s",
               pTabList, 0, pColumn->a[i].zName);
-          pParse->nErr++;
+          pParse->checkSchema = 1;
           goto insert_cleanup;
         }
       }
index 4e94827e9c937ea63d470663d031101754829ab9..74d6aaef93bdcc6c62d4b0c6e35ca5d7ad2b72ae 100644 (file)
@@ -357,6 +357,7 @@ static int lookupName(
     }else{
       sqlite3ErrorMsg(pParse, "%s: %s", zErr, zCol);
     }
+    pParse->checkSchema = 1;
     pTopNC->nErr++;
   }
 
index 9a016039a8e89bf21e4f3f7fa2a5016b0b20c007..b03e50638dfd75a71405f7a4fb7319b60eda3f81 100644 (file)
@@ -3020,6 +3020,7 @@ int sqlite3IndexedByLookup(Parse *pParse, struct SrcList_item *pFrom){
     );
     if( !pIdx ){
       sqlite3ErrorMsg(pParse, "no such index: %s", zIndex, 0);
+      pParse->checkSchema = 1;
       return SQLITE_ERROR;
     }
     pFrom->pIndex = pIdx;
index 66464bdae478a8b268256fdae898bcee0104e97e..27fc708d7ce58f5f4cc7e140b7b61bfdc609f121 100644 (file)
@@ -496,6 +496,7 @@ void sqlite3DropTrigger(Parse *pParse, SrcList *pName, int noErr){
     if( !noErr ){
       sqlite3ErrorMsg(pParse, "no such trigger: %S", pName, 0);
     }
+    pParse->checkSchema = 1;
     goto drop_trigger_cleanup;
   }
   sqlite3DropTriggerPtr(pParse, pTrigger);
index 3c82c27045613aa8a984e5e6e9fd7127f4fe1c49..fe8344ca27986a8bd813d8b432e1d50694a13d59 100644 (file)
@@ -212,6 +212,7 @@ void sqlite3Update(
         pRowidExpr = pChanges->a[i].pExpr;
       }else{
         sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zName);
+        pParse->checkSchema = 1;
         goto update_cleanup;
       }
     }
diff --git a/test/schema3.test b/test/schema3.test
new file mode 100644 (file)
index 0000000..7b8962b
--- /dev/null
@@ -0,0 +1,91 @@
+# 2010 Jun 28
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+# This file implements regression tests for SQLite library.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+source $testdir/malloc_common.tcl
+source $testdir/lock_common.tcl
+
+# This block tests that if one client modifies the database schema, a
+# second client updates its internal cache of the database schema before
+# executing any queries. Specifically, it does not return a "no such column"
+# or "no such table" error if the table or column in question does exist
+# but was added after the second client loaded its cache of the database
+# schema.
+#
+# Types of schema modifications:
+#
+#   1. Adding a database table.
+#   2. Adding a database view.
+#   3. Adding a database index.
+#   4. Adding a database trigger.
+#   5. Adding a column to an existing table (ALTER TABLE).
+#
+do_multiclient_test tn {
+
+  # Have connections [db1] and [db2] load the current database schema.
+  #
+  sql1 { SELECT * FROM sqlite_master }
+  sql2 { SELECT * FROM sqlite_master }
+
+  foreach {tn2 c1 c2} {
+    1  { CREATE TABLE t1(a, b) }       { SELECT * FROM t1            }
+    2  { CREATE TABLE t2(a, b) }       { UPDATE t2 SET a = b         }
+    3  { CREATE TABLE t3(a, b) }       { DELETE FROM t3              }
+    4  { CREATE TABLE t4(a, b) }       { INSERT INTO t4 VALUES(1, 2) }
+    5  { CREATE TABLE t5(a, b) }       { DROP TABLE t5 }
+    6  { CREATE TABLE t6(a, b) }       { CREATE INDEX i1 ON t6(a) }
+
+    7  { ALTER TABLE t1 ADD COLUMN c } { SELECT a, b, c FROM t1 }
+    8  { ALTER TABLE t2 ADD COLUMN c } { UPDATE t2 SET a = c }
+    9  { ALTER TABLE t2 ADD COLUMN d } { UPDATE t2 SET d = c }
+    10 { ALTER TABLE t3 ADD COLUMN c } { DELETE FROM t3 WHERE c>10 }
+    11 { ALTER TABLE t4 ADD COLUMN c } { INSERT INTO t4(a,b,c) VALUES(1,2,3) }
+    12 { ALTER TABLE t6 ADD COLUMN c } { CREATE INDEX i2 ON t6(c) }
+    13 { ALTER TABLE t6 ADD COLUMN d } { 
+         CREATE TRIGGER tr1 AFTER UPDATE OF d ON t6 BEGIN
+           SELECT 1, 2, 3;
+         END;
+    }
+
+    14 { CREATE INDEX i3 ON t1(a) }    { DROP INDEX i3 }
+    15 { CREATE INDEX i4 ON t2(a) }    {
+         SELECT * FROM t2 INDEXED BY i4 ORDER BY a
+    }
+
+    16 { CREATE TRIGGER tr2 AFTER INSERT ON t3 BEGIN SELECT 1 ; END } {
+         DROP TRIGGER tr2
+    }
+
+    17  { CREATE VIEW v1 AS SELECT * FROM t1 } { SELECT a,b,c   FROM v1 }
+    18  { ALTER TABLE t1 ADD COLUMN d        } { SELECT a,b,c,d FROM v1 }
+
+    19  { CREATE TABLE t7(a, b) } {
+          DROP TABLE IF EXISTS t7; CREATE TABLE t7(c, d);
+    }
+    20  { CREATE INDEX i5 ON t7(c, d) } {
+          DROP INDEX IF EXISTS i5; CREATE INDEX i5 ON t7(c)
+    }
+    21  { CREATE TRIGGER tr3 BEFORE DELETE ON t7 BEGIN SELECT 1, 2, 3 ; END } {
+          DROP TRIGGER IF EXISTS tr3;
+          CREATE TRIGGER tr3 AFTER INSERT ON t7 BEGIN SELECT 1, 2, 3 ; END 
+    }
+  } {
+    do_test schema3-1.$tn.$tn2 {
+      sql1 $c1
+      sql2 $c2
+    } {}
+  }
+}
+
+finish_test