]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
If a reprepare is needed after binding to a variable with a number larger
authordrh <drh@noemail.net>
Fri, 3 Mar 2017 21:51:40 +0000 (21:51 +0000)
committerdrh <drh@noemail.net>
Fri, 3 Mar 2017 21:51:40 +0000 (21:51 +0000)
than 32, set only the high-order bit of the Vdbe.expmask rather than setting
all bits.  This could potentially result in fewer false-positive reprepares.

FossilOrigin-Name: 45797feefe90cb7da53256b0c42fdaa1221d0a27

manifest
manifest.uuid
src/vdbeapi.c
src/vdbeaux.c

index 7865de9c712aa80bebd7bd72cbb5bea4f56b2e9e..084b50ff08baccd807645462babeb1d80fbdec88 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Remove\san\sredundant\sfunction\scall\sfrom\sthe\sdate/time\sfunction\simplementation.
-D 2017-03-03T21:36:26.906
+C If\sa\sreprepare\sis\sneeded\safter\sbinding\sto\sa\svariable\swith\sa\snumber\slarger\nthan\s32,\sset\sonly\sthe\shigh-order\sbit\sof\sthe\sVdbe.expmask\srather\sthan\ssetting\nall\sbits.\s\sThis\scould\spotentially\sresult\sin\sfewer\sfalse-positive\sreprepares.
+D 2017-03-03T21:51:40.099
 F Makefile.in edb6bcdd37748d2b1c3422ff727c748df7ffe918
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc a89ea37ab5928026001569f056973b9059492fe2
@@ -467,8 +467,8 @@ F src/vacuum.c 1fe4555cd8c9b263afb85b5b4ee3a4a4181ad569
 F src/vdbe.c 83f387d9e6842b1dc99f6e85bb577c5bbc4e397d
 F src/vdbe.h 59998ffd71d7caa8886bc78dafaf8caeccd4c13c
 F src/vdbeInt.h 4e4b15b2e1330e1636e4e01974eab2b0b985092f
-F src/vdbeapi.c 70aabe108c411e529a59d8800445513965334062
-F src/vdbeaux.c b632f9151a296c5eb22a2cc955c487ebc2347cb6
+F src/vdbeapi.c 5b08d82592bcff4470601fe78aaabebd50837860
+F src/vdbeaux.c 57361f2e761d92a254638bdbfc03fc68ae6aebc6
 F src/vdbeblob.c 359891617358deefc85bef7bcf787fa6b77facb9
 F src/vdbemem.c 3b5a9a5b375458d3e12a50ae1aaa41eeec2175fd
 F src/vdbesort.c eda25cb2d1727efca6f7862fea32b8aa33c0face
@@ -1561,7 +1561,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 8831f4393dda42b3434e7767968caea84bbca2af
-R d8b3a18d4fd999381a3209784f6b834e
+P 4a04c48a311b19ba5e566877dc5baff543c41aba
+R 637ce5713001d3d9ffad62c9c4caff88
 U drh
-Z 55613e922149954b91d38c0de9685f66
+Z 435b5c3ba7edfd2dba5c4b61417da7dd
index 637cd06ca03effebda4fab7adf22e40f57dc6b39..9ee7804d6187c3c41567c0206a1a180c09389496 100644 (file)
@@ -1 +1 @@
-4a04c48a311b19ba5e566877dc5baff543c41aba
\ No newline at end of file
+45797feefe90cb7da53256b0c42fdaa1221d0a27
\ No newline at end of file
index 3d9bcca99fa89b049dda5fe5a7833dd18aeb2228..1f2699dc4df56aac465e971817f0596bc6e05b37 100644 (file)
@@ -1260,7 +1260,7 @@ static int vdbeUnbind(Vdbe *p, int i){
   ** following any change to the bindings of that parameter.
   */
   assert( p->isPrepareV2 || p->expmask==0 );
-  if( p->expmask & ((u32)1 << (i&0x001F)) && (i<32 || p->expmask==0xffffffff) ){
+  if( p->expmask!=0 && (p->expmask & (i>=31 ? 0x80000000 : (u32)1<<i))!=0 ){
     p->expired = 1;
   }
   return SQLITE_OK;
index 8a19c26003440fd4bcf97fbb0cedf67db09a61fa..ab4aad7a0fb707ae0c953be5c74e36fa1df1c8d6 100644 (file)
@@ -4552,8 +4552,8 @@ sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe *v, int iVar, u8 aff){
 */
 void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){
   assert( iVar>0 );
-  if( iVar>32 ){
-    v->expmask = 0xffffffff;
+  if( iVar>=32 ){
+    v->expmask |= 0x80000000;
   }else{
     v->expmask |= ((u32)1 << (iVar-1));
   }