1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-29 08:01:23 +03:00

Merge all trunk changes since 3.8.1 into the sessions branch.

FossilOrigin-Name: aa72ea8a004de7fe744fc13baef19d05aea607d5
This commit is contained in:
drh
2013-10-28 22:47:24 +00:00
14 changed files with 563 additions and 86 deletions

View File

@ -16,14 +16,37 @@
/* /*
** This module contains code for a wrapper VFS that causes a log of ** This module contains code for a wrapper VFS that causes a log of
** most VFS calls to be written into a file on disk. The log ** most VFS calls to be written into a file on disk.
** is stored as comma-separated variables.
** **
** All calls on sqlite3_file objects are logged. ** Each database connection creates a separate log file in the same
** Additionally, calls to the xAccess(), xOpen(), and xDelete() ** directory as the original database and named after the original
** methods are logged. The other sqlite3_vfs object methods (xDlXXX, ** database. A unique suffix is added to avoid name collisions.
** xRandomness, xSleep, xCurrentTime, xGetLastError and xCurrentTimeInt64) ** Separate log files are used so that concurrent processes do not
** are not logged. ** try to write log operations to the same file at the same instant,
** resulting in overwritten or comingled log text.
**
** Each individual log file records operations by a single database
** connection on both the original database and its associated rollback
** journal.
**
** The log files are in the comma-separated-value (CSV) format. The
** log files can be imported into an SQLite database using the ".import"
** command of the SQLite command-line shell for analysis.
**
** One technique for using this module is to append the text of this
** module to the end of a standard "sqlite3.c" amalgamation file then
** add the following compile-time options:
**
** -DSQLITE_EXTRA_INIT=sqlite3_register_vfslog
** -DSQLITE_USE_FCNTL_TRACE
**
** The first compile-time option causes the sqlite3_register_vfslog()
** function, defined below, to be invoked when SQLite is initialized.
** That causes this custom VFS to become the default VFS for all
** subsequent connections. The SQLITE_USE_FCNTL_TRACE option causes
** the SQLite core to issue extra sqlite3_file_control() operations
** with SQLITE_FCNTL_TRACE to give some indication of what is going
** on in the core.
*/ */
#include "sqlite3.h" #include "sqlite3.h"
@ -190,7 +213,7 @@ static void vlogLogPrint(
const char *zArg3, /* Third argument */ const char *zArg3, /* Third argument */
int iRes /* Result */ int iRes /* Result */
){ ){
char z1[40], z2[40], z3[70]; char z1[40], z2[40], z3[2000];
if( pLog==0 ) return; if( pLog==0 ) return;
if( iArg1>=0 ){ if( iArg1>=0 ){
sqlite3_snprintf(sizeof(z1), z1, "%lld", iArg1); sqlite3_snprintf(sizeof(z1), z1, "%lld", iArg1);
@ -203,7 +226,7 @@ static void vlogLogPrint(
z2[0] = 0; z2[0] = 0;
} }
if( zArg3 ){ if( zArg3 ){
sqlite3_snprintf(sizeof(z3), z3, "\"%s\"", zArg3); sqlite3_snprintf(sizeof(z3), z3, "\"%.*w\"", sizeof(z3)-4, zArg3);
}else{ }else{
z3[0] = 0; z3[0] = 0;
} }
@ -346,6 +369,13 @@ static void vlogSignature(unsigned char *p, int n, char *zCksum){
} }
} }
/*
** Convert a big-endian 32-bit integer into a native integer
*/
static int bigToNative(const unsigned char *x){
return (x[0]<<24) + (x[1]<<16) + (x[2]<<8) + x[3];
}
/* /*
** Read data from an vlog-file. ** Read data from an vlog-file.
*/ */
@ -376,9 +406,16 @@ static int vlogRead(
&& iOfst+iAmt>=28 && iOfst+iAmt>=28
){ ){
unsigned char *x = ((unsigned char*)zBuf)+(24-iOfst); unsigned char *x = ((unsigned char*)zBuf)+(24-iOfst);
unsigned iCtr; unsigned iCtr, nFree = -1;
iCtr = (x[0]<<24) + (x[1]<<16) + (x[2]<<8) + x[3]; char *zFree = 0;
vlogLogPrint(p->pLog, tStart, 0, "CHNGCTR-READ", iCtr, -1, 0, 0); char zStr[12];
iCtr = bigToNative(x);
if( iOfst+iAmt>=40 ){
zFree = zStr;
sqlite3_snprintf(sizeof(zStr), zStr, "%d", bigToNative(x+8));
nFree = bigToNative(x+12);
}
vlogLogPrint(p->pLog, tStart, 0, "CHNGCTR-READ", iCtr, nFree, zFree, 0);
} }
return rc; return rc;
} }
@ -409,9 +446,16 @@ static int vlogWrite(
&& iOfst+iAmt>=28 && iOfst+iAmt>=28
){ ){
unsigned char *x = ((unsigned char*)z)+(24-iOfst); unsigned char *x = ((unsigned char*)z)+(24-iOfst);
unsigned iCtr; unsigned iCtr, nFree = -1;
iCtr = (x[0]<<24) + (x[1]<<16) + (x[2]<<8) + x[3]; char *zFree = 0;
vlogLogPrint(p->pLog, tStart, 0, "CHNGCTR-WRITE", iCtr, -1, 0, 0); char zStr[12];
iCtr = bigToNative(x);
if( iOfst+iAmt>=40 ){
zFree = zStr;
sqlite3_snprintf(sizeof(zStr), zStr, "%d", bigToNative(x+8));
nFree = bigToNative(x+12);
}
vlogLogPrint(p->pLog, tStart, 0, "CHNGCTR-WRITE", iCtr, nFree, zFree, 0);
} }
return rc; return rc;
} }
@ -477,12 +521,11 @@ static int vlogLock(sqlite3_file *pFile, int eLock){
*/ */
static int vlogUnlock(sqlite3_file *pFile, int eLock){ static int vlogUnlock(sqlite3_file *pFile, int eLock){
int rc; int rc;
sqlite3_uint64 tStart, tElapse; sqlite3_uint64 tStart;
VLogFile *p = (VLogFile *)pFile; VLogFile *p = (VLogFile *)pFile;
tStart = vlog_time(); tStart = vlog_time();
vlogLogPrint(p->pLog, tStart, 0, "UNLOCK", eLock, -1, 0, 0);
rc = p->pReal->pMethods->xUnlock(p->pReal, eLock); rc = p->pReal->pMethods->xUnlock(p->pReal, eLock);
tElapse = vlog_time() - tStart;
vlogLogPrint(p->pLog, tStart, tElapse, "UNLOCK", eLock, -1, 0, rc);
return rc; return rc;
} }
@ -514,7 +557,17 @@ static int vlogFileControl(sqlite3_file *pFile, int op, void *pArg){
*(char**)pArg = sqlite3_mprintf("vlog/%z", *(char**)pArg); *(char**)pArg = sqlite3_mprintf("vlog/%z", *(char**)pArg);
} }
tElapse = vlog_time() - tStart; tElapse = vlog_time() - tStart;
vlogLogPrint(p->pLog, tStart, tElapse, "FILECONTROL", op, -1, 0, rc); if( op==SQLITE_FCNTL_TRACE ){
vlogLogPrint(p->pLog, tStart, tElapse, "TRACE", op, -1, pArg, rc);
}else if( op==SQLITE_FCNTL_PRAGMA ){
const char **azArg = (const char **)pArg;
vlogLogPrint(p->pLog, tStart, tElapse, "FILECONTROL", op, -1, azArg[1], rc);
}else if( op==SQLITE_FCNTL_SIZE_HINT ){
sqlite3_int64 sz = *(sqlite3_int64*)pArg;
vlogLogPrint(p->pLog, tStart, tElapse, "FILECONTROL", op, sz, 0, rc);
}else{
vlogLogPrint(p->pLog, tStart, tElapse, "FILECONTROL", op, -1, 0, rc);
}
return rc; return rc;
} }

View File

@ -1,5 +1,5 @@
C Merge\sthe\slatest\strunk\schanges. C Merge\sall\strunk\schanges\ssince\s3.8.1\sinto\sthe\ssessions\sbranch.
D 2013-10-16T14:32:47.098 D 2013-10-28T22:47:24.844
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 15f75d6d804c5552a05390d1982c1114b8ce6d2d F Makefile.in 15f75d6d804c5552a05390d1982c1114b8ce6d2d
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@ -116,7 +116,7 @@ F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc
F ext/misc/rot13.c 1ac6f95f99b575907b9b09c81a349114cf9be45a F ext/misc/rot13.c 1ac6f95f99b575907b9b09c81a349114cf9be45a
F ext/misc/spellfix.c 5e1d547e9a2aed13897fa91bac924333f62fd2d9 F ext/misc/spellfix.c 5e1d547e9a2aed13897fa91bac924333f62fd2d9
F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512 F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512
F ext/misc/vfslog.c 1abb192d8d4bd323adbddec0c024580496b51b7a F ext/misc/vfslog.c fe40fab5c077a40477f7e5eba994309ecac6cc95
F ext/misc/vtshim.c babb0dc2bf116029e3e7c9a618b8a1377045303e F ext/misc/vtshim.c babb0dc2bf116029e3e7c9a618b8a1377045303e
F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212
F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761
@ -182,7 +182,7 @@ F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
F src/btree.c 509722ce305471b626d3401c0631a808fd33237b F src/btree.c 509722ce305471b626d3401c0631a808fd33237b
F src/btree.h bfe0e8c5759b4ec77b0d18390064a6ef3cdffaaf F src/btree.h bfe0e8c5759b4ec77b0d18390064a6ef3cdffaaf
F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0
F src/build.c 8ae900bf021a66ac110f5eb2dcf994d24d1c2061 F src/build.c 6d9a545d726956fdc0c63d7076291fc9e7207484
F src/callback.c f99a8957ba2adf369645fac0db09ad8adcf1caa2 F src/callback.c f99a8957ba2adf369645fac0db09ad8adcf1caa2
F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
F src/ctime.c ea4b7f3623a0fcb1146e7f245d7410033e86859c F src/ctime.c ea4b7f3623a0fcb1146e7f245d7410033e86859c
@ -226,15 +226,15 @@ F src/parse.y a97566d6da75075589a7c716d1bda14b586cf8da
F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 F src/pcache.c f8043b433a57aba85384a531e3937a804432a346
F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222
F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63 F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63
F src/pragma.c 64d3d1f8b4ed144ba85c061d00d96d6be8aa2fea F src/pragma.c 6fb3125fff078cd81db0039ac778948df4e8cb6f
F src/prepare.c fa6988589f39af8504a61731614cd4f6ae71554f F src/prepare.c fa6988589f39af8504a61731614cd4f6ae71554f
F src/printf.c da9119eb31a187a4b99f60aa4a225141c0ebb74b F src/printf.c da9119eb31a187a4b99f60aa4a225141c0ebb74b
F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68
F src/resolve.c 5f15b00644c36a1610b87857abf42db38c07519c F src/resolve.c 572585a96bf282bb9c3d9e08785ec3cae21dc488
F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
F src/select.c 15127b54cc11defb2cddef6914e1f384501a61c4 F src/select.c 15127b54cc11defb2cddef6914e1f384501a61c4
F src/shell.c 6f11f0e9ded63d48e306f2c6858c521e568a47bb F src/shell.c d5eebdc6034014103de2b9d58e1d3f6f7de0fb50
F src/sqlite.h.in 29199f78f9eba5f935c62dc79a3eb64f26b5e433 F src/sqlite.h.in f287bd97f9cdf6ec8f57f37cf2e590ed6b9f6302
F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
F src/sqliteInt.h cc58deabef26a4a82e7b40c47316968e359c6fae F src/sqliteInt.h cc58deabef26a4a82e7b40c47316968e359c6fae
@ -293,7 +293,7 @@ F src/update.c be9831a714638ed5b66e215451d4775d136ea745
F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269
F src/util.c 2fa6c821d28bbdbeec1b2a7b091a281c9ef8f918 F src/util.c 2fa6c821d28bbdbeec1b2a7b091a281c9ef8f918
F src/vacuum.c f313bc97123a4dd4bfd3f50a00c4d44c08a5b1b7 F src/vacuum.c f313bc97123a4dd4bfd3f50a00c4d44c08a5b1b7
F src/vdbe.c bc9924611f5cc16ac770bb9a37365c57899edafa F src/vdbe.c 7663e009b870623f664fc4d4d0634767d4a927a3
F src/vdbe.h 7aa3ab6210a68471c8490dedfc9aa4ef5684b9a0 F src/vdbe.h 7aa3ab6210a68471c8490dedfc9aa4ef5684b9a0
F src/vdbeInt.h 2eaf8a38ec76738bbb18429e6c4f317e3766742e F src/vdbeInt.h 2eaf8a38ec76738bbb18429e6c4f317e3766742e
F src/vdbeapi.c 8ade912f7023a3b35ee64497a94718ddbd7269c3 F src/vdbeapi.c 8ade912f7023a3b35ee64497a94718ddbd7269c3
@ -306,7 +306,7 @@ F src/vtab.c 5a423b042eb1402ef77697d03d6a67378d97bc8d
F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4
F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74 F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74
F src/where.c dd2d0d69280d6653d8ef8cf3b6b4b848b9058197 F src/where.c f18400f121fd27385f41cdff7aa8a811feca842e
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6
@ -340,7 +340,7 @@ F test/attach3.test d89ccfe4fe6e2b5e368d480fcdfe4b496c54cf4e
F test/attach4.test 53bf502f17647c6d6c5add46dda6bac8b6f4665c F test/attach4.test 53bf502f17647c6d6c5add46dda6bac8b6f4665c
F test/attachmalloc.test 3a4bfca9545bfe906a8d2e622de10fbac5b711b0 F test/attachmalloc.test 3a4bfca9545bfe906a8d2e622de10fbac5b711b0
F test/auth.test 9bea29041871807d9f289ee679d05d3ed103642f F test/auth.test 9bea29041871807d9f289ee679d05d3ed103642f
F test/auth2.test a2a371aa6df15f8b0c8109b33d3d7f0f73e4c9aa F test/auth2.test c3b415b76c033bedb81292118fb7c01f5f10cbcd
F test/auth3.test a4755e6a2a2fea547ffe63c874eb569e60a28eb5 F test/auth3.test a4755e6a2a2fea547ffe63c874eb569e60a28eb5
F test/autoinc.test bd30d372d00045252f6c2e41b5f41455e1975acf F test/autoinc.test bd30d372d00045252f6c2e41b5f41455e1975acf
F test/autoindex1.test d4dfe14001dfcb74cfbd7107f45a79fc1ab6183e F test/autoindex1.test d4dfe14001dfcb74cfbd7107f45a79fc1ab6183e
@ -842,7 +842,7 @@ F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126
F test/tclsqlite.test a7308276aad2e6c0bfb5b0414424dd0d9cc0cad7 F test/tclsqlite.test a7308276aad2e6c0bfb5b0414424dd0d9cc0cad7
F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c
F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30
F test/temptrigger.test 26670ed7a39cf2296a7f0a9e0a1d7bdb7abe936d F test/temptrigger.test 0a48d94222d50e6e50d72ac103606c4f8e7cbb81
F test/tester.tcl 282c1a6b541bd2518a28030884073d1b6dfe98ba F test/tester.tcl 282c1a6b541bd2518a28030884073d1b6dfe98ba
F test/thread001.test 9f22fd3525a307ff42a326b6bc7b0465be1745a5 F test/thread001.test 9f22fd3525a307ff42a326b6bc7b0465be1745a5
F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58
@ -994,7 +994,7 @@ F test/trace2.test e7a988fdd982cdec62f1f1f34b0360e6476d01a0
F test/trans.test 6e1b4c6a42dba31bd65f8fa5e61a2708e08ddde6 F test/trans.test 6e1b4c6a42dba31bd65f8fa5e61a2708e08ddde6
F test/trans2.test d5337e61de45e66b1fcbf9db833fa8c82e624b22 F test/trans2.test d5337e61de45e66b1fcbf9db833fa8c82e624b22
F test/trans3.test 373ac5183cc56be69f48ae44090e7f672939f732 F test/trans3.test 373ac5183cc56be69f48ae44090e7f672939f732
F test/transitive1.test 0ee69546d6fa20e577a4a706d7daa01c7eba9239 F test/transitive1.test 03f532954f46cdf5608f7766bff0b0c52bf2a7cd
F test/trigger1.test dc47573ac79ffe0ee3eecaa517d70d8dacbccd03 F test/trigger1.test dc47573ac79ffe0ee3eecaa517d70d8dacbccd03
F test/trigger2.test 834187beafd1db383af0c659cfa49b0576832816 F test/trigger2.test 834187beafd1db383af0c659cfa49b0576832816
F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945
@ -1108,7 +1108,7 @@ F tool/logest.c 7ad625cac3d54012b27d468b7af6612f78b9ba75
F tool/mkautoconfamal.sh f8d8dbf7d62f409ebed5134998bf5b51d7266383 F tool/mkautoconfamal.sh f8d8dbf7d62f409ebed5134998bf5b51d7266383
F tool/mkkeywordhash.c bb52064aa614e1426445e4b2b9b00eeecd23cc79 F tool/mkkeywordhash.c bb52064aa614e1426445e4b2b9b00eeecd23cc79
F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e
F tool/mkpragmatab.tcl 3fc52e00a234750675e8a569d2919ff48558e9eb F tool/mkpragmatab.tcl 17d40faae6c4b865633bfc5763821402a1cbefc3
F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
F tool/mksqlite3c-noext.tcl 8bce31074e4cbe631bb7676526a048335f4c9f02 F tool/mksqlite3c-noext.tcl 8bce31074e4cbe631bb7676526a048335f4c9f02
F tool/mksqlite3c.tcl cfc3838294137f89be9abe05fcc967524f1a2618 F tool/mksqlite3c.tcl cfc3838294137f89be9abe05fcc967524f1a2618
@ -1141,7 +1141,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
P e111e4edf9d7b2d4d6d6673a7576801839e9537d 8651aba1865a8f82d21d3345f33fbd239fd9a042 P 5806546822b717d712dc7cd9de88a86f5bf2f715 3a9e3ed94bf617f00c48009b1a6d348a8f23a3cf
R 1e2f9ded6c7cb8edf0540013bd7feba5 R 6a218c52fd606677f29de12012a31eb7
U drh U drh
Z a8c852ebe46ee653cedb027cf82e79d9 Z 6c335f57007a8ea5e658e5dc44efd950

View File

@ -1 +1 @@
5806546822b717d712dc7cd9de88a86f5bf2f715 aa72ea8a004de7fe744fc13baef19d05aea607d5

View File

@ -1714,7 +1714,7 @@ void sqlite3EndTable(
/* Reparse everything to update our internal data structures */ /* Reparse everything to update our internal data structures */
sqlite3VdbeAddParseSchemaOp(v, iDb, sqlite3VdbeAddParseSchemaOp(v, iDb,
sqlite3MPrintf(db, "tbl_name='%q'", p->zName)); sqlite3MPrintf(db, "tbl_name='%q' AND type!='trigger'", p->zName));
} }

View File

@ -94,11 +94,13 @@ static const struct sPragmaNames {
/* ePragFlag: */ PragFlag_NeedSchema, /* ePragFlag: */ PragFlag_NeedSchema,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
#if !defined(SQLITE_OMIT_AUTOMATIC_INDEX) #if !defined(SQLITE_OMIT_AUTOMATIC_INDEX)
{ /* zName: */ "automatic_index", { /* zName: */ "automatic_index",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_AutoIndex }, /* iArg: */ SQLITE_AutoIndex },
#endif
#endif #endif
{ /* zName: */ "busy_timeout", { /* zName: */ "busy_timeout",
/* ePragTyp: */ PragTyp_BUSY_TIMEOUT, /* ePragTyp: */ PragTyp_BUSY_TIMEOUT,
@ -110,18 +112,22 @@ static const struct sPragmaNames {
/* ePragFlag: */ PragFlag_NeedSchema, /* ePragFlag: */ PragFlag_NeedSchema,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
{ /* zName: */ "cache_spill", { /* zName: */ "cache_spill",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_CacheSpill }, /* iArg: */ SQLITE_CacheSpill },
#endif
{ /* zName: */ "case_sensitive_like", { /* zName: */ "case_sensitive_like",
/* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE, /* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ 0 }, /* iArg: */ 0 },
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
{ /* zName: */ "checkpoint_fullfsync", { /* zName: */ "checkpoint_fullfsync",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_CkptFullFSync }, /* iArg: */ SQLITE_CkptFullFSync },
#endif
#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
{ /* zName: */ "collation_list", { /* zName: */ "collation_list",
/* ePragTyp: */ PragTyp_COLLATION_LIST, /* ePragTyp: */ PragTyp_COLLATION_LIST,
@ -134,10 +140,12 @@ static const struct sPragmaNames {
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
{ /* zName: */ "count_changes", { /* zName: */ "count_changes",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_CountRows }, /* iArg: */ SQLITE_CountRows },
#endif
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN
{ /* zName: */ "data_store_directory", { /* zName: */ "data_store_directory",
/* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY,
@ -156,16 +164,20 @@ static const struct sPragmaNames {
/* ePragFlag: */ PragFlag_NeedSchema, /* ePragFlag: */ PragFlag_NeedSchema,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
{ /* zName: */ "defer_foreign_keys", { /* zName: */ "defer_foreign_keys",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_DeferFKs }, /* iArg: */ SQLITE_DeferFKs },
#endif #endif
#endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
{ /* zName: */ "empty_result_callbacks", { /* zName: */ "empty_result_callbacks",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_NullCallback }, /* iArg: */ SQLITE_NullCallback },
#endif
#if !defined(SQLITE_OMIT_UTF16) #if !defined(SQLITE_OMIT_UTF16)
{ /* zName: */ "encoding", { /* zName: */ "encoding",
/* ePragTyp: */ PragTyp_ENCODING, /* ePragTyp: */ PragTyp_ENCODING,
@ -184,18 +196,21 @@ static const struct sPragmaNames {
/* ePragFlag: */ PragFlag_NeedSchema, /* ePragFlag: */ PragFlag_NeedSchema,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
{ /* zName: */ "foreign_keys", { /* zName: */ "foreign_keys",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_ForeignKeys }, /* iArg: */ SQLITE_ForeignKeys },
#endif #endif
#endif
#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
{ /* zName: */ "freelist_count", { /* zName: */ "freelist_count",
/* ePragTyp: */ PragTyp_HEADER_VALUE, /* ePragTyp: */ PragTyp_HEADER_VALUE,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
{ /* zName: */ "full_column_names", { /* zName: */ "full_column_names",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
@ -204,6 +219,7 @@ static const struct sPragmaNames {
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_FullFSync }, /* iArg: */ SQLITE_FullFSync },
#endif
#if defined(SQLITE_HAS_CODEC) #if defined(SQLITE_HAS_CODEC)
{ /* zName: */ "hexkey", { /* zName: */ "hexkey",
/* ePragTyp: */ PragTyp_HEXKEY, /* ePragTyp: */ PragTyp_HEXKEY,
@ -214,12 +230,14 @@ static const struct sPragmaNames {
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
#if !defined(SQLITE_OMIT_CHECK) #if !defined(SQLITE_OMIT_CHECK)
{ /* zName: */ "ignore_check_constraints", { /* zName: */ "ignore_check_constraints",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_IgnoreChecks }, /* iArg: */ SQLITE_IgnoreChecks },
#endif #endif
#endif
#if !defined(SQLITE_OMIT_AUTOVACUUM) #if !defined(SQLITE_OMIT_AUTOVACUUM)
{ /* zName: */ "incremental_vacuum", { /* zName: */ "incremental_vacuum",
/* ePragTyp: */ PragTyp_INCREMENTAL_VACUUM, /* ePragTyp: */ PragTyp_INCREMENTAL_VACUUM,
@ -258,10 +276,12 @@ static const struct sPragmaNames {
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
{ /* zName: */ "legacy_file_format", { /* zName: */ "legacy_file_format",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_LegacyFileFmt }, /* iArg: */ SQLITE_LegacyFileFmt },
#endif
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE
{ /* zName: */ "lock_proxy_file", { /* zName: */ "lock_proxy_file",
/* ePragTyp: */ PragTyp_LOCK_PROXY_FILE, /* ePragTyp: */ PragTyp_LOCK_PROXY_FILE,
@ -302,16 +322,19 @@ static const struct sPragmaNames {
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
{ /* zName: */ "query_only", { /* zName: */ "query_only",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_QueryOnly }, /* iArg: */ SQLITE_QueryOnly },
#endif
#if !defined(SQLITE_OMIT_INTEGRITY_CHECK) #if !defined(SQLITE_OMIT_INTEGRITY_CHECK)
{ /* zName: */ "quick_check", { /* zName: */ "quick_check",
/* ePragTyp: */ PragTyp_INTEGRITY_CHECK, /* ePragTyp: */ PragTyp_INTEGRITY_CHECK,
/* ePragFlag: */ PragFlag_NeedSchema, /* ePragFlag: */ PragFlag_NeedSchema,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
{ /* zName: */ "read_uncommitted", { /* zName: */ "read_uncommitted",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
@ -320,16 +343,19 @@ static const struct sPragmaNames {
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_RecTriggers }, /* iArg: */ SQLITE_RecTriggers },
#endif
#if defined(SQLITE_HAS_CODEC) #if defined(SQLITE_HAS_CODEC)
{ /* zName: */ "rekey", { /* zName: */ "rekey",
/* ePragTyp: */ PragTyp_REKEY, /* ePragTyp: */ PragTyp_REKEY,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
{ /* zName: */ "reverse_unordered_selects", { /* zName: */ "reverse_unordered_selects",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_ReverseOrder }, /* iArg: */ SQLITE_ReverseOrder },
#endif
#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS)
{ /* zName: */ "schema_version", { /* zName: */ "schema_version",
/* ePragTyp: */ PragTyp_HEADER_VALUE, /* ePragTyp: */ PragTyp_HEADER_VALUE,
@ -342,10 +368,12 @@ static const struct sPragmaNames {
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
{ /* zName: */ "short_column_names", { /* zName: */ "short_column_names",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_ShortColNames }, /* iArg: */ SQLITE_ShortColNames },
#endif
{ /* zName: */ "shrink_memory", { /* zName: */ "shrink_memory",
/* ePragTyp: */ PragTyp_SHRINK_MEMORY, /* ePragTyp: */ PragTyp_SHRINK_MEMORY,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
@ -354,12 +382,14 @@ static const struct sPragmaNames {
/* ePragTyp: */ PragTyp_SOFT_HEAP_LIMIT, /* ePragTyp: */ PragTyp_SOFT_HEAP_LIMIT,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ 0 }, /* iArg: */ 0 },
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
#if defined(SQLITE_DEBUG) #if defined(SQLITE_DEBUG)
{ /* zName: */ "sql_trace", { /* zName: */ "sql_trace",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_SqlTrace }, /* iArg: */ SQLITE_SqlTrace },
#endif #endif
#endif
#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS)
{ /* zName: */ "stats", { /* zName: */ "stats",
/* ePragTyp: */ PragTyp_STATS, /* ePragTyp: */ PragTyp_STATS,
@ -394,6 +424,7 @@ static const struct sPragmaNames {
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
#if defined(SQLITE_DEBUG) #if defined(SQLITE_DEBUG)
{ /* zName: */ "vdbe_addoptrace", { /* zName: */ "vdbe_addoptrace",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
@ -412,6 +443,7 @@ static const struct sPragmaNames {
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_VdbeTrace }, /* iArg: */ SQLITE_VdbeTrace },
#endif #endif
#endif
#if !defined(SQLITE_OMIT_WAL) #if !defined(SQLITE_OMIT_WAL)
{ /* zName: */ "wal_autocheckpoint", { /* zName: */ "wal_autocheckpoint",
/* ePragTyp: */ PragTyp_WAL_AUTOCHECKPOINT, /* ePragTyp: */ PragTyp_WAL_AUTOCHECKPOINT,
@ -422,10 +454,12 @@ static const struct sPragmaNames {
/* ePragFlag: */ PragFlag_NeedSchema, /* ePragFlag: */ PragFlag_NeedSchema,
/* iArg: */ 0 }, /* iArg: */ 0 },
#endif #endif
#if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
{ /* zName: */ "writable_schema", { /* zName: */ "writable_schema",
/* ePragTyp: */ PragTyp_FLAG, /* ePragTyp: */ PragTyp_FLAG,
/* ePragFlag: */ 0, /* ePragFlag: */ 0,
/* iArg: */ SQLITE_WriteSchema|SQLITE_RecoveryMode }, /* iArg: */ SQLITE_WriteSchema|SQLITE_RecoveryMode },
#endif
}; };
/* Number of pragmas: 56 on by default, 68 total. */ /* Number of pragmas: 56 on by default, 68 total. */
/* End of the automatically generated pragma table. /* End of the automatically generated pragma table.

View File

@ -709,7 +709,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
}else{ }else{
/* EVIDENCE-OF: R-61304-29449 The unlikely(X) function is equivalent to /* EVIDENCE-OF: R-61304-29449 The unlikely(X) function is equivalent to
** likelihood(X, 0.0625). ** likelihood(X, 0.0625).
** EVIDENCE-OF: R-35738-39582 The unlikely(X) fucntion is short-hand for ** EVIDENCE-OF: R-01283-11636 The unlikely(X) function is short-hand for
** likelihood(X,0.0625). */ ** likelihood(X,0.0625). */
pExpr->iTable = 62; /* TUNING: Default 2nd arg to unlikely() is 0.0625 */ pExpr->iTable = 62; /* TUNING: Default 2nd arg to unlikely() is 0.0625 */
} }

View File

@ -436,6 +436,7 @@ struct callback_data {
** .explain ON */ ** .explain ON */
char outfile[FILENAME_MAX]; /* Filename for *out */ char outfile[FILENAME_MAX]; /* Filename for *out */
const char *zDbFilename; /* name of the database file */ const char *zDbFilename; /* name of the database file */
char *zFreeOnClose; /* Filename to free when closing */
const char *zVfs; /* Name of VFS to use */ const char *zVfs; /* Name of VFS to use */
sqlite3_stmt *pStmt; /* Current statement if any. */ sqlite3_stmt *pStmt; /* Current statement if any. */
FILE *pLog; /* Write log output here */ FILE *pLog; /* Write log output here */
@ -1437,6 +1438,7 @@ static char zHelp[] =
" tabs Tab-separated values\n" " tabs Tab-separated values\n"
" tcl TCL list elements\n" " tcl TCL list elements\n"
".nullvalue STRING Use STRING in place of NULL values\n" ".nullvalue STRING Use STRING in place of NULL values\n"
".open ?FILENAME? Close existing database and reopen FILENAME\n"
".output FILENAME Send output to FILENAME\n" ".output FILENAME Send output to FILENAME\n"
".output stdout Send output to the screen\n" ".output stdout Send output to the screen\n"
".print STRING... Print literal STRING\n" ".print STRING... Print literal STRING\n"
@ -1470,7 +1472,7 @@ static int process_input(struct callback_data *p, FILE *in);
** Make sure the database is open. If it is not, then open it. If ** Make sure the database is open. If it is not, then open it. If
** the database fails to open, print an error message and exit. ** the database fails to open, print an error message and exit.
*/ */
static void open_db(struct callback_data *p){ static void open_db(struct callback_data *p, int keepAlive){
if( p->db==0 ){ if( p->db==0 ){
sqlite3_initialize(); sqlite3_initialize();
sqlite3_open(p->zDbFilename, &p->db); sqlite3_open(p->zDbFilename, &p->db);
@ -1482,6 +1484,7 @@ static void open_db(struct callback_data *p){
if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){ if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){
fprintf(stderr,"Error: unable to open database \"%s\": %s\n", fprintf(stderr,"Error: unable to open database \"%s\": %s\n",
p->zDbFilename, sqlite3_errmsg(db)); p->zDbFilename, sqlite3_errmsg(db));
if( keepAlive ) return;
exit(1); exit(1);
} }
#ifndef SQLITE_OMIT_LOAD_EXTENSION #ifndef SQLITE_OMIT_LOAD_EXTENSION
@ -1834,7 +1837,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
sqlite3_close(pDest); sqlite3_close(pDest);
return 1; return 1;
} }
open_db(p); open_db(p, 0);
pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb);
if( pBackup==0 ){ if( pBackup==0 ){
fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest));
@ -1866,7 +1869,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){ if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){
struct callback_data data; struct callback_data data;
char *zErrMsg = 0; char *zErrMsg = 0;
open_db(p); open_db(p, 0);
memcpy(&data, p, sizeof(data)); memcpy(&data, p, sizeof(data));
data.showHeader = 1; data.showHeader = 1;
data.mode = MODE_Column; data.mode = MODE_Column;
@ -1883,7 +1886,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
}else }else
if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){ if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){
open_db(p); open_db(p, 0);
/* When playing back a "dump", the content might appear in an order /* When playing back a "dump", the content might appear in an order
** which causes immediate foreign key constraints to be violated. ** which causes immediate foreign key constraints to be violated.
** So disable foreign-key constraint enforcement to prevent problems. */ ** So disable foreign-key constraint enforcement to prevent problems. */
@ -2002,7 +2005,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
seenInterrupt = 0; seenInterrupt = 0;
memset(&sCsv, 0, sizeof(sCsv)); memset(&sCsv, 0, sizeof(sCsv));
open_db(p); open_db(p, 0);
nSep = strlen30(p->separator); nSep = strlen30(p->separator);
if( nSep==0 ){ if( nSep==0 ){
fprintf(stderr, "Error: non-null separator required for import\n"); fprintf(stderr, "Error: non-null separator required for import\n");
@ -2140,7 +2143,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){ if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){
struct callback_data data; struct callback_data data;
char *zErrMsg = 0; char *zErrMsg = 0;
open_db(p); open_db(p, 0);
memcpy(&data, p, sizeof(data)); memcpy(&data, p, sizeof(data));
data.showHeader = 0; data.showHeader = 0;
data.mode = MODE_List; data.mode = MODE_List;
@ -2206,7 +2209,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
char *zErrMsg = 0; char *zErrMsg = 0;
zFile = azArg[1]; zFile = azArg[1];
zProc = nArg>=3 ? azArg[2] : 0; zProc = nArg>=3 ? azArg[2] : 0;
open_db(p); open_db(p, 0);
rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
if( rc!=SQLITE_OK ){ if( rc!=SQLITE_OK ){
fprintf(stderr, "Error: %s\n", zErrMsg); fprintf(stderr, "Error: %s\n", zErrMsg);
@ -2272,6 +2275,26 @@ static int do_meta_command(char *zLine, struct callback_data *p){
"%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]); "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]);
}else }else
if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){
sqlite3 *savedDb = p->db;
const char *zSavedFilename = p->zDbFilename;
char *zNewFilename = 0;
p->db = 0;
if( nArg>=2 ){
p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]);
}
open_db(p, 1);
if( p->db!=0 ){
sqlite3_close(savedDb);
sqlite3_free(p->zFreeOnClose);
p->zFreeOnClose = zNewFilename;
}else{
sqlite3_free(zNewFilename);
p->db = savedDb;
p->zDbFilename = zSavedFilename;
}
}else
if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){ if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){
if( p->outfile[0]=='|' ){ if( p->outfile[0]=='|' ){
pclose(p->out); pclose(p->out);
@ -2355,7 +2378,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
sqlite3_close(pSrc); sqlite3_close(pSrc);
return 1; return 1;
} }
open_db(p); open_db(p, 0);
pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main");
if( pBackup==0 ){ if( pBackup==0 ){
fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db));
@ -2385,7 +2408,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){ if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){
struct callback_data data; struct callback_data data;
char *zErrMsg = 0; char *zErrMsg = 0;
open_db(p); open_db(p, 0);
memcpy(&data, p, sizeof(data)); memcpy(&data, p, sizeof(data));
data.showHeader = 0; data.showHeader = 0;
data.mode = MODE_Semi; data.mode = MODE_Semi;
@ -2516,7 +2539,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
int nRow, nAlloc; int nRow, nAlloc;
char *zSql = 0; char *zSql = 0;
int ii; int ii;
open_db(p); open_db(p, 0);
rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
if( rc ) return rc; if( rc ) return rc;
zSql = sqlite3_mprintf( zSql = sqlite3_mprintf(
@ -2616,7 +2639,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
int testctrl = -1; int testctrl = -1;
int rc = 0; int rc = 0;
int i, n; int i, n;
open_db(p); open_db(p, 0);
/* convert testctrl text option to value. allow any unique prefix /* convert testctrl text option to value. allow any unique prefix
** of the option name, or a numerical value. */ ** of the option name, or a numerical value. */
@ -2715,7 +2738,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
}else }else
if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){ if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){
open_db(p); open_db(p, 0);
sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1])); sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1]));
}else }else
@ -2726,7 +2749,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){
}else }else
if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){ if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){
open_db(p); open_db(p, 0);
output_file_close(p->traceOut); output_file_close(p->traceOut);
p->traceOut = output_file_open(azArg[1]); p->traceOut = output_file_open(azArg[1]);
#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT) #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT)
@ -2918,7 +2941,7 @@ static int process_input(struct callback_data *p, FILE *in){
if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior)
&& sqlite3_complete(zSql) ){ && sqlite3_complete(zSql) ){
p->cnt = 0; p->cnt = 0;
open_db(p); open_db(p, 0);
BEGIN_TIMER; BEGIN_TIMER;
rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg); rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg);
END_TIMER; END_TIMER;
@ -3245,7 +3268,7 @@ int main(int argc, char **argv){
** to the sqlite command-line tool. ** to the sqlite command-line tool.
*/ */
if( access(data.zDbFilename, 0)==0 ){ if( access(data.zDbFilename, 0)==0 ){
open_db(&data); open_db(&data, 0);
} }
/* Process the initialization file if there is one. If no -init option /* Process the initialization file if there is one. If no -init option
@ -3325,7 +3348,7 @@ int main(int argc, char **argv){
rc = do_meta_command(z, &data); rc = do_meta_command(z, &data);
if( rc && bail_on_error ) return rc==2 ? 0 : rc; if( rc && bail_on_error ) return rc==2 ? 0 : rc;
}else{ }else{
open_db(&data); open_db(&data, 0);
rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg); rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg);
if( zErrMsg!=0 ){ if( zErrMsg!=0 ){
fprintf(stderr,"Error: %s\n", zErrMsg); fprintf(stderr,"Error: %s\n", zErrMsg);
@ -3349,7 +3372,7 @@ int main(int argc, char **argv){
rc = do_meta_command(zFirstCmd, &data); rc = do_meta_command(zFirstCmd, &data);
if( rc==2 ) rc = 0; if( rc==2 ) rc = 0;
}else{ }else{
open_db(&data); open_db(&data, 0);
rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg); rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg);
if( zErrMsg!=0 ){ if( zErrMsg!=0 ){
fprintf(stderr,"Error: %s\n", zErrMsg); fprintf(stderr,"Error: %s\n", zErrMsg);
@ -3396,5 +3419,6 @@ int main(int argc, char **argv){
if( data.db ){ if( data.db ){
sqlite3_close(data.db); sqlite3_close(data.db);
} }
sqlite3_free(data.zFreeOnClose);
return rc; return rc;
} }

View File

@ -907,6 +907,14 @@ struct sqlite3_io_methods {
** can be queried by passing in a pointer to a negative number. This ** can be queried by passing in a pointer to a negative number. This
** file-control is used internally to implement [PRAGMA mmap_size]. ** file-control is used internally to implement [PRAGMA mmap_size].
** **
** <li>[[SQLITE_FCNTL_TRACE]]
** The [SQLITE_FCNTL_TRACE] file control provides advisory information
** to the VFS about what the higher layers of the SQLite stack are doing.
** This file control is used by some VFS activity tracing [shims].
** The argument is a zero-terminated string. Higher layers in the
** SQLite stack may generate instances of this file control if
** the [SQLITE_USE_FCNTL_TRACE] compile-time option is enabled.
**
** </ul> ** </ul>
*/ */
#define SQLITE_FCNTL_LOCKSTATE 1 #define SQLITE_FCNTL_LOCKSTATE 1
@ -926,6 +934,7 @@ struct sqlite3_io_methods {
#define SQLITE_FCNTL_BUSYHANDLER 15 #define SQLITE_FCNTL_BUSYHANDLER 15
#define SQLITE_FCNTL_TEMPFILENAME 16 #define SQLITE_FCNTL_TEMPFILENAME 16
#define SQLITE_FCNTL_MMAP_SIZE 18 #define SQLITE_FCNTL_MMAP_SIZE 18
#define SQLITE_FCNTL_TRACE 19
/* /*
** CAPI3REF: Mutex Handle ** CAPI3REF: Mutex Handle

View File

@ -6190,6 +6190,16 @@ case OP_Trace: {
db->xTrace(db->pTraceArg, z); db->xTrace(db->pTraceArg, z);
sqlite3DbFree(db, z); sqlite3DbFree(db, z);
} }
#ifdef SQLITE_USE_FCNTL_TRACE
zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql);
if( zTrace ){
int i;
for(i=0; i<db->nDb; i++){
if( ((1<<i) & p->btreeMask)==0 ) continue;
sqlite3_file_control(db, db->aDb[i].zName, SQLITE_FCNTL_TRACE, zTrace);
}
}
#endif /* SQLITE_USE_FCNTL_TRACE */
#ifdef SQLITE_DEBUG #ifdef SQLITE_DEBUG
if( (db->flags & SQLITE_SqlTrace)!=0 if( (db->flags & SQLITE_SqlTrace)!=0
&& (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0

View File

@ -878,7 +878,10 @@ static WhereTerm *whereScanNext(WhereScan *pScan){
iColumn = pScan->aEquiv[pScan->iEquiv-1]; iColumn = pScan->aEquiv[pScan->iEquiv-1];
while( (pWC = pScan->pWC)!=0 ){ while( (pWC = pScan->pWC)!=0 ){
for(pTerm=pWC->a+k; k<pWC->nTerm; k++, pTerm++){ for(pTerm=pWC->a+k; k<pWC->nTerm; k++, pTerm++){
if( pTerm->leftCursor==iCur && pTerm->u.leftColumn==iColumn ){ if( pTerm->leftCursor==iCur
&& pTerm->u.leftColumn==iColumn
&& (pScan->iEquiv<=2 || !ExprHasProperty(pTerm->pExpr, EP_FromJoin))
){
if( (pTerm->eOperator & WO_EQUIV)!=0 if( (pTerm->eOperator & WO_EQUIV)!=0
&& pScan->nEquiv<ArraySize(pScan->aEquiv) && pScan->nEquiv<ArraySize(pScan->aEquiv)
){ ){
@ -2550,7 +2553,7 @@ static int whereRangeScanEst(
nOut = nNew; nOut = nNew;
} }
pLoop->nOut = (LogEst)nOut; pLoop->nOut = (LogEst)nOut;
WHERETRACE(0x100, ("range scan regions: %u..%u est=%d\n", WHERETRACE(0x10, ("range scan regions: %u..%u est=%d\n",
(u32)iLower, (u32)iUpper, nOut)); (u32)iLower, (u32)iUpper, nOut));
return SQLITE_OK; return SQLITE_OK;
} }
@ -2636,7 +2639,7 @@ static int whereEqualScanEst(
pBuilder->nRecValid = nEq; pBuilder->nRecValid = nEq;
whereKeyStats(pParse, p, pRec, 0, a); whereKeyStats(pParse, p, pRec, 0, a);
WHERETRACE(0x100,("equality scan regions: %d\n", (int)a[1])); WHERETRACE(0x10,("equality scan regions: %d\n", (int)a[1]));
*pnRow = a[1]; *pnRow = a[1];
return rc; return rc;
@ -2684,7 +2687,7 @@ static int whereInScanEst(
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
if( nRowEst > p->aiRowEst[0] ) nRowEst = p->aiRowEst[0]; if( nRowEst > p->aiRowEst[0] ) nRowEst = p->aiRowEst[0];
*pnRow = nRowEst; *pnRow = nRowEst;
WHERETRACE(0x100,("IN row estimate: est=%g\n", nRowEst)); WHERETRACE(0x10,("IN row estimate: est=%g\n", nRowEst));
} }
assert( pBuilder->nRecValid==nRecValid ); assert( pBuilder->nRecValid==nRecValid );
return rc; return rc;
@ -3889,22 +3892,38 @@ static Bitmask codeOneLoopStart(
return pLevel->notReady; return pLevel->notReady;
} }
#if defined(WHERETRACE_ENABLED) && defined(SQLITE_ENABLE_TREE_EXPLAIN)
/*
** Generate "Explanation" text for a WhereTerm.
*/
static void whereExplainTerm(Vdbe *v, WhereTerm *pTerm){
char zType[4];
memcpy(zType, "...", 4);
if( pTerm->wtFlags & TERM_VIRTUAL ) zType[0] = 'V';
if( pTerm->eOperator & WO_EQUIV ) zType[1] = 'E';
if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) zType[2] = 'L';
sqlite3ExplainPrintf(v, "%s ", zType);
sqlite3ExplainExpr(v, pTerm->pExpr);
}
#endif /* WHERETRACE_ENABLED && SQLITE_ENABLE_TREE_EXPLAIN */
#ifdef WHERETRACE_ENABLED #ifdef WHERETRACE_ENABLED
/* /*
** Print a WhereLoop object for debugging purposes ** Print a WhereLoop object for debugging purposes
*/ */
static void whereLoopPrint(WhereLoop *p, SrcList *pTabList){ static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){
int nb = 1+(pTabList->nSrc+7)/8; WhereInfo *pWInfo = pWC->pWInfo;
struct SrcList_item *pItem = pTabList->a + p->iTab; int nb = 1+(pWInfo->pTabList->nSrc+7)/8;
struct SrcList_item *pItem = pWInfo->pTabList->a + p->iTab;
Table *pTab = pItem->pTab; Table *pTab = pItem->pTab;
sqlite3DebugPrintf("%c%2d.%0*llx.%0*llx", p->cId, sqlite3DebugPrintf("%c%2d.%0*llx.%0*llx", p->cId,
p->iTab, nb, p->maskSelf, nb, p->prereq); p->iTab, nb, p->maskSelf, nb, p->prereq);
sqlite3DebugPrintf(" %12s", sqlite3DebugPrintf(" %12s",
pItem->zAlias ? pItem->zAlias : pTab->zName); pItem->zAlias ? pItem->zAlias : pTab->zName);
if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){
if( p->u.btree.pIndex ){ const char *zName;
const char *zName = p->u.btree.pIndex->zName; if( p->u.btree.pIndex && (zName = p->u.btree.pIndex->zName)!=0 ){
if( zName==0 ) zName = "ipk";
if( strncmp(zName, "sqlite_autoindex_", 17)==0 ){ if( strncmp(zName, "sqlite_autoindex_", 17)==0 ){
int i = sqlite3Strlen30(zName) - 1; int i = sqlite3Strlen30(zName) - 1;
while( zName[i]!='_' ) i--; while( zName[i]!='_' ) i--;
@ -3927,6 +3946,26 @@ static void whereLoopPrint(WhereLoop *p, SrcList *pTabList){
} }
sqlite3DebugPrintf(" f %04x N %d", p->wsFlags, p->nLTerm); sqlite3DebugPrintf(" f %04x N %d", p->wsFlags, p->nLTerm);
sqlite3DebugPrintf(" cost %d,%d,%d\n", p->rSetup, p->rRun, p->nOut); sqlite3DebugPrintf(" cost %d,%d,%d\n", p->rSetup, p->rRun, p->nOut);
#ifdef SQLITE_ENABLE_TREE_EXPLAIN
/* If the 0x100 bit of wheretracing is set, then show all of the constraint
** expressions in the WhereLoop.aLTerm[] array.
*/
if( p->nLTerm && (sqlite3WhereTrace & 0x100)!=0 ){ /* WHERETRACE 0x100 */
int i;
Vdbe *v = pWInfo->pParse->pVdbe;
sqlite3ExplainBegin(v);
for(i=0; i<p->nLTerm; i++){
WhereTerm *pTerm = p->aLTerm[i];
sqlite3ExplainPrintf(v, " (%d) #%-2d ", i+1, (int)(pTerm-pWC->a));
sqlite3ExplainPush(v);
whereExplainTerm(v, pTerm);
sqlite3ExplainPop(v);
sqlite3ExplainNL(v);
}
sqlite3ExplainFinish(v);
sqlite3DebugPrintf("%s", sqlite3VdbeExplanation(v));
}
#endif
} }
#endif #endif
@ -4066,10 +4105,10 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){
#endif #endif
whereOrInsert(pBuilder->pOrSet, pTemplate->prereq, pTemplate->rRun, whereOrInsert(pBuilder->pOrSet, pTemplate->prereq, pTemplate->rRun,
pTemplate->nOut); pTemplate->nOut);
#if WHERETRACE_ENABLED #if WHERETRACE_ENABLED /* 0x8 */
if( sqlite3WhereTrace & 0x8 ){ if( sqlite3WhereTrace & 0x8 ){
sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n); sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n);
whereLoopPrint(pTemplate, pWInfo->pTabList); whereLoopPrint(pTemplate, pBuilder->pWC);
} }
#endif #endif
return SQLITE_OK; return SQLITE_OK;
@ -4139,14 +4178,14 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){
** with pTemplate[] if p[] exists, or if p==NULL then allocate a new ** with pTemplate[] if p[] exists, or if p==NULL then allocate a new
** WhereLoop and insert it. ** WhereLoop and insert it.
*/ */
#if WHERETRACE_ENABLED #if WHERETRACE_ENABLED /* 0x8 */
if( sqlite3WhereTrace & 0x8 ){ if( sqlite3WhereTrace & 0x8 ){
if( p!=0 ){ if( p!=0 ){
sqlite3DebugPrintf("ins-del: "); sqlite3DebugPrintf("ins-del: ");
whereLoopPrint(p, pWInfo->pTabList); whereLoopPrint(p, pBuilder->pWC);
} }
sqlite3DebugPrintf("ins-new: "); sqlite3DebugPrintf("ins-new: ");
whereLoopPrint(pTemplate, pWInfo->pTabList); whereLoopPrint(pTemplate, pBuilder->pWC);
} }
#endif #endif
if( p==0 ){ if( p==0 ){
@ -4167,10 +4206,10 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){
/* Jump here if the insert is a no-op */ /* Jump here if the insert is a no-op */
whereLoopInsert_noop: whereLoopInsert_noop:
#if WHERETRACE_ENABLED #if WHERETRACE_ENABLED /* 0x8 */
if( sqlite3WhereTrace & 0x8 ){ if( sqlite3WhereTrace & 0x8 ){
sqlite3DebugPrintf("ins-noop: "); sqlite3DebugPrintf("ins-noop: ");
whereLoopPrint(pTemplate, pWInfo->pTabList); whereLoopPrint(pTemplate, pBuilder->pWC);
} }
#endif #endif
return SQLITE_OK; return SQLITE_OK;
@ -5328,7 +5367,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
} }
if( jj>=nTo ){ if( jj>=nTo ){
if( nTo>=mxChoice && rCost>=mxCost ){ if( nTo>=mxChoice && rCost>=mxCost ){
#ifdef WHERETRACE_ENABLED #ifdef WHERETRACE_ENABLED /* 0x4 */
if( sqlite3WhereTrace&0x4 ){ if( sqlite3WhereTrace&0x4 ){
sqlite3DebugPrintf("Skip %s cost=%-3d,%3d order=%c\n", sqlite3DebugPrintf("Skip %s cost=%-3d,%3d order=%c\n",
wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, wherePathName(pFrom, iLoop, pWLoop), rCost, nOut,
@ -5346,7 +5385,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
jj = mxI; jj = mxI;
} }
pTo = &aTo[jj]; pTo = &aTo[jj];
#ifdef WHERETRACE_ENABLED #ifdef WHERETRACE_ENABLED /* 0x4 */
if( sqlite3WhereTrace&0x4 ){ if( sqlite3WhereTrace&0x4 ){
sqlite3DebugPrintf("New %s cost=%-3d,%3d order=%c\n", sqlite3DebugPrintf("New %s cost=%-3d,%3d order=%c\n",
wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, wherePathName(pFrom, iLoop, pWLoop), rCost, nOut,
@ -5355,7 +5394,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
#endif #endif
}else{ }else{
if( pTo->rCost<=rCost && pTo->nRow<=nOut ){ if( pTo->rCost<=rCost && pTo->nRow<=nOut ){
#ifdef WHERETRACE_ENABLED #ifdef WHERETRACE_ENABLED /* 0x4 */
if( sqlite3WhereTrace&0x4 ){ if( sqlite3WhereTrace&0x4 ){
sqlite3DebugPrintf( sqlite3DebugPrintf(
"Skip %s cost=%-3d,%3d order=%c", "Skip %s cost=%-3d,%3d order=%c",
@ -5371,7 +5410,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
} }
testcase( pTo->rCost==rCost+1 ); testcase( pTo->rCost==rCost+1 );
/* A new and better score for a previously created equivalent path */ /* A new and better score for a previously created equivalent path */
#ifdef WHERETRACE_ENABLED #ifdef WHERETRACE_ENABLED /* 0x4 */
if( sqlite3WhereTrace&0x4 ){ if( sqlite3WhereTrace&0x4 ){
sqlite3DebugPrintf( sqlite3DebugPrintf(
"Update %s cost=%-3d,%3d order=%c", "Update %s cost=%-3d,%3d order=%c",
@ -5407,7 +5446,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
} }
} }
#ifdef WHERETRACE_ENABLED #ifdef WHERETRACE_ENABLED /* >=2 */
if( sqlite3WhereTrace>=2 ){ if( sqlite3WhereTrace>=2 ){
sqlite3DebugPrintf("---- after round %d ----\n", iLoop); sqlite3DebugPrintf("---- after round %d ----\n", iLoop);
for(ii=0, pTo=aTo; ii<nTo; ii++, pTo++){ for(ii=0, pTo=aTo; ii<nTo; ii++, pTo++){
@ -5816,12 +5855,29 @@ WhereInfo *sqlite3WhereBegin(
/* Construct the WhereLoop objects */ /* Construct the WhereLoop objects */
WHERETRACE(0xffff,("*** Optimizer Start ***\n")); WHERETRACE(0xffff,("*** Optimizer Start ***\n"));
/* Display all terms of the WHERE clause */
#if defined(WHERETRACE_ENABLED) && defined(SQLITE_ENABLE_TREE_EXPLAIN)
if( sqlite3WhereTrace & 0x100 ){
int i;
Vdbe *v = pParse->pVdbe;
sqlite3ExplainBegin(v);
for(i=0; i<sWLB.pWC->nTerm; i++){
sqlite3ExplainPrintf(v, "#%-2d ", i);
sqlite3ExplainPush(v);
whereExplainTerm(v, &sWLB.pWC->a[i]);
sqlite3ExplainPop(v);
sqlite3ExplainNL(v);
}
sqlite3ExplainFinish(v);
sqlite3DebugPrintf("%s", sqlite3VdbeExplanation(v));
}
#endif
if( nTabList!=1 || whereShortCut(&sWLB)==0 ){ if( nTabList!=1 || whereShortCut(&sWLB)==0 ){
rc = whereLoopAddAll(&sWLB); rc = whereLoopAddAll(&sWLB);
if( rc ) goto whereBeginError; if( rc ) goto whereBeginError;
/* Display all of the WhereLoop objects if wheretrace is enabled */ /* Display all of the WhereLoop objects if wheretrace is enabled */
#ifdef WHERETRACE_ENABLED #ifdef WHERETRACE_ENABLED /* !=0 */
if( sqlite3WhereTrace ){ if( sqlite3WhereTrace ){
WhereLoop *p; WhereLoop *p;
int i; int i;
@ -5829,7 +5885,7 @@ WhereInfo *sqlite3WhereBegin(
"ABCDEFGHIJKLMNOPQRSTUVWYXZ"; "ABCDEFGHIJKLMNOPQRSTUVWYXZ";
for(p=pWInfo->pLoops, i=0; p; p=p->pNextLoop, i++){ for(p=pWInfo->pLoops, i=0; p; p=p->pNextLoop, i++){
p->cId = zLabel[i%sizeof(zLabel)]; p->cId = zLabel[i%sizeof(zLabel)];
whereLoopPrint(p, pTabList); whereLoopPrint(p, sWLB.pWC);
} }
} }
#endif #endif
@ -5847,7 +5903,7 @@ WhereInfo *sqlite3WhereBegin(
if( pParse->nErr || NEVER(db->mallocFailed) ){ if( pParse->nErr || NEVER(db->mallocFailed) ){
goto whereBeginError; goto whereBeginError;
} }
#ifdef WHERETRACE_ENABLED #ifdef WHERETRACE_ENABLED /* !=0 */
if( sqlite3WhereTrace ){ if( sqlite3WhereTrace ){
int ii; int ii;
sqlite3DebugPrintf("---- Solution nRow=%d", pWInfo->nRowOut); sqlite3DebugPrintf("---- Solution nRow=%d", pWInfo->nRowOut);
@ -5870,7 +5926,7 @@ WhereInfo *sqlite3WhereBegin(
} }
sqlite3DebugPrintf("\n"); sqlite3DebugPrintf("\n");
for(ii=0; ii<pWInfo->nLevel; ii++){ for(ii=0; ii<pWInfo->nLevel; ii++){
whereLoopPrint(pWInfo->a[ii].pWLoop, pTabList); whereLoopPrint(pWInfo->a[ii].pWLoop, sWLB.pWC);
} }
} }
#endif #endif

View File

@ -102,6 +102,7 @@ SQLITE_READ sqlite_master name main {}
SQLITE_READ sqlite_master rootpage main {} SQLITE_READ sqlite_master rootpage main {}
SQLITE_READ sqlite_master sql main {} SQLITE_READ sqlite_master sql main {}
SQLITE_READ sqlite_master tbl_name main {} SQLITE_READ sqlite_master tbl_name main {}
SQLITE_READ sqlite_master type main {}
SQLITE_READ sqlite_master ROWID main {} SQLITE_READ sqlite_master ROWID main {}
} }
do_test auth2-2.2 { do_test auth2-2.2 {
@ -122,6 +123,7 @@ SQLITE_READ sqlite_master name main {}
SQLITE_READ sqlite_master rootpage main {} SQLITE_READ sqlite_master rootpage main {}
SQLITE_READ sqlite_master sql main {} SQLITE_READ sqlite_master sql main {}
SQLITE_READ sqlite_master tbl_name main {} SQLITE_READ sqlite_master tbl_name main {}
SQLITE_READ sqlite_master type main {}
SQLITE_READ sqlite_master ROWID main {} SQLITE_READ sqlite_master ROWID main {}
} }
do_test auth2-2.3 { do_test auth2-2.3 {

View File

@ -13,6 +13,7 @@
set testdir [file dirname $argv0] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl
set testprefix temptrigger
ifcapable {!trigger || !shared_cache} { finish_test ; return } ifcapable {!trigger || !shared_cache} { finish_test ; return }
@ -201,4 +202,78 @@ do_test temptrigger-3.4 {
catch { db close } catch { db close }
catch { db2 close } catch { db2 close }
#-------------------------------------------------------------------------
# Test that creating a temp table after a temp trigger on the same name
# has been created is an error.
#
reset_db
do_execsql_test 4.0 {
CREATE TABLE t1(x);
CREATE TEMP TRIGGER tr1 BEFORE INSERT ON t1 BEGIN
SELECT 1,2,3;
END;
}
do_execsql_test 4.1 {
CREATE TEMP TABLE t1(x);
}
#-------------------------------------------------------------------------
# Test that no harm is done if the table a temp trigger is attached to is
# deleted by an external connection.
#
reset_db
do_execsql_test 5.0 {
CREATE TABLE t1(x);
CREATE TEMP TRIGGER tr1 BEFORE INSERT ON t1 BEGIN SELECT 1,2,3; END;
}
do_test 5.1 {
sqlite3 db2 test.db
execsql { DROP TABLE t1 } db2
} {}
do_execsql_test 5.2 {
SELECT * FROM sqlite_master;
SELECT * FROM sqlite_temp_master;
} {
trigger tr1 t1 0
{CREATE TRIGGER tr1 BEFORE INSERT ON t1 BEGIN SELECT 1,2,3; END}
}
db2 close
#-------------------------------------------------------------------------
# Check that if a second connection creates a table in an attached database
# with the same name as a table in the main database that has a temp
# trigger attached to it nothing goes awry.
#
reset_db
forcedelete test.db2
do_execsql_test 6.0 {
CREATE TABLE t1(x);
CREATE TEMP TRIGGER tr1 BEFORE INSERT ON t1 BEGIN
SELECT raise(ABORT, 'error');
END;
ATTACH 'test.db2' AS aux;
}
do_test 6.1 {
sqlite3 db2 test.db2
execsql { CREATE TABLE t1(a, b, c); } db2
} {}
do_execsql_test 6.2 {
SELECT * FROM aux.sqlite_master;
INSERT INTO aux.t1 VALUES(1,2,3);
} {
table t1 t1 2 {CREATE TABLE t1(a, b, c)}
}
do_catchsql_test 6.3 {
INSERT INTO main.t1 VALUES(1);
} {1 error}
db2 close
finish_test finish_test

View File

@ -102,4 +102,183 @@ do_execsql_test transitive1-332 {
ORDER BY w DESC; ORDER BY w DESC;
} {3 4 3 6 1 2 1 3} } {3 4 3 6 1 2 1 3}
# Ticket [c620261b5b5dc] circa 2013-10-28.
# Make sureconstraints are not used with LEFT JOINs.
#
# The next case is from the ticket report. It outputs no rows in 3.8.1
# prior to the bug-fix.
#
do_execsql_test transitive1-400 {
CREATE TABLE t401(a);
CREATE TABLE t402(b);
CREATE TABLE t403(c INTEGER PRIMARY KEY);
INSERT INTO t401 VALUES(1);
INSERT INTO t403 VALUES(1);
SELECT '1-row' FROM t401 LEFT JOIN t402 ON b=a JOIN t403 ON c=a;
} {1-row}
# The following is a script distilled from the XBMC project where the
# bug was originally encountered. The correct answer is a single row
# of output. Before the bug was fixed, zero rows were generated.
#
do_execsql_test transitive1-410 {
CREATE TABLE bookmark ( idBookmark integer primary key, idFile integer, timeInSeconds double, totalTimeInSeconds double, thumbNailImage text, player text, playerState text, type integer);
CREATE TABLE path ( idPath integer primary key, strPath text, strContent text, strScraper text, strHash text, scanRecursive integer, useFolderNames bool, strSettings text, noUpdate bool, exclude bool, dateAdded text);
INSERT INTO "path" VALUES(1,'/tmp/tvshows/','tvshows','metadata.tvdb.com','989B1CE5680A14F5F86123F751169B49',0,0,'<settings><setting id="absolutenumber" value="false" /><setting id="dvdorder" value="false" /><setting id="fanart" value="true" /><setting id="language" value="en" /></settings>',0,0,NULL);
INSERT INTO "path" VALUES(2,'/tmp/tvshows/The.Big.Bang.Theory/','','','85E1DAAB2F5FF6EAE8AEDF1B5C882D1E',NULL,NULL,NULL,NULL,NULL,'2013-10-23 18:58:43');
CREATE TABLE files ( idFile integer primary key, idPath integer, strFilename text, playCount integer, lastPlayed text, dateAdded text);
INSERT INTO "files" VALUES(1,2,'The.Big.Bang.Theory.S01E01.WEB-DL.AAC2.0.H264.mkv',NULL,NULL,'2013-10-23 18:57:36');
CREATE TABLE tvshow ( idShow integer primary key,c00 text,c01 text,c02 text,c03 text,c04 text,c05 text,c06 text,c07 text,c08 text,c09 text,c10 text,c11 text,c12 text,c13 text,c14 text,c15 text,c16 text,c17 text,c18 text,c19 text,c20 text,c21 text,c22 text,c23 text);
INSERT INTO "tvshow" VALUES(1,'The Big Bang Theory','Leonard Hofstadter and Sheldon Cooper are brilliant physicists, the kind of "beautiful minds" that understand how the universe works. But none of that genius helps them interact with people, especially women. All this begins to change when a free-spirited beauty named Penny moves in next door. Sheldon, Leonard''s roommate, is quite content spending his nights playing Klingon Boggle with their socially dysfunctional friends, fellow CalTech scientists Howard Wolowitz and Raj Koothrappali. However, Leonard sees in Penny a whole new universe of possibilities... including love.','','','9.200000','2007-09-24','<thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g13.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g23.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g18.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g17.jpg</thumb><thumb aspect="banner">http://
thetvdb.com/banners/graphical/80379-g6.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g5.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g2.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g11.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g12.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g19.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g3.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g4.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g15.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g22.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g7.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g10.jpg</thumb><thumb
aspect="banner">http://thetvdb.com/banners/graphical/80379-g24.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g8.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g9.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g14.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g16.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/graphical/80379-g21.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/text/80379-4.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/text/80379-2.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/text/80379-3.jpg</thumb><thumb aspect="banner">http://thetvdb.com/banners/text/80379-5.jpg</thumb><thumb aspect="poster" type="season" season="6">http://thetvdb.com/banners/seasons/80379-6-8.jpg</thumb><thumb aspect="poster" type="season" season="0">http://thetvdb.com/banners/seasons/80379-0-4.jpg</thumb><thumb aspect="poster" type="season"
season="1">http://thetvdb.com/banners/seasons/80379-1-12.jpg</thumb><thumb aspect="poster" type="season" season="3">http://thetvdb.com/banners/seasons/80379-3-9.jpg</thumb><thumb aspect="poster" type="season" season="2">http://thetvdb.com/banners/seasons/80379-2-11.jpg</thumb><thumb aspect="poster" type="season" season="5">http://thetvdb.com/banners/seasons/80379-5-9.jpg</thumb><thumb aspect="poster" type="season" season="4">http://thetvdb.com/banners/seasons/80379-4-8.jpg</thumb><thumb aspect="poster" type="season" season="7">http://thetvdb.com/banners/seasons/80379-7-3.jpg</thumb><thumb aspect="poster" type="season" season="3">http://thetvdb.com/banners/seasons/80379-3-4.jpg</thumb><thumb aspect="poster" type="season" season="4">http://thetvdb.com/banners/seasons/80379-4-5.jpg</thumb><thumb aspect="poster" type="season" season="2">http://thetvdb.com/banners/seasons/80379-2-9.jpg</thumb><thumb aspect="poster" type="season" season="0">http://thetvdb.com/banners/seasons/80379-0-2.jpg</thumb><thumb aspect="
poster" type="season" season="6">http://thetvdb.com/banners/seasons/80379-6-6.jpg</thumb><thumb aspect="poster" type="season" season="4">http://thetvdb.com/banners/seasons/80379-4-4.jpg</thumb><thumb aspect="poster" type="season" season="6">http://thetvdb.com/banners/seasons/80379-6-2.jpg</thumb><thumb aspect="poster" type="season" season="1">http://thetvdb.com/banners/seasons/80379-1-9.jpg</thumb><thumb aspect="poster" type="season" season="6">http://thetvdb.com/banners/seasons/80379-6-4.jpg</thumb><thumb aspect="poster" type="season" season="1">http://thetvdb.com/banners/seasons/80379-1.jpg</thumb><thumb aspect="poster" type="season" season="3">http://thetvdb.com/banners/seasons/80379-3.jpg</thumb><thumb aspect="poster" type="season" season="4">http://thetvdb.com/banners/seasons/80379-4-2.jpg</thumb><thumb aspect="poster" type="season" season="5">http://thetvdb.com/banners/seasons/80379-5-7.jpg</thumb><thumb aspect="poster" type="season" season="2">http://thetvdb.com/banners/seasons/80379-2-10.jpg</
thumb><thumb aspect="poster" type="season" season="6">http://thetvdb.com/banners/seasons/80379-6-5.jpg</thumb><thumb aspect="poster" type="season" season="1">http://thetvdb.com/banners/seasons/80379-1-5.jpg</thumb><thumb aspect="poster" type="season" season="5">http://thetvdb.com/banners/seasons/80379-5-4.jpg</thumb><thumb aspect="poster" type="season" season="4">http://thetvdb.com/banners/seasons/80379-4.jpg</thumb><thumb aspect="poster" type="season" season="6">http://thetvdb.com/banners/seasons/80379-6-3.jpg</thumb><thumb aspect="poster" type="season" season="5">http://thetvdb.com/banners/seasons/80379-5.jpg</thumb><thumb aspect="poster" type="season" season="3">http://thetvdb.com/banners/seasons/80379-3-6.jpg</thumb><thumb aspect="poster" type="season" season="2">http://thetvdb.com/banners/seasons/80379-2.jpg</thumb><thumb aspect="poster" type="season" season="7">http://thetvdb.com/banners/seasons/80379-7.jpg</thumb><thumb aspect="poster" type="season" season="1">http://thetvdb.com/banners/seasons/80379-
1-7.jpg</thumb><thumb aspect="poster" type="season" season="5">http://thetvdb.com/banners/seasons/80379-5-2.jpg</thumb><thumb aspect="poster" type="season" season="5">http://thetvdb.com/banners/seasons/80379-5-3.jpg</thumb><thumb aspect="poster" type="season" season="7">http://thetvdb.com/banners/seasons/80379-7-2.jpg</thumb><thumb aspect="poster" type="season" season="1">http://thetvdb.com/banners/seasons/80379-1-2.jpg</thumb><thumb aspect="poster" type="season" season="2">http://thetvdb.com/banners/seasons/80379-2-5.jpg</thumb><thumb aspect="poster" type="season" season="4">http://thetvdb.com/banners/seasons/80379-4-3.jpg</thumb><thumb aspect="poster" type="season" season="5">http://thetvdb.com/banners/seasons/80379-5-5.jpg</thumb><thumb aspect="poster" type="season" season="0">http://thetvdb.com/banners/seasons/80379-0.jpg</thumb><thumb aspect="poster" type="season" season="3">http://thetvdb.com/banners/seasons/80379-3-5.jpg</thumb><thumb aspect="poster" type="season" season="1">http://thetvdb.com/banners/
seasons/80379-1-6.jpg</thumb><thumb aspect="poster" type="season" season="2">http://thetvdb.com/banners/seasons/80379-2-3.jpg</thumb><thumb aspect="poster" type="season" season="2">http://thetvdb.com/banners/seasons/80379-2-8.jpg</thumb><thumb aspect="poster" type="season" season="6">http://thetvdb.com/banners/seasons/80379-6-7.jpg</thumb><thumb aspect="poster" type="season" season="5">http://thetvdb.com/banners/seasons/80379-5-8.jpg</thumb><thumb aspect="poster" type="season" season="4">http://thetvdb.com/banners/seasons/80379-4-7.jpg</thumb><thumb aspect="poster" type="season" season="2">http://thetvdb.com/banners/seasons/80379-2-6.jpg</thumb><thumb aspect="poster" type="season" season="3">http://thetvdb.com/banners/seasons/80379-3-8.jpg</thumb><thumb aspect="poster" type="season" season="1">http://thetvdb.com/banners/seasons/80379-1-11.jpg</thumb><thumb aspect="poster" type="season" season="1">http://thetvdb.com/banners/seasons/80379-1-10.jpg</thumb><thumb aspect="poster" type="season" season="1">http://
thetvdb.com/banners/seasons/80379-1-8.jpg</thumb><thumb aspect="poster" type="season" season="3">http://thetvdb.com/banners/seasons/80379-3-7.jpg</thumb><thumb aspect="poster" type="season" season="2">http://thetvdb.com/banners/seasons/80379-2-4.jpg</thumb><thumb aspect="poster" type="season" season="1">http://thetvdb.com/banners/seasons/80379-1-3.jpg</thumb><thumb aspect="poster" type="season" season="1">http://thetvdb.com/banners/seasons/80379-1-4.jpg</thumb><thumb aspect="poster" type="season" season="3">http://thetvdb.com/banners/seasons/80379-3-3.jpg</thumb><thumb aspect="poster" type="season" season="2">http://thetvdb.com/banners/seasons/80379-2-7.jpg</thumb><thumb aspect="poster" type="season" season="6">http://thetvdb.com/banners/seasons/80379-6.jpg</thumb><thumb aspect="poster" type="season" season="2">http://thetvdb.com/banners/seasons/80379-2-2.jpg</thumb><thumb aspect="poster" type="season" season="5">http://thetvdb.com/banners/seasons/80379-5-6.jpg</thumb><thumb aspect="poster" type="season"
season="3">http://thetvdb.com/banners/seasons/80379-3-2.jpg</thumb><thumb aspect="poster" type="season" season="4">http://thetvdb.com/banners/seasons/80379-4-6.jpg</thumb><thumb aspect="banner" type="season" season="5">http://thetvdb.com/banners/seasonswide/80379-5.jpg</thumb><thumb aspect="banner" type="season" season="3">http://thetvdb.com/banners/seasonswide/80379-3-2.jpg</thumb><thumb aspect="banner" type="season" season="1">http://thetvdb.com/banners/seasonswide/80379-1-2.jpg</thumb><thumb aspect="banner" type="season" season="2">http://thetvdb.com/banners/seasonswide/80379-2-2.jpg</thumb><thumb aspect="banner" type="season" season="4">http://thetvdb.com/banners/seasonswide/80379-4-2.jpg</thumb><thumb aspect="banner" type="season" season="0">http://thetvdb.com/banners/seasonswide/80379-0.jpg</thumb><thumb aspect="banner" type="season" season="0">http://thetvdb.com/banners/seasonswide/80379-0-2.jpg</thumb><thumb aspect="banner" type="season" season="1">http://thetvdb.com/banners/seasonswide/80379-1.jpg</
thumb><thumb aspect="banner" type="season" season="2">http://thetvdb.com/banners/seasonswide/80379-2.jpg</thumb><thumb aspect="banner" type="season" season="4">http://thetvdb.com/banners/seasonswide/80379-4.jpg</thumb><thumb aspect="banner" type="season" season="3">http://thetvdb.com/banners/seasonswide/80379-3.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-22.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-18.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-13.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-10.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-16.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-1.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-9.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-2.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-19.jpg</
thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-8.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-4.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-20.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-23.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-7.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-3.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-12.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-11.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-15.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-21.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-14.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-17.jpg</thumb><thumb aspect="poster">http://thetvdb.com/banners/posters/80379-6.jpg</thumb><thumb
aspect="poster">http://thetvdb.com/banners/posters/80379-5.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-22.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-18.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-13.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-10.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-16.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-1.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-9.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-2.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-19.jpg</thumb><thumb aspect="
poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-8.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-4.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-20.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-23.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-7.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-3.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-12.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-11.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-15.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-21.jpg</
thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-14.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-17.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-6.jpg</thumb><thumb aspect="poster" type="season" season="-1">http://thetvdb.com/banners/posters/80379-5.jpg</thumb>','','Comedy','','<episodeguide><url cache="80379-en.xml">http://thetvdb.com/api/1D62F2F90030C444/series/80379/all/en.zip</url></episodeguide>','<fanart url="http://thetvdb.com/banners/"><thumb dim="1920x1080" colors="|192,185,169|19,20,25|57,70,89|" preview="_cache/fanart/original/80379-2.jpg">fanart/original/80379-2.jpg</thumb><thumb dim="1920x1080" colors="|94,28,16|194,18,38|0,0,8|" preview="_cache/fanart/original/80379-34.jpg">fanart/original/80379-34.jpg</thumb><thumb dim="1280x720" colors="|254,157,210|11,12,7|191,152,111|" preview="_cache/fanart/original/80379-4.jpg">fanart/original/80379-
4.jpg</thumb><thumb dim="1920x1080" colors="" preview="_cache/fanart/original/80379-42.jpg">fanart/original/80379-42.jpg</thumb><thumb dim="1920x1080" colors="|236,187,155|136,136,128|254,254,252|" preview="_cache/fanart/original/80379-37.jpg">fanart/original/80379-37.jpg</thumb><thumb dim="1920x1080" colors="|112,102,152|116,109,116|235,152,146|" preview="_cache/fanart/original/80379-14.jpg">fanart/original/80379-14.jpg</thumb><thumb dim="1920x1080" colors="|150,158,161|174,75,121|150,98,58|" preview="_cache/fanart/original/80379-16.jpg">fanart/original/80379-16.jpg</thumb><thumb dim="1280x720" colors="|224,200,176|11,1,28|164,96,0|" preview="_cache/fanart/original/80379-1.jpg">fanart/original/80379-1.jpg</thumb><thumb dim="1920x1080" colors="" preview="_cache/fanart/original/80379-35.jpg">fanart/original/80379-35.jpg</thumb><thumb dim="1920x1080" colors="" preview="_cache/fanart/original/80379-40.jpg">fanart/original/80379-40.jpg</thumb><thumb dim="1920x1080" colors="|255,255,255|30,19,13|155,112,70|"
preview="_cache/fanart/original/80379-31.jpg">fanart/original/80379-31.jpg</thumb><thumb dim="1920x1080" colors="|241,195,172|84,54,106|254,221,206|" preview="_cache/fanart/original/80379-29.jpg">fanart/original/80379-29.jpg</thumb><thumb dim="1280x720" colors="|197,167,175|219,29,39|244,208,192|" preview="_cache/fanart/original/80379-11.jpg">fanart/original/80379-11.jpg</thumb><thumb dim="1280x720" colors="|195,129,97|244,192,168|219,148,118|" preview="_cache/fanart/original/80379-24.jpg">fanart/original/80379-24.jpg</thumb><thumb dim="1920x1080" colors="|14,10,11|255,255,255|175,167,164|" preview="_cache/fanart/original/80379-30.jpg">fanart/original/80379-30.jpg</thumb><thumb dim="1920x1080" colors="" preview="_cache/fanart/original/80379-19.jpg">fanart/original/80379-19.jpg</thumb><thumb dim="1920x1080" colors="|246,199,69|98,55,38|161,127,82|" preview="_cache/fanart/original/80379-9.jpg">fanart/original/80379-9.jpg</thumb><thumb dim="1280x720" colors="|129,22,14|48,50,39|223,182,64|" preview="_cache/
fanart/original/80379-13.jpg">fanart/original/80379-13.jpg</thumb><thumb dim="1920x1080" colors="" preview="_cache/fanart/original/80379-45.jpg">fanart/original/80379-45.jpg</thumb><thumb dim="1920x1080" colors="" preview="_cache/fanart/original/80379-33.jpg">fanart/original/80379-33.jpg</thumb><thumb dim="1280x720" colors="|103,77,60|224,180,153|129,100,84|" preview="_cache/fanart/original/80379-10.jpg">fanart/original/80379-10.jpg</thumb><thumb dim="1920x1080" colors="" preview="_cache/fanart/original/80379-23.jpg">fanart/original/80379-23.jpg</thumb><thumb dim="1280x720" colors="|219,29,39|0,4,10|88,117,135|" preview="_cache/fanart/original/80379-12.jpg">fanart/original/80379-12.jpg</thumb><thumb dim="1920x1080" colors="|226,209,165|51,18,9|89,54,24|" preview="_cache/fanart/original/80379-5.jpg">fanart/original/80379-5.jpg</thumb><thumb dim="1280x720" colors="" preview="_cache/fanart/original/80379-26.jpg">fanart/original/80379-26.jpg</thumb><thumb dim="1280x720" colors="|249,251,229|126,47,53|251,226,
107|" preview="_cache/fanart/original/80379-27.jpg">fanart/original/80379-27.jpg</thumb><thumb dim="1920x1080" colors="|233,218,65|30,27,46|173,53,18|" preview="_cache/fanart/original/80379-32.jpg">fanart/original/80379-32.jpg</thumb><thumb dim="1280x720" colors="|248,248,248|64,54,78|188,193,196|" preview="_cache/fanart/original/80379-3.jpg">fanart/original/80379-3.jpg</thumb><thumb dim="1280x720" colors="" preview="_cache/fanart/original/80379-25.jpg">fanart/original/80379-25.jpg</thumb><thumb dim="1280x720" colors="|159,150,133|59,39,32|168,147,104|" preview="_cache/fanart/original/80379-7.jpg">fanart/original/80379-7.jpg</thumb><thumb dim="1920x1080" colors="|221,191,157|11,7,6|237,146,102|" preview="_cache/fanart/original/80379-21.jpg">fanart/original/80379-21.jpg</thumb><thumb dim="1280x720" colors="" preview="_cache/fanart/original/80379-28.jpg">fanart/original/80379-28.jpg</thumb><thumb dim="1920x1080" colors="" preview="_cache/fanart/original/80379-36.jpg">fanart/original/80379-36.jpg</thumb><thumb
dim="1920x1080" colors="|253,237,186|33,25,22|245,144,38|" preview="_cache/fanart/original/80379-38.jpg">fanart/original/80379-38.jpg</thumb><thumb dim="1920x1080" colors="|174,111,68|243,115,50|252,226,45|" preview="_cache/fanart/original/80379-20.jpg">fanart/original/80379-20.jpg</thumb><thumb dim="1920x1080" colors="|63,56,123|87,59,47|63,56,123|" preview="_cache/fanart/original/80379-17.jpg">fanart/original/80379-17.jpg</thumb><thumb dim="1920x1080" colors="" preview="_cache/fanart/original/80379-43.jpg">fanart/original/80379-43.jpg</thumb><thumb dim="1280x720" colors="|69,68,161|142,118,142|222,191,137|" preview="_cache/fanart/original/80379-22.jpg">fanart/original/80379-22.jpg</thumb><thumb dim="1280x720" colors="|1,108,206|242,209,192|250,197,163|" preview="_cache/fanart/original/80379-15.jpg">fanart/original/80379-15.jpg</thumb><thumb dim="1280x720" colors="|239,229,237|0,0,0|167,136,115|" preview="_cache/fanart/original/80379-18.jpg">fanart/original/80379-18.jpg</thumb><thumb dim="1280x720" colors=""
preview="_cache/fanart/original/80379-6.jpg">fanart/original/80379-6.jpg</thumb><thumb dim="1280x720" colors="" preview="_cache/fanart/original/80379-8.jpg">fanart/original/80379-8.jpg</thumb><thumb dim="1280x720" colors="" preview="_cache/fanart/original/80379-41.jpg">fanart/original/80379-41.jpg</thumb><thumb dim="1920x1080" colors="" preview="_cache/fanart/original/80379-44.jpg">fanart/original/80379-44.jpg</thumb><thumb dim="1280x720" colors="" preview="_cache/fanart/original/80379-39.jpg">fanart/original/80379-39.jpg</thumb></fanart>','80379','TV-PG','CBS','','/tmp/tvshows/The.Big.Bang.Theory/','1',NULL,NULL,NULL,NULL,NULL,NULL);
CREATE TABLE episode ( idEpisode integer primary key, idFile integer,c00 text,c01 text,c02 text,c03 text,c04 text,c05 text,c06 text,c07 text,c08 text,c09 text,c10 text,c11 text,c12 varchar(24),c13 varchar(24),c14 text,c15 text,c16 text,c17 varchar(24),c18 text,c19 text,c20 text,c21 text,c22 text,c23 text, idShow integer);
INSERT INTO "episode" VALUES(1,1,'Pilot','Brilliant physicist roommates Leonard and Sheldon meet their new neighbor Penny, who begins showing them that as much as they know about science, they know little about actual living.','','7.700000','Chuck Lorre / Bill Prady','2007-09-24','<thumb>http://thetvdb.com/banners/episodes/80379/332484.jpg</thumb>','',NULL,'1800','James Burrows','','1','1','','-1','-1','-1','/tmp/tvshows/The.Big.Bang.Theory/The.Big.Bang.Theory.S01E01.WEB-DL.AAC2.0.H264.mkv','2','332484',NULL,NULL,NULL,1);
CREATE TABLE tvshowlinkpath (idShow integer, idPath integer);
INSERT INTO "tvshowlinkpath" VALUES(1,2);
CREATE TABLE seasons ( idSeason integer primary key, idShow integer, season integer);
INSERT INTO "seasons" VALUES(1,1,-1);
INSERT INTO "seasons" VALUES(2,1,0);
INSERT INTO "seasons" VALUES(3,1,1);
INSERT INTO "seasons" VALUES(4,1,2);
INSERT INTO "seasons" VALUES(5,1,3);
INSERT INTO "seasons" VALUES(6,1,4);
INSERT INTO "seasons" VALUES(7,1,5);
INSERT INTO "seasons" VALUES(8,1,6);
INSERT INTO "seasons" VALUES(9,1,7);
CREATE TABLE art(art_id INTEGER PRIMARY KEY, media_id INTEGER, media_type TEXT, type TEXT, url TEXT);
INSERT INTO "art" VALUES(1,1,'actor','thumb','http://thetvdb.com/banners/actors/73597.jpg');
INSERT INTO "art" VALUES(2,2,'actor','thumb','http://thetvdb.com/banners/actors/73596.jpg');
INSERT INTO "art" VALUES(3,3,'actor','thumb','http://thetvdb.com/banners/actors/73595.jpg');
INSERT INTO "art" VALUES(4,4,'actor','thumb','http://thetvdb.com/banners/actors/73599.jpg');
INSERT INTO "art" VALUES(5,5,'actor','thumb','http://thetvdb.com/banners/actors/73598.jpg');
INSERT INTO "art" VALUES(6,6,'actor','thumb','http://thetvdb.com/banners/actors/283158.jpg');
INSERT INTO "art" VALUES(7,7,'actor','thumb','http://thetvdb.com/banners/actors/283157.jpg');
INSERT INTO "art" VALUES(8,8,'actor','thumb','http://thetvdb.com/banners/actors/91271.jpg');
INSERT INTO "art" VALUES(9,9,'actor','thumb','http://thetvdb.com/banners/actors/294178.jpg');
INSERT INTO "art" VALUES(10,10,'actor','thumb','http://thetvdb.com/banners/actors/283159.jpg');
INSERT INTO "art" VALUES(11,1,'tvshow','banner','http://thetvdb.com/banners/graphical/80379-g13.jpg');
INSERT INTO "art" VALUES(12,1,'tvshow','fanart','http://thetvdb.com/banners/fanart/original/80379-2.jpg');
INSERT INTO "art" VALUES(13,1,'tvshow','poster','http://thetvdb.com/banners/posters/80379-22.jpg');
INSERT INTO "art" VALUES(14,1,'season','poster','http://thetvdb.com/banners/posters/80379-22.jpg');
INSERT INTO "art" VALUES(15,2,'season','banner','http://thetvdb.com/banners/seasonswide/80379-0.jpg');
INSERT INTO "art" VALUES(16,2,'season','poster','http://thetvdb.com/banners/seasons/80379-0-4.jpg');
INSERT INTO "art" VALUES(17,3,'season','banner','http://thetvdb.com/banners/seasonswide/80379-1-2.jpg');
INSERT INTO "art" VALUES(18,3,'season','poster','http://thetvdb.com/banners/seasons/80379-1-12.jpg');
INSERT INTO "art" VALUES(19,4,'season','banner','http://thetvdb.com/banners/seasonswide/80379-2-2.jpg');
INSERT INTO "art" VALUES(20,4,'season','poster','http://thetvdb.com/banners/seasons/80379-2-11.jpg');
INSERT INTO "art" VALUES(21,5,'season','banner','http://thetvdb.com/banners/seasonswide/80379-3-2.jpg');
INSERT INTO "art" VALUES(22,5,'season','poster','http://thetvdb.com/banners/seasons/80379-3-9.jpg');
INSERT INTO "art" VALUES(23,6,'season','banner','http://thetvdb.com/banners/seasonswide/80379-4-2.jpg');
INSERT INTO "art" VALUES(24,6,'season','poster','http://thetvdb.com/banners/seasons/80379-4-8.jpg');
INSERT INTO "art" VALUES(25,7,'season','banner','http://thetvdb.com/banners/seasonswide/80379-5.jpg');
INSERT INTO "art" VALUES(26,7,'season','poster','http://thetvdb.com/banners/seasons/80379-5-9.jpg');
INSERT INTO "art" VALUES(27,8,'season','poster','http://thetvdb.com/banners/seasons/80379-6-8.jpg');
INSERT INTO "art" VALUES(28,9,'season','poster','http://thetvdb.com/banners/seasons/80379-7-3.jpg');
INSERT INTO "art" VALUES(29,1,'episode','thumb','http://thetvdb.com/banners/episodes/80379/332484.jpg');
CREATE INDEX ix_bookmark ON bookmark (idFile, type);
CREATE INDEX ix_path ON path ( strPath );
CREATE INDEX ix_files ON files ( idPath, strFilename );
CREATE UNIQUE INDEX ix_episode_file_1 on episode (idEpisode, idFile);
CREATE UNIQUE INDEX id_episode_file_2 on episode (idFile, idEpisode);
CREATE INDEX ix_episode_season_episode on episode (c12, c13);
CREATE INDEX ix_episode_bookmark on episode (c17);
CREATE INDEX ix_episode_show1 on episode(idEpisode,idShow);
CREATE INDEX ix_episode_show2 on episode(idShow,idEpisode);
CREATE UNIQUE INDEX ix_tvshowlinkpath_1 ON tvshowlinkpath ( idShow, idPath );
CREATE UNIQUE INDEX ix_tvshowlinkpath_2 ON tvshowlinkpath ( idPath, idShow );
CREATE INDEX ixEpisodeBasePath ON episode ( c19 );
CREATE INDEX ixTVShowBasePath on tvshow ( c17 );
CREATE INDEX ix_seasons ON seasons (idShow, season);
CREATE INDEX ix_art ON art(media_id, media_type, type);
CREATE VIEW episodeview
AS
SELECT episode.*,
files.strfilename AS strFileName,
path.strpath AS strPath,
files.playcount AS playCount,
files.lastplayed AS lastPlayed,
files.dateadded AS dateAdded,
tvshow.c00 AS strTitle,
tvshow.c14 AS strStudio,
tvshow.c05 AS premiered,
tvshow.c13 AS mpaa,
tvshow.c16 AS strShowPath,
bookmark.timeinseconds AS resumeTimeInSeconds,
bookmark.totaltimeinseconds AS totalTimeInSeconds,
seasons.idseason AS idSeason
FROM episode
JOIN files
ON files.idfile = episode.idfile
JOIN tvshow
ON tvshow.idshow = episode.idshow
LEFT JOIN seasons
ON seasons.idshow = episode.idshow
AND seasons.season = episode.c12
JOIN path
ON files.idpath = path.idpath
LEFT JOIN bookmark
ON bookmark.idfile = episode.idfile
AND bookmark.type = 1;
CREATE VIEW tvshowview
AS
SELECT tvshow.*,
path.strpath AS strPath,
path.dateadded AS dateAdded,
Max(files.lastplayed) AS lastPlayed,
NULLIF(Count(episode.c12), 0) AS totalCount,
Count(files.playcount) AS watchedcount,
NULLIF(Count(DISTINCT( episode.c12 )), 0) AS totalSeasons
FROM tvshow
LEFT JOIN tvshowlinkpath
ON tvshowlinkpath.idshow = tvshow.idshow
LEFT JOIN path
ON path.idpath = tvshowlinkpath.idpath
LEFT JOIN episode
ON episode.idshow = tvshow.idshow
LEFT JOIN files
ON files.idfile = episode.idfile
GROUP BY tvshow.idshow;
SELECT
episodeview.c12,
path.strPath,
tvshowview.c00,
tvshowview.c01,
tvshowview.c05,
tvshowview.c08,
tvshowview.c14,
tvshowview.c13,
seasons.idSeason,
count(1),
count(files.playCount)
FROM episodeview
JOIN tvshowview ON tvshowview.idShow = episodeview.idShow
JOIN seasons ON (seasons.idShow = tvshowview.idShow
AND seasons.season = episodeview.c12)
JOIN files ON files.idFile = episodeview.idFile
JOIN tvshowlinkpath ON tvshowlinkpath.idShow = tvshowview.idShow
JOIN path ON path.idPath = tvshowlinkpath.idPath
WHERE tvshowview.idShow = 1
GROUP BY episodeview.c12;
} {1 /tmp/tvshows/The.Big.Bang.Theory/ {The Big Bang Theory} {Leonard Hofstadter and Sheldon Cooper are brilliant physicists, the kind of "beautiful minds" that understand how the universe works. But none of that genius helps them interact with people, especially women. All this begins to change when a free-spirited beauty named Penny moves in next door. Sheldon, Leonard's roommate, is quite content spending his nights playing Klingon Boggle with their socially dysfunctional friends, fellow CalTech scientists Howard Wolowitz and Raj Koothrappali. However, Leonard sees in Penny a whole new universe of possibilities... including love.} 2007-09-24 Comedy CBS TV-PG 3 1 0}
finish_test finish_test

View File

@ -14,98 +14,120 @@ set pragma_def {
NAME: full_column_names NAME: full_column_names
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_FullColNames ARG: SQLITE_FullColNames
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: short_column_names NAME: short_column_names
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_ShortColNames ARG: SQLITE_ShortColNames
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: count_changes NAME: count_changes
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_CountRows ARG: SQLITE_CountRows
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: empty_result_callbacks NAME: empty_result_callbacks
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_NullCallback ARG: SQLITE_NullCallback
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: legacy_file_format NAME: legacy_file_format
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_LegacyFileFmt ARG: SQLITE_LegacyFileFmt
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: fullfsync NAME: fullfsync
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_FullFSync ARG: SQLITE_FullFSync
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: checkpoint_fullfsync NAME: checkpoint_fullfsync
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_CkptFullFSync ARG: SQLITE_CkptFullFSync
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: cache_spill NAME: cache_spill
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_CacheSpill ARG: SQLITE_CacheSpill
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: reverse_unordered_selects NAME: reverse_unordered_selects
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_ReverseOrder ARG: SQLITE_ReverseOrder
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: query_only NAME: query_only
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_QueryOnly ARG: SQLITE_QueryOnly
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: automatic_index NAME: automatic_index
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_AutoIndex ARG: SQLITE_AutoIndex
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: !defined(SQLITE_OMIT_AUTOMATIC_INDEX) IF: !defined(SQLITE_OMIT_AUTOMATIC_INDEX)
NAME: sql_trace NAME: sql_trace
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_SqlTrace ARG: SQLITE_SqlTrace
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: defined(SQLITE_DEBUG) IF: defined(SQLITE_DEBUG)
NAME: vdbe_listing NAME: vdbe_listing
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_VdbeListing ARG: SQLITE_VdbeListing
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: defined(SQLITE_DEBUG) IF: defined(SQLITE_DEBUG)
NAME: vdbe_trace NAME: vdbe_trace
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_VdbeTrace ARG: SQLITE_VdbeTrace
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: defined(SQLITE_DEBUG) IF: defined(SQLITE_DEBUG)
NAME: vdbe_addoptrace NAME: vdbe_addoptrace
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_VdbeAddopTrace ARG: SQLITE_VdbeAddopTrace
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: defined(SQLITE_DEBUG) IF: defined(SQLITE_DEBUG)
NAME: vdbe_debug NAME: vdbe_debug
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace ARG: SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: defined(SQLITE_DEBUG) IF: defined(SQLITE_DEBUG)
NAME: ignore_check_constraints NAME: ignore_check_constraints
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_IgnoreChecks ARG: SQLITE_IgnoreChecks
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: !defined(SQLITE_OMIT_CHECK) IF: !defined(SQLITE_OMIT_CHECK)
NAME: writable_schema NAME: writable_schema
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_WriteSchema|SQLITE_RecoveryMode ARG: SQLITE_WriteSchema|SQLITE_RecoveryMode
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: read_uncommitted NAME: read_uncommitted
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_ReadUncommitted ARG: SQLITE_ReadUncommitted
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: recursive_triggers NAME: recursive_triggers
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_RecTriggers ARG: SQLITE_RecTriggers
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
NAME: foreign_keys NAME: foreign_keys
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_ForeignKeys ARG: SQLITE_ForeignKeys
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
NAME: defer_foreign_keys NAME: defer_foreign_keys
TYPE: FLAG TYPE: FLAG
ARG: SQLITE_DeferFKs ARG: SQLITE_DeferFKs
IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS)
IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
NAME: default_cache_size NAME: default_cache_size
@ -267,6 +289,7 @@ set pragma_def {
NAME: soft_heap_limit NAME: soft_heap_limit
} }
fconfigure stdout -translation lf
set name {} set name {}
set type {} set type {}
set if {} set if {}
@ -296,7 +319,7 @@ foreach line [split $pragma_def \n] {
} elseif {$id=="ARG"} { } elseif {$id=="ARG"} {
set arg $val set arg $val
} elseif {$id=="IF"} { } elseif {$id=="IF"} {
set if $val lappend if $val
} elseif {$id=="FLAG"} { } elseif {$id=="FLAG"} {
foreach term [split $val] { foreach term [split $val] {
lappend flags $term lappend flags $term
@ -362,9 +385,17 @@ set spacer [format { %26s } {}]
foreach name $allnames { foreach name $allnames {
foreach {type arg if flag} $allbyname($name) break foreach {type arg if flag} $allbyname($name) break
if {$if!=$current_if} { if {$if!=$current_if} {
if {$current_if!=""} {puts "#endif"} if {$current_if!=""} {
foreach this_if $current_if {
puts "#endif"
}
}
set current_if $if set current_if $if
if {$current_if!=""} {puts "#if $current_if"} if {$current_if!=""} {
foreach this_if $current_if {
puts "#if $this_if"
}
}
} }
set typex [format PragTyp_%-23s $type,] set typex [format PragTyp_%-23s $type,]
if {$flag==""} { if {$flag==""} {
@ -377,7 +408,11 @@ foreach name $allnames {
puts " /* ePragFlag: */ $flagx," puts " /* ePragFlag: */ $flagx,"
puts " /* iArg: */ $arg \175," puts " /* iArg: */ $arg \175,"
} }
if {$current_if!=""} {puts "#endif"} if {$current_if!=""} {
foreach this_if $current_if {
puts "#endif"
}
}
puts "\175;" puts "\175;"
# count the number of pragmas, for information purposes # count the number of pragmas, for information purposes