From 3e053c50b45279edc2b48ddae81eeaae53183982 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 28 Jul 2023 20:59:25 +0000 Subject: [PATCH 01/41] Do not allow the same JSON parse to be input to both arguments to the json_patch() routine. FossilOrigin-Name: 8e781c6742792b3899ca60efc49c7eaee1df9f6b03d27c254b0e148b82946e19 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/json.c | 3 ++- test/fuzzdata8.db | Bin 4235264 -> 4237312 bytes 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 778339756b..47c84d0c9c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\ssqlite3_stmt_explain()\sAPI. -D 2023-07-28T18:37:13.439 +C Do\snot\sallow\sthe\ssame\sJSON\sparse\sto\sbe\sinput\sto\sboth\sarguments\sto\sthe\njson_patch()\sroutine. +D 2023-07-28T20:59:25.746 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -603,7 +603,7 @@ F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276 -F src/json.c 60b6b0815ddaf546396e3c7328065a114b581721dc1fa20697a52610fb2259aa +F src/json.c 0bcc2e033821feb3048b8434ade2b7d22267005a0990656f4ef4ee25b4ac47bc F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 176d6b2cb18a6ad73b133db17f6fc351c4d9a2d510deebdb76c22bde9cfd1465 F src/main.c 512b1d45bc556edf4471a845afb7ba79e64bd5b832ab222dc195c469534cd002 @@ -1138,7 +1138,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db b8725a5f5cf7a3b7241a9038e57ca7e7cc8c3f4d86b44bd770617bda245ab2b0 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db f6c2f2af4deaaae0ddb3310d509c2659990794aa653dc501b80a0534c3493f80 +F test/fuzzdata8.db 40c85daae47da64387c3dab7bbd99c21e425c0bfdb4b149cb685b1ab474a2cb4 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -2049,9 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0bed957e46aa3bf6a70292ae100de0459486c1469dd03de61207a708cc59a594 06eae046c1a1155f22590b88942db72f01482f2363da9753f8adfdb322679055 -R f4937c6da6b1777faf7c4e05e694ac0d -T +closed 06eae046c1a1155f22590b88942db72f01482f2363da9753f8adfdb322679055 +P 0443c0ef85f8f6f3efdee68bf59126c9459f08a58458756f8cbeeaf043d43a86 +R 27732baf0d0d9b30551bea552c6f65a9 U drh -Z ff4a633a0dc8165d247380ac3053876f +Z 335a5ef6b8de7fa701a34944faa875e0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 784b700a42..fb83faf367 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0443c0ef85f8f6f3efdee68bf59126c9459f08a58458756f8cbeeaf043d43a86 \ No newline at end of file +8e781c6742792b3899ca60efc49c7eaee1df9f6b03d27c254b0e148b82946e19 \ No newline at end of file diff --git a/src/json.c b/src/json.c index cc39264c05..2a002ba087 100644 --- a/src/json.c +++ b/src/json.c @@ -2672,10 +2672,11 @@ static void jsonPatchFunc( UNUSED_PARAMETER(argc); pX = jsonParseCached(ctx, argv[0], ctx, 1); if( pX==0 ) return; + assert( pX->hasMod==0 ); + pX->hasMod = 1; pY = jsonParseCached(ctx, argv[1], ctx, 1); if( pY==0 ) return; pX->useMod = 1; - pX->hasMod = 1; pY->useMod = 1; pResult = jsonMergePatch(pX, 0, pY->aNode); assert( pResult!=0 || pX->oom ); diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index a4969047aa677cdad6e9786fd825d28a6630661b..6b434f6bbfd84dd6c3d92c38740c9359f1d2f980 100644 GIT binary patch delta 60515 zcmaHT2V9or_xE$%;~DH{@5N9=#Ro-25d>Fm!Mz3d7SzlQJP(N?#J@?@ArS-*U#rZ>OHP`uIrrhJ>Toet@3iYHD0dJs%|Kg zg~iDJ^Cz^ZNei)|EOz>b6=Sz3*z0?Pl;82H2Knt|GJd&F=6e$O+LJ&=7e^OQmq3?D zmz*vIT}rxCbOq2Qy&FVVFg^(kiE;0ZRGsADL9-AW+W=Lj7zf07LauvcGP%QNm&t?; zUaCcS$D2TMmA56yH@z)L=6d5uF7`GfxxgEXZQ?@uv79*XB>GY&6B~FZl8o?(Z|1fhmw5c9Ypdc??93dyaPzy_4X%u$J>wO_ujrFZ+O#4 zUibDPdBxkC5+mY^}Hd*>p-bY!D&y6{2TD%XQ^p3#dKRm@ zrYMVO+yvQs^Whw)O^5sny%x?K(!LW&&0M%i?QJT^PJnt+QX?ph(72#B$g0FWx7F#K zKrbx9xcQcm3<^8j6QJf|Xai`vPumcpTWU=(Z>u(jn`eX>KN?!Vms_>VA$yy4BE&Yb z27~8gZ3vVq6iKjohjsv!B$L6Eo!SP_2eq$5X}u-{uCHTC=#!>U;O(8-4GhkG9_E01 zJwrmJk6(i5J=%c~H^8A4W;c%>4PgtoF0dh49|Bo9%)|OZW+kCN>jf zZ^TPI91P``Lq+`jo_f7pj1y!v{h!~hiO>W}UCvwK_Id=_TByznPJu99YliZ;uu!}{ zGRe+x)UWDNCerK(UM#Fqw`bV#vAT+5KB#*Vq=%Y7F&MJ8aVAWDsy@bx`JT9OZJ?-4 zY)=Rp!##oxq9y@zna0PlSE24%oE2OXxHBak8!KV4h5Ht+P2{Q&dkrh9)EWle zE~!UC?zzN|u~~@b0%J=dwXLQATy<&}^ggIoz{khbW6`13e8;iZu}U75!XT`vMuBN3 z)Gb)a?Z|h*Wz^hYZ(wymR2+k+{oBljte?UL;xn`67p2%jke%!PVhDm@M1)48T()(# zw>dq4%xwMNgFxfcOk6@8Uk-H<8Y?;@H8**-0?r*(Ct~|(%~75eK;DzcrWn^mbDn2~ zpf+nFA>~=53gbMQ^9uGBg#4i%f+G?%n|W3Y^>fs%plX#tz~pwCV?0|4WeWn_&}?%+ z5R`fY_o?EuXLj;(?0 zY;^=S9IR=eWC_?iL(`m7t$Tfrx3wTE&U#*7N?%7KSbr`k0CZzC(^YHVp5$#M$SMZ< zpBC4)H_8K~UFGe{v6`}Av7I10vRHaF1f>;DOSC^G|rnS$O^|x55@%1+ht38 zdD{xIBFBq6rArgNZRj2U;>>(r=K9Ln8eYlXgV^r^rhw-Y%{DYG()`G=jSyO?NyGlR znms(*1on?KCAcPEGfBa=VEy-+Fb1^=AtH=A5)g;omuvQOY%A2?A!SOs7NCR-pT+}= zH)#U#QlX|P&$dDReN8Uruhi^Oh)II%%;upD8UtF6YHsta5*A<943HWyUdd9isz%eE7eAo4_Cx7+n$5WVf@TQM zKEl%5n(OS};}D85S2b?A*pcSWKk0dpyN8#u~Mn+#v%7KmNu2*1WWNAFtGD4+^X+9x`cDdGRy4brQlX z+GwcitbK@fyY>?$>xQ*aS|`U&R7PvtiL5&&HPwE?iKpr18d%Up+X}J*wJ%|wN9*MS z&Sf?k-DFI1Qe1PWzRY#Rw0P}ao}EYc)!P=3Exf%TX_)pCcByi>mUQeI3K`mGJo_4jvC`k) zpfFLJsuKE0My{yJPSbc+YlGlCwHhn4wcR-JD{4R;xL?&az?j+ED?Ixa&MnlYK>6{| zIgm1}iHL{iYNM4x8fhh{D^+ojwM^Rv2jpqDb7C!h{2dH0)DFU7`Py2A*jJEkCWCWE zn}Mavw0)TBhm|sKx**#s_-_K;ya9;?+N0u4`t%kQdbM%TeqTUCq(c4*68Z_UHQ-(w z;csU+R;|;v=h*GaQtc|a*k6#X>M9lU_a^h#NZoB|AN-N7`%rZ;wAFu%Gm>$xRf=SJ zx6=lC=I^D1WcOnk1YG5#ASIYP6F^_yqw8VQrg-*3XhVi%-OVa-AoXIT^x4Z;bx7Nu zvHHp??P7rq!knYpT%P@0`I$CC6oyK=nt4V$7HSVBN5Y=d+U?@wg6ZBNF!GFcvhue# z8hZ!7Q0Ls!+Hfep5-LL4S?wP27pnGmNDov;!r^7w1k9+>z8A>;fTFPqYTF>)R(va1 zXXfzEH(E1ePw`Ngt^*Hew;Sfbfg9SF*q`XmWRV*X(G?6y|m z*fYp%*1(Le0Wq~4_E|`al2(K$gQ7jQDVP-!Q%Em9)bboBGCUM1m0fkd(MQrd93G06 z{{JjSw+$Zrq17=SHaynGVC+-vMJfie8wsX;Hl0BwA12E3K58co)O>KwO>Tjko9hPB zE}SR?LwQS`3M@go9nus%p>h?FdX1-jD@aHCmJ;HwYrDdV>)M%6xRDRV(_y++JX1mD z2}KHo?l82Hy4eX2>2#fW764s-(0+s-G3FEpHFvagq;>{ksx9U)4_WmMjNp2pZ6MtY z!c%4hinTEvOWqU%AnQi70{(hv zRDu1AMmO+{-?az0$|kyeQ5+%2YRM#=(T)kGg2PUZ^$w@*0{IgEv%5o>DEZ;)=TljA zCV3W?&P^s`T-DvN3_~HX zz*)=3c#i2Hdrrtis80(Cz&RwnpT<6L9%~2R&@paw;g>w`^kbHsf4LONAGo;+t z%|TBeU4$r(6lA+Q`MZZSoA()34b+kH8!89ubb^o}$X2ha3upm_71|_7%TKm~VT<;A z$m*yrgp4=H@Rq6!0Z`vNN`$5(b*W10o1%A=AS(g4DKrIK`N=(Ae4v-+%3PVDqb-wMme=|YukG*nH~O%|QSoxPdZY`U(7i8d<1 zg+i8&b~!f+v!%bofj#8h7&TWHsT9WuvK3_4&S;0=mR#L%o<;fR2&40LawVIH&6eq& zGO=-?+&ck0E2#8FOBZ;@!-f?)uQGaRfOj0ZCE$L;;J181@N$99s%%);**lgTw&z{) zJI@a~G*T+!J>;^9k(Grya$I5{wW@(0b}Z9{!P?md9VWf4JFZ|&plr3S3wAHn?dMrj zcsMxB1dHF%c_Cv+m;q{k;Z%5Vqpl0jVj*t5?iWbeqzi%aExI%)+@UimZ1e$tq5lZVx7xO$#aS znnSRvN=H6Ib82r(Ska|zYfL<<`;2F;AU#NiHv zUMCY&T)f!oztXgP`U< zCx^7j4kzYb)A@MT4%QT!2IA0K-8P;jLDBH=UrSb}q=P57eH3PWrz_@IG8D~s#DU{? zJ_A?X(oN^d8_ON4Xoo3xbw_xX0(m19F;JT3Nc?-T)$7LdEEUd;F*Jj(qYMpj$Rpit zg)ogg-RJR9?M%H{@`LYIEUtL3Q*l`sN+0=*0F zoz-jco?CC=STA^UzCIZ{MCz+~@)=-id^kOt-b<-DcVh?&c2-p^_4*vQ` z{}*lBq6$ji*Uv@hrJu^N!C2c@?_$tokbW5Er0eqo*f6O0GC>c`el#tDlt1(bAnSsu z6z3h%zs6wRDE%93I2`^)PoY|dobLfI}}2UoK7 zy`W~9d?}9Xu1_V9puK!BE}5fW#Aw6H42$?569P0LjUi!!qZzyuuD^l%=IMKLYz!2B zp`U^?7V1~>Y%FFs(knT*H^r%dwtHiO(dE_OU~C+y-{vwP>pr&!T&uZs7#c@9IckM7 z0CsQZdPC?s{U2DfMBhSW6CnGR+zvT|OCpkUvBwBBT(j0vTgo#cQ*mCvVLg?+uEj$Sxk0;I(A5dKM zi4EHKbH?KST)mNlG!_vA1$Vh#aIbN&0?)3|$BS$#)MW}f24%Fm-&A;C!R(LpE0~x?#m~aVPxR-Q zq(0ryaY+9iBXuAJdJRc^QW>7A*0<)^%dqOIsSsBl)z46{SN3L3@^V0{t_!$Ui8G<< zC1n5{c!hS}e@5891`TX33N_MFnOA&nI&C5g^{t_1D{W`9F6avtY{BzNdtK94@@yec zO(*eetv;R?7kOHEnnT-h`eJ~OX?IS{72s#l@qCw+`Um@mkl zz`2*5{-qd!J09!%bD{*o`G8$DIN|JUQ!!RPrKZXk(y}e=3TkE?Ev@8NOOm|{1lcZ` zbZ3NQZ^K!HLU=CSJ zCr;gSlBe=^ii8Yb5dH%xH?#{eS7#u5@CLRT zXgI;}jM>nVV{byMp@!j@VKcnPvt=;Z`bFldu#2*lhbhAIVHgsJg{L%g_xxhXc{_lqQ*sr~zP!w|{r%=L?hCteEo+8$GgZf3U*An6;u3A0CyI7Fz^(!zf3S$%L zrKQp%f^fu=I8RF`8?0#jzXm6W;dk8(4vqmV-)JzSy{F-Op1qAlTcw5+>I^On$>U9a z&we!)?KEs>xO;$MfQ0a5MHnamA8eoioWkt=1_#`=8WhX99GPxh&q3~LV#Z%7{1rAh0vnxVTJ-YV>b+wX6;)F ze9+K>y^kqwLlVQ({f19Cwii;OB*i!&DaHqo(#TMa$Epn5RgA~16NUmN?x3MU$ZTTV z0xMdX$lz2PJ7M3`hCl@qaO4F;8824SD<5IpXT~EOetOl=j`1HS#ADu7<9LQszcv8J z4nX#Ms-BouYaq0Pke)f=>MO>>ctmMT;n}AU<}xN= zyCCDIJo^mXh3Y7r@|_`rVc`dALW!5P)ii?PQ6V8v_@F^+Sa^%(Z^Jjn22gd&0F^o; z#U&>o^`fB>B)2ql08ff(C!~qSP)uxPsAk|fWtasct;S94B%Db!G>5O(7(<~)Qv+?s z2_bSUv>9jd>=c|sQ!}!F#sXO0*fbDk#2Lub?`^cgo>m&N;gcc_IM;0~Qwd5kR{r2B zt+8>B_&N3OEaW{4h=Dz?$An>W6XPPKs1js5XGGZ_7k=8#7^)Hj1lfnJkiHCI(t^=4X+Y1>bqT5;8Jgks%f{9W zCwDW}$;Chl0{j2x-7-$RNH1Q2hl0_L?*2v!pRYp2AY%gz>u!9V#xvU(&Y(2Vm;nWG z#ymKC$k+~)ql_Vv`Th#jy<-}}gYWGW#Vl@<4z91lR>Oo&%z`;1jQJe926+R?n{j>< zHW**dFg8@OU|cuRSjCjz?2!9{1lc7h`^hldZ{DHiG9LtKUmABp)+zZIsSlUwx(?~H z^g8fdGIYbtsm6DCR*R*bOuIRJf2J{Al<=%QipE&A)My|Vt=d?P^7+O;8M^^R%?xqa za-lIpDN<_>CP=;BPjETP)1W?uW-joOd@FeR8NE_nb##3X-|$8Uj2Q5@YD=Yd$lxsTnaHo}WHNEsq0(5**iYadX-t8|1%&V{KWwx~2@oTcpC|KCbCgj`uQOV( z{6k|u0@2`HcjIUOtv^Wm6VKQqs2Zn^#lmSuIm13zjA{-F-ZVBZ8Df03@~E^rf5kA9 z=`RkslSanaZ;-v$Sb(0v#%&z7J8N935Hy19gXb2vcB1i-)GdPC#3xwxy>S#R;FHE0 zC>&^Ngyr3g0>g~2jM1W~6J*z8BwOZ>Se~w0=+g?a9Si?!jDC{}dra4#kk{DQ73!Y` z1Y+8&MlS=`M$>q#EvJ!?Ch9NA78&vI8!;3dq+By>^7o-~i1D=l@iQo^G~R}==Eek= z*opPT?0d!{j+4tEuD7u*Cf6H}@*H(vcw~I0AP_FSpJ@l?UNkHutJ1-Ak!p|&P@ypP zfs{4I00?_C=B<4XOos^+!aYh;EK{l83G*2QS!JZufwvjWyIlVEWFLVq6@#T-&Rl5{ zq*4@+lVTcyw7<3FAZ4%VWvJb%5FpoT%7w5`j1=9;m(@Ay}of$#d^| zqH#N#(@h7N()6y{XAxvapJ$t0v-#0bKiOC;wOdP<86U=*Dj9w>z|@Un7Eli{l4&1o z`d-0oP32bOY;WdkOr|vXhytM0_=p0a4E8M`8Q`NBMDdr8hyaQwzE?>8>LWUU zqSp5^$y2_WBoF&$kgW7gBe};nh2%EhWRmath!vqI_Dv+Y!Z(3ru5TR41wNujDCYPw zNzU?(A~`w7NBjsyhL56o#R%UJl7oH3j8OFS4Ir81BOZhz)|W=Ip|3Ydldl&^m9Gbl z!mqw=B!BX~MDo6`3(4<&ok?Ezbs~A$M~n#haUU@vIuPw;}UmKFke8l{aFY&b|x!Bi|$VRlb`fmrn&LpX579 z-pO~6Je^O7tnxs0Cs zo=;8kmX9hHZ~7#_;%gt(n8y!wwF~Ob|4(J=4z| zOTp=SE2Z+X+6D(;yN9MvIm&)dH(TH0;QD%7G#>iZ)S0mkINffYz;McA)7u>D2-DqG zidCMPuJf!D6d09_AZxm<8`MTwH-an0-WWSGb1#KRnWR4*QX5k6OQkuQ7p3+45|rIA zQz#Z>-k@R)w>;CEIZ;~s)c@I{4oxQW5tSHCna+5~t}}Olsp*MIj0rbiWUO0dr1_#K zHloq$Dn0B9+e{%L=!r3(Wnxb%qYuVCwmxC_S5vddu{79lUjk}9W&&!{VGpwr=ONxq zoQJ-+N3>DGPSwWzgk$}ne7}Wa*mmX(5*}N3(2|OsQ_K$(LX03I--F;XD6cbX;97)6 z3C~^*ljGF&_N5G6-ObmTNZXox5aexEx*+*m^Pb}JUK`=A(HsU2D_ZL5_MWk7tyIPu ze|;l>DJ;)kls*&=zLppXVVp&WROBIPeT!U9HBP4+b=R3>kr zG}!6SyI(WI+)Nxut;zt`0IMEyY_^{vEHoexN^e=d!>8G11;;XBM!c2G>})fc+0mfZ zDRfZpF{`oBT=P|4f@|Nm062Ktx0sc0_xXD{7KL0ht=e%=*2y{nr{tU8=Gk~W7h-G1 zN;;Uk;o;lXRB}dmYe#8NCg8bFW*37kf^`ZOEH}@Vvq^B~T{BT9R+=f16Gw@hky5({ zOPI4+@@HlgPWBOFt8DO#+Xm_Ow55Z5#QG{~{`@v2DFSK#l22XM&=-s6%FMAGn_Rik zOv`&Z93JPQ%F+E4*~){1PKyb$PMX`} zut(;tJo8FgYKOvGK|OHl?`Ghc56=xSQwEn*+KHsSyZwF0#|m#^AKF0sn?II1n}zjx ziC+JsSFvcax(Ac`ThFk)!cr@+*60ed+-2fxANTRKLUoAczMob{xdL}DGv)2mb_S|( zMTj}bU&8C)PB&Yj%4unUoplz{>o<$bCb$0It8hMt^irT)OrV{n|BEpRk+2da_G(~x zpNVhKaIAn(llhzCs@_3(KiaZK$=cxhI7=qSmRH7GE(>B?VgPn{@p%MJXk&Ss6AS6f zVkj$483i>Rl@>_b>ntx$>k)=YNtOvpfyi9jo@Z}prlK*di{$|m-=c3y;9;(#``(Oe zrF?PjMvA;-a)5{Vj>~&%7JC?k8XXTIx4%UTVSOw=6M&i5-9n+nH|q)7#8>-T7BjXQ z@_Jhe;MpZdIEKCJSi<&}d(&8PRTd=&Wb!qjj(6(zmfn5J;QDc1y?4>Uy$qT;9kk!d zR~2W$6cpBhS7N2X;HG26z($9r0i^LQw{aA?sv)I&`AT_1o2l(M^ zOAiUtR3Fn3qpxGzrjT^Xq{H!ZEmcZ+JKB3F8TgOB>TzqHWe~?!RpwiM6C|eDTH;XD znMdQu*DVCEY@{x1DK4WtT^6TY#wuF{XHwq^EEm{T6bdc0#I`}rPo_I~f2Bn)A(u73 zlC5s@w&esd%b@0osR?@4T0T~Z$%5>M*^oKNI?Qi;V1Lix1~_lCWr?4-Cf^O`thUBb zKPXuNrP=1OxMr(m63_O)y_QxlF4<{W#1ksnv$@#;8}thOzF1p52aY7`6={qspl2)d zdHg)t+M1Q@4O~_HN zkpxbTEVK{BkyVyWJlh8&SK3!XL2s(qa?Em@BOcqibSq-oWlIKw;b$$qancFP8paSt zU9wPUcFIDb*@sZJS(OT5r!Beopj53VrpY6{2ddg9v_-mkz`vCCLs6Z<4LJ|>{h&%s zU`_5#j!3g-Ey?)p1&f==a8SJPZIcQ;E8qLDsZFmvUzgOT7$gSst1RHt z6VrVu^kmgYNhK!0{qdn8lKnSH;Gg^;U7tbvGk)T8t)sBtRs~h9g15jZt#u>&9Iltx zF5-ql3nM41-t-BsHIOI8PT=)5c|zp~SCeY1@`#7HZ7h-V;sY6#h*Xe-6JHMnBEonU7g zOEZ%cbdkU0bCpl5gBi@&VJU(KcP(TXusT?Ce6YyBsE4+qEQ}@L)mg`wjZ~~>j$lN4!T!c zr%{|Czw+5aUk92EC|jXRl~iYx#Qc+A#q4tHa2_&-S>Iz{;o)Oe$-5h2eIjRH1G}ME zPVJ0w;mK4RF|q5%S+yMd2HML5qp;CL>kg$vqCD_-V87hj3D$=Ox^Q8()yIj~sPsBW z-DCS0i0#!DAJ4W15VsFKg_bOWzlJ52K$gMUL~@{2*nYnCs04_5R$2}L&FTnrF0$U_ z*iAV6l`WOFj9?{tO!jXWHuhRCGxi-;jY}k=SC!kEfN#BO4N$VqxNf<1w4V_uzXfr7 zY$v69&m;NlWC3!|+onNsvGo|cO&D@8qXZ?|MnKH3rZ5~e-@3v-%XiQ{IG8NLo{@>& z2&pv(mcW@`Ou_im8mpSIAHh95_u)_uy~)(rG@m0*~%ILi<$KWLTvwd!Xo^>=V=uwRmNK7zqvj;PA2 zdG_o0Y$g%^B!`r+B$@m%OE3rE2Xb3a2G5$> zZsUY+t!o+k6ArdBFDQw#HN)LErDgLM(cLW`JQQN<@WQw4BykPNyRCxWoy~{*%K~Xx zEFi1-z`Bo9$WW-a5`M`+*%6l(a?geYqtjulW03QOHShn@E0MaZ;E`50eUtMgz4MjF zT>bAp(U}dILcpwCdm#_&_FB3^%_9p%qcVjkdFHQigpQjVNj>Vrm>g5{%!esu-_D#& zop~m`rYK1^(`s%`s~Ov^usiA8Kv%0978cm^SLIlV2QO17|Lwh3VQ;O?Cdzxz%)Zt2 z#mpv>E3ODQ7Vhg#_uqI9vS;kHb(LoQegDKthG94Dxe9_W6oJSrw&@IK+HFM~3;KVJ z!F;5dT_&vxMKESBwo~A~ZjYrSoUFIJh9h@{z2|=vg4tgGBN_mt0T|Apbz|Ep77A={ zSg~ZHZO^iV&EZoFoE`CXF+F;LZMF>1o2Kp!307X-*T6i#-wy&Od6gEhiY7K#mfWT=%V zYo$H0Y@lr<6Sef31xg#(ci^7Ew*EY`V)Yy=W!b|<*a%awLG^s=Z&1I`7KDmS+f$C& zv3jw!8JYICEoN}7CC_G5o~=Y$I0^^mjZL&NbWXC-M(Kp=B~~NaH{0?Urnu}INzSkx zk+9XQ;J{L;x^&_nowreTO{NG(mnM+bHdXsNl;2mR;@NpN!dxOiy~cKzI5##e&mu8& ztnHyhT6+Fb6sX^|Q4TiWMjlH8RByH||GO%ns;Zz_mMySyneBvJ>`jB@-+K1`Ge8YR zLhBTb@SLC=K-JzeeTuFU8*z&$*`ZXfg0y?Mq3R1; z3gjdNA4ROB&51RKqER-YqJ3z)!4qnwzG~Zq&2l9Rlf2d%hPMyeEE058G{L6DlMZW3 z3K#x%Ku$2$64c+??m^;TrZz-hmL}!1lixmGc~rBJOx_Wg%;8o za+<<%z(w0`jzF;Nm6k=%-6bG*X%kjnwe@0zhq2L#L}$5X^GSGE_FBu=SXXNkmGZu{ zndHVuj+?}|Q6%pR@uds0J1%M4*^3ztWn%^jKiWPO2`*N&m(nIQD0ihnNkR2n)~3YD zY-)dxgV46YcFELIx=}`I#^zg}k?|)hFEysUe-r6|Y_avha~((0@zG>+@~m%3A9TdH zk-;bFku&hTWMN17Kj;K(iFG7qj1FExy_}SI6nAp=L5y{V^dCaWkrV9X$i0Mdh1Osm zYCo_=!m`%El)=5P7$gI`W?q}XpL z*g!}hV1EU!4YaRAQ#bp2fg+9g#-QgT;nK8^gAoJmIa05NEQ|IH#F_#2W}GOcJ%(c3 z96QZ)xy~I7rGF$@A?q#T__?agDlF)3r(y3i#_qr^!|cNa;#O9lcE#g{Irb6%*Drv+ z7==lr?PUr=2d_`EpI421E7?a!AvVeW-Io2*=nSizYEM*&L+RwlLg{f2eDh`dY)+K& zG@~K!2g?Go2?-j=%_hu+&9ie75SQn+eTUQTS&|txTx_Rcb1bOmnTeo~YbS!jI8-k( zKOju1(jvfu-z=ft_7`%3mjhZbgy(WscywvR>BvFio_+f|FL+i84XF`3)nBE5@fl z!CHF*)r_Jf9~~Zecd^u)PQb0R=PIWaHunt|WTnroQ|WZG63(u(hpVQX9PN`%QNVN0 zfp8TSc3f{iz{E`I{!|o7?c_U6hm5V}dAMk+eF*`0MERC(&V>5Yt~HQ5DR>f;R=XVF zsdkOVNt1(tm3)=d9|lhiPJoPhmw>xJwqF<6C|prx&*sH!D)?oHYwbRX8F!MJkw#An z=D5nw>~2BK6l7Zhs3%=;>M46ZQ@&E1QT0&{OVe&O)xS9Y(+#t{F>uI7{r3l{rEQ^$+T#}9`38}?99%Iqyd$6fnO zhI78NFP9Ug@!<*u9gMqc-=-AD39_3Vs0scsN(qyiIbtB|7kjZPuXw6&EVXYqJ@kX4 zjr=TX4EWZb!r+VF>`lbQRJ0c!RyfY%rQhvz#?J@UF5>8BS)2~YSnv1=Gyk-|%dvc@ zcq`E=0ZnA6KYiWt7Ar2eD!!+9rYZ0V{gSYBSWj%af_&l#eEuA6n}H? z&_CD}1-N${4)X4o758aYLBtrn39FQj@m%r!r>CV>EHBQk83Bc#IRc7DWzhM#i5eBQ zh;rB!q@3wZ9EF^+VE=sIctQ3vuqbs(asBuNKL99=R!P8XR6=1~LR|AUVD03fBdS>~ zgRqUqaY8zx>dA2w;i?2jrAnMAozs0q;JLDoR&Y{HT#6=p0+E~RMj)nr=ZG6fK)N7vr}1j?`R z0n*8ressQQw8agfF+v2~>*FvG3OKBtj^NTq>5fp2@V~>%mW#W_IcVi&40OE5h{ITR zp!HxJKG?BE;xMKbw)qbFsM`kM&%+&I5{I#iIG@N%p*7@d*A$Mw+5_&atq~O@aj(3>2k~+U}Z`?%UQYGd& zKI7OXe7MeWjN#|6I@)qWYt&NV0JlhQq$2l7mCmyPRQ5T3ZRX&V%zQ3{4?Of$f z$A^M2MUY*Sjx44S)WJ@Xp&KlZ_qSm?l}3jmUUAxs>*oex(+?b%c=rC@)LSE1v1joa zs4tZ0;e9QApm(XGAKv=NVI>H#*wqm6;{%Sa5(0S6O7!=vW4x;PdiGkpT;-tMmUszH zx?6gJ7mCYwmKA3_`3?^rbD&&0gmJ~+63Ct7bm8SwjtEY~im|?_C1)Maq@%Ek59t(* za~T%aIA-x|KRg`nB)aJZ$LGBKqp_{xJYz7pyK^WxJV*I3oOOlP4fk=2;)*8WP=B1? z04I7ocj2tB9du~-Am$Z1d4k(QorRFL+1U?L_BSHxj7)I|(i`v|jKAgRuM}oTsS5w0 zfcgf`)aOg??I`C<(s>ybgl1|)s1JwL!$4Hz9Mb+wszUh>-T?najoX^oA z=%Z;L0BQG~3#92iKvy+X40S~nr5RqBmRS0`V+_HCkX@XpEw1XXLf2Er4PJiK)7sM_4k~&%XYE_)e2s8JC_Tw{ z#Fqr;0R^!mXSn(Ar2TpZfhNb2xB7jF&!A|#vxYGEq4`E_N3)}0AzRxuv;JH z?4MBh%A27>6F|MO{TFy)RFr{9nE(Xo-6cEDAod_X^Pk}) z@7VbT$7;aw%udexB}WVF<8gk#vvZjKmtzkr{_}ta4)t=5U$xK~S)8&x2-B`P2%MSm zIiCpE$2$oek}1x^!_Rp#Gzre83U&eN?rJ?Rnnl**B4+;T*g(qHRcXhn&d!dUc*)bc zO&qwN+4WML7w}4M!d0)(4>g+~XRbOYNNR-RCpByvr zz&vLF9Y!DGT*9%hAXO3M`A0hj;l|<4Q9KbUX_IkcK{ZctZL>`01&)x!vsWGaaQ|2* zL9*Wz$5ln*gA=@(K~P_3D$bwee4S(0;q14LNQ|E93{Z)bLaCb%dDol;l6L-3ZuQNE zGcP+Qi*+AI_-0|!9OoxYyh4w@1@*%O%2dyF-r?De;_3x<=yibK0Xf5*c~G+=v70o| z#5vu#*g1-^o5f{)>9kp{^D~}(S6rP%KtjHgfQ0X{YP>UrhzH*|;%M_1oNuzqWlqXl z-om;+c`MNme{zmvkYDV~VYgwFoBu`9Tm>&p!X0pP!ZoaY+Zn-25aIM_N{y^_p5WPC zOzqU3aGk=t$#*dLUFWYNyN^Xz>{BTBb}(rKWDKH%l7*L&XMk&qQ(1D}X$J2OXC8Y1 z*_)lsrS)%ytT5-;e;y~|uREQ=Jh342nh8X$FQ?<0gdVy>BU(b*54v(F{Wd5F9Lbhf zOKv+T;qbn57wlP;5(}QZC;@g|(JOFzrE`@;ku0-1qoB$vq+stLfr6y^=6p1y1PJ6O z$rMD3Jmw_3cECw??GeW9cb+A_T}yr(>=uP2a2V!F4sn2?KS6K|Bil-zWW_ge|8>*(oRYp zrfhe1pkVLIWcu}l^UnQ@J%+l+$&~bd$Em~_7o5RLO8PFk=JfL7Z}jO?sQx3lJ=8p= zrzuyQJxJ9=!16j^eZUhmw)`+EkpOlTv$%VYW@r@&D8r}Gbv`0sW1obNGwBgjR|uNm*U zKn!;GV<%;2Yohq$Qi)Q;s+6PqPw8fG17{Mt0$n!*BDcDmxccHcw~H|Gc#Z2Uqod0+ zqFl4^6`kvWLL_?KAp@k3bN&4j4$Wd*n{c_^HItJQyGR*CKOfN4(U>AU*F2R#XKA)Q z2ek^vx#FK^59k9r<0?_3LLqf(BReK_a2+9KelO8h8SA3{g+cW+S0uFS;;MiRmtz!I z>v7Q%Py;&_IIJW#G@h)cYY5(rcfF<%7t-&D%$AxnA3_GX_T!Eu7ajH?G8D~vZIa8z zp{s+7;2=HZS;Huy8Q}`TxK1uQI!7GG210+JB}K=DUu&x%P|oEC<>F2ScKKH|r3_!` z?J_Cp1Wn;U*9uLby5w7;|aja{& z^sgX1H`UdgXD-NW8hQs@`@@=}E8BI0BM>hAd?5Wo!EDz^r959I$bJ!|!I%qB# z(rIFdJZ`&}!Oj9#f2lFQGuBLMj*UFNUDB9&pvINB6?c}q2JwW;mA$4N14Ya}lce^42Zq2cZpG|`Wf=3#lY>x`V%Va{i+TwWv^oU%2z zTf3w2bSpPSofLag%uwIPVvqvY2U4RFC=;4YT&Eh>GnGh-yRseR-Tr$C;o_F=hSIjB zBtJo!h;^UXt@Qb6*Apzi=lVf%V3h5kj!$+%=nf>o=qcO7_112?)Q$osmC=t_Wl*Mb6Pi-*y1}zlUsYz>TXHs_DG&r9i?2~j<=C*4A{St%AJxOXGk;RmqpvLaLiPvu>o#bFI?@puq zn7Y~(O01`U+6C0EPIy4>eu=RzQ2QXs1vP&r1!6O$`+|aXg`#SEKdcQ%wy}~U_NPca zE%JA=8|0mJb%42DEN)yL>z+ktFS6_!ysLK)QHV;)Fm3I{G&DuXlS=eEq{rwp1^)|{ejdOfoHuiC)SVNDx%3!=4QYHBzo-P0a~lTnS2XoH4i z_dP}ox6BGRF*Z`%#Ml@BsolaGVbe}-ib4iLts~+w{@K;tRUrgQXC0&jeF-0KgH37f zF5=*Qv-1P6KFuAOSBIT;GG8oHpoeYhM-?}j_@ z$zZpN_-c?B6#g@$@hUpkH&2O>^||r^6kd!x2Wb<+Uk;0F6W^+3e9IOs;#(3|Q8^s) z!oq1o%W!{1Cy$}7dw4Xa4UV`)6tJJ&Gr%{&oy$gIUGH$(Pw4o&9up?HPs&*ark{%J z%Ky6wu~0h8J%(jsdQId}D&TzhdKmwTdmS5%=@%l&y4CbinV|MWL`zBi$6)&9NJ1S_ zvLp7OhV<96XD#thI-$PO z{UOgLW5wt0WI7D8#!ZJoreMWscO)eoED@hv2>AZUbX;Ag`dI2TNaeAE)@MWd!j{oqZ#+pgts=uo9W_707#A)ey>? zhEIc(3E@>(9u`i!ohvJ%J6=5Fj%7rKtLPR!nE5B1L8mX=huJ&|!ooX2mRA{s{V%vR zO6ly+y~R+pHe!}Pg2c9093-!6K0z%w+wX_}yX;Uu5^q`1Ro_-`sMfjmi zxd_w4A|$_Nn46MeGUZ}S*F_M?_pe6nn#0-S5mzxcBs`Zqg^S@50HDmlbW_BB4iDaU zcVR3S&S~0ZLvF*U##mbK9>cRd$|1UG13c@Fh~psZuf$l$u!YlL%9LKH{+7n_;Ir^x zZ2h}?f|6&IQ%^YTaFb?Bl-|{{JB{LR30;p&ivFo{_ZJ4`Xiv7iIPRkMj%+%)qb-?i;hO49~2YE8~`_DY&JU38kjy0;YY; zT%cy!H8ACBrGlAhse#+k)C4ozEU~oGG$G9_OQE!^wEpjVXEZJQ{(qm(i?Qe2?cDR+ z=bn4k%j8K3&^Ko2{Ss}vMb|F|amI~jbjf(ZvObYzbkm)b7P0#K_3a5?M+y+nR}E!F z_v*f;iQRQeC227o+^2`RsXSd1L)nK7T5O#6>lV`Yy>(D9ma&5$=>Oy&P8PXt*CC9R zQR+6VR8~1uHH+5Wp@U=E5|+AC%jm@%-E8XNtFR|1Eh9_Cx3?%Wm`r?d7{>8htrNXW<@qsh=Cp zU)!=A;+-+Pvn#CI9BnIFJW)4Af|f4Duey&_yE>P%jBVP9H2OE)b7G)!%Kl0RQ*=%% zT_vRD5h`S5cuSkb${y5BhT5)imcEc?OxG>oet8ItZ$WKl>b~W%#=GON{q&lxdke9~ zEI_GuvFvAWS;%TX>?E_gTBL>!Z4(N+|1!pH($cu+bkPjS*f$ z9n0CLUB>b{X`zFTQoTww)3vWC{@x|v+#RJ_Lp3wCgT))D{CjiQ$BWid&1^0BznsDM)6r~r-n-Hz0el?pjC@axs*3}ld1~zDsak4x(ax<>tX1N zQthCs>3XB|PpZ?0Cv;^)Jc-7LSqzWCZ#AjACmuBr(ysiyoK{af&Zije$!fpHDx57Fa;<(t=yAHoA*n*MOp zJuEOr8{pemD@5P@rdy?eb70|N?HvlrKBS){@%_0sTm&;FX#*@JF2=}`jd}-LJ6$(B zoOYw7r2k$4{a-zjMIioO=YkFObhBsJcMVOy<9Q;|S&v6_yM#X^%lW0LOqb*IaWT*l z@JL7hPuam*Z9T&a z8blf8_?lSlc|9D;i?y%u;zR7(yN>VQWu46keZE zRfVpff@%x2Rbtf7S>s2#T9%-y_<{Ntp)PDZsKfpO`p>54 z2I;3u(h+JrEI^yJWvu)hWF5SLj-ubA)Ods!)%Mpxd3H>fDxhCd<8j?ld{?b>!^nG& z{(w?C{(Sv}=9KZBuA_p6j?-_D;C~24w4Z9n>#@rt_S)8YJMEgJ?~Sl)mh0>c>8U^u z>8YMo3{mAFL85LvKEBJb+{HrmHS%2G0G&4v+VaXz^*Jnimv#xQdsu&GZ1gGredJoG zeG#s$r?hFbxfnbcj)s95+E@kMy-&X?%;Ok%+yLI!X%=``+l8$kpvq+_Nu6Ql`plr^ zystlHt<%Gyp~*A)M(JCsNbOvK50CG-we$6mFV3()v34N)@w`5nb!)GWE4x*tVa=zg zWO}7Ue^0dZ9R)&KtYn-9ye#=^2qAZWrgu~4GJU;LYRB5Wq@Sof`_|xKTblopep}w*Ez>Op(fJx6V3TnU&$H{8w&ZPw7k-JmiwW~&Zl>X>ml(KEo0w)q+iJ1`B8tF zvNr0GK3AM5n$!9QJxp#>NWU2R#{4AY-OD?yFNbsEoBG?8P%AdB(&Z?qyk5Ufy!neP zaG$Cr71ipx31Yu0Nx!hhbviwp`mMh78Ww`I&xjA{SJqgm%cbl&+7gMasMIfF<&$*a zl;zq#;p3-&OuEFXhN@g_&UyV~Y|18mECY8_)4R3$&e76u)VNKz1}7j;mq6V|W2N?V z;+Q@oS_y|p)nzJOsO=;c!oxRG?KOez6{h`GdxBM-k5yCoJNi6$lj8IPEv$YMToe!f z6x)t;XY}>aa7+xCj9plElg>X0LJ^sg9w*cuf-s4p#MDEalzK4J1El zUcu2;D=84vv;b@BYWSYXKGVDOQLMoa|3nseQUiAUzizQqt}@_I9>?qM1 z(r^*x8Ybm~G;paYYj2n=X{fl`%mZw6hF>KqkrnSXJIQS@92ChBKTb#HSc_pqw3JL$ zpQI1O@uAZEKl&ika5R?3AO0x(0U%(vyC_P+9Frh^3xH z*+m*?YB&~D(9wWA0%^?kfaU-dRa$OQu=s9<-*D)3P34fy7DyuZb~jXTRitD#>|MRw z05(@*>L3W%j7fIGU#wwr*Lj=*wFIop_>KamC${!C6f1e0;&*)nEeLqE6F8*;rKd7T20Jrkkg+@>k7ytZ1|?hW;FBQD8s(!&J#q(ya5? ziN)%sEMv6cq|}C7`%Fs6q)9`g151qVx&oxvV6iUR+s5X<>!Cihk+ z#-f(ZEmPGoGspt;LR7NU@E~_4%-@H_^T*obGa=@GY#vN^ zt};xEk1=uoPM&S}>e~7Y>TagtIqFuNBJt5%_Zr@bQJUef zn0<{bN8!sHrOv|N^YycOBaLRlE|z^l`#L{-&xQTqfZ-65Y1jXt>nvo%w-wT@tiC~4 zFGNFvXb6K``YdgDFX+hXFX(!5UYQ}$_#=iF74Qa3*`|g4`k3K;?hRNxT=lu&l+>_O zyH_HpYVMMd_b_8X9Nxew19)s#E!A_W?m-#TdE zgV$jQb^IX(S%>O=Gw69B?bX3>{H)ubs-x}kMtokH(bqSClj0X^t*&L-X1fkC&nqERa2YMu~r;9rKS8@nox zh2Ls!x^bd%;6`WAO4aGc+ojmsi=Q_JEtK5M*dXGN)qRmbN%ss(+1NgZ%S><5(w4@F z3V1A6)a$_@+8Dtg`ZL!U7%AFi7{7tGlQlNeKx{M^AvVJ2ueTOK-N^=)8fVbFJmasBSOyx;#ws)6MK+sNR7HowgV~CpF%bqJ^YREZk`!m}C9>qXo}L0t=TZ!k5Xlk1Ib6tR=g ztl$=w+kgXn-Bx1?YnN>LnvVWtG)Z*FM&niqTFT>1OnQlq{vu#oISgvbJJQ?;fHXDI z(ccC9O%8vMj<-TxcJxnU8g<-dd|!dQg9COLE##;+ejY8&pzn32X4uZ21K#c5F~SD* z5c}R_`ir99H_CA_(Dzn{v$BinmDC!O;%Dx=HRy#{{VZ}sRYecqdeDf2z*M09aM*pd zs0JmhAEkyiZ->ELagl`<0hgQ zQ~x;W3A+Crf0?#K(-CAVWGM|sxRIool2-q06w4uus!4*6VCth8ZRyuvjA|5Y#T;%# z@PhO-+ug>5RFZ!f>;6WPfaGAF)DQ~<84KE&PVl6LB~=++X?Trs4bp<^Oi=I5rz^3h zXc$HJ@mGuW(Nc-LhOP_dR#Z2~G#?_zP*WW}<223W3Q28af{*1bGmU5M=d06M^#siz zma)1PF82G0jzB*^Jt+Qe_Qs7lvBU)kC8 zcAT`BNpnp|Rvu@y(x9HEDtHJo*B>fmi0WfPhA75df2qdOg#IREmtDf7OwA$sBF6-u zFWgHp#{3)(-ru%s$0|QJ59Is;ms0dI-%I0$o0i3K=RSROCu(Rg?SL3iZk~K2%HOi` z5Z(h?Epy|phr*TS=WwhZn6#QYk2Ae1LDd)_&2H9^Zhnv-<~lRaUmfAnJll{-Z%!~F zxy}lf+fR*T`jbqrMJvl)UbmkGCa62piHjCDPE{=s_`SH$G=;kZ<}Wo@(&p)=eR2Gj zi=T$`l|PCdn{67eetB2(AY!6_cMBN3Hpetnp?ncotzz10Rck8QVuFA2sAAJbss}%FB32~rnSpA@`M<}PrGE}+_I|l5a zRGVoY!AZB4Ww)~SVg;XfcG0Xwrl;Z%7o0yjx;@J~sY<18ea&SOoBNIG46BUSe8lFh zFa@P`R58W`SzDZ!QYM>^u(lraEiCzE(*Cd2E#l=CKW|_=@ROHgKUC`9ap0 z^avQHn02N_su%<^{}^_L%exm=lPjA|ifARg1l1d<#$iHY&b%Y077BKHhpDZ!iB+si zKsw%?CioO=W~EBQt%QZPkNf{=TdHel>M2tni4ymjevuFh9Qd^JVrJ`NYDpX4Gv#7| zv%u$_;X1P4G*zYS21C!?oZ^#c*kRM1l4|>#&LCo+ad6}rh~;>5CewXxIKEBR8BpR?4m>eZd6a-!{^{0ZiE3R>`%2@bvGS5%$YffFXLw3G5DqXj=QjuOYE zU992{(`c5rSgqk`F5*cKOFuAo;|O+V<*%8hu%lf}lPT{z)620^HB0>w{&VGr%|jIQ z`cJ0el2pTrU8Vsv=mP&l_ON1~$xZ%CrjNMWUPYlsPemp}FQi($VnV9Ly;OXG%Nz}V zCOl6|CG%iaOg7@W!wC{FH)IUi4eZ}#sZP@@%8@P25ar=CuVnsY^GC>Z7+7hZ$xif8 zx1l8|<_DtT!dKJJl*RJS!V4`Y-HdPe1J<>*We>}KP~&I2A4`C#e4pvFYjVsSD(`CX zi-~_o^+lEdWY4=y9cWHF^Wzc%dZnf2``H_MOD@ZM!myAAXw4c`On~Q-6dYS!Y zEun^jm+JpF^OPQy-wzM$-%8b1o#Hd_jT(UdsOr4V2f#@ES~CKGQtD3Qxle zuQt~#|_c|cRZCDA=n@-4_= z?8g5+GCT~_U$FY#>NJ+O(eeiE%Q1I}mX5H(d1@RShnR72JjxmebwxVU;pUg(l)dnR za4kSj^Q^K#hQw=Aze9pmOns`ld$1>GkFk8s-piTdv5kF$Jz}E1iDZ}WW$tvX9Rtb6 zu?_c`b9vfD_3=n(&loe9;8!elhv_iMmn{piV0S};n%ddm6R!$-xGKx1^!X&SgQq`? zDKKO2sK-r3npOA?FIaHYD0i#c(RUA-5zq}aTw62relyMZoKLdc#EiDAZ!Bcqy}xVP z((>76xOIHP>es3Vu@aNoKpERj`|viNFux67z5Jg#LzF6z&7*`I`7O)U8FKi0`<$w$ znBm5U4`;DJ>I~)oj=C&mxnUh)1KBLWeXnu7t`+6j3=c%MGyeX1Nn4kgq5eD@*4x%? zGp~Uu(yT^W_eXIG;xFw7l2R?;s(Hsud%)H-nkP8)M=E@pZ~a9}Za{$ng;-vGjtUo` zoHAxx`YHGx2Hi!J`aBgb6wo3|2mxXjEoV5ifeOobUzNY5_Y}*CiZ+^$DtRFA56*wT z+}Vl*w^%4YK_lIpYovSdt;fn&`}g>RXZ}f*m;lZswa=;tQpN@t!Puzj7Cm$BHXoKQ zuu`{aB$Yg6E`ZlWGcX>G#zj`@HyvknUa+q9C(Lj}-q86;%Gzg!ZtoXX-%7m;`Tq^G z5D$9T(v4<)V17zM_CqO41HDLrX%yvsWX3M^8x>vvhb>#yzAb04gQef8@RGS7R>4mR zEd>tr%n|cU1%iTew;1kZQ<|7n^j=d-D+N85ZIC5C^f2i%%iV4egTsJyewyYns{7ik z=W)Tgy9|r2VemLqFd=mb{dn5kOp^YjLX`zWpKafagt72BLn?4&1GlS;=YD zC+xr@2`(xcV+z-arivJY14g<(&7VqA469HX9%jyF=B{OP471r+&CKs_Ral}G@cJw6 zVwtC)>Smg3X>myxaJDGi&s7}Yz{-v09IT4vY6tz5V2Rf<1Jmxq*@uU4jzdi-$mgcW`>EXJE}V zKg5>xvOG@D7%j>;sV|i}EK{PDI4Q-au*PE3oh;>bd`s7G7i8m##rRZKIMF=d8Uc4g z>-DQCmQ8J9#$w!P`HI(R!V0IDA;EUAKyQPKOw5K=Wy=k=|KcL|NjzZKZa8r>joquf zLn!%nCERw6os_fcd(8QS2|N=Q(~t8Mk;xD|xA6O}Wyqc%Is_ z_4m%`r}rq!E*=Oh4eq*~AG$sf+;0G@TyKJIF)F?-%WGvd@{?8xYgiIJh!VzHSez1` z7{A8fxQ;oVE(yDReETk;>kSeWdCkxzov*bR`IZr{r{W>zU$B(+nf4L%kv$~n{0j3d z?V{QG6&7Sc+1mLTUeCyCLWVSI9<=-rCz+}7g4rqY;XdXYdAx;{TGd|K^}eNt0=8*G zNc3%`#>?i-P_SQBiLwm=LtlomU*L^wNG)zaw9FFAyF71Q=_7C`#l|!Tr*XTX?%I3b z&Jh{Lm47vc6g!lzPsTCQ>!CGzkI9ln$XkDpr zr}+h#^(xGZ*&A*NnijG?x0}Y3yvhuAS}@ZxP`qa(0o!Xn z$#NE{)sVU@Y0*-E@|Eg&68j_9w2U%-v7F@T^bQVH!yi8{&r~m3^++A4? zqL>cW1@SS6EQUmb`^)IF?pCX$L zNVg5K?&MC5jeaYxtsHLM8;8t#F?rTf6%PhppAC1+Zhv>hO7=hx$dl|->j~CV3guns zZZvcGtnbrDldQW`N<{Rn9mX3G#&;={_n^YPRQZh+=ELf?>FdN6cc0fSdvEoQdH$fT z8EI!*Gu6@v8W^%xDtH)c{5W|2SmF7z#JZOaOt4kaUq7ZT5ew*kminRfJk`Erl_kvQpMymX&EAS5!=1T+KN@ySap=N*xIO2LJt@}k!ptUtIQTHwN6#Q z->_!5ty?s^@)NGO%edP%pJkk|rt@_)iPhX~%VRChTLUbwuPuQp%dLZ>rOB*xr45-j zS6MH`Aupk8ofRL_1k^8JrG?E}TsP$KO6%*~5izxG`gu(J1H1s!1W`RT2$D$FQTin(*4=3sdlej3Yj%9qGrsg>d=I}W@5^j&=O;(wDd}Xax zN^`=a@;8RifvEVoRP+U~VA-jy#q&H?`a_zXRgY|wLfwAgYpj@6J#1}CIVHB9IByNJ zi3BC_k5cWqG@K^+c$6~2_O|#|9z!~_wA=X$veHABtuLsgJY;OPol_`_FxKM~*kFa$ zCp$x9rJN_NEkv6qSn2k*&8g&w6^CUkml@L56kENL2P|*PxJFgNYB?aKpqG#`S{F54 zq#RDMvA3RW;bqw^Y&36psAp7E@{mvu{N{!NNaia3m;5hy^6jB))af09J9l!|5Vosi zd#E#hjUhOXC$|dSg5M?~xV0xIgpl1e>2k=0-?JeYh?2euW#YFk%#=)de z2&aUkqEIvZJ{W3>--#h)xJ?=x!i1CV3E@1HG%|#sj-){$2%bqjLpWw9bqK*Io8$>$ zttHt)^KcSOGK7@)Z5zUyO==NBR@ zPW;{(gheBMaFFkM1A~L{+b=i>zdeJw`0X6z+pRY^5Wkth0r+hfyaT_@g8lHD6zq$% z!|K0+w?n#U4Bm#{FN3}Cdnni)zaIs$8r1Iu@z&Mbg5B_28N^$U>ddeI{=akj@`TE$ z^RIl$DH);hxMI9n=zjcaLgSEjI7Jb{?2|8r#^Co{2sB9kGITF~4~9U43$iHwqvSlr>HfKo}(+q61-*)d-gKd0_@;;a$dS3hbSlwV-d-a0lErR!g zb9t}9`B!;F9NC{n&(DRe5d~+`N?@hd+MvN7YJ;sQDjqJg_uCFoyJ5DkfzE7eKe5G@ z!dt+0fK@JPWBMm11WZ;bp_Jy=XcBttfU`+g>^*RqMOTnivTcx57V{q7qCGurFmXUd zJ=JDmPGkBbto@(Xp>(;AZDw4|*qEsOA~y{ayq2>bs?M?1DpX6>WCh3I8trf>vfxR4 zo;>em{8DmVupWSa)44QQ@1o*gV7XtbGFa?HTOI|6+vf4O_55NR?tZ-6HY^T4u|6$!S{oC8a6vW)D@ z&kIVgVin1}s4=Y-w(JP|tYZb|tqWLfADe^CtFR7XIk($XyrWmB{9@W@sO>t~=Hd$U zI5mAAvbE&O?EG2$+P$Z>anP>$)GQ|+*CX8Xr0tbBB(%(R+TK7ik)gJF_D!~}n7xr; z%jL{$0Neb$ZJ@N4a@{s1Qs6DN{jPv-Y;JEG&c;h@I2*qXmTYTa886#ZbonJ4#qm22 zS88q`j)o4J|^nubxRYJ`p)pKvaC7zyr)ApdGd;`O6VkPUpX0HtvHyD=o z+n}@ChC9RfzuV!FW5dmGhit3kVy5t$%EgNY4$WD?F`Hhsd!;)#nJ)ky*GXR-1JzVJ zR>cP=;Zl#VUhz77x0!Wp-alR{WVuc36JuM2=C=tJup0cg z^1Y?m!KrYNwjWUL1%~f4>4O$X-jHrT4W%`uuFX7;Fs?7$;gi>gII?H1r?kt?fkIN) zPpMU+LS3Z7N0hon08T{!A5-e~Oh_;7ZT3@=1a0&#QT#)sxE29g0N_$q_iFY>lPr9C zQSk>U^_@)IB$M7OOSpl?f5KAV&xCougB|95cz&+1XR!l4ye@j~eYp@PpYgI?d`s~9 ze3=*B=5^ufRoP1NMi&xCPLx|Sxu-pe8njunM8(6nEY#JT3JzzM!0l#$y(zASwI3<# zVMnOcZFUbbQXYIA9aSF5w6p9t>>3<_GBXv#`r0Q+5>(l5@KFY1l*(N$Ema$Ogd96!=#h5-xXw;ciBIazGTu^1&p+J+o7L6#>(&K72Da{ zvGQ%18d{KNpMk5WS@{FrJlZi|?ghod7p^-+uV1l>xprjZIO$HLd8Kl$L=R7}Kg|Qt z8+T^n7PTFjz;2VQVdoz7Hen4mKKNn`j!UQ_J=C%C|9KGtR$xa6SUszGNe0qNOp=a1 zWQWc7YdD?raVx~QKSWxcWaW_y(y7{ynZj;|KX|3FXc3*J?6f|mqeYGT= zVdV^6*S2&f(tF$G4$vCvoh~}MkdF%&>=$_#yF|w-cbGcgv+@-jn;Q96TDHVKj>ona z=gV4F^p2cGLte5YV&(_t>fyD}pX*(4IhMQG6WH$i++2HLW z0Ou$$7662%dp~36?pLVG4$F{AqTyLQ0K+)RH@r{JMm8qqm+T7!wNAVIZvY+lz$ZbUJM5dkV%4UBpcAubSG4gRP zy(J_ePm2>-*KLj%%CI=FS0uC2H=P}+(6no$X%pJL*3FHT9UbY^y1VaH(JGBq1$@|_ zI`c8pS$@Eg&K9(nr@h6f){-&v0kl(jqix|}y8MPTJe8t|3m6+uM zR%dZEr4@Y~W1=P8>9mUvmeI%Iq#rZo`C_mZ>|mA*sw8?}k*J?b&JuHP$%;2Rv+1vQ z+&FNR-|oOwQNtXYlu$c|+1uR?u(vjxz3rCh?R-Zz(oWvU+Y;LSgSREL{|9eN$hgYe zra8ddwEy633A&r`HkfB`C; zoAv+ZZ3$34-<-F>zViRd+Y%iA!P{PTdf=GOK9 zW^M`H{=wW5vj2m*B?SJ#+!DGoFt^FDhdLHUOFeGJ*b;jFgRv#_iZHgAOfa_I|H;@A zkoNN5j4h$hjf^ef_J1(8guee^Yzh5tU~KI&v4!`)8DmSh;|9iN$^>H@a5Ki1fGcMH z&DauPJoqQY$I>V z*l<1gHO9s-mU&9>#Mi+SbB^1=M4yc?(NX_qZTI{)Ya4wt)|U4#)|P)$)^_iIv$p&G ze^}d?o3ggC*R!^9{}*e6lKm#EZT!ty+k~64wuv`oZ4dmLwJpzt+wUaW{l2@Yf?BT3 z{9cJr|MrL6_0g#W$Dd8%=K^YfOg!7d&xI`CikDQN$SQ%qf&w|!YQJ(N z(C#gnJrVa$?N5oy?r`M?sr?!8><>RrM;1x(+%fz-g9YwYq_J|PQ^g9JWIe+wPouBe z2Dc0Zx`yjKMC~uQUyx||`^)Hl z4^#1G-o*Kuoomz+pm5*DD|T}t2~syFv`0}1k1*+0r-$Wy=#8VP)8*1=mQx+>b~ZwB zc2hpCX23Z}s-%-7cd1>7r(J zxaMNYpDCXAhM&t=RjwVeh^I4k)Uekz64$8M-CwhjZ-!B2RP1m^D=2P&^Rfib*wPw1 zWR2OLS}e&Aye;?$OPT8fC>8D~@@xX|V{eN%0AGNI8gmVF`l$M2Z#H~VUiCDkwIL5o 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 delta 60284 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

<~JXVTx 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 Iyp4qa1FX_Rwg3PC From 104e225074958e98324c97e0d3f279dc11a3b3ac Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 28 Jul 2023 21:38:50 +0000 Subject: [PATCH 02/41] Fix doc error noted in [forum:/forumpost/11fc7308d5e607f2|the forum] and a misspelling. FossilOrigin-Name: 6b79cc7dd07d41da6034386b39c0dff32f80a977db42a9602330ffd15706ab9b --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btreeInt.h | 2 +- src/where.c | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 47c84d0c9c..7b7061bb38 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\sthe\ssame\sJSON\sparse\sto\sbe\sinput\sto\sboth\sarguments\sto\sthe\njson_patch()\sroutine. -D 2023-07-28T20:59:25.746 +C Fix\sdoc\serror\snoted\sin\s[forum:/forumpost/11fc7308d5e607f2|the\sforum]\sand\sa\smisspelling. +D 2023-07-28T21:38:50.424 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -584,7 +584,7 @@ F src/bitvec.c 9eac5f42c11914d5ef00a75605bb205e934f435c579687f985f1f8b0995c8645 F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 F src/btree.c 7a37bdf09f338561880860681cb03499a60c3bb0869e539c58bc1d2cdd705ff2 F src/btree.h 03e3356f5208bcab8eed4e094240fdac4a7f9f5ddf5e91045ce589f67d47c240 -F src/btreeInt.h 3b4eff7155c0cea6971dc51f62e3529934a15a6640ec607dd42a767e379cb3a9 +F src/btreeInt.h 91a9e0c41a0e71fa91a742ec285c63dd8dcb38b73d14fae0ed7209174ff0fdc1 F src/build.c a8ae3b32d9aa9bbd2c0e97d7c0dd80def9fbca408425de1608f57ee6f47f45f4 F src/callback.c db3a45e376deff6a16c0058163fe0ae2b73a2945f3f408ca32cf74960b28d490 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e @@ -728,7 +728,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c dd843f619ac60d5dadab7109cf402432ba74dde0c301505fd1c202add07659e3 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7c7ea0115345851c3da4e04e2e239a29983b61fb5b038b94eede6aba462640e2 -F src/where.c 477fcc5e561ef169e6002499602af6b805156c2aae6b2f5c2c93ef8c1cd64768 +F src/where.c 6041f3cae99d6f4c4da7ea094508317900fcd61195fe4292e55ac4531650e70a F src/whereInt.h c7d19902863beadec1d04e66aca39c0bcd60b74f05f0eaa7422c7005dfc5d51a F src/wherecode.c 5d77db30a2a3dd532492ae882de114edba2fae672622056b1c7fd61f5917a8f1 F src/whereexpr.c dc5096eca5ed503999be3bdee8a90c51361289a678d396a220912e9cb73b3c00 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0443c0ef85f8f6f3efdee68bf59126c9459f08a58458756f8cbeeaf043d43a86 -R 27732baf0d0d9b30551bea552c6f65a9 -U drh -Z 335a5ef6b8de7fa701a34944faa875e0 +P 8e781c6742792b3899ca60efc49c7eaee1df9f6b03d27c254b0e148b82946e19 +R 726de7687ac63a00c396fd2bbb8e8024 +U larrybr +Z bae19853764498aed46e03fa43d06926 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index fb83faf367..57970d4e93 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8e781c6742792b3899ca60efc49c7eaee1df9f6b03d27c254b0e148b82946e19 \ No newline at end of file +6b79cc7dd07d41da6034386b39c0dff32f80a977db42a9602330ffd15706ab9b \ No newline at end of file diff --git a/src/btreeInt.h b/src/btreeInt.h index 3e69206193..26a0bc6869 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -180,7 +180,7 @@ ** 0x81 0x00 becomes 0x00000080 ** 0x82 0x00 becomes 0x00000100 ** 0x80 0x7f becomes 0x0000007f -** 0x8a 0x91 0xd1 0xac 0x78 becomes 0x12345678 +** 0x81 0x91 0xd1 0xac 0x78 becomes 0x12345678 ** 0x81 0x81 0x81 0x81 0x01 becomes 0x10204081 ** ** Variable length integers are used for rowids and to hold the number of diff --git a/src/where.c b/src/where.c index 35b9056ffe..5476e09f07 100644 --- a/src/where.c +++ b/src/where.c @@ -2535,7 +2535,7 @@ static WhereLoop **whereLoopFindLesser( /* If pTemplate is always better than p, then cause p to be overwritten ** with pTemplate. pTemplate is better than p if: - ** (1) pTemplate has no more dependences than p, and + ** (1) pTemplate has no more dependencies than p, and ** (2) pTemplate has an equal or lower cost than p. */ if( (p->prereq & pTemplate->prereq)==pTemplate->prereq /* (1) */ From 0c6b869263a0eb3514438328dcf989c3bd1f1821 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 29 Jul 2023 15:31:48 +0000 Subject: [PATCH 03/41] Enhancements to the new sqlite3_stmt_explain() interface implementation and documentation. FossilOrigin-Name: dc98ac6b6de27fc096a715e650067154a545709cf1eecd6c2722ab30a91c2d1d --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/sqlite.h.in | 10 +++++----- src/vdbeapi.c | 13 +++++++++---- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 7b7061bb38..1e7e22c8aa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sdoc\serror\snoted\sin\s[forum:/forumpost/11fc7308d5e607f2|the\sforum]\sand\sa\smisspelling. -D 2023-07-28T21:38:50.424 +C Enhancements\sto\sthe\snew\ssqlite3_stmt_explain()\sinterface\simplementation\sand\ndocumentation. +D 2023-07-29T15:31:48.717 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -645,7 +645,7 @@ F src/resolve.c 37953a5f36c60bea413c3c04efcd433b6177009f508ef2ace0494728912fe2e9 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 3328b8c758016b400a4fea053ab1f5927929083a49d0c3921802ce99eea73cde F src/shell.c.in 694aaf751f00610381533d4a31c83d142cfc83ef91ef65e2aa6912ace7c39b40 -F src/sqlite.h.in 7b95e5b11914726ebcf95c633be3341ad2cb3c8aac62ecf188a14f74827aa68a +F src/sqlite.h.in 7b07a33d2af82ee974aa91e6294abce0282b2f4c5934b291d2fff961810dd867 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h da473ce2b3d0ae407a6300c4a164589b9a6bfdbec9462688a8593ff16f3bb6e4 F src/sqliteInt.h 6140eb4058d995f3004ee2732fa098b884f26eb497a7fbb3a51c781ec824d14b @@ -716,7 +716,7 @@ F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104 F src/vdbe.c cd0396758da6a95e6c4e3bec7c3d6e767c3b39930c295c2425f83bb086cdc6ba F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0 F src/vdbeInt.h cd829ff67fc18aff2476fe3209262ba8671cb43d51cb6913de4a670e37d2fbe3 -F src/vdbeapi.c 0cba9fe6e860e46bfb5e45a76a8c2c6ccd5ebc8f954319e4288e7793c2eca88c +F src/vdbeapi.c 9e2cf049520538d5b8c32fa02c6f86d7de071a0f64b91e7fbbc4be06e5d85d91 F src/vdbeaux.c a586f445945eef6ad1fcd7c94f700faa1baea93c0dbd446291c7cf65966c8470 F src/vdbeblob.c 2516697b3ee8154eb8915f29466fb5d4f1ae39ee8b755ea909cefaf57ec5e2ce F src/vdbemem.c adb5877dc54330865e45e0fba50f6455c1d9d8b83434c59f0e3d2d2a0b9f0e58 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8e781c6742792b3899ca60efc49c7eaee1df9f6b03d27c254b0e148b82946e19 -R 726de7687ac63a00c396fd2bbb8e8024 -U larrybr -Z bae19853764498aed46e03fa43d06926 +P 6b79cc7dd07d41da6034386b39c0dff32f80a977db42a9602330ffd15706ab9b +R 932a6dd698d56b649f44c578c3f5de84 +U drh +Z 15a9457f316519b6a6f6cea14f587e52 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 57970d4e93..106dce0eb3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6b79cc7dd07d41da6034386b39c0dff32f80a977db42a9602330ffd15706ab9b \ No newline at end of file +dc98ac6b6de27fc096a715e650067154a545709cf1eecd6c2722ab30a91c2d1d \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 668cfa54ba..2af549af21 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -4426,10 +4426,10 @@ int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt); ** METHOD: sqlite3_stmt ** ** The sqlite3_stmt_explain(S,E) interface changes the EXPLAIN -** setting for prepared statement S. If E is zero, then S becomes +** setting for [prepared statement] S. If E is zero, then S becomes ** a normal prepared statement. If E is 1, then S behaves as if -** its SQL text began with "EXPLAIN". If E is 2, then S behaves as if -** its SQL text began with "EXPLAIN QUERY PLAN". +** its SQL text began with "[EXPLAIN]". If E is 2, then S behaves as if +** its SQL text began with "[EXPLAIN QUERY PLAN]". ** ** Calling sqlite3_stmt_explain(S,E) might cause S to be reprepared. ** SQLite tries to avoid a reprepare, but a reprepare might be necessary @@ -4437,8 +4437,8 @@ int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt); ** ** Because of the potential need to reprepare, a call to ** sqlite3_stmt_explain(S,E) will fail with SQLITE_ERROR if S cannot be -** reprepared because it was created using sqlite3_prepare() instead of -** the newer sqlite_prepare_v2() or sqlite3_prepare_v3() interfaces and +** reprepared because it was created using [sqlite3_prepare()] instead of +** the newer [sqlite3_prepare_v2()] or [sqlite3_prepare_v3()] interfaces and ** hence has no saved SQL text with which to reprepare. ** ** Changing the explain setting for a prepared statement does not change diff --git a/src/vdbeapi.c b/src/vdbeapi.c index cb631413c4..0c45edea58 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1863,11 +1863,16 @@ int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt){ int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode){ Vdbe *v = (Vdbe*)pStmt; int rc; - if( v->eVdbeState!=VDBE_READY_STATE ) return SQLITE_BUSY; - if( v->explain==eMode ) return SQLITE_OK; - if( v->zSql==0 || eMode<0 || eMode>2 ) return SQLITE_ERROR; sqlite3_mutex_enter(v->db->mutex); - if( v->nMem>=10 && (eMode!=2 || v->haveEqpOps) ){ + if( v->explain==eMode ){ + rc = SQLITE_OK; + }else if( eMode<0 || eMode>2 ){ + rc = SQLITE_ERROR; + }else if( (v->prepFlags & SQLITE_PREPARE_SAVESQL)==0 ){ + rc = SQLITE_ERROR; + }else if( v->eVdbeState!=VDBE_READY_STATE ){ + rc = SQLITE_BUSY; + }else if( v->nMem>=10 && (eMode!=2 || v->haveEqpOps) ){ /* No reprepare necessary */ v->explain = eMode; rc = SQLITE_OK; From 5d800cdb6eb8aa078bd865b33fe5ec1e279d0abd Mon Sep 17 00:00:00 2001 From: stephan Date: Sat, 29 Jul 2023 15:53:53 +0000 Subject: [PATCH 04/41] SAHPoolUtil.importDb() now accepts either a byte array or ArrayBuffer. FossilOrigin-Name: 3848f04e542e2f0f8975e82632af598aac3b60312bd244b0472f7ddf1dda77df --- ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js | 18 ++++++++++-------- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js b/ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js index ee8d1a5d68..3ba889c393 100644 --- a/ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js +++ b/ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js @@ -865,6 +865,7 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ //! Documented elsewhere in this file. importDb(name, bytes){ + if(bytes instanceof ArrayBuffer) bytes = new Uint8Array(bytes); const n = bytes.byteLength; if(n<512 || n%512!=0){ toss("Byte array size is invalid for an SQLite db."); @@ -1074,16 +1075,17 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ Returns an array of the names of the files currently allocated to slots. This list is the same length as getFileCount(). - - void importDb(name, byteArray) + - void importDb(name, bytes) Imports the contents of an SQLite database, provided as a byte - array, under the given name, overwriting any existing - content. Throws if the pool has no available file slots, on I/O - error, or if the input does not appear to be a database. In the - latter case, only a cursory examination is made. Note that this - routine is _only_ for importing database files, not arbitrary files, - the reason being that this VFS will automatically clean up any - non-database files so importing them is pointless. + array or ArrayBuffer, under the given name, overwriting any + existing content. Throws if the pool has no available file slots, + on I/O error, or if the input does not appear to be a + database. In the latter case, only a cursory examination is made. + Note that this routine is _only_ for importing database files, + not arbitrary files, the reason being that this VFS will + automatically clean up any non-database files so importing them + is pointless. - [async] number reduceCapacity(n) diff --git a/manifest b/manifest index 1e7e22c8aa..30382b566c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhancements\sto\sthe\snew\ssqlite3_stmt_explain()\sinterface\simplementation\sand\ndocumentation. -D 2023-07-29T15:31:48.717 +C SAHPoolUtil.importDb()\snow\saccepts\seither\sa\sbyte\sarray\sor\sArrayBuffer. +D 2023-07-29T15:53:53.903 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -507,7 +507,7 @@ F ext/wasm/api/sqlite3-api-worker1.js 9f32af64df1a031071912eea7a201557fe39b17386 F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89 F ext/wasm/api/sqlite3-opfs-async-proxy.js 8cf8a897726f14071fae6be6648125162b256dfb4f96555b865dbb7a6b65e379 F ext/wasm/api/sqlite3-v-helper.js 7daa0eab0a513a25b05e9abae7b5beaaa39209b3ed12f86aeae9ef8d2719ed25 -F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js 44740935f6eeab3a0c6dc9f0ca93aebb6339f8d8365f03ea6d7808c134dbfe46 +F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js 54cee22aacadb9dfaea438d72ac0882249d028c37903208d48c52871290ceff7 F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js e7a690e0e78ff4d563f2eca468f91db69f001ff4b79c6d2304cbb6f62dca437d F ext/wasm/api/sqlite3-wasm.c 8867f1d41c112fb4a2cfe22ff224eccaf309fcdea266cee0ec554f85db72ef0f F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js bc06df0d599e625bde6a10a394e326dc68da9ff07fa5404354580f81566e591f @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6b79cc7dd07d41da6034386b39c0dff32f80a977db42a9602330ffd15706ab9b -R 932a6dd698d56b649f44c578c3f5de84 -U drh -Z 15a9457f316519b6a6f6cea14f587e52 +P dc98ac6b6de27fc096a715e650067154a545709cf1eecd6c2722ab30a91c2d1d +R 3e26d7f7d670cd4a8283ab0fe765ef37 +U stephan +Z adbef7df6499ec1443cd0eb0845e21bc # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 106dce0eb3..048f970702 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dc98ac6b6de27fc096a715e650067154a545709cf1eecd6c2722ab30a91c2d1d \ No newline at end of file +3848f04e542e2f0f8975e82632af598aac3b60312bd244b0472f7ddf1dda77df \ No newline at end of file From fb546c0bf4ca0fcfc452e5eaffb50dce6ed029a4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 29 Jul 2023 17:05:35 +0000 Subject: [PATCH 05/41] Simplification to the sqlite3_stmt_explain() implementation. FossilOrigin-Name: dd5eb4c7f71c658aff8c2f11ff163c5e79f0ebfd49fd13ca8e28381fe63cc82f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeapi.c | 3 +-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 30382b566c..6986817d2d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C SAHPoolUtil.importDb()\snow\saccepts\seither\sa\sbyte\sarray\sor\sArrayBuffer. -D 2023-07-29T15:53:53.903 +C Simplification\sto\sthe\ssqlite3_stmt_explain()\simplementation. +D 2023-07-29T17:05:35.577 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -716,7 +716,7 @@ F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104 F src/vdbe.c cd0396758da6a95e6c4e3bec7c3d6e767c3b39930c295c2425f83bb086cdc6ba F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0 F src/vdbeInt.h cd829ff67fc18aff2476fe3209262ba8671cb43d51cb6913de4a670e37d2fbe3 -F src/vdbeapi.c 9e2cf049520538d5b8c32fa02c6f86d7de071a0f64b91e7fbbc4be06e5d85d91 +F src/vdbeapi.c f37822f215740ede2a8fcae99bc13f2cc3a72dd0e1d22b81b9298c5ca67dbc38 F src/vdbeaux.c a586f445945eef6ad1fcd7c94f700faa1baea93c0dbd446291c7cf65966c8470 F src/vdbeblob.c 2516697b3ee8154eb8915f29466fb5d4f1ae39ee8b755ea909cefaf57ec5e2ce F src/vdbemem.c adb5877dc54330865e45e0fba50f6455c1d9d8b83434c59f0e3d2d2a0b9f0e58 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P dc98ac6b6de27fc096a715e650067154a545709cf1eecd6c2722ab30a91c2d1d -R 3e26d7f7d670cd4a8283ab0fe765ef37 -U stephan -Z adbef7df6499ec1443cd0eb0845e21bc +P 3848f04e542e2f0f8975e82632af598aac3b60312bd244b0472f7ddf1dda77df +R e759fdc886a125e6d3d4d4dcc3b27f36 +U drh +Z 8ab9c0b6287b81d079ea01ec27d5783d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 048f970702..7b9e2b1b5f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3848f04e542e2f0f8975e82632af598aac3b60312bd244b0472f7ddf1dda77df \ No newline at end of file +dd5eb4c7f71c658aff8c2f11ff163c5e79f0ebfd49fd13ca8e28381fe63cc82f \ No newline at end of file diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 0c45edea58..cc58e7a877 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1877,10 +1877,9 @@ int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode){ v->explain = eMode; rc = SQLITE_OK; }else{ - int haveEqpOps = v->explain==2 || v->haveEqpOps; v->explain = eMode; rc = sqlite3Reprepare(v); - v->haveEqpOps = haveEqpOps!=0; + v->haveEqpOps = eMode==2; } if( v->explain ){ v->nResColumn = 12 - 4*v->explain; From 808cf29b5530f42daf3f15effa91a9ebaf0e5894 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 29 Jul 2023 20:13:19 +0000 Subject: [PATCH 06/41] Fix a buffer overread in the fts5_structure virtual table (test code). FossilOrigin-Name: b837aff79cd159061b46af59eaf96a1a1920eeece27e9e27931cf3387068d96a --- ext/fts5/fts5_index.c | 5 +++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index e46840c2e8..6ea9d9f88f 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -8092,15 +8092,16 @@ static int fts5structCloseMethod(sqlite3_vtab_cursor *cur){ */ static int fts5structNextMethod(sqlite3_vtab_cursor *cur){ Fts5StructVcsr *pCsr = (Fts5StructVcsr*)cur; + Fts5Structure *p = pCsr->pStruct; assert( pCsr->pStruct ); pCsr->iSeg++; pCsr->iRowid++; - while( pCsr->iSeg>=pCsr->pStruct->aLevel[pCsr->iLevel].nSeg ){ + while( pCsr->iLevelnLevel && pCsr->iSeg>=p->aLevel[pCsr->iLevel].nSeg ){ pCsr->iLevel++; pCsr->iSeg = 0; } - if( pCsr->iLevel>=pCsr->pStruct->nLevel ){ + if( pCsr->iLevel>=p->nLevel ){ fts5StructureRelease(pCsr->pStruct); pCsr->pStruct = 0; } diff --git a/manifest b/manifest index 6986817d2d..5734a3a0ae 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplification\sto\sthe\ssqlite3_stmt_explain()\simplementation. -D 2023-07-29T17:05:35.577 +C Fix\sa\sbuffer\soverread\sin\sthe\sfts5_structure\svirtual\stable\s(test\scode). +D 2023-07-29T20:13:19.050 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -92,7 +92,7 @@ F ext/fts5/fts5_buffer.c 3001fbabb585d6de52947b44b455235072b741038391f830d6b7292 F ext/fts5/fts5_config.c 054359543566cbff1ba65a188330660a5457299513ac71c53b3a07d934c7b081 F ext/fts5/fts5_expr.c 2473c13542f463cae4b938c498d6193c90d38ea1a2a4f9849c0479736e50d24d F ext/fts5/fts5_hash.c 65e7707bc8774706574346d18c20218facf87de3599b995963c3e6d6809f203d -F ext/fts5/fts5_index.c a4e35cd126c19df66887801db15ccae7290b51129add3d4cdd31e2d9ea240398 +F ext/fts5/fts5_index.c 9f7a24e206072b9deda2b9b6eec8d162128486d1dfad2ada92116faecc623cc8 F ext/fts5/fts5_main.c 2f87ee44fdb21539c264541149f07f70e065d58f37420063e5ddef80ba0f5ede F ext/fts5/fts5_storage.c 3c9b41fce41b6410f2e8f82eb035c6a29b2560483f773e6dc98cf3cb2e4ddbb5 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3848f04e542e2f0f8975e82632af598aac3b60312bd244b0472f7ddf1dda77df -R e759fdc886a125e6d3d4d4dcc3b27f36 -U drh -Z 8ab9c0b6287b81d079ea01ec27d5783d +P dd5eb4c7f71c658aff8c2f11ff163c5e79f0ebfd49fd13ca8e28381fe63cc82f +R 0b6893e373afada2996a2e53d25def3d +U dan +Z f4778f5c18f1cf158f159587c61f699b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7b9e2b1b5f..bf918f42e8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dd5eb4c7f71c658aff8c2f11ff163c5e79f0ebfd49fd13ca8e28381fe63cc82f \ No newline at end of file +b837aff79cd159061b46af59eaf96a1a1920eeece27e9e27931cf3387068d96a \ No newline at end of file From e809d84618287b24129d414e6c5878959cdb89d0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 29 Jul 2023 21:22:26 +0000 Subject: [PATCH 07/41] Do not try to apply MEM_Term to a MEM_Ephem strings. FossilOrigin-Name: 2a378a66783ce4d749f7e1e7d08d8404a4aa78d47aeeefd6794b6753188438f6 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbemem.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 5734a3a0ae..f39e41535d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbuffer\soverread\sin\sthe\sfts5_structure\svirtual\stable\s(test\scode). -D 2023-07-29T20:13:19.050 +C Do\snot\stry\sto\sapply\sMEM_Term\sto\sa\sMEM_Ephem\sstrings. +D 2023-07-29T21:22:26.271 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -719,7 +719,7 @@ F src/vdbeInt.h cd829ff67fc18aff2476fe3209262ba8671cb43d51cb6913de4a670e37d2fbe3 F src/vdbeapi.c f37822f215740ede2a8fcae99bc13f2cc3a72dd0e1d22b81b9298c5ca67dbc38 F src/vdbeaux.c a586f445945eef6ad1fcd7c94f700faa1baea93c0dbd446291c7cf65966c8470 F src/vdbeblob.c 2516697b3ee8154eb8915f29466fb5d4f1ae39ee8b755ea909cefaf57ec5e2ce -F src/vdbemem.c adb5877dc54330865e45e0fba50f6455c1d9d8b83434c59f0e3d2d2a0b9f0e58 +F src/vdbemem.c 4adae4ed1ca8f82e2cfbbfb66c9b24fd9278441bc0809656acd0c42a3bb27a36 F src/vdbesort.c 0d40dca073c94e158ead752ef4225f4fee22dee84145e8c00ca2309afb489015 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c 57fa8f56478e5b5cb558cb425e7878515e0a105c54f96f1d1bbf4b9433529254 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P dd5eb4c7f71c658aff8c2f11ff163c5e79f0ebfd49fd13ca8e28381fe63cc82f -R 0b6893e373afada2996a2e53d25def3d -U dan -Z f4778f5c18f1cf158f159587c61f699b +P b837aff79cd159061b46af59eaf96a1a1920eeece27e9e27931cf3387068d96a +R 8ca856a21838d7a2395b37400d37c0e0 +U drh +Z 2764d4076490d073a4c18435dcd229a6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index bf918f42e8..9fe39e4607 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b837aff79cd159061b46af59eaf96a1a1920eeece27e9e27931cf3387068d96a \ No newline at end of file +2a378a66783ce4d749f7e1e7d08d8404a4aa78d47aeeefd6794b6753188438f6 \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index 07fb8feee8..1052bb2f64 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -322,7 +322,7 @@ int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ ** this routine is a no-op. */ void sqlite3VdbeMemZeroTerminateIfAble(Mem *pMem){ - if( (pMem->flags & (MEM_Str|MEM_Term))!=MEM_Str ) return; + if( (pMem->flags & (MEM_Str|MEM_Term|MEM_Ephem))!=MEM_Str ) return; if( pMem->enc!=SQLITE_UTF8 ) return; if( NEVER(pMem->z==0) ) return; if( pMem->flags & MEM_Dyn ){ From b47e1c78668f32f7786f0184955ce1ec10777ba6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 29 Jul 2023 22:58:47 +0000 Subject: [PATCH 08/41] Do not try to add MEM_Term to an MEM_Static string either. FossilOrigin-Name: 8920dcef1f75f578e3f274ab2b980a83d6ea6b761d99fc48410b26886170597b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbemem.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index f39e41535d..f738da07e7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\stry\sto\sapply\sMEM_Term\sto\sa\sMEM_Ephem\sstrings. -D 2023-07-29T21:22:26.271 +C Do\snot\stry\sto\sadd\sMEM_Term\sto\san\sMEM_Static\sstring\seither. +D 2023-07-29T22:58:47.914 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -719,7 +719,7 @@ F src/vdbeInt.h cd829ff67fc18aff2476fe3209262ba8671cb43d51cb6913de4a670e37d2fbe3 F src/vdbeapi.c f37822f215740ede2a8fcae99bc13f2cc3a72dd0e1d22b81b9298c5ca67dbc38 F src/vdbeaux.c a586f445945eef6ad1fcd7c94f700faa1baea93c0dbd446291c7cf65966c8470 F src/vdbeblob.c 2516697b3ee8154eb8915f29466fb5d4f1ae39ee8b755ea909cefaf57ec5e2ce -F src/vdbemem.c 4adae4ed1ca8f82e2cfbbfb66c9b24fd9278441bc0809656acd0c42a3bb27a36 +F src/vdbemem.c b4b34674eea99eaee7130f703b3a69c9bfdd749d1c5adfd3ab8af90aa11eed6a F src/vdbesort.c 0d40dca073c94e158ead752ef4225f4fee22dee84145e8c00ca2309afb489015 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c 57fa8f56478e5b5cb558cb425e7878515e0a105c54f96f1d1bbf4b9433529254 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b837aff79cd159061b46af59eaf96a1a1920eeece27e9e27931cf3387068d96a -R 8ca856a21838d7a2395b37400d37c0e0 +P 2a378a66783ce4d749f7e1e7d08d8404a4aa78d47aeeefd6794b6753188438f6 +R f7430bcd5e0c8931ae75dccc5f40b292 U drh -Z 2764d4076490d073a4c18435dcd229a6 +Z 9911052f3d11a2b100418fc49117622a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9fe39e4607..228ebea7df 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2a378a66783ce4d749f7e1e7d08d8404a4aa78d47aeeefd6794b6753188438f6 \ No newline at end of file +8920dcef1f75f578e3f274ab2b980a83d6ea6b761d99fc48410b26886170597b \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index 1052bb2f64..0f5117dad3 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -322,7 +322,10 @@ int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ ** this routine is a no-op. */ void sqlite3VdbeMemZeroTerminateIfAble(Mem *pMem){ - if( (pMem->flags & (MEM_Str|MEM_Term|MEM_Ephem))!=MEM_Str ) return; + if( (pMem->flags & (MEM_Str|MEM_Term|MEM_Ephem|MEM_Static))!=MEM_Str ){ + /* pMem must be a string, and it cannot be an ephemeral or static string */ + return; + } if( pMem->enc!=SQLITE_UTF8 ) return; if( NEVER(pMem->z==0) ) return; if( pMem->flags & MEM_Dyn ){ From f0c701c4109629cfbf35d55b708403807666c6fb Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 30 Jul 2023 03:54:10 +0000 Subject: [PATCH 09/41] Add tests for SAHPoolUtil.exportFile() and importDb(). FossilOrigin-Name: 4aa88b8fb1c99137ed7531e5c82a241738a2b0554f7af82c0ed0ce8d16a0879a --- ext/wasm/tester1.c-pp.js | 22 ++++++++++++++++++++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/ext/wasm/tester1.c-pp.js b/ext/wasm/tester1.c-pp.js index db4b50f4b6..c1b16d5e81 100644 --- a/ext/wasm/tester1.c-pp.js +++ b/ext/wasm/tester1.c-pp.js @@ -353,7 +353,7 @@ globalThis.sqlite3InitModule = sqlite3InitModule; const sahPoolConfig = { name: 'opfs-sahpool-tester1', clearOnInit: true, - initialCapacity: 3 + initialCapacity: 6 }; //////////////////////////////////////////////////////////////////////// // End of infrastructure setup. Now define the tests... @@ -3076,7 +3076,24 @@ globalThis.sqlite3InitModule = sqlite3InitModule; T.assert(1 === fileNames.length) .assert(dbName === fileNames[0]) .assert(1 === u1.getFileCount()) - .assert(true === u1.unlink(dbName)) + + if(1){ // test exportFile() and importDb() + const dbytes = u1.exportFile(dbName); + T.assert(dbytes.length >= 4096); + const dbName2 = '/exported.db'; + u1.importDb(dbName2, dbytes); + T.assert( 2 == u1.getFileCount() ); + let db2 = new u1.OpfsSAHPoolDb(dbName2); + T.assert(db2 instanceof sqlite3.oo1.DB) + .assert(3 === db2.selectValue('select count(*) from t')); + db2.close(); + T.assert(true === u1.unlink(dbName2)) + .assert(false === u1.unlink(dbName2)) + .assert(1 === u1.getFileCount()) + .assert(1 === u1.getFileNames().length); + } + + T.assert(true === u1.unlink(dbName)) .assert(false === u1.unlink(dbName)) .assert(0 === u1.getFileCount()) .assert(0 === u1.getFileNames().length); @@ -3089,6 +3106,7 @@ globalThis.sqlite3InitModule = sqlite3InitModule; log("Installed second SAH instance as",conf2.name); T.assert(0 === POther.getFileCount()) .assert(true === await POther.removeVfs()); + if(0){ /* Enable this block to inspect vfs's contents via the dev console or OPFS Explorer browser extension. The diff --git a/manifest b/manifest index f738da07e7..c38f4b9aa8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\stry\sto\sadd\sMEM_Term\sto\san\sMEM_Static\sstring\seither. -D 2023-07-29T22:58:47.914 +C Add\stests\sfor\sSAHPoolUtil.exportFile()\sand\simportDb(). +D 2023-07-30T03:54:10.966 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -554,7 +554,7 @@ F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555 F ext/wasm/test-opfs-vfs.js f09266873e1a34d9bdb6d3981ec8c9e382f31f215c9fd2f9016d2394b8ae9b7b F ext/wasm/tester1-worker.html ebc4b820a128963afce328ecf63ab200bd923309eb939f4110510ab449e9814c F ext/wasm/tester1.c-pp.html 1c1bc78b858af2019e663b1a31e76657b73dc24bede28ca92fbe917c3a972af2 -F ext/wasm/tester1.c-pp.js b9a493a764f2113f6a8205d4e5573a25731d6f965338005460920389ac0693e0 +F ext/wasm/tester1.c-pp.js b88dcad5424a652e8204c44a71bbc3deb22a4922c97ba792aedbabb7a6827b91 F ext/wasm/tests/opfs/concurrency/index.html 0802373d57034d51835ff6041cda438c7a982deea6079efd98098d3e42fbcbc1 F ext/wasm/tests/opfs/concurrency/test.js a98016113eaf71e81ddbf71655aa29b0fed9a8b79a3cdd3620d1658eb1cc9a5d F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2a378a66783ce4d749f7e1e7d08d8404a4aa78d47aeeefd6794b6753188438f6 -R f7430bcd5e0c8931ae75dccc5f40b292 -U drh -Z 9911052f3d11a2b100418fc49117622a +P 8920dcef1f75f578e3f274ab2b980a83d6ea6b761d99fc48410b26886170597b +R 2a07b6b25484c6f82e9fa54454c86f83 +U stephan +Z 94c05dabad5b9ba1d82742c493454088 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 228ebea7df..b0fc9d45e7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8920dcef1f75f578e3f274ab2b980a83d6ea6b761d99fc48410b26886170597b \ No newline at end of file +4aa88b8fb1c99137ed7531e5c82a241738a2b0554f7af82c0ed0ce8d16a0879a \ No newline at end of file From c8c6763782d102519611586514f858a601c1d6a5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 31 Jul 2023 17:20:12 +0000 Subject: [PATCH 10/41] Improved debug tracking of the Parse.nQueryLoop value. FossilOrigin-Name: 4a8a17498ecaccca5e5aab65d4596cbca9799547f50683237d08c1fa3556f1cf --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/sqliteInt.h | 2 +- src/where.c | 3 ++- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index c38f4b9aa8..8db2fb6f39 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stests\sfor\sSAHPoolUtil.exportFile()\sand\simportDb(). -D 2023-07-30T03:54:10.966 +C Improved\sdebug\stracking\sof\sthe\sParse.nQueryLoop\svalue. +D 2023-07-31T17:20:12.907 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -648,7 +648,7 @@ F src/shell.c.in 694aaf751f00610381533d4a31c83d142cfc83ef91ef65e2aa6912ace7c39b4 F src/sqlite.h.in 7b07a33d2af82ee974aa91e6294abce0282b2f4c5934b291d2fff961810dd867 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h da473ce2b3d0ae407a6300c4a164589b9a6bfdbec9462688a8593ff16f3bb6e4 -F src/sqliteInt.h 6140eb4058d995f3004ee2732fa098b884f26eb497a7fbb3a51c781ec824d14b +F src/sqliteInt.h dc50c6b6940e30bb51b7ba18805968ef0fcbf61946e047e7b63921be11a3dae8 F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6 F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -728,7 +728,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c dd843f619ac60d5dadab7109cf402432ba74dde0c301505fd1c202add07659e3 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7c7ea0115345851c3da4e04e2e239a29983b61fb5b038b94eede6aba462640e2 -F src/where.c 6041f3cae99d6f4c4da7ea094508317900fcd61195fe4292e55ac4531650e70a +F src/where.c 4dbe228a4609650fd623b7b008952e10d840c9d009e9857d091a571e42e6fd25 F src/whereInt.h c7d19902863beadec1d04e66aca39c0bcd60b74f05f0eaa7422c7005dfc5d51a F src/wherecode.c 5d77db30a2a3dd532492ae882de114edba2fae672622056b1c7fd61f5917a8f1 F src/whereexpr.c dc5096eca5ed503999be3bdee8a90c51361289a678d396a220912e9cb73b3c00 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8920dcef1f75f578e3f274ab2b980a83d6ea6b761d99fc48410b26886170597b -R 2a07b6b25484c6f82e9fa54454c86f83 -U stephan -Z 94c05dabad5b9ba1d82742c493454088 +P 4aa88b8fb1c99137ed7531e5c82a241738a2b0554f7af82c0ed0ce8d16a0879a +R a7420574bcfe65ab5de9c88d601ffa08 +U drh +Z a5b585bb4bef1b0204b860ed253c8304 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b0fc9d45e7..7ed422dc06 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4aa88b8fb1c99137ed7531e5c82a241738a2b0554f7af82c0ed0ce8d16a0879a \ No newline at end of file +4a8a17498ecaccca5e5aab65d4596cbca9799547f50683237d08c1fa3556f1cf \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 78ae7ad69e..7d6a16c87b 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3790,7 +3790,7 @@ struct Parse { int addrCrTab; /* Address of OP_CreateBtree on CREATE TABLE */ Returning *pReturning; /* The RETURNING clause */ } u1; - u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ + LogEst nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u32 oldmask; /* Mask of old.* columns referenced */ u32 newmask; /* Mask of new.* columns referenced */ #ifndef SQLITE_OMIT_PROGRESS_CALLBACK diff --git a/src/where.c b/src/where.c index 5476e09f07..d2f060d7eb 100644 --- a/src/where.c +++ b/src/where.c @@ -5003,7 +5003,8 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ** For joins of 3 or more tables, track the 10 best paths */ mxChoice = (nLoop<=1) ? 1 : (nLoop==2 ? 5 : 10); assert( nLoop<=pWInfo->pTabList->nSrc ); - WHERETRACE(0x002, ("---- begin solver. (nRowEst=%d)\n", nRowEst)); + WHERETRACE(0x002, ("---- begin solver. (nRowEst=%d, nQueryLoop=%d)\n", + nRowEst, pParse->nQueryLoop)); /* If nRowEst is zero and there is an ORDER BY clause, ignore it. In this ** case the purpose of this call is to estimate the number of rows returned From 1f097a2f292f691362fee420ca29d82871854735 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 31 Jul 2023 17:39:36 +0000 Subject: [PATCH 11/41] Add bit to sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS) that will disable the one-pass optimizating in DELETE and UPDATE. FossilOrigin-Name: 22f6dd5cd32ed9e7b932fdba98aa8652fde999df79f4995d3d8ac1acf430cf53 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/delete.c | 3 ++- src/sqliteInt.h | 1 + src/where.c | 1 + 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 8db2fb6f39..951549029e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdebug\stracking\sof\sthe\sParse.nQueryLoop\svalue. -D 2023-07-31T17:20:12.907 +C Add\sbit\sto\ssqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS)\sthat\swill\ndisable\sthe\sone-pass\soptimizating\sin\sDELETE\sand\sUPDATE. +D 2023-07-31T17:39:36.821 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -592,7 +592,7 @@ F src/ctime.c 20507cc0b0a6c19cd882fcd0eaeda32ae6a4229fb4b024cfdf3183043d9b703d F src/date.c f73f203b3877cef866c60ab402aec2bf89597219b60635cf50cbe3c5e4533e94 F src/dbpage.c f3eea5f7ec47e09ee7da40f42b25092ecbe961fc59566b8e5f705f34335b2387 F src/dbstat.c ec92074baa61d883de58c945162d9e666c13cd7cf3a23bc38b4d1c4d0b2c2bef -F src/delete.c cd5f5cd06ed0b6a882ec1a8c2a0d73b3cecb28479ad19e9931c4706c5e2182be +F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500 F src/expr.c ef4a81822da6f767696bd7f4b9983328af061158958138540142285a5b1181b7 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36 @@ -648,7 +648,7 @@ F src/shell.c.in 694aaf751f00610381533d4a31c83d142cfc83ef91ef65e2aa6912ace7c39b4 F src/sqlite.h.in 7b07a33d2af82ee974aa91e6294abce0282b2f4c5934b291d2fff961810dd867 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h da473ce2b3d0ae407a6300c4a164589b9a6bfdbec9462688a8593ff16f3bb6e4 -F src/sqliteInt.h dc50c6b6940e30bb51b7ba18805968ef0fcbf61946e047e7b63921be11a3dae8 +F src/sqliteInt.h bdf30ea8552626736f7fc2d216beb4e6ee556d1afc39d20afa1697ea259463ca F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6 F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -728,7 +728,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c dd843f619ac60d5dadab7109cf402432ba74dde0c301505fd1c202add07659e3 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7c7ea0115345851c3da4e04e2e239a29983b61fb5b038b94eede6aba462640e2 -F src/where.c 4dbe228a4609650fd623b7b008952e10d840c9d009e9857d091a571e42e6fd25 +F src/where.c dbbd8588329e211fc797ee3d48cde21ad7a3ba0f9b135db9f10e5ba44690cf43 F src/whereInt.h c7d19902863beadec1d04e66aca39c0bcd60b74f05f0eaa7422c7005dfc5d51a F src/wherecode.c 5d77db30a2a3dd532492ae882de114edba2fae672622056b1c7fd61f5917a8f1 F src/whereexpr.c dc5096eca5ed503999be3bdee8a90c51361289a678d396a220912e9cb73b3c00 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4aa88b8fb1c99137ed7531e5c82a241738a2b0554f7af82c0ed0ce8d16a0879a -R a7420574bcfe65ab5de9c88d601ffa08 +P 4a8a17498ecaccca5e5aab65d4596cbca9799547f50683237d08c1fa3556f1cf +R ef0070662a249066ae6d16c0760a2f90 U drh -Z a5b585bb4bef1b0204b860ed253c8304 +Z 540a4a2640cda7628ceedc92fe19bc74 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7ed422dc06..e920a6a042 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4a8a17498ecaccca5e5aab65d4596cbca9799547f50683237d08c1fa3556f1cf \ No newline at end of file +22f6dd5cd32ed9e7b932fdba98aa8652fde999df79f4995d3d8ac1acf430cf53 \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index 641d1ae589..2baff5b3d4 100644 --- a/src/delete.c +++ b/src/delete.c @@ -525,7 +525,8 @@ void sqlite3DeleteFrom( if( pWInfo==0 ) goto delete_from_cleanup; eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); assert( IsVirtual(pTab)==0 || eOnePass!=ONEPASS_MULTI ); - assert( IsVirtual(pTab) || bComplex || eOnePass!=ONEPASS_OFF ); + assert( IsVirtual(pTab) || bComplex || eOnePass!=ONEPASS_OFF + || OptimizationDisabled(db, SQLITE_OnePass) ); if( eOnePass!=ONEPASS_SINGLE ) sqlite3MultiWrite(pParse); if( sqlite3WhereUsesDeferredSeek(pWInfo) ){ sqlite3VdbeAddOp1(v, OP_FinishSeek, iTabCur); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 7d6a16c87b..0e029ddcee 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1874,6 +1874,7 @@ struct sqlite3 { #define SQLITE_IndexedExpr 0x01000000 /* Pull exprs from index when able */ #define SQLITE_Coroutines 0x02000000 /* Co-routines for subqueries */ #define SQLITE_NullUnusedCols 0x04000000 /* NULL unused columns in subqueries */ +#define SQLITE_OnePass 0x08000000 /* Single-pass DELETE and UPDATE */ #define SQLITE_AllOpts 0xffffffff /* All optimizations */ /* diff --git a/src/where.c b/src/where.c index d2f060d7eb..c75834ff59 100644 --- a/src/where.c +++ b/src/where.c @@ -6223,6 +6223,7 @@ WhereInfo *sqlite3WhereBegin( 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW) && !IsVirtual(pTabList->a[0].pTab) && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK)) + && OptimizationEnabled(db, SQLITE_OnePass) )){ pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI; if( HasRowid(pTabList->a[0].pTab) && (wsFlags & WHERE_IDX_ONLY) ){ From 98ab970bac92e433802fdc6e3201599b25ee49d6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 31 Jul 2023 20:02:11 +0000 Subject: [PATCH 12/41] The original column-cache implementation from check-in [ab1edcc7fedcf279] (merged to trunk at [771fe35074b50b8d]) is unsound. This check-in fixes the issue. Had to give back a little performance, the optimization is still a overall win. FossilOrigin-Name: ec95e970fb737adf0fab3cb4363040b036949e5eb966fc2d030a20f95e2bde60 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 14 +++++++++++++- src/vdbeInt.h | 2 ++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 951549029e..75d5cf31d3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sbit\sto\ssqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS)\sthat\swill\ndisable\sthe\sone-pass\soptimizating\sin\sDELETE\sand\sUPDATE. -D 2023-07-31T17:39:36.821 +C The\soriginal\scolumn-cache\simplementation\sfrom\scheck-in\s[ab1edcc7fedcf279]\n(merged\sto\strunk\sat\s[771fe35074b50b8d])\sis\sunsound.\s\sThis\scheck-in\sfixes\nthe\sissue.\s\sHad\sto\sgive\sback\sa\slittle\sperformance,\sthe\soptimization\sis\sstill\na\soverall\swin. +D 2023-07-31T20:02:11.619 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -713,9 +713,9 @@ F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c c2aa170f2eb429235b1dddce8952770787ffa5124dc89d405bfbe8ebad8e7ebd F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104 -F src/vdbe.c cd0396758da6a95e6c4e3bec7c3d6e767c3b39930c295c2425f83bb086cdc6ba +F src/vdbe.c 49b0c386511cb0261dc92e3583b0d08c5c450ab404f0e139378d10661a19aa5f F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0 -F src/vdbeInt.h cd829ff67fc18aff2476fe3209262ba8671cb43d51cb6913de4a670e37d2fbe3 +F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c F src/vdbeapi.c f37822f215740ede2a8fcae99bc13f2cc3a72dd0e1d22b81b9298c5ca67dbc38 F src/vdbeaux.c a586f445945eef6ad1fcd7c94f700faa1baea93c0dbd446291c7cf65966c8470 F src/vdbeblob.c 2516697b3ee8154eb8915f29466fb5d4f1ae39ee8b755ea909cefaf57ec5e2ce @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4a8a17498ecaccca5e5aab65d4596cbca9799547f50683237d08c1fa3556f1cf -R ef0070662a249066ae6d16c0760a2f90 +P 22f6dd5cd32ed9e7b932fdba98aa8652fde999df79f4995d3d8ac1acf430cf53 +R 15ab2c7da6a67c12e2ba41a7336b6a4c U drh -Z 540a4a2640cda7628ceedc92fe19bc74 +Z 46639d6bc060420caa2ca32405ae95c8 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e920a6a042..a8bf92715c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -22f6dd5cd32ed9e7b932fdba98aa8652fde999df79f4995d3d8ac1acf430cf53 \ No newline at end of file +ec95e970fb737adf0fab3cb4363040b036949e5eb966fc2d030a20f95e2bde60 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index b8ee05e415..0ad8465ddc 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -708,6 +708,8 @@ static SQLITE_NOINLINE int vdbeColumnFromOverflow( int iCol, /* The column to read */ int t, /* The serial-type code for the column value */ i64 iOffset, /* Offset to the start of the content value */ + u32 cacheStatus, /* Current Vdbe.cacheCtr value */ + u32 colCacheCtr, /* Current value of the column cache counter */ Mem *pDest /* Store the value into this register. */ ){ int rc; @@ -733,6 +735,8 @@ static SQLITE_NOINLINE int vdbeColumnFromOverflow( pCache = pC->pCache; if( pCache->pCValue==0 || pCache->iCol!=iCol + || pCache->cacheStatus!=cacheStatus + || pCache->colCacheCtr!=colCacheCtr || pCache->iOffset!=sqlite3BtreeOffset(pC->uc.pCursor) ){ if( pCache->pCValue ) sqlite3RCStrUnref(pCache->pCValue); @@ -744,6 +748,8 @@ static SQLITE_NOINLINE int vdbeColumnFromOverflow( pBuf[len+1] = 0; pBuf[len+2] = 0; pCache->iCol = iCol; + pCache->cacheStatus = cacheStatus; + pCache->colCacheCtr = colCacheCtr; pCache->iOffset = sqlite3BtreeOffset(pC->uc.pCursor); }else{ pBuf = pCache->pCValue; @@ -814,6 +820,7 @@ int sqlite3VdbeExec( Mem *pIn2 = 0; /* 2nd input operand */ Mem *pIn3 = 0; /* 3rd input operand */ Mem *pOut = 0; /* Output operand */ + u32 colCacheCtr = 0; /* Column cache counter */ #if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE) u64 *pnCycle = 0; int bStmtScanStatus = IS_STMT_SCANSTATUS(db)!=0; @@ -3162,7 +3169,8 @@ op_column_restart: */ sqlite3VdbeSerialGet((u8*)sqlite3CtypeMap, t, pDest); }else{ - rc = vdbeColumnFromOverflow(pC, p2, t, aOffset[p2], pDest); + rc = vdbeColumnFromOverflow(pC, p2, t, aOffset[p2], + p->cacheCtr, colCacheCtr, pDest); if( rc ){ if( rc==SQLITE_NOMEM ) goto no_mem; if( rc==SQLITE_TOOBIG ) goto too_big; @@ -5700,6 +5708,7 @@ case OP_Insert: { ); pC->deferredMoveto = 0; pC->cacheStatus = CACHE_STALE; + colCacheCtr++; /* Invoke the update-hook if required. */ if( rc ) goto abort_due_to_error; @@ -5860,6 +5869,7 @@ case OP_Delete: { rc = sqlite3BtreeDelete(pC->uc.pCursor, pOp->p5); pC->cacheStatus = CACHE_STALE; + colCacheCtr++; pC->seekResult = 0; if( rc ) goto abort_due_to_error; @@ -6431,6 +6441,7 @@ case OP_IdxInsert: { /* in2 */ ); assert( pC->deferredMoveto==0 ); pC->cacheStatus = CACHE_STALE; + colCacheCtr++; if( rc) goto abort_due_to_error; break; } @@ -6506,6 +6517,7 @@ case OP_IdxDelete: { assert( pC->deferredMoveto==0 ); pC->cacheStatus = CACHE_STALE; pC->seekResult = 0; + colCacheCtr++; break; } diff --git a/src/vdbeInt.h b/src/vdbeInt.h index f424559929..2a23c3f285 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -159,6 +159,8 @@ struct VdbeTxtBlbCache { char *pCValue; /* A RCStr buffer to hold the value */ i64 iOffset; /* File offset of the row being cached */ int iCol; /* Column for which the cache is valid */ + u32 cacheStatus; /* Vdbe.cacheCtr value */ + u32 colCacheCtr; /* Column cache counter */ }; /* From 00d635dda4808fdd6c98b4fc4c3e3c751bbf04c3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 31 Jul 2023 22:03:24 +0000 Subject: [PATCH 13/41] Restrict the new column cache to table-btree, which is the common case anyhow. That way, writes to indexes do not need to clear the column cache. FossilOrigin-Name: 659284ab0e22a4746c1337b3489e7b166d497fb7e5301e24dc115d2b0c4e097d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 8 +++++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 75d5cf31d3..6e2fe9e468 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\soriginal\scolumn-cache\simplementation\sfrom\scheck-in\s[ab1edcc7fedcf279]\n(merged\sto\strunk\sat\s[771fe35074b50b8d])\sis\sunsound.\s\sThis\scheck-in\sfixes\nthe\sissue.\s\sHad\sto\sgive\sback\sa\slittle\sperformance,\sthe\soptimization\sis\sstill\na\soverall\swin. -D 2023-07-31T20:02:11.619 +C Restrict\sthe\snew\scolumn\scache\sto\stable-btree,\swhich\sis\sthe\scommon\scase\sanyhow.\nThat\sway,\swrites\sto\sindexes\sdo\snot\sneed\sto\sclear\sthe\scolumn\scache. +D 2023-07-31T22:03:24.497 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -713,7 +713,7 @@ F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c c2aa170f2eb429235b1dddce8952770787ffa5124dc89d405bfbe8ebad8e7ebd F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104 -F src/vdbe.c 49b0c386511cb0261dc92e3583b0d08c5c450ab404f0e139378d10661a19aa5f +F src/vdbe.c fe09ed1f6d66a6a9813b9a418ef388d8549d509a6fd2ea937f55d41094788faa F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0 F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c F src/vdbeapi.c f37822f215740ede2a8fcae99bc13f2cc3a72dd0e1d22b81b9298c5ca67dbc38 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 22f6dd5cd32ed9e7b932fdba98aa8652fde999df79f4995d3d8ac1acf430cf53 -R 15ab2c7da6a67c12e2ba41a7336b6a4c +P ec95e970fb737adf0fab3cb4363040b036949e5eb966fc2d030a20f95e2bde60 +R f1954af63b724ef20b8b6a182fa5296b U drh -Z 46639d6bc060420caa2ca32405ae95c8 +Z e3e6a4c3ded41277cd2f45eab47ca43e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a8bf92715c..2f6d610e22 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ec95e970fb737adf0fab3cb4363040b036949e5eb966fc2d030a20f95e2bde60 \ No newline at end of file +659284ab0e22a4746c1337b3489e7b166d497fb7e5301e24dc115d2b0c4e097d \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 0ad8465ddc..4634f78a4d 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -718,12 +718,16 @@ static SQLITE_NOINLINE int vdbeColumnFromOverflow( int len = sqlite3VdbeSerialTypeLen(t); assert( pC->eCurType==CURTYPE_BTREE ); if( len>db->aLimit[SQLITE_LIMIT_LENGTH] ) return SQLITE_TOOBIG; - if( len > 4000 ){ + if( len > 4000 && pC->pKeyInfo==0 ){ /* Cache large column values that are on overflow pages using ** an RCStr (reference counted string) so that if they are reloaded, ** that do not have to be copied a second time. The overhead of ** creating and managing the cache is such that this is only ** profitable for larger TEXT and BLOB values. + ** + ** Only do this on table-btrees so that writes to index-btrees do not + ** need to clear the cache. This buys performance in the common case + ** in exchange for generality. */ VdbeTxtBlbCache *pCache; char *pBuf; @@ -6441,7 +6445,6 @@ case OP_IdxInsert: { /* in2 */ ); assert( pC->deferredMoveto==0 ); pC->cacheStatus = CACHE_STALE; - colCacheCtr++; if( rc) goto abort_due_to_error; break; } @@ -6517,7 +6520,6 @@ case OP_IdxDelete: { assert( pC->deferredMoveto==0 ); pC->cacheStatus = CACHE_STALE; pC->seekResult = 0; - colCacheCtr++; break; } From d192b4441de853d23fd377244dfcfbaa5b246ba7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 1 Aug 2023 00:34:03 +0000 Subject: [PATCH 14/41] Restore part of the UPDATE one-pass optimization that was removed by check-in [2c56b984a0bd3be5]: only disable one-pass if the WHERE clause contains a subquery. Allow subqueries in the SET expressions. Fix for performance problem reported by [forum:/forumpost/8ab195fd44e75ed0|forum post 8ab195fd44e75ed0]. FossilOrigin-Name: 42916af9fc0f379a608a08db894400bd735a28e26ab1ffd604d1fddfbdb3ec0c --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/test1.c | 1 + src/update.c | 2 +- test/corruptL.test | 1 + test/update.test | 22 ++++++++++++++++++++++ 6 files changed, 35 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 6e2fe9e468..7f733c24a9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Restrict\sthe\snew\scolumn\scache\sto\stable-btree,\swhich\sis\sthe\scommon\scase\sanyhow.\nThat\sway,\swrites\sto\sindexes\sdo\snot\sneed\sto\sclear\sthe\scolumn\scache. -D 2023-07-31T22:03:24.497 +C Restore\spart\sof\sthe\sUPDATE\sone-pass\soptimization\sthat\swas\sremoved\sby\ncheck-in\s[2c56b984a0bd3be5]:\sonly\sdisable\sone-pass\sif\sthe\sWHERE\sclause\ncontains\sa\ssubquery.\s\sAllow\ssubqueries\sin\sthe\sSET\sexpressions.\nFix\sfor\sperformance\sproblem\sreported\sby\n[forum:/forumpost/8ab195fd44e75ed0|forum\s\spost\s8ab195fd44e75ed0]. +D 2023-08-01T00:34:03.764 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -653,7 +653,7 @@ F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/tclsqlite.c ecbc3c99c0d0c3ed122a913f143026c26d38d57f33e06bb71185dd5c1efe37cd -F src/test1.c dfd07574689ee7c57af219c5f627ff32dae65dba478c124ba0359a1bde9983be +F src/test1.c ebba2473874a23add4a10881b90bd445cfa7f59f90749434938aec14239c6486 F src/test2.c 827446e259a3b7ab949da1542953edda7b5117982576d3e6f1c24a0dd20a5cef F src/test3.c e5178558c41ff53236ae0271e9acb3d6885a94981d2eb939536ee6474598840e F src/test4.c 4533b76419e7feb41b40582554663ed3cd77aaa54e135cf76b3205098cd6e664 @@ -708,7 +708,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 0fb405f9adf3f757c26bfc1ae6d58ac5dccbb918917ba9e5ef0e6673a06563d3 F src/treeview.c 1d52fbc4e97161e65858d36e3424ea6e3fc045dd8a679c82b4b9593dc30de3bd F src/trigger.c ad6ab9452715fa9a8075442e15196022275b414b9141b566af8cdb7a1605f2b0 -F src/update.c 0aa36561167a7c40d01163238c297297962f31a15a8d742216b3c37cdf25f731 +F src/update.c d5b755580a86d235b12faf10de81e60ad97c8117f8c3063d92c772df94455d44 F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c c2aa170f2eb429235b1dddce8952770787ffa5124dc89d405bfbe8ebad8e7ebd @@ -909,7 +909,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test 9d8cbf6214e492abe9e822e759b9751ae336cec0a6fe3ff3b37bfbd8ff9c22ca F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af -F test/corruptL.test b42978028afc5eefc8b51d8d7cd6a9344ba7362d7ed4511ee2070f56e06d5a1c +F test/corruptL.test 504d90502d9993440226edc355d2275524b89064ea3df5ee5c27f7028ec59d07 F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067 F test/corruptN.test 7c099d153a554001b4fb829c799b01f2ea6276cbc32479131e0db0da4efd9cc4 F test/cost.test b11cdbf9f11ffe8ef99c9881bf390e61fe92baf2182bad1dbe6de59a7295c576 @@ -1770,7 +1770,7 @@ F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test 0edaf3411d300693bca595897c5201421c6c5ec787990a1dfe2f7f60ae93f1e2 -F test/update.test 90772ede84cfc779fc3d31884a84ec4c74deb501eeb09a1c6c91c03d8e94c0d8 +F test/update.test 85d3f46d0863033370bd881b1097f5694369a8730e53c5f85d96f32b7b310b47 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upfrom1.tcl 8859d9d437f03b44174c4524a7a734a391fd4526fcff65be08285dafc9dc9041 F test/upfrom1.test 8cb06689e99cd707d884faa16da0e8eb26ff658bb01c47ddf72fadade666e6e1 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ec95e970fb737adf0fab3cb4363040b036949e5eb966fc2d030a20f95e2bde60 -R f1954af63b724ef20b8b6a182fa5296b +P 659284ab0e22a4746c1337b3489e7b166d497fb7e5301e24dc115d2b0c4e097d +R adb48f5cade02cad22a8983307eb1542 U drh -Z e3e6a4c3ded41277cd2f45eab47ca43e +Z 613d91f81efce76b30d5894066c9df2d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2f6d610e22..2eeae6a718 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -659284ab0e22a4746c1337b3489e7b166d497fb7e5301e24dc115d2b0c4e097d \ No newline at end of file +42916af9fc0f379a608a08db894400bd735a28e26ab1ffd604d1fddfbdb3ec0c \ No newline at end of file diff --git a/src/test1.c b/src/test1.c index 520508d1ca..4dcf7bc11f 100644 --- a/src/test1.c +++ b/src/test1.c @@ -8009,6 +8009,7 @@ static int SQLITE_TCLAPI optimization_control( { "push-down", SQLITE_PushDown }, { "balanced-merge", SQLITE_BalancedMerge }, { "propagate-const", SQLITE_PropagateConst }, + { "one-pass", SQLITE_OnePass }, }; if( objc!=4 ){ diff --git a/src/update.c b/src/update.c index a792862247..2101aa8284 100644 --- a/src/update.c +++ b/src/update.c @@ -741,7 +741,7 @@ void sqlite3Update( && !hasFK && !chngKey && !bReplace - && (sNC.ncFlags & NC_Subquery)==0 + && (pWhere==0 || !ExprHasProperty(pWhere, EP_Subquery)) ){ flags |= WHERE_ONEPASS_MULTIROW; } diff --git a/test/corruptL.test b/test/corruptL.test index 65d9821b35..cf38764415 100644 --- a/test/corruptL.test +++ b/test/corruptL.test @@ -1269,6 +1269,7 @@ do_test 15.0 { }]} {} extra_schema_checks 0 +optimization_control db one-pass off do_catchsql_test 15.1 { PRAGMA cell_size_check = 0; UPDATE c1 SET c= NOT EXISTS(SELECT 1 FROM c1 ORDER BY (SELECT 1 FROM c1 ORDER BY a)) +10 WHERE d BETWEEN 4 AND 7; diff --git a/test/update.test b/test/update.test index 47b6029bee..bf7666662a 100644 --- a/test/update.test +++ b/test/update.test @@ -764,5 +764,27 @@ do_execsql_test update-21.4 { SELECT * FROM t1 ORDER BY vkey, c5; ROLLBACK; } {6 -54 100 NULL} +# Follow-up on 2023-07-31 (forum post https://sqlite.org/forum/forumpost/8ab195fd44e75ed0): +# Only disable one-pass if the subquery is in the WHERE clause. The SET expressions +# do not count. +do_execsql_test update-21.11 { + DROP TABLE t1; + CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT); + CREATE TABLE t2(d INT); +} +do_eqp_test update-21.12 { + WITH t3(x,y) AS (SELECT d, row_number()OVER() FROM t2) + UPDATE t1 SET b=(SELECT y FROM t3 WHERE t1.a=t3.x); +} { + QUERY PLAN + |--SCAN t1 + `--CORRELATED SCALAR SUBQUERY xxxxxx + |--CO-ROUTINE t3 + | |--CO-ROUTINE (subquery-xxxxxx) + | | `--SCAN t2 + | `--SCAN (subquery-xxxxxx) + |--BLOOM FILTER ON t3 (x=?) + `--SEARCH t3 USING AUTOMATIC COVERING INDEX (x=?) +} finish_test From b9894f88b8fa28ceaf17c671941dbdb5d0ca126a Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 1 Aug 2023 01:07:45 +0000 Subject: [PATCH 15/41] Remove redundant comparison operator. FossilOrigin-Name: 018984329892c243b21adb10aa8efc7f49313ecf80477e6b61dc6365f62c489d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbemem.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7f733c24a9..bfb640eeea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Restore\spart\sof\sthe\sUPDATE\sone-pass\soptimization\sthat\swas\sremoved\sby\ncheck-in\s[2c56b984a0bd3be5]:\sonly\sdisable\sone-pass\sif\sthe\sWHERE\sclause\ncontains\sa\ssubquery.\s\sAllow\ssubqueries\sin\sthe\sSET\sexpressions.\nFix\sfor\sperformance\sproblem\sreported\sby\n[forum:/forumpost/8ab195fd44e75ed0|forum\s\spost\s8ab195fd44e75ed0]. -D 2023-08-01T00:34:03.764 +C Remove\sredundant\scomparison\soperator. +D 2023-08-01T01:07:45.466 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -719,7 +719,7 @@ F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c F src/vdbeapi.c f37822f215740ede2a8fcae99bc13f2cc3a72dd0e1d22b81b9298c5ca67dbc38 F src/vdbeaux.c a586f445945eef6ad1fcd7c94f700faa1baea93c0dbd446291c7cf65966c8470 F src/vdbeblob.c 2516697b3ee8154eb8915f29466fb5d4f1ae39ee8b755ea909cefaf57ec5e2ce -F src/vdbemem.c b4b34674eea99eaee7130f703b3a69c9bfdd749d1c5adfd3ab8af90aa11eed6a +F src/vdbemem.c 317b9f48708139db6239ade40c7980b4bc8233168383690d588dad6d8437f722 F src/vdbesort.c 0d40dca073c94e158ead752ef4225f4fee22dee84145e8c00ca2309afb489015 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c 57fa8f56478e5b5cb558cb425e7878515e0a105c54f96f1d1bbf4b9433529254 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 659284ab0e22a4746c1337b3489e7b166d497fb7e5301e24dc115d2b0c4e097d -R adb48f5cade02cad22a8983307eb1542 +P 42916af9fc0f379a608a08db894400bd735a28e26ab1ffd604d1fddfbdb3ec0c +R 369ed1a1c6cada9c0a1698936766f3eb U drh -Z 613d91f81efce76b30d5894066c9df2d +Z cacf2fbc98de3d0e9dbbe6eaa60a2dd8 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2eeae6a718..4f8978d1c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -42916af9fc0f379a608a08db894400bd735a28e26ab1ffd604d1fddfbdb3ec0c \ No newline at end of file +018984329892c243b21adb10aa8efc7f49313ecf80477e6b61dc6365f62c489d \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index 0f5117dad3..e25efc9771 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -341,7 +341,7 @@ void sqlite3VdbeMemZeroTerminateIfAble(Mem *pMem){ pMem->flags |= MEM_Term; return; } - }else if( pMem->szMalloc>0 && pMem->szMalloc >= pMem->n+1 ){ + }else if( pMem->szMalloc >= pMem->n+1 ){ pMem->z[pMem->n] = 0; pMem->flags |= MEM_Term; return; From c1a07d3bab98585c50f6cc849bc78c66f00a0bca Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 1 Aug 2023 11:03:06 +0000 Subject: [PATCH 16/41] Fix an assert() in fts5_index.c that might fail when dealing with corrupt records. FossilOrigin-Name: aa55c83f35c2ab134e0842201e46e021079283f9c65595c86664060b3aa8d715 --- ext/fts5/fts5_index.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 6ea9d9f88f..9d80e79e56 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -4752,7 +4752,7 @@ static int fts5IndexFindDeleteMerge(Fts5Index *p, Fts5Structure *pStruct){ nEntry += pLvl->aSeg[iSeg].nEntry; nTomb += pLvl->aSeg[iSeg].nEntryTombstone; } - assert( nEntry>0 || pLvl->nSeg==0 ); + assert_nc( nEntry>0 || pLvl->nSeg==0 ); if( nEntry>0 ){ int nPercent = (nTomb * 100) / nEntry; if( nPercent>=pConfig->nDeleteMerge && nPercent>nBest ){ diff --git a/manifest b/manifest index bfb640eeea..a5b13ffc11 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sredundant\scomparison\soperator. -D 2023-08-01T01:07:45.466 +C Fix\san\sassert()\sin\sfts5_index.c\sthat\smight\sfail\swhen\sdealing\swith\scorrupt\srecords. +D 2023-08-01T11:03:06.505 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -92,7 +92,7 @@ F ext/fts5/fts5_buffer.c 3001fbabb585d6de52947b44b455235072b741038391f830d6b7292 F ext/fts5/fts5_config.c 054359543566cbff1ba65a188330660a5457299513ac71c53b3a07d934c7b081 F ext/fts5/fts5_expr.c 2473c13542f463cae4b938c498d6193c90d38ea1a2a4f9849c0479736e50d24d F ext/fts5/fts5_hash.c 65e7707bc8774706574346d18c20218facf87de3599b995963c3e6d6809f203d -F ext/fts5/fts5_index.c 9f7a24e206072b9deda2b9b6eec8d162128486d1dfad2ada92116faecc623cc8 +F ext/fts5/fts5_index.c 93b4cd116b76b6adf224cd3d213f1e06cfe10ae0eb21d6372b1c53b8f0c382a3 F ext/fts5/fts5_main.c 2f87ee44fdb21539c264541149f07f70e065d58f37420063e5ddef80ba0f5ede F ext/fts5/fts5_storage.c 3c9b41fce41b6410f2e8f82eb035c6a29b2560483f773e6dc98cf3cb2e4ddbb5 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 42916af9fc0f379a608a08db894400bd735a28e26ab1ffd604d1fddfbdb3ec0c -R 369ed1a1c6cada9c0a1698936766f3eb -U drh -Z cacf2fbc98de3d0e9dbbe6eaa60a2dd8 +P 018984329892c243b21adb10aa8efc7f49313ecf80477e6b61dc6365f62c489d +R b6bc709a1f83885697109a49cbaa2f90 +U dan +Z 735801ce1b2e44ee6011cd1fc8fe77e9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 4f8978d1c1..174bc9dc9f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -018984329892c243b21adb10aa8efc7f49313ecf80477e6b61dc6365f62c489d \ No newline at end of file +aa55c83f35c2ab134e0842201e46e021079283f9c65595c86664060b3aa8d715 \ No newline at end of file From a08d363f67e69e5e696d3861846abfb09df61280 Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 1 Aug 2023 16:17:00 +0000 Subject: [PATCH 17/41] Fix part 1 of 2 for /fiddle not running: build flags which were renamed during refactoring. FossilOrigin-Name: 214ffeeff77997c3352d30aaa6e51e2dea9706f0d08f73f4eacfad1864817fc6 --- ext/wasm/fiddle.make | 4 ++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/wasm/fiddle.make b/ext/wasm/fiddle.make index cbe6ab3518..3d1dc3f902 100644 --- a/ext/wasm/fiddle.make +++ b/ext/wasm/fiddle.make @@ -61,9 +61,9 @@ $(fiddle.SOAP.js): $(SOAP.js) $(eval $(call call-make-pre-post,fiddle-module,vanilla)) $(fiddle-module.js): $(MAKEFILE) $(MAKEFILE.fiddle) \ $(EXPORTED_FUNCTIONS.fiddle) \ - $(fiddle.cses) $(pre-post-fiddle-module.deps.vanilla) $(fiddle.SOAP.js) + $(fiddle.cses) $(pre-post-fiddle-module-vanilla.deps) $(fiddle.SOAP.js) $(emcc.bin) -o $@ $(fiddle.emcc-flags) \ - $(pre-post-fiddle-module.flags.vanilla) \ + $(pre-post-fiddle-module-vanilla.flags) \ $(fiddle.cses) $(maybe-wasm-strip) $(fiddle-module.wasm) gzip < $@ > $@.gz diff --git a/manifest b/manifest index a5b13ffc11..1c02ae762e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sin\sfts5_index.c\sthat\smight\sfail\swhen\sdealing\swith\scorrupt\srecords. -D 2023-08-01T11:03:06.505 +C Fix\spart\s1\sof\s2\sfor\s/fiddle\snot\srunning:\sbuild\sflags\swhich\swere\srenamed\sduring\srefactoring. +D 2023-08-01T16:17:00.592 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -530,7 +530,7 @@ F ext/wasm/demo-worker1.html 2c178c1890a2beb5a5fecb1453e796d067a4b8d3d2a04d65ca2 F ext/wasm/demo-worker1.js 836bece8615b17b1b572584f7b15912236a5947fe8c68b98d2737d7e287447ef F ext/wasm/dist.make 3a851858aad72e246a5d9c5aaf6b6a144305f1bf898ac1846760ea7bab95c9a3 F ext/wasm/example_extra_init.c 2347cd69d19d839ef4e5e77b7855103a7fe3ef2af86f2e8c95839afd8b05862f -F ext/wasm/fiddle.make dbe36b90b8907ae28ecb9c0e9fd8389dbdaecf117ea4fb2ea33864bdfa498a94 +F ext/wasm/fiddle.make 5059caa2683dda83448739b8e8f9f45330891d92a71f7708bde191ff8e0d1080 F ext/wasm/fiddle/emscripten.css 3d253a6fdb8983a2ac983855bfbdd4b6fa1ff267c28d69513dd6ef1f289ada3f F ext/wasm/fiddle/fiddle-worker.js 163d6139a93fab4bcb72064923df050d4e7c0ff0d8aa061ce8776a6e75da8a10 F ext/wasm/fiddle/fiddle.js 974b995119ac443685d7d94d3b3c58c6a36540e9eb3fed7069d5653284071715 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 018984329892c243b21adb10aa8efc7f49313ecf80477e6b61dc6365f62c489d -R b6bc709a1f83885697109a49cbaa2f90 -U dan -Z 735801ce1b2e44ee6011cd1fc8fe77e9 +P aa55c83f35c2ab134e0842201e46e021079283f9c65595c86664060b3aa8d715 +R cbb563045e455ed54ad88e12db1f1317 +U stephan +Z 0d460b3d2880bf539ea1069e23b0bd35 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 174bc9dc9f..ff611ade6c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aa55c83f35c2ab134e0842201e46e021079283f9c65595c86664060b3aa8d715 \ No newline at end of file +214ffeeff77997c3352d30aaa6e51e2dea9706f0d08f73f4eacfad1864817fc6 \ No newline at end of file From 887f6e5082bdd8cc3247d38eebbfc3b813964db3 Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 1 Aug 2023 16:38:08 +0000 Subject: [PATCH 18/41] Fix part 2 of 2 for /fiddle: a make deps problem which caused fiddle to load but fail to run when sqlite3.c was missing. FossilOrigin-Name: 6011bc26764760af750de68f1553f45382766dd2195633ae267bdb4f9ac75d0f --- ext/wasm/fiddle.make | 2 +- ext/wasm/fiddle/fiddle-worker.js | 10 ++++++---- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/ext/wasm/fiddle.make b/ext/wasm/fiddle.make index 3d1dc3f902..57141d7e2b 100644 --- a/ext/wasm/fiddle.make +++ b/ext/wasm/fiddle.make @@ -18,7 +18,7 @@ endif ifeq (,$(SHELL_SRC)) $(error Could not parse SHELL_SRC from $(dir.top)/Makefile.) endif -$(dir.top)/shell.c: $(SHELL_SRC) $(dir.top)/tool/mkshellc.tcl +$(dir.top)/shell.c: $(SHELL_SRC) $(dir.top)/tool/mkshellc.tcl $(sqlite3.c) $(MAKE) -C $(dir.top) shell.c # /shell.c ######################################################################## diff --git a/ext/wasm/fiddle/fiddle-worker.js b/ext/wasm/fiddle/fiddle-worker.js index e239cbf51e..67f61008fb 100644 --- a/ext/wasm/fiddle/fiddle-worker.js +++ b/ext/wasm/fiddle/fiddle-worker.js @@ -221,7 +221,7 @@ f._(); } }; - + self.onmessage = function f(ev){ ev = ev.data; if(!f.cache){ @@ -371,12 +371,14 @@ sqlite3InitModule(fiddleModule).then((_sqlite3)=>{ sqlite3 = _sqlite3; console.warn("Installing sqlite3 module globally (in Worker)", - "for use in the dev console."); - self.sqlite3 = sqlite3; + "for use in the dev console.", sqlite3); + globalThis.sqlite3 = sqlite3; const dbVfs = sqlite3.wasm.xWrap('fiddle_db_vfs', "*", ['string']); fiddleModule.fsUnlink = (fn)=>{ return sqlite3.wasm.sqlite3_wasm_vfs_unlink(dbVfs(0), fn); }; wMsg('fiddle-ready'); - })/*then()*/; + }).catch(e=>{ + console.error("Fiddle worker init failed:",e); + }); })(); diff --git a/manifest b/manifest index 1c02ae762e..a584b06049 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\spart\s1\sof\s2\sfor\s/fiddle\snot\srunning:\sbuild\sflags\swhich\swere\srenamed\sduring\srefactoring. -D 2023-08-01T16:17:00.592 +C Fix\spart\s2\sof\s2\sfor\s/fiddle:\sa\smake\sdeps\sproblem\swhich\scaused\sfiddle\sto\sload\sbut\sfail\sto\srun\swhen\ssqlite3.c\swas\smissing. +D 2023-08-01T16:38:08.727 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -530,9 +530,9 @@ F ext/wasm/demo-worker1.html 2c178c1890a2beb5a5fecb1453e796d067a4b8d3d2a04d65ca2 F ext/wasm/demo-worker1.js 836bece8615b17b1b572584f7b15912236a5947fe8c68b98d2737d7e287447ef F ext/wasm/dist.make 3a851858aad72e246a5d9c5aaf6b6a144305f1bf898ac1846760ea7bab95c9a3 F ext/wasm/example_extra_init.c 2347cd69d19d839ef4e5e77b7855103a7fe3ef2af86f2e8c95839afd8b05862f -F ext/wasm/fiddle.make 5059caa2683dda83448739b8e8f9f45330891d92a71f7708bde191ff8e0d1080 +F ext/wasm/fiddle.make fa2ba6e90457ba2a71cb745f200d409caf773076df75ae5b177cc225d7627a11 F ext/wasm/fiddle/emscripten.css 3d253a6fdb8983a2ac983855bfbdd4b6fa1ff267c28d69513dd6ef1f289ada3f -F ext/wasm/fiddle/fiddle-worker.js 163d6139a93fab4bcb72064923df050d4e7c0ff0d8aa061ce8776a6e75da8a10 +F ext/wasm/fiddle/fiddle-worker.js e0153f9af6500805c6f09c0b3cfdb7d857e9d6863dbee9d50d1628fccf5f4b4d F ext/wasm/fiddle/fiddle.js 974b995119ac443685d7d94d3b3c58c6a36540e9eb3fed7069d5653284071715 F ext/wasm/fiddle/index.html 5daf54e8f3d7777cbb1ca4f93affe28858dbfff25841cb4ab81d694efed28ec2 F ext/wasm/index-dist.html 22379774f0ad4edcaaa8cf9c674c82e794cc557719a8addabed74eb8069d412e @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P aa55c83f35c2ab134e0842201e46e021079283f9c65595c86664060b3aa8d715 -R cbb563045e455ed54ad88e12db1f1317 +P 214ffeeff77997c3352d30aaa6e51e2dea9706f0d08f73f4eacfad1864817fc6 +R 4ba1ff676b6006e1704f830ea492d45b U stephan -Z 0d460b3d2880bf539ea1069e23b0bd35 +Z 769ce58cc540e5f5221900364e87c633 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ff611ade6c..574f2d0a07 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -214ffeeff77997c3352d30aaa6e51e2dea9706f0d08f73f4eacfad1864817fc6 \ No newline at end of file +6011bc26764760af750de68f1553f45382766dd2195633ae267bdb4f9ac75d0f \ No newline at end of file From 2877c43e6c08d499e52459507201190781abda42 Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 1 Aug 2023 16:41:12 +0000 Subject: [PATCH 19/41] Filter the wasmfs-specific JS module result type check out of non-wasmfs builds. FossilOrigin-Name: ef7c121049f77200ecc4da260a90776264af0e84122d0133b4986959aedc653a --- ext/wasm/api/extern-post-js.c-pp.js | 2 ++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/ext/wasm/api/extern-post-js.c-pp.js b/ext/wasm/api/extern-post-js.c-pp.js index 00cb3fab90..63e55051c6 100644 --- a/ext/wasm/api/extern-post-js.c-pp.js +++ b/ext/wasm/api/extern-post-js.c-pp.js @@ -62,6 +62,7 @@ const toExportForESM = globalThis.sqlite3InitModule = function ff(...args){ //console.warn("Using replaced sqlite3InitModule()",globalThis.location); return originalInit(...args).then((EmscriptenModule)=>{ +//#if wasmfs if('undefined'!==typeof WorkerGlobalScope && EmscriptenModule['ENVIRONMENT_IS_PTHREAD']){ /** Workaround for wasmfs-generated worker, which calls this @@ -72,6 +73,7 @@ const toExportForESM = //console.warn("sqlite3InitModule() returning E-module.",EmscriptenModule); return EmscriptenModule; } +//#endif //console.warn("sqlite3InitModule() returning sqlite3 object."); const s = EmscriptenModule.sqlite3; s.scriptInfo = initModuleState; diff --git a/manifest b/manifest index a584b06049..138647d0c3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\spart\s2\sof\s2\sfor\s/fiddle:\sa\smake\sdeps\sproblem\swhich\scaused\sfiddle\sto\sload\sbut\sfail\sto\srun\swhen\ssqlite3.c\swas\smissing. -D 2023-08-01T16:38:08.727 +C Filter\sthe\swasmfs-specific\sJS\smodule\sresult\stype\scheck\sout\sof\snon-wasmfs\sbuilds. +D 2023-08-01T16:41:12.175 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -494,7 +494,7 @@ F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api d6a5078f48a5301ed17b9a30331075d9b2 F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-see fb29e62082a658f0d81102488414d422c393c4b20cc2f685b216bc566237957b F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287 F ext/wasm/api/README.md 5eb44fa02e9c693a1884a3692428647894b0380b24bca120866b7a24c8786134 -F ext/wasm/api/extern-post-js.c-pp.js e7257ea56d4077d0773d7537fcb8eade59aad0c118dab92497c27939edca41cb +F ext/wasm/api/extern-post-js.c-pp.js c4154a7f90c2d7e51fd6738273908152036c3457fdc0b6523f1be3ef51105aac F ext/wasm/api/extern-pre-js.js cc61c09c7a24a07dbecb4c352453c3985170cec12b4e7e7e7a4d11d43c5c8f41 F ext/wasm/api/post-js-footer.js cd0a8ec768501d9bd45d325ab0442037fb0e33d1f3b4f08902f15c34720ee4a1 F ext/wasm/api/post-js-header.js 47b6b281f39ad59fa6e8b658308cd98ea292c286a68407b35ff3ed9cfd281a62 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 214ffeeff77997c3352d30aaa6e51e2dea9706f0d08f73f4eacfad1864817fc6 -R 4ba1ff676b6006e1704f830ea492d45b +P 6011bc26764760af750de68f1553f45382766dd2195633ae267bdb4f9ac75d0f +R 2fd2b02f3e4d2308882c392cb9573200 U stephan -Z 769ce58cc540e5f5221900364e87c633 +Z 3208b5e4494a8f516202976f4b53efb4 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 574f2d0a07..6655f9c9df 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6011bc26764760af750de68f1553f45382766dd2195633ae267bdb4f9ac75d0f \ No newline at end of file +ef7c121049f77200ecc4da260a90776264af0e84122d0133b4986959aedc653a \ No newline at end of file From cbaef88980f48c963da8788faadd429b64d72dca Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 1 Aug 2023 19:10:30 +0000 Subject: [PATCH 20/41] Avoid ASAN warnings when converting over-sized long double values into double. FossilOrigin-Name: e989a37ff9d5b52e0090d59be077ad2260c8df5d4c2c2d8088b1160de64dffd4 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/util.c | 8 +++++++- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 138647d0c3..6111b63076 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Filter\sthe\swasmfs-specific\sJS\smodule\sresult\stype\scheck\sout\sof\snon-wasmfs\sbuilds. -D 2023-08-01T16:41:12.175 +C Avoid\sASAN\swarnings\swhen\sconverting\sover-sized\slong\sdouble\svalues\sinto\sdouble. +D 2023-08-01T19:10:30.602 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -711,7 +711,7 @@ F src/trigger.c ad6ab9452715fa9a8075442e15196022275b414b9141b566af8cdb7a1605f2b0 F src/update.c d5b755580a86d235b12faf10de81e60ad97c8117f8c3063d92c772df94455d44 F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 -F src/util.c c2aa170f2eb429235b1dddce8952770787ffa5124dc89d405bfbe8ebad8e7ebd +F src/util.c d30e9f56550fed31c09e0443820552039f61431286e8dfc41175d066f33328b5 F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104 F src/vdbe.c fe09ed1f6d66a6a9813b9a418ef388d8549d509a6fd2ea937f55d41094788faa F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6011bc26764760af750de68f1553f45382766dd2195633ae267bdb4f9ac75d0f -R 2fd2b02f3e4d2308882c392cb9573200 -U stephan -Z 3208b5e4494a8f516202976f4b53efb4 +P ef7c121049f77200ecc4da260a90776264af0e84122d0133b4986959aedc653a +R c483adf60f57a6109b239d1712365b26 +U drh +Z 2befc2bb54d1f8208d12f5236dacb8de # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 6655f9c9df..feb55dd783 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ef7c121049f77200ecc4da260a90776264af0e84122d0133b4986959aedc653a \ No newline at end of file +e989a37ff9d5b52e0090d59be077ad2260c8df5d4c2c2d8088b1160de64dffd4 \ No newline at end of file diff --git a/src/util.c b/src/util.c index 1200aef0e3..002a5ef476 100644 --- a/src/util.c +++ b/src/util.c @@ -591,7 +591,13 @@ do_atof_calc: while( e<=-10 ){ e+=10; r *= 1.0e-10L; } while( e<=-1 ){ e+=1; r *= 1.0e-01L; } } - *pResult = r; + if( r>+1.7976931348623157081452742373e+308L ){ + *pResult = +INFINITY; + }else if( r<-1.7976931348623157081452742373e+308L ){ + *pResult = -INFINITY; + }else{ + *pResult = (double)r; + } }else{ double rr[2]; u64 s2; From 4178849736c81ec17bbfb2628ec0ef7bad94962d Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 2 Aug 2023 00:09:15 +0000 Subject: [PATCH 21/41] When a query is inside an AS MATERIALIZED CTE, do not attempt the omit-ORDER-BY optimization. If the developer specifies MATERIALIZED, that means he wants the sort to actually happen. FossilOrigin-Name: aa769ee7477171f26a091cadff98aa4f48da7752ade20b405a95c4525456f62e --- manifest | 15 +++++++++------ manifest.uuid | 2 +- src/select.c | 2 ++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 6111b63076..d796df9ebc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sASAN\swarnings\swhen\sconverting\sover-sized\slong\sdouble\svalues\sinto\sdouble. -D 2023-08-01T19:10:30.602 +C When\sa\squery\sis\sinside\san\sAS\sMATERIALIZED\sCTE,\sdo\snot\sattempt\sthe\nomit-ORDER-BY\soptimization.\s\sIf\sthe\sdeveloper\sspecifies\sMATERIALIZED,\nthat\smeans\she\swants\sthe\ssort\sto\sactually\shappen. +D 2023-08-02T00:09:15.460 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -643,7 +643,7 @@ F src/printf.c e3ba080e2f409f9bfcc8d34724e6fc160e9c718dc92d0548f6b71b8b6f860ce2 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 37953a5f36c60bea413c3c04efcd433b6177009f508ef2ace0494728912fe2e9 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c 3328b8c758016b400a4fea053ab1f5927929083a49d0c3921802ce99eea73cde +F src/select.c 0ea15e379b2eb09d1a803499438b957c59af7264996903ec9b9a4aeb0402293b F src/shell.c.in 694aaf751f00610381533d4a31c83d142cfc83ef91ef65e2aa6912ace7c39b40 F src/sqlite.h.in 7b07a33d2af82ee974aa91e6294abce0282b2f4c5934b291d2fff961810dd867 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -2049,8 +2049,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ef7c121049f77200ecc4da260a90776264af0e84122d0133b4986959aedc653a -R c483adf60f57a6109b239d1712365b26 +P e989a37ff9d5b52e0090d59be077ad2260c8df5d4c2c2d8088b1160de64dffd4 +R 85471d4376eb004f17191da107252ebb +T *branch * materialize-order-by +T *sym-materialize-order-by * +T -sym-trunk * U drh -Z 2befc2bb54d1f8208d12f5236dacb8de +Z 34b88ebfe26392ded7967d5b47a75b8d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index feb55dd783..1b72fd535b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e989a37ff9d5b52e0090d59be077ad2260c8df5d4c2c2d8088b1160de64dffd4 \ No newline at end of file +aa769ee7477171f26a091cadff98aa4f48da7752ade20b405a95c4525456f62e \ No newline at end of file diff --git a/src/select.c b/src/select.c index 098b745849..7f73b19287 100644 --- a/src/select.c +++ b/src/select.c @@ -7314,12 +7314,14 @@ int sqlite3Select( ** (a) The outer query has a different ORDER BY clause ** (b) The subquery is part of a join ** See forum post 062d576715d277c8 + ** (6) The subquery is really a MATERIALIZED CTE */ if( pSub->pOrderBy!=0 && (p->pOrderBy!=0 || pTabList->nSrc>1) /* Condition (5) */ && pSub->pLimit==0 /* Condition (1) */ && (pSub->selFlags & SF_OrderByReqd)==0 /* Condition (2) */ && (p->selFlags & SF_OrderByReqd)==0 /* Condition (3) and (4) */ + && (pItem->fg.isCte==0 || pItem->u2.pCteUse->eM10d!=M10d_Yes) /* (6) */ && OptimizationEnabled(db, SQLITE_OmitOrderBy) ){ TREETRACE(0x800,pParse,p, From 5e82c06cf89a5d3d57f8cbb206a7142c9c4c4a0c Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 2 Aug 2023 11:06:27 +0000 Subject: [PATCH 22/41] Never flatten a CTE that is labeled MATERIALIZED. This is really something of a bug fix because the documentation says that a MATERIALIZED CTE is an optimization barrier. FossilOrigin-Name: b7ef9796f548ce43e06673f86bbec68157aae5e4ee8451e1d87ee5f70af1bb27 --- manifest | 15 ++++++--------- manifest.uuid | 2 +- src/select.c | 14 +++++++++++++- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index d796df9ebc..228342f6be 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sa\squery\sis\sinside\san\sAS\sMATERIALIZED\sCTE,\sdo\snot\sattempt\sthe\nomit-ORDER-BY\soptimization.\s\sIf\sthe\sdeveloper\sspecifies\sMATERIALIZED,\nthat\smeans\she\swants\sthe\ssort\sto\sactually\shappen. -D 2023-08-02T00:09:15.460 +C Never\sflatten\sa\sCTE\sthat\sis\slabeled\sMATERIALIZED.\s\sThis\sis\sreally\ssomething\nof\sa\sbug\sfix\sbecause\sthe\sdocumentation\ssays\sthat\sa\sMATERIALIZED\sCTE\sis\san\noptimization\sbarrier. +D 2023-08-02T11:06:27.030 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -643,7 +643,7 @@ F src/printf.c e3ba080e2f409f9bfcc8d34724e6fc160e9c718dc92d0548f6b71b8b6f860ce2 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 37953a5f36c60bea413c3c04efcd433b6177009f508ef2ace0494728912fe2e9 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c 0ea15e379b2eb09d1a803499438b957c59af7264996903ec9b9a4aeb0402293b +F src/select.c 10ff496138ffa5bf5c3d9c7808b7558cb9b398d12062c464037167748075a13f F src/shell.c.in 694aaf751f00610381533d4a31c83d142cfc83ef91ef65e2aa6912ace7c39b40 F src/sqlite.h.in 7b07a33d2af82ee974aa91e6294abce0282b2f4c5934b291d2fff961810dd867 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -2049,11 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e989a37ff9d5b52e0090d59be077ad2260c8df5d4c2c2d8088b1160de64dffd4 -R 85471d4376eb004f17191da107252ebb -T *branch * materialize-order-by -T *sym-materialize-order-by * -T -sym-trunk * +P aa769ee7477171f26a091cadff98aa4f48da7752ade20b405a95c4525456f62e +R 5d3359f6c6d5e2c6f797651e2c52272a U drh -Z 34b88ebfe26392ded7967d5b47a75b8d +Z d3d190ae3372df83f9be614d98609288 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1b72fd535b..1ef995c32e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aa769ee7477171f26a091cadff98aa4f48da7752ade20b405a95c4525456f62e \ No newline at end of file +b7ef9796f548ce43e06673f86bbec68157aae5e4ee8451e1d87ee5f70af1bb27 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 7f73b19287..7a3ba4a6fa 100644 --- a/src/select.c +++ b/src/select.c @@ -7314,7 +7314,14 @@ int sqlite3Select( ** (a) The outer query has a different ORDER BY clause ** (b) The subquery is part of a join ** See forum post 062d576715d277c8 + ** + ** The above cases might get an incorrect result if ORDER BY is omitted. + ** The following constraints are not required for correct answers, but are + ** included in order to give developers more control over when a sort + ** occurs: + ** ** (6) The subquery is really a MATERIALIZED CTE + ** (7) The OmitOrderBy optimization is disabled */ if( pSub->pOrderBy!=0 && (p->pOrderBy!=0 || pTabList->nSrc>1) /* Condition (5) */ @@ -7322,7 +7329,7 @@ int sqlite3Select( && (pSub->selFlags & SF_OrderByReqd)==0 /* Condition (2) */ && (p->selFlags & SF_OrderByReqd)==0 /* Condition (3) and (4) */ && (pItem->fg.isCte==0 || pItem->u2.pCteUse->eM10d!=M10d_Yes) /* (6) */ - && OptimizationEnabled(db, SQLITE_OmitOrderBy) + && OptimizationEnabled(db, SQLITE_OmitOrderBy) /* (7) */ ){ TREETRACE(0x800,pParse,p, ("omit superfluous ORDER BY on %r FROM-clause subquery\n",i+1)); @@ -7359,6 +7366,11 @@ int sqlite3Select( continue; } + /* Do not flatten a MATERIALIZED CTE */ + if( pItem->fg.isCte && pItem->u2.pCteUse->eM10d==M10d_Yes ){ + continue; + } + if( flattenSubquery(pParse, p, i, isAgg) ){ if( pParse->nErr ) goto select_end; /* This subquery can be absorbed into its parent. */ From aa250db66aed4ed8f969d61f05bc374aa8c2c2e6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 2 Aug 2023 12:39:56 +0000 Subject: [PATCH 23/41] Simplify the select.c logic that enforces the optimization fence around a MATERIALIZED common table expression. Do not allow the reverse_unordered_selects setting to affect a fenced CTE that itself has an ORDER BY clause. FossilOrigin-Name: 165b9bda243777ae7fb6f51ee7ad58771c581b82ef9a70268eb9764e9e6eba6f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 24 ++++++++++-------------- src/where.c | 21 ++++++++++++++++++++- 4 files changed, 38 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index 228342f6be..043e5c2130 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Never\sflatten\sa\sCTE\sthat\sis\slabeled\sMATERIALIZED.\s\sThis\sis\sreally\ssomething\nof\sa\sbug\sfix\sbecause\sthe\sdocumentation\ssays\sthat\sa\sMATERIALIZED\sCTE\sis\san\noptimization\sbarrier. -D 2023-08-02T11:06:27.030 +C Simplify\sthe\sselect.c\slogic\sthat\senforces\sthe\soptimization\sfence\saround\na\sMATERIALIZED\scommon\stable\sexpression.\s\sDo\snot\sallow\sthe\nreverse_unordered_selects\ssetting\sto\saffect\sa\sfenced\sCTE\sthat\sitself\shas\nan\sORDER\sBY\sclause. +D 2023-08-02T12:39:56.675 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -643,7 +643,7 @@ F src/printf.c e3ba080e2f409f9bfcc8d34724e6fc160e9c718dc92d0548f6b71b8b6f860ce2 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 37953a5f36c60bea413c3c04efcd433b6177009f508ef2ace0494728912fe2e9 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c 10ff496138ffa5bf5c3d9c7808b7558cb9b398d12062c464037167748075a13f +F src/select.c 8a8b7117bed5b7ce8122b611a9a7ff9504c523de3793d3a26661bf8ad81577ef F src/shell.c.in 694aaf751f00610381533d4a31c83d142cfc83ef91ef65e2aa6912ace7c39b40 F src/sqlite.h.in 7b07a33d2af82ee974aa91e6294abce0282b2f4c5934b291d2fff961810dd867 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -728,7 +728,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c dd843f619ac60d5dadab7109cf402432ba74dde0c301505fd1c202add07659e3 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7c7ea0115345851c3da4e04e2e239a29983b61fb5b038b94eede6aba462640e2 -F src/where.c dbbd8588329e211fc797ee3d48cde21ad7a3ba0f9b135db9f10e5ba44690cf43 +F src/where.c d4240edf4c78b94e705f774509f0552ebcf08a1d2ee169fe14d66eccb4dc910a F src/whereInt.h c7d19902863beadec1d04e66aca39c0bcd60b74f05f0eaa7422c7005dfc5d51a F src/wherecode.c 5d77db30a2a3dd532492ae882de114edba2fae672622056b1c7fd61f5917a8f1 F src/whereexpr.c dc5096eca5ed503999be3bdee8a90c51361289a678d396a220912e9cb73b3c00 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P aa769ee7477171f26a091cadff98aa4f48da7752ade20b405a95c4525456f62e -R 5d3359f6c6d5e2c6f797651e2c52272a +P b7ef9796f548ce43e06673f86bbec68157aae5e4ee8451e1d87ee5f70af1bb27 +R b2e3c3d0a4d53532b578742c3846e988 U drh -Z d3d190ae3372df83f9be614d98609288 +Z 94c05c39e8f919e5e81448014dcce915 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1ef995c32e..9736ae7713 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b7ef9796f548ce43e06673f86bbec68157aae5e4ee8451e1d87ee5f70af1bb27 \ No newline at end of file +165b9bda243777ae7fb6f51ee7ad58771c581b82ef9a70268eb9764e9e6eba6f \ No newline at end of file diff --git a/src/select.c b/src/select.c index 7a3ba4a6fa..482d7283c3 100644 --- a/src/select.c +++ b/src/select.c @@ -7285,6 +7285,14 @@ int sqlite3Select( goto select_end; } + /* Do not attempt the usual optimizations (flattening and ORDER BY + ** elimination) on a MATERIALIZED common table expression because + ** a MATERIALIZED common table expression is an optimization fence. + */ + if( pItem->fg.isCte && pItem->u2.pCteUse->eM10d==M10d_Yes ){ + continue; + } + /* Do not try to flatten an aggregate subquery. ** ** Flattening an aggregate subquery is only possible if the outer query @@ -7315,21 +7323,14 @@ int sqlite3Select( ** (b) The subquery is part of a join ** See forum post 062d576715d277c8 ** - ** The above cases might get an incorrect result if ORDER BY is omitted. - ** The following constraints are not required for correct answers, but are - ** included in order to give developers more control over when a sort - ** occurs: - ** - ** (6) The subquery is really a MATERIALIZED CTE - ** (7) The OmitOrderBy optimization is disabled + ** Also retain the ORDER BY if the OmitOrderBy optimization is disabled. */ if( pSub->pOrderBy!=0 && (p->pOrderBy!=0 || pTabList->nSrc>1) /* Condition (5) */ && pSub->pLimit==0 /* Condition (1) */ && (pSub->selFlags & SF_OrderByReqd)==0 /* Condition (2) */ && (p->selFlags & SF_OrderByReqd)==0 /* Condition (3) and (4) */ - && (pItem->fg.isCte==0 || pItem->u2.pCteUse->eM10d!=M10d_Yes) /* (6) */ - && OptimizationEnabled(db, SQLITE_OmitOrderBy) /* (7) */ + && OptimizationEnabled(db, SQLITE_OmitOrderBy) ){ TREETRACE(0x800,pParse,p, ("omit superfluous ORDER BY on %r FROM-clause subquery\n",i+1)); @@ -7366,11 +7367,6 @@ int sqlite3Select( continue; } - /* Do not flatten a MATERIALIZED CTE */ - if( pItem->fg.isCte && pItem->u2.pCteUse->eM10d==M10d_Yes ){ - continue; - } - if( flattenSubquery(pParse, p, i, isAgg) ){ if( pParse->nErr ) goto select_end; /* This subquery can be absorbed into its parent. */ diff --git a/src/where.c b/src/where.c index c75834ff59..9992b2053f 100644 --- a/src/where.c +++ b/src/where.c @@ -6122,8 +6122,27 @@ WhereInfo *sqlite3WhereBegin( if( db->mallocFailed ) goto whereBeginError; } } + assert( pWInfo->pTabList!=0 ); if( pWInfo->pOrderBy==0 && (db->flags & SQLITE_ReverseOrder)!=0 ){ - pWInfo->revMask = ALLBITS; + for(ii=0; iipTabList->nSrc; ii++){ + /* The PRAGMA reverse_unordered_selects=ON setting (also accessible + ** using SQLITE_DBCONFIG_REVERSE_SCANORDER) means to reverse the scan + ** order for any table that is part of a query that does not have an + ** ORDER BY clause. + ** + ** Except, do not reverse the output from MATERIALIZED common table + ** expression that has an internal ORDER BY clause, because a + ** MATERIALIZED common table expression is an optimization fence. + */ + SrcItem *pItem = &pWInfo->pTabList->a[ii]; + if( !pItem->fg.isCte + || pItem->u2.pCteUse->eM10d!=M10d_Yes + || NEVER(pItem->pSelect==0) + || pItem->pSelect->pOrderBy==0 + ){ + pWInfo->revMask |= MASKBIT(ii); + } + } } if( pParse->nErr ){ goto whereBeginError; From 26cf4af5d79775af5ebfb19c46ea9a71655916ef Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 2 Aug 2023 13:29:01 +0000 Subject: [PATCH 24/41] Remove a condition from query flattening that is now taken care of by the caller. Factor out the reverse_unordered_selects processing from the main loop of sqlite3WhereBegin() for performance. FossilOrigin-Name: f068f105fb158634321bf6401f0774c81059932d213a18b627ae98bcffc10912 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 9 +++++---- src/where.c | 42 +++++++++++++++++++++++------------------- 4 files changed, 36 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index 043e5c2130..4664e580eb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplify\sthe\sselect.c\slogic\sthat\senforces\sthe\soptimization\sfence\saround\na\sMATERIALIZED\scommon\stable\sexpression.\s\sDo\snot\sallow\sthe\nreverse_unordered_selects\ssetting\sto\saffect\sa\sfenced\sCTE\sthat\sitself\shas\nan\sORDER\sBY\sclause. -D 2023-08-02T12:39:56.675 +C Remove\sa\scondition\sfrom\squery\sflattening\sthat\sis\snow\staken\scare\sof\sby\nthe\scaller.\s\sFactor\sout\sthe\sreverse_unordered_selects\sprocessing\sfrom\sthe\nmain\sloop\sof\ssqlite3WhereBegin()\sfor\sperformance. +D 2023-08-02T13:29:01.398 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -643,7 +643,7 @@ F src/printf.c e3ba080e2f409f9bfcc8d34724e6fc160e9c718dc92d0548f6b71b8b6f860ce2 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 37953a5f36c60bea413c3c04efcd433b6177009f508ef2ace0494728912fe2e9 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c 8a8b7117bed5b7ce8122b611a9a7ff9504c523de3793d3a26661bf8ad81577ef +F src/select.c abf48be202d35c4f450325b61992e98ac4aa81ed1e29709069432877d3b555d3 F src/shell.c.in 694aaf751f00610381533d4a31c83d142cfc83ef91ef65e2aa6912ace7c39b40 F src/sqlite.h.in 7b07a33d2af82ee974aa91e6294abce0282b2f4c5934b291d2fff961810dd867 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -728,7 +728,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c dd843f619ac60d5dadab7109cf402432ba74dde0c301505fd1c202add07659e3 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7c7ea0115345851c3da4e04e2e239a29983b61fb5b038b94eede6aba462640e2 -F src/where.c d4240edf4c78b94e705f774509f0552ebcf08a1d2ee169fe14d66eccb4dc910a +F src/where.c b8917792f1e0dbfa28fb29e6cd3d560060d69667be0ba4c491cbc772363264f5 F src/whereInt.h c7d19902863beadec1d04e66aca39c0bcd60b74f05f0eaa7422c7005dfc5d51a F src/wherecode.c 5d77db30a2a3dd532492ae882de114edba2fae672622056b1c7fd61f5917a8f1 F src/whereexpr.c dc5096eca5ed503999be3bdee8a90c51361289a678d396a220912e9cb73b3c00 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b7ef9796f548ce43e06673f86bbec68157aae5e4ee8451e1d87ee5f70af1bb27 -R b2e3c3d0a4d53532b578742c3846e988 +P 165b9bda243777ae7fb6f51ee7ad58771c581b82ef9a70268eb9764e9e6eba6f +R 2044877763bac67c01e0c206bcedee44 U drh -Z 94c05c39e8f919e5e81448014dcce915 +Z 1df9c853e697487617d65f29dca4002a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9736ae7713..bed6656874 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -165b9bda243777ae7fb6f51ee7ad58771c581b82ef9a70268eb9764e9e6eba6f \ No newline at end of file +f068f105fb158634321bf6401f0774c81059932d213a18b627ae98bcffc10912 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 482d7283c3..41e42b6808 100644 --- a/src/select.c +++ b/src/select.c @@ -4292,7 +4292,8 @@ static int compoundHasDifferentAffinities(Select *p){ ** (27b) the subquery is a compound query and the RIGHT JOIN occurs ** in any arm of the compound query. (See also (17g).) ** -** (28) The subquery is not a MATERIALIZED CTE. +** (28) The subquery is not a MATERIALIZED CTE. (This is handled +** in the caller before ever reaching this routine.) ** ** ** In this routine, the "p" parameter is a pointer to the outer query. @@ -4402,9 +4403,9 @@ static int flattenSubquery( if( iFrom>0 && (pSubSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ return 0; /* Restriction (27a) */ } - if( pSubitem->fg.isCte && pSubitem->u2.pCteUse->eM10d==M10d_Yes ){ - return 0; /* (28) */ - } + + /* Condition (28) is blocked by the caller */ + assert( !pSubitem->fg.isCte || pSubitem->u2.pCteUse->eM10d!=M10d_Yes ); /* Restriction (17): If the sub-query is a compound SELECT, then it must ** use only the UNION ALL operator. And none of the simple select queries diff --git a/src/where.c b/src/where.c index 9992b2053f..213df42230 100644 --- a/src/where.c +++ b/src/where.c @@ -5758,6 +5758,28 @@ static SQLITE_NOINLINE void whereAddIndexedExpr( } } +/* +** Set the reverse-scan order mask to one for all tables in the query +** with the exception of MATERIALIZED common table expressions that have +** their own internal ORDER BY clauses. +** +** This implements the PRAGMA reverse_unordered_selects=ON setting. +** (Also SQLITE_DBCONFIG_REVERSE_SCANORDER). +*/ +static SQLITE_NOINLINE void whereReverseScanOrder(WhereInfo *pWInfo){ + int ii; + for(ii=0; iipTabList->nSrc; ii++){ + SrcItem *pItem = &pWInfo->pTabList->a[ii]; + if( !pItem->fg.isCte + || pItem->u2.pCteUse->eM10d!=M10d_Yes + || NEVER(pItem->pSelect==0) + || pItem->pSelect->pOrderBy==0 + ){ + pWInfo->revMask |= MASKBIT(ii); + } + } +} + /* ** Generate the beginning of the loop used for WHERE clause processing. ** The return value is a pointer to an opaque structure that contains @@ -6124,25 +6146,7 @@ WhereInfo *sqlite3WhereBegin( } assert( pWInfo->pTabList!=0 ); if( pWInfo->pOrderBy==0 && (db->flags & SQLITE_ReverseOrder)!=0 ){ - for(ii=0; iipTabList->nSrc; ii++){ - /* The PRAGMA reverse_unordered_selects=ON setting (also accessible - ** using SQLITE_DBCONFIG_REVERSE_SCANORDER) means to reverse the scan - ** order for any table that is part of a query that does not have an - ** ORDER BY clause. - ** - ** Except, do not reverse the output from MATERIALIZED common table - ** expression that has an internal ORDER BY clause, because a - ** MATERIALIZED common table expression is an optimization fence. - */ - SrcItem *pItem = &pWInfo->pTabList->a[ii]; - if( !pItem->fg.isCte - || pItem->u2.pCteUse->eM10d!=M10d_Yes - || NEVER(pItem->pSelect==0) - || pItem->pSelect->pOrderBy==0 - ){ - pWInfo->revMask |= MASKBIT(ii); - } - } + whereReverseScanOrder(pWInfo); } if( pParse->nErr ){ goto whereBeginError; From d3229ce23e08d28c7b9b917e3bce2209945f70d2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 2 Aug 2023 13:45:16 +0000 Subject: [PATCH 25/41] Remove an unreachable branch in the ascii-to-floating-point conversion that was added by [e989a37ff9d5b52e]. FossilOrigin-Name: c4347e4400e96f932ac12f8f22484a2ebce2a578d1b2181977954c432f117bfd --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/util.c | 3 +-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 2478f35d9b..dbf0099f2d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Stricter\senforcement\sof\sthe\sidea\sthat\sa\sMATERIALIZED\scommon\stable\sexpression\nis\san\soptimization\sfence. -D 2023-08-02T13:38:02.621 +C Remove\san\sunreachable\sbranch\sin\sthe\sascii-to-floating-point\sconversion\sthat\nwas\sadded\sby\s[e989a37ff9d5b52e]. +D 2023-08-02T13:45:16.075 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -711,7 +711,7 @@ F src/trigger.c ad6ab9452715fa9a8075442e15196022275b414b9141b566af8cdb7a1605f2b0 F src/update.c d5b755580a86d235b12faf10de81e60ad97c8117f8c3063d92c772df94455d44 F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 -F src/util.c d30e9f56550fed31c09e0443820552039f61431286e8dfc41175d066f33328b5 +F src/util.c b3532a95ad56db67b3acd3955e688e4cb80ebec6fd1f459a8eb51cceedd6de69 F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104 F src/vdbe.c fe09ed1f6d66a6a9813b9a418ef388d8549d509a6fd2ea937f55d41094788faa F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0 @@ -2049,9 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e989a37ff9d5b52e0090d59be077ad2260c8df5d4c2c2d8088b1160de64dffd4 f068f105fb158634321bf6401f0774c81059932d213a18b627ae98bcffc10912 -R 2044877763bac67c01e0c206bcedee44 -T +closed f068f105fb158634321bf6401f0774c81059932d213a18b627ae98bcffc10912 +P 354425f8d97437bd156265a6914f98cce91b42abc9e773453ef4d817e308dc9a +R aa07c6b217b53d8658b8a233cbb6460f U drh -Z eda869de5d4dc94a571480d5ab12d294 +Z 99babb0a241aaf0b9de5cc7fdf7d857c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d936b03fc8..c2f1f3626d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -354425f8d97437bd156265a6914f98cce91b42abc9e773453ef4d817e308dc9a \ No newline at end of file +c4347e4400e96f932ac12f8f22484a2ebce2a578d1b2181977954c432f117bfd \ No newline at end of file diff --git a/src/util.c b/src/util.c index 002a5ef476..25fd6ff597 100644 --- a/src/util.c +++ b/src/util.c @@ -591,10 +591,9 @@ do_atof_calc: while( e<=-10 ){ e+=10; r *= 1.0e-10L; } while( e<=-1 ){ e+=1; r *= 1.0e-01L; } } + assert( r>=0.0 ); if( r>+1.7976931348623157081452742373e+308L ){ *pResult = +INFINITY; - }else if( r<-1.7976931348623157081452742373e+308L ){ - *pResult = -INFINITY; }else{ *pResult = (double)r; } From c874d60353c0a3ef592e1e77129b2b083a01af7f Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 2 Aug 2023 16:06:02 +0000 Subject: [PATCH 26/41] Performance optimization for JSON rendering logic. FossilOrigin-Name: ea0b9aecbaca9a8e784fd2bcb50f78cbdcf4c5cfb45a7700bb222e4cc104c644 --- manifest | 12 +++---- manifest.uuid | 2 +- src/json.c | 94 +++++++++++++++++++++++++++++---------------------- 3 files changed, 60 insertions(+), 48 deletions(-) diff --git a/manifest b/manifest index dbf0099f2d..bd8750b7dc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunreachable\sbranch\sin\sthe\sascii-to-floating-point\sconversion\sthat\nwas\sadded\sby\s[e989a37ff9d5b52e]. -D 2023-08-02T13:45:16.075 +C Performance\soptimization\sfor\sJSON\srendering\slogic. +D 2023-08-02T16:06:02.660 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -603,7 +603,7 @@ F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276 -F src/json.c 0bcc2e033821feb3048b8434ade2b7d22267005a0990656f4ef4ee25b4ac47bc +F src/json.c cea55234b99879a6c3be04cd01f32e83f760672356415b541929cdd16441ede3 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 176d6b2cb18a6ad73b133db17f6fc351c4d9a2d510deebdb76c22bde9cfd1465 F src/main.c 512b1d45bc556edf4471a845afb7ba79e64bd5b832ab222dc195c469534cd002 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 354425f8d97437bd156265a6914f98cce91b42abc9e773453ef4d817e308dc9a -R aa07c6b217b53d8658b8a233cbb6460f +P c4347e4400e96f932ac12f8f22484a2ebce2a578d1b2181977954c432f117bfd +R a3168d15b44149a629121fdff1d59acd U drh -Z 99babb0a241aaf0b9de5cc7fdf7d857c +Z 37bd268b83df81194e3e4e7be36a0655 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c2f1f3626d..ca5b942d1b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c4347e4400e96f932ac12f8f22484a2ebce2a578d1b2181977954c432f117bfd \ No newline at end of file +ea0b9aecbaca9a8e784fd2bcb50f78cbdcf4c5cfb45a7700bb222e4cc104c644 \ No newline at end of file diff --git a/src/json.c b/src/json.c index 2a002ba087..5038fd3c46 100644 --- a/src/json.c +++ b/src/json.c @@ -30,25 +30,51 @@ ** increase for the parser. (Ubuntu14.10 gcc 4.8.4 x64 with -Os). */ static const char jsonIsSpace[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; #define fast_isspace(x) (jsonIsSpace[(unsigned char)x]) +/* +** Characters that are special to JSON. Control charaters, +** '"' and '\\'. +*/ +static const char jsonIsOk[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + + #if !defined(SQLITE_DEBUG) && !defined(SQLITE_COVERAGE_TEST) # define VVA(X) #else @@ -357,11 +383,16 @@ static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ p->zBuf[p->nUsed++] = '"'; for(i=0; izBuf[p->nUsed++] = c; + }else if( c=='"' || c=='\\' ){ json_simple_escape: if( (p->nUsed+N+3-i > p->nAlloc) && jsonGrow(p,N+3-i)!=0 ) return; p->zBuf[p->nUsed++] = '\\'; - }else if( c<=0x1f ){ + p->zBuf[p->nUsed++] = c; + }else if( c=='\'' ){ + p->zBuf[p->nUsed++] = c; + }else{ static const char aSpecial[] = { 0, 0, 0, 0, 0, 0, 0, 0, 'b', 't', 'n', 0, 'f', 'r', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 @@ -372,6 +403,7 @@ static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ assert( aSpecial['\n']=='n' ); assert( aSpecial['\r']=='r' ); assert( aSpecial['\t']=='t' ); + assert( c>=0 && czBuf[p->nUsed++] = 'u'; p->zBuf[p->nUsed++] = '0'; p->zBuf[p->nUsed++] = '0'; - p->zBuf[p->nUsed++] = '0' + (c>>4); - c = "0123456789abcdef"[c&0xf]; + p->zBuf[p->nUsed++] = "0123456789abcdef"[c>>4]; + p->zBuf[p->nUsed++] = "0123456789abcdef"[c&0xf]; } - p->zBuf[p->nUsed++] = c; } p->zBuf[p->nUsed++] = '"'; assert( p->nUsednAlloc ); @@ -1465,26 +1496,7 @@ json_parse_restart: parse_string: cDelim = z[i]; for(j=i+1; 1; j++){ - static const char aOk[256] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - }; - if( aOk[(unsigned char)z[j]] ) continue; + if( jsonIsOk[(unsigned char)z[j]] ) continue; c = z[j]; if( c==cDelim ){ break; From 9b1334b7d3a31f80e43e3f467de38c8c645830bb Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 3 Aug 2023 12:41:30 +0000 Subject: [PATCH 27/41] Unix builds now assume the presence of nanosleep() in the standard library. The -DHAVE_NANOSLEEP=0 compile-time option can be used to build on systems (if any still exist) where this is not the case. FossilOrigin-Name: 779d5dc8797ea246d0397f7e94b1be716b0baa735e8d9f5a6fc4cffd887a7420 --- Makefile.linux-gcc | 6 ------ manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/main.c | 4 ++-- src/os_unix.c | 9 +++++++-- tool/build-shell.sh | 1 - tool/warnings.sh | 1 - 7 files changed, 20 insertions(+), 23 deletions(-) diff --git a/Makefile.linux-gcc b/Makefile.linux-gcc index ad5d4dd093..fe7349ad46 100644 --- a/Makefile.linux-gcc +++ b/Makefile.linux-gcc @@ -22,12 +22,6 @@ TOP = ../sqlite BCC = gcc -g -O0 #BCC = /opt/ancic/bin/c89 -0 -#### If the target operating system supports the "usleep()" system -# call, then define the HAVE_USLEEP macro for all C modules. -# -#USLEEP = -USLEEP = -DHAVE_USLEEP=1 - #### If you want the SQLite library to be safe for use within a # multi-threaded program, then define the following macro # appropriately: diff --git a/manifest b/manifest index bd8750b7dc..fe38d65c6d 100644 --- a/manifest +++ b/manifest @@ -1,10 +1,10 @@ -C Performance\soptimization\sfor\sJSON\srendering\slogic. -D 2023-08-02T16:06:02.660 +C Unix\sbuilds\snow\sassume\sthe\spresence\sof\snanosleep()\sin\sthe\sstandard\slibrary.\nThe\s-DHAVE_NANOSLEEP=0\scompile-time\soption\scan\sbe\sused\sto\sbuild\son\ssystems\n(if\sany\sstill\sexist)\swhere\sthis\sis\snot\sthe\scase. +D 2023-08-03T12:41:30.503 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in 0f4cb3955aaff8a40ec3857ba1784bd98b69802e51eff979f874b65713b627b2 -F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 +F Makefile.linux-gcc f3842a0b1efbfbb74ac0ef60e56b301836d05b4d867d014f714fa750048f1ab6 F Makefile.msc 7248d860f71ab164b4cec3c415e6cc1bd9fee860c370d65bd8bb49e9572521e2 F README.md c1c4218efcc4071a6e26db2b517fdbc1035696a29b370edd655faddbef02b224 F VERSION c6366dc72582d3144ce87b013cc35fe48d62f6d07d5be0c9716ea33c862144aa @@ -606,7 +606,7 @@ F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276 F src/json.c cea55234b99879a6c3be04cd01f32e83f760672356415b541929cdd16441ede3 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 176d6b2cb18a6ad73b133db17f6fc351c4d9a2d510deebdb76c22bde9cfd1465 -F src/main.c 512b1d45bc556edf4471a845afb7ba79e64bd5b832ab222dc195c469534cd002 +F src/main.c 6577cd908f254de4d109df58323421f5934f674f5b7ee4b4b337a055458ecad3 F src/malloc.c 47b82c5daad557d9b963e3873e99c22570fb470719082c6658bf64e3012f7d23 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2 @@ -627,7 +627,7 @@ F src/os.h 1ff5ae51d339d0e30d8a9d814f4b8f8e448169304d83a7ed9db66a65732f3e63 F src/os_common.h 6c0eb8dd40ef3e12fe585a13e709710267a258e2c8dd1c40b1948a1d14582e06 F src/os_kv.c 4d39e1f1c180b11162c6dc4aa8ad34053873a639bac6baae23272fc03349986a F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d872107 -F src/os_unix.c 95b407307deb902a3bd9a5d5666c7838709cccb337baeee6ef0a53f512d3673e +F src/os_unix.c 2e8b12107f75d1bd16412f312b4c5d5103191807a37836d3b81beb26436ad81b F src/os_win.c 7038223a1cda0a47e2ab4db47f63bf1833fe53ba0542f0f283a062ea13894103 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 5ddf3a74c633a008ea6b2f5b3186167e88e2c8ca8a252ecab06ab3f1eb48e60f @@ -1945,7 +1945,7 @@ F tool/GetFile.cs 47852aa0d806fe47ed1ac5138bdce7f000fe87aaa7f28107d0cb1e26682aeb F tool/GetTclKit.bat d84033c6a93dfe735d247f48ba00292a1cc284dcf69963e5e672444e04534bbf F tool/Replace.cs 02c67258801c2fb5f63231e0ac0f220b4b36ba91 F tool/build-all-msvc.bat c817b716e0edeecaf265a6775b63e5f45c34a6544f1d4114a222701ed5ac79ab x -F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 +F tool/build-shell.sh f193b5e3eb4afcb4abbf96bf1475be6cfb74763ee2e50c82bc7ca105e8a136c5 F tool/cg_anno.tcl c1f875f5a4c9caca3d59937b16aff716f8b1883935f1b4c9ae23124705bc8099 x F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 F tool/custom.txt 6cdf298f43e1db4bb91406d14777669b8fb1df790837823fa6754c4308decc27 @@ -2026,7 +2026,7 @@ F tool/varint.c 5d94cb5003db9dbbcbcc5df08d66f16071aee003 F tool/vdbe-compress.tcl 1dcb7632e57cf57105248029e6e162fddaf6c0fccb3bb9e6215603752c5a2d4a F tool/vdbe_profile.tcl 3ac5a4a9449f4baf77059358ea050db3e34395ccf59c5464d29b91746d5b961e F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 -F tool/warnings.sh ab651bb82586c43ff8b560beceac959735bf917b44c5e0f67ba3426e474f29f8 +F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F vsixtest/App.xaml b76d3b48860e7454775c47ea38ffea9c4abe3e85 F vsixtest/App.xaml.cpp 41158ee43269820136fa3bba00c0bd91b26cc38b650ee392aec2a8d823e54318 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c4347e4400e96f932ac12f8f22484a2ebce2a578d1b2181977954c432f117bfd -R a3168d15b44149a629121fdff1d59acd +P ea0b9aecbaca9a8e784fd2bcb50f78cbdcf4c5cfb45a7700bb222e4cc104c644 +R 31ad76526bf706e018f4fff70c0faaae U drh -Z 37bd268b83df81194e3e4e7be36a0655 +Z ffe3b8625e4fbe0c7711c5e4b79ea34e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ca5b942d1b..d1cd5ace0e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ea0b9aecbaca9a8e784fd2bcb50f78cbdcf4c5cfb45a7700bb222e4cc104c644 \ No newline at end of file +779d5dc8797ea246d0397f7e94b1be716b0baa735e8d9f5a6fc4cffd887a7420 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 8f21af13ee..35851b64e4 100644 --- a/src/main.c +++ b/src/main.c @@ -1665,9 +1665,9 @@ static int sqliteDefaultBusyCallback( void *ptr, /* Database connection */ int count /* Number of times table has been busy */ ){ -#if SQLITE_OS_WIN || HAVE_USLEEP +#if SQLITE_OS_WIN || !defined(HAVE_NANOSLEEP) || HAVE_NANOSLEEP /* This case is for systems that have support for sleeping for fractions of - ** a second. Examples: All windows systems, unix systems with usleep() */ + ** a second. Examples: All windows systems, unix systems with nanosleep() */ static const u8 delays[] = { 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 }; static const u8 totals[] = diff --git a/src/os_unix.c b/src/os_unix.c index aed4ac213f..59f67d142a 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -6715,12 +6715,17 @@ static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){ ** than the argument. */ static int unixSleep(sqlite3_vfs *NotUsed, int microseconds){ -#if OS_VXWORKS || _POSIX_C_SOURCE >= 199309L +#if !defined(HAVE_NANOSLEEP) || HAVE_NANOSLEEP+0 struct timespec sp; - sp.tv_sec = microseconds / 1000000; sp.tv_nsec = (microseconds % 1000000) * 1000; + + /* Almost all modern unix systems support nanosleep(). But if you are + ** compiling for one of the rare exceptions, you can use + ** -DHAVE_NANOSLEEP=0 (perhaps in conjuction with -DHAVE_USLEEP if + ** usleep() is available) in order to bypass the use of nanosleep() */ nanosleep(&sp, NULL); + UNUSED_PARAMETER(NotUsed); return microseconds; #elif defined(HAVE_USLEEP) && HAVE_USLEEP diff --git a/tool/build-shell.sh b/tool/build-shell.sh index 6a48299d73..a57f753039 100644 --- a/tool/build-shell.sh +++ b/tool/build-shell.sh @@ -16,7 +16,6 @@ gcc -o sqlite3 -g -Os -I. \ -DSQLITE_ENABLE_FTS4 \ -DSQLITE_ENABLE_RTREE \ -DHAVE_READLINE \ - -DHAVE_USLEEP=1 \ ../sqlite/src/shell.c \ ../sqlite/src/test_vfstrace.c \ sqlite3.c -ldl -lreadline -lncurses diff --git a/tool/warnings.sh b/tool/warnings.sh index 60d2b42100..2b962d15ed 100644 --- a/tool/warnings.sh +++ b/tool/warnings.sh @@ -32,7 +32,6 @@ if test x`uname` = 'xLinux'; then echo '********** Android configuration ******************************' echo '********** ' Options: $WARNING_ANDROID_OPTS gcc -c \ - -DHAVE_USLEEP=1 \ -DSQLITE_HAVE_ISNAN \ -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \ -DSQLITE_THREADSAFE=2 \ From 038ac625afbc0a67c5ac9d5a9c780e8a28391baa Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 3 Aug 2023 13:07:58 +0000 Subject: [PATCH 28/41] Fix a test case whose value changes under the no_optimization permutation due to the recent change to add the ability for SQLITE_TESTCTRL_OPTIMIZATION to disable one-pass. FossilOrigin-Name: 976e39c6322f9e51054546e2d9bc135b683d141054c645c9098002cdc310c7c7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/where7.test | 39 +++++++++++++++++++++++++++------------ 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index fe38d65c6d..e5c85bcc84 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Unix\sbuilds\snow\sassume\sthe\spresence\sof\snanosleep()\sin\sthe\sstandard\slibrary.\nThe\s-DHAVE_NANOSLEEP=0\scompile-time\soption\scan\sbe\sused\sto\sbuild\son\ssystems\n(if\sany\sstill\sexist)\swhere\sthis\sis\snot\sthe\scase. -D 2023-08-03T12:41:30.503 +C Fix\sa\stest\scase\swhose\svalue\schanges\sunder\sthe\sno_optimization\spermutation\ndue\sto\sthe\srecent\schange\sto\sadd\sthe\sability\sfor\sSQLITE_TESTCTRL_OPTIMIZATION\nto\sdisable\sone-pass. +D 2023-08-03T13:07:58.560 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1871,7 +1871,7 @@ F test/where3.test 5b4ffc0ac2ea0fe92f02b1244b7531522fe4d7bccf6fa8741d54e82c10e67 F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b -F test/where7.test 1c1bf436bf31b913d4764a2b62ac6e98b9681e5c7ae2b562605592a56b7e946b +F test/where7.test 15041c7a5838f3bac98f3fb933709674a0b59367664e88fafaf105ff7416eb07 F test/where8.test 461ca40265ed996a6305da99bb024b0e41602bb586acf544c08f95922358e49f F test/where9.test 2db942671a002621eff4f713e347bb25243295f79d8990297cd160bebcfde3f7 F test/whereA.test 9d1077b117f1b68d5f739d94f36956c36cf995eb87bb19b77b2e81af020edd20 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ea0b9aecbaca9a8e784fd2bcb50f78cbdcf4c5cfb45a7700bb222e4cc104c644 -R 31ad76526bf706e018f4fff70c0faaae +P 779d5dc8797ea246d0397f7e94b1be716b0baa735e8d9f5a6fc4cffd887a7420 +R 3418b5d1d9cfd0be016a4ba94e2517df U drh -Z ffe3b8625e4fbe0c7711c5e4b79ea34e +Z 9cbbb52059b4c8fcaaea8c508412b455 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d1cd5ace0e..5d80c9e958 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -779d5dc8797ea246d0397f7e94b1be716b0baa735e8d9f5a6fc4cffd887a7420 \ No newline at end of file +976e39c6322f9e51054546e2d9bc135b683d141054c645c9098002cdc310c7c7 \ No newline at end of file diff --git a/test/where7.test b/test/where7.test index f76e8aba8b..681684b809 100644 --- a/test/where7.test +++ b/test/where7.test @@ -47,18 +47,33 @@ do_test where7-1.1 { SELECT * FROM t1; } } {1 2 3 4 2 3 4 5 3 4 6 8 4 5 10 15 5 10 100 1000} -do_execsql_test where7-1.1.1 { - CREATE TABLE t(a); - CREATE INDEX ta ON t(a); - INSERT INTO t(a) VALUES(1),(2); - SELECT * FROM t ORDER BY a; - SELECT * FROM t WHERE a<2 OR a<3 ORDER BY a; - PRAGMA count_changes=ON; - DELETE FROM t WHERE a<2 OR a<3; - SELECT * FROM t; - PRAGMA count_changes=OFF; - DROP TABLE t; -} {1 2 1 2 2} +if {[permutation] != "no_optimization"} { + do_execsql_test where7-1.1.1 { + CREATE TABLE t(a); + CREATE INDEX ta ON t(a); + INSERT INTO t(a) VALUES(1),(2); + SELECT * FROM t ORDER BY a; + SELECT * FROM t WHERE a<2 OR a<3 ORDER BY a; + PRAGMA count_changes=ON; + DELETE FROM t WHERE a<2 OR a<3; + SELECT * FROM t; + PRAGMA count_changes=OFF; + DROP TABLE t; + } {1 2 1 2 2} +} else { + do_execsql_test where7-1.1.1-noopt { + CREATE TABLE t(a); + CREATE INDEX ta ON t(a); + INSERT INTO t(a) VALUES(1),(2); + SELECT * FROM t ORDER BY a; + SELECT * FROM t WHERE a<2 OR a<3 ORDER BY a; + PRAGMA count_changes=ON; + DELETE FROM t WHERE a<2 OR a<3; + SELECT * FROM t; + PRAGMA count_changes=OFF; + DROP TABLE t; + } {1 2 1 2 3} +} do_test where7-1.2 { count_steps { SELECT a FROM t1 WHERE b=3 OR c=6 ORDER BY a From 86d77fd95da74bf60015f417c38bc3f8ce9e8823 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 3 Aug 2023 13:30:00 +0000 Subject: [PATCH 29/41] Fix build problems associated with SQLITE_OMIT_WSD and SQLITE_OMIT_TRIGGER. FossilOrigin-Name: de031a5ec863b11f0216d1a114740c8cf4572adb034a5d35ff1a5c07d81df800 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/main.c | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index e5c85bcc84..c561f70d23 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stest\scase\swhose\svalue\schanges\sunder\sthe\sno_optimization\spermutation\ndue\sto\sthe\srecent\schange\sto\sadd\sthe\sability\sfor\sSQLITE_TESTCTRL_OPTIMIZATION\nto\sdisable\sone-pass. -D 2023-08-03T13:07:58.560 +C Fix\sbuild\sproblems\sassociated\swith\sSQLITE_OMIT_WSD\sand\sSQLITE_OMIT_TRIGGER. +D 2023-08-03T13:30:00.596 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -606,7 +606,7 @@ F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276 F src/json.c cea55234b99879a6c3be04cd01f32e83f760672356415b541929cdd16441ede3 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 176d6b2cb18a6ad73b133db17f6fc351c4d9a2d510deebdb76c22bde9cfd1465 -F src/main.c 6577cd908f254de4d109df58323421f5934f674f5b7ee4b4b337a055458ecad3 +F src/main.c fde8f13c876a658b4e8b74b77d875ca887915c174ea6a2f3122d80966f93d865 F src/malloc.c 47b82c5daad557d9b963e3873e99c22570fb470719082c6658bf64e3012f7d23 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 779d5dc8797ea246d0397f7e94b1be716b0baa735e8d9f5a6fc4cffd887a7420 -R 3418b5d1d9cfd0be016a4ba94e2517df +P 976e39c6322f9e51054546e2d9bc135b683d141054c645c9098002cdc310c7c7 +R 40d68a1e2b5e7519a82f2b48f113678b U drh -Z 9cbbb52059b4c8fcaaea8c508412b455 +Z 074a872d132d6de9725cc473b22a921e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5d80c9e958..c6f70cdde2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -976e39c6322f9e51054546e2d9bc135b683d141054c645c9098002cdc310c7c7 \ No newline at end of file +de031a5ec863b11f0216d1a114740c8cf4572adb034a5d35ff1a5c07d81df800 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 35851b64e4..cd02008909 100644 --- a/src/main.c +++ b/src/main.c @@ -4160,10 +4160,12 @@ int sqlite3_test_control(int op, ...){ sqlite3ShowSrcList(0); sqlite3ShowWith(0); sqlite3ShowUpsert(0); +#ifndef SQLITE_OMIT_TRIGGER sqlite3ShowTriggerStep(0); sqlite3ShowTriggerStepList(0); sqlite3ShowTrigger(0); sqlite3ShowTriggerList(0); +#endif #ifndef SQLITE_OMIT_WINDOWFUNC sqlite3ShowWindow(0); sqlite3ShowWinFunc(0); @@ -4470,6 +4472,7 @@ int sqlite3_test_control(int op, ...){ break; } +#if !defined(SQLITE_OMIT_WSD) /* sqlite3_test_control(SQLITE_TESTCTRL_USELONGDOUBLE, int X); ** ** X<0 Make no changes to the bUseLongDouble. Just report value. @@ -4484,6 +4487,7 @@ int sqlite3_test_control(int op, ...){ rc = sqlite3Config.bUseLongDouble!=0; break; } +#endif #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_WSD) From e98fa205f8ea1d131ed484dbfe230ebe301805bd Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 3 Aug 2023 16:22:59 +0000 Subject: [PATCH 30/41] Fix a discrepancy between sqlite3_values_to_js() and its API docs/intended behavior. FossilOrigin-Name: 7b85c68fe252c0aa69724c82a95a4432e33ebdfb879b4b1b2ee2f9b98e9b792a --- ext/wasm/api/sqlite3-api-prologue.js | 3 ++- manifest | 15 ++++++++------- manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/ext/wasm/api/sqlite3-api-prologue.js b/ext/wasm/api/sqlite3-api-prologue.js index 0179091c02..3b29041c37 100644 --- a/ext/wasm/api/sqlite3-api-prologue.js +++ b/ext/wasm/api/sqlite3-api-prologue.js @@ -1645,7 +1645,8 @@ globalThis.sqlite3ApiBootstrap = function sqlite3ApiBootstrap( do not. */ tgt.push(capi.sqlite3_value_to_js( - wasm.peekPtr(pArgv + (wasm.ptrSizeof * i)) + wasm.peekPtr(pArgv + (wasm.ptrSizeof * i)), + throwIfCannotConvert )); } return tgt; diff --git a/manifest b/manifest index c561f70d23..dbc667823d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sbuild\sproblems\sassociated\swith\sSQLITE_OMIT_WSD\sand\sSQLITE_OMIT_TRIGGER. -D 2023-08-03T13:30:00.596 +C Fix\sa\sdiscrepancy\sbetween\ssqlite3_values_to_js()\sand\sits\sAPI\sdocs/intended\sbehavior. +D 2023-08-03T16:22:59.638 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -502,7 +502,7 @@ F ext/wasm/api/pre-js.c-pp.js ad906703f7429590f2fbf5e6498513bf727a1a4f0ebfa057af F ext/wasm/api/sqlite3-api-cleanup.js d235ad237df6954145404305040991c72ef8b1881715d2a650dda7b3c2576d0e F ext/wasm/api/sqlite3-api-glue.js cc6b0bb093bdb6279d4af259200b7b9e150e3796a8a3a4cd09a4928c43d25e56 F ext/wasm/api/sqlite3-api-oo1.js 9678dc4d9a5d39632b6ffe6ea94a023119260815bf32f265bf5f6c36c9516db8 -F ext/wasm/api/sqlite3-api-prologue.js cbd7d6ba185f3a844a8b0020e954b49bbc2ca78b305d117bec2ceca21431795a +F ext/wasm/api/sqlite3-api-prologue.js 76258e160bf6a89cc75a7d3c05646a054c8cab7219cd1e10bc20cacaad022131 F ext/wasm/api/sqlite3-api-worker1.js 9f32af64df1a031071912eea7a201557fe39b1738645c0134562bb84e88e2fec F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89 F ext/wasm/api/sqlite3-opfs-async-proxy.js 8cf8a897726f14071fae6be6648125162b256dfb4f96555b865dbb7a6b65e379 @@ -2049,8 +2049,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 976e39c6322f9e51054546e2d9bc135b683d141054c645c9098002cdc310c7c7 -R 40d68a1e2b5e7519a82f2b48f113678b -U drh -Z 074a872d132d6de9725cc473b22a921e +P de031a5ec863b11f0216d1a114740c8cf4572adb034a5d35ff1a5c07d81df800 +Q +16658b3c64d7f9690b097d999a8fbdc49dedf484f72174059718a768f61e875b +R 55916300ac43184f7146da8616ab0a51 +U stephan +Z 9985db6b390182c2180df3f18c974ea5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c6f70cdde2..b6b88d18ed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -de031a5ec863b11f0216d1a114740c8cf4572adb034a5d35ff1a5c07d81df800 \ No newline at end of file +7b85c68fe252c0aa69724c82a95a4432e33ebdfb879b4b1b2ee2f9b98e9b792a \ No newline at end of file From 1050f1d2a1b1e5fc55107e262af1ab0a748b26f1 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 3 Aug 2023 18:14:09 +0000 Subject: [PATCH 31/41] Fix harmless scan-build warnings. FossilOrigin-Name: 65a8716d8a1b7c5cffe9cdd25e4cbfa6528fcb146ff0fe67b0ce771b0537473d --- manifest | 17 ++++++++--------- manifest.uuid | 2 +- src/json.c | 4 ++++ src/vdbe.c | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index dbc667823d..c8e6117716 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sdiscrepancy\sbetween\ssqlite3_values_to_js()\sand\sits\sAPI\sdocs/intended\sbehavior. -D 2023-08-03T16:22:59.638 +C Fix\sharmless\sscan-build\swarnings. +D 2023-08-03T18:14:09.385 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -603,7 +603,7 @@ F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276 -F src/json.c cea55234b99879a6c3be04cd01f32e83f760672356415b541929cdd16441ede3 +F src/json.c d2b7f613a1792043f8e758fdcfe9469f9b81f522999b508f436517752a5d7071 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 176d6b2cb18a6ad73b133db17f6fc351c4d9a2d510deebdb76c22bde9cfd1465 F src/main.c fde8f13c876a658b4e8b74b77d875ca887915c174ea6a2f3122d80966f93d865 @@ -713,7 +713,7 @@ F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c b3532a95ad56db67b3acd3955e688e4cb80ebec6fd1f459a8eb51cceedd6de69 F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104 -F src/vdbe.c fe09ed1f6d66a6a9813b9a418ef388d8549d509a6fd2ea937f55d41094788faa +F src/vdbe.c e756796005fef77ae31301ef61ff14c6cff20c1ad6983043d0b3eb54daaf6388 F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0 F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c F src/vdbeapi.c f37822f215740ede2a8fcae99bc13f2cc3a72dd0e1d22b81b9298c5ca67dbc38 @@ -2049,9 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P de031a5ec863b11f0216d1a114740c8cf4572adb034a5d35ff1a5c07d81df800 -Q +16658b3c64d7f9690b097d999a8fbdc49dedf484f72174059718a768f61e875b -R 55916300ac43184f7146da8616ab0a51 -U stephan -Z 9985db6b390182c2180df3f18c974ea5 +P 7b85c68fe252c0aa69724c82a95a4432e33ebdfb879b4b1b2ee2f9b98e9b792a +R a96e12cc291a62ed113edd0653bd4bea +U drh +Z 67ca6292663d3822f9f5b8d1466985b4 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b6b88d18ed..e50410a988 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7b85c68fe252c0aa69724c82a95a4432e33ebdfb879b4b1b2ee2f9b98e9b792a \ No newline at end of file +65a8716d8a1b7c5cffe9cdd25e4cbfa6528fcb146ff0fe67b0ce771b0537473d \ No newline at end of file diff --git a/src/json.c b/src/json.c index 5038fd3c46..1e4b94e7aa 100644 --- a/src/json.c +++ b/src/json.c @@ -1101,7 +1101,9 @@ static int jsonParseAddNode( if( pParse->nNode>=pParse->nAlloc ){ return jsonParseAddNodeExpand(pParse, eType, n, zContent); } + assert( pParse->aNode!=0 ); p = &pParse->aNode[pParse->nNode]; + assert( p!=0 ); p->eType = (u8)(eType & 0xff); p->jnFlags = (u8)(eType >> 8); VVA( p->eU = zContent ? 1 : 0 ); @@ -1121,6 +1123,8 @@ static void jsonParseAddNodeArray( JsonNode *aNode, /* Array of nodes to add */ u32 nNode /* Number of elements in aNew */ ){ + assert( aNode!=0 ); + assert( nNode>=1 ); if( pParse->nNode + nNode > pParse->nAlloc ){ u32 nNew = pParse->nNode + nNode; JsonNode *aNew = sqlite3_realloc64(pParse->aNode, nNew*sizeof(JsonNode)); diff --git a/src/vdbe.c b/src/vdbe.c index 4634f78a4d..7d8f15690e 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3156,7 +3156,7 @@ op_column_restart: || (t>=12 && ((t&1)==0 || p5==OPFLAG_BYTELENARG)) ) ) - || (len = sqlite3VdbeSerialTypeLen(t))==0 + || sqlite3VdbeSerialTypeLen(t)==0 ){ /* Content is irrelevant for ** 1. the typeof() function, From 444424dab8c5fff24256ab32f0279e3e0b841961 Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 4 Aug 2023 08:41:55 +0000 Subject: [PATCH 32/41] Part 2 of the fix from [a0f808363318c00fd1db78b]. FossilOrigin-Name: 5c3104228d75c8fafbe24e46623777f3a8647f1b50267af61d46f7fad0e0434e --- ext/wasm/common/whwasmutil.js | 10 +++++++--- manifest | 15 ++++++++------- manifest.uuid | 2 +- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/ext/wasm/common/whwasmutil.js b/ext/wasm/common/whwasmutil.js index ee7ea20c34..4a6934f71b 100644 --- a/ext/wasm/common/whwasmutil.js +++ b/ext/wasm/common/whwasmutil.js @@ -1180,7 +1180,7 @@ globalThis.WhWasmUtilInstaller = function(target){ cache.scopedAlloc.splice(n,1); for(let p; (p = state.pop()); ){ if(target.functionEntry(p)){ - //console.warn("scopedAllocPop() uninstalling transient function",p); + //console.warn("scopedAllocPop() uninstalling function",p); target.uninstallFunction(p); } else target.dealloc(p); @@ -1637,6 +1637,7 @@ globalThis.WhWasmUtilInstaller = function(target){ 'and is not intended to be invoked from', 'client-level code. Invoked with:',opt); } + this.name = opt.name || "unnamed"; this.signature = opt.signature; if(opt.contextKey instanceof Function){ this.contextKey = opt.contextKey; @@ -1698,14 +1699,16 @@ globalThis.WhWasmUtilInstaller = function(target){ exactly the 2nd and 3rd arguments are. */ convertArg(v,argv,argIndex){ - //FuncPtrAdapter.debugOut("FuncPtrAdapter.convertArg()",this.signature,this.transient,v); + //FuncPtrAdapter.debugOut("FuncPtrAdapter.convertArg()",this.name,this.signature,this.transient,v); let pair = this.singleton; if(!pair && this.isContext){ pair = this.contextMap(this.contextKey(argv,argIndex)); + //FuncPtrAdapter.debugOut(this.name, this.signature, "contextKey() =",this.contextKey(argv,argIndex), pair); } if(pair && pair[0]===v) return pair[1]; if(v instanceof Function){ /* Install a WASM binding and return its pointer. */ + //FuncPtrAdapter.debugOut("FuncPtrAdapter.convertArg()",this.name,this.signature,this.transient,v,pair); if(this.callProxy) v = this.callProxy(v); const fp = __installFunction(v, this.signature, this.isTransient); if(FuncPtrAdapter.debugFuncInstall){ @@ -1727,13 +1730,14 @@ globalThis.WhWasmUtilInstaller = function(target){ } return fp; }else if(target.isPtr(v) || null===v || undefined===v){ + //FuncPtrAdapter.debugOut("FuncPtrAdapter.convertArg()",this.name,this.signature,this.transient,v,pair); if(pair && pair[1] && pair[1]!==v){ /* uninstall stashed mapping and replace stashed mapping with v. */ if(FuncPtrAdapter.debugFuncInstall){ FuncPtrAdapter.debugOut("FuncPtrAdapter uninstalling", this, this.contextKey(argv,argIndex), '@'+pair[1], v); } - try{target.uninstallFunction(pair[1])} + try{ cache.scopedAlloc[cache.scopedAlloc.length-1].push(pair[1]) } catch(e){/*ignored*/} pair[0] = pair[1] = (v | 0); } diff --git a/manifest b/manifest index c8e6117716..8653f8ede4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\sscan-build\swarnings. -D 2023-08-03T18:14:09.385 +C Part\s2\sof\sthe\sfix\sfrom\s[a0f808363318c00fd1db78b]. +D 2023-08-04T08:41:55.716 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -518,7 +518,7 @@ F ext/wasm/c-pp.c 6d80d8569d85713effe8b0818a3cf51dc779e3f0bf8dc88771b8998552ee25 F ext/wasm/common/SqliteTestUtil.js 7adaeffef757d8708418dc9190f72df22367b531831775804b31598b44f6aa51 F ext/wasm/common/emscripten.css 11bd104b6c0d597c67d40cc8ecc0a60dae2b965151e3b6a37fa5708bac3acd15 F ext/wasm/common/testing.css e97549bab24126c24e0daabfe2de9bb478fb0a69fdb2ddd0a73a992c091aad6f -F ext/wasm/common/whwasmutil.js db6368ee57af90ee6691b6fb3ca97ee8064d12482e06a29113127c67b08f956e +F ext/wasm/common/whwasmutil.js d7e07b1fc92ac19d341ef9522b1f5059bce1e7f5ee53381c66fda8d2f09803ae F ext/wasm/demo-123-worker.html a0b58d9caef098a626a1a1db567076fca4245e8d60ba94557ede8684350a81ed F ext/wasm/demo-123.html 8c70a412ce386bd3796534257935eb1e3ea5c581e5d5aea0490b8232e570a508 F ext/wasm/demo-123.js 38aa8faec4d0ace1c973bc8a7a1533584463ebeecd4c420daa7d9687beeb9cb5 @@ -2049,8 +2049,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7b85c68fe252c0aa69724c82a95a4432e33ebdfb879b4b1b2ee2f9b98e9b792a -R a96e12cc291a62ed113edd0653bd4bea -U drh -Z 67ca6292663d3822f9f5b8d1466985b4 +P 65a8716d8a1b7c5cffe9cdd25e4cbfa6528fcb146ff0fe67b0ce771b0537473d +Q +ce0674b1925138f8f878b11aae0f8420bd968df0959f6dd7e208fb84bcbad07e +R f31eaa202d402d0cb9f28c3fcacef5ec +U stephan +Z ae593bdf056165949851304ee1f109ec # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e50410a988..41889df033 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -65a8716d8a1b7c5cffe9cdd25e4cbfa6528fcb146ff0fe67b0ce771b0537473d \ No newline at end of file +5c3104228d75c8fafbe24e46623777f3a8647f1b50267af61d46f7fad0e0434e \ No newline at end of file From a24769454e2ddd05d543d9b3cf20401cf6c43bdb Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 4 Aug 2023 08:45:25 +0000 Subject: [PATCH 33/41] Resolve the timing/ordering issue of a JS-to-WASM-converted xDestroy() function being uninstalled from WASM right before the underlying native call tries to call it. This has been a long-unnoticed bug which appears only when removing such functions or replacing them. FossilOrigin-Name: 031c9a76b6ad1572e7a88f4d2d62f206b0d37bd1170e2c8a24248c5ec628f2f5 --- ext/wasm/common/whwasmutil.js | 15 ++++++++++++--- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/ext/wasm/common/whwasmutil.js b/ext/wasm/common/whwasmutil.js index 4a6934f71b..0437ef35d8 100644 --- a/ext/wasm/common/whwasmutil.js +++ b/ext/wasm/common/whwasmutil.js @@ -613,8 +613,6 @@ globalThis.WhWasmUtilInstaller = function(target){ target.installFunction = (func, sig)=>__installFunction(func, sig, false); /** - EXPERIMENTAL! DO NOT USE IN CLIENT CODE! - Works exactly like installFunction() but requires that a scopedAllocPush() is active and uninstalls the given function when that alloc scope is popped via scopedAllocPop(). @@ -1722,7 +1720,18 @@ globalThis.WhWasmUtilInstaller = function(target){ FuncPtrAdapter.debugOut("FuncPtrAdapter uninstalling", this, this.contextKey(argv,argIndex), '@'+pair[1], v); } - try{target.uninstallFunction(pair[1])} + try{ + /* Because the pending native call might rely on the + pointer we're replacing, e.g. as is normally the case + with sqlite3's xDestroy() methods, we don't + immediately uninstall but instead add its pointer to + the scopedAlloc stack, which will be cleared when the + xWrap() mechanism is done calling the native + function. We're relying very much here on xWrap() + having pushed an alloc scope. + */ + cache.scopedAlloc[cache.scopedAlloc.length-1].push(pair[1]); + } catch(e){/*ignored*/} } pair[0] = v; diff --git a/manifest b/manifest index 8653f8ede4..61c082d24f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Part\s2\sof\sthe\sfix\sfrom\s[a0f808363318c00fd1db78b]. -D 2023-08-04T08:41:55.716 +C Resolve\sthe\stiming/ordering\sissue\sof\sa\sJS-to-WASM-converted\sxDestroy()\sfunction\sbeing\suninstalled\sfrom\sWASM\sright\sbefore\sthe\sunderlying\snative\scall\stries\sto\scall\sit.\sThis\shas\sbeen\sa\slong-unnoticed\sbug\swhich\sappears\sonly\swhen\sremoving\ssuch\sfunctions\sor\sreplacing\sthem. +D 2023-08-04T08:45:25.667 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -518,7 +518,7 @@ F ext/wasm/c-pp.c 6d80d8569d85713effe8b0818a3cf51dc779e3f0bf8dc88771b8998552ee25 F ext/wasm/common/SqliteTestUtil.js 7adaeffef757d8708418dc9190f72df22367b531831775804b31598b44f6aa51 F ext/wasm/common/emscripten.css 11bd104b6c0d597c67d40cc8ecc0a60dae2b965151e3b6a37fa5708bac3acd15 F ext/wasm/common/testing.css e97549bab24126c24e0daabfe2de9bb478fb0a69fdb2ddd0a73a992c091aad6f -F ext/wasm/common/whwasmutil.js d7e07b1fc92ac19d341ef9522b1f5059bce1e7f5ee53381c66fda8d2f09803ae +F ext/wasm/common/whwasmutil.js 4c64594eecc7af4ae64259e95a71ba2a7edf118881aaff0bba86d0c7164e78e4 F ext/wasm/demo-123-worker.html a0b58d9caef098a626a1a1db567076fca4245e8d60ba94557ede8684350a81ed F ext/wasm/demo-123.html 8c70a412ce386bd3796534257935eb1e3ea5c581e5d5aea0490b8232e570a508 F ext/wasm/demo-123.js 38aa8faec4d0ace1c973bc8a7a1533584463ebeecd4c420daa7d9687beeb9cb5 @@ -2049,9 +2049,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 65a8716d8a1b7c5cffe9cdd25e4cbfa6528fcb146ff0fe67b0ce771b0537473d -Q +ce0674b1925138f8f878b11aae0f8420bd968df0959f6dd7e208fb84bcbad07e -R f31eaa202d402d0cb9f28c3fcacef5ec +P 5c3104228d75c8fafbe24e46623777f3a8647f1b50267af61d46f7fad0e0434e +Q +a0f808363318c00fd1db78b4271cef8d05a046a36aab1a383e731e40603c6e2a +R 43f2275aafa347432491f9b0d0f83ec3 U stephan -Z ae593bdf056165949851304ee1f109ec +Z 2651c93f688aecea6ca1abbac25973e2 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 41889df033..ebcb9a470e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5c3104228d75c8fafbe24e46623777f3a8647f1b50267af61d46f7fad0e0434e \ No newline at end of file +031c9a76b6ad1572e7a88f4d2d62f206b0d37bd1170e2c8a24248c5ec628f2f5 \ No newline at end of file From b38374483562febaf4ea0bfb4e4137bd3e32b32b Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 4 Aug 2023 11:10:10 +0000 Subject: [PATCH 34/41] Change comment on Fts5ExtensionApi.iVersion from "always set to 3" to "always set to 2". FossilOrigin-Name: b7de399c277394a6a3bbf253d4177aa82753271e5087b98b2c2268f629a7dfdd --- ext/fts5/fts5.h | 2 +- manifest | 15 +++++++-------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5.h b/ext/fts5/fts5.h index 081e534f3f..cf71a0aa07 100644 --- a/ext/fts5/fts5.h +++ b/ext/fts5/fts5.h @@ -263,7 +263,7 @@ struct Fts5PhraseIter { ** See xPhraseFirstColumn above. */ struct Fts5ExtensionApi { - int iVersion; /* Currently always set to 3 */ + int iVersion; /* Currently always set to 2 */ void *(*xUserData)(Fts5Context*); diff --git a/manifest b/manifest index 61c082d24f..2171524d0e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Resolve\sthe\stiming/ordering\sissue\sof\sa\sJS-to-WASM-converted\sxDestroy()\sfunction\sbeing\suninstalled\sfrom\sWASM\sright\sbefore\sthe\sunderlying\snative\scall\stries\sto\scall\sit.\sThis\shas\sbeen\sa\slong-unnoticed\sbug\swhich\sappears\sonly\swhen\sremoving\ssuch\sfunctions\sor\sreplacing\sthem. -D 2023-08-04T08:45:25.667 +C Change\scomment\son\sFts5ExtensionApi.iVersion\sfrom\s"always\sset\sto\s3"\sto\s"always\sset\sto\s2". +D 2023-08-04T11:10:10.380 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -85,7 +85,7 @@ F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 F ext/fts3/unicode/mkunicode.tcl d5aebf022fa4577ee8cdf27468f0d847879993959101f6dbd6348ef0cfc324a7 F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 -F ext/fts5/fts5.h c132a9323f22a972c4c93a8d5a3d901113a6e612faf30ca8e695788438c5ca2a +F ext/fts5/fts5.h f6051cafb7304576a2ec270d8b7c53d5bf81b35f381f3637665a97ca38b2ba19 F ext/fts5/fts5Int.h 78a63cc0795186cde5384816a9403a68c65774b35d952e05b81a1b4b158e07c8 F ext/fts5/fts5_aux.c 572d5ec92ba7301df2fea3258576332f2f4d2dfd66d8263afd157d9deceac480 F ext/fts5/fts5_buffer.c 3001fbabb585d6de52947b44b455235072b741038391f830d6b729225eeaf6a5 @@ -2049,9 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5c3104228d75c8fafbe24e46623777f3a8647f1b50267af61d46f7fad0e0434e -Q +a0f808363318c00fd1db78b4271cef8d05a046a36aab1a383e731e40603c6e2a -R 43f2275aafa347432491f9b0d0f83ec3 -U stephan -Z 2651c93f688aecea6ca1abbac25973e2 +P 031c9a76b6ad1572e7a88f4d2d62f206b0d37bd1170e2c8a24248c5ec628f2f5 +R 1d82987a9853ad15241a2ff014ee88e9 +U dan +Z df0baeac8b46b30486a969b7651db7c9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ebcb9a470e..3f0fdd3233 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -031c9a76b6ad1572e7a88f4d2d62f206b0d37bd1170e2c8a24248c5ec628f2f5 \ No newline at end of file +b7de399c277394a6a3bbf253d4177aa82753271e5087b98b2c2268f629a7dfdd \ No newline at end of file From b87278f4146ba0a511d921b22ea94479b175db64 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 4 Aug 2023 13:19:11 +0000 Subject: [PATCH 35/41] Fix a bug in the jsonLookup() routine used to search JSON. Bug was introduced by the recent (unreleased) JSON caching enhancements check-in [a4c1af616e672a0d] merged into trunk at [df099ad713011b67]. FossilOrigin-Name: ba7a66db13b28da0b41f03be825a593608474a5ebda89e12d58d89db709b8f65 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/json.c | 31 ++++++++++++++++++------------- test/json102.test | 18 ++++++++++++++++++ 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index 2171524d0e..76f5f962e1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\scomment\son\sFts5ExtensionApi.iVersion\sfrom\s"always\sset\sto\s3"\sto\s"always\sset\sto\s2". -D 2023-08-04T11:10:10.380 +C Fix\sa\sbug\sin\sthe\sjsonLookup()\sroutine\sused\sto\ssearch\sJSON.\s\sBug\swas\nintroduced\sby\sthe\srecent\s(unreleased)\sJSON\scaching\senhancements\ncheck-in\s[a4c1af616e672a0d]\smerged\sinto\strunk\sat\s[df099ad713011b67]. +D 2023-08-04T13:19:11.464 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -603,7 +603,7 @@ F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276 -F src/json.c d2b7f613a1792043f8e758fdcfe9469f9b81f522999b508f436517752a5d7071 +F src/json.c 9c231a853268ce6aee2e300e26d4445ba42117374a2275f8e9537b2f912909d6 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 176d6b2cb18a6ad73b133db17f6fc351c4d9a2d510deebdb76c22bde9cfd1465 F src/main.c fde8f13c876a658b4e8b74b77d875ca887915c174ea6a2f3122d80966f93d865 @@ -1233,7 +1233,7 @@ F test/json/json-generator.tcl dc0dd0f393800c98658fc4c47eaa6af29d4e17527380cd286 F test/json/json-q1.txt 65f9d1cdcc4cffa9823fb73ed936aae5658700cd001fde448f68bfb91c807307 F test/json/json-speed-check.sh 8b7babf530faa58bd59d6d362cec8e9036a68c5457ff46f3b1f1511d21af6737 x F test/json101.test 94126d4291d4a00e45f6988ce885c410de69243490e46e70e9946cb6e6f9ea02 -F test/json102.test 13dc9e7b7f359ecb861e02f9bd7019f7342a63d1c354273b0a8f3904050560a8 +F test/json102.test 24f6f204f9cde45b971016691d0b92a9b4c58040d699e36d6b12cb165f9083ff F test/json103.test 53df87f83a4e5fa0c0a56eb29ff6c94055c6eb919f33316d62161a8880112dbe F test/json104.test 1b844a70cddcfa2e4cd81a5db0657b2e61e7f00868310f24f56a9ba0114348c1 F test/json105.test 11670a4387f4308ae0318cadcbd6a918ea7edcd19fbafde020720a073952675d @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 031c9a76b6ad1572e7a88f4d2d62f206b0d37bd1170e2c8a24248c5ec628f2f5 -R 1d82987a9853ad15241a2ff014ee88e9 -U dan -Z df0baeac8b46b30486a969b7651db7c9 +P b7de399c277394a6a3bbf253d4177aa82753271e5087b98b2c2268f629a7dfdd +R 0023494055da434d093283e3467ed659 +U drh +Z fcef72d2f53678066563a17e3c8f660b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3f0fdd3233..e5cb58fc65 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b7de399c277394a6a3bbf253d4177aa82753271e5087b98b2c2268f629a7dfdd \ No newline at end of file +ba7a66db13b28da0b41f03be825a593608474a5ebda89e12d58d89db709b8f65 \ No newline at end of file diff --git a/src/json.c b/src/json.c index 1e4b94e7aa..fcaa9d84b9 100644 --- a/src/json.c +++ b/src/json.c @@ -2022,20 +2022,25 @@ static JsonNode *jsonLookupStep( JsonNode *pRoot; if( pParse->oom ) return 0; pRoot = &pParse->aNode[iRoot]; - while( (pRoot->jnFlags & JNODE_REPLACE)!=0 && pParse->useMod ){ - u32 idx = (u32)(pRoot - pParse->aNode); - i = pParse->iSubst; - while( 1 /*exit-by-break*/ ){ - assert( inNode ); - assert( pParse->aNode[i].eType==JSON_SUBST ); - assert( pParse->aNode[i].eU==4 ); - assert( pParse->aNode[i].u.iPrevaNode[i].n==idx ){ - pRoot = &pParse->aNode[i+1]; - iRoot = i+1; - break; + if( pRoot->jnFlags & (JNODE_REPLACE|JNODE_REMOVE) && pParse->useMod ){ + while( (pRoot->jnFlags & JNODE_REPLACE)!=0 ){ + u32 idx = (u32)(pRoot - pParse->aNode); + i = pParse->iSubst; + while( 1 /*exit-by-break*/ ){ + assert( inNode ); + assert( pParse->aNode[i].eType==JSON_SUBST ); + assert( pParse->aNode[i].eU==4 ); + assert( pParse->aNode[i].u.iPrevaNode[i].n==idx ){ + pRoot = &pParse->aNode[i+1]; + iRoot = i+1; + break; + } + i = pParse->aNode[i].u.iPrev; } - i = pParse->aNode[i].u.iPrev; + } + if( pRoot->jnFlags & JNODE_REMOVE ){ + return 0; } } if( zPath[0]==0 ) return pRoot; diff --git a/test/json102.test b/test/json102.test index bfd5e7ed07..276c1816a7 100644 --- a/test/json102.test +++ b/test/json102.test @@ -397,4 +397,22 @@ do_execsql_test json102-1610 { 6 {} null {} null {} null ] +reset_db +do_execsql_test json102-1700 { + CREATE TABLE t1(a1 DATE, a2 INTEGER PRIMARY KEY, a3 INTEGER, memo TEXT); + CREATE INDEX t1x1 ON t1(a3, a1, memo->>'y'); + INSERT INTO t1(a2,a1,a3,memo) VALUES (876, '2023-08-03', 5, '{"x":77,"y":4}'); +} +do_execsql_test json102-1710 { + UPDATE t1 SET memo = JSON_REMOVE(memo, '$.y'); + PRAGMA integrity_check; + SELECT * FROM t1; +} {ok 2023-08-03 876 5 {{"x":77}}} +do_execsql_test json102-1720 { + UPDATE t1 SET memo = JSON_SET(memo, '$.y', 6) + WHERE a2 IN (876) AND JSON_TYPE(memo, '$.y') IS NULL; + PRAGMA integrity_check; + SELECT * FROM t1; +} {ok 2023-08-03 876 5 {{"x":77,"y":6}}} + finish_test From 195611d8e6fc0bba559a49e91e6ceb42e4bdd6ba Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 4 Aug 2023 16:01:55 +0000 Subject: [PATCH 36/41] In the opfs-sahpool VFS's importDb() and exportFile() methods, throw if the actually-wrote/read amounts differ from the expected-to-write/read amounts, per feedback in [forum:a4122e986f|forum post a4122e986f]. FossilOrigin-Name: a617ebf4e5d1af1b5b15e9782ad111399caaa3ea7b99bb0c8691c8b4283b6d6e --- ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js | 22 +++++++++++++++---- manifest | 14 ++++++------ manifest.uuid | 2 +- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js b/ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js index 3ba889c393..709d3414c3 100644 --- a/ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js +++ b/ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js @@ -854,12 +854,18 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ return true; } + //! Documented elsewhere in this file. exportFile(name){ const sah = this.#mapFilenameToSAH.get(name) || toss("File not found:",name); const n = sah.getSize() - HEADER_OFFSET_DATA; - const b = new Uint8Array(n>=0 ? n : 0); - if(n>0) sah.read(b, {at: HEADER_OFFSET_DATA}); + const b = new Uint8Array(n>0 ? n : 0); + if(n>0){ + const nRead = sah.read(b, {at: HEADER_OFFSET_DATA}); + if(nRead != n){ + toss("Expected to read "+n+" bytes but read "+nRead+"."); + } + } return b; } @@ -879,8 +885,13 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ const sah = this.#mapFilenameToSAH.get(name) || this.nextAvailableSAH() || toss("No available handles to import to."); - sah.write(bytes, {at: HEADER_OFFSET_DATA}); - this.setAssociatedPath(sah, name, capi.SQLITE_OPEN_MAIN_DB); + const nWrote = sah.write(bytes, {at: HEADER_OFFSET_DATA}); + if(nWrote != n){ + this.setAssociatedPath(sah, '', 0); + toss("Expected to write "+n+" bytes but wrote "+nWrote+"."); + }else{ + this.setAssociatedPath(sah, name, capi.SQLITE_OPEN_MAIN_DB); + } } }/*class OpfsSAHPool*/; @@ -1087,6 +1098,9 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ automatically clean up any non-database files so importing them is pointless. + On a write error, the handle is removed from the pool and made + available for re-use. + - [async] number reduceCapacity(n) Removes up to `n` entries from the pool, with the caveat that it can diff --git a/manifest b/manifest index 76f5f962e1..8a308da5a1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbug\sin\sthe\sjsonLookup()\sroutine\sused\sto\ssearch\sJSON.\s\sBug\swas\nintroduced\sby\sthe\srecent\s(unreleased)\sJSON\scaching\senhancements\ncheck-in\s[a4c1af616e672a0d]\smerged\sinto\strunk\sat\s[df099ad713011b67]. -D 2023-08-04T13:19:11.464 +C In\sthe\sopfs-sahpool\sVFS's\simportDb()\sand\sexportFile()\smethods,\sthrow\sif\sthe\sactually-wrote/read\samounts\sdiffer\sfrom\sthe\sexpected-to-write/read\samounts,\sper\sfeedback\sin\s[forum:a4122e986f|forum\spost\sa4122e986f]. +D 2023-08-04T16:01:55.085 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -507,7 +507,7 @@ F ext/wasm/api/sqlite3-api-worker1.js 9f32af64df1a031071912eea7a201557fe39b17386 F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89 F ext/wasm/api/sqlite3-opfs-async-proxy.js 8cf8a897726f14071fae6be6648125162b256dfb4f96555b865dbb7a6b65e379 F ext/wasm/api/sqlite3-v-helper.js 7daa0eab0a513a25b05e9abae7b5beaaa39209b3ed12f86aeae9ef8d2719ed25 -F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js 54cee22aacadb9dfaea438d72ac0882249d028c37903208d48c52871290ceff7 +F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js abb69b5e008961026bf5ff433d7116cb046359af92a5daf73208af2e7ac80ae7 F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js e7a690e0e78ff4d563f2eca468f91db69f001ff4b79c6d2304cbb6f62dca437d F ext/wasm/api/sqlite3-wasm.c 8867f1d41c112fb4a2cfe22ff224eccaf309fcdea266cee0ec554f85db72ef0f F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js bc06df0d599e625bde6a10a394e326dc68da9ff07fa5404354580f81566e591f @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b7de399c277394a6a3bbf253d4177aa82753271e5087b98b2c2268f629a7dfdd -R 0023494055da434d093283e3467ed659 -U drh -Z fcef72d2f53678066563a17e3c8f660b +P ba7a66db13b28da0b41f03be825a593608474a5ebda89e12d58d89db709b8f65 +R f2c78f56dfb337758355d58b9337ecba +U stephan +Z 00aafcc21ac118e76e1aadfe455b796f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e5cb58fc65..17fc756294 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ba7a66db13b28da0b41f03be825a593608474a5ebda89e12d58d89db709b8f65 \ No newline at end of file +a617ebf4e5d1af1b5b15e9782ad111399caaa3ea7b99bb0c8691c8b4283b6d6e \ No newline at end of file From 47c5db7f7706ea6d0f7c713b5108db0124e3a004 Mon Sep 17 00:00:00 2001 From: stephan Date: Sat, 5 Aug 2023 19:15:19 +0000 Subject: [PATCH 37/41] Tiny doc typo fixes from [forum:31eb707250|forum post 31eb707250]. No code changes. FossilOrigin-Name: 8ede50082e7bcf0226a3b42a590f188b5a139bbf081c9eed7ff8f6f2a6a274a0 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 30 +++++++++++++++--------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index 8a308da5a1..c502edb5ac 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sopfs-sahpool\sVFS's\simportDb()\sand\sexportFile()\smethods,\sthrow\sif\sthe\sactually-wrote/read\samounts\sdiffer\sfrom\sthe\sexpected-to-write/read\samounts,\sper\sfeedback\sin\s[forum:a4122e986f|forum\spost\sa4122e986f]. -D 2023-08-04T16:01:55.085 +C Tiny\sdoc\stypo\sfixes\sfrom\s[forum:31eb707250|forum\spost\s31eb707250].\sNo\scode\schanges. +D 2023-08-05T19:15:19.754 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -713,7 +713,7 @@ F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c b3532a95ad56db67b3acd3955e688e4cb80ebec6fd1f459a8eb51cceedd6de69 F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104 -F src/vdbe.c e756796005fef77ae31301ef61ff14c6cff20c1ad6983043d0b3eb54daaf6388 +F src/vdbe.c 346d848a0bf8128e3e3722c5406f4bde6c32d7093b93402c6f8e0718d19305c3 F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0 F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c F src/vdbeapi.c f37822f215740ede2a8fcae99bc13f2cc3a72dd0e1d22b81b9298c5ca67dbc38 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ba7a66db13b28da0b41f03be825a593608474a5ebda89e12d58d89db709b8f65 -R f2c78f56dfb337758355d58b9337ecba +P a617ebf4e5d1af1b5b15e9782ad111399caaa3ea7b99bb0c8691c8b4283b6d6e +R 2b3730941835404b6c4516eb7a27c168 U stephan -Z 00aafcc21ac118e76e1aadfe455b796f +Z 36cea613d60cb4ba321ff82b25def391 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 17fc756294..2eaff6e5b7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a617ebf4e5d1af1b5b15e9782ad111399caaa3ea7b99bb0c8691c8b4283b6d6e \ No newline at end of file +8ede50082e7bcf0226a3b42a590f188b5a139bbf081c9eed7ff8f6f2a6a274a0 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 7d8f15690e..5899fa518e 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2360,10 +2360,10 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ ** opcodes are allowed to occur between this instruction and the previous ** OP_Lt or OP_Gt. ** -** If result of an OP_Eq comparison on the same two operands as the -** prior OP_Lt or OP_Gt would have been true, then jump to P2. -** If the result of an OP_Eq comparison on the two previous -** operands would have been false or NULL, then fall through. +** If the result of an OP_Eq comparison on the same two operands as +** the prior OP_Lt or OP_Gt would have been true, then jump to P2. If +** the result of an OP_Eq comparison on the two previous operands +** would have been false or NULL, then fall through. */ case OP_ElseEq: { /* same as TK_ESCAPE, jump */ @@ -2793,7 +2793,7 @@ case OP_IsType: { /* jump */ /* Opcode: ZeroOrNull P1 P2 P3 * * ** Synopsis: r[P2] = 0 OR NULL ** -** If all both registers P1 and P3 are NOT NULL, then store a zero in +** If both registers P1 and P3 are NOT NULL, then store a zero in ** register P2. If either registers P1 or P3 are NULL then put ** a NULL in register P2. */ @@ -5194,13 +5194,13 @@ case OP_IfNotOpen: { /* jump */ ** operands to OP_NotFound and OP_IdxGT. ** ** This opcode is an optimization attempt only. If this opcode always -** falls through, the correct answer is still obtained, but extra works +** falls through, the correct answer is still obtained, but extra work ** is performed. ** ** A value of N in the seekHit flag of cursor P1 means that there exists ** a key P3:N that will match some record in the index. We want to know ** if it is possible for a record P3:P4 to match some record in the -** index. If it is not possible, we can skips some work. So if seekHit +** index. If it is not possible, we can skip some work. So if seekHit ** is less than P4, attempt to find out if a match is possible by running ** OP_NotFound. ** @@ -5766,10 +5766,10 @@ case OP_RowCell: { ** left in an undefined state. ** ** If the OPFLAG_AUXDELETE bit is set on P5, that indicates that this -** delete one of several associated with deleting a table row and all its -** associated index entries. Exactly one of those deletes is the "primary" -** delete. The others are all on OPFLAG_FORDELETE cursors or else are -** marked with the AUXDELETE flag. +** delete is one of several associated with deleting a table row and +** all its associated index entries. Exactly one of those deletes is +** the "primary" delete. The others are all on OPFLAG_FORDELETE +** cursors or else are marked with the AUXDELETE flag. ** ** If the OPFLAG_NCHANGE flag of P2 (NB: P2 not P5) is set, then the row ** change count is incremented (otherwise not). @@ -5941,7 +5941,7 @@ case OP_SorterCompare: { ** Write into register P2 the current sorter data for sorter cursor P1. ** Then clear the column header cache on cursor P3. ** -** This opcode is normally use to move a record out of the sorter and into +** This opcode is normally used to move a record out of the sorter and into ** a register that is the source for a pseudo-table cursor created using ** OpenPseudo. That pseudo-table cursor is the one that is identified by ** parameter P3. Clearing the P3 column cache as part of this opcode saves @@ -6750,7 +6750,7 @@ case OP_IdxGE: { /* jump, ncycle */ ** file is given by P1. ** ** The table being destroyed is in the main database file if P3==0. If -** P3==1 then the table to be clear is in the auxiliary database file +** P3==1 then the table to be destroyed is in the auxiliary database file ** that is used to store tables create using CREATE TEMPORARY TABLE. ** ** If AUTOVACUUM is enabled then it is possible that another root page @@ -6810,8 +6810,8 @@ case OP_Destroy: { /* out2 */ ** in the database file is given by P1. But, unlike Destroy, do not ** remove the table or index from the database file. ** -** The table being clear is in the main database file if P2==0. If -** P2==1 then the table to be clear is in the auxiliary database file +** The table being cleared is in the main database file if P2==0. If +** P2==1 then the table to be cleared is in the auxiliary database file ** that is used to store tables create using CREATE TEMPORARY TABLE. ** ** If the P3 value is non-zero, then the row change count is incremented From 7c26811c2f8192643c827d90831e31402ac94953 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 7 Aug 2023 09:44:00 +0000 Subject: [PATCH 38/41] Rename fts5_api pContext parameters to pUserData, per /chat discussion. This is a cosmetic change made to reduce confusion between those parameters and the two other context-type parameters in that API. FossilOrigin-Name: 2ca064d8eb37252e16b0fec9924e9ba9289d96a737346431c6ba9cb1c161e5de --- ext/fts5/fts5.h | 6 +++--- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5.h b/ext/fts5/fts5.h index cf71a0aa07..2309460f02 100644 --- a/ext/fts5/fts5.h +++ b/ext/fts5/fts5.h @@ -541,7 +541,7 @@ struct fts5_api { int (*xCreateTokenizer)( fts5_api *pApi, const char *zName, - void *pContext, + void *pUserData, fts5_tokenizer *pTokenizer, void (*xDestroy)(void*) ); @@ -550,7 +550,7 @@ struct fts5_api { int (*xFindTokenizer)( fts5_api *pApi, const char *zName, - void **ppContext, + void **ppUserData, fts5_tokenizer *pTokenizer ); @@ -558,7 +558,7 @@ struct fts5_api { int (*xCreateFunction)( fts5_api *pApi, const char *zName, - void *pContext, + void *pUserData, fts5_extension_function xFunction, void (*xDestroy)(void*) ); diff --git a/manifest b/manifest index c502edb5ac..d8d3391f11 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Tiny\sdoc\stypo\sfixes\sfrom\s[forum:31eb707250|forum\spost\s31eb707250].\sNo\scode\schanges. -D 2023-08-05T19:15:19.754 +C Rename\sfts5_api\spContext\sparameters\sto\spUserData,\sper\s/chat\sdiscussion.\sThis\sis\sa\scosmetic\schange\smade\sto\sreduce\sconfusion\sbetween\sthose\sparameters\sand\sthe\stwo\sother\scontext-type\sparameters\sin\sthat\sAPI. +D 2023-08-07T09:44:00.281 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -85,7 +85,7 @@ F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 F ext/fts3/unicode/mkunicode.tcl d5aebf022fa4577ee8cdf27468f0d847879993959101f6dbd6348ef0cfc324a7 F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 -F ext/fts5/fts5.h f6051cafb7304576a2ec270d8b7c53d5bf81b35f381f3637665a97ca38b2ba19 +F ext/fts5/fts5.h 9bebc9fb8b75b0777e741c758540e07c3c80ce75204198979028fe6cc4c59486 F ext/fts5/fts5Int.h 78a63cc0795186cde5384816a9403a68c65774b35d952e05b81a1b4b158e07c8 F ext/fts5/fts5_aux.c 572d5ec92ba7301df2fea3258576332f2f4d2dfd66d8263afd157d9deceac480 F ext/fts5/fts5_buffer.c 3001fbabb585d6de52947b44b455235072b741038391f830d6b729225eeaf6a5 @@ -2049,8 +2049,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a617ebf4e5d1af1b5b15e9782ad111399caaa3ea7b99bb0c8691c8b4283b6d6e -R 2b3730941835404b6c4516eb7a27c168 +P 8ede50082e7bcf0226a3b42a590f188b5a139bbf081c9eed7ff8f6f2a6a274a0 +R 7643277fee9d7d8c9b719b0a83935d9f U stephan -Z 36cea613d60cb4ba321ff82b25def391 +Z 84e0aac57037c35f1739965aedd50f66 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2eaff6e5b7..86338d2727 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8ede50082e7bcf0226a3b42a590f188b5a139bbf081c9eed7ff8f6f2a6a274a0 \ No newline at end of file +2ca064d8eb37252e16b0fec9924e9ba9289d96a737346431c6ba9cb1c161e5de \ No newline at end of file From be3ab76bfb35dc767caf520dacd1bac63369ac84 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 7 Aug 2023 16:15:56 +0000 Subject: [PATCH 39/41] Changes so that sqlite3_vtab_nochange() works with "UPDATE ... FROM...". Use this to allow UPDATE on a contentless fts5 table if new values are supplied for all indexed columns. FossilOrigin-Name: 16cd2161e312cf97129011fc829079db8f762b822b2f4fabf7ff6742c071302f --- ext/fts5/fts5_main.c | 8 +++- ext/fts5/test/fts5contentless.test | 4 +- ext/fts5/test/fts5contentless5.test | 59 +++++++++++++++++++++++++++++ manifest | 26 +++++++------ manifest.uuid | 2 +- src/expr.c | 3 ++ src/select.c | 10 +++++ src/update.c | 4 +- 8 files changed, 100 insertions(+), 16 deletions(-) create mode 100644 ext/fts5/test/fts5contentless5.test diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index d1c79d3604..c34a5a332b 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -1689,7 +1689,7 @@ static int fts5UpdateMethod( ** VIRTUAL TABLE statement contained "contentless_delete=1". */ if( eType0==SQLITE_INTEGER && pConfig->eContent==FTS5_CONTENT_NONE - && (nArg>1 || pConfig->bContentlessDelete==0) + && pConfig->bContentlessDelete==0 ){ pTab->p.base.zErrMsg = sqlite3_mprintf( "cannot %s contentless fts5 table: %s", @@ -2544,6 +2544,12 @@ static int fts5ColumnMethod( sqlite3_result_value(pCtx, sqlite3_column_value(pCsr->pStmt, iCol+1)); } pConfig->pzErrmsg = 0; + }else if( pConfig->bContentlessDelete && sqlite3_vtab_nochange(pCtx) ){ + char *zErr = sqlite3_mprintf("cannot UPDATE a subset of " + "columns on fts5 contentless-delete table: %s", pConfig->zName + ); + sqlite3_result_error(pCtx, zErr, -1); + sqlite3_free(zErr); } return rc; } diff --git a/ext/fts5/test/fts5contentless.test b/ext/fts5/test/fts5contentless.test index 41a78e9c8f..f75ccb44c2 100644 --- a/ext/fts5/test/fts5contentless.test +++ b/ext/fts5/test/fts5contentless.test @@ -188,11 +188,11 @@ do_execsql_test 5.2 { do_catchsql_test 5.3 { UPDATE ft SET x='four six' WHERE rowid=3 -} {1 {cannot UPDATE contentless fts5 table: ft}} +} {0 {}} do_execsql_test 5.4 { SELECT rowid FROM ft('one'); -} {1 3 4 5} +} {1 4 5} do_execsql_test 5.5 { REPLACE INTO ft(rowid, x) VALUES(3, 'four six'); diff --git a/ext/fts5/test/fts5contentless5.test b/ext/fts5/test/fts5contentless5.test new file mode 100644 index 0000000000..1541b0c68d --- /dev/null +++ b/ext/fts5/test/fts5contentless5.test @@ -0,0 +1,59 @@ +# 2023 August 7 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# This file contains tests for the content= and content_rowid= options. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5contentless5 + +# If SQLITE_ENABLE_FTS5 is defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a, b, c, content='', contentless_delete=1); + INSERT INTO t1 VALUES('A', 'B', 'C'); + INSERT INTO t1 VALUES('D', 'E', 'F'); + INSERT INTO t1 VALUES('G', 'H', 'I'); +} + +do_execsql_test 1.01 { + CREATE TABLE t2(x, y); + INSERT INTO t2 VALUES('x', 'y'); +} + +# explain_i "UPDATE t1 SET a='a' WHERE t1.rowid=1" +breakpoint +explain_i "UPDATE t1 SET a='a' FROM t2 WHERE t1.rowid=1 AND b IS NULL" + +#breakpoint +#explain_i "UPDATE t1 SET a='a' WHERE b IS NULL AND rowid=?" + +foreach {tn up err} { + 1 "UPDATE t1 SET a='a', b='b', c='c' WHERE rowid=1" 0 + 2 "UPDATE t1 SET a='a', b='b' WHERE rowid=1" 1 + 3 "UPDATE t1 SET b='b', c='c' WHERE rowid=1" 1 + 4 "UPDATE t1 SET a='a', c='c' WHERE rowid=1" 1 + 5 "UPDATE t1 SET a='a', c='c' WHERE t1.rowid=1 AND b IS NULL" 1 + 6 "UPDATE t1 SET a='a' FROM t2 WHERE t1.rowid=1" 1 + 7 "UPDATE t1 SET a='a', b='b', c='c' FROM t2 WHERE t1.rowid=1" 0 +} { + + set res(0) {0 {}} + set res(1) {1 {cannot UPDATE a subset of columns on fts5 contentless-delete table: t1}} + do_catchsql_test 1.$tn $up $res($err) +} + +finish_test + diff --git a/manifest b/manifest index d8d3391f11..d159c83a4e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Rename\sfts5_api\spContext\sparameters\sto\spUserData,\sper\s/chat\sdiscussion.\sThis\sis\sa\scosmetic\schange\smade\sto\sreduce\sconfusion\sbetween\sthose\sparameters\sand\sthe\stwo\sother\scontext-type\sparameters\sin\sthat\sAPI. -D 2023-08-07T09:44:00.281 +C Changes\sso\sthat\ssqlite3_vtab_nochange()\sworks\swith\s"UPDATE\s...\sFROM...".\sUse\sthis\sto\sallow\sUPDATE\son\sa\scontentless\sfts5\stable\sif\snew\svalues\sare\ssupplied\sfor\sall\sindexed\scolumns. +D 2023-08-07T16:15:56.046 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -93,7 +93,7 @@ F ext/fts5/fts5_config.c 054359543566cbff1ba65a188330660a5457299513ac71c53b3a07d F ext/fts5/fts5_expr.c 2473c13542f463cae4b938c498d6193c90d38ea1a2a4f9849c0479736e50d24d F ext/fts5/fts5_hash.c 65e7707bc8774706574346d18c20218facf87de3599b995963c3e6d6809f203d F ext/fts5/fts5_index.c 93b4cd116b76b6adf224cd3d213f1e06cfe10ae0eb21d6372b1c53b8f0c382a3 -F ext/fts5/fts5_main.c 2f87ee44fdb21539c264541149f07f70e065d58f37420063e5ddef80ba0f5ede +F ext/fts5/fts5_main.c 7070031993ba5b5d89b13206ec4ef624895f2f7c0ec72725913d301e4d382445 F ext/fts5/fts5_storage.c 3c9b41fce41b6410f2e8f82eb035c6a29b2560483f773e6dc98cf3cb2e4ddbb5 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -132,10 +132,11 @@ F ext/fts5/test/fts5config.test 60094712debc59286c59aef0e6cf511c37d866802776a825 F ext/fts5/test/fts5conflict.test 655925678e630d3cdf145d18725a558971806416f453ac8410ca8c04d934238d F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c073e19b3ae9126b2f4 F ext/fts5/test/fts5content.test 213506436fb2c87567b8e31f6d43ab30aab99354cec74ed679f22aad0cdbf283 -F ext/fts5/test/fts5contentless.test 9a42a86822670792ba632f5c57459addeb774d93b29d5e6ddae08faa64c2b6d9 +F ext/fts5/test/fts5contentless.test eb31159d62811b3a32fb1cfb36be20f9d9db75637c7fe6aa7f5c533db2d00576 F ext/fts5/test/fts5contentless2.test 12c778d134a121b8bad000fbf3ae900d53226fee840ce36fe941b92737f1fda7 F ext/fts5/test/fts5contentless3.test 487dce16b6677f68b44d7cbd158b9b7275d25e2c14d713f9188d9645bb699286 F ext/fts5/test/fts5contentless4.test 0f43ededc2874f65d7da99b641a82239854d98d3fa43db729f284b723f23b69f +F ext/fts5/test/fts5contentless5.test 216962d51376b62e4ff45e8db00aa3e1ab548cb36b7fd450633e73b2d678f88e F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f F ext/fts5/test/fts5corrupt3.test 7da9895dafa404efd20728f66ff4b94399788bdc042c36fe2689801bba2ccd78 @@ -593,7 +594,7 @@ F src/date.c f73f203b3877cef866c60ab402aec2bf89597219b60635cf50cbe3c5e4533e94 F src/dbpage.c f3eea5f7ec47e09ee7da40f42b25092ecbe961fc59566b8e5f705f34335b2387 F src/dbstat.c ec92074baa61d883de58c945162d9e666c13cd7cf3a23bc38b4d1c4d0b2c2bef F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500 -F src/expr.c ef4a81822da6f767696bd7f4b9983328af061158958138540142285a5b1181b7 +F src/expr.c 1affe0cc049683ef0ef3545d9b6901508556b0ef7e2892a344c3df6d7288d79d F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36 F src/func.c cc1da67fd643a43cfe691784158ec656d8ec6d13bb17e67018b01b38b3e4f5ab @@ -643,7 +644,7 @@ F src/printf.c e3ba080e2f409f9bfcc8d34724e6fc160e9c718dc92d0548f6b71b8b6f860ce2 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 37953a5f36c60bea413c3c04efcd433b6177009f508ef2ace0494728912fe2e9 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c abf48be202d35c4f450325b61992e98ac4aa81ed1e29709069432877d3b555d3 +F src/select.c 5f545a2c8702d4d3430bbb188cfec47d6c122d899061ef00cbe56af14591c574 F src/shell.c.in 694aaf751f00610381533d4a31c83d142cfc83ef91ef65e2aa6912ace7c39b40 F src/sqlite.h.in 7b07a33d2af82ee974aa91e6294abce0282b2f4c5934b291d2fff961810dd867 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -708,7 +709,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 0fb405f9adf3f757c26bfc1ae6d58ac5dccbb918917ba9e5ef0e6673a06563d3 F src/treeview.c 1d52fbc4e97161e65858d36e3424ea6e3fc045dd8a679c82b4b9593dc30de3bd F src/trigger.c ad6ab9452715fa9a8075442e15196022275b414b9141b566af8cdb7a1605f2b0 -F src/update.c d5b755580a86d235b12faf10de81e60ad97c8117f8c3063d92c772df94455d44 +F src/update.c 0bb9171afaa4d0b100ad946873bccda7aef90ffe083ef5c63668fce08c4df9da F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c b3532a95ad56db67b3acd3955e688e4cb80ebec6fd1f459a8eb51cceedd6de69 @@ -2049,8 +2050,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8ede50082e7bcf0226a3b42a590f188b5a139bbf081c9eed7ff8f6f2a6a274a0 -R 7643277fee9d7d8c9b719b0a83935d9f -U stephan -Z 84e0aac57037c35f1739965aedd50f66 +P 2ca064d8eb37252e16b0fec9924e9ba9289d96a737346431c6ba9cb1c161e5de +R cb2871ec0eb1a937adec492d1c792b96 +T *branch * fts5-contentless-delete +T *sym-fts5-contentless-delete * +T -sym-trunk * +U dan +Z b30ed14be16970913bfed643626fe629 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 86338d2727..ea2017dc46 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2ca064d8eb37252e16b0fec9924e9ba9289d96a737346431c6ba9cb1c161e5de \ No newline at end of file +16cd2161e312cf97129011fc829079db8f762b822b2f4fabf7ff6742c071302f \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 0c41f6684a..d96f362856 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3972,10 +3972,13 @@ int sqlite3ExprCodeGetColumn( u8 p5 /* P5 value for OP_Column + FLAGS */ ){ assert( pParse->pVdbe!=0 ); + assert( (p5 & (OPFLAG_NOCHNG|OPFLAG_TYPEOFARG|OPFLAG_LENGTHARG))==p5 ); + assert( IsVirtual(pTab) || (p5 & OPFLAG_NOCHNG)==0 ); sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pTab, iTable, iColumn, iReg); if( p5 ){ VdbeOp *pOp = sqlite3VdbeGetLastOp(pParse->pVdbe); if( pOp->opcode==OP_Column ) pOp->p5 = p5; + if( pOp->opcode==OP_VColumn ) pOp->p5 = (p5 & OPFLAG_NOCHNG); } return iReg; } diff --git a/src/select.c b/src/select.c index 41e42b6808..321badd07f 100644 --- a/src/select.c +++ b/src/select.c @@ -1298,6 +1298,16 @@ static void selectInnerLoop( testcase( eDest==SRT_Fifo ); testcase( eDest==SRT_DistFifo ); sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1+nPrefixReg); +#if !defined(SQLITE_ENABLE_NULL_TRIM) && defined(SQLITE_DEBUG) + /* A destination of SRT_Table and a non-zero iSDParm2 parameter means + ** that this is an "UPDATE ... FROM" on a virtual table or view. In this + ** case set the p5 parameter of the OP_MakeRecord to OPFLAG_NOCHNG_MAGIC. + ** This does not affect operation in any way - it just allows MakeRecord + ** to process OPFLAG_NOCHANGE values without an assert() failing. */ + if( eDest==SRT_Table && pDest->iSDParm2 ){ + sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG_MAGIC); + } +#endif #ifndef SQLITE_OMIT_CTE if( eDest==SRT_DistFifo ){ /* If the destination is DistFifo, then cursor (iParm+1) is open diff --git a/src/update.c b/src/update.c index 2101aa8284..3b3c2f838b 100644 --- a/src/update.c +++ b/src/update.c @@ -1259,7 +1259,9 @@ static void updateVirtualTable( sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0) ); }else{ - pList = sqlite3ExprListAppend(pParse, pList, exprRowColumn(pParse, i)); + Expr *pRow = exprRowColumn(pParse, i); + if( pRow ) pRow->op2 = OPFLAG_NOCHNG; + pList = sqlite3ExprListAppend(pParse, pList, pRow); } } From 73cdbeb632fe2fcb81d8f1b73ce24146569a2897 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 8 Aug 2023 16:53:12 +0000 Subject: [PATCH 40/41] Fix an issue in the amalgamation generator in which it was not correctly expanding the SQLite version in the header comment. FossilOrigin-Name: 293f6191e9b328cb8a8d3fff0f7bd5a6f5390b5ff090497a170c791b6ea22917 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- tool/mksqlite3c.tcl | 4 ++-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index ae6a08e6f9..771b3d5cc1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\ssqlite3_vtab_nochange()\sso\sthat\sit\sworks\swith\s"UPDATE\s...\sFROM\s..."\sstatements.\sUse\sthis\sto\sallow\ssome\supdates\son\sfts5\scontentless-delete\stables. -D 2023-08-07T17:09:25.480 +C Fix\san\sissue\sin\sthe\samalgamation\sgenerator\sin\swhich\sit\swas\snot\scorrectly\nexpanding\sthe\sSQLite\sversion\sin\sthe\sheader\scomment. +D 2023-08-08T16:53:12.113 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1984,7 +1984,7 @@ F tool/mkshellc.tcl b7adf08b82de60811d2cb6af05ff59fc17e5cd6f3e98743c14eaaa3f8971 F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f -F tool/mksqlite3c.tcl 44bc3bdb675a9e3a507f4d82575332bccd7e6f830a47c9aa29460ea2240593a9 +F tool/mksqlite3c.tcl 49e39b1e616abc92fd8c24445f2b0a38881825f764541e0026f72371f0d84b65 F tool/mksqlite3h.tcl d391cff7cad0a372ee1406faee9ccc7dad9cb80a0c95cae0f73d10dd26e06762 F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mkvsix.tcl b9e0777a213c23156b6542842c238479e496ebf5 @@ -2050,9 +2050,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2ca064d8eb37252e16b0fec9924e9ba9289d96a737346431c6ba9cb1c161e5de 16cd2161e312cf97129011fc829079db8f762b822b2f4fabf7ff6742c071302f -R cb2871ec0eb1a937adec492d1c792b96 -T +closed 16cd2161e312cf97129011fc829079db8f762b822b2f4fabf7ff6742c071302f -U dan -Z 636193e34abfece337b10699da0a61ae +P 27ff86e4d8d251dbbcc9f0682d3d7b040518cbeee891cfe253661d1fdbec4e4f +R c20236f0402451a8637d8162cefac63e +U drh +Z 866595e1403d7c5e711a1be0d84c07b9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index fc3de33234..fb6b8fe7f1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -27ff86e4d8d251dbbcc9f0682d3d7b040518cbeee891cfe253661d1fdbec4e4f \ No newline at end of file +293f6191e9b328cb8a8d3fff0f7bd5a6f5390b5ff090497a170c791b6ea22917 \ No newline at end of file diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index 2b8f08deb5..6def8fa447 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -87,7 +87,7 @@ set out [open $fname w] # Force the output to use unix line endings, even on Windows. fconfigure $out -translation lf set today [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S UTC" -gmt 1] -puts $out \ +puts $out [subst \ {/****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite ** version $VERSION. By combining all the individual C code files into this @@ -106,7 +106,7 @@ puts $out \ ** if you want a wrapper to interface SQLite with your choice of programming ** language. The code for the "sqlite3" command-line shell is also in a ** separate file. This file contains only code for the core SQLite library. -**} +**}] set srcroot [file dirname [file dirname [info script]]] if {$tcl_platform(platform)=="windows"} { set vsrcprog src-verify.exe From 80c438613a687d41ce820f113a2b20e1aade93a6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 8 Aug 2023 17:36:03 +0000 Subject: [PATCH 41/41] Minor cleanups in sqlite3Int.h. By reordering some fields in the Parse object, it packs more tightly and uses less memory and less CPU to initialize. FossilOrigin-Name: aa6de539c09faa320b68c63659e602107145c4263fa680d5b40fe4d7d7ac4534 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 11 +++++------ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 771b3d5cc1..26ed34f8d1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sissue\sin\sthe\samalgamation\sgenerator\sin\swhich\sit\swas\snot\scorrectly\nexpanding\sthe\sSQLite\sversion\sin\sthe\sheader\scomment. -D 2023-08-08T16:53:12.113 +C Minor\scleanups\sin\ssqlite3Int.h.\s\sBy\sreordering\ssome\sfields\sin\sthe\sParse\nobject,\sit\spacks\smore\stightly\sand\suses\sless\smemory\sand\sless\sCPU\sto\ninitialize. +D 2023-08-08T17:36:03.881 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -649,7 +649,7 @@ F src/shell.c.in 694aaf751f00610381533d4a31c83d142cfc83ef91ef65e2aa6912ace7c39b4 F src/sqlite.h.in 7b07a33d2af82ee974aa91e6294abce0282b2f4c5934b291d2fff961810dd867 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h da473ce2b3d0ae407a6300c4a164589b9a6bfdbec9462688a8593ff16f3bb6e4 -F src/sqliteInt.h bdf30ea8552626736f7fc2d216beb4e6ee556d1afc39d20afa1697ea259463ca +F src/sqliteInt.h 025ed58a41968ef80d64cdc194caa8dd207b0256b147253d762fdac7a62408f9 F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6 F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -2050,8 +2050,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 27ff86e4d8d251dbbcc9f0682d3d7b040518cbeee891cfe253661d1fdbec4e4f -R c20236f0402451a8637d8162cefac63e +P 293f6191e9b328cb8a8d3fff0f7bd5a6f5390b5ff090497a170c791b6ea22917 +R 13de6fab3751f215b8cb399b0a8433e9 U drh -Z 866595e1403d7c5e711a1be0d84c07b9 +Z 9646a5d58abf6d956e75b2b4249fce92 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index fb6b8fe7f1..a11170fc8e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -293f6191e9b328cb8a8d3fff0f7bd5a6f5390b5ff090497a170c791b6ea22917 \ No newline at end of file +aa6de539c09faa320b68c63659e602107145c4263fa680d5b40fe4d7d7ac4534 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 0e029ddcee..c2a9f855a7 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -894,7 +894,7 @@ typedef INT16_TYPE LogEst; /* ** P is one byte past the end of a large buffer. Return true if a span of bytes ** between S..E crosses the end of that buffer. In other words, return true -** if the sub-buffer S..E-1 overflows the buffer show last byte is P-1. +** if the sub-buffer S..E-1 overflows the buffer whose last byte is P-1. ** ** S is the start of the span. E is one byte past the end of end of span. ** @@ -1257,7 +1257,6 @@ typedef struct Cte Cte; typedef struct CteUse CteUse; typedef struct Db Db; typedef struct DbFixer DbFixer; -typedef struct DblDbl DblDbl; typedef struct Schema Schema; typedef struct Expr Expr; typedef struct ExprList ExprList; @@ -3778,6 +3777,9 @@ struct Parse { int regRoot; /* Register holding root page number for new objects */ int nMaxArg; /* Max args passed to user function by sub-program */ int nSelect; /* Number of SELECT stmts. Counter for Select.selId */ +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + u32 nProgressSteps; /* xProgress steps taken during sqlite3_prepare() */ +#endif #ifndef SQLITE_OMIT_SHARED_CACHE int nTableLock; /* Number of locks in aTableLock */ TableLock *aTableLock; /* Required table locks for shared-cache mode */ @@ -3791,12 +3793,9 @@ struct Parse { int addrCrTab; /* Address of OP_CreateBtree on CREATE TABLE */ Returning *pReturning; /* The RETURNING clause */ } u1; - LogEst nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u32 oldmask; /* Mask of old.* columns referenced */ u32 newmask; /* Mask of new.* columns referenced */ -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK - u32 nProgressSteps; /* xProgress steps taken during sqlite3_prepare() */ -#endif + LogEst nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */ u8 bReturning; /* Coding a RETURNING trigger */ u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */