From 9e48788e9d80efea00e939c33bf1e241f2e6fdc9 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 19 Aug 2013 14:19:00 +0000 Subject: [PATCH 1/7] Fix a potential reference off the end of an array in the query planner. FossilOrigin-Name: f15591f80212dd6d4ed8e0f14be691cd578d4cdf --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 9af4bbc0dc..243471f31d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fixes\sfor\sharmless\scompiler\swarnings. -D 2013-08-19T11:15:48.054 +C Fix\sa\spotential\sreference\soff\sthe\send\sof\san\sarray\sin\sthe\squery\splanner. +D 2013-08-19T14:19:00.852 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -290,7 +290,7 @@ F src/vtab.c 2e8b489db47e20ae36cd247932dc671c9ded0624 F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 4fa43583d0a84b48f93b1e88f11adf2065be4e73 -F src/where.c 67a823e7816464bc1de998841e87a2a3e4c20a94 +F src/where.c be91b3d1100371d7fa833243dde4b5f899db1b4f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1105,7 +1105,7 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac -P 65a85a156f3c827890e9f1fd22484a2f875c3b6f -R d8f5ca6c104ad88cbb780c1e3e66f865 +P a0d9ca4f07f1dc3a189864f8ed9cdb0b1d791b1a +R 7814fe8b877f36736599d6b4fcf64783 U drh -Z a9ff7ee6c83dbd598cfc582a60fae5a4 +Z 7fdb52a55035dac9e0e9155bec61e50b diff --git a/manifest.uuid b/manifest.uuid index f6e394cf03..ac4c381db5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a0d9ca4f07f1dc3a189864f8ed9cdb0b1d791b1a \ No newline at end of file +f15591f80212dd6d4ed8e0f14be691cd578d4cdf \ No newline at end of file diff --git a/src/where.c b/src/where.c index 92a9d3eb80..ab472e752e 100644 --- a/src/where.c +++ b/src/where.c @@ -4337,7 +4337,9 @@ static int whereLoopAddBtreeIndex( int nIn = 0; if( pTerm->prereqRight & pNew->maskSelf ) continue; #ifdef SQLITE_ENABLE_STAT3 - if( (pTerm->wtFlags & TERM_VNULL)!=0 && pSrc->pTab->aCol[iCol].notNull ){ + if( (pTerm->wtFlags & TERM_VNULL)!=0 + && (iCol<0 || pSrc->pTab->aCol[iCol].notNull) + ){ continue; /* skip IS NOT NULL constraints on a NOT NULL column */ } #endif From 4ccc419b3c0c02d3f082711ca1fe4f1ad02a0ac3 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 19 Aug 2013 14:23:31 +0000 Subject: [PATCH 2/7] Remove unused variables from the command-line shell sources. FossilOrigin-Name: 753a402e90f3c9f675155ea96ee048dbe7a68700 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 243471f31d..0a491282c8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\sreference\soff\sthe\send\sof\san\sarray\sin\sthe\squery\splanner. -D 2013-08-19T14:19:00.852 +C Remove\sunused\svariables\sfrom\sthe\scommand-line\sshell\ssources. +D 2013-08-19T14:23:31.349 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -217,7 +217,7 @@ F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/resolve.c 9d53899cc6e1f4ec0b4632d07e97d57827bf63b9 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c 8b148eb851f384412aea57091659d14b369918ca -F src/shell.c 909f6c4a52c8e0265ce0048e2b3cbadda1bd6051 +F src/shell.c 1c317a4c96d61d8d9fdad9fd1811d9b10b8c7f57 F src/sqlite.h.in bd1451ba1ab681022a53bccc3c39580ba094a3ff F src/sqlite3.rc fea433eb0a59f4c9393c8e6d76a6e2596b1fe0c0 F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc @@ -1105,7 +1105,7 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac -P a0d9ca4f07f1dc3a189864f8ed9cdb0b1d791b1a -R 7814fe8b877f36736599d6b4fcf64783 +P f15591f80212dd6d4ed8e0f14be691cd578d4cdf +R 9c030b59ca6c7b004962232334825609 U drh -Z 7fdb52a55035dac9e0e9155bec61e50b +Z e653d3f7b54e043afda16dc501f1f202 diff --git a/manifest.uuid b/manifest.uuid index ac4c381db5..acd097ed3c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f15591f80212dd6d4ed8e0f14be691cd578d4cdf \ No newline at end of file +753a402e90f3c9f675155ea96ee048dbe7a68700 \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index c811057ae3..64c17ed054 100644 --- a/src/shell.c +++ b/src/shell.c @@ -3188,7 +3188,6 @@ int main(int argc, char **argv){ stdin_is_interactive = 0; }else if( strcmp(z,"-heap")==0 ){ #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5) - int j, c; const char *zSize; sqlite3_int64 szHeap; From 290703091e1d10b1da572bb0ecd6b23d9a3e36ea Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 19 Aug 2013 18:17:03 +0000 Subject: [PATCH 3/7] Add some extra assert() statements to silence a few clang warnings. FossilOrigin-Name: 1c63e9515b5f5cb9169928b108d002dcd18ad4fd --- ext/fts3/fts3_snippet.c | 1 + ext/fts3/fts3_write.c | 4 ++-- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/expr.c | 1 + src/pcache1.c | 1 + test/fts3matchinfo.test | 7 +++++++ 7 files changed, 24 insertions(+), 14 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index d54a7875ea..3e62799bb7 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -504,6 +504,7 @@ static int fts3StringAppend( pStr->z = zNew; pStr->nAlloc = nAlloc; } + assert( pStr->z!=0 && (pStr->nAlloc >= pStr->n+nAppend+1) ); /* Append the data to the string buffer. */ memcpy(&pStr->z[pStr->n], zAppend, nAppend); diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 8464a845b2..7f88e52838 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -1461,7 +1461,7 @@ static int fts3SegReaderNextDocid( /* The following line of code (and the "p++" below the while() loop) is ** normally all that is required to move pointer p to the desired ** position. The exception is if this node is being loaded from disk - ** incrementally and pointer "p" now points to the first byte passed + ** incrementally and pointer "p" now points to the first byte past ** the populated part of pReader->aNode[]. */ while( *p | c ) c = *p++ & 0x80; @@ -2849,7 +2849,7 @@ int sqlite3Fts3SegReaderStep( while( apSegment[0]->pOffsetList ){ int j; /* Number of segments that share a docid */ char *pList; - int nList; + int nList = 0; int nByte; sqlite3_int64 iDocid = apSegment[0]->iDocid; fts3SegReaderNextDocid(p, apSegment[0], &pList, &nList); diff --git a/manifest b/manifest index 0a491282c8..2ed2b2530b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sunused\svariables\sfrom\sthe\scommand-line\sshell\ssources. -D 2013-08-19T14:23:31.349 +C Add\ssome\sextra\sassert()\sstatements\sto\ssilence\sa\sfew\sclang\swarnings. +D 2013-08-19T18:17:03.610 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -87,7 +87,7 @@ F ext/fts3/fts3_hash.c 8dd2d06b66c72c628c2732555a32bc0943114914 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c e319e108661147bcca8dd511cd562f33a1ba81b5 F ext/fts3/fts3_porter.c a465b49fcb8249a755792f87516eff182efa42b3 -F ext/fts3/fts3_snippet.c 5fcfcafff46a2a3a63b8e59fcb51987d01c74695 +F ext/fts3/fts3_snippet.c e8ee8c101dd9cfbc9568d134e869d2bd2f7f6d4d F ext/fts3/fts3_term.c a521f75132f9a495bdca1bdd45949b3191c52763 F ext/fts3/fts3_test.c f9a1a1702db1bfad3e2d0064746eeb808f125489 F ext/fts3/fts3_tokenize_vtab.c 011170fe9eba5ff062f1a31d3188e00267716706 @@ -96,7 +96,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 92391b4b4fb043564c6539ea9b8661e3bcba47b9 F ext/fts3/fts3_unicode2.c 0113d3acf13429e6dc38e0647d1bc71211c31a4d -F ext/fts3/fts3_write.c cd264daa4f92b8eb6d61245333d0e3b147e8fd80 +F ext/fts3/fts3_write.c 24a8e41cb9c768cadc54793ebea9a391c3234c3c F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3view.c 6cfc5b67a5f0e09c0d698f9fd012c784bfaa9197 @@ -172,7 +172,7 @@ F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 4262c227bc91cecc61ae37ed3a40f08069cfa267 F src/date.c 067a81c9942c497aafd2c260e13add8a7d0c7dd4 F src/delete.c 2317c814866d9aa71fea16b3faf4fdd4d6a49b94 -F src/expr.c 0bbb44462a19169189b2709fbbd800950521b5ae +F src/expr.c 42d8235af422661ab80be097bebca485b33e2e14 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 914a6bbd987d857c41ac9d244efa6641f36faadb F src/func.c 5c50c1ea31fd864b0fe921fe1a8d4c55acd609ef @@ -209,7 +209,7 @@ F src/pager.h 66e42d6942a445d4c25651733ab2079dbebc7ca9 F src/parse.y 27c6b4138497d6f8360ba7847da6ed48033f957f F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 -F src/pcache1.c d23d07716de96c7c0c2503ec5051a4384c3fb938 +F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63 F src/pragma.c 1d96ba749253b49bc229c6294f9c2e5ef3dca85c F src/prepare.c fa6988589f39af8504a61731614cd4f6ae71554f F src/printf.c 41c49dac366a3a411190001a8ab495fa8887974e @@ -535,7 +535,7 @@ F test/fts3fault.test cb72dccb0a3b9f730f16c5240f3fcb9303eb1660 F test/fts3fault2.test 3198eef2804deea7cac8403e771d9cbcb752d887 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 -F test/fts3matchinfo.test 3f297e14e3f0d5be8595246f5fcd426625cc5881 +F test/fts3matchinfo.test ff423e73faab8fc6d7adeefedf74dd8e2b0b14e0 F test/fts3near.test 12895557870b0f9af7cc0be81a0171abb2d12f12 F test/fts3prefix.test b36d4f00b128a51e7b386cc013a874246d9d7dc1 F test/fts3prefix2.test e1f0a822ca661dced7f12ce392e14eaf65609dce @@ -1105,7 +1105,7 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac -P f15591f80212dd6d4ed8e0f14be691cd578d4cdf -R 9c030b59ca6c7b004962232334825609 -U drh -Z e653d3f7b54e043afda16dc501f1f202 +P 753a402e90f3c9f675155ea96ee048dbe7a68700 +R 77bd0388559c41534c1c609bdbf880a7 +U dan +Z 75015047bd5c60c371893919a96d2743 diff --git a/manifest.uuid b/manifest.uuid index acd097ed3c..8d6d2208b4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -753a402e90f3c9f675155ea96ee048dbe7a68700 \ No newline at end of file +1c63e9515b5f5cb9169928b108d002dcd18ad4fd \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 5c5297c187..e857193b8b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1279,6 +1279,7 @@ int sqlite3ExprIsInteger(Expr *p, int *pValue){ case TK_UMINUS: { int v; if( sqlite3ExprIsInteger(p->pLeft, &v) ){ + assert( v!=-2147483648 ); *pValue = -v; rc = 1; } diff --git a/src/pcache1.c b/src/pcache1.c index e06f5dae69..df9d877537 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -765,6 +765,7 @@ static sqlite3_pcache_page *pcache1Fetch( if( pCache->nPage>=pCache->nHash && pcache1ResizeHash(pCache) ){ goto fetch_out; } + assert( pCache->nHash>0 && pCache->apHash ); /* Step 4. Try to recycle a page. */ if( pCache->bPurgeable && pGroup->pLruTail && ( diff --git a/test/fts3matchinfo.test b/test/fts3matchinfo.test index 3da3a77427..fd475af2e4 100644 --- a/test/fts3matchinfo.test +++ b/test/fts3matchinfo.test @@ -426,4 +426,11 @@ do_execsql_test 8.3 { {0 3 2 0 3 2 1 4 3} {1 3 2 1 3 2 1 4 3} {2 3 2 2 3 2 2 4 3} } +do_execsql_test 9.1 { + CREATE VIRTUAL TABLE ft2 USING fts4; + INSERT INTO ft2 VALUES('a b c d e'); + INSERT INTO ft2 VALUES('f a b c d'); + SELECT snippet(ft2, '[', ']', '', -1, 1) FROM ft2 WHERE ft2 MATCH 'c'; +} {{[c]} {[c]}} + finish_test From e704713cb825e4254659af5d9d83d70716785e50 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 19 Aug 2013 18:37:18 +0000 Subject: [PATCH 4/7] Fix test script pragma2.test so that it works with ENABLE_MEMORY_MANAGEMENT. FossilOrigin-Name: 6acf728100ff339e4451bcefd3a20fd5c3cfd662 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/pragma2.test | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 2ed2b2530b..32a60b6d51 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssome\sextra\sassert()\sstatements\sto\ssilence\sa\sfew\sclang\swarnings. -D 2013-08-19T18:17:03.610 +C Fix\stest\sscript\spragma2.test\sso\sthat\sit\sworks\swith\sENABLE_MEMORY_MANAGEMENT. +D 2013-08-19T18:37:18.023 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -716,7 +716,7 @@ F test/pcache2.test a83efe2dec0d392f814bfc998def1d1833942025 F test/percentile.test b98fc868d71eb5619d42a1702e9ab91718cbed54 F test/permutations.test 461ef4ea10db02cd421dfe5f988eac3e99b5cd9a F test/pragma.test 5e7de6c32a5d764f09437d2025f07e4917b9e178 -F test/pragma2.test 76e4a54cd4677966e4e75f8a7fe86ccbc250de2a +F test/pragma2.test 224f0381f9411a78ae685cac24c13656a62021b7 F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552 F test/progress.test 552dc1edc37333a8d3098b8c26a2b7f06f5799d7 F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc @@ -1105,7 +1105,7 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac -P 753a402e90f3c9f675155ea96ee048dbe7a68700 -R 77bd0388559c41534c1c609bdbf880a7 +P 1c63e9515b5f5cb9169928b108d002dcd18ad4fd +R 06c493aae68ef34ba60e479e4dd5c45b U dan -Z 75015047bd5c60c371893919a96d2743 +Z 50a963f89c7b22f22aa58ed3692e5f1a diff --git a/manifest.uuid b/manifest.uuid index 8d6d2208b4..093fc855b1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1c63e9515b5f5cb9169928b108d002dcd18ad4fd \ No newline at end of file +6acf728100ff339e4451bcefd3a20fd5c3cfd662 \ No newline at end of file diff --git a/test/pragma2.test b/test/pragma2.test index 4a9fe8d944..85ea962e03 100644 --- a/test/pragma2.test +++ b/test/pragma2.test @@ -154,6 +154,7 @@ do_execsql_test pragma2-4.3 { DETACH aux1; PRAGMA cache_spill=ON; } {} +sqlite3_release_memory do_test pragma2-4.4 { db eval { BEGIN; @@ -184,6 +185,9 @@ do_execsql_test pragma2-4.6 { } {main unlocked temp unknown aux1 reserved} do_execsql_test pragma2-4.7 { COMMIT; +} +sqlite3_release_memory +do_execsql_test pragma2-4.8 { PRAGMA cache_spill=ON; -- Applies to all databases BEGIN; UPDATE t2 SET c=c-1; From 2c18788ffaf277b8d80e05dba906fc4ae80ba588 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 19 Aug 2013 19:29:50 +0000 Subject: [PATCH 5/7] Initialize a variable in fts3_write.c on the grounds that the argument required to show that it does not require initialization with is complicated. Add an assert() to where.c to silence a clang scan-build warning. FossilOrigin-Name: d6c4d48a002a6d7057fccc30064ce0b049678f0c --- ext/fts3/fts3_write.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 1 + 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 7f88e52838..0624cd6e97 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -2848,7 +2848,7 @@ int sqlite3Fts3SegReaderStep( fts3SegReaderSort(apSegment, nMerge, nMerge, xCmp); while( apSegment[0]->pOffsetList ){ int j; /* Number of segments that share a docid */ - char *pList; + char *pList = 0; int nList = 0; int nByte; sqlite3_int64 iDocid = apSegment[0]->iDocid; diff --git a/manifest b/manifest index 32a60b6d51..5d4cc1099d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stest\sscript\spragma2.test\sso\sthat\sit\sworks\swith\sENABLE_MEMORY_MANAGEMENT. -D 2013-08-19T18:37:18.023 +C Initialize\sa\svariable\sin\sfts3_write.c\son\sthe\sgrounds\sthat\sthe\sargument\srequired\sto\sshow\sthat\sit\sdoes\snot\srequire\sinitialization\swith\sis\scomplicated.\sAdd\san\sassert()\sto\swhere.c\sto\ssilence\sa\sclang\sscan-build\swarning. +D 2013-08-19T19:29:50.054 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -96,7 +96,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 92391b4b4fb043564c6539ea9b8661e3bcba47b9 F ext/fts3/fts3_unicode2.c 0113d3acf13429e6dc38e0647d1bc71211c31a4d -F ext/fts3/fts3_write.c 24a8e41cb9c768cadc54793ebea9a391c3234c3c +F ext/fts3/fts3_write.c edf39aea5d45080195f6b38aa5efee3804716dd0 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3view.c 6cfc5b67a5f0e09c0d698f9fd012c784bfaa9197 @@ -290,7 +290,7 @@ F src/vtab.c 2e8b489db47e20ae36cd247932dc671c9ded0624 F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 4fa43583d0a84b48f93b1e88f11adf2065be4e73 -F src/where.c be91b3d1100371d7fa833243dde4b5f899db1b4f +F src/where.c 03a50ecb2f4f02b5492d669a84875947b56b8906 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1105,7 +1105,7 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac -P 1c63e9515b5f5cb9169928b108d002dcd18ad4fd -R 06c493aae68ef34ba60e479e4dd5c45b +P 6acf728100ff339e4451bcefd3a20fd5c3cfd662 +R 04d95b1d185bb312b5df2b1601ef3c41 U dan -Z 50a963f89c7b22f22aa58ed3692e5f1a +Z 961c1b76543606f34c9568d704cceb59 diff --git a/manifest.uuid b/manifest.uuid index 093fc855b1..ae9db452cb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6acf728100ff339e4451bcefd3a20fd5c3cfd662 \ No newline at end of file +d6c4d48a002a6d7057fccc30064ce0b049678f0c \ No newline at end of file diff --git a/src/where.c b/src/where.c index ab472e752e..9de283c4cc 100644 --- a/src/where.c +++ b/src/where.c @@ -4482,6 +4482,7 @@ static Bitmask columnsInIndex(Index *pIdx){ int j; for(j=pIdx->nColumn-1; j>=0; j--){ int x = pIdx->aiColumn[j]; + assert( x>=0 ); testcase( x==BMS-1 ); testcase( x==BMS-2 ); if( x Date: Mon, 19 Aug 2013 20:04:10 +0000 Subject: [PATCH 6/7] Performance improvement in sqlite3BtreeNext() and sqlite3BtreePrevious() for the common case of a valid cursor. FossilOrigin-Name: dc65ad8c4c67b21e3b042b8df6580d02b634a90b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 52 +++++++++++++++++++++++++++++---------------------- 3 files changed, 38 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index 5d4cc1099d..917de0a385 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Initialize\sa\svariable\sin\sfts3_write.c\son\sthe\sgrounds\sthat\sthe\sargument\srequired\sto\sshow\sthat\sit\sdoes\snot\srequire\sinitialization\swith\sis\scomplicated.\sAdd\san\sassert()\sto\swhere.c\sto\ssilence\sa\sclang\sscan-build\swarning. -D 2013-08-19T19:29:50.054 +C Performance\simprovement\sin\ssqlite3BtreeNext()\sand\ssqlite3BtreePrevious()\nfor\sthe\scommon\scase\sof\sa\svalid\scursor. +D 2013-08-19T20:04:10.623 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -163,7 +163,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 43b348822db3e4cef48b2ae5a445fbeb6c73a165 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c 9b985e4f334a1b3df5733e2ac2de1de9bdd41be7 +F src/btree.c 78287b3012fe65fd5e38927d40c01e01a783e016 F src/btree.h bfe0e8c5759b4ec77b0d18390064a6ef3cdffaaf F src/btreeInt.h eecc84f02375b2bb7a44abbcbbe3747dde73edb2 F src/build.c f99a715ff9290996b579d5e1ec8e94239dc9ae5e @@ -1105,7 +1105,7 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac -P 6acf728100ff339e4451bcefd3a20fd5c3cfd662 -R 04d95b1d185bb312b5df2b1601ef3c41 -U dan -Z 961c1b76543606f34c9568d704cceb59 +P d6c4d48a002a6d7057fccc30064ce0b049678f0c +R 5570190c517979d35e3b41a2553566a9 +U drh +Z 8413b4240dd170b2f74e62b701d0cb1c diff --git a/manifest.uuid b/manifest.uuid index ae9db452cb..7c9d48de8c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d6c4d48a002a6d7057fccc30064ce0b049678f0c \ No newline at end of file +dc65ad8c4c67b21e3b042b8df6580d02b634a90b \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index ac0a8cf2c0..bf679cd1f7 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4796,21 +4796,25 @@ int sqlite3BtreeNext(BtCursor *pCur, int *pRes){ MemPage *pPage; assert( cursorHoldsMutex(pCur) ); - rc = restoreCursorPosition(pCur); - if( rc!=SQLITE_OK ){ - return rc; - } assert( pRes!=0 ); - if( CURSOR_INVALID==pCur->eState ){ - *pRes = 1; - return SQLITE_OK; + if( pCur->eState!=CURSOR_VALID ){ + rc = restoreCursorPosition(pCur); + if( rc!=SQLITE_OK ){ + return rc; + } + if( CURSOR_INVALID==pCur->eState ){ + *pRes = 1; + return SQLITE_OK; + } } - if( pCur->skipNext>0 ){ + if( pCur->skipNext ){ + if( pCur->skipNext>0 ){ + pCur->skipNext = 0; + *pRes = 0; + return SQLITE_OK; + } pCur->skipNext = 0; - *pRes = 0; - return SQLITE_OK; } - pCur->skipNext = 0; pPage = pCur->apPage[pCur->iPage]; idx = ++pCur->aiIdx[pCur->iPage]; @@ -4870,21 +4874,25 @@ int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){ MemPage *pPage; assert( cursorHoldsMutex(pCur) ); - rc = restoreCursorPosition(pCur); - if( rc!=SQLITE_OK ){ - return rc; - } pCur->atLast = 0; - if( CURSOR_INVALID==pCur->eState ){ - *pRes = 1; - return SQLITE_OK; + if( pCur->eState!=CURSOR_VALID ){ + if( ALWAYS(pCur->eState>=CURSOR_REQUIRESEEK) ){ + rc = btreeRestoreCursorPosition(pCur); + if( rc!=SQLITE_OK ) return rc; + } + if( CURSOR_INVALID==pCur->eState ){ + *pRes = 1; + return SQLITE_OK; + } } - if( pCur->skipNext<0 ){ + if( pCur->skipNext ){ + if( pCur->skipNext<0 ){ + pCur->skipNext = 0; + *pRes = 0; + return SQLITE_OK; + } pCur->skipNext = 0; - *pRes = 0; - return SQLITE_OK; } - pCur->skipNext = 0; pPage = pCur->apPage[pCur->iPage]; assert( pPage->isInit ); From 9b47ee3f09c4bad491c4b8b6b6a71d89604e54c5 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 20 Aug 2013 03:13:51 +0000 Subject: [PATCH 7/7] Performance optimizations in the VDBE and especially to the OP_Next and related opcodes and in the sqlite3BtreeNext() and sqlite3BtreePrevious() routines. This is a cherrypick of [6f99b54aedeb], [d2efea1682a7], and [d78c5d89de4b]. FossilOrigin-Name: 7f72fc4f47445a2c01910b268335873de9f75059 --- manifest | 23 +++++++++++++---------- manifest.uuid | 2 +- src/btree.c | 48 +++++++++++++++++++++++++++++++++--------------- src/btreeInt.h | 16 +++++++++++----- src/vdbe.c | 34 ++++++++++++++++------------------ src/vdbeInt.h | 9 +++++---- src/vdbeapi.c | 15 ++++++++++++--- 7 files changed, 91 insertions(+), 56 deletions(-) diff --git a/manifest b/manifest index 917de0a385..9ad5c805c7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\simprovement\sin\ssqlite3BtreeNext()\sand\ssqlite3BtreePrevious()\nfor\sthe\scommon\scase\sof\sa\svalid\scursor. -D 2013-08-19T20:04:10.623 +C Performance\soptimizations\sin\sthe\sVDBE\sand\sespecially\sto\sthe\sOP_Next\sand\nrelated\sopcodes\sand\sin\sthe\ssqlite3BtreeNext()\sand\ssqlite3BtreePrevious()\nroutines.\s\sThis\sis\sa\scherrypick\sof\s[6f99b54aedeb],\s[d2efea1682a7],\sand\n[d78c5d89de4b]. +D 2013-08-20T03:13:51.513 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -163,9 +163,9 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c 43b348822db3e4cef48b2ae5a445fbeb6c73a165 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 -F src/btree.c 78287b3012fe65fd5e38927d40c01e01a783e016 +F src/btree.c adea13e65d6c7b969bcd74cea6ae79b2d3c393fa F src/btree.h bfe0e8c5759b4ec77b0d18390064a6ef3cdffaaf -F src/btreeInt.h eecc84f02375b2bb7a44abbcbbe3747dde73edb2 +F src/btreeInt.h 51cf220a9b9223354770883e93a859dc377aa27f F src/build.c f99a715ff9290996b579d5e1ec8e94239dc9ae5e F src/callback.c d7e46f40c3cf53c43550b7da7a1d0479910b62cc F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac @@ -277,10 +277,10 @@ F src/update.c 7f3fe64d8f3b44c44a1eac293f0f85f87c355b7a F src/utf.c 8d819e2e5104a430fc2005f018db14347c95a38f F src/util.c f566b5138099a2df8533b190d0dcc74b7dfbe0c9 F src/vacuum.c d9c5759f4c5a438bb43c2086f72c5d2edabc36c8 -F src/vdbe.c 0fbe7a904a1187dc6c8a2dbe2f594f0ce8d01401 +F src/vdbe.c 938feb53407dee2234849aad0f103ae9b941595e F src/vdbe.h 4f554b5627f26710c4c36d919110a3fc611ca5c4 -F src/vdbeInt.h e9b7c6b165a31a4715c5aa97223d20d265515231 -F src/vdbeapi.c 4d13580bd058b39623e8fcfc233b7df4b8191e8b +F src/vdbeInt.h cbe71b8b36d8b3bba5709cc3f436c7e3b47b7b08 +F src/vdbeapi.c 96b24b946cf21894f63d9393e821baa2f0a80979 F src/vdbeaux.c a6ea36a9dc714e1128a0173249a0532ddcab0489 F src/vdbeblob.c 5dc79627775bd9a9b494dd956e26297946417d69 F src/vdbemem.c 833005f1cbbf447289f1973dba2a0c2228c7b8ab @@ -1105,7 +1105,10 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac -P d6c4d48a002a6d7057fccc30064ce0b049678f0c -R 5570190c517979d35e3b41a2553566a9 +P dc65ad8c4c67b21e3b042b8df6580d02b634a90b +Q +6f99b54aedeb91e46d52f65504d02a9cc61c0062 +Q +d2efea1682a7e708000c1f5d36370aaf1199b3be +Q +d78c5d89de4b840351b026c9db1952fc24e689d0 +R 539c71750e964e780f11bfb1b59ee716 U drh -Z 8413b4240dd170b2f74e62b701d0cb1c +Z feae42d544c0a4532e8cd3cb8461eca6 diff --git a/manifest.uuid b/manifest.uuid index 7c9d48de8c..42e6161093 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dc65ad8c4c67b21e3b042b8df6580d02b634a90b \ No newline at end of file +7f72fc4f47445a2c01910b268335873de9f75059 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index bf679cd1f7..27f9f412fb 100644 --- a/src/btree.c +++ b/src/btree.c @@ -724,6 +724,9 @@ static int btreeRestoreCursorPosition(BtCursor *pCur){ sqlite3_free(pCur->pKey); pCur->pKey = 0; assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID ); + if( pCur->skipNext && pCur->eState==CURSOR_VALID ){ + pCur->eState = CURSOR_SKIPNEXT; + } } return rc; } @@ -749,7 +752,7 @@ int sqlite3BtreeCursorHasMoved(BtCursor *pCur, int *pHasMoved){ *pHasMoved = 1; return rc; } - if( pCur->eState!=CURSOR_VALID || pCur->skipNext!=0 ){ + if( pCur->eState!=CURSOR_VALID || NEVER(pCur->skipNext!=0) ){ *pHasMoved = 1; }else{ *pHasMoved = 0; @@ -4797,23 +4800,27 @@ int sqlite3BtreeNext(BtCursor *pCur, int *pRes){ assert( cursorHoldsMutex(pCur) ); assert( pRes!=0 ); + assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); if( pCur->eState!=CURSOR_VALID ){ rc = restoreCursorPosition(pCur); if( rc!=SQLITE_OK ){ + *pRes = 0; return rc; } if( CURSOR_INVALID==pCur->eState ){ *pRes = 1; return SQLITE_OK; } - } - if( pCur->skipNext ){ - if( pCur->skipNext>0 ){ + if( pCur->skipNext ){ + assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + pCur->eState = CURSOR_VALID; + if( pCur->skipNext>0 ){ + pCur->skipNext = 0; + *pRes = 0; + return SQLITE_OK; + } pCur->skipNext = 0; - *pRes = 0; - return SQLITE_OK; } - pCur->skipNext = 0; } pPage = pCur->apPage[pCur->iPage]; @@ -4832,7 +4839,10 @@ int sqlite3BtreeNext(BtCursor *pCur, int *pRes){ if( idx>=pPage->nCell ){ if( !pPage->leaf ){ rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); - if( rc ) return rc; + if( rc ){ + *pRes = 0; + return rc; + } rc = moveToLeftmost(pCur); *pRes = 0; return rc; @@ -4874,24 +4884,31 @@ int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){ MemPage *pPage; assert( cursorHoldsMutex(pCur) ); + assert( pRes!=0 ); + assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); pCur->atLast = 0; if( pCur->eState!=CURSOR_VALID ){ if( ALWAYS(pCur->eState>=CURSOR_REQUIRESEEK) ){ rc = btreeRestoreCursorPosition(pCur); - if( rc!=SQLITE_OK ) return rc; + if( rc!=SQLITE_OK ){ + *pRes = 0; + return rc; + } } if( CURSOR_INVALID==pCur->eState ){ *pRes = 1; return SQLITE_OK; } - } - if( pCur->skipNext ){ - if( pCur->skipNext<0 ){ + if( pCur->skipNext ){ + assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + pCur->eState = CURSOR_VALID; + if( pCur->skipNext<0 ){ + pCur->skipNext = 0; + *pRes = 0; + return SQLITE_OK; + } pCur->skipNext = 0; - *pRes = 0; - return SQLITE_OK; } - pCur->skipNext = 0; } pPage = pCur->apPage[pCur->iPage]; @@ -4900,6 +4917,7 @@ int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){ int idx = pCur->aiIdx[pCur->iPage]; rc = moveToChild(pCur, get4byte(findCell(pPage, idx))); if( rc ){ + *pRes = 0; return rc; } rc = moveToRightmost(pCur); diff --git a/src/btreeInt.h b/src/btreeInt.h index ce3c5493f8..60da24d90c 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -520,14 +520,19 @@ struct BtCursor { /* ** Potential values for BtCursor.eState. ** -** CURSOR_VALID: -** Cursor points to a valid entry. getPayload() etc. may be called. -** ** CURSOR_INVALID: ** Cursor does not point to a valid entry. This can happen (for example) ** because the table is empty or because BtreeCursorFirst() has not been ** called. ** +** CURSOR_VALID: +** Cursor points to a valid entry. getPayload() etc. may be called. +** +** CURSOR_SKIPNEXT: +** Cursor is valid except that the Cursor.skipNext field is non-zero +** indicating that the next sqlite3BtreeNext() or sqlite3BtreePrevious() +** operation should be a no-op. +** ** CURSOR_REQUIRESEEK: ** The table that this cursor was opened on still exists, but has been ** modified since the cursor was last used. The cursor position is saved @@ -544,8 +549,9 @@ struct BtCursor { */ #define CURSOR_INVALID 0 #define CURSOR_VALID 1 -#define CURSOR_REQUIRESEEK 2 -#define CURSOR_FAULT 3 +#define CURSOR_SKIPNEXT 2 +#define CURSOR_REQUIRESEEK 3 +#define CURSOR_FAULT 4 /* ** The database page the PENDING_BYTE occupies. This page is never used. diff --git a/src/vdbe.c b/src/vdbe.c index 4bd26b377c..516e8ae9b4 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -588,7 +588,7 @@ int sqlite3VdbeExec( #ifndef SQLITE_OMIT_PROGRESS_CALLBACK if( db->xProgress ){ assert( 0 < db->nProgressOps ); - nProgressLimit = (unsigned)p->aCounter[SQLITE_STMTSTATUS_VM_STEP-1]; + nProgressLimit = (unsigned)p->aCounter[SQLITE_STMTSTATUS_VM_STEP]; if( nProgressLimit==0 ){ nProgressLimit = db->nProgressOps; }else{ @@ -1449,7 +1449,7 @@ case OP_Function: { sqlite3VdbeMemMove(&ctx.s, pOut); MemSetTypeFlag(&ctx.s, MEM_Null); - ctx.isError = 0; + ctx.fErrorOrAux = 0; if( ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){ assert( pOp>aOp ); assert( pOp[-1].p4type==P4_COLLSEQ ); @@ -1460,11 +1460,6 @@ case OP_Function: { (*ctx.pFunc->xFunc)(&ctx, n, apVal); /* IMP: R-24505-23230 */ lastRowid = db->lastRowid; - /* If any auxiliary data functions have been called by this user function, - ** immediately call the destructor for any non-static values. - */ - sqlite3VdbeDeleteAuxData(p, pc, pOp->p1); - if( db->mallocFailed ){ /* Even though a malloc() has failed, the implementation of the ** user function may have called an sqlite3_result_XXX() function @@ -1476,9 +1471,12 @@ case OP_Function: { } /* If the function returned an error, throw an exception */ - if( ctx.isError ){ - sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&ctx.s)); - rc = ctx.isError; + if( ctx.fErrorOrAux ){ + if( ctx.isError ){ + sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&ctx.s)); + rc = ctx.isError; + } + sqlite3VdbeDeleteAuxData(p, pc, pOp->p1); } /* Copy the result of the function into register P3 */ @@ -1850,12 +1848,12 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ ** then the result is always NULL. ** The jump is taken if the SQLITE_JUMPIFNULL bit is set. */ - if( pOp->p5 & SQLITE_STOREP2 ){ + if( pOp->p5 & SQLITE_JUMPIFNULL ){ + pc = pOp->p2-1; + }else if( pOp->p5 & SQLITE_STOREP2 ){ pOut = &aMem[pOp->p2]; MemSetTypeFlag(pOut, MEM_Null); REGISTER_TRACE(pOp->p2, pOut); - }else if( pOp->p5 & SQLITE_JUMPIFNULL ){ - pc = pOp->p2-1; } break; } @@ -4440,7 +4438,7 @@ case OP_Sort: { /* jump */ sqlite3_sort_count++; sqlite3_search_count--; #endif - p->aCounter[SQLITE_STMTSTATUS_SORT-1]++; + p->aCounter[SQLITE_STMTSTATUS_SORT]++; /* Fall through into OP_Rewind */ } /* Opcode: Rewind P1 P2 * * * @@ -4519,7 +4517,7 @@ case OP_Next: { /* jump */ int res; assert( pOp->p1>=0 && pOp->p1nCursor ); - assert( pOp->p5<=ArraySize(p->aCounter) ); + assert( pOp->p5aCounter) ); pC = p->apCsr[pOp->p1]; if( pC==0 ){ break; /* See ticket #2273 */ @@ -4529,7 +4527,7 @@ case OP_Next: { /* jump */ assert( pOp->opcode==OP_SorterNext ); rc = sqlite3VdbeSorterNext(db, pC, &res); }else{ - res = 1; + /* res = 1; // Always initialized by the xAdvance() call */ assert( pC->deferredMoveto==0 ); assert( pC->pCursor ); assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext ); @@ -4540,7 +4538,7 @@ case OP_Next: { /* jump */ pC->cacheStatus = CACHE_STALE; if( res==0 ){ pc = pOp->p2 - 1; - if( pOp->p5 ) p->aCounter[pOp->p5-1]++; + p->aCounter[pOp->p5]++; #ifdef SQLITE_TEST sqlite3_search_count++; #endif @@ -6243,7 +6241,7 @@ vdbe_error_halt: vdbe_return: db->lastRowid = lastRowid; testcase( nVmStep>0 ); - p->aCounter[SQLITE_STMTSTATUS_VM_STEP-1] += (int)nVmStep; + p->aCounter[SQLITE_STMTSTATUS_VM_STEP] += (int)nVmStep; sqlite3VdbeLeave(p); return rc; diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 9ee82b4ea0..a699c414b0 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -266,10 +266,11 @@ struct sqlite3_context { Mem s; /* The return value is stored here */ Mem *pMem; /* Memory cell used to store aggregate context */ CollSeq *pColl; /* Collating sequence */ - int isError; /* Error code returned by the function. */ - int skipFlag; /* Skip skip accumulator loading if true */ - int iOp; /* Instruction number of OP_Function */ Vdbe *pVdbe; /* The VM that owns this context */ + int iOp; /* Instruction number of OP_Function */ + int isError; /* Error code returned by the function. */ + u8 skipFlag; /* Skip skip accumulator loading if true */ + u8 fErrorOrAux; /* isError!=0 or pVdbe->pAuxData modified */ }; /* @@ -345,7 +346,7 @@ struct Vdbe { yDbMask btreeMask; /* Bitmask of db->aDb[] entries referenced */ yDbMask lockMask; /* Subset of btreeMask that requires a lock */ int iStatement; /* Statement number (or 0 if has not opened stmt) */ - int aCounter[4]; /* Counters used by sqlite3_stmt_status() */ + u32 aCounter[5]; /* Counters used by sqlite3_stmt_status() */ #ifndef SQLITE_OMIT_TRACE i64 startTime; /* Time when query started - used for profiling */ #endif diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 7c9db9beec..52c6b2a797 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -211,12 +211,14 @@ void sqlite3_result_double(sqlite3_context *pCtx, double rVal){ void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){ assert( sqlite3_mutex_held(pCtx->s.db->mutex) ); pCtx->isError = SQLITE_ERROR; + pCtx->fErrorOrAux = 1; sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF8, SQLITE_TRANSIENT); } #ifndef SQLITE_OMIT_UTF16 void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){ assert( sqlite3_mutex_held(pCtx->s.db->mutex) ); pCtx->isError = SQLITE_ERROR; + pCtx->fErrorOrAux = 1; sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT); } #endif @@ -280,6 +282,7 @@ void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){ } void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ pCtx->isError = errCode; + pCtx->fErrorOrAux = 1; if( pCtx->s.flags & MEM_Null ){ sqlite3VdbeMemSetStr(&pCtx->s, sqlite3ErrStr(errCode), -1, SQLITE_UTF8, SQLITE_STATIC); @@ -290,6 +293,7 @@ void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ void sqlite3_result_error_toobig(sqlite3_context *pCtx){ assert( sqlite3_mutex_held(pCtx->s.db->mutex) ); pCtx->isError = SQLITE_TOOBIG; + pCtx->fErrorOrAux = 1; sqlite3VdbeMemSetStr(&pCtx->s, "string or blob too big", -1, SQLITE_UTF8, SQLITE_STATIC); } @@ -299,6 +303,7 @@ void sqlite3_result_error_nomem(sqlite3_context *pCtx){ assert( sqlite3_mutex_held(pCtx->s.db->mutex) ); sqlite3VdbeMemSetNull(&pCtx->s); pCtx->isError = SQLITE_NOMEM; + pCtx->fErrorOrAux = 1; pCtx->s.db->mallocFailed = 1; } @@ -621,6 +626,10 @@ void sqlite3_set_auxdata( pAuxData->iArg = iArg; pAuxData->pNext = pVdbe->pAuxData; pVdbe->pAuxData = pAuxData; + if( pCtx->fErrorOrAux==0 ){ + pCtx->isError = 0; + pCtx->fErrorOrAux = 1; + } }else if( pAuxData->xDelete ){ pAuxData->xDelete(pAuxData->pAux); } @@ -1289,7 +1298,7 @@ sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt){ */ int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){ Vdbe *pVdbe = (Vdbe*)pStmt; - int v = pVdbe->aCounter[op-1]; - if( resetFlag ) pVdbe->aCounter[op-1] = 0; - return v; + u32 v = pVdbe->aCounter[op]; + if( resetFlag ) pVdbe->aCounter[op] = 0; + return (int)v; }