From b32652601c5ac7e21e3dc5a80b7193ef87462e6b Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 16 Oct 2013 23:58:21 +0000 Subject: [PATCH 01/15] Fix a typo in a requirements mark comment. No changes to code. FossilOrigin-Name: e5a439cfa5c921187e4aa7050832ec2660fba13d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/resolve.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index d8ab59f65e..887a74f52d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Clear\sa\svalgrind\serror\sby\szeroing\sthe\sfirst\s4\sbytes\sof\sthe\stemp-space\sallocation\sused\sby\sthe\sb-tree\smodule. -D 2013-10-16T11:39:07.819 +C Fix\sa\stypo\sin\sa\srequirements\smark\scomment.\s\sNo\schanges\sto\scode. +D 2013-10-16T23:58:21.818 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -216,7 +216,7 @@ F src/pragma.c 64d3d1f8b4ed144ba85c061d00d96d6be8aa2fea F src/prepare.c fa6988589f39af8504a61731614cd4f6ae71554f F src/printf.c da9119eb31a187a4b99f60aa4a225141c0ebb74b F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 -F src/resolve.c 5f15b00644c36a1610b87857abf42db38c07519c +F src/resolve.c 572585a96bf282bb9c3d9e08785ec3cae21dc488 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c 15127b54cc11defb2cddef6914e1f384501a61c4 F src/shell.c 6f11f0e9ded63d48e306f2c6858c521e568a47bb @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 9905cea9d45c90f2241f56dc32a25501476983bc -R 683bd0f00a6a8704ba66c77ac430cbf6 -U dan -Z ba433fbc935328061983e8daeb762108 +P 8651aba1865a8f82d21d3345f33fbd239fd9a042 +R 306f92498230c90834f5567c36b98354 +U drh +Z 76c12e32938c3a81b29bd881a94cbc66 diff --git a/manifest.uuid b/manifest.uuid index 77620da5ff..6c1733b35e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8651aba1865a8f82d21d3345f33fbd239fd9a042 \ No newline at end of file +e5a439cfa5c921187e4aa7050832ec2660fba13d \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index dfe4b84c47..92fbaaf15a 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -709,7 +709,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ }else{ /* EVIDENCE-OF: R-61304-29449 The unlikely(X) function is equivalent to ** 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). */ pExpr->iTable = 62; /* TUNING: Default 2nd arg to unlikely() is 0.0625 */ } From f05fba3afa9d0230b0fe84b10fed812559927359 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Oct 2013 12:57:35 +0000 Subject: [PATCH 02/15] Version 3.8.1 FossilOrigin-Name: c78be6d786c19073b3a6730dfe3fb1be54f5657a --- manifest | 11 +++++++---- manifest.uuid | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/manifest b/manifest index 887a74f52d..36384669c1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\sa\srequirements\smark\scomment.\s\sNo\schanges\sto\scode. -D 2013-10-16T23:58:21.818 +C Version\s3.8.1 +D 2013-10-17T12:57:35.458 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -1126,7 +1126,10 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 8651aba1865a8f82d21d3345f33fbd239fd9a042 +P e5a439cfa5c921187e4aa7050832ec2660fba13d R 306f92498230c90834f5567c36b98354 +T +bgcolor * #d0c0ff +T +sym-release * +T +sym-version-3.8.1 * U drh -Z 76c12e32938c3a81b29bd881a94cbc66 +Z 83ae1adeb4d6f6ab1edc809d597efad3 diff --git a/manifest.uuid b/manifest.uuid index 6c1733b35e..d6d746f4ac 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e5a439cfa5c921187e4aa7050832ec2660fba13d \ No newline at end of file +c78be6d786c19073b3a6730dfe3fb1be54f5657a \ No newline at end of file From 2eebbf699efde003afdd0e87ae330a8873350b7a Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Oct 2013 14:37:26 +0000 Subject: [PATCH 03/15] In the vfslog extension for FILECONTROL records, show the pragma name for SQLITE_FCNTL_PRAGMAs and the requested size for SQLITE_FCNTL_SIZE_HINT. FossilOrigin-Name: f062969548da26850ceeb48d4283f6567f828887 --- ext/misc/vfslog.c | 10 +++++++++- manifest | 15 ++++++--------- manifest.uuid | 2 +- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/ext/misc/vfslog.c b/ext/misc/vfslog.c index 7cc1083303..7b2f99bc51 100644 --- a/ext/misc/vfslog.c +++ b/ext/misc/vfslog.c @@ -514,7 +514,15 @@ static int vlogFileControl(sqlite3_file *pFile, int op, void *pArg){ *(char**)pArg = sqlite3_mprintf("vlog/%z", *(char**)pArg); } tElapse = vlog_time() - tStart; - vlogLogPrint(p->pLog, tStart, tElapse, "FILECONTROL", op, -1, 0, rc); + 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; } diff --git a/manifest b/manifest index 36384669c1..d971ccd89b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.8.1 -D 2013-10-17T12:57:35.458 +C In\sthe\svfslog\sextension\sfor\sFILECONTROL\srecords,\sshow\sthe\spragma\sname\sfor\nSQLITE_FCNTL_PRAGMAs\sand\sthe\srequested\ssize\sfor\sSQLITE_FCNTL_SIZE_HINT. +D 2013-10-18T14:37:26.422 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -116,7 +116,7 @@ F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc F ext/misc/rot13.c 1ac6f95f99b575907b9b09c81a349114cf9be45a F ext/misc/spellfix.c 5e1d547e9a2aed13897fa91bac924333f62fd2d9 F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512 -F ext/misc/vfslog.c 1abb192d8d4bd323adbddec0c024580496b51b7a +F ext/misc/vfslog.c f3288d66e699fee093497d449996c69eef1c0354 F ext/misc/vtshim.c babb0dc2bf116029e3e7c9a618b8a1377045303e F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 @@ -1126,10 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P e5a439cfa5c921187e4aa7050832ec2660fba13d -R 306f92498230c90834f5567c36b98354 -T +bgcolor * #d0c0ff -T +sym-release * -T +sym-version-3.8.1 * +P c78be6d786c19073b3a6730dfe3fb1be54f5657a +R 922e3640e2dff0c501dabe2407303992 U drh -Z 83ae1adeb4d6f6ab1edc809d597efad3 +Z 20507bcad5bb086518e04051643ef0df diff --git a/manifest.uuid b/manifest.uuid index d6d746f4ac..a44be59dfc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c78be6d786c19073b3a6730dfe3fb1be54f5657a \ No newline at end of file +f062969548da26850ceeb48d4283f6567f828887 \ No newline at end of file From 06d6efb66155e41b303d151bebfad9cab9532ccc Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Oct 2013 17:42:35 +0000 Subject: [PATCH 04/15] Further enhance the vfslog extension to record the number of freelist pages and the first freelist page in CHNGCTR-READ and CHNGCTR-WRITE records. FossilOrigin-Name: 08157524ca816a81f3c341097e23982727eaa125 --- ext/misc/vfslog.c | 33 +++++++++++++++++++++++++++------ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/ext/misc/vfslog.c b/ext/misc/vfslog.c index 7b2f99bc51..3e4fed6147 100644 --- a/ext/misc/vfslog.c +++ b/ext/misc/vfslog.c @@ -346,6 +346,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. */ @@ -376,9 +383,16 @@ static int vlogRead( && iOfst+iAmt>=28 ){ unsigned char *x = ((unsigned char*)zBuf)+(24-iOfst); - unsigned iCtr; - iCtr = (x[0]<<24) + (x[1]<<16) + (x[2]<<8) + x[3]; - vlogLogPrint(p->pLog, tStart, 0, "CHNGCTR-READ", iCtr, -1, 0, 0); + unsigned iCtr, nFree = -1; + char *zFree = 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; } @@ -409,9 +423,16 @@ static int vlogWrite( && iOfst+iAmt>=28 ){ unsigned char *x = ((unsigned char*)z)+(24-iOfst); - unsigned iCtr; - iCtr = (x[0]<<24) + (x[1]<<16) + (x[2]<<8) + x[3]; - vlogLogPrint(p->pLog, tStart, 0, "CHNGCTR-WRITE", iCtr, -1, 0, 0); + unsigned iCtr, nFree = -1; + char *zFree = 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; } diff --git a/manifest b/manifest index d971ccd89b..7849a01980 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\svfslog\sextension\sfor\sFILECONTROL\srecords,\sshow\sthe\spragma\sname\sfor\nSQLITE_FCNTL_PRAGMAs\sand\sthe\srequested\ssize\sfor\sSQLITE_FCNTL_SIZE_HINT. -D 2013-10-18T14:37:26.422 +C Further\senhance\sthe\svfslog\sextension\sto\srecord\sthe\snumber\sof\sfreelist\spages\nand\sthe\sfirst\sfreelist\spage\sin\sCHNGCTR-READ\sand\sCHNGCTR-WRITE\srecords. +D 2013-10-18T17:42:35.202 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -116,7 +116,7 @@ F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc F ext/misc/rot13.c 1ac6f95f99b575907b9b09c81a349114cf9be45a F ext/misc/spellfix.c 5e1d547e9a2aed13897fa91bac924333f62fd2d9 F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512 -F ext/misc/vfslog.c f3288d66e699fee093497d449996c69eef1c0354 +F ext/misc/vfslog.c b11228f567ddd251706ece5f1bb7bdc218eec825 F ext/misc/vtshim.c babb0dc2bf116029e3e7c9a618b8a1377045303e F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P c78be6d786c19073b3a6730dfe3fb1be54f5657a -R 922e3640e2dff0c501dabe2407303992 +P f062969548da26850ceeb48d4283f6567f828887 +R 5457e72ad1d4f1c29d635ec2528114d5 U drh -Z 20507bcad5bb086518e04051643ef0df +Z e59d2038662ec722e3001c7ec97e56fb diff --git a/manifest.uuid b/manifest.uuid index a44be59dfc..6b389e75e7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f062969548da26850ceeb48d4283f6567f828887 \ No newline at end of file +08157524ca816a81f3c341097e23982727eaa125 \ No newline at end of file From 8f8b2312394426f18008e05be2c109c5f5aac0b2 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Oct 2013 20:03:43 +0000 Subject: [PATCH 05/15] Add the SQLITE_FCNTL_TRACE file control and generate it for OP_Trace when compiled with SQLITE_USE_FCNTL_TRACE. Update vfslog.c to make use of the new file control. Also update vfslog.c to log UNLOCK events before the fact, rather than afterwards. FossilOrigin-Name: e801f35a96d861a1e5f223655af4c8a6a7e356bc --- ext/misc/vfslog.c | 13 +++++++------ manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/sqlite.h.in | 9 +++++++++ src/vdbe.c | 10 ++++++++++ 5 files changed, 35 insertions(+), 15 deletions(-) diff --git a/ext/misc/vfslog.c b/ext/misc/vfslog.c index 3e4fed6147..4854ca9a4c 100644 --- a/ext/misc/vfslog.c +++ b/ext/misc/vfslog.c @@ -190,7 +190,7 @@ static void vlogLogPrint( const char *zArg3, /* Third argument */ int iRes /* Result */ ){ - char z1[40], z2[40], z3[70]; + char z1[40], z2[40], z3[2000]; if( pLog==0 ) return; if( iArg1>=0 ){ sqlite3_snprintf(sizeof(z1), z1, "%lld", iArg1); @@ -203,7 +203,7 @@ static void vlogLogPrint( z2[0] = 0; } if( zArg3 ){ - sqlite3_snprintf(sizeof(z3), z3, "\"%s\"", zArg3); + sqlite3_snprintf(sizeof(z3), z3, "\"%.*w\"", sizeof(z3)-4, zArg3); }else{ z3[0] = 0; } @@ -498,12 +498,11 @@ static int vlogLock(sqlite3_file *pFile, int eLock){ */ static int vlogUnlock(sqlite3_file *pFile, int eLock){ int rc; - sqlite3_uint64 tStart, tElapse; + sqlite3_uint64 tStart; VLogFile *p = (VLogFile *)pFile; tStart = vlog_time(); + vlogLogPrint(p->pLog, tStart, 0, "UNLOCK", eLock, -1, 0, 0); rc = p->pReal->pMethods->xUnlock(p->pReal, eLock); - tElapse = vlog_time() - tStart; - vlogLogPrint(p->pLog, tStart, tElapse, "UNLOCK", eLock, -1, 0, rc); return rc; } @@ -535,7 +534,9 @@ static int vlogFileControl(sqlite3_file *pFile, int op, void *pArg){ *(char**)pArg = sqlite3_mprintf("vlog/%z", *(char**)pArg); } tElapse = vlog_time() - tStart; - if( op==SQLITE_FCNTL_PRAGMA ){ + 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 ){ diff --git a/manifest b/manifest index 7849a01980..90cad9ccce 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\senhance\sthe\svfslog\sextension\sto\srecord\sthe\snumber\sof\sfreelist\spages\nand\sthe\sfirst\sfreelist\spage\sin\sCHNGCTR-READ\sand\sCHNGCTR-WRITE\srecords. -D 2013-10-18T17:42:35.202 +C Add\sthe\sSQLITE_FCNTL_TRACE\sfile\scontrol\sand\sgenerate\sit\sfor\sOP_Trace\nwhen\scompiled\swith\sSQLITE_USE_FCNTL_TRACE.\s\sUpdate\svfslog.c\sto\smake\nuse\sof\sthe\snew\sfile\scontrol.\s\sAlso\supdate\svfslog.c\sto\slog\sUNLOCK\sevents\nbefore\sthe\sfact,\srather\sthan\safterwards. +D 2013-10-18T20:03:43.147 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -116,7 +116,7 @@ F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc F ext/misc/rot13.c 1ac6f95f99b575907b9b09c81a349114cf9be45a F ext/misc/spellfix.c 5e1d547e9a2aed13897fa91bac924333f62fd2d9 F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512 -F ext/misc/vfslog.c b11228f567ddd251706ece5f1bb7bdc218eec825 +F ext/misc/vfslog.c db244ca9e64d5e036499c81806a5aabf23695b77 F ext/misc/vtshim.c babb0dc2bf116029e3e7c9a618b8a1377045303e F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 @@ -220,7 +220,7 @@ F src/resolve.c 572585a96bf282bb9c3d9e08785ec3cae21dc488 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c 15127b54cc11defb2cddef6914e1f384501a61c4 F src/shell.c 6f11f0e9ded63d48e306f2c6858c521e568a47bb -F src/sqlite.h.in 4c6eb96fded1d56a27cec04b6b6803789eb28f54 +F src/sqlite.h.in 547a44dd4ff4d975e92a645ea2d609e543a83d0f F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqliteInt.h 4dd81a25a919509ce94b1f8f120bbef14458d4b9 @@ -279,7 +279,7 @@ F src/update.c f5182157f5d0d0a97bc5f5e3c9bdba0dfbe08f08 F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c 2fa6c821d28bbdbeec1b2a7b091a281c9ef8f918 F src/vacuum.c f313bc97123a4dd4bfd3f50a00c4d44c08a5b1b7 -F src/vdbe.c 56e648f5ba9a91810caf216857adfed9039cd174 +F src/vdbe.c 3d960c844cee53830f33717b4f5d23d7ee56685f F src/vdbe.h 4f554b5627f26710c4c36d919110a3fc611ca5c4 F src/vdbeInt.h ff57f67aee1ba26a3a47e786533dab155ab6dad6 F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P f062969548da26850ceeb48d4283f6567f828887 -R 5457e72ad1d4f1c29d635ec2528114d5 +P 08157524ca816a81f3c341097e23982727eaa125 +R b5e11ff6727594b43ff93bb892fab8c2 U drh -Z e59d2038662ec722e3001c7ec97e56fb +Z 7548807539fd3c35be5b6a1dc8066c33 diff --git a/manifest.uuid b/manifest.uuid index 6b389e75e7..e832cb0471 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -08157524ca816a81f3c341097e23982727eaa125 \ No newline at end of file +e801f35a96d861a1e5f223655af4c8a6a7e356bc \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 2206704f4e..d9f9feb31b 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -907,6 +907,14 @@ struct sqlite3_io_methods { ** can be queried by passing in a pointer to a negative number. This ** file-control is used internally to implement [PRAGMA mmap_size]. ** +**
  • [[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. +** ** */ #define SQLITE_FCNTL_LOCKSTATE 1 @@ -926,6 +934,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_BUSYHANDLER 15 #define SQLITE_FCNTL_TEMPFILENAME 16 #define SQLITE_FCNTL_MMAP_SIZE 18 +#define SQLITE_FCNTL_TRACE 19 /* ** CAPI3REF: Mutex Handle diff --git a/src/vdbe.c b/src/vdbe.c index c75aadb19c..29adca6326 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -6138,6 +6138,16 @@ case OP_Trace: { db->xTrace(db->pTraceArg, 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; inDb; i++){ + if( ((1<btreeMask)==0 ) continue; + sqlite3_file_control(db, db->aDb[i].zName, SQLITE_FCNTL_TRACE, zTrace); + } + } +#endif /* SQLITE_USE_FCNTL_TRACE */ #ifdef SQLITE_DEBUG if( (db->flags & SQLITE_SqlTrace)!=0 && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 From 197bc20c48f27fa22cc742784e960d84d9fe448e Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 19 Oct 2013 15:07:49 +0000 Subject: [PATCH 06/15] Fix a bug causing an "malformed database schema error" error if a temp table with the same name as an existing table that has at least one temp trigger attached to it is created. FossilOrigin-Name: 56dca4a65c3b14123272fa0cc5c15530c06fda28 --- manifest | 18 +++++------ manifest.uuid | 2 +- src/build.c | 2 +- test/auth2.test | 2 ++ test/temptrigger.test | 75 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 88 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 90cad9ccce..3a2cbdcefc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_FCNTL_TRACE\sfile\scontrol\sand\sgenerate\sit\sfor\sOP_Trace\nwhen\scompiled\swith\sSQLITE_USE_FCNTL_TRACE.\s\sUpdate\svfslog.c\sto\smake\nuse\sof\sthe\snew\sfile\scontrol.\s\sAlso\supdate\svfslog.c\sto\slog\sUNLOCK\sevents\nbefore\sthe\sfact,\srather\sthan\safterwards. -D 2013-10-18T20:03:43.147 +C Fix\sa\sbug\scausing\san\s"malformed\sdatabase\sschema\serror"\serror\sif\sa\stemp\stable\swith\sthe\ssame\sname\sas\san\sexisting\stable\sthat\shas\sat\sleast\sone\stemp\strigger\sattached\sto\sit\sis\screated. +D 2013-10-19T15:07:49.621 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -168,7 +168,7 @@ F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 F src/btree.c 509722ce305471b626d3401c0631a808fd33237b F src/btree.h bfe0e8c5759b4ec77b0d18390064a6ef3cdffaaf F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 -F src/build.c 8ae900bf021a66ac110f5eb2dcf994d24d1c2061 +F src/build.c 6d9a545d726956fdc0c63d7076291fc9e7207484 F src/callback.c f99a8957ba2adf369645fac0db09ad8adcf1caa2 F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c ea4b7f3623a0fcb1146e7f245d7410033e86859c @@ -326,7 +326,7 @@ F test/attach3.test d89ccfe4fe6e2b5e368d480fcdfe4b496c54cf4e F test/attach4.test 53bf502f17647c6d6c5add46dda6bac8b6f4665c F test/attachmalloc.test 3a4bfca9545bfe906a8d2e622de10fbac5b711b0 F test/auth.test 9bea29041871807d9f289ee679d05d3ed103642f -F test/auth2.test a2a371aa6df15f8b0c8109b33d3d7f0f73e4c9aa +F test/auth2.test c3b415b76c033bedb81292118fb7c01f5f10cbcd F test/auth3.test a4755e6a2a2fea547ffe63c874eb569e60a28eb5 F test/autoinc.test bd30d372d00045252f6c2e41b5f41455e1975acf F test/autoindex1.test d4dfe14001dfcb74cfbd7107f45a79fc1ab6183e @@ -827,7 +827,7 @@ F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126 F test/tclsqlite.test 37a61c2da7e3bfe3b8c1a2867199f6b860df5d43 F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 -F test/temptrigger.test 26670ed7a39cf2296a7f0a9e0a1d7bdb7abe936d +F test/temptrigger.test 0a48d94222d50e6e50d72ac103606c4f8e7cbb81 F test/tester.tcl 5e97d1fe08f45fa3cc2320cee437e315c75ce995 F test/thread001.test 9f22fd3525a307ff42a326b6bc7b0465be1745a5 F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 08157524ca816a81f3c341097e23982727eaa125 -R b5e11ff6727594b43ff93bb892fab8c2 -U drh -Z 7548807539fd3c35be5b6a1dc8066c33 +P e801f35a96d861a1e5f223655af4c8a6a7e356bc +R ac49857d368ae5ae24a9a42091be2bd4 +U dan +Z 1c112f168e833ab0ddaf48bcba202dcf diff --git a/manifest.uuid b/manifest.uuid index e832cb0471..38fbe878ac 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e801f35a96d861a1e5f223655af4c8a6a7e356bc \ No newline at end of file +56dca4a65c3b14123272fa0cc5c15530c06fda28 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 6868e60e0f..38bdad859f 100644 --- a/src/build.c +++ b/src/build.c @@ -1714,7 +1714,7 @@ void sqlite3EndTable( /* Reparse everything to update our internal data structures */ sqlite3VdbeAddParseSchemaOp(v, iDb, - sqlite3MPrintf(db, "tbl_name='%q'", p->zName)); + sqlite3MPrintf(db, "tbl_name='%q' AND type!='trigger'", p->zName)); } diff --git a/test/auth2.test b/test/auth2.test index 9343fd6f71..65e0591249 100644 --- a/test/auth2.test +++ b/test/auth2.test @@ -102,6 +102,7 @@ SQLITE_READ sqlite_master name main {} SQLITE_READ sqlite_master rootpage main {} SQLITE_READ sqlite_master sql main {} SQLITE_READ sqlite_master tbl_name main {} +SQLITE_READ sqlite_master type main {} SQLITE_READ sqlite_master ROWID main {} } 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 sql main {} SQLITE_READ sqlite_master tbl_name main {} +SQLITE_READ sqlite_master type main {} SQLITE_READ sqlite_master ROWID main {} } do_test auth2-2.3 { diff --git a/test/temptrigger.test b/test/temptrigger.test index ed1efb9125..d646b672b9 100644 --- a/test/temptrigger.test +++ b/test/temptrigger.test @@ -13,6 +13,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix temptrigger ifcapable {!trigger || !shared_cache} { finish_test ; return } @@ -201,4 +202,78 @@ do_test temptrigger-3.4 { catch { db 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 From 05684271c62efe2aefb39c536b628e260cc0a872 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 19 Oct 2013 16:51:39 +0000 Subject: [PATCH 07/15] Improved header comment with better instructions on the vfslog.c extension. FossilOrigin-Name: 4bd592c8f0e011e203443a6e88008a61d6926df5 --- ext/misc/vfslog.c | 37 ++++++++++++++++++++++++++++++------- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/ext/misc/vfslog.c b/ext/misc/vfslog.c index 4854ca9a4c..b55b06fcf3 100644 --- a/ext/misc/vfslog.c +++ b/ext/misc/vfslog.c @@ -16,14 +16,37 @@ /* ** 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 -** is stored as comma-separated variables. +** most VFS calls to be written into a file on disk. ** -** All calls on sqlite3_file objects are logged. -** Additionally, calls to the xAccess(), xOpen(), and xDelete() -** methods are logged. The other sqlite3_vfs object methods (xDlXXX, -** xRandomness, xSleep, xCurrentTime, xGetLastError and xCurrentTimeInt64) -** are not logged. +** Each database connection creates a separate log file in the same +** directory as the original database and named after the original +** database. A unique suffix is added to avoid name collisions. +** Separate log files are used so that concurrent processes do not +** 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" diff --git a/manifest b/manifest index 3a2cbdcefc..9a49cfa35d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbug\scausing\san\s"malformed\sdatabase\sschema\serror"\serror\sif\sa\stemp\stable\swith\sthe\ssame\sname\sas\san\sexisting\stable\sthat\shas\sat\sleast\sone\stemp\strigger\sattached\sto\sit\sis\screated. -D 2013-10-19T15:07:49.621 +C Improved\sheader\scomment\swith\sbetter\sinstructions\son\sthe\svfslog.c\nextension. +D 2013-10-19T16:51:39.506 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -116,7 +116,7 @@ F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc F ext/misc/rot13.c 1ac6f95f99b575907b9b09c81a349114cf9be45a F ext/misc/spellfix.c 5e1d547e9a2aed13897fa91bac924333f62fd2d9 F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512 -F ext/misc/vfslog.c db244ca9e64d5e036499c81806a5aabf23695b77 +F ext/misc/vfslog.c fe40fab5c077a40477f7e5eba994309ecac6cc95 F ext/misc/vtshim.c babb0dc2bf116029e3e7c9a618b8a1377045303e F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P e801f35a96d861a1e5f223655af4c8a6a7e356bc -R ac49857d368ae5ae24a9a42091be2bd4 -U dan -Z 1c112f168e833ab0ddaf48bcba202dcf +P 56dca4a65c3b14123272fa0cc5c15530c06fda28 +R 1cee309be53ed4b90f763a6791fd81dc +U drh +Z 23f623447e2329bbecfcb9fee8496fa4 diff --git a/manifest.uuid b/manifest.uuid index 38fbe878ac..dd2fc69985 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -56dca4a65c3b14123272fa0cc5c15530c06fda28 \ No newline at end of file +4bd592c8f0e011e203443a6e88008a61d6926df5 \ No newline at end of file From dd197832251aad2c19687e599aec895e5c142556 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 21 Oct 2013 23:17:23 +0000 Subject: [PATCH 08/15] Improve support for the SQLITE_OMIT_FLAG_PRAGMAS compile-time option. FossilOrigin-Name: f1d8c3b07e61c5a8b39675d0d62876ca15e207f3 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/pragma.c | 34 ++++++++++++++++++++++++++++++++++ tool/mkpragmatab.tcl | 43 +++++++++++++++++++++++++++++++++++++++---- 4 files changed, 82 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 9a49cfa35d..5450a8543e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sheader\scomment\swith\sbetter\sinstructions\son\sthe\svfslog.c\nextension. -D 2013-10-19T16:51:39.506 +C Improve\ssupport\sfor\sthe\sSQLITE_OMIT_FLAG_PRAGMAS\scompile-time\soption. +D 2013-10-21T23:17:23.344 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -212,7 +212,7 @@ F src/parse.y a97566d6da75075589a7c716d1bda14b586cf8da F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63 -F src/pragma.c 64d3d1f8b4ed144ba85c061d00d96d6be8aa2fea +F src/pragma.c 6fb3125fff078cd81db0039ac778948df4e8cb6f F src/prepare.c fa6988589f39af8504a61731614cd4f6ae71554f F src/printf.c da9119eb31a187a4b99f60aa4a225141c0ebb74b F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 @@ -1093,7 +1093,7 @@ F tool/logest.c 7ad625cac3d54012b27d468b7af6612f78b9ba75 F tool/mkautoconfamal.sh f8d8dbf7d62f409ebed5134998bf5b51d7266383 F tool/mkkeywordhash.c bb52064aa614e1426445e4b2b9b00eeecd23cc79 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e -F tool/mkpragmatab.tcl 3fc52e00a234750675e8a569d2919ff48558e9eb +F tool/mkpragmatab.tcl 17d40faae6c4b865633bfc5763821402a1cbefc3 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 8bce31074e4cbe631bb7676526a048335f4c9f02 F tool/mksqlite3c.tcl d8dc444d403019167260e5578f5c362741f03696 @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 56dca4a65c3b14123272fa0cc5c15530c06fda28 -R 1cee309be53ed4b90f763a6791fd81dc -U drh -Z 23f623447e2329bbecfcb9fee8496fa4 +P 4bd592c8f0e011e203443a6e88008a61d6926df5 +R 53b76eeb5375ab8ab4a6606d590d0d10 +U mistachkin +Z 54790c9a063cf1ed56ef1eaa1dcf530f diff --git a/manifest.uuid b/manifest.uuid index dd2fc69985..43f51523c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4bd592c8f0e011e203443a6e88008a61d6926df5 \ No newline at end of file +f1d8c3b07e61c5a8b39675d0d62876ca15e207f3 \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index a1f32c36d3..b130ba461d 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -94,11 +94,13 @@ static const struct sPragmaNames { /* ePragFlag: */ PragFlag_NeedSchema, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_AUTOMATIC_INDEX) { /* zName: */ "automatic_index", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_AutoIndex }, +#endif #endif { /* zName: */ "busy_timeout", /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, @@ -110,18 +112,22 @@ static const struct sPragmaNames { /* ePragFlag: */ PragFlag_NeedSchema, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "cache_spill", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_CacheSpill }, +#endif { /* zName: */ "case_sensitive_like", /* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE, /* ePragFlag: */ 0, /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "checkpoint_fullfsync", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_CkptFullFSync }, +#endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) { /* zName: */ "collation_list", /* ePragTyp: */ PragTyp_COLLATION_LIST, @@ -134,10 +140,12 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "count_changes", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_CountRows }, +#endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN { /* zName: */ "data_store_directory", /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, @@ -156,16 +164,20 @@ static const struct sPragmaNames { /* ePragFlag: */ PragFlag_NeedSchema, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) { /* zName: */ "defer_foreign_keys", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_DeferFKs }, #endif +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "empty_result_callbacks", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_NullCallback }, +#endif #if !defined(SQLITE_OMIT_UTF16) { /* zName: */ "encoding", /* ePragTyp: */ PragTyp_ENCODING, @@ -184,18 +196,21 @@ static const struct sPragmaNames { /* ePragFlag: */ PragFlag_NeedSchema, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) { /* zName: */ "foreign_keys", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_ForeignKeys }, #endif +#endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) { /* zName: */ "freelist_count", /* ePragTyp: */ PragTyp_HEADER_VALUE, /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "full_column_names", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, @@ -204,6 +219,7 @@ static const struct sPragmaNames { /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_FullFSync }, +#endif #if defined(SQLITE_HAS_CODEC) { /* zName: */ "hexkey", /* ePragTyp: */ PragTyp_HEXKEY, @@ -214,12 +230,14 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_CHECK) { /* zName: */ "ignore_check_constraints", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_IgnoreChecks }, #endif +#endif #if !defined(SQLITE_OMIT_AUTOVACUUM) { /* zName: */ "incremental_vacuum", /* ePragTyp: */ PragTyp_INCREMENTAL_VACUUM, @@ -258,10 +276,12 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "legacy_file_format", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_LegacyFileFmt }, +#endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE { /* zName: */ "lock_proxy_file", /* ePragTyp: */ PragTyp_LOCK_PROXY_FILE, @@ -302,16 +322,19 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "query_only", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_QueryOnly }, +#endif #if !defined(SQLITE_OMIT_INTEGRITY_CHECK) { /* zName: */ "quick_check", /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, /* ePragFlag: */ PragFlag_NeedSchema, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "read_uncommitted", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, @@ -320,16 +343,19 @@ static const struct sPragmaNames { /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_RecTriggers }, +#endif #if defined(SQLITE_HAS_CODEC) { /* zName: */ "rekey", /* ePragTyp: */ PragTyp_REKEY, /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "reverse_unordered_selects", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_ReverseOrder }, +#endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) { /* zName: */ "schema_version", /* ePragTyp: */ PragTyp_HEADER_VALUE, @@ -342,10 +368,12 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "short_column_names", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_ShortColNames }, +#endif { /* zName: */ "shrink_memory", /* ePragTyp: */ PragTyp_SHRINK_MEMORY, /* ePragFlag: */ 0, @@ -354,12 +382,14 @@ static const struct sPragmaNames { /* ePragTyp: */ PragTyp_SOFT_HEAP_LIMIT, /* ePragFlag: */ 0, /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if defined(SQLITE_DEBUG) { /* zName: */ "sql_trace", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_SqlTrace }, #endif +#endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) { /* zName: */ "stats", /* ePragTyp: */ PragTyp_STATS, @@ -394,6 +424,7 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if defined(SQLITE_DEBUG) { /* zName: */ "vdbe_addoptrace", /* ePragTyp: */ PragTyp_FLAG, @@ -412,6 +443,7 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ SQLITE_VdbeTrace }, #endif +#endif #if !defined(SQLITE_OMIT_WAL) { /* zName: */ "wal_autocheckpoint", /* ePragTyp: */ PragTyp_WAL_AUTOCHECKPOINT, @@ -422,10 +454,12 @@ static const struct sPragmaNames { /* ePragFlag: */ PragFlag_NeedSchema, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "writable_schema", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_WriteSchema|SQLITE_RecoveryMode }, +#endif }; /* Number of pragmas: 56 on by default, 68 total. */ /* End of the automatically generated pragma table. diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index 1ba0bd6be9..f5ca6d8867 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -14,98 +14,120 @@ set pragma_def { NAME: full_column_names TYPE: FLAG ARG: SQLITE_FullColNames + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: short_column_names TYPE: FLAG ARG: SQLITE_ShortColNames + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: count_changes TYPE: FLAG ARG: SQLITE_CountRows + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: empty_result_callbacks TYPE: FLAG ARG: SQLITE_NullCallback + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: legacy_file_format TYPE: FLAG ARG: SQLITE_LegacyFileFmt + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: fullfsync TYPE: FLAG ARG: SQLITE_FullFSync + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: checkpoint_fullfsync TYPE: FLAG ARG: SQLITE_CkptFullFSync + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: cache_spill TYPE: FLAG ARG: SQLITE_CacheSpill + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: reverse_unordered_selects TYPE: FLAG ARG: SQLITE_ReverseOrder + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: query_only TYPE: FLAG ARG: SQLITE_QueryOnly + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: automatic_index TYPE: FLAG ARG: SQLITE_AutoIndex + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: !defined(SQLITE_OMIT_AUTOMATIC_INDEX) NAME: sql_trace TYPE: FLAG ARG: SQLITE_SqlTrace + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: defined(SQLITE_DEBUG) NAME: vdbe_listing TYPE: FLAG ARG: SQLITE_VdbeListing + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: defined(SQLITE_DEBUG) NAME: vdbe_trace TYPE: FLAG ARG: SQLITE_VdbeTrace + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: defined(SQLITE_DEBUG) NAME: vdbe_addoptrace TYPE: FLAG ARG: SQLITE_VdbeAddopTrace + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: defined(SQLITE_DEBUG) NAME: vdbe_debug TYPE: FLAG ARG: SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: defined(SQLITE_DEBUG) NAME: ignore_check_constraints TYPE: FLAG ARG: SQLITE_IgnoreChecks + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: !defined(SQLITE_OMIT_CHECK) NAME: writable_schema TYPE: FLAG ARG: SQLITE_WriteSchema|SQLITE_RecoveryMode + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: read_uncommitted TYPE: FLAG ARG: SQLITE_ReadUncommitted + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: recursive_triggers TYPE: FLAG ARG: SQLITE_RecTriggers + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: foreign_keys TYPE: FLAG ARG: SQLITE_ForeignKeys + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) NAME: defer_foreign_keys TYPE: FLAG ARG: SQLITE_DeferFKs + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) NAME: default_cache_size @@ -267,6 +289,7 @@ set pragma_def { NAME: soft_heap_limit } +fconfigure stdout -translation lf set name {} set type {} set if {} @@ -296,7 +319,7 @@ foreach line [split $pragma_def \n] { } elseif {$id=="ARG"} { set arg $val } elseif {$id=="IF"} { - set if $val + lappend if $val } elseif {$id=="FLAG"} { foreach term [split $val] { lappend flags $term @@ -362,9 +385,17 @@ set spacer [format { %26s } {}] foreach name $allnames { foreach {type arg if flag} $allbyname($name) break if {$if!=$current_if} { - if {$current_if!=""} {puts "#endif"} + if {$current_if!=""} { + foreach this_if $current_if { + puts "#endif" + } + } 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,] if {$flag==""} { @@ -377,7 +408,11 @@ foreach name $allnames { puts " /* ePragFlag: */ $flagx," puts " /* iArg: */ $arg \175," } -if {$current_if!=""} {puts "#endif"} +if {$current_if!=""} { + foreach this_if $current_if { + puts "#endif" + } +} puts "\175;" # count the number of pragmas, for information purposes From 0578248b082d605a86ac67cc7abdbd7d260f0aab Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Oct 2013 15:20:20 +0000 Subject: [PATCH 09/15] Add the ".open" command to the command-line shell. FossilOrigin-Name: 21eccb919441bd111ba414dde3f00862822e2c99 --- manifest | 14 ++++++------- manifest.uuid | 2 +- src/shell.c | 58 ++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 49 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index 5450a8543e..7e56b8018a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\ssupport\sfor\sthe\sSQLITE_OMIT_FLAG_PRAGMAS\scompile-time\soption. -D 2013-10-21T23:17:23.344 +C Add\sthe\s".open"\scommand\sto\sthe\scommand-line\sshell. +D 2013-10-24T15:20:20.917 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -219,7 +219,7 @@ F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 572585a96bf282bb9c3d9e08785ec3cae21dc488 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c 15127b54cc11defb2cddef6914e1f384501a61c4 -F src/shell.c 6f11f0e9ded63d48e306f2c6858c521e568a47bb +F src/shell.c d5eebdc6034014103de2b9d58e1d3f6f7de0fb50 F src/sqlite.h.in 547a44dd4ff4d975e92a645ea2d609e543a83d0f F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 4bd592c8f0e011e203443a6e88008a61d6926df5 -R 53b76eeb5375ab8ab4a6606d590d0d10 -U mistachkin -Z 54790c9a063cf1ed56ef1eaa1dcf530f +P f1d8c3b07e61c5a8b39675d0d62876ca15e207f3 +R 669ddc5b90d3123c7996e141023f003e +U drh +Z eb67a516397c437f69feed70887b8d2e diff --git a/manifest.uuid b/manifest.uuid index 43f51523c1..7867b45ac4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f1d8c3b07e61c5a8b39675d0d62876ca15e207f3 \ No newline at end of file +21eccb919441bd111ba414dde3f00862822e2c99 \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index 41ea56492e..26c38c59ea 100644 --- a/src/shell.c +++ b/src/shell.c @@ -436,6 +436,7 @@ struct callback_data { ** .explain ON */ char outfile[FILENAME_MAX]; /* Filename for *out */ const char *zDbFilename; /* name of the database file */ + char *zFreeOnClose; /* Filename to free when closing */ const char *zVfs; /* Name of VFS to use */ sqlite3_stmt *pStmt; /* Current statement if any. */ FILE *pLog; /* Write log output here */ @@ -1437,6 +1438,7 @@ static char zHelp[] = " tabs Tab-separated values\n" " tcl TCL list elements\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 stdout Send output to the screen\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 ** 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 ){ sqlite3_initialize(); 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) ){ fprintf(stderr,"Error: unable to open database \"%s\": %s\n", p->zDbFilename, sqlite3_errmsg(db)); + if( keepAlive ) return; exit(1); } #ifndef SQLITE_OMIT_LOAD_EXTENSION @@ -1834,7 +1837,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ sqlite3_close(pDest); return 1; } - open_db(p); + open_db(p, 0); pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); if( pBackup==0 ){ 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 ){ struct callback_data data; char *zErrMsg = 0; - open_db(p); + open_db(p, 0); memcpy(&data, p, sizeof(data)); data.showHeader = 1; data.mode = MODE_Column; @@ -1883,7 +1886,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ }else 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 ** which causes immediate foreign key constraints to be violated. ** 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; memset(&sCsv, 0, sizeof(sCsv)); - open_db(p); + open_db(p, 0); nSep = strlen30(p->separator); if( nSep==0 ){ 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 ){ struct callback_data data; char *zErrMsg = 0; - open_db(p); + open_db(p, 0); memcpy(&data, p, sizeof(data)); data.showHeader = 0; data.mode = MODE_List; @@ -2206,7 +2209,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ char *zErrMsg = 0; zFile = azArg[1]; zProc = nArg>=3 ? azArg[2] : 0; - open_db(p); + open_db(p, 0); rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); if( rc!=SQLITE_OK ){ 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]); }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( p->outfile[0]=='|' ){ pclose(p->out); @@ -2355,7 +2378,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ sqlite3_close(pSrc); return 1; } - open_db(p); + open_db(p, 0); pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); if( pBackup==0 ){ 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 ){ struct callback_data data; char *zErrMsg = 0; - open_db(p); + open_db(p, 0); memcpy(&data, p, sizeof(data)); data.showHeader = 0; data.mode = MODE_Semi; @@ -2516,7 +2539,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ int nRow, nAlloc; char *zSql = 0; int ii; - open_db(p); + open_db(p, 0); rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); if( rc ) return rc; zSql = sqlite3_mprintf( @@ -2616,7 +2639,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ int testctrl = -1; int rc = 0; int i, n; - open_db(p); + open_db(p, 0); /* convert testctrl text option to value. allow any unique prefix ** of the option name, or a numerical value. */ @@ -2715,7 +2738,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ }else 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])); }else @@ -2726,7 +2749,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ }else if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){ - open_db(p); + open_db(p, 0); output_file_close(p->traceOut); p->traceOut = output_file_open(azArg[1]); #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) && sqlite3_complete(zSql) ){ p->cnt = 0; - open_db(p); + open_db(p, 0); BEGIN_TIMER; rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg); END_TIMER; @@ -3245,7 +3268,7 @@ int main(int argc, char **argv){ ** to the sqlite command-line tool. */ 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 @@ -3325,7 +3348,7 @@ int main(int argc, char **argv){ rc = do_meta_command(z, &data); if( rc && bail_on_error ) return rc==2 ? 0 : rc; }else{ - open_db(&data); + open_db(&data, 0); rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg); if( zErrMsg!=0 ){ fprintf(stderr,"Error: %s\n", zErrMsg); @@ -3349,7 +3372,7 @@ int main(int argc, char **argv){ rc = do_meta_command(zFirstCmd, &data); if( rc==2 ) rc = 0; }else{ - open_db(&data); + open_db(&data, 0); rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg); if( zErrMsg!=0 ){ fprintf(stderr,"Error: %s\n", zErrMsg); @@ -3396,5 +3419,6 @@ int main(int argc, char **argv){ if( data.db ){ sqlite3_close(data.db); } + sqlite3_free(data.zFreeOnClose); return rc; } From 989578e1394179528362d0530e5119d6e0ebdf3f Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2013 14:34:35 +0000 Subject: [PATCH 10/15] Improved "wheretrace" capabilities: Show the constraint expression if the wheretrace flag has the 0x100 bit set and if compiled with SQLITE_ENABLE_TREE_EXPLAIN. FossilOrigin-Name: 710a18ac7916cb688955505d7d461b461f563155 --- manifest | 12 +++++----- manifest.uuid | 2 +- src/where.c | 63 +++++++++++++++++++++++++++++++++------------------ 3 files changed, 48 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index 7e56b8018a..ca4f6895d2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s".open"\scommand\sto\sthe\scommand-line\sshell. -D 2013-10-24T15:20:20.917 +C Improved\s"wheretrace"\scapabilities:\s\sShow\sthe\sconstraint\sexpression\sif\sthe\nwheretrace\sflag\shas\sthe\s0x100\sbit\sset\sand\sif\scompiled\swith\nSQLITE_ENABLE_TREE_EXPLAIN. +D 2013-10-28T14:34:35.937 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -292,7 +292,7 @@ F src/vtab.c 5a423b042eb1402ef77697d03d6a67378d97bc8d F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74 -F src/where.c dd2d0d69280d6653d8ef8cf3b6b4b848b9058197 +F src/where.c 8eaf13f3047d80841f6f1a38f4dfaf4409528a4b F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P f1d8c3b07e61c5a8b39675d0d62876ca15e207f3 -R 669ddc5b90d3123c7996e141023f003e +P 21eccb919441bd111ba414dde3f00862822e2c99 +R 5260b5cc40060f48c72b8d61c27b1dc0 U drh -Z eb67a516397c437f69feed70887b8d2e +Z d9787b9cfeec57eaa314263c770f7600 diff --git a/manifest.uuid b/manifest.uuid index 7867b45ac4..d7cffd19dd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -21eccb919441bd111ba414dde3f00862822e2c99 \ No newline at end of file +710a18ac7916cb688955505d7d461b461f563155 \ No newline at end of file diff --git a/src/where.c b/src/where.c index d89ce65137..7a12e8dc76 100644 --- a/src/where.c +++ b/src/where.c @@ -2550,7 +2550,7 @@ static int whereRangeScanEst( nOut = nNew; } 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)); return SQLITE_OK; } @@ -2636,7 +2636,7 @@ static int whereEqualScanEst( pBuilder->nRecValid = nEq; 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]; return rc; @@ -2684,7 +2684,7 @@ static int whereInScanEst( if( rc==SQLITE_OK ){ if( nRowEst > p->aiRowEst[0] ) nRowEst = p->aiRowEst[0]; *pnRow = nRowEst; - WHERETRACE(0x100,("IN row estimate: est=%g\n", nRowEst)); + WHERETRACE(0x10,("IN row estimate: est=%g\n", nRowEst)); } assert( pBuilder->nRecValid==nRecValid ); return rc; @@ -3893,9 +3893,9 @@ static Bitmask codeOneLoopStart( /* ** Print a WhereLoop object for debugging purposes */ -static void whereLoopPrint(WhereLoop *p, SrcList *pTabList){ - int nb = 1+(pTabList->nSrc+7)/8; - struct SrcList_item *pItem = pTabList->a + p->iTab; +static void whereLoopPrint(WhereLoop *p, WhereInfo *pWInfo){ + int nb = 1+(pWInfo->pTabList->nSrc+7)/8; + struct SrcList_item *pItem = pWInfo->pTabList->a + p->iTab; Table *pTab = pItem->pTab; sqlite3DebugPrintf("%c%2d.%0*llx.%0*llx", p->cId, p->iTab, nb, p->maskSelf, nb, p->prereq); @@ -3927,6 +3927,25 @@ static void whereLoopPrint(WhereLoop *p, SrcList *pTabList){ } sqlite3DebugPrintf(" f %04x N %d", p->wsFlags, p->nLTerm); 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; inLTerm; i++){ + sqlite3ExplainPrintf(v, " (%d) ", i+1); + sqlite3ExplainPush(v); + sqlite3ExplainExpr(v, p->aLTerm[i]->pExpr); + sqlite3ExplainPop(v); + sqlite3ExplainNL(v); + } + sqlite3DebugPrintf("%s", sqlite3VdbeExplanation(v)); + sqlite3ExplainFinish(v); + } +#endif } #endif @@ -4066,10 +4085,10 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ #endif whereOrInsert(pBuilder->pOrSet, pTemplate->prereq, pTemplate->rRun, pTemplate->nOut); -#if WHERETRACE_ENABLED +#if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n); - whereLoopPrint(pTemplate, pWInfo->pTabList); + whereLoopPrint(pTemplate, pWInfo); } #endif return SQLITE_OK; @@ -4139,14 +4158,14 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ ** with pTemplate[] if p[] exists, or if p==NULL then allocate a new ** WhereLoop and insert it. */ -#if WHERETRACE_ENABLED +#if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ if( p!=0 ){ sqlite3DebugPrintf("ins-del: "); - whereLoopPrint(p, pWInfo->pTabList); + whereLoopPrint(p, pWInfo); } sqlite3DebugPrintf("ins-new: "); - whereLoopPrint(pTemplate, pWInfo->pTabList); + whereLoopPrint(pTemplate, pWInfo); } #endif if( p==0 ){ @@ -4167,10 +4186,10 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ /* Jump here if the insert is a no-op */ whereLoopInsert_noop: -#if WHERETRACE_ENABLED +#if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf("ins-noop: "); - whereLoopPrint(pTemplate, pWInfo->pTabList); + whereLoopPrint(pTemplate, pWInfo); } #endif return SQLITE_OK; @@ -5328,7 +5347,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ } if( jj>=nTo ){ if( nTo>=mxChoice && rCost>=mxCost ){ -#ifdef WHERETRACE_ENABLED +#ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf("Skip %s cost=%-3d,%3d order=%c\n", wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, @@ -5346,7 +5365,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ jj = mxI; } pTo = &aTo[jj]; -#ifdef WHERETRACE_ENABLED +#ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf("New %s cost=%-3d,%3d order=%c\n", wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, @@ -5355,7 +5374,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ #endif }else{ if( pTo->rCost<=rCost && pTo->nRow<=nOut ){ -#ifdef WHERETRACE_ENABLED +#ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf( "Skip %s cost=%-3d,%3d order=%c", @@ -5371,7 +5390,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ } testcase( pTo->rCost==rCost+1 ); /* A new and better score for a previously created equivalent path */ -#ifdef WHERETRACE_ENABLED +#ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf( "Update %s cost=%-3d,%3d order=%c", @@ -5407,7 +5426,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ } } -#ifdef WHERETRACE_ENABLED +#ifdef WHERETRACE_ENABLED /* >=2 */ if( sqlite3WhereTrace>=2 ){ sqlite3DebugPrintf("---- after round %d ----\n", iLoop); for(ii=0, pTo=aTo; iipLoops, i=0; p; p=p->pNextLoop, i++){ p->cId = zLabel[i%sizeof(zLabel)]; - whereLoopPrint(p, pTabList); + whereLoopPrint(p, pWInfo); } } #endif @@ -5847,7 +5866,7 @@ WhereInfo *sqlite3WhereBegin( if( pParse->nErr || NEVER(db->mallocFailed) ){ goto whereBeginError; } -#ifdef WHERETRACE_ENABLED +#ifdef WHERETRACE_ENABLED /* !=0 */ if( sqlite3WhereTrace ){ int ii; sqlite3DebugPrintf("---- Solution nRow=%d", pWInfo->nRowOut); @@ -5870,7 +5889,7 @@ WhereInfo *sqlite3WhereBegin( } sqlite3DebugPrintf("\n"); for(ii=0; iinLevel; ii++){ - whereLoopPrint(pWInfo->a[ii].pWLoop, pTabList); + whereLoopPrint(pWInfo->a[ii].pWLoop, pWInfo); } } #endif From c1ba2e7a529dabe1d7670f9e8c9e03315fe769c3 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2013 19:03:21 +0000 Subject: [PATCH 11/15] Bug fix and enhancements to the improved wheretrace logic that shows the constraint expressions. FossilOrigin-Name: 10f125f5da55eca15e68c74d62ab7d37bbbbfb5f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 30 +++++++++++++++++------------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index ca4f6895d2..cafa1e586a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\s"wheretrace"\scapabilities:\s\sShow\sthe\sconstraint\sexpression\sif\sthe\nwheretrace\sflag\shas\sthe\s0x100\sbit\sset\sand\sif\scompiled\swith\nSQLITE_ENABLE_TREE_EXPLAIN. -D 2013-10-28T14:34:35.937 +C Bug\sfix\sand\senhancements\sto\sthe\simproved\swheretrace\slogic\sthat\sshows\sthe\nconstraint\sexpressions. +D 2013-10-28T19:03:21.821 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -292,7 +292,7 @@ F src/vtab.c 5a423b042eb1402ef77697d03d6a67378d97bc8d F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74 -F src/where.c 8eaf13f3047d80841f6f1a38f4dfaf4409528a4b +F src/where.c 65ff0a3241feaebda8c2996f1d56e13e13bfad11 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 21eccb919441bd111ba414dde3f00862822e2c99 -R 5260b5cc40060f48c72b8d61c27b1dc0 +P 710a18ac7916cb688955505d7d461b461f563155 +R 89498d16fc02d0b55681c504013a5543 U drh -Z d9787b9cfeec57eaa314263c770f7600 +Z a3f286e08ab862275ce77a1e64b61897 diff --git a/manifest.uuid b/manifest.uuid index d7cffd19dd..c55ac6df95 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -710a18ac7916cb688955505d7d461b461f563155 \ No newline at end of file +10f125f5da55eca15e68c74d62ab7d37bbbbfb5f \ No newline at end of file diff --git a/src/where.c b/src/where.c index 7a12e8dc76..3d3989cedc 100644 --- a/src/where.c +++ b/src/where.c @@ -3893,7 +3893,8 @@ static Bitmask codeOneLoopStart( /* ** Print a WhereLoop object for debugging purposes */ -static void whereLoopPrint(WhereLoop *p, WhereInfo *pWInfo){ +static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){ + WhereInfo *pWInfo = pWC->pWInfo; int nb = 1+(pWInfo->pTabList->nSrc+7)/8; struct SrcList_item *pItem = pWInfo->pTabList->a + p->iTab; Table *pTab = pItem->pTab; @@ -3902,9 +3903,8 @@ static void whereLoopPrint(WhereLoop *p, WhereInfo *pWInfo){ sqlite3DebugPrintf(" %12s", pItem->zAlias ? pItem->zAlias : pTab->zName); if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ - if( p->u.btree.pIndex ){ - const char *zName = p->u.btree.pIndex->zName; - if( zName==0 ) zName = "ipk"; + const char *zName; + if( p->u.btree.pIndex && (zName = p->u.btree.pIndex->zName)!=0 ){ if( strncmp(zName, "sqlite_autoindex_", 17)==0 ){ int i = sqlite3Strlen30(zName) - 1; while( zName[i]!='_' ) i--; @@ -3936,14 +3936,18 @@ static void whereLoopPrint(WhereLoop *p, WhereInfo *pWInfo){ Vdbe *v = pWInfo->pParse->pVdbe; sqlite3ExplainBegin(v); for(i=0; inLTerm; i++){ - sqlite3ExplainPrintf(v, " (%d) ", i+1); + WhereTerm *pTerm = p->aLTerm[i]; + sqlite3ExplainPrintf(v, " (%d) #%d ", i+1, (int)(pTerm-pWC->a)); + if( (pTerm->wtFlags & (TERM_ORINFO|TERM_ANDINFO))==0 ){ + sqlite3ExplainPrintf(v, "lhs=%-2d ", pTerm->u.leftColumn); + } sqlite3ExplainPush(v); - sqlite3ExplainExpr(v, p->aLTerm[i]->pExpr); + sqlite3ExplainExpr(v, pTerm->pExpr); sqlite3ExplainPop(v); sqlite3ExplainNL(v); } - sqlite3DebugPrintf("%s", sqlite3VdbeExplanation(v)); sqlite3ExplainFinish(v); + sqlite3DebugPrintf("%s", sqlite3VdbeExplanation(v)); } #endif } @@ -4088,7 +4092,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ #if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n); - whereLoopPrint(pTemplate, pWInfo); + whereLoopPrint(pTemplate, pBuilder->pWC); } #endif return SQLITE_OK; @@ -4162,10 +4166,10 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ if( sqlite3WhereTrace & 0x8 ){ if( p!=0 ){ sqlite3DebugPrintf("ins-del: "); - whereLoopPrint(p, pWInfo); + whereLoopPrint(p, pBuilder->pWC); } sqlite3DebugPrintf("ins-new: "); - whereLoopPrint(pTemplate, pWInfo); + whereLoopPrint(pTemplate, pBuilder->pWC); } #endif if( p==0 ){ @@ -4189,7 +4193,7 @@ whereLoopInsert_noop: #if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf("ins-noop: "); - whereLoopPrint(pTemplate, pWInfo); + whereLoopPrint(pTemplate, pBuilder->pWC); } #endif return SQLITE_OK; @@ -5848,7 +5852,7 @@ WhereInfo *sqlite3WhereBegin( "ABCDEFGHIJKLMNOPQRSTUVWYXZ"; for(p=pWInfo->pLoops, i=0; p; p=p->pNextLoop, i++){ p->cId = zLabel[i%sizeof(zLabel)]; - whereLoopPrint(p, pWInfo); + whereLoopPrint(p, sWLB.pWC); } } #endif @@ -5889,7 +5893,7 @@ WhereInfo *sqlite3WhereBegin( } sqlite3DebugPrintf("\n"); for(ii=0; iinLevel; ii++){ - whereLoopPrint(pWInfo->a[ii].pWLoop, pWInfo); + whereLoopPrint(pWInfo->a[ii].pWLoop, sWLB.pWC); } } #endif From f4e9cb065b2a8e80f2ba1523b8b98a809db00154 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2013 19:59:59 +0000 Subject: [PATCH 12/15] More wheretrace debugging support: Show a listing of all WHERE clause terms (on wheretrace bit 0x100) and include important flags such as TERM_VIRTUAL, WO_EQUIV, and EP_FromJoin. FossilOrigin-Name: 92ccd705411ce3f64720ab5f34c7efc9cb46d5c9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 41 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index cafa1e586a..fa0bef5701 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Bug\sfix\sand\senhancements\sto\sthe\simproved\swheretrace\slogic\sthat\sshows\sthe\nconstraint\sexpressions. -D 2013-10-28T19:03:21.821 +C More\swheretrace\sdebugging\ssupport:\s\sShow\sa\slisting\sof\sall\sWHERE\sclause\nterms\s(on\swheretrace\sbit\s0x100)\sand\sinclude\simportant\sflags\ssuch\sas\nTERM_VIRTUAL,\sWO_EQUIV,\sand\sEP_FromJoin. +D 2013-10-28T19:59:59.733 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -292,7 +292,7 @@ F src/vtab.c 5a423b042eb1402ef77697d03d6a67378d97bc8d F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74 -F src/where.c 65ff0a3241feaebda8c2996f1d56e13e13bfad11 +F src/where.c 0490bd61f1327802e9d892a366b024dd7e39bb60 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 710a18ac7916cb688955505d7d461b461f563155 -R 89498d16fc02d0b55681c504013a5543 +P 10f125f5da55eca15e68c74d62ab7d37bbbbfb5f +R 94f7d01ea5e366fe4a18fa71bac07ffd U drh -Z a3f286e08ab862275ce77a1e64b61897 +Z b420ce79c50b8599b09c4667291607ef diff --git a/manifest.uuid b/manifest.uuid index c55ac6df95..f71188cc81 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -10f125f5da55eca15e68c74d62ab7d37bbbbfb5f \ No newline at end of file +92ccd705411ce3f64720ab5f34c7efc9cb46d5c9 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 3d3989cedc..266dc92f17 100644 --- a/src/where.c +++ b/src/where.c @@ -3889,6 +3889,25 @@ static Bitmask codeOneLoopStart( 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); + if( (pTerm->wtFlags & (TERM_ORINFO|TERM_ANDINFO))==0 ){ + sqlite3ExplainPrintf(v, "lhs=%-2d ", pTerm->u.leftColumn); + } + sqlite3ExplainExpr(v, pTerm->pExpr); +} +#endif /* WHERETRACE_ENABLED && SQLITE_ENABLE_TREE_EXPLAIN */ + + #ifdef WHERETRACE_ENABLED /* ** Print a WhereLoop object for debugging purposes @@ -3938,11 +3957,8 @@ static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){ for(i=0; inLTerm; i++){ WhereTerm *pTerm = p->aLTerm[i]; sqlite3ExplainPrintf(v, " (%d) #%d ", i+1, (int)(pTerm-pWC->a)); - if( (pTerm->wtFlags & (TERM_ORINFO|TERM_ANDINFO))==0 ){ - sqlite3ExplainPrintf(v, "lhs=%-2d ", pTerm->u.leftColumn); - } sqlite3ExplainPush(v); - sqlite3ExplainExpr(v, pTerm->pExpr); + whereExplainTerm(v, pTerm); sqlite3ExplainPop(v); sqlite3ExplainNL(v); } @@ -5839,6 +5855,23 @@ WhereInfo *sqlite3WhereBegin( /* Construct the WhereLoop objects */ 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; inTerm; i++){ + sqlite3ExplainPrintf(v, "#%d ", 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 ){ rc = whereLoopAddAll(&sWLB); if( rc ) goto whereBeginError; From e1a086e412e5db5dc333937811edde999ae12186 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2013 20:15:56 +0000 Subject: [PATCH 13/15] Do not use transitive WHERE-clause constraints on LEFT JOINs. Fix for ticket [c620261b5b5dc]. FossilOrigin-Name: 9aac4e588cbce55c1098321bcd042d5b04036893 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index fa0bef5701..ea3ef5cc9b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C More\swheretrace\sdebugging\ssupport:\s\sShow\sa\slisting\sof\sall\sWHERE\sclause\nterms\s(on\swheretrace\sbit\s0x100)\sand\sinclude\simportant\sflags\ssuch\sas\nTERM_VIRTUAL,\sWO_EQUIV,\sand\sEP_FromJoin. -D 2013-10-28T19:59:59.733 +C Do\snot\suse\stransitive\sWHERE-clause\sconstraints\son\sLEFT\sJOINs.\nFix\sfor\sticket\s[c620261b5b5dc]. +D 2013-10-28T20:15:56.749 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -292,7 +292,7 @@ F src/vtab.c 5a423b042eb1402ef77697d03d6a67378d97bc8d F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74 -F src/where.c 0490bd61f1327802e9d892a366b024dd7e39bb60 +F src/where.c 626e04bea7b0c62d8053f816e84da4ffe265599f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 10f125f5da55eca15e68c74d62ab7d37bbbbfb5f -R 94f7d01ea5e366fe4a18fa71bac07ffd +P 92ccd705411ce3f64720ab5f34c7efc9cb46d5c9 +R ef5741143665f2356ac8fbd9321919ca U drh -Z b420ce79c50b8599b09c4667291607ef +Z da3bdf30486b346ec4f687162cb9e5fe diff --git a/manifest.uuid b/manifest.uuid index f71188cc81..27c8a2d7a9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -92ccd705411ce3f64720ab5f34c7efc9cb46d5c9 \ No newline at end of file +9aac4e588cbce55c1098321bcd042d5b04036893 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 266dc92f17..4868a7a0b0 100644 --- a/src/where.c +++ b/src/where.c @@ -878,7 +878,10 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ iColumn = pScan->aEquiv[pScan->iEquiv-1]; while( (pWC = pScan->pWC)!=0 ){ for(pTerm=pWC->a+k; knTerm; 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 && pScan->nEquivaEquiv) ){ From 70a0222f0763e341c27bea13589d5db176f2df9a Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2013 20:38:52 +0000 Subject: [PATCH 14/15] Add regression tests for ticket [c620261b5b5]. FossilOrigin-Name: 05a35b09b140fed0898afd36bc641e275545a35f --- manifest | 12 +-- manifest.uuid | 2 +- test/transitive1.test | 179 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 186 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index ea3ef5cc9b..c0dd491e83 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\suse\stransitive\sWHERE-clause\sconstraints\son\sLEFT\sJOINs.\nFix\sfor\sticket\s[c620261b5b5dc]. -D 2013-10-28T20:15:56.749 +C Add\sregression\stests\sfor\sticket\s[c620261b5b5]. +D 2013-10-28T20:38:52.030 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -979,7 +979,7 @@ F test/trace2.test e7a988fdd982cdec62f1f1f34b0360e6476d01a0 F test/trans.test 6e1b4c6a42dba31bd65f8fa5e61a2708e08ddde6 F test/trans2.test d5337e61de45e66b1fcbf9db833fa8c82e624b22 F test/trans3.test 373ac5183cc56be69f48ae44090e7f672939f732 -F test/transitive1.test 0ee69546d6fa20e577a4a706d7daa01c7eba9239 +F test/transitive1.test 03f532954f46cdf5608f7766bff0b0c52bf2a7cd F test/trigger1.test dc47573ac79ffe0ee3eecaa517d70d8dacbccd03 F test/trigger2.test 834187beafd1db383af0c659cfa49b0576832816 F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 92ccd705411ce3f64720ab5f34c7efc9cb46d5c9 -R ef5741143665f2356ac8fbd9321919ca +P 9aac4e588cbce55c1098321bcd042d5b04036893 +R 755b6f8582cdf6a61e2dc488ee0ff755 U drh -Z da3bdf30486b346ec4f687162cb9e5fe +Z d41611593bf5e267c6a2f2cb626395da diff --git a/manifest.uuid b/manifest.uuid index 27c8a2d7a9..8c3bceda23 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9aac4e588cbce55c1098321bcd042d5b04036893 \ No newline at end of file +05a35b09b140fed0898afd36bc641e275545a35f \ No newline at end of file diff --git a/test/transitive1.test b/test/transitive1.test index 4cf439bb45..200dc610fa 100644 --- a/test/transitive1.test +++ b/test/transitive1.test @@ -102,4 +102,183 @@ do_execsql_test transitive1-332 { ORDER BY w DESC; } {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,'',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','http://thetvdb.com/banners/graphical/80379-g13.jpghttp://thetvdb.com/banners/graphical/80379-g23.jpghttp://thetvdb.com/banners/graphical/80379-g18.jpghttp://thetvdb.com/banners/graphical/80379-g17.jpghttp:// + thetvdb.com/banners/graphical/80379-g6.jpghttp://thetvdb.com/banners/graphical/80379-g5.jpghttp://thetvdb.com/banners/graphical/80379-g2.jpghttp://thetvdb.com/banners/graphical/80379-g11.jpghttp://thetvdb.com/banners/graphical/80379-g12.jpghttp://thetvdb.com/banners/graphical/80379-g19.jpghttp://thetvdb.com/banners/graphical/80379-g3.jpghttp://thetvdb.com/banners/graphical/80379-g4.jpghttp://thetvdb.com/banners/graphical/80379-g15.jpghttp://thetvdb.com/banners/graphical/80379-g.jpghttp://thetvdb.com/banners/graphical/80379-g22.jpghttp://thetvdb.com/banners/graphical/80379-g7.jpghttp://thetvdb.com/banners/graphical/80379-g10.jpghttp://thetvdb.com/banners/graphical/80379-g24.jpghttp://thetvdb.com/banners/graphical/80379-g8.jpghttp://thetvdb.com/banners/graphical/80379-g9.jpghttp://thetvdb.com/banners/graphical/80379-g14.jpghttp://thetvdb.com/banners/graphical/80379-g16.jpghttp://thetvdb.com/banners/graphical/80379-g21.jpghttp://thetvdb.com/banners/text/80379-4.jpghttp://thetvdb.com/banners/text/80379-2.jpghttp://thetvdb.com/banners/text/80379-3.jpghttp://thetvdb.com/banners/text/80379-5.jpghttp://thetvdb.com/banners/seasons/80379-6-8.jpghttp://thetvdb.com/banners/seasons/80379-0-4.jpghttp://thetvdb.com/banners/seasons/80379-1-12.jpghttp://thetvdb.com/banners/seasons/80379-3-9.jpghttp://thetvdb.com/banners/seasons/80379-2-11.jpghttp://thetvdb.com/banners/seasons/80379-5-9.jpghttp://thetvdb.com/banners/seasons/80379-4-8.jpghttp://thetvdb.com/banners/seasons/80379-7-3.jpghttp://thetvdb.com/banners/seasons/80379-3-4.jpghttp://thetvdb.com/banners/seasons/80379-4-5.jpghttp://thetvdb.com/banners/seasons/80379-2-9.jpghttp://thetvdb.com/banners/seasons/80379-0-2.jpghttp://thetvdb.com/banners/seasons/80379-6-6.jpghttp://thetvdb.com/banners/seasons/80379-4-4.jpghttp://thetvdb.com/banners/seasons/80379-6-2.jpghttp://thetvdb.com/banners/seasons/80379-1-9.jpghttp://thetvdb.com/banners/seasons/80379-6-4.jpghttp://thetvdb.com/banners/seasons/80379-1.jpghttp://thetvdb.com/banners/seasons/80379-3.jpghttp://thetvdb.com/banners/seasons/80379-4-2.jpghttp://thetvdb.com/banners/seasons/80379-5-7.jpghttp://thetvdb.com/banners/seasons/80379-2-10.jpghttp://thetvdb.com/banners/seasons/80379-6-5.jpghttp://thetvdb.com/banners/seasons/80379-1-5.jpghttp://thetvdb.com/banners/seasons/80379-5-4.jpghttp://thetvdb.com/banners/seasons/80379-4.jpghttp://thetvdb.com/banners/seasons/80379-6-3.jpghttp://thetvdb.com/banners/seasons/80379-5.jpghttp://thetvdb.com/banners/seasons/80379-3-6.jpghttp://thetvdb.com/banners/seasons/80379-2.jpghttp://thetvdb.com/banners/seasons/80379-7.jpghttp://thetvdb.com/banners/seasons/80379- + 1-7.jpghttp://thetvdb.com/banners/seasons/80379-5-2.jpghttp://thetvdb.com/banners/seasons/80379-5-3.jpghttp://thetvdb.com/banners/seasons/80379-7-2.jpghttp://thetvdb.com/banners/seasons/80379-1-2.jpghttp://thetvdb.com/banners/seasons/80379-2-5.jpghttp://thetvdb.com/banners/seasons/80379-4-3.jpghttp://thetvdb.com/banners/seasons/80379-5-5.jpghttp://thetvdb.com/banners/seasons/80379-0.jpghttp://thetvdb.com/banners/seasons/80379-3-5.jpghttp://thetvdb.com/banners/ + seasons/80379-1-6.jpghttp://thetvdb.com/banners/seasons/80379-2-3.jpghttp://thetvdb.com/banners/seasons/80379-2-8.jpghttp://thetvdb.com/banners/seasons/80379-6-7.jpghttp://thetvdb.com/banners/seasons/80379-5-8.jpghttp://thetvdb.com/banners/seasons/80379-4-7.jpghttp://thetvdb.com/banners/seasons/80379-2-6.jpghttp://thetvdb.com/banners/seasons/80379-3-8.jpghttp://thetvdb.com/banners/seasons/80379-1-11.jpghttp://thetvdb.com/banners/seasons/80379-1-10.jpghttp:// + thetvdb.com/banners/seasons/80379-1-8.jpghttp://thetvdb.com/banners/seasons/80379-3-7.jpghttp://thetvdb.com/banners/seasons/80379-2-4.jpghttp://thetvdb.com/banners/seasons/80379-1-3.jpghttp://thetvdb.com/banners/seasons/80379-1-4.jpghttp://thetvdb.com/banners/seasons/80379-3-3.jpghttp://thetvdb.com/banners/seasons/80379-2-7.jpghttp://thetvdb.com/banners/seasons/80379-6.jpghttp://thetvdb.com/banners/seasons/80379-2-2.jpghttp://thetvdb.com/banners/seasons/80379-5-6.jpghttp://thetvdb.com/banners/seasons/80379-3-2.jpghttp://thetvdb.com/banners/seasons/80379-4-6.jpghttp://thetvdb.com/banners/seasonswide/80379-5.jpghttp://thetvdb.com/banners/seasonswide/80379-3-2.jpghttp://thetvdb.com/banners/seasonswide/80379-1-2.jpghttp://thetvdb.com/banners/seasonswide/80379-2-2.jpghttp://thetvdb.com/banners/seasonswide/80379-4-2.jpghttp://thetvdb.com/banners/seasonswide/80379-0.jpghttp://thetvdb.com/banners/seasonswide/80379-0-2.jpghttp://thetvdb.com/banners/seasonswide/80379-1.jpghttp://thetvdb.com/banners/seasonswide/80379-2.jpghttp://thetvdb.com/banners/seasonswide/80379-4.jpghttp://thetvdb.com/banners/seasonswide/80379-3.jpghttp://thetvdb.com/banners/posters/80379-22.jpghttp://thetvdb.com/banners/posters/80379-18.jpghttp://thetvdb.com/banners/posters/80379-13.jpghttp://thetvdb.com/banners/posters/80379-10.jpghttp://thetvdb.com/banners/posters/80379-16.jpghttp://thetvdb.com/banners/posters/80379-1.jpghttp://thetvdb.com/banners/posters/80379-9.jpghttp://thetvdb.com/banners/posters/80379-2.jpghttp://thetvdb.com/banners/posters/80379-19.jpghttp://thetvdb.com/banners/posters/80379-8.jpghttp://thetvdb.com/banners/posters/80379-4.jpghttp://thetvdb.com/banners/posters/80379-20.jpghttp://thetvdb.com/banners/posters/80379-23.jpghttp://thetvdb.com/banners/posters/80379-7.jpghttp://thetvdb.com/banners/posters/80379-3.jpghttp://thetvdb.com/banners/posters/80379-12.jpghttp://thetvdb.com/banners/posters/80379-11.jpghttp://thetvdb.com/banners/posters/80379-15.jpghttp://thetvdb.com/banners/posters/80379-21.jpghttp://thetvdb.com/banners/posters/80379-14.jpghttp://thetvdb.com/banners/posters/80379-17.jpghttp://thetvdb.com/banners/posters/80379-6.jpghttp://thetvdb.com/banners/posters/80379-5.jpghttp://thetvdb.com/banners/posters/80379-22.jpghttp://thetvdb.com/banners/posters/80379-18.jpghttp://thetvdb.com/banners/posters/80379-13.jpghttp://thetvdb.com/banners/posters/80379-10.jpghttp://thetvdb.com/banners/posters/80379-16.jpghttp://thetvdb.com/banners/posters/80379-1.jpghttp://thetvdb.com/banners/posters/80379-9.jpghttp://thetvdb.com/banners/posters/80379-2.jpghttp://thetvdb.com/banners/posters/80379-19.jpghttp://thetvdb.com/banners/posters/80379-8.jpghttp://thetvdb.com/banners/posters/80379-4.jpghttp://thetvdb.com/banners/posters/80379-20.jpghttp://thetvdb.com/banners/posters/80379-23.jpghttp://thetvdb.com/banners/posters/80379-7.jpghttp://thetvdb.com/banners/posters/80379-3.jpghttp://thetvdb.com/banners/posters/80379-12.jpghttp://thetvdb.com/banners/posters/80379-11.jpghttp://thetvdb.com/banners/posters/80379-15.jpghttp://thetvdb.com/banners/posters/80379-21.jpghttp://thetvdb.com/banners/posters/80379-14.jpghttp://thetvdb.com/banners/posters/80379-17.jpghttp://thetvdb.com/banners/posters/80379-6.jpghttp://thetvdb.com/banners/posters/80379-5.jpg','','Comedy','','http://thetvdb.com/api/1D62F2F90030C444/series/80379/all/en.zip','fanart/original/80379-2.jpgfanart/original/80379-34.jpgfanart/original/80379- + 4.jpgfanart/original/80379-42.jpgfanart/original/80379-37.jpgfanart/original/80379-14.jpgfanart/original/80379-16.jpgfanart/original/80379-1.jpgfanart/original/80379-35.jpgfanart/original/80379-40.jpgfanart/original/80379-31.jpgfanart/original/80379-29.jpgfanart/original/80379-11.jpgfanart/original/80379-24.jpgfanart/original/80379-30.jpgfanart/original/80379-19.jpgfanart/original/80379-9.jpgfanart/original/80379-13.jpgfanart/original/80379-45.jpgfanart/original/80379-33.jpgfanart/original/80379-10.jpgfanart/original/80379-23.jpgfanart/original/80379-12.jpgfanart/original/80379-5.jpgfanart/original/80379-26.jpgfanart/original/80379-27.jpgfanart/original/80379-32.jpgfanart/original/80379-3.jpgfanart/original/80379-25.jpgfanart/original/80379-7.jpgfanart/original/80379-21.jpgfanart/original/80379-28.jpgfanart/original/80379-36.jpgfanart/original/80379-38.jpgfanart/original/80379-20.jpgfanart/original/80379-17.jpgfanart/original/80379-43.jpgfanart/original/80379-22.jpgfanart/original/80379-15.jpgfanart/original/80379-18.jpgfanart/original/80379-6.jpgfanart/original/80379-8.jpgfanart/original/80379-41.jpgfanart/original/80379-44.jpgfanart/original/80379-39.jpg','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','http://thetvdb.com/banners/episodes/80379/332484.jpg','',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 From 7afc8b0c3f374e5b8f60a15dcc9bf9945f81cb78 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2013 22:33:36 +0000 Subject: [PATCH 15/15] Formatting improvements to the WHERE-clause constraint display in the wheretrace debugging logic. FossilOrigin-Name: 3a9e3ed94bf617f00c48009b1a6d348a8f23a3cf --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 7 ++----- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index c0dd491e83..f66ec4132d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sregression\stests\sfor\sticket\s[c620261b5b5]. -D 2013-10-28T20:38:52.030 +C Formatting\simprovements\sto\sthe\sWHERE-clause\sconstraint\sdisplay\sin\sthe\nwheretrace\sdebugging\slogic. +D 2013-10-28T22:33:36.558 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -292,7 +292,7 @@ F src/vtab.c 5a423b042eb1402ef77697d03d6a67378d97bc8d F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74 -F src/where.c 626e04bea7b0c62d8053f816e84da4ffe265599f +F src/where.c f18400f121fd27385f41cdff7aa8a811feca842e F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 9aac4e588cbce55c1098321bcd042d5b04036893 -R 755b6f8582cdf6a61e2dc488ee0ff755 +P 05a35b09b140fed0898afd36bc641e275545a35f +R ff7bb3f8071649882bf49e664fcf0a45 U drh -Z d41611593bf5e267c6a2f2cb626395da +Z 9d63edd4f24f764673ec22cc76454487 diff --git a/manifest.uuid b/manifest.uuid index 8c3bceda23..9f87ae481e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -05a35b09b140fed0898afd36bc641e275545a35f \ No newline at end of file +3a9e3ed94bf617f00c48009b1a6d348a8f23a3cf \ No newline at end of file diff --git a/src/where.c b/src/where.c index 4868a7a0b0..304732db67 100644 --- a/src/where.c +++ b/src/where.c @@ -3903,9 +3903,6 @@ static void whereExplainTerm(Vdbe *v, WhereTerm *pTerm){ if( pTerm->eOperator & WO_EQUIV ) zType[1] = 'E'; if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) zType[2] = 'L'; sqlite3ExplainPrintf(v, "%s ", zType); - if( (pTerm->wtFlags & (TERM_ORINFO|TERM_ANDINFO))==0 ){ - sqlite3ExplainPrintf(v, "lhs=%-2d ", pTerm->u.leftColumn); - } sqlite3ExplainExpr(v, pTerm->pExpr); } #endif /* WHERETRACE_ENABLED && SQLITE_ENABLE_TREE_EXPLAIN */ @@ -3959,7 +3956,7 @@ static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){ sqlite3ExplainBegin(v); for(i=0; inLTerm; i++){ WhereTerm *pTerm = p->aLTerm[i]; - sqlite3ExplainPrintf(v, " (%d) #%d ", i+1, (int)(pTerm-pWC->a)); + sqlite3ExplainPrintf(v, " (%d) #%-2d ", i+1, (int)(pTerm-pWC->a)); sqlite3ExplainPush(v); whereExplainTerm(v, pTerm); sqlite3ExplainPop(v); @@ -5865,7 +5862,7 @@ WhereInfo *sqlite3WhereBegin( Vdbe *v = pParse->pVdbe; sqlite3ExplainBegin(v); for(i=0; inTerm; i++){ - sqlite3ExplainPrintf(v, "#%d ", i); + sqlite3ExplainPrintf(v, "#%-2d ", i); sqlite3ExplainPush(v); whereExplainTerm(v, &sWLB.pWC->a[i]); sqlite3ExplainPop(v);