mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Store schema cookies on the TEMP database. Ticket #807. (CVS 1817)
FossilOrigin-Name: c6c13dc460094e6adea2b14849edf9f485238b99
This commit is contained in:
28
manifest
28
manifest
@ -1,5 +1,5 @@
|
|||||||
C use\s-lsqlite3\sin\s.pc\sfile\s(CVS\s1816)
|
C Store\sschema\scookies\son\sthe\sTEMP\sdatabase.\s\sTicket\s#807.\s(CVS\s1817)
|
||||||
D 2004-07-19T04:25:47
|
D 2004-07-19T17:25:25
|
||||||
F Makefile.in 77d1219b6563476711a7a962e865979a6f314eb0
|
F Makefile.in 77d1219b6563476711a7a962e865979a6f314eb0
|
||||||
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
|
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
|
||||||
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
||||||
@ -29,7 +29,7 @@ F src/attach.c 5e37aaac0907edad5da8ba785b94f04fbb4003d7
|
|||||||
F src/auth.c 60db23b98bb94c8b0178180faaf49dc116674217
|
F src/auth.c 60db23b98bb94c8b0178180faaf49dc116674217
|
||||||
F src/btree.c 3ed3c19e43bb243f502ee614f6ad0a52e53362a7
|
F src/btree.c 3ed3c19e43bb243f502ee614f6ad0a52e53362a7
|
||||||
F src/btree.h 934d0ad30b5b419e9291a11da878be349df2277e
|
F src/btree.h 934d0ad30b5b419e9291a11da878be349df2277e
|
||||||
F src/build.c ecc10d4e5232a49f55304dd9b90739f2771e34ef
|
F src/build.c 1d9a72adb51a544131b51bd4101846f781f3266d
|
||||||
F src/date.c d42ea73a0b16d5dff9d97e10dc0c05671471b753
|
F src/date.c d42ea73a0b16d5dff9d97e10dc0c05671471b753
|
||||||
F src/delete.c e81545e546f6bc87d7508a93a09ca70695265af3
|
F src/delete.c e81545e546f6bc87d7508a93a09ca70695265af3
|
||||||
F src/encode.c a876af473d1d636faa3dca51c7571f2e007eea37
|
F src/encode.c a876af473d1d636faa3dca51c7571f2e007eea37
|
||||||
@ -39,7 +39,7 @@ F src/hash.c f0a2f22c2a7052d67053b5f4690ea3010bb3fb9f
|
|||||||
F src/hash.h 762d95f1e567664d1eafc1687de755626be962fb
|
F src/hash.h 762d95f1e567664d1eafc1687de755626be962fb
|
||||||
F src/insert.c d99ffe87e1e1397f4233afcd06841d52d6b17b18
|
F src/insert.c d99ffe87e1e1397f4233afcd06841d52d6b17b18
|
||||||
F src/legacy.c ad23746f15f67e34577621b1875f639c94839e1f
|
F src/legacy.c ad23746f15f67e34577621b1875f639c94839e1f
|
||||||
F src/main.c 9cb3598be553c6e247e7ad7e9c41a9a0c38c7211
|
F src/main.c 4f3c3f0f9e9aa6d6595d6fcb0d3cdd4d31191554
|
||||||
F src/md5.c 7ae1c39044b95de2f62e066f47bb1deb880a1070
|
F src/md5.c 7ae1c39044b95de2f62e066f47bb1deb880a1070
|
||||||
F src/os.h d1780e0db95cad01f213d48da22ab490eb4fd345
|
F src/os.h d1780e0db95cad01f213d48da22ab490eb4fd345
|
||||||
F src/os_common.h fe9604754116bd2f2702d58f82d2d8b89998cb21
|
F src/os_common.h fe9604754116bd2f2702d58f82d2d8b89998cb21
|
||||||
@ -74,16 +74,16 @@ F src/update.c b66b1896c9da54678ba3eff2bf0b4d291a95986a
|
|||||||
F src/utf.c f03535db72bfa09e24202ccdd245f21d2fc65f0a
|
F src/utf.c f03535db72bfa09e24202ccdd245f21d2fc65f0a
|
||||||
F src/util.c 2aacc79b7bf5df5859813dafd3bf3258f67a5234
|
F src/util.c 2aacc79b7bf5df5859813dafd3bf3258f67a5234
|
||||||
F src/vacuum.c b8546f4921719458cc537b9e736df52a8256399c
|
F src/vacuum.c b8546f4921719458cc537b9e736df52a8256399c
|
||||||
F src/vdbe.c efda404921668a4f1fbcc256dfca859d2eb5c66d
|
F src/vdbe.c a88514694be86eca792dd4d291e766f3c1831876
|
||||||
F src/vdbe.h 75b241c02431b9c0f16eaa9cdbb34146c6287f52
|
F src/vdbe.h 75b241c02431b9c0f16eaa9cdbb34146c6287f52
|
||||||
F src/vdbeInt.h 7160653a006b6d2c4a00d204112a095bdf842ab6
|
F src/vdbeInt.h 7160653a006b6d2c4a00d204112a095bdf842ab6
|
||||||
F src/vdbeapi.c c5c6d8f162a9581dde497b1a4034f9a0bf54c355
|
F src/vdbeapi.c c5c6d8f162a9581dde497b1a4034f9a0bf54c355
|
||||||
F src/vdbeaux.c 4de85e30ca4a83ea0a45eceb7e88ac7a48f4c237
|
F src/vdbeaux.c 4de85e30ca4a83ea0a45eceb7e88ac7a48f4c237
|
||||||
F src/vdbemem.c bbf621377343bee046547712a144a94f387bb1eb
|
F src/vdbemem.c bbf621377343bee046547712a144a94f387bb1eb
|
||||||
F src/where.c 2d346d4aaeae7b63545b85982c6c97d24b9898b5
|
F src/where.c 504e1df3d7d9eb74175088e532d1d7ee17f50ac7
|
||||||
F test/all.test 3b692eb43583b52c99c344b2fa8934512d179016
|
F test/all.test 3b692eb43583b52c99c344b2fa8934512d179016
|
||||||
F test/attach.test 3acdffccbf5f78b07746771b9490758718e28856
|
F test/attach.test 3acdffccbf5f78b07746771b9490758718e28856
|
||||||
F test/attach2.test 3cd1d4a69e0ec307d0b68a44a96c9c8e1e253d65
|
F test/attach2.test b175333059e86c82dbf593fc922522ecb0f8aff8
|
||||||
F test/attach3.test 6d060986ff004ebb89e1876a331d96c6bb62269e
|
F test/attach3.test 6d060986ff004ebb89e1876a331d96c6bb62269e
|
||||||
F test/auth.test 23d1dbf2235635409fee36535a344edc7494aea2
|
F test/auth.test 23d1dbf2235635409fee36535a344edc7494aea2
|
||||||
F test/bigfile.test 62722ac4b420dfbcdceb137b8634e2cf2865fe27
|
F test/bigfile.test 62722ac4b420dfbcdceb137b8634e2cf2865fe27
|
||||||
@ -125,7 +125,7 @@ F test/intpkey.test c8efd06db62b8b27216558ef439cc867d113cfec
|
|||||||
F test/ioerr.test 7d087bfd1a1a53442940e000df936e0df0c5b886
|
F test/ioerr.test 7d087bfd1a1a53442940e000df936e0df0c5b886
|
||||||
F test/join.test 9ef6aabaac9de51d5fc41e68d1f4355da05a84cd
|
F test/join.test 9ef6aabaac9de51d5fc41e68d1f4355da05a84cd
|
||||||
F test/join2.test c97e4c5aa65dea462145529e58212a709b4722b8
|
F test/join2.test c97e4c5aa65dea462145529e58212a709b4722b8
|
||||||
F test/join3.test 920ba2d6dad3fe24593036e83db8bdfc9c44a798
|
F test/join3.test 8d989e52413199065bd630b3d0a6b2329d173099
|
||||||
F test/lastinsert.test 31382f88b9b0270333ac9e4a17f2c2f4732da718
|
F test/lastinsert.test 31382f88b9b0270333ac9e4a17f2c2f4732da718
|
||||||
F test/laststmtchanges.test 417aa27eb2b5cdfafb46e390e2c9ddd0a20eba43
|
F test/laststmtchanges.test 417aa27eb2b5cdfafb46e390e2c9ddd0a20eba43
|
||||||
F test/limit.test 60d7f856ee7846f7130dee67f10f0e726cd70b5d
|
F test/limit.test 60d7f856ee7846f7130dee67f10f0e726cd70b5d
|
||||||
@ -139,7 +139,7 @@ F test/minmax.test 6513f9a1bb85fd35ff72b34b7b6634fad6b1e69c
|
|||||||
F test/misc1.test 72768ec8cabc952a4cfcddca43d566f9e0bce899
|
F test/misc1.test 72768ec8cabc952a4cfcddca43d566f9e0bce899
|
||||||
F test/misc2.test 703734f5817215ca54e364833b3bf5ff36fcc21e
|
F test/misc2.test 703734f5817215ca54e364833b3bf5ff36fcc21e
|
||||||
F test/misc3.test eb488314990bfc0959221a1acc465013238bf168
|
F test/misc3.test eb488314990bfc0959221a1acc465013238bf168
|
||||||
F test/misc4.test f221d03868b4ae7f2028431034d3cf00cead7c26
|
F test/misc4.test 9e4291bb174e4357459e0b080f7ca9c6733150c9
|
||||||
F test/misuse.test 2a64ce711419f2fd12806ed95af930fd4e7bb8f3
|
F test/misuse.test 2a64ce711419f2fd12806ed95af930fd4e7bb8f3
|
||||||
F test/notnull.test 7a08117a71e74b0321aaa937dbeb41a09d6eb1d0
|
F test/notnull.test 7a08117a71e74b0321aaa937dbeb41a09d6eb1d0
|
||||||
F test/null.test c14d0f4739f21e929b8115b72bf0c765b6bb1721
|
F test/null.test c14d0f4739f21e929b8115b72bf0c765b6bb1721
|
||||||
@ -162,7 +162,7 @@ F test/sort.test 30fb9ea782a78da849a562d53233ec62d421bf61
|
|||||||
F test/subselect.test f0fea8cf9f386d416d64d152e3c65f9116d0f50f
|
F test/subselect.test f0fea8cf9f386d416d64d152e3c65f9116d0f50f
|
||||||
F test/table.test b6d07f04c4157d1f2a37fb7febe36b250d468e31
|
F test/table.test b6d07f04c4157d1f2a37fb7febe36b250d468e31
|
||||||
F test/tableapi.test b21ab097e87a5484bb61029e69e1a4e5c5e65ede
|
F test/tableapi.test b21ab097e87a5484bb61029e69e1a4e5c5e65ede
|
||||||
F test/tclsqlite.test 7a773d270a2c35af1d0295c18a9ee26859ddbf1f
|
F test/tclsqlite.test 0ef39b0228a32601432cec20208ec4b35e9b5cdb
|
||||||
F test/temptable.test 63a16e3ad19adf073cfbcdf7624c92ac5236522c
|
F test/temptable.test 63a16e3ad19adf073cfbcdf7624c92ac5236522c
|
||||||
F test/tester.tcl f36cc22d0532725073ca78272d7834d56dceb6d9
|
F test/tester.tcl f36cc22d0532725073ca78272d7834d56dceb6d9
|
||||||
F test/thread1.test 776c9e459b75ba905193b351926ac4019b049f35
|
F test/thread1.test 776c9e459b75ba905193b351926ac4019b049f35
|
||||||
@ -236,7 +236,7 @@ F www/tclsqlite.tcl 19191cf2a1010eaeff74c51d83fd5f5a4d899075
|
|||||||
F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9
|
F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9
|
||||||
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
|
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
|
||||||
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
|
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
|
||||||
P 991b6108e7cac3837d39fd9a5adbd72b082a4983
|
P b36e6e4907716e048fb21903e234578596c7333d
|
||||||
R 3f8e97ffe3ac63e9657b96b80fdf6afc
|
R 27d8d1ff5e4a09c10df4c3b7ad31e5bc
|
||||||
U dougcurrie
|
U drh
|
||||||
Z eba6b9812a93fa416bb50c87f38a7472
|
Z 9bdf2c5059de01392d40fdc6b41ce812
|
||||||
|
@ -1 +1 @@
|
|||||||
b36e6e4907716e048fb21903e234578596c7333d
|
c6c13dc460094e6adea2b14849edf9f485238b99
|
53
src/build.c
53
src/build.c
@ -23,7 +23,7 @@
|
|||||||
** ROLLBACK
|
** ROLLBACK
|
||||||
** PRAGMA
|
** PRAGMA
|
||||||
**
|
**
|
||||||
** $Id: build.c,v 1.237 2004/06/29 08:59:35 danielk1977 Exp $
|
** $Id: build.c,v 1.238 2004/07/19 17:25:25 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@ -69,18 +69,16 @@ void sqlite3FinishCoding(Parse *pParse){
|
|||||||
** transaction on each used database and to verify the schema cookie
|
** transaction on each used database and to verify the schema cookie
|
||||||
** on each used database.
|
** on each used database.
|
||||||
*/
|
*/
|
||||||
if( pParse->cookieMask!=0 ){
|
if( pParse->cookieGoto>0 ){
|
||||||
u32 mask;
|
u32 mask;
|
||||||
int iDb;
|
int iDb;
|
||||||
sqlite3VdbeChangeP2(v, pParse->cookieGoto, sqlite3VdbeCurrentAddr(v));
|
sqlite3VdbeChangeP2(v, pParse->cookieGoto-1, sqlite3VdbeCurrentAddr(v));
|
||||||
for(iDb=0, mask=1; iDb<db->nDb; mask<<=1, iDb++){
|
for(iDb=0, mask=1; iDb<db->nDb; mask<<=1, iDb++){
|
||||||
if( (mask & pParse->cookieMask)==0 ) continue;
|
if( (mask & pParse->cookieMask)==0 ) continue;
|
||||||
sqlite3VdbeAddOp(v, OP_Transaction, iDb, (mask & pParse->writeMask)!=0);
|
sqlite3VdbeAddOp(v, OP_Transaction, iDb, (mask & pParse->writeMask)!=0);
|
||||||
if( iDb!=1 ){
|
sqlite3VdbeAddOp(v, OP_VerifyCookie, iDb, pParse->cookieValue[iDb]);
|
||||||
sqlite3VdbeAddOp(v, OP_VerifyCookie, iDb, pParse->cookieValue[iDb]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
sqlite3VdbeAddOp(v, OP_Goto, 0, pParse->cookieGoto+1);
|
sqlite3VdbeAddOp(v, OP_Goto, 0, pParse->cookieGoto);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,6 +99,7 @@ void sqlite3FinishCoding(Parse *pParse){
|
|||||||
pParse->nAgg = 0;
|
pParse->nAgg = 0;
|
||||||
pParse->nVar = 0;
|
pParse->nVar = 0;
|
||||||
pParse->cookieMask = 0;
|
pParse->cookieMask = 0;
|
||||||
|
pParse->cookieGoto = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1378,9 +1377,7 @@ void sqlite3EndTable(Parse *pParse, Token *pEnd, Select *pSelect){
|
|||||||
}
|
}
|
||||||
sqlite3VdbeOp3(v, OP_MakeRecord, 5, 0, "tttit", P3_STATIC);
|
sqlite3VdbeOp3(v, OP_MakeRecord, 5, 0, "tttit", P3_STATIC);
|
||||||
sqlite3VdbeAddOp(v, OP_PutIntKey, 0, 0);
|
sqlite3VdbeAddOp(v, OP_PutIntKey, 0, 0);
|
||||||
if( p->iDb!=1 ){
|
sqlite3ChangeCookie(db, v, p->iDb);
|
||||||
sqlite3ChangeCookie(db, v, p->iDb);
|
|
||||||
}
|
|
||||||
sqlite3VdbeAddOp(v, OP_Close, 0, 0);
|
sqlite3VdbeAddOp(v, OP_Close, 0, 0);
|
||||||
|
|
||||||
sqlite3EndWriteOperation(pParse);
|
sqlite3EndWriteOperation(pParse);
|
||||||
@ -2198,9 +2195,7 @@ void sqlite3CreateIndex(
|
|||||||
sqlite3VdbeAddOp(v, OP_Close, 1, 0);
|
sqlite3VdbeAddOp(v, OP_Close, 1, 0);
|
||||||
}
|
}
|
||||||
if( pTblName!=0 ){
|
if( pTblName!=0 ){
|
||||||
if( !isTemp ){
|
sqlite3ChangeCookie(db, v, iDb);
|
||||||
sqlite3ChangeCookie(db, v, iDb);
|
|
||||||
}
|
|
||||||
sqlite3VdbeAddOp(v, OP_Close, 0, 0);
|
sqlite3VdbeAddOp(v, OP_Close, 0, 0);
|
||||||
sqlite3EndWriteOperation(pParse);
|
sqlite3EndWriteOperation(pParse);
|
||||||
}
|
}
|
||||||
@ -2300,9 +2295,7 @@ void sqlite3DropIndex(Parse *pParse, SrcList *pName){
|
|||||||
sqlite3OpenMasterTable(v, pIndex->iDb);
|
sqlite3OpenMasterTable(v, pIndex->iDb);
|
||||||
base = sqlite3VdbeAddOpList(v, ArraySize(dropIndex), dropIndex);
|
base = sqlite3VdbeAddOpList(v, ArraySize(dropIndex), dropIndex);
|
||||||
sqlite3VdbeChangeP3(v, base+1, pIndex->zName, 0);
|
sqlite3VdbeChangeP3(v, base+1, pIndex->zName, 0);
|
||||||
if( pIndex->iDb!=1 ){
|
sqlite3ChangeCookie(db, v, pIndex->iDb);
|
||||||
sqlite3ChangeCookie(db, v, pIndex->iDb);
|
|
||||||
}
|
|
||||||
sqlite3VdbeAddOp(v, OP_Close, 0, 0);
|
sqlite3VdbeAddOp(v, OP_Close, 0, 0);
|
||||||
sqlite3VdbeAddOp(v, OP_Destroy, pIndex->tnum, pIndex->iDb);
|
sqlite3VdbeAddOp(v, OP_Destroy, pIndex->tnum, pIndex->iDb);
|
||||||
sqlite3EndWriteOperation(pParse);
|
sqlite3EndWriteOperation(pParse);
|
||||||
@ -2533,14 +2526,18 @@ void sqlite3RollbackTransaction(Parse *pParse){
|
|||||||
** the VDBE program. But this routine can be called after much other
|
** the VDBE program. But this routine can be called after much other
|
||||||
** code has been generated. So here is what we do:
|
** code has been generated. So here is what we do:
|
||||||
**
|
**
|
||||||
** The first time this routine is called, we code an OP_Gosub that
|
** The first time this routine is called, we code an OP_Goto that
|
||||||
** will jump to a subroutine at the end of the program. Then we
|
** will jump to a subroutine at the end of the program. Then we
|
||||||
** record every database that needs its schema verified in the
|
** record every database that needs its schema verified in the
|
||||||
** pParse->cookieMask field. Later, after all other code has been
|
** pParse->cookieMask field. Later, after all other code has been
|
||||||
** generated, the subroutine that does the cookie verifications and
|
** generated, the subroutine that does the cookie verifications and
|
||||||
** starts the transactions will be coded and the OP_Gosub P2 value
|
** starts the transactions will be coded and the OP_Goto P2 value
|
||||||
** will be made to point to that subroutine. The generation of the
|
** will be made to point to that subroutine. The generation of the
|
||||||
** cookie verification subroutine code happens in sqlite3FinishCoding().
|
** cookie verification subroutine code happens in sqlite3FinishCoding().
|
||||||
|
**
|
||||||
|
** If iDb<0 then code the OP_Goto only - don't set flag to verify the
|
||||||
|
** schema on any databases. This can be used to position the OP_Goto
|
||||||
|
** early in the code, before we know if any database tables will be used.
|
||||||
*/
|
*/
|
||||||
void sqlite3CodeVerifySchema(Parse *pParse, int iDb){
|
void sqlite3CodeVerifySchema(Parse *pParse, int iDb){
|
||||||
sqlite *db;
|
sqlite *db;
|
||||||
@ -2550,16 +2547,18 @@ void sqlite3CodeVerifySchema(Parse *pParse, int iDb){
|
|||||||
v = sqlite3GetVdbe(pParse);
|
v = sqlite3GetVdbe(pParse);
|
||||||
if( v==0 ) return; /* This only happens if there was a prior error */
|
if( v==0 ) return; /* This only happens if there was a prior error */
|
||||||
db = pParse->db;
|
db = pParse->db;
|
||||||
assert( iDb>=0 && iDb<db->nDb );
|
if( pParse->cookieGoto==0 ){
|
||||||
assert( db->aDb[iDb].pBt!=0 || iDb==1 );
|
pParse->cookieGoto = sqlite3VdbeAddOp(v, OP_Goto, 0, 0)+1;
|
||||||
assert( iDb<32 );
|
|
||||||
if( pParse->cookieMask==0 ){
|
|
||||||
pParse->cookieGoto = sqlite3VdbeAddOp(v, OP_Goto, 0, 0);
|
|
||||||
}
|
}
|
||||||
mask = 1<<iDb;
|
if( iDb>=0 ){
|
||||||
if( (pParse->cookieMask & mask)==0 ){
|
assert( iDb<db->nDb );
|
||||||
pParse->cookieMask |= mask;
|
assert( db->aDb[iDb].pBt!=0 || iDb==1 );
|
||||||
pParse->cookieValue[iDb] = db->aDb[iDb].schema_cookie;
|
assert( iDb<32 );
|
||||||
|
mask = 1<<iDb;
|
||||||
|
if( (pParse->cookieMask & mask)==0 ){
|
||||||
|
pParse->cookieMask |= mask;
|
||||||
|
pParse->cookieValue[iDb] = db->aDb[iDb].schema_cookie;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
13
src/main.c
13
src/main.c
@ -14,7 +14,7 @@
|
|||||||
** other files are for internal use by SQLite and should not be
|
** other files are for internal use by SQLite and should not be
|
||||||
** accessed by users of the library.
|
** accessed by users of the library.
|
||||||
**
|
**
|
||||||
** $Id: main.c,v 1.244 2004/06/30 11:54:07 danielk1977 Exp $
|
** $Id: main.c,v 1.245 2004/07/19 17:25:25 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
@ -52,10 +52,10 @@ static void corruptSchema(InitData *pData, const char *zExtra){
|
|||||||
**
|
**
|
||||||
** Each callback contains the following information:
|
** Each callback contains the following information:
|
||||||
**
|
**
|
||||||
** argv[0] = "file-format" or "schema-cookie" or "table" or "index"
|
** argv[0] = "table" or "index" or "view" or "trigger"
|
||||||
** argv[1] = table or index name or meta statement type.
|
** argv[1] = name of thing being created
|
||||||
** argv[2] = root page number for table or index. NULL for meta.
|
** argv[2] = root page number for table or index. NULL for trigger or view.
|
||||||
** argv[3] = SQL text for a CREATE TABLE or CREATE INDEX statement.
|
** argv[3] = SQL text for the CREATE statement.
|
||||||
** argv[4] = "1" for temporary files, "0" for main database, "2" or more
|
** argv[4] = "1" for temporary files, "0" for main database, "2" or more
|
||||||
** for auxiliary database files.
|
** for auxiliary database files.
|
||||||
**
|
**
|
||||||
@ -922,7 +922,7 @@ int sqlite3_errcode(sqlite3 *db){
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Check schema cookies in all databases except TEMP. If any cookie is out
|
** Check schema cookies in all databases. If any cookie is out
|
||||||
** of date, return 0. If all schema cookies are current, return 1.
|
** of date, return 0. If all schema cookies are current, return 1.
|
||||||
*/
|
*/
|
||||||
static int schemaIsValid(sqlite *db){
|
static int schemaIsValid(sqlite *db){
|
||||||
@ -934,7 +934,6 @@ static int schemaIsValid(sqlite *db){
|
|||||||
|
|
||||||
for(iDb=0; allOk && iDb<db->nDb; iDb++){
|
for(iDb=0; allOk && iDb<db->nDb; iDb++){
|
||||||
Btree *pBt;
|
Btree *pBt;
|
||||||
if( iDb==1 ) continue;
|
|
||||||
pBt = db->aDb[iDb].pBt;
|
pBt = db->aDb[iDb].pBt;
|
||||||
if( pBt==0 ) continue;
|
if( pBt==0 ) continue;
|
||||||
rc = sqlite3BtreeCursor(pBt, MASTER_ROOT, 0, 0, 0, &curTemp);
|
rc = sqlite3BtreeCursor(pBt, MASTER_ROOT, 0, 0, 0, &curTemp);
|
||||||
|
11
src/vdbe.c
11
src/vdbe.c
@ -43,7 +43,7 @@
|
|||||||
** in this file for details. If in doubt, do not deviate from existing
|
** in this file for details. If in doubt, do not deviate from existing
|
||||||
** commenting and indentation practices when changing or adding code.
|
** commenting and indentation practices when changing or adding code.
|
||||||
**
|
**
|
||||||
** $Id: vdbe.c,v 1.401 2004/07/18 21:33:02 drh Exp $
|
** $Id: vdbe.c,v 1.402 2004/07/19 17:25:25 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
@ -2363,8 +2363,15 @@ case OP_SetCookie: {
|
|||||||
*/
|
*/
|
||||||
case OP_VerifyCookie: {
|
case OP_VerifyCookie: {
|
||||||
int iMeta;
|
int iMeta;
|
||||||
|
Btree *pBt;
|
||||||
assert( pOp->p1>=0 && pOp->p1<db->nDb );
|
assert( pOp->p1>=0 && pOp->p1<db->nDb );
|
||||||
rc = sqlite3BtreeGetMeta(db->aDb[pOp->p1].pBt, 1, (u32 *)&iMeta);
|
pBt = db->aDb[pOp->p1].pBt;
|
||||||
|
if( pBt ){
|
||||||
|
rc = sqlite3BtreeGetMeta(pBt, 1, (u32 *)&iMeta);
|
||||||
|
}else{
|
||||||
|
rc = SQLITE_OK;
|
||||||
|
iMeta = 0;
|
||||||
|
}
|
||||||
if( rc==SQLITE_OK && iMeta!=pOp->p2 ){
|
if( rc==SQLITE_OK && iMeta!=pOp->p2 ){
|
||||||
sqlite3SetString(&p->zErrMsg, "database schema has changed", (char*)0);
|
sqlite3SetString(&p->zErrMsg, "database schema has changed", (char*)0);
|
||||||
rc = SQLITE_SCHEMA;
|
rc = SQLITE_SCHEMA;
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
** This module contains C code that generates VDBE code used to process
|
** This module contains C code that generates VDBE code used to process
|
||||||
** the WHERE clause of SQL statements.
|
** the WHERE clause of SQL statements.
|
||||||
**
|
**
|
||||||
** $Id: where.c,v 1.108 2004/07/19 02:12:14 drh Exp $
|
** $Id: where.c,v 1.109 2004/07/19 17:25:25 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
|
|
||||||
@ -695,7 +695,7 @@ WhereInfo *sqlite3WhereBegin(
|
|||||||
|
|
||||||
/* Open all tables in the pTabList and all indices used by those tables.
|
/* Open all tables in the pTabList and all indices used by those tables.
|
||||||
*/
|
*/
|
||||||
sqlite3CodeVerifySchema(pParse, 1); /* Inserts the cookie verifier Goto */
|
sqlite3CodeVerifySchema(pParse, -1); /* Insert the cookie verifier Goto */
|
||||||
for(i=0; i<pTabList->nSrc; i++){
|
for(i=0; i<pTabList->nSrc; i++){
|
||||||
Table *pTab;
|
Table *pTab;
|
||||||
Index *pIx;
|
Index *pIx;
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
# focus of this script is testing the ATTACH and DETACH commands
|
# focus of this script is testing the ATTACH and DETACH commands
|
||||||
# and related functionality.
|
# and related functionality.
|
||||||
#
|
#
|
||||||
# $Id: attach2.test,v 1.21 2004/06/21 18:14:47 drh Exp $
|
# $Id: attach2.test,v 1.22 2004/07/19 17:25:25 drh Exp $
|
||||||
#
|
#
|
||||||
|
|
||||||
set testdir [file dirname $argv0]
|
set testdir [file dirname $argv0]
|
||||||
@ -177,7 +177,7 @@ do_test attach2-4.2 {
|
|||||||
# db2 -
|
# db2 -
|
||||||
} {}
|
} {}
|
||||||
|
|
||||||
lock_status 4.2.1 db {main shared temp shared file2 unlocked}
|
lock_status 4.2.1 db {main shared temp unlocked file2 unlocked}
|
||||||
lock_status 4.2.2 db2 {main unlocked temp unlocked file2 unlocked}
|
lock_status 4.2.2 db2 {main unlocked temp unlocked file2 unlocked}
|
||||||
|
|
||||||
do_test attach2-4.3 {
|
do_test attach2-4.3 {
|
||||||
@ -185,7 +185,7 @@ do_test attach2-4.3 {
|
|||||||
execsql {SELECT * FROM t1} db2
|
execsql {SELECT * FROM t1} db2
|
||||||
} {}
|
} {}
|
||||||
|
|
||||||
lock_status 4.3.1 db {main shared temp shared file2 unlocked}
|
lock_status 4.3.1 db {main shared temp unlocked file2 unlocked}
|
||||||
lock_status 4.3.2 db2 {main unlocked temp unlocked file2 unlocked}
|
lock_status 4.3.2 db2 {main unlocked temp unlocked file2 unlocked}
|
||||||
|
|
||||||
do_test attach2-4.4 {
|
do_test attach2-4.4 {
|
||||||
@ -196,7 +196,7 @@ do_test attach2-4.4 {
|
|||||||
} db2
|
} db2
|
||||||
} {1 {database is locked}}
|
} {1 {database is locked}}
|
||||||
|
|
||||||
lock_status 4.4.1 db {main shared temp shared file2 unlocked}
|
lock_status 4.4.1 db {main shared temp unlocked file2 unlocked}
|
||||||
lock_status 4.4.2 db2 {main unlocked temp unlocked file2 unlocked}
|
lock_status 4.4.2 db2 {main unlocked temp unlocked file2 unlocked}
|
||||||
|
|
||||||
do_test attach2-4.5 {
|
do_test attach2-4.5 {
|
||||||
@ -208,7 +208,7 @@ do_test attach2-4.5 {
|
|||||||
# db2 - reserved(file2)
|
# db2 - reserved(file2)
|
||||||
} {}
|
} {}
|
||||||
|
|
||||||
lock_status 4.5.1 db {main shared temp shared file2 unlocked}
|
lock_status 4.5.1 db {main shared temp unlocked file2 unlocked}
|
||||||
lock_status 4.5.2 db2 {main unlocked temp reserved file2 reserved}
|
lock_status 4.5.2 db2 {main unlocked temp reserved file2 reserved}
|
||||||
|
|
||||||
do_test attach2-4.6.1 {
|
do_test attach2-4.6.1 {
|
||||||
@ -221,7 +221,7 @@ do_test attach2-4.6.1 {
|
|||||||
# db2 - reserved(file2)
|
# db2 - reserved(file2)
|
||||||
} {0 {}}
|
} {0 {}}
|
||||||
|
|
||||||
lock_status 4.6.1.1 db {main shared temp shared file2 shared}
|
lock_status 4.6.1.1 db {main shared temp unlocked file2 shared}
|
||||||
lock_status 4.6.1.2 db2 {main unlocked temp reserved file2 reserved}
|
lock_status 4.6.1.2 db2 {main unlocked temp reserved file2 reserved}
|
||||||
|
|
||||||
do_test attach2-4.6.2 {
|
do_test attach2-4.6.2 {
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
# This file implements tests for joins, including outer joins, where
|
# This file implements tests for joins, including outer joins, where
|
||||||
# there are a large number of tables involved in the join.
|
# there are a large number of tables involved in the join.
|
||||||
#
|
#
|
||||||
# $Id: join3.test,v 1.1 2004/07/19 02:12:14 drh Exp $
|
# $Id: join3.test,v 1.2 2004/07/19 17:25:25 drh Exp $
|
||||||
|
|
||||||
set testdir [file dirname $argv0]
|
set testdir [file dirname $argv0]
|
||||||
source $testdir/tester.tcl
|
source $testdir/tester.tcl
|
||||||
@ -45,14 +45,8 @@ for {set N 1} {$N<=40} {incr N} {
|
|||||||
append sql " $sep t[expr {$i+1}].x==t$i.x+1"
|
append sql " $sep t[expr {$i+1}].x==t$i.x+1"
|
||||||
set sep AND
|
set sep AND
|
||||||
}
|
}
|
||||||
#if {$N==32} {btree_breakpoint}
|
|
||||||
#if {$N==33} {
|
|
||||||
#explain $sql
|
|
||||||
#execsql {PRAGMA vdbe_trace=on}
|
|
||||||
#}
|
|
||||||
execsql $sql
|
execsql $sql
|
||||||
} $result
|
} $result
|
||||||
#if {$N==33} exit
|
|
||||||
}
|
}
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
# This file implements tests for miscellanous features that were
|
# This file implements tests for miscellanous features that were
|
||||||
# left out of other test files.
|
# left out of other test files.
|
||||||
#
|
#
|
||||||
# $Id: misc4.test,v 1.2 2004/07/19 00:39:46 drh Exp $
|
# $Id: misc4.test,v 1.3 2004/07/19 17:25:25 drh Exp $
|
||||||
|
|
||||||
set testdir [file dirname $argv0]
|
set testdir [file dirname $argv0]
|
||||||
source $testdir/tester.tcl
|
source $testdir/tester.tcl
|
||||||
@ -41,6 +41,17 @@ do_test misc4-1.1 {
|
|||||||
SELECT * FROM temp.t2;
|
SELECT * FROM temp.t2;
|
||||||
}
|
}
|
||||||
} {1}
|
} {1}
|
||||||
catch {sqlite3_finalize $stmt}
|
|
||||||
|
# Drop the temporary table, then rerun the prepared statement to
|
||||||
|
# recreate it again. This recreates ticket #807.
|
||||||
|
#
|
||||||
|
do_test misc4-1.2 {
|
||||||
|
execsql {DROP TABLE t2}
|
||||||
|
sqlite3_reset $stmt
|
||||||
|
sqlite3_step $stmt
|
||||||
|
} {SQLITE_ERROR}
|
||||||
|
do_test misc4-1.3 {
|
||||||
|
sqlite3_finalize $stmt
|
||||||
|
} {SQLITE_SCHEMA}
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
# interface is pretty well tested. This file contains some addition
|
# interface is pretty well tested. This file contains some addition
|
||||||
# tests for fringe issues that the main test suite does not cover.
|
# tests for fringe issues that the main test suite does not cover.
|
||||||
#
|
#
|
||||||
# $Id: tclsqlite.test,v 1.26 2004/06/29 12:39:08 drh Exp $
|
# $Id: tclsqlite.test,v 1.27 2004/07/19 17:25:25 drh Exp $
|
||||||
|
|
||||||
set testdir [file dirname $argv0]
|
set testdir [file dirname $argv0]
|
||||||
source $testdir/tester.tcl
|
source $testdir/tester.tcl
|
||||||
@ -133,6 +133,7 @@ do_test tcl-1.19 {
|
|||||||
|
|
||||||
|
|
||||||
if {[sqlite3 -tcl-uses-utf]} {
|
if {[sqlite3 -tcl-uses-utf]} {
|
||||||
|
catch {unset ::result}
|
||||||
do_test tcl-2.1 {
|
do_test tcl-2.1 {
|
||||||
execsql "CREATE TABLE t\u0123x(a int, b\u1235 float)"
|
execsql "CREATE TABLE t\u0123x(a int, b\u1235 float)"
|
||||||
execsql "PRAGMA table_info(t\u0123x)"
|
execsql "PRAGMA table_info(t\u0123x)"
|
||||||
|
Reference in New Issue
Block a user